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