]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/gtk/filepicker.h
fix aui crash related to SF bug 1531361
[wxWidgets.git] / include / wx / gtk / filepicker.h
index 5e04b4f88aaff1a61f227a295d4f4b0182abaddc..0030e4c61cc4bb3a869e755158a95a30eaad3724 100644 (file)
 //  and from wxGenericDirButton classes !)
 //-----------------------------------------------------------------------------
 
-#define FILEDIRBTN_OVERRIDES                                                        \
-    /* NULL is because of a problem with destruction order which happens      */    \
-    /* if we pass GetParent(): in fact, this GTK native implementation        */    \
-    /* needs to create the dialog in ::Create() and not for each user request */    \
-    /* in response to the user click as the generic implementation does       */    \
-    virtual wxWindow *GetDialogParent()                                             \
-    {                                                                               \
-        return NULL;                                                                \
-    }                                                                               \
-                                                                                    \
-    virtual bool Destroy()                                                          \
-    {                                                                               \
-        m_dialog->Destroy();                                                        \
-        return wxButton::Destroy();                                                 \
-    }                                                                               \
-                                                                                    \
-    virtual void SetPath(const wxString &str)                                       \
-    {                                                                               \
-        m_path=str;                                                                 \
-        UpdateDialogPath(m_dialog);                                                 \
-    }
+#define FILEDIRBTN_OVERRIDES                                                  \
+    /* NULL is because of a problem with destruction order which happens   */ \
+    /* if we pass GetParent(): in fact, this GTK native implementation     */ \
+    /* needs to create the dialog in ::Create() and not for each user      */ \
+    /* request in response to the user click as the generic implementation */ \
+    /* does.                                                               */ \
+    virtual wxWindow *GetDialogParent()                                       \
+    {                                                                         \
+        return NULL;                                                          \
+    }                                                                         \
+                                                                              \
+    virtual bool Destroy()                                                    \
+    {                                                                         \
+        m_dialog->Destroy();                                                  \
+        return wxButton::Destroy();                                           \
+    }                                                                         \
+                                                                              \
+    /* even if wx derive from wxGenericFileButton, i.e. from wxButton, our */ \
+    /* native GTK+ widget does not derive from GtkButton thus *all* uses   */ \
+    /* GTK_BUTTON(m_widget) macro done by wxButton must be bypassed to     */ \
+    /* avoid bunch of GTK+ warnings like:                                  */ \
+    /*      invalid cast from `GtkFileChooserButton' to  `GtkButton'       */ \
+    /* so, override wxButton::GTKGetWindow and return NULL as GTK+ doesn't */ \
+    /* give us access to the internal GdkWindow of a GtkFileChooserButton  */ \
+    virtual GdkWindow *GTKGetWindow(wxArrayGdkWindows& windows) const         \
+        { return NULL; }
 
 
 //-----------------------------------------------------------------------------
@@ -105,6 +110,8 @@ public:     // some overrides
                      ~(wxFD_SAVE | wxFD_OVERWRITE_PROMPT)) | wxFD_OPEN;
     }
 
+    virtual void SetPath(const wxString &str);
+
     // see macro defined above
     FILEDIRBTN_OVERRIDES
 
@@ -123,7 +130,7 @@ private:
 class WXDLLIMPEXP_CORE wxDirButton : public wxGenericDirButton
 {
 public:
-    wxDirButton() { m_dialog = NULL;}
+    wxDirButton() { Init(); }
     wxDirButton(wxWindow *parent,
                 wxWindowID id,
                 const wxString& label = wxFilePickerWidgetLabel,
@@ -135,7 +142,8 @@ public:
                 const wxValidator& validator = wxDefaultValidator,
                 const wxString& name = wxFilePickerWidgetNameStr)
     {
-        m_dialog = NULL;
+        Init();
+
         Create(parent, id, label, path, message, wxEmptyString,
                 pos, size, style, validator, name);
     }
@@ -157,9 +165,6 @@ public:     // overrides
                 const wxValidator& validator = wxDefaultValidator,
                 const wxString& name = wxFilePickerWidgetNameStr);
 
-    // used by the GTK callback only
-    void UpdatePath(char *gtkpath)
-        { m_path = wxString::FromAscii(gtkpath); }
 
     // GtkFileChooserButton does not support GTK_FILE_CHOOSER_CREATE_FOLDER
     // thus we must ensure that the wxDD_DIR_MUST_EXIST style was given
@@ -168,12 +173,28 @@ public:     // overrides
         return (wxGenericDirButton::GetDialogStyle() | wxDD_DIR_MUST_EXIST);
     }
 
+    virtual void SetPath(const wxString &str);
+
     // see macro defined above
     FILEDIRBTN_OVERRIDES
 
 protected:
+    // common part of all ctors
+    void Init()
+    {
+        m_dialog = NULL;
+        m_bIgnoreNextChange = false;
+    }
+
     wxDialog *m_dialog;
 
+public:    // used by the GTK callback only
+
+    bool m_bIgnoreNextChange;
+
+    void UpdatePath(const char *gtkpath)
+        { m_path = wxString::FromAscii(gtkpath); }
+
 private:
     DECLARE_DYNAMIC_CLASS(wxDirButton)
 };