]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/filepicker.cpp
don't include missing.h before windows headers
[wxWidgets.git] / src / gtk / filepicker.cpp
index 6784f90430f0fa029727e6aa3ee07b37fcd2a5c7..cec62bdeb1333320800cf895ba9cbaa8189c0750 100644 (file)
 #if wxUSE_FILEPICKERCTRL && defined(__WXGTK26__)
 
 #include "wx/filepicker.h"
-
 #include "wx/tooltip.h"
 
-#include <gtk/gtk.h>
-
-#include <unistd.h> // chdir
-
+#include "wx/gtk/private.h"
 
 // ============================================================================
 // implementation
@@ -47,10 +43,11 @@ bool wxFileButton::Create( wxWindow *parent, wxWindowID id,
 {
     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,
@@ -129,6 +126,12 @@ void wxFileButton::OnDialogOK(wxCommandEvent& ev)
     }
 }
 
+void wxFileButton::SetPath(const wxString &str)
+{
+    m_path = str;
+    UpdateDialogPath(m_dialog);
+}
+
 #endif      // wxUSE_FILEPICKERCTRL && defined(__WXGTK26__)
 
 
@@ -136,6 +139,8 @@ void wxFileButton::OnDialogOK(wxCommandEvent& ev)
 
 #if wxUSE_DIRPICKERCTRL && defined(__WXGTK26__)
 
+#include <unistd.h> // chdir
+
 //-----------------------------------------------------------------------------
 // "current-folder-changed"
 //-----------------------------------------------------------------------------
@@ -145,11 +150,17 @@ static void gtk_dirbutton_currentfolderchanged_callback(GtkFileChooserButton *wi
                                                         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,
@@ -159,7 +170,6 @@ static void gtk_dirbutton_currentfolderchanged_callback(GtkFileChooserButton *wi
     // 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());
@@ -187,6 +197,7 @@ bool wxDirButton::Create( wxWindow *parent, wxWindowID id,
         //                 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,
@@ -202,6 +213,7 @@ bool wxDirButton::Create( wxWindow *parent, wxWindowID id,
         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
@@ -246,4 +258,18 @@ wxDirButton::~wxDirButton()
     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__)