]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/generic/filepickerg.h
Use wmain() if supported by the compiler/CRT instead of main().
[wxWidgets.git] / include / wx / generic / filepickerg.h
index accfe2d2665f64b73efbe0d61e9bf73662280bb5..203bd6e682af944e7652d7009bac6c422177c37c 100644 (file)
 #define _WX_FILEDIRPICKER_H_
 
 #include "wx/button.h"
-#include "wx/filename.h"
 #include "wx/filedlg.h"
 #include "wx/dirdlg.h"
 
 
-extern const wxEventType wxEVT_COMMAND_DIRPICKER_CHANGED;
-extern const wxEventType wxEVT_COMMAND_FILEPICKER_CHANGED;
+wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEvent );
+wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_FILEPICKER_CHANGED, wxFileDirPickerEvent );
 
 
 //-----------------------------------------------------------------------------
@@ -30,7 +29,7 @@ class WXDLLIMPEXP_CORE wxGenericFileDirButton : public wxButton,
                                                 public wxFileDirPickerWidgetBase
 {
 public:
-    wxGenericFileDirButton() { m_dialog = NULL; }
+    wxGenericFileDirButton() { Init(); }
     wxGenericFileDirButton(wxWindow *parent,
                            wxWindowID id,
                            const wxString& label = wxFilePickerWidgetLabel,
@@ -43,31 +42,25 @@ public:
                            const wxValidator& validator = wxDefaultValidator,
                            const wxString& name = wxFilePickerWidgetNameStr)
     {
-        m_dialog = NULL;
+        Init();
         Create(parent, id, label, path, message, wildcard,
                pos, size, style, validator, name);
     }
 
-    virtual ~wxGenericFileDirButton() {}
+    virtual wxControl *AsControl() { return this; }
 
-public:     // overrideable
+public:     // overridable
 
-    virtual bool CreateDialog(const wxString &message,
-                              const wxString &wildcard) = 0;
+    virtual wxDialog *CreateDialog() = 0;
 
-    // NULL is because of a problem with destruction order in both generic & GTK code
     virtual wxWindow *GetDialogParent()
-        { return NULL; }
+        { return GetParent(); }
 
     virtual wxEventType GetEventType() const = 0;
 
-public:
+    virtual void SetInitialDirectory(const wxString& dir);
 
-    bool Destroy()
-    {
-        m_dialog->Destroy();
-        return wxButton::Destroy();
-    }
+public:
 
     bool Create(wxWindow *parent, wxWindowID id,
            const wxString& label = wxFilePickerWidgetLabel,
@@ -83,7 +76,20 @@ public:
     // event handler for the click
     void OnButtonClick(wxCommandEvent &);
 
-    wxDialog *m_dialog;
+protected:
+    wxString m_message, m_wildcard;
+
+    // we just store the style passed to the ctor here instead of passing it to
+    // wxButton as some of our bits can conflict with wxButton styles and it
+    // just doesn't make sense to use picker styles for wxButton anyhow
+    long m_pickerStyle;
+
+    // Initial directory set by SetInitialDirectory() call or empty.
+    wxString m_initialDir;
+
+private:
+    // common part of all ctors
+    void Init() { m_pickerStyle = -1; }
 };
 
 
@@ -91,7 +97,7 @@ public:
 // wxGenericFileButton: a button which brings up a wxFileDialog
 //-----------------------------------------------------------------------------
 
-#define wxFILEBTN_DEFAULT_STYLE                     wxFLP_OPEN
+#define wxFILEBTN_DEFAULT_STYLE                     (wxFLP_OPEN)
 
 class WXDLLIMPEXP_CORE wxGenericFileButton : public wxGenericFileDirButton
 {
@@ -113,47 +119,47 @@ public:
                pos, size, style, validator, name);
     }
 
-public:     // overrideable
+public:     // overridable
 
     virtual long GetDialogStyle() const
     {
+        // the derived class must initialize it if it doesn't use the
+        // non-default wxGenericFileDirButton ctor
+        wxASSERT_MSG( m_pickerStyle != -1,
+                      "forgot to initialize m_pickerStyle?" );
+
+
         long filedlgstyle = 0;
 
-        if (this->HasFlag(wxFLP_OPEN))
+        if ( m_pickerStyle & wxFLP_OPEN )
             filedlgstyle |= wxFD_OPEN;
-        if (this->HasFlag(wxFLP_SAVE))
+        if ( m_pickerStyle & wxFLP_SAVE )
             filedlgstyle |= wxFD_SAVE;
-        if (this->HasFlag(wxFLP_OVERWRITE_PROMPT))
+        if ( m_pickerStyle & wxFLP_OVERWRITE_PROMPT )
             filedlgstyle |= wxFD_OVERWRITE_PROMPT;
-        if (this->HasFlag(wxFLP_FILE_MUST_EXIST))
+        if ( m_pickerStyle & wxFLP_FILE_MUST_EXIST )
             filedlgstyle |= wxFD_FILE_MUST_EXIST;
-        if (this->HasFlag(wxFLP_CHANGE_DIR))
+        if ( m_pickerStyle & wxFLP_CHANGE_DIR )
             filedlgstyle |= wxFD_CHANGE_DIR;
 
         return filedlgstyle;
     }
 
-    virtual bool CreateDialog(const wxString &message, const wxString &wildcard)
-    {
-        m_dialog = new wxFileDialog(GetDialogParent(), message,
-                                    wxEmptyString, wxEmptyString,
-                                    wildcard, GetDialogStyle());
-
-        // this sets both the default folder and the default file of the dialog
-        GetDialog()->SetPath(m_path);
+    virtual wxDialog *CreateDialog();
 
-        return true;
-    }
-
-    wxFileDialog *GetDialog()
-        { return wxStaticCast(m_dialog, wxFileDialog); }
-    void UpdateDialogPath()
-        { GetDialog()->SetPath(m_path); }
-    void UpdatePathFromDialog()
-        { m_path = GetDialog()->GetPath(); }
     wxEventType GetEventType() const
         { return wxEVT_COMMAND_FILEPICKER_CHANGED; }
 
+protected:
+    void UpdateDialogPath(wxDialog *p)
+        { wxStaticCast(p, wxFileDialog)->SetPath(m_path); }
+    void UpdatePathFromDialog(wxDialog *p)
+        { m_path = wxStaticCast(p, wxFileDialog)->GetPath(); }
+
+    // Set the initial directory for the dialog but without overriding the
+    // directory of the currently selected file, if any.
+    void DoSetInitialDirectory(wxFileDialog* dialog, const wxString& dir);
+
 private:
     DECLARE_DYNAMIC_CLASS(wxGenericFileButton)
 };
@@ -184,36 +190,31 @@ public:
                pos, size, style, validator, name);
     }
 
-public:     // overrideable
+public:     // overridable
 
     virtual long GetDialogStyle() const
     {
-        long dirdlgstyle = 0;
+        long dirdlgstyle = wxDD_DEFAULT_STYLE;
 
-        if (this->HasFlag(wxDIRP_DIR_MUST_EXIST))
+        if ( m_pickerStyle & wxDIRP_DIR_MUST_EXIST )
             dirdlgstyle |= wxDD_DIR_MUST_EXIST;
-        if (this->HasFlag(wxDIRP_CHANGE_DIR))
+        if ( m_pickerStyle & wxDIRP_CHANGE_DIR )
             dirdlgstyle |= wxDD_CHANGE_DIR;
 
         return dirdlgstyle;
     }
 
-    virtual bool CreateDialog(const wxString &message, const wxString &WXUNUSED(wildcard))
-    {
-        m_dialog = new wxDirDialog(GetDialogParent(), message, m_path,
-                                   GetDialogStyle());
-        return true;
-    }
+    virtual wxDialog *CreateDialog();
 
-    wxDirDialog *GetDialog()
-        { return wxStaticCast(m_dialog, wxDirDialog); }
-    void UpdateDialogPath()
-        { GetDialog()->SetPath(m_path); }
-    void UpdatePathFromDialog()
-        { m_path = GetDialog()->GetPath(); }
     wxEventType GetEventType() const
         { return wxEVT_COMMAND_DIRPICKER_CHANGED; }
 
+protected:
+    void UpdateDialogPath(wxDialog *p)
+        { wxStaticCast(p, wxDirDialog)->SetPath(m_path); }
+    void UpdatePathFromDialog(wxDialog *p)
+        { m_path = wxStaticCast(p, wxDirDialog)->GetPath(); }
+
 private:
     DECLARE_DYNAMIC_CLASS(wxGenericDirButton)
 };