// Modified by:
// Created: 14/4/2006
// Copyright: (c) Francesco Montorsi
-// RCS-ID: $Id$
// Licence: wxWindows Licence
/////////////////////////////////////////////////////////////////////////////
#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_FWD_CORE wxDialog;
+class WXDLLIMPEXP_FWD_CORE wxFileDirPickerEvent;
+
+extern WXDLLIMPEXP_DATA_CORE(const char) wxFilePickerWidgetLabel[];
+extern WXDLLIMPEXP_DATA_CORE(const char) wxFilePickerWidgetNameStr[];
+extern WXDLLIMPEXP_DATA_CORE(const char) wxFilePickerCtrlNameStr[];
+extern WXDLLIMPEXP_DATA_CORE(const char) wxFileSelectorPromptStr[];
+
+extern WXDLLIMPEXP_DATA_CORE(const char) wxDirPickerWidgetLabel[];
+extern WXDLLIMPEXP_DATA_CORE(const char) wxDirPickerWidgetNameStr[];
+extern WXDLLIMPEXP_DATA_CORE(const char) wxDirPickerCtrlNameStr[];
+extern WXDLLIMPEXP_DATA_CORE(const char) wxDirSelectorPromptStr[];
+
+// ----------------------------------------------------------------------------
+// wxFileDirPickerEvent: used by wxFilePickerCtrl and wxDirPickerCtrl only
+// ----------------------------------------------------------------------------
+
+class WXDLLIMPEXP_CORE wxFileDirPickerEvent : public wxCommandEvent
+{
+public:
+ wxFileDirPickerEvent() {}
+ wxFileDirPickerEvent(wxEventType type, wxObject *generator, int id, const wxString &path)
+ : wxCommandEvent(type, id),
+ m_path(path)
+ {
+ SetEventObject(generator);
+ }
+
+ 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_ASSIGN(wxFileDirPickerEvent)
+};
+
+wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_FILEPICKER_CHANGED, wxFileDirPickerEvent );
+wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_DIRPICKER_CHANGED, wxFileDirPickerEvent );
-class WXDLLIMPEXP_CORE wxFileDirPickerEvent;
+// ----------------------------------------------------------------------------
+// event types and macros
+// ----------------------------------------------------------------------------
-extern WXDLLEXPORT_DATA(const wxChar) wxFilePickerWidgetLabel[];
-extern WXDLLEXPORT_DATA(const wxChar) wxFilePickerWidgetNameStr[];
-extern WXDLLEXPORT_DATA(const wxChar) wxFilePickerCtrlNameStr[];
-extern WXDLLEXPORT_DATA(const wxChar) wxFileSelectorPromptStr[];
+typedef void (wxEvtHandler::*wxFileDirPickerEventFunction)(wxFileDirPickerEvent&);
-extern WXDLLEXPORT_DATA(const wxChar) wxDirPickerWidgetLabel[];
-extern WXDLLEXPORT_DATA(const wxChar) wxDirPickerWidgetNameStr[];
-extern WXDLLEXPORT_DATA(const wxChar) wxDirPickerCtrlNameStr[];
-extern WXDLLEXPORT_DATA(const wxChar) wxDirSelectorPromptStr[];
+#define wxFileDirPickerEventHandler(func) \
+ wxEVENT_HANDLER_CAST(wxFileDirPickerEventFunction, func)
+#define EVT_FILEPICKER_CHANGED(id, fn) \
+ wx__DECLARE_EVT1(wxEVT_FILEPICKER_CHANGED, id, wxFileDirPickerEventHandler(fn))
+#define EVT_DIRPICKER_CHANGED(id, fn) \
+ wx__DECLARE_EVT1(wxEVT_DIRPICKER_CHANGED, id, wxFileDirPickerEventHandler(fn))
// ----------------------------------------------------------------------------
// wxFileDirPickerWidgetBase: a generic abstract interface which must be
wxFileDirPickerWidgetBase() { }
virtual ~wxFileDirPickerWidgetBase() { }
+ // Path here is the name of the selected file or directory.
wxString GetPath() const { return m_path; }
virtual void SetPath(const wxString &str) { m_path=str; }
+ // Set the directory to open the file browse dialog at initially.
+ virtual void SetInitialDirectory(const wxString& dir) = 0;
+
+ // returns the picker widget cast to wxControl
+ virtual wxControl *AsControl() = 0;
+
protected:
virtual void UpdateDialogPath(wxDialog *) = 0;
virtual void UpdatePathFromDialog(wxDialog *) = 0;
// 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
+#define wxFLP_SMALL wxPB_SMALL
// NOTE: wxMULTIPLE is not supported !
#define wxDIRP_DIR_MUST_EXIST 0x0008
#define wxDIRP_CHANGE_DIR 0x0010
+#define wxDIRP_SMALL wxPB_SMALL
// map platform-dependent controls which implement the wxFileDirPickerWidgetBase
// 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(__WXGTK26__) // since GTK >= 2.6, there is GtkFileButton
+// since GTK >= 2.6, there is GtkFileButton
+#if defined(__WXGTK20__) && !defined(__WXUNIVERSAL__)
#include "wx/gtk/filepicker.h"
#define wxFilePickerWidget wxFileButton
#define wxDirPickerWidget wxDirButton
// ----------------------------------------------------------------------------
-// wxFileDirPickerWidgetBase
+// wxFileDirPickerCtrlBase
// ----------------------------------------------------------------------------
class WXDLLIMPEXP_CORE wxFileDirPickerCtrlBase : public wxPickerBase
{
public:
- wxFileDirPickerCtrlBase() : m_bIgnoreNextTextCtrlUpdate(false) {}
- virtual ~wxFileDirPickerCtrlBase() {}
+ 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,
public: // public API
- wxString GetPath() const
- { return ((wxFileDirPickerWidgetBase*)m_picker)->GetPath(); }
+ wxString GetPath() const;
void SetPath(const wxString &str);
+ // Set the directory to open the file browse dialog at initially.
+ void SetInitialDirectory(const wxString& dir)
+ {
+ m_pickerIface->SetInitialDirectory(dir);
+ }
+
public: // internal functions
void UpdatePickerFromTextCtrl();
// 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).
- virtual bool CheckPath(const wxString &str) const = 0;
-
// TRUE if any textctrl change should update the current working directory
virtual bool IsCwdToUpdate() const = 0;
// Returns the event type sent by this picker
virtual wxEventType GetEventType() const = 0;
+ virtual void DoConnect( wxControl *sender, wxFileDirPickerCtrlBase *eventSink ) = 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
#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,
const wxSize& size = wxDefaultSize,
long style = wxFLP_DEFAULT_STYLE,
const wxValidator& validator = wxDefaultValidator,
- const wxString& name = wxFilePickerCtrlNameStr)
- {
- return wxFileDirPickerCtrlBase::CreateBase(parent, id, path,
- message, wildcard,
- pos, size, style,
- validator, name);
- }
+ const wxString& name = wxFilePickerCtrlNameStr);
+
+ 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 the text control value in canonical form
+ wxString GetTextCtrlValue() const;
+
+ bool IsCwdToUpdate() const
+ { return HasFlag(wxFLP_CHANGE_DIR); }
+
+ wxEventType GetEventType() const
+ { return wxEVT_FILEPICKER_CHANGED; }
+
+ virtual void DoConnect( wxControl *sender, wxFileDirPickerCtrlBase *eventSink )
{
- m_picker = new wxFilePickerWidget(parent, wxID_ANY,
- wxFilePickerWidgetLabel,
- path, message, wildcard,
- wxDefaultPosition, wxDefaultSize,
- GetPickerStyle(GetWindowStyle()));
- return true;
+ sender->Connect( wxEVT_FILEPICKER_CHANGED,
+ wxFileDirPickerEventHandler( wxFileDirPickerCtrlBase::OnFileDirChange ),
+ NULL, eventSink );
}
- // extracts the style for our picker from wxFileDirPickerCtrlBase's style
- long GetPickerStyle(long style) const
+
+protected:
+ virtual
+ wxFileDirPickerWidgetBase *CreatePicker(wxWindow *parent,
+ const wxString& path,
+ const wxString& message,
+ const wxString& wildcard)
{
- return (style & (wxFLP_OPEN|wxFLP_SAVE|wxFLP_OVERWRITE_PROMPT|
- wxFLP_FILE_MUST_EXIST|wxFLP_CHANGE_DIR));
+ return new wxFilePickerWidget(parent, wxID_ANY,
+ wxGetTranslation(wxFilePickerWidgetLabel),
+ path, message, wildcard,
+ wxDefaultPosition, wxDefaultSize,
+ GetPickerStyle(GetWindowStyle()));
}
- bool CheckPath(const wxString &path) const
+ // extracts the style for our picker from wxFileDirPickerCtrlBase's style
+ long GetPickerStyle(long style) const
{
- return HasFlag(wxFLP_SAVE) || wxFileName::FileExists(path);
+ return style & (wxFLP_OPEN |
+ wxFLP_SAVE |
+ wxFLP_OVERWRITE_PROMPT |
+ wxFLP_FILE_MUST_EXIST |
+ wxFLP_CHANGE_DIR |
+ wxFLP_USE_TEXTCTRL |
+ wxFLP_SMALL);
}
- bool IsCwdToUpdate() const
- { return HasFlag(wxFLP_CHANGE_DIR); }
-
- wxEventType GetEventType() const
- { return wxEVT_COMMAND_FILEPICKER_CHANGED; }
-
private:
DECLARE_DYNAMIC_CLASS(wxFilePickerCtrl)
};
#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);
-public: // overrides
+ void SetDirName(const wxFileName &dirname)
+ { SetPath(dirname.GetPath()); }
- 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;
- }
+ wxFileName GetDirName() const
+ { return wxFileName::DirName(GetPath()); }
- // extracts the style for our picker from wxFileDirPickerCtrlBase's style
- long GetPickerStyle(long style) const
- { return (style & (wxDIRP_DIR_MUST_EXIST|wxDIRP_CHANGE_DIR)); }
+public: // overrides
- 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); }
wxEventType GetEventType() const
- { return wxEVT_COMMAND_DIRPICKER_CHANGED; }
+ { return wxEVT_DIRPICKER_CHANGED; }
-private:
- DECLARE_DYNAMIC_CLASS(wxDirPickerCtrl)
-};
-
-#endif // wxUSE_DIRPICKERCTRL
-
-
-#if wxUSE_FILEPICKERCTRL || wxUSE_DIRPICKERCTRL
-
-// ----------------------------------------------------------------------------
-// wxFileDirPickerEvent: used by wxFilePickerCtrl and wxDirPickerCtrl only
-// ----------------------------------------------------------------------------
+ virtual void DoConnect( wxControl *sender, wxFileDirPickerCtrlBase *eventSink )
+ {
+ sender->Connect( wxEVT_DIRPICKER_CHANGED,
+ wxFileDirPickerEventHandler( wxFileDirPickerCtrlBase::OnFileDirChange ),
+ NULL, eventSink );
+ }
-BEGIN_DECLARE_EVENT_TYPES()
- DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_CORE, wxEVT_COMMAND_FILEPICKER_CHANGED, 1102)
- DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_CORE, wxEVT_COMMAND_DIRPICKER_CHANGED, 1103)
-END_DECLARE_EVENT_TYPES()
-class WXDLLIMPEXP_CORE wxFileDirPickerEvent : public wxCommandEvent
-{
-public:
- wxFileDirPickerEvent() {}
- wxFileDirPickerEvent(wxEventType type, wxObject *generator, int id, const wxString &path)
- : wxCommandEvent(type, id),
- m_path(path)
+protected:
+ virtual
+ wxFileDirPickerWidgetBase *CreatePicker(wxWindow *parent,
+ const wxString& path,
+ const wxString& message,
+ const wxString& WXUNUSED(wildcard))
{
- SetEventObject(generator);
+ return new wxDirPickerWidget(parent, wxID_ANY,
+ wxGetTranslation(wxDirPickerWidgetLabel),
+ path, message,
+ wxDefaultPosition, wxDefaultSize,
+ GetPickerStyle(GetWindowStyle()));
}
- wxString GetPath() const { return m_path; }
- void SetPath(const wxString &p) { m_path = p; }
+ // extracts the style for our picker from wxFileDirPickerCtrlBase's style
+ long GetPickerStyle(long style) const
+ {
+ return style & (wxDIRP_DIR_MUST_EXIST |
+ wxDIRP_CHANGE_DIR |
+ wxDIRP_USE_TEXTCTRL |
+ wxDIRP_SMALL);
+ }
private:
- wxString m_path;
-
- DECLARE_DYNAMIC_CLASS_NO_COPY(wxFileDirPickerEvent)
+ DECLARE_DYNAMIC_CLASS(wxDirPickerCtrl)
};
-// ----------------------------------------------------------------------------
-// event types and macros
-// ----------------------------------------------------------------------------
-
-typedef void (wxEvtHandler::*wxFileDirPickerEventFunction)(wxFileDirPickerEvent&);
-
-#define wxFileDirPickerEventHandler(func) \
- (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxFileDirPickerEventFunction, &func)
-
-#define EVT_FILEPICKER_CHANGED(id, fn) \
- wx__DECLARE_EVT1(wxEVT_COMMAND_FILEPICKER_CHANGED, id, wxFileDirPickerEventHandler(fn))
-#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_DIRPICKERCTRL
-#endif // wxUSE_FILEPICKERCTRL || wxUSE_DIRPICKERCTRL
+// old wxEVT_COMMAND_* constants
+#define wxEVT_COMMAND_FILEPICKER_CHANGED wxEVT_FILEPICKER_CHANGED
+#define wxEVT_COMMAND_DIRPICKER_CHANGED wxEVT_DIRPICKER_CHANGED
#endif // _WX_FILEDIRPICKER_H_BASE_