]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/filepicker.h
Upport scrolling changes and mouse wheel changes.
[wxWidgets.git] / include / wx / filepicker.h
index 218bda654cdbc80b361c4b8bb1effaf996e5b361..8423c65f26947971f0d79206c41d42e23663196a 100644 (file)
 
 #include "wx/defs.h"
 
-
 #if wxUSE_FILEPICKERCTRL || wxUSE_DIRPICKERCTRL
 
-#include "wx/control.h"
 #include "wx/pickerbase.h"
-#include "wx/filedlg.h"
 #include "wx/filename.h"
 
-
+class WXDLLIMPEXP_CORE wxDialog;
 class WXDLLIMPEXP_CORE wxFileDirPickerEvent;
 
 extern WXDLLEXPORT_DATA(const wxChar) wxFilePickerWidgetLabel[];
@@ -48,11 +45,14 @@ public:
     virtual ~wxFileDirPickerWidgetBase() {  }
 
     wxString GetPath() const { return m_path; }
-    void SetPath(const wxString &str) { m_path=str; UpdateDialogPath(); }
+    virtual void SetPath(const wxString &str) { m_path=str; }
+
+    // returns the picker widget cast to wxControl
+    virtual wxControl *AsControl() = 0;
 
 protected:
-    virtual void UpdateDialogPath() = 0;
-    virtual void UpdatePathFromDialog() = 0;
+    virtual void UpdateDialogPath(wxDialog *) = 0;
+    virtual void UpdatePathFromDialog(wxDialog *) = 0;
 
     wxString m_path;
 };
@@ -61,11 +61,11 @@ protected:
 // NB: these styles must be defined to carefully-chosen values to
 //     avoid conflicts with wxButton's styles
 
-#define wxFLP_OPEN                    0x0200
-#define wxFLP_SAVE                    0x0400
-#define wxFLP_OVERWRITE_PROMPT        0x0800
-#define wxFLP_FILE_MUST_EXIST         0x1000
-#define wxFLP_CHANGE_DIR              0x2000
+#define wxFLP_OPEN                    0x0400
+#define wxFLP_SAVE                    0x0800
+#define wxFLP_OVERWRITE_PROMPT        0x1000
+#define wxFLP_FILE_MUST_EXIST         0x2000
+#define wxFLP_CHANGE_DIR              0x4000
 
 // NOTE: wxMULTIPLE is not supported !
 
@@ -79,7 +79,8 @@ protected:
 // NOTE: wxFileDirPickerCtrlBase will allocate a wx{File|Dir}PickerWidget and this
 //       requires that all classes being mapped as wx{File|Dir}PickerWidget have the
 //       same prototype for the contructor...
-#if defined(__WXGTK24__)        // since GTK > 2.4, there is GtkColorButton
+// since GTK >= 2.6, there is GtkFileButton
+#if defined(__WXGTK26__) && !defined(__WXUNIVERSAL__)
     #include "wx/gtk/filepicker.h"
     #define wxFilePickerWidget      wxFileButton
     #define wxDirPickerWidget       wxDirButton
@@ -92,15 +93,15 @@ protected:
 
 
 // ----------------------------------------------------------------------------
-// wxFileDirPickerWidgetBase
+// wxFileDirPickerCtrlBase
 // ----------------------------------------------------------------------------
 
 class WXDLLIMPEXP_CORE wxFileDirPickerCtrlBase : public wxPickerBase
 {
 public:
     wxFileDirPickerCtrlBase() : m_bIgnoreNextTextCtrlUpdate(false) {}
-    virtual ~wxFileDirPickerCtrlBase() {}
 
+protected:
     // NB: no default values since this function will never be used
     //     directly by the user and derived classes wouldn't use them
     bool CreateBase(wxWindow *parent,
@@ -116,8 +117,7 @@ public:
 
 public:         // public API
 
-    wxString GetPath() const
-        { return ((wxFileDirPickerWidgetBase*)m_picker)->GetPath(); }
+    wxString GetPath() const;
     void SetPath(const wxString &str);
 
 public:        // internal functions
@@ -128,9 +128,6 @@ public:        // internal functions
     // event handler for our picker
     void OnFileDirChange(wxFileDirPickerEvent &);
 
-    virtual bool CreatePicker(wxWindow *parent, const wxString& path,
-                      const wxString& message, const wxString& wildcard) = 0;
-
     // Returns TRUE if the current path is a valid one
     // (i.e. a valid file for a wxFilePickerWidget or a valid
     //  folder for a wxDirPickerWidget).
@@ -142,10 +139,24 @@ public:        // internal functions
     // Returns the event type sent by this picker
     virtual wxEventType GetEventType() const = 0;
 
+    // Returns the filtered value currently placed in the text control (if present).
+    virtual wxString GetTextCtrlValue() const = 0;
+
+protected:
+    // creates the picker control
+    virtual
+    wxFileDirPickerWidgetBase *CreatePicker(wxWindow *parent,
+                                            const wxString& path,
+                                            const wxString& message,
+                                            const wxString& wildcard) = 0;
+
 protected:
 
     // true if the next UpdateTextCtrl() call is to ignore
     bool m_bIgnoreNextTextCtrlUpdate;
+
+    // m_picker object as wxFileDirPickerWidgetBase interface
+    wxFileDirPickerWidgetBase *m_pickerIface;
 };
 
 #endif  // wxUSE_FILEPICKERCTRL || wxUSE_DIRPICKERCTRL
@@ -159,20 +170,19 @@ protected:
 // used, a textctrl next to it.
 // ----------------------------------------------------------------------------
 
-#define wxFLP_USE_TEXTCTRL            wxPB_USE_TEXTCTRL
+#define wxFLP_USE_TEXTCTRL            (wxPB_USE_TEXTCTRL)
 
 #ifdef __WXGTK__
     // GTK apps usually don't have a textctrl next to the picker
-    #define wxFLP_DEFAULT_STYLE       wxFLP_OPEN
+    #define wxFLP_DEFAULT_STYLE       (wxFLP_OPEN|wxFLP_FILE_MUST_EXIST)
 #else
-    #define wxFLP_DEFAULT_STYLE       wxFLP_USE_TEXTCTRL|wxFLP_OPEN
+    #define wxFLP_DEFAULT_STYLE       (wxFLP_USE_TEXTCTRL|wxFLP_OPEN|wxFLP_FILE_MUST_EXIST)
 #endif
 
 class WXDLLIMPEXP_CORE wxFilePickerCtrl : public wxFileDirPickerCtrlBase
 {
 public:
     wxFilePickerCtrl() {}
-    virtual ~wxFilePickerCtrl() {}
 
     wxFilePickerCtrl(wxWindow *parent,
                      wxWindowID id,
@@ -206,18 +216,37 @@ public:
                                                    validator, name);
     }
 
+    void SetFileName(const wxFileName &filename)
+        { SetPath(filename.GetFullPath()); }
+
+    wxFileName GetFileName() const
+        { return wxFileName(GetPath()); }
 
 public:     // overrides
 
-    bool CreatePicker(wxWindow *parent, const wxString& path,
-                      const wxString& message, const wxString& wildcard)
+    // return true if the given path is valid for this control
+    bool CheckPath(const wxString& path) const;
+
+    // return the text control value in canonical form
+    wxString GetTextCtrlValue() const;
+
+    bool IsCwdToUpdate() const
+        { return HasFlag(wxFLP_CHANGE_DIR); }
+
+    wxEventType GetEventType() const
+        { return wxEVT_COMMAND_FILEPICKER_CHANGED; }
+
+protected:
+    wxFileDirPickerWidgetBase *CreatePicker(wxWindow *parent,
+                                            const wxString& path,
+                                            const wxString& message,
+                                            const wxString& wildcard)
     {
-        m_picker = new wxFilePickerWidget(parent, wxID_ANY,
-                                          wxFilePickerWidgetLabel,
-                                          path, message, wildcard,
-                                          wxDefaultPosition, wxDefaultSize,
-                                          GetPickerStyle(GetWindowStyle()));
-        return true;
+        return new wxFilePickerWidget(parent, wxID_ANY,
+                                      wxFilePickerWidgetLabel,
+                                      path, message, wildcard,
+                                      wxDefaultPosition, wxDefaultSize,
+                                      GetPickerStyle(GetWindowStyle()));
     }
 
     // extracts the style for our picker from wxFileDirPickerCtrlBase's style
@@ -227,17 +256,6 @@ public:     // overrides
                             wxFLP_FILE_MUST_EXIST|wxFLP_CHANGE_DIR));
     }
 
-    bool CheckPath(const wxString &path) const
-    {
-        return HasFlag(wxFLP_SAVE) || wxFileName::FileExists(path);
-    }
-
-    bool IsCwdToUpdate() const
-        { return HasFlag(wxFLP_CHANGE_DIR); }
-
-    wxEventType GetEventType() const
-        { return wxEVT_COMMAND_FILEPICKER_CHANGED; }
-
 private:
     DECLARE_DYNAMIC_CLASS(wxFilePickerCtrl)
 };
@@ -253,58 +271,59 @@ private:
 // (see wxDIRP_USE_TEXTCTRL) next to it.
 // ----------------------------------------------------------------------------
 
-#define wxDIRP_USE_TEXTCTRL            wxPB_USE_TEXTCTRL
+#define wxDIRP_USE_TEXTCTRL            (wxPB_USE_TEXTCTRL)
 
 #ifdef __WXGTK__
     // GTK apps usually don't have a textctrl next to the picker
-    #define wxDIRP_DEFAULT_STYLE       0
+    #define wxDIRP_DEFAULT_STYLE       (wxDIRP_DIR_MUST_EXIST)
 #else
-    #define wxDIRP_DEFAULT_STYLE       wxDIRP_USE_TEXTCTRL
+    #define wxDIRP_DEFAULT_STYLE       (wxDIRP_USE_TEXTCTRL|wxDIRP_DIR_MUST_EXIST)
 #endif
 
 class WXDLLIMPEXP_CORE wxDirPickerCtrl : public wxFileDirPickerCtrlBase
 {
 public:
     wxDirPickerCtrl() {}
-    virtual ~wxDirPickerCtrl() {}
 
     wxDirPickerCtrl(wxWindow *parent, wxWindowID id,
-        const wxString& path = wxEmptyString,
-        const wxString& message = wxDirSelectorPromptStr,
-        const wxPoint& pos = wxDefaultPosition,
-        const wxSize& size = wxDefaultSize, long style = wxDIRP_DEFAULT_STYLE,
-        const wxValidator& validator = wxDefaultValidator,
-        const wxString& name = wxDirPickerCtrlNameStr)
-    { Create(parent, id, path, message, pos, size, style, validator, name); }
+                    const wxString& path = wxEmptyString,
+                    const wxString& message = wxDirSelectorPromptStr,
+                    const wxPoint& pos = wxDefaultPosition,
+                    const wxSize& size = wxDefaultSize,
+                    long style = wxDIRP_DEFAULT_STYLE,
+                    const wxValidator& validator = wxDefaultValidator,
+                    const wxString& name = wxDirPickerCtrlNameStr)
+    {
+        Create(parent, id, path, message, pos, size, style, validator, name);
+    }
 
     bool Create(wxWindow *parent, wxWindowID id,
-        const wxString& path = wxEmptyString,
-        const wxString& message = wxDirSelectorPromptStr,
-        const wxPoint& pos = wxDefaultPosition,
-        const wxSize& size = wxDefaultSize, long style = wxDIRP_DEFAULT_STYLE,
-        const wxValidator& validator = wxDefaultValidator,
-        const wxString& name = wxDirPickerCtrlNameStr)
-    { return wxFileDirPickerCtrlBase::CreateBase(parent, id, path, message, wxEmptyString,
-                                                 pos, size, style, validator, name); }
+                const wxString& path = wxEmptyString,
+                const wxString& message = wxDirSelectorPromptStr,
+                const wxPoint& pos = wxDefaultPosition,
+                const wxSize& size = wxDefaultSize,
+                long style = wxDIRP_DEFAULT_STYLE,
+                const wxValidator& validator = wxDefaultValidator,
+                const wxString& name = wxDirPickerCtrlNameStr)
+    {
+        return wxFileDirPickerCtrlBase::CreateBase
+               (
+                    parent, id, path, message, wxEmptyString,
+                    pos, size, style, validator, name
+               );
+    }
+
+    void SetDirName(const wxFileName &dirname)
+        { SetPath(dirname.GetPath()); }
 
+    wxFileName GetDirName() const
+        { return wxFileName::DirName(GetPath()); }
 
 public:     // overrides
 
-    bool CreatePicker(wxWindow *parent, const wxString& path,
-                      const wxString& message, const wxString& WXUNUSED(wildcard))
-    {
-        m_picker = new wxDirPickerWidget(parent, wxID_ANY, wxDirPickerWidgetLabel,
-                                         path, message, wxDefaultPosition, wxDefaultSize,
-                                         GetPickerStyle(GetWindowStyle()));
-        return true;
-    }
+    bool CheckPath(const wxString &path) const;
 
-    // extracts the style for our picker from wxFileDirPickerCtrlBase's style
-    long GetPickerStyle(long style) const
-        { return (style & (wxDIRP_DIR_MUST_EXIST|wxDIRP_CHANGE_DIR)); }
-
-    bool CheckPath(const wxString &path) const
-        { if (HasFlag(wxDIRP_DIR_MUST_EXIST)) return wxFileName::DirExists(path); else return true; }
+    wxString GetTextCtrlValue() const;
 
     bool IsCwdToUpdate() const
         { return HasFlag(wxDIRP_CHANGE_DIR); }
@@ -312,6 +331,22 @@ public:     // overrides
     wxEventType GetEventType() const
         { return wxEVT_COMMAND_DIRPICKER_CHANGED; }
 
+protected:
+    wxFileDirPickerWidgetBase *CreatePicker(wxWindow *parent,
+                                            const wxString& path,
+                                            const wxString& message,
+                                            const wxString& WXUNUSED(wildcard))
+    {
+        return new wxDirPickerWidget(parent, wxID_ANY, wxDirPickerWidgetLabel,
+                                     path, message,
+                                     wxDefaultPosition, wxDefaultSize,
+                                     GetPickerStyle(GetWindowStyle()));
+    }
+
+    // extracts the style for our picker from wxFileDirPickerCtrlBase's style
+    long GetPickerStyle(long style) const
+        { return (style & (wxDIRP_DIR_MUST_EXIST|wxDIRP_CHANGE_DIR)); }
+
 private:
     DECLARE_DYNAMIC_CLASS(wxDirPickerCtrl)
 };
@@ -344,10 +379,13 @@ public:
     wxString GetPath() const { return m_path; }
     void SetPath(const wxString &p) { m_path = p; }
 
+    // default copy ctor, assignment operator and dtor are ok
+    virtual wxEvent *Clone() const { return new wxFileDirPickerEvent(*this); }
+
 private:
     wxString m_path;
 
-    DECLARE_DYNAMIC_CLASS_NO_COPY(wxFileDirPickerEvent)
+    DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxFileDirPickerEvent)
 };
 
 // ----------------------------------------------------------------------------
@@ -364,13 +402,6 @@ typedef void (wxEvtHandler::*wxFileDirPickerEventFunction)(wxFileDirPickerEvent&
 #define EVT_DIRPICKER_CHANGED(id, fn) \
     wx__DECLARE_EVT1(wxEVT_COMMAND_DIRPICKER_CHANGED, id, wxFileDirPickerEventHandler(fn))
 
-#ifdef _WX_DEFINE_DATE_EVENTS_
-    DEFINE_EVENT_TYPE(wxEVT_COMMAND_FILEPICKER_CHANGED)
-    DEFINE_EVENT_TYPE(wxEVT_COMMAND_DIRPICKER_CHANGED)
-
-    IMPLEMENT_DYNAMIC_CLASS(wxFileDirPickerEvent, wxCommandEvent)
-#endif
-
 
 #endif // wxUSE_FILEPICKERCTRL || wxUSE_DIRPICKERCTRL