#if wxUSE_FILEPICKERCTRL && defined(__WXGTK26__)
#include "wx/filepicker.h"
+#include "wx/tooltip.h"
#include "wx/gtk/private.h"
-#if wxUSE_TOOLTIPS
- #include "wx/tooltip.h"
-#endif
-
-#include <gdk/gdk.h>
-#include <gtk/gtk.h>
-
-#include <unistd.h> // chdir
-
-
// ============================================================================
// implementation
// ============================================================================
{
if (!gtk_check_version(2,6,0))
{
- // VERY IMPORTANT: this code is identic to relative code in wxFileButton;
- // if you find a problem here, fix it also in wxFileButton !
+ // VERY IMPORTANT: this code is identic to relative code in wxDirButton;
+ // if you find a problem here, fix it also in wxDirButton !
m_needParent = true;
+ m_acceptsFocus = true;
if (!PreCreation( parent, pos, size ) ||
!wxControl::CreateBase(parent, id, pos, size, style & wxWINDOW_STYLE_MASK,
}
// create the dialog associated with this button
+ // NB: unlike generic implementation, native GTK implementation needs to create
+ // the filedialog here as it needs to use gtk_file_chooser_button_new_with_dialog()
SetWindowStyle(style);
m_path = path;
- if (!CreateDialog(message, wildcard))
+ m_message = message;
+ m_wildcard = wildcard;
+ if ((m_dialog = CreateDialog()) == NULL)
return false;
// little trick used to avoid problems when there are other GTK windows 'grabbed':
m_parent->DoAddChild( this );
PostCreation(size);
- SetBestSize(size);
+ SetInitialSize(size);
}
else
return wxGenericFileButton::Create(parent, id, label, path, message, wildcard,
if (ev.GetId() == wxID_OK)
{
// ...update our path
- UpdatePathFromDialog();
+ UpdatePathFromDialog(m_dialog);
// ...and fire an event
wxFileDirPickerEvent event(wxEVT_COMMAND_FILEPICKER_CHANGED, this, GetId(), m_path);
}
}
+void wxFileButton::SetPath(const wxString &str)
+{
+ m_path = str;
+ UpdateDialogPath(m_dialog);
+}
+
#endif // wxUSE_FILEPICKERCTRL && defined(__WXGTK26__)
#if wxUSE_DIRPICKERCTRL && defined(__WXGTK26__)
+#include <unistd.h> // chdir
+
//-----------------------------------------------------------------------------
// "current-folder-changed"
//-----------------------------------------------------------------------------
wxDirButton *p)
{
// update the m_path member of the wxDirButtonGTK
+ // unless the path was changed by wxDirButton::SetPath()
+ if (p->m_bIgnoreNextChange)
+ {
+ p->m_bIgnoreNextChange=false;
+ return;
+ }
wxASSERT(p);
// NB: it's important to use gtk_file_chooser_get_filename instead of
// gtk_file_chooser_get_current_folder (see GTK docs) !
- gchar* filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(widget));
+ wxGtkString filename(gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(widget)));
p->UpdatePath(filename);
// since GtkFileChooserButton when used to pick directories also uses a combobox,
// style was given.
if (p->HasFlag(wxDIRP_CHANGE_DIR))
chdir(filename);
- g_free(filename);
// ...and fire an event
wxFileDirPickerEvent event(wxEVT_COMMAND_DIRPICKER_CHANGED, p, p->GetId(), p->GetPath());
// if you find a problem here, fix it also in wxFileButton !
m_needParent = true;
+ m_acceptsFocus = true;
if (!PreCreation( parent, pos, size ) ||
!wxControl::CreateBase(parent, id, pos, size, style & wxWINDOW_STYLE_MASK,
// create the dialog associated with this button
SetWindowStyle(style);
- m_path = path;
- if (!CreateDialog(message, wildcard))
+ m_message = message;
+ m_wildcard = wildcard;
+ if ((m_dialog = CreateDialog()) == NULL)
return false;
+ SetPath(path);
// little trick used to avoid problems when there are other GTK windows 'grabbed':
// GtkFileChooserDialog won't be responsive to user events if there is another
m_parent->DoAddChild( this );
PostCreation(size);
- SetBestSize(size);
+ SetInitialSize(size);
}
else
return wxGenericDirButton::Create(parent, id, label, path, message, wildcard,
m_dialog->m_widget = NULL;
}
+void wxDirButton::SetPath(const wxString &str)
+{
+ m_path = str;
+
+ // wxDirButton uses the "current-folder-changed" signal which is triggered also
+ // when we set the path on the dialog associated with this button; thus we need
+ // to set the following flag to avoid sending a wxFileDirPickerEvent from this
+ // function (which would be inconsistent with wxFileButton's behaviour and in
+ // general with all wxWidgets control-manipulation functions which do not send events).
+ m_bIgnoreNextChange = true;
+
+ UpdateDialogPath(m_dialog);
+}
+
#endif // wxUSE_DIRPICKERCTRL && defined(__WXGTK26__)