Did somework on the generic dialogs,
[wxWidgets.git] / include / wx / proplist.h
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: proplist.h
3 // Purpose: Property list classes
4 // Author: Julian Smart
5 // Modified by:
6 // Created: 04/01/98
7 // RCS-ID: $Id$
8 // Copyright: (c) Julian Smart
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
11
12 /*
13
14 TO DO:
15
16 (1) Optional popup-help for each item, and an optional Help button
17 for dialog.
18
19 (2) Align Ok, Cancel, Help buttons properly.
20
21 (3) Consider retrieving the rectangle on the panel that can be
22 drawn into (where the value listbox is) and giving an example
23 of editing graphically. May be too fancy.
24
25 (4) Deriveable types for wxPropertyValue => may need to reorganise
26 wxPropertyValue to use inheritance rather than present all-types-in-one
27 scheme.
28
29 (5) Optional popup panel for value list, perhaps.
30
31 (6) Floating point checking routine still crashes with Floating
32 point error for zany input.
33
34 (7) Property sheet with choice (or listbox) to select alternative
35 sheets... multiple views per panel, only one active. For this
36 we really need a wxChoice that can be dynamically set: XView
37 may be a problem; Motif?
38
39 (8) More example validators, e.g. colour selector.
40 */
41
42 #ifndef _WX_PROPLIST_H_
43 #define _WX_PROPLIST_H_
44
45 #ifdef __GNUG__
46 #pragma interface "proplist.h"
47 #endif
48
49 #include "wx/prop.h"
50
51 #define wxPROP_BUTTON_CLOSE 1
52 #define wxPROP_BUTTON_OK 2
53 #define wxPROP_BUTTON_CANCEL 4
54 #define wxPROP_BUTTON_CHECK_CROSS 8
55 #define wxPROP_BUTTON_HELP 16
56 #define wxPROP_DYNAMIC_VALUE_FIELD 32
57 #define wxPROP_PULLDOWN 64
58 #define wxPROP_SHOWVALUES 128
59
60 // Show OK/Cancel buttons on X-based systems where window management is
61 // more awkward
62 #if defined(__WXMOTIF__) || defined(__WXGTK__)
63 #define wxPROP_BUTTON_DEFAULT wxPROP_BUTTON_OK | wxPROP_BUTTON_CANCEL | wxPROP_BUTTON_CHECK_CROSS | wxPROP_PULLDOWN
64 #else
65 #define wxPROP_BUTTON_DEFAULT wxPROP_BUTTON_CHECK_CROSS | wxPROP_PULLDOWN | wxPROP_SHOWVALUES
66 #endif
67
68 #define wxID_PROP_CROSS 3000
69 #define wxID_PROP_CHECK 3001
70 #define wxID_PROP_EDIT 3002
71 #define wxID_PROP_TEXT 3003
72 #define wxID_PROP_SELECT 3004
73 #define wxID_PROP_VALUE_SELECT 3005
74
75 // Mediates between a physical panel and the property sheet
76 class WXDLLEXPORT wxPropertyListView: public wxPropertyView
77 {
78 DECLARE_DYNAMIC_CLASS(wxPropertyListView)
79 public:
80 wxPropertyListView(wxPanel *propPanel = NULL, long flags = wxPROP_BUTTON_DEFAULT);
81 ~wxPropertyListView(void);
82
83 // Associates and shows the view
84 virtual void ShowView(wxPropertySheet *propertySheet, wxPanel *panel);
85
86 // Update this view of the viewed object, called e.g. by
87 // the object itself.
88 virtual bool OnUpdateView(void);
89
90 wxString MakeNameValueString(wxString name, wxString value);
91
92 // Update a single line in the list of properties
93 virtual bool UpdatePropertyDisplayInList(wxProperty *property);
94
95 // Update the whole list
96 virtual bool UpdatePropertyList(bool clearEditArea = TRUE);
97
98 // Find the wxListBox index corresponding to this property
99 virtual int FindListIndexForProperty(wxProperty *property);
100
101 // Select and show string representation in editor the given
102 // property. NULL resets to show no property.
103 virtual bool ShowProperty(wxProperty *property, bool select = TRUE);
104 virtual bool EditProperty(wxProperty *property);
105
106 // Update the display from the property
107 virtual bool DisplayProperty(wxProperty *property);
108 // Update the property from the display
109 virtual bool RetrieveProperty(wxProperty *property);
110
111 // Find appropriate validator and load property into value controls
112 virtual bool BeginShowingProperty(wxProperty *property);
113 // Find appropriate validator and unload property from value controls
114 virtual bool EndShowingProperty(wxProperty *property);
115
116 // Begin detailed editing (e.g. using value listbox)
117 virtual void BeginDetailedEditing(void);
118
119 // End detailed editing (e.g. using value listbox)
120 virtual void EndDetailedEditing(void);
121
122 // Called by the property listbox
123 void OnPropertySelect(wxCommandEvent& event);
124
125 // Called by the value listbox
126 void OnValueListSelect(wxCommandEvent& event);
127
128 virtual bool CreateControls(void);
129 virtual void ShowTextControl(bool show);
130 virtual void ShowListBoxControl(bool show);
131 virtual void EnableCheck(bool show);
132 virtual void EnableCross(bool show);
133
134 void OnOk(wxCommandEvent& event);
135 void OnCancel(wxCommandEvent& event);
136 void OnHelp(wxCommandEvent& event);
137 void OnPropertyDoubleClick(wxCommandEvent& event);
138 // virtual void OnDoubleClick(void);
139
140 void OnCheck(wxCommandEvent& event);
141 void OnCross(wxCommandEvent& event);
142 void OnEdit(wxCommandEvent& event);
143 void OnText(wxCommandEvent& event);
144
145 inline virtual wxListBox *GetPropertyScrollingList() const { return m_propertyScrollingList; }
146 inline virtual wxListBox *GetValueList() const { return m_valueList; }
147 inline virtual wxTextCtrl *GetValueText() const { return m_valueText; }
148 inline virtual wxButton *GetConfirmButton() const { return m_confirmButton; }
149 inline virtual wxButton *GetCancelButton() const { return m_cancelButton; }
150 inline virtual wxButton *GetEditButton() const { return m_editButton; }
151 inline virtual bool GetDetailedEditing(void) const { return m_detailedEditing; }
152
153 inline virtual void AssociatePanel(wxPanel *win) { m_propertyWindow = win; }
154 inline virtual wxPanel *GetPanel(void) const { return m_propertyWindow; }
155
156 inline virtual void SetManagedWindow(wxWindow *win) { m_managedWindow = win; }
157 inline virtual wxWindow *GetManagedWindow(void) const { return m_managedWindow; }
158
159 inline virtual wxButton *GetWindowCloseButton() const { return m_windowCloseButton; }
160 inline virtual wxButton *GetWindowCancelButton() const { return m_windowCancelButton; }
161 inline virtual wxButton *GetHelpButton() const { return m_windowHelpButton; }
162
163 bool OnClose(void);
164
165 public:
166 static bool sm_dialogCancelled;
167
168 protected:
169 wxListBox* m_propertyScrollingList;
170 wxListBox* m_valueList; // Should really be a combobox, but we don't have one.
171 wxTextCtrl* m_valueText;
172 wxButton* m_confirmButton; // A tick, as in VB
173 wxButton* m_cancelButton; // A cross, as in VB
174 wxButton* m_editButton; // Invokes the custom validator, if any
175
176 bool m_detailedEditing; // E.g. using listbox for choices
177
178 static wxBitmap* sm_tickBitmap;
179 static wxBitmap* sm_crossBitmap;
180
181 wxPanel* m_propertyWindow; // Panel that the controls will appear on
182 wxWindow* m_managedWindow; // Frame or dialog
183
184 wxButton* m_windowCloseButton; // Or OK
185 wxButton* m_windowCancelButton;
186 wxButton* m_windowHelpButton;
187
188 DECLARE_EVENT_TABLE()
189 private:
190 virtual void ShowView(wxPropertySheet *propertySheet, wxWindow *window)
191 { wxPropertyView::ShowView(propertySheet, window); };
192 };
193
194 class WXDLLEXPORT wxPropertyTextEdit: public wxTextCtrl
195 {
196 DECLARE_CLASS(wxPropertyTextEdit)
197 public:
198 wxPropertyTextEdit(wxPropertyListView *v, wxWindow *parent, const wxWindowID id,
199 const wxString& value, const wxPoint& pos = wxDefaultPosition,
200 const wxSize& size = wxDefaultSize, long style = 0, const wxString& name = "text");
201 void OnSetFocus(void);
202 void OnKillFocus(void);
203
204 wxPropertyListView* m_view;
205 };
206
207 #define wxPROP_ALLOW_TEXT_EDITING 1
208
209 /*
210 * The type of validator used for property lists (Visual Basic style)
211 */
212
213 class WXDLLEXPORT wxPropertyListValidator: public wxPropertyValidator
214 {
215 DECLARE_DYNAMIC_CLASS(wxPropertyListValidator)
216 protected:
217 public:
218 wxPropertyListValidator(long flags = wxPROP_ALLOW_TEXT_EDITING): wxPropertyValidator(flags) { }
219 ~wxPropertyListValidator(void) {}
220
221 // Called when the property is selected or deselected: typically displays the value
222 // in the edit control (having chosen a suitable control to display: (non)editable text or listbox)
223 virtual bool OnSelect(bool select, wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
224
225 // Called when the property is double clicked. Extra functionality can be provided, such as
226 // cycling through possible values.
227 inline virtual bool OnDoubleClick(
228 wxProperty *WXUNUSED(property), wxPropertyListView *WXUNUSED(view), wxWindow *WXUNUSED(parentWindow) )
229 { return TRUE; }
230
231 // Called when the value listbox is selected. Default behaviour is to copy
232 // string to text control, and retrieve the value into the property.
233 virtual bool OnValueListSelect(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
234
235 // Called when the property value is edited using standard text control
236 inline virtual bool OnPrepareControls(
237 wxProperty *WXUNUSED(property), wxPropertyListView *WXUNUSED(view), wxWindow *WXUNUSED(parentWindow) )
238 { return TRUE; }
239
240 virtual bool OnClearControls(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
241
242 // Called when the property is edited in detail
243 inline virtual bool OnPrepareDetailControls(
244 wxProperty *WXUNUSED(property), wxPropertyListView *WXUNUSED(view), wxWindow *WXUNUSED(parentWindow) )
245 { return TRUE; }
246
247 // Called if focus lost, IF we're in a modeless property editing situation.
248 inline virtual bool OnClearDetailControls(
249 wxProperty *WXUNUSED(property), wxPropertyListView *WXUNUSED(view), wxWindow *WXUNUSED(parentWindow) )
250 { return TRUE; }
251
252 // Called when the edit (...) button is pressed. The default implementation
253 // calls view->BeginDetailedEditing; the filename validator (for example) overrides
254 // this function to show the file selector.
255 virtual void OnEdit(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
256
257 // Called when TICK is pressed or focus is lost.
258 // Return FALSE if value didn't check out; signal to restore old value.
259 inline virtual bool OnCheckValue(
260 wxProperty *WXUNUSED(property), wxPropertyListView *WXUNUSED(view), wxWindow *WXUNUSED(parentWindow) )
261 { return TRUE; }
262
263 // Called when TICK is pressed or focus is lost or view wants to update
264 // the property list.
265 // Does the transferance from the property editing area to the property itself
266 virtual bool OnRetrieveValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
267
268 virtual bool OnDisplayValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
269 };
270
271 /*
272 * A default dialog box class to use.
273 */
274
275 class WXDLLEXPORT wxPropertyListDialog: public wxDialog
276 {
277 DECLARE_CLASS(wxPropertyListDialog)
278 public:
279 wxPropertyListDialog(wxPropertyListView *v, wxWindow *parent, const wxString& title,
280 const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
281 long style = wxDEFAULT_DIALOG_STYLE, const wxString& name = "dialogBox");
282 void OnCloseWindow(wxCloseEvent& event);
283 void OnDefaultAction(wxControl *item);
284 void OnCancel(wxCommandEvent& event);
285
286 // Extend event processing to search the view's event table
287 virtual bool ProcessEvent(wxEvent& event);
288
289 private:
290 wxPropertyListView* m_view;
291
292 DECLARE_EVENT_TABLE()
293 };
294
295 /*
296 * A default panel class to use.
297 */
298
299 class WXDLLEXPORT wxPropertyListPanel: public wxPanel
300 {
301 DECLARE_CLASS(wxPropertyListPanel)
302 public:
303 wxPropertyListPanel(wxPropertyListView *v, wxWindow *parent, const wxPoint& pos = wxDefaultPosition,
304 const wxSize& size = wxDefaultSize,
305 long style = 0, const wxString& name = "panel"):
306 wxPanel(parent, -1, pos, size, style, name)
307 {
308 m_view = v;
309 }
310 ~wxPropertyListPanel();
311 void OnDefaultAction(wxControl *item);
312
313 inline void SetView(wxPropertyListView* v) { m_view = v; }
314 inline wxPropertyListView* GetView() const { return m_view; }
315
316 // Extend event processing to search the view's event table
317 virtual bool ProcessEvent(wxEvent& event);
318
319 // Call Layout()
320 void OnSize(wxSizeEvent& event);
321
322 private:
323 wxPropertyListView* m_view;
324
325 DECLARE_EVENT_TABLE()
326 };
327
328 /*
329 * A default frame class to use.
330 */
331
332 class WXDLLEXPORT wxPropertyListFrame: public wxFrame
333 {
334 DECLARE_CLASS(wxPropertyListFrame)
335 public:
336 wxPropertyListFrame(wxPropertyListView *v, wxFrame *parent, const wxString& title,
337 const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
338 long style = wxDEFAULT_FRAME_STYLE, const wxString& name = "frame"):
339 wxFrame(parent, -1, title, pos, size, style, name)
340 {
341 m_view = v;
342 m_propertyPanel = NULL;
343 }
344 void OnCloseWindow(wxCloseEvent& event);
345
346 // Must call this to create panel and associate view
347 virtual bool Initialize(void);
348 virtual wxPropertyListPanel *OnCreatePanel(wxFrame *parent, wxPropertyListView *v);
349 inline virtual wxPropertyListPanel *GetPropertyPanel(void) const { return m_propertyPanel; }
350
351 private:
352 wxPropertyListView* m_view;
353 wxPropertyListPanel* m_propertyPanel;
354
355 DECLARE_EVENT_TABLE()
356 };
357
358 /*
359 * Some default validators
360 */
361
362 class WXDLLEXPORT wxRealListValidator: public wxPropertyListValidator
363 {
364 DECLARE_DYNAMIC_CLASS(wxRealListValidator)
365 public:
366 // 0.0, 0.0 means no range
367 wxRealListValidator(float min = 0.0, float max = 0.0, long flags = wxPROP_ALLOW_TEXT_EDITING):wxPropertyListValidator(flags)
368 {
369 m_realMin = min; m_realMax = max;
370 }
371 ~wxRealListValidator(void) {}
372
373 bool OnPrepareControls(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
374
375 // Called when TICK is pressed or focus is lost.
376 // Return FALSE if value didn't check out; signal to restore old value.
377 bool OnCheckValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
378
379 // Called when TICK is pressed or focus is lost or view wants to update
380 // the property list.
381 // Does the transfer from the property editing area to the property itself
382 bool OnRetrieveValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
383
384 protected:
385 float m_realMin;
386 float m_realMax;
387 };
388
389 class WXDLLEXPORT wxIntegerListValidator: public wxPropertyListValidator
390 {
391 DECLARE_DYNAMIC_CLASS(wxIntegerListValidator)
392 public:
393 // 0, 0 means no range
394 wxIntegerListValidator(long min = 0, long max = 0, long flags = wxPROP_ALLOW_TEXT_EDITING):wxPropertyListValidator(flags)
395 {
396 m_integerMin = min; m_integerMax = max;
397 }
398 ~wxIntegerListValidator(void) {}
399
400 bool OnPrepareControls(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
401
402 // Called when TICK is pressed or focus is lost.
403 // Return FALSE if value didn't check out; signal to restore old value.
404 bool OnCheckValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
405
406 // Called when TICK is pressed or focus is lost or view wants to update
407 // the property list.
408 // Does the transfer from the property editing area to the property itself
409 bool OnRetrieveValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
410
411 protected:
412 long m_integerMin;
413 long m_integerMax;
414 };
415
416 class WXDLLEXPORT wxBoolListValidator: public wxPropertyListValidator
417 {
418 DECLARE_DYNAMIC_CLASS(wxBoolListValidator)
419 protected:
420 public:
421 wxBoolListValidator(long flags = 0):wxPropertyListValidator(flags)
422 {
423 }
424 ~wxBoolListValidator(void) {}
425
426 bool OnPrepareControls(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
427 bool OnPrepareDetailControls(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
428 bool OnClearDetailControls(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
429
430 // Called when TICK is pressed or focus is lost.
431 // Return FALSE if value didn't check out; signal to restore old value.
432 bool OnCheckValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
433
434 // Called when TICK is pressed or focus is lost or view wants to update
435 // the property list.
436 // Does the transfer from the property editing area to the property itself
437 bool OnRetrieveValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
438 bool OnDisplayValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
439
440 // Called when the property is double clicked. Extra functionality can be provided,
441 // cycling through possible values.
442 virtual bool OnDoubleClick(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
443 };
444
445 class WXDLLEXPORT wxStringListValidator: public wxPropertyListValidator
446 {
447 DECLARE_DYNAMIC_CLASS(wxStringListValidator)
448 public:
449 wxStringListValidator(wxStringList *list = NULL, long flags = 0);
450
451 ~wxStringListValidator(void)
452 {
453 if (m_strings)
454 delete m_strings;
455 }
456
457 bool OnPrepareControls(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
458 bool OnPrepareDetailControls(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
459 bool OnClearDetailControls(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
460
461 // Called when TICK is pressed or focus is lost.
462 // Return FALSE if value didn't check out; signal to restore old value.
463 bool OnCheckValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
464
465 // Called when TICK is pressed or focus is lost or view wants to update
466 // the property list.
467 // Does the transfer from the property editing area to the property itself
468 bool OnRetrieveValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
469 bool OnDisplayValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
470
471 // Called when the property is double clicked. Extra functionality can be provided,
472 // cycling through possible values.
473 bool OnDoubleClick(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
474
475 protected:
476 wxStringList* m_strings;
477 };
478
479 class WXDLLEXPORT wxFilenameListValidator: public wxPropertyListValidator
480 {
481 DECLARE_DYNAMIC_CLASS(wxFilenameListValidator)
482 public:
483 wxFilenameListValidator(wxString message = "Select a file", wxString wildcard = "*.*", long flags = 0);
484
485 ~wxFilenameListValidator(void);
486
487 // Called when TICK is pressed or focus is lost.
488 // Return FALSE if value didn't check out; signal to restore old value.
489 bool OnCheckValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
490
491 // Called when TICK is pressed or focus is lost or view wants to update
492 // the property list.
493 // Does the transferance from the property editing area to the property itself
494 bool OnRetrieveValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
495 bool OnDisplayValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
496
497 bool OnDoubleClick(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
498
499 bool OnPrepareControls(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
500
501 // Called when the edit (...) button is pressed.
502 void OnEdit(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
503
504 protected:
505 wxString m_filenameWildCard;
506 wxString m_filenameMessage;
507
508 };
509
510 class WXDLLEXPORT wxColourListValidator: public wxPropertyListValidator
511 {
512 DECLARE_DYNAMIC_CLASS(wxColourListValidator)
513 protected:
514 public:
515 wxColourListValidator(long flags = 0);
516
517 ~wxColourListValidator(void);
518
519 bool OnCheckValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
520 bool OnRetrieveValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
521 bool OnDisplayValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
522
523 bool OnDoubleClick(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
524
525 bool OnPrepareControls(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
526
527 // Called when the edit (...) button is pressed.
528 void OnEdit(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
529 };
530
531 class WXDLLEXPORT wxListOfStringsListValidator: public wxPropertyListValidator
532 {
533 DECLARE_DYNAMIC_CLASS(wxListOfStringsListValidator)
534 protected:
535 public:
536 wxListOfStringsListValidator(long flags = 0);
537
538 ~wxListOfStringsListValidator(void)
539 {
540 }
541
542 bool OnPrepareControls(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
543
544 // Called when TICK is pressed or focus is lost.
545 // Return FALSE if value didn't check out; signal to restore old value.
546 bool OnCheckValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
547
548 // Called when TICK is pressed or focus is lost or view wants to update
549 // the property list.
550 // Does the transfer from the property editing area to the property itself
551 bool OnRetrieveValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
552 bool OnDisplayValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
553
554 // Called when the property is double clicked.
555 bool OnDoubleClick(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
556
557 bool EditStringList(wxWindow *parent, wxStringList *stringList, const wxChar *title = _T("String List Editor"));
558
559 // Called when the edit (...) button is pressed.
560 void OnEdit(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
561 };
562
563 #endif
564 // _WX_PROPLIST_H_