]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/filepicker.cpp
Fixed [ 1556843 ] wxGTK FindFocus returns NULL when a wxListBox is focused
[wxWidgets.git] / src / gtk / filepicker.cpp
index 4370de3f9b1515f5fac0c5a05601495c08ed8d1d..6779e751117164ef3de7ba3cc8aa2b5e703d253a 100644 (file)
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
-#include "wx/gtk/private.h"
-#include "wx/filepicker.h"
-
+#if wxUSE_FILEPICKERCTRL && defined(__WXGTK26__)
 
-#if wxUSE_TOOLTIPS
+#include "wx/filepicker.h"
 #include "wx/tooltip.h"
-#endif
 
-#include <gdk/gdk.h>
 #include <gtk/gtk.h>
 
-#include <unistd.h> // chdir
 
 
 // ============================================================================
 // implementation
 // ============================================================================
 
-#if wxUSE_FILEPICKERCTRL && defined(__WXGTK26__)
-
 //-----------------------------------------------------------------------------
 // wxFileButton
 //-----------------------------------------------------------------------------
@@ -52,10 +45,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,
@@ -66,9 +60,13 @@ bool wxFileButton::Create( wxWindow *parent, wxWindowID id,
         }
 
         // 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':
@@ -122,7 +120,7 @@ void wxFileButton::OnDialogOK(wxCommandEvent& ev)
     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);
@@ -130,6 +128,12 @@ void wxFileButton::OnDialogOK(wxCommandEvent& ev)
     }
 }
 
+void wxFileButton::SetPath(const wxString &str)
+{
+    m_path = str;
+    UpdateDialogPath(m_dialog);
+}
+
 #endif      // wxUSE_FILEPICKERCTRL && defined(__WXGTK26__)
 
 
@@ -137,6 +141,8 @@ void wxFileButton::OnDialogOK(wxCommandEvent& ev)
 
 #if wxUSE_DIRPICKERCTRL && defined(__WXGTK26__)
 
+#include <unistd.h> // chdir
+
 //-----------------------------------------------------------------------------
 // "current-folder-changed"
 //-----------------------------------------------------------------------------
@@ -146,6 +152,12 @@ 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
@@ -188,6 +200,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,
@@ -199,9 +212,11 @@ bool wxDirButton::Create( wxWindow *parent, wxWindowID id,
 
         // 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
@@ -246,4 +261,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__)