1/////////////////////////////////////////////////////////////////////////////
2// Name:        wx/filepicker.h
3// Purpose:     wxFilePickerCtrl, wxDirPickerCtrl base header
4// Author:      Francesco Montorsi
5// Modified by:
6// Created:     14/4/2006
7// Copyright:   (c) Francesco Montorsi
8// RCS-ID:      $Id: filepicker.h 49804 2007-11-10 01:09:42Z VZ $
9// Licence:     wxWindows Licence
10/////////////////////////////////////////////////////////////////////////////
11
12#ifndef _WX_FILEDIRPICKER_H_BASE_
13#define _WX_FILEDIRPICKER_H_BASE_
14
15#include "wx/defs.h"
16
17#if wxUSE_FILEPICKERCTRL || wxUSE_DIRPICKERCTRL
18
19#include "wx/pickerbase.h"
20
21class WXDLLIMPEXP_FWD_CORE wxDialog;
22class WXDLLIMPEXP_FWD_CORE wxFileDirPickerEvent;
23
24extern WXDLLEXPORT_DATA(const wxChar) wxFilePickerWidgetLabel[];
25extern WXDLLEXPORT_DATA(const wxChar) wxFilePickerWidgetNameStr[];
26extern WXDLLEXPORT_DATA(const wxChar) wxFilePickerCtrlNameStr[];
27extern WXDLLEXPORT_DATA(const wxChar) wxFileSelectorPromptStr[];
28
29extern WXDLLEXPORT_DATA(const wxChar) wxDirPickerWidgetLabel[];
30extern WXDLLEXPORT_DATA(const wxChar) wxDirPickerWidgetNameStr[];
31extern WXDLLEXPORT_DATA(const wxChar) wxDirPickerCtrlNameStr[];
32extern WXDLLEXPORT_DATA(const wxChar) wxDirSelectorPromptStr[];
33
34
35// ----------------------------------------------------------------------------
36// wxFileDirPickerWidgetBase: a generic abstract interface which must be
37//                           implemented by controls used by wxFileDirPickerCtrlBase
38// ----------------------------------------------------------------------------
39
40class WXDLLIMPEXP_CORE wxFileDirPickerWidgetBase
41{
42public:
43    wxFileDirPickerWidgetBase() {  }
44    virtual ~wxFileDirPickerWidgetBase() {  }
45
46    wxString GetPath() const { return m_path; }
47    virtual void SetPath(const wxString &str) { m_path=str; }
48
49    // returns the picker widget cast to wxControl
50    virtual wxControl *AsControl() = 0;
51
52protected:
53    virtual void UpdateDialogPath(wxDialog *) = 0;
54    virtual void UpdatePathFromDialog(wxDialog *) = 0;
55
56    wxString m_path;
57};
58
59// Styles which must be supported by all controls implementing wxFileDirPickerWidgetBase
60// NB: these styles must be defined to carefully-chosen values to
61//     avoid conflicts with wxButton's styles
62
63#define wxFLP_OPEN                    0x0400
64#define wxFLP_SAVE                    0x0800
65#define wxFLP_OVERWRITE_PROMPT        0x1000
66#define wxFLP_FILE_MUST_EXIST         0x2000
67#define wxFLP_CHANGE_DIR              0x4000
68
69// NOTE: wxMULTIPLE is not supported !
70
71
72#define wxDIRP_DIR_MUST_EXIST         0x0008
73#define wxDIRP_CHANGE_DIR             0x0010
74
75
76// map platform-dependent controls which implement the wxFileDirPickerWidgetBase
77// under the name "wxFilePickerWidget" and "wxDirPickerWidget".
78// NOTE: wxFileDirPickerCtrlBase will allocate a wx{File|Dir}PickerWidget and this
79//       requires that all classes being mapped as wx{File|Dir}PickerWidget have the
80//       same prototype for the contructor...
81// since GTK >= 2.6, there is GtkFileButton
82#if defined(__WXGTK26__) && !defined(__WXUNIVERSAL__)
83    #include "wx/gtk/filepicker.h"
84    #define wxFilePickerWidget      wxFileButton
85    #define wxDirPickerWidget       wxDirButton
86#else
87    #include "wx/generic/filepickerg.h"
88    #define wxFilePickerWidget      wxGenericFileButton
89    #define wxDirPickerWidget       wxGenericDirButton
90#endif
91
92
93
94// ----------------------------------------------------------------------------
95// wxFileDirPickerCtrlBase
96// ----------------------------------------------------------------------------
97
98class WXDLLIMPEXP_CORE wxFileDirPickerCtrlBase : public wxPickerBase
99{
100public:
101    wxFileDirPickerCtrlBase() : m_bIgnoreNextTextCtrlUpdate(false) {}
102
103protected:
104    // NB: no default values since this function will never be used
105    //     directly by the user and derived classes wouldn't use them
106    bool CreateBase(wxWindow *parent,
107                    wxWindowID id,
108                    const wxString& path,
109                    const wxString &message,
110                    const wxString &wildcard,
111                    const wxPoint& pos,
112                    const wxSize& size,
113                    long style,
114                    const wxValidator& validator,
115                    const wxString& name);
116
117public:         // public API
118
119    wxString GetPath() const;
120    void SetPath(const wxString &str);
121
122public:        // internal functions
123
124    void UpdatePickerFromTextCtrl();
125    void UpdateTextCtrlFromPicker();
126
127    // event handler for our picker
128    void OnFileDirChange(wxFileDirPickerEvent &);
129
130    // Returns TRUE if the current path is a valid one
131    // (i.e. a valid file for a wxFilePickerWidget or a valid
132    //  folder for a wxDirPickerWidget).
133    virtual bool CheckPath(const wxString &str) const = 0;
134
135    // TRUE if any textctrl change should update the current working directory
136    virtual bool IsCwdToUpdate() const = 0;
137
138    // Returns the event type sent by this picker
139    virtual wxEventType GetEventType() const = 0;
140
141    // Returns the filtered value currently placed in the text control (if present).
142    virtual wxString GetTextCtrlValue() const = 0;
143
144protected:
145    // creates the picker control
146    virtual
147    wxFileDirPickerWidgetBase *CreatePicker(wxWindow *parent,
148                                            const wxString& path,
149                                            const wxString& message,
150                                            const wxString& wildcard) = 0;
151
152protected:
153
154    // true if the next UpdateTextCtrl() call is to ignore
155    bool m_bIgnoreNextTextCtrlUpdate;
156
157    // m_picker object as wxFileDirPickerWidgetBase interface
158    wxFileDirPickerWidgetBase *m_pickerIface;
159};
160
161#endif  // wxUSE_FILEPICKERCTRL || wxUSE_DIRPICKERCTRL
162
163
164#if wxUSE_FILEPICKERCTRL
165
166// ----------------------------------------------------------------------------
167// wxFilePickerCtrl: platform-independent class which embeds the
168// platform-dependent wxFilePickerWidget and, if wxFLP_USE_TEXTCTRL style is
169// used, a textctrl next to it.
170// ----------------------------------------------------------------------------
171
172#define wxFLP_USE_TEXTCTRL            (wxPB_USE_TEXTCTRL)
173
174#ifdef __WXGTK__
175    // GTK apps usually don't have a textctrl next to the picker
176    #define wxFLP_DEFAULT_STYLE       (wxFLP_OPEN|wxFLP_FILE_MUST_EXIST)
177#else
178    #define wxFLP_DEFAULT_STYLE       (wxFLP_USE_TEXTCTRL|wxFLP_OPEN|wxFLP_FILE_MUST_EXIST)
179#endif
180
181class WXDLLIMPEXP_CORE wxFilePickerCtrl : public wxFileDirPickerCtrlBase
182{
183public:
184    wxFilePickerCtrl() {}
185
186    wxFilePickerCtrl(wxWindow *parent,
187                     wxWindowID id,
188                     const wxString& path = wxEmptyString,
189                     const wxString& message = wxFileSelectorPromptStr,
190                     const wxString& wildcard = wxFileSelectorDefaultWildcardStr,
191                     const wxPoint& pos = wxDefaultPosition,
192                     const wxSize& size = wxDefaultSize,
193                     long style = wxFLP_DEFAULT_STYLE,
194                     const wxValidator& validator = wxDefaultValidator,
195                     const wxString& name = wxFilePickerCtrlNameStr)
196    {
197        Create(parent, id, path, message, wildcard, pos, size, style,
198               validator, name);
199    }
200
201    bool Create(wxWindow *parent,
202                wxWindowID id,
203                const wxString& path = wxEmptyString,
204                const wxString& message = wxFileSelectorPromptStr,
205                const wxString& wildcard = wxFileSelectorDefaultWildcardStr,
206                const wxPoint& pos = wxDefaultPosition,
207                const wxSize& size = wxDefaultSize,
208                long style = wxFLP_DEFAULT_STYLE,
209                const wxValidator& validator = wxDefaultValidator,
210                const wxString& name = wxFilePickerCtrlNameStr)
211    {
212        return wxFileDirPickerCtrlBase::CreateBase(parent, id, path,
213                                                   message, wildcard,
214                                                   pos, size, style,
215                                                   validator, name);
216    }
217
218
219public:     // overrides
220
221    // return true if the given path is valid for this control
222    bool CheckPath(const wxString& path) const;
223
224    // return the text control value in canonical form
225    wxString GetTextCtrlValue() const;
226
227    bool IsCwdToUpdate() const
228        { return HasFlag(wxFLP_CHANGE_DIR); }
229
230    wxEventType GetEventType() const
231        { return wxEVT_COMMAND_FILEPICKER_CHANGED; }
232
233protected:
234    wxFileDirPickerWidgetBase *CreatePicker(wxWindow *parent,
235                                            const wxString& path,
236                                            const wxString& message,
237                                            const wxString& wildcard)
238    {
239        return new wxFilePickerWidget(parent, wxID_ANY,
240                                      wxFilePickerWidgetLabel,
241                                      path, message, wildcard,
242                                      wxDefaultPosition, wxDefaultSize,
243                                      GetPickerStyle(GetWindowStyle()));
244    }
245
246    // extracts the style for our picker from wxFileDirPickerCtrlBase's style
247    long GetPickerStyle(long style) const
248    {
249        return (style & (wxFLP_OPEN|wxFLP_SAVE|wxFLP_OVERWRITE_PROMPT|
250                            wxFLP_FILE_MUST_EXIST|wxFLP_CHANGE_DIR));
251    }
252
253private:
254    DECLARE_DYNAMIC_CLASS(wxFilePickerCtrl)
255};
256
257#endif      // wxUSE_FILEPICKERCTRL
258
259
260#if wxUSE_DIRPICKERCTRL
261
262// ----------------------------------------------------------------------------
263// wxDirPickerCtrl: platform-independent class which embeds the
264// platform-dependent wxDirPickerWidget and eventually a textctrl
265// (see wxDIRP_USE_TEXTCTRL) next to it.
266// ----------------------------------------------------------------------------
267
268#define wxDIRP_USE_TEXTCTRL            (wxPB_USE_TEXTCTRL)
269
270#ifdef __WXGTK__
271    // GTK apps usually don't have a textctrl next to the picker
272    #define wxDIRP_DEFAULT_STYLE       (wxDIRP_DIR_MUST_EXIST)
273#else
274    #define wxDIRP_DEFAULT_STYLE       (wxDIRP_USE_TEXTCTRL|wxDIRP_DIR_MUST_EXIST)
275#endif
276
277class WXDLLIMPEXP_CORE wxDirPickerCtrl : public wxFileDirPickerCtrlBase
278{
279public:
280    wxDirPickerCtrl() {}
281
282    wxDirPickerCtrl(wxWindow *parent, wxWindowID id,
283                    const wxString& path = wxEmptyString,
284                    const wxString& message = wxDirSelectorPromptStr,
285                    const wxPoint& pos = wxDefaultPosition,
286                    const wxSize& size = wxDefaultSize,
287                    long style = wxDIRP_DEFAULT_STYLE,
288                    const wxValidator& validator = wxDefaultValidator,
289                    const wxString& name = wxDirPickerCtrlNameStr)
290    {
291        Create(parent, id, path, message, pos, size, style, validator, name);
292    }
293
294    bool Create(wxWindow *parent, wxWindowID id,
295                const wxString& path = wxEmptyString,
296                const wxString& message = wxDirSelectorPromptStr,
297                const wxPoint& pos = wxDefaultPosition,
298                const wxSize& size = wxDefaultSize,
299                long style = wxDIRP_DEFAULT_STYLE,
300                const wxValidator& validator = wxDefaultValidator,
301                const wxString& name = wxDirPickerCtrlNameStr)
302    {
303        return wxFileDirPickerCtrlBase::CreateBase
304               (
305                    parent, id, path, message, wxEmptyString,
306                    pos, size, style, validator, name
307               );
308    }
309
310
311public:     // overrides
312
313    bool CheckPath(const wxString &path) const;
314
315    wxString GetTextCtrlValue() const;
316
317    bool IsCwdToUpdate() const
318        { return HasFlag(wxDIRP_CHANGE_DIR); }
319
320    wxEventType GetEventType() const
321        { return wxEVT_COMMAND_DIRPICKER_CHANGED; }
322
323protected:
324    wxFileDirPickerWidgetBase *CreatePicker(wxWindow *parent,
325                                            const wxString& path,
326                                            const wxString& message,
327                                            const wxString& WXUNUSED(wildcard))
328    {
329        return new wxDirPickerWidget(parent, wxID_ANY, wxDirPickerWidgetLabel,
330                                     path, message,
331                                     wxDefaultPosition, wxDefaultSize,
332                                     GetPickerStyle(GetWindowStyle()));
333    }
334
335    // extracts the style for our picker from wxFileDirPickerCtrlBase's style
336    long GetPickerStyle(long style) const
337        { return (style & (wxDIRP_DIR_MUST_EXIST|wxDIRP_CHANGE_DIR)); }
338
339private:
340    DECLARE_DYNAMIC_CLASS(wxDirPickerCtrl)
341};
342
343#endif      // wxUSE_DIRPICKERCTRL
344
345
346#if wxUSE_FILEPICKERCTRL || wxUSE_DIRPICKERCTRL
347
348// ----------------------------------------------------------------------------
349// wxFileDirPickerEvent: used by wxFilePickerCtrl and wxDirPickerCtrl only
350// ----------------------------------------------------------------------------
351
352BEGIN_DECLARE_EVENT_TYPES()
353    DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_CORE, wxEVT_COMMAND_FILEPICKER_CHANGED, 1102)
354    DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_CORE, wxEVT_COMMAND_DIRPICKER_CHANGED, 1103)
355END_DECLARE_EVENT_TYPES()
356
357class WXDLLIMPEXP_CORE wxFileDirPickerEvent : public wxCommandEvent
358{
359public:
360    wxFileDirPickerEvent() {}
361    wxFileDirPickerEvent(wxEventType type, wxObject *generator, int id, const wxString &path)
362        : wxCommandEvent(type, id),
363          m_path(path)
364    {
365        SetEventObject(generator);
366    }
367
368    wxString GetPath() const { return m_path; }
369    void SetPath(const wxString &p) { m_path = p; }
370
371    // default copy ctor, assignment operator and dtor are ok
372    virtual wxEvent *Clone() const { return new wxFileDirPickerEvent(*this); }
373
374private:
375    wxString m_path;
376
377    DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxFileDirPickerEvent)
378};
379
380// ----------------------------------------------------------------------------
381// event types and macros
382// ----------------------------------------------------------------------------
383
384typedef void (wxEvtHandler::*wxFileDirPickerEventFunction)(wxFileDirPickerEvent&);
385
386#define wxFileDirPickerEventHandler(func) \
387    (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxFileDirPickerEventFunction, &func)
388
389#define EVT_FILEPICKER_CHANGED(id, fn) \
390    wx__DECLARE_EVT1(wxEVT_COMMAND_FILEPICKER_CHANGED, id, wxFileDirPickerEventHandler(fn))
391#define EVT_DIRPICKER_CHANGED(id, fn) \
392    wx__DECLARE_EVT1(wxEVT_COMMAND_DIRPICKER_CHANGED, id, wxFileDirPickerEventHandler(fn))
393
394
395#endif // wxUSE_FILEPICKERCTRL || wxUSE_DIRPICKERCTRL
396
397#endif // _WX_FILEDIRPICKER_H_BASE_
398
399