1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: Property list classes
4 // Author: Julian Smart
8 // Copyright: (c) Julian Smart
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
16 (1) Optional popup-help for each item, and an optional Help button
19 (2) Align Ok, Cancel, Help buttons properly.
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.
25 (4) Deriveable types for wxPropertyValue => may need to reorganise
26 wxPropertyValue to use inheritance rather than present all-types-in-one
29 (5) Optional popup panel for value list, perhaps.
31 (6) Floating point checking routine still crashes with Floating
32 point error for zany input.
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?
39 (8) More example validators, e.g. colour selector.
42 #ifndef _WX_PROPLIST_H_
43 #define _WX_PROPLIST_H_
45 #if defined(__GNUG__) && !defined(__APPLE__)
46 #pragma interface "proplist.h"
54 #define wxPROP_BUTTON_CLOSE 1
55 #define wxPROP_BUTTON_OK 2
56 #define wxPROP_BUTTON_CANCEL 4
57 #define wxPROP_BUTTON_CHECK_CROSS 8
58 #define wxPROP_BUTTON_HELP 16
59 #define wxPROP_DYNAMIC_VALUE_FIELD 32
60 #define wxPROP_PULLDOWN 64
61 #define wxPROP_SHOWVALUES 128
63 // Show OK/Cancel buttons on X-based systems where window management is
65 #if defined(__WXMOTIF__) || defined(__WXGTK__)
66 #define wxPROP_BUTTON_DEFAULT wxPROP_BUTTON_OK | wxPROP_BUTTON_CANCEL | wxPROP_BUTTON_CHECK_CROSS | wxPROP_PULLDOWN
68 #define wxPROP_BUTTON_DEFAULT wxPROP_BUTTON_CHECK_CROSS | wxPROP_PULLDOWN | wxPROP_SHOWVALUES
71 #define wxID_PROP_CROSS 3000
72 #define wxID_PROP_CHECK 3001
73 #define wxID_PROP_EDIT 3002
74 #define wxID_PROP_TEXT 3003
75 #define wxID_PROP_SELECT 3004
76 #define wxID_PROP_VALUE_SELECT 3005
78 // Mediates between a physical panel and the property sheet
79 class WXDLLEXPORT wxPropertyListView
: public wxPropertyView
81 DECLARE_DYNAMIC_CLASS(wxPropertyListView
)
83 wxPropertyListView(wxPanel
*propPanel
= NULL
, long flags
= wxPROP_BUTTON_DEFAULT
);
84 ~wxPropertyListView(void);
86 // Associates and shows the view
87 virtual void ShowView(wxPropertySheet
*propertySheet
, wxPanel
*panel
);
89 // Update this view of the viewed object, called e.g. by
91 virtual bool OnUpdateView(void);
93 wxString
MakeNameValueString(wxString name
, wxString value
);
95 // Update a single line in the list of properties
96 virtual bool UpdatePropertyDisplayInList(wxProperty
*property
);
98 // Update the whole list
99 virtual bool UpdatePropertyList(bool clearEditArea
= TRUE
);
101 // Find the wxListBox index corresponding to this property
102 virtual int FindListIndexForProperty(wxProperty
*property
);
104 // Select and show string representation in editor the given
105 // property. NULL resets to show no property.
106 virtual bool ShowProperty(wxProperty
*property
, bool select
= TRUE
);
107 virtual bool EditProperty(wxProperty
*property
);
109 // Update the display from the property
110 virtual bool DisplayProperty(wxProperty
*property
);
111 // Update the property from the display
112 virtual bool RetrieveProperty(wxProperty
*property
);
114 // Find appropriate validator and load property into value controls
115 virtual bool BeginShowingProperty(wxProperty
*property
);
116 // Find appropriate validator and unload property from value controls
117 virtual bool EndShowingProperty(wxProperty
*property
);
119 // Begin detailed editing (e.g. using value listbox)
120 virtual void BeginDetailedEditing(void);
122 // End detailed editing (e.g. using value listbox)
123 virtual void EndDetailedEditing(void);
125 // Called by the property listbox
126 void OnPropertySelect(wxCommandEvent
& event
);
128 // Called by the value listbox
129 void OnValueListSelect(wxCommandEvent
& event
);
131 virtual bool CreateControls(void);
132 virtual void ShowTextControl(bool show
);
133 virtual void ShowListBoxControl(bool show
);
134 virtual void EnableCheck(bool show
);
135 virtual void EnableCross(bool show
);
137 void OnOk(wxCommandEvent
& event
);
138 void OnCancel(wxCommandEvent
& event
);
139 void OnHelp(wxCommandEvent
& event
);
140 void OnPropertyDoubleClick(wxCommandEvent
& event
);
141 // virtual void OnDoubleClick(void);
143 void OnCheck(wxCommandEvent
& event
);
144 void OnCross(wxCommandEvent
& event
);
145 void OnEdit(wxCommandEvent
& event
);
146 void OnText(wxCommandEvent
& event
);
148 inline virtual wxListBox
*GetPropertyScrollingList() const { return m_propertyScrollingList
; }
149 inline virtual wxListBox
*GetValueList() const { return m_valueList
; }
150 inline virtual wxTextCtrl
*GetValueText() const { return m_valueText
; }
151 inline virtual wxButton
*GetConfirmButton() const { return m_confirmButton
; }
152 inline virtual wxButton
*GetCancelButton() const { return m_cancelButton
; }
153 inline virtual wxButton
*GetEditButton() const { return m_editButton
; }
154 inline virtual bool GetDetailedEditing(void) const { return m_detailedEditing
; }
156 inline virtual void AssociatePanel(wxPanel
*win
) { m_propertyWindow
= win
; }
157 inline virtual wxPanel
*GetPanel(void) const { return m_propertyWindow
; }
159 inline virtual void SetManagedWindow(wxWindow
*win
) { m_managedWindow
= win
; }
160 inline virtual wxWindow
*GetManagedWindow(void) const { return m_managedWindow
; }
162 inline virtual wxButton
*GetWindowCloseButton() const { return m_windowCloseButton
; }
163 inline virtual wxButton
*GetWindowCancelButton() const { return m_windowCancelButton
; }
164 inline virtual wxButton
*GetHelpButton() const { return m_windowHelpButton
; }
169 static bool sm_dialogCancelled
;
172 wxListBox
* m_propertyScrollingList
;
173 wxListBox
* m_valueList
; // Should really be a combobox, but we don't have one.
174 wxTextCtrl
* m_valueText
;
175 wxButton
* m_confirmButton
; // A tick, as in VB
176 wxButton
* m_cancelButton
; // A cross, as in VB
177 wxButton
* m_editButton
; // Invokes the custom validator, if any
178 wxSizer
* m_middleSizer
;
180 bool m_detailedEditing
; // E.g. using listbox for choices
182 wxPanel
* m_propertyWindow
; // Panel that the controls will appear on
183 wxWindow
* m_managedWindow
; // Frame or dialog
185 wxButton
* m_windowCloseButton
; // Or OK
186 wxButton
* m_windowCancelButton
;
187 wxButton
* m_windowHelpButton
;
189 DECLARE_EVENT_TABLE()
191 virtual void ShowView(wxPropertySheet
*propertySheet
, wxWindow
*window
)
192 { wxPropertyView::ShowView(propertySheet
, window
); };
195 class WXDLLEXPORT wxPropertyTextEdit
: public wxTextCtrl
198 wxPropertyTextEdit(wxPropertyListView
*v
= NULL
,
199 wxWindow
*parent
= NULL
,
200 const wxWindowID id
= -1,
201 const wxString
& value
= wxEmptyString
,
202 const wxPoint
& pos
= wxDefaultPosition
,
203 const wxSize
& size
= wxDefaultSize
,
205 const wxString
& name
= _T("text"));
210 wxPropertyListView
* m_view
;
212 DECLARE_CLASS(wxPropertyTextEdit
)
215 #define wxPROP_ALLOW_TEXT_EDITING 1
218 * The type of validator used for property lists (Visual Basic style)
221 class WXDLLEXPORT wxPropertyListValidator
: public wxPropertyValidator
223 DECLARE_DYNAMIC_CLASS(wxPropertyListValidator
)
226 wxPropertyListValidator(long flags
= wxPROP_ALLOW_TEXT_EDITING
): wxPropertyValidator(flags
) { }
227 ~wxPropertyListValidator(void) {}
229 // Called when the property is selected or deselected: typically displays the value
230 // in the edit control (having chosen a suitable control to display: (non)editable text or listbox)
231 virtual bool OnSelect(bool select
, wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
);
233 // Called when the property is double clicked. Extra functionality can be provided, such as
234 // cycling through possible values.
235 inline virtual bool OnDoubleClick(
236 wxProperty
*WXUNUSED(property
), wxPropertyListView
*WXUNUSED(view
), wxWindow
*WXUNUSED(parentWindow
) )
239 // Called when the value listbox is selected. Default behaviour is to copy
240 // string to text control, and retrieve the value into the property.
241 virtual bool OnValueListSelect(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
);
243 // Called when the property value is edited using standard text control
244 inline virtual bool OnPrepareControls(
245 wxProperty
*WXUNUSED(property
), wxPropertyListView
*WXUNUSED(view
), wxWindow
*WXUNUSED(parentWindow
) )
248 virtual bool OnClearControls(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
);
250 // Called when the property is edited in detail
251 inline virtual bool OnPrepareDetailControls(
252 wxProperty
*WXUNUSED(property
), wxPropertyListView
*WXUNUSED(view
), wxWindow
*WXUNUSED(parentWindow
) )
255 // Called if focus lost, IF we're in a modeless property editing situation.
256 inline virtual bool OnClearDetailControls(
257 wxProperty
*WXUNUSED(property
), wxPropertyListView
*WXUNUSED(view
), wxWindow
*WXUNUSED(parentWindow
) )
260 // Called when the edit (...) button is pressed. The default implementation
261 // calls view->BeginDetailedEditing; the filename validator (for example) overrides
262 // this function to show the file selector.
263 virtual void OnEdit(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
);
265 // Called when TICK is pressed or focus is lost.
266 // Return FALSE if value didn't check out; signal to restore old value.
267 inline virtual bool OnCheckValue(
268 wxProperty
*WXUNUSED(property
), wxPropertyListView
*WXUNUSED(view
), wxWindow
*WXUNUSED(parentWindow
) )
271 // Called when TICK is pressed or focus is lost or view wants to update
272 // the property list.
273 // Does the transferance from the property editing area to the property itself
274 virtual bool OnRetrieveValue(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
);
276 virtual bool OnDisplayValue(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
);
280 * A default dialog box class to use.
283 class WXDLLEXPORT wxPropertyListDialog
: public wxDialog
286 wxPropertyListDialog(wxPropertyListView
*v
= NULL
,
287 wxWindow
*parent
= NULL
,
288 const wxString
& title
= wxEmptyString
,
289 const wxPoint
& pos
= wxDefaultPosition
,
290 const wxSize
& size
= wxDefaultSize
,
291 long style
= wxDEFAULT_DIALOG_STYLE
,
292 const wxString
& name
= _T("dialogBox"));
294 void OnCloseWindow(wxCloseEvent
& event
);
295 void OnDefaultAction(wxControl
*item
);
296 void OnCancel(wxCommandEvent
& event
);
298 // Extend event processing to search the view's event table
299 virtual bool ProcessEvent(wxEvent
& event
);
302 wxPropertyListView
* m_view
;
304 DECLARE_CLASS(wxPropertyListDialog
)
305 DECLARE_EVENT_TABLE()
309 * A default panel class to use.
312 class WXDLLEXPORT wxPropertyListPanel
: public wxPanel
315 wxPropertyListPanel(wxPropertyListView
*v
= NULL
,
316 wxWindow
*parent
= NULL
,
317 const wxPoint
& pos
= wxDefaultPosition
,
318 const wxSize
& size
= wxDefaultSize
,
320 const wxString
& name
= _T("panel"))
321 : wxPanel(parent
, -1, pos
, size
, style
, name
)
325 ~wxPropertyListPanel();
326 void OnDefaultAction(wxControl
*item
);
328 inline void SetView(wxPropertyListView
* v
) { m_view
= v
; }
329 inline wxPropertyListView
* GetView() const { return m_view
; }
331 // Extend event processing to search the view's event table
332 virtual bool ProcessEvent(wxEvent
& event
);
335 void OnSize(wxSizeEvent
& event
);
338 wxPropertyListView
* m_view
;
340 DECLARE_EVENT_TABLE()
341 DECLARE_CLASS(wxPropertyListPanel
)
345 * A default frame class to use.
348 class WXDLLEXPORT wxPropertyListFrame
: public wxFrame
351 wxPropertyListFrame(wxPropertyListView
*v
= NULL
,
352 wxFrame
*parent
= NULL
,
353 const wxString
& title
= wxEmptyString
,
354 const wxPoint
& pos
= wxDefaultPosition
,
355 const wxSize
& size
= wxDefaultSize
,
356 long style
= wxDEFAULT_FRAME_STYLE
,
357 const wxString
& name
= _T("frame"))
358 : wxFrame(parent
, -1, title
, pos
, size
, style
, name
)
361 m_propertyPanel
= NULL
;
363 void OnCloseWindow(wxCloseEvent
& event
);
365 // Must call this to create panel and associate view
366 virtual bool Initialize(void);
367 virtual wxPropertyListPanel
*OnCreatePanel(wxFrame
*parent
, wxPropertyListView
*v
);
368 inline virtual wxPropertyListPanel
*GetPropertyPanel(void) const { return m_propertyPanel
; }
369 inline wxPropertyListView
* GetView() const { return m_view
; }
372 wxPropertyListView
* m_view
;
373 wxPropertyListPanel
* m_propertyPanel
;
375 DECLARE_EVENT_TABLE()
376 DECLARE_CLASS(wxPropertyListFrame
)
380 * Some default validators
383 class WXDLLEXPORT wxRealListValidator
: public wxPropertyListValidator
385 DECLARE_DYNAMIC_CLASS(wxRealListValidator
)
387 // 0.0, 0.0 means no range
388 wxRealListValidator(float min
= 0.0, float max
= 0.0, long flags
= wxPROP_ALLOW_TEXT_EDITING
):wxPropertyListValidator(flags
)
390 m_realMin
= min
; m_realMax
= max
;
392 ~wxRealListValidator(void) {}
394 bool OnPrepareControls(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
);
396 // Called when TICK is pressed or focus is lost.
397 // Return FALSE if value didn't check out; signal to restore old value.
398 bool OnCheckValue(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
);
400 // Called when TICK is pressed or focus is lost or view wants to update
401 // the property list.
402 // Does the transfer from the property editing area to the property itself
403 bool OnRetrieveValue(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
);
410 class WXDLLEXPORT wxIntegerListValidator
: public wxPropertyListValidator
412 DECLARE_DYNAMIC_CLASS(wxIntegerListValidator
)
414 // 0, 0 means no range
415 wxIntegerListValidator(long min
= 0, long max
= 0, long flags
= wxPROP_ALLOW_TEXT_EDITING
):wxPropertyListValidator(flags
)
417 m_integerMin
= min
; m_integerMax
= max
;
419 ~wxIntegerListValidator(void) {}
421 bool OnPrepareControls(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
);
423 // Called when TICK is pressed or focus is lost.
424 // Return FALSE if value didn't check out; signal to restore old value.
425 bool OnCheckValue(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
);
427 // Called when TICK is pressed or focus is lost or view wants to update
428 // the property list.
429 // Does the transfer from the property editing area to the property itself
430 bool OnRetrieveValue(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
);
437 class WXDLLEXPORT wxBoolListValidator
: public wxPropertyListValidator
439 DECLARE_DYNAMIC_CLASS(wxBoolListValidator
)
442 wxBoolListValidator(long flags
= 0):wxPropertyListValidator(flags
)
445 ~wxBoolListValidator(void) {}
447 bool OnPrepareControls(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
);
448 bool OnPrepareDetailControls(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
);
449 bool OnClearDetailControls(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
);
451 // Called when TICK is pressed or focus is lost.
452 // Return FALSE if value didn't check out; signal to restore old value.
453 bool OnCheckValue(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
);
455 // Called when TICK is pressed or focus is lost or view wants to update
456 // the property list.
457 // Does the transfer from the property editing area to the property itself
458 bool OnRetrieveValue(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
);
459 bool OnDisplayValue(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
);
461 // Called when the property is double clicked. Extra functionality can be provided,
462 // cycling through possible values.
463 virtual bool OnDoubleClick(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
);
466 class WXDLLEXPORT wxStringListValidator
: public wxPropertyListValidator
468 DECLARE_DYNAMIC_CLASS(wxStringListValidator
)
470 wxStringListValidator(wxStringList
*list
= NULL
, long flags
= 0);
472 ~wxStringListValidator(void)
478 bool OnPrepareControls(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
);
479 bool OnPrepareDetailControls(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
);
480 bool OnClearDetailControls(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
);
482 // Called when TICK is pressed or focus is lost.
483 // Return FALSE if value didn't check out; signal to restore old value.
484 bool OnCheckValue(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
);
486 // Called when TICK is pressed or focus is lost or view wants to update
487 // the property list.
488 // Does the transfer from the property editing area to the property itself
489 bool OnRetrieveValue(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
);
490 bool OnDisplayValue(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
);
492 // Called when the property is double clicked. Extra functionality can be provided,
493 // cycling through possible values.
494 bool OnDoubleClick(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
);
497 wxStringList
* m_strings
;
500 class WXDLLEXPORT wxFilenameListValidator
: public wxPropertyListValidator
502 DECLARE_DYNAMIC_CLASS(wxFilenameListValidator
)
504 wxFilenameListValidator(wxString message
= "Select a file", wxString wildcard
= wxALL_FILES_PATTERN
, long flags
= 0);
506 ~wxFilenameListValidator(void);
508 // Called when TICK is pressed or focus is lost.
509 // Return FALSE if value didn't check out; signal to restore old value.
510 bool OnCheckValue(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
);
512 // Called when TICK is pressed or focus is lost or view wants to update
513 // the property list.
514 // Does the transferance from the property editing area to the property itself
515 bool OnRetrieveValue(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
);
516 bool OnDisplayValue(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
);
518 bool OnDoubleClick(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
);
520 bool OnPrepareControls(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
);
522 // Called when the edit (...) button is pressed.
523 void OnEdit(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
);
526 wxString m_filenameWildCard
;
527 wxString m_filenameMessage
;
531 class WXDLLEXPORT wxColourListValidator
: public wxPropertyListValidator
533 DECLARE_DYNAMIC_CLASS(wxColourListValidator
)
536 wxColourListValidator(long flags
= 0);
538 ~wxColourListValidator(void);
540 bool OnCheckValue(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
);
541 bool OnRetrieveValue(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
);
542 bool OnDisplayValue(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
);
544 bool OnDoubleClick(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
);
546 bool OnPrepareControls(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
);
548 // Called when the edit (...) button is pressed.
549 void OnEdit(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
);
552 class WXDLLEXPORT wxListOfStringsListValidator
: public wxPropertyListValidator
554 DECLARE_DYNAMIC_CLASS(wxListOfStringsListValidator
)
557 wxListOfStringsListValidator(long flags
= 0);
559 ~wxListOfStringsListValidator(void)
563 bool OnPrepareControls(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
);
565 // Called when TICK is pressed or focus is lost.
566 // Return FALSE if value didn't check out; signal to restore old value.
567 bool OnCheckValue(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
);
569 // Called when TICK is pressed or focus is lost or view wants to update
570 // the property list.
571 // Does the transfer from the property editing area to the property itself
572 bool OnRetrieveValue(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
);
573 bool OnDisplayValue(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
);
575 // Called when the property is double clicked.
576 bool OnDoubleClick(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
);
578 bool EditStringList(wxWindow
*parent
, wxStringList
*stringList
, const wxChar
*title
= wxT("String List Editor"));
580 // Called when the edit (...) button is pressed.
581 void OnEdit(wxProperty
*property
, wxPropertyListView
*view
, wxWindow
*parentWindow
);