]> git.saurik.com Git - wxWidgets.git/blob - utils/wxprop/src/proplist.h
Fixed various wxMSW compile problems that came down the telephone line...
[wxWidgets.git] / utils / wxprop / src / 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 license
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 _PROPLIST_H_
43 #define _PROPLIST_H_
44
45 #ifdef __GNUG__
46 #pragma interface "proplist.h"
47 #endif
48
49 #include "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 #ifdef __XVIEW__
61 #define wxPROP_BUTTON_DEFAULT wxPROP_BUTTON_OK | wxPROP_BUTTON_CANCEL | wxPROP_BUTTON_CHECK_CROSS | wxPROP_PULLDOWN
62 #else
63 #define wxPROP_BUTTON_DEFAULT wxPROP_BUTTON_CHECK_CROSS | wxPROP_PULLDOWN | wxPROP_SHOWVALUES
64 #endif
65
66 #define wxID_PROP_CROSS 3000
67 #define wxID_PROP_CHECK 3001
68 #define wxID_PROP_EDIT 3002
69 #define wxID_PROP_TEXT 3003
70 #define wxID_PROP_SELECT 3004
71 #define wxID_PROP_VALUE_SELECT 3005
72
73 // Mediates between a physical panel and the property sheet
74 class wxPropertyListView: public wxPropertyView
75 {
76 DECLARE_DYNAMIC_CLASS(wxPropertyListView)
77 protected:
78 wxListBox *propertyScrollingList;
79 wxListBox *valueList; // Should really be a combobox, but we don't have one.
80 wxTextCtrl *valueText;
81 wxButton *confirmButton; // A tick, as in VB
82 wxButton *cancelButton; // A cross, as in VB
83 wxButton *editButton; // Invokes the custom validator, if any
84
85 bool detailedEditing; // E.g. using listbox for choices
86
87 static wxBitmap *tickBitmap;
88 static wxBitmap *crossBitmap;
89
90 wxPanel *propertyWindow; // Panel that the controls will appear on
91 wxWindow *managedWindow; // Frame or dialog
92
93 wxButton *windowCloseButton; // Or OK
94 wxButton *windowCancelButton;
95 wxButton *windowHelpButton;
96 public:
97 static bool dialogCancelled;
98
99 wxPropertyListView(wxPanel *propPanel = NULL, long flags = wxPROP_BUTTON_DEFAULT);
100 ~wxPropertyListView(void);
101
102 // Associates and shows the view
103 virtual void ShowView(wxPropertySheet *propertySheet, wxPanel *panel);
104
105 // Update this view of the viewed object, called e.g. by
106 // the object itself.
107 virtual bool OnUpdateView(void);
108
109 wxString MakeNameValueString(wxString name, wxString value);
110
111 // Update a single line in the list of properties
112 virtual bool UpdatePropertyDisplayInList(wxProperty *property);
113
114 // Update the whole list
115 virtual bool UpdatePropertyList(bool clearEditArea = TRUE);
116
117 // Find the wxListBox index corresponding to this property
118 virtual int FindListIndexForProperty(wxProperty *property);
119
120 // Select and show string representation in editor the given
121 // property. NULL resets to show no property.
122 virtual bool ShowProperty(wxProperty *property, bool select = TRUE);
123 virtual bool EditProperty(wxProperty *property);
124
125 // Update the display from the property
126 virtual bool DisplayProperty(wxProperty *property);
127 // Update the property from the display
128 virtual bool RetrieveProperty(wxProperty *property);
129
130 // Find appropriate validator and load property into value controls
131 virtual bool BeginShowingProperty(wxProperty *property);
132 // Find appropriate validator and unload property from value controls
133 virtual bool EndShowingProperty(wxProperty *property);
134
135 // Begin detailed editing (e.g. using value listbox)
136 virtual void BeginDetailedEditing(void);
137
138 // End detailed editing (e.g. using value listbox)
139 virtual void EndDetailedEditing(void);
140
141 // Called by the property listbox
142 void OnPropertySelect(wxCommandEvent& event);
143
144 // Called by the value listbox
145 void OnValueListSelect(wxCommandEvent& event);
146
147 virtual bool CreateControls(void);
148 virtual void ShowTextControl(bool show);
149 virtual void ShowListBoxControl(bool show);
150 virtual void EnableCheck(bool show);
151 virtual void EnableCross(bool show);
152
153 void OnOk(wxCommandEvent& event);
154 void OnCancel(wxCommandEvent& event);
155 void OnHelp(wxCommandEvent& event);
156 void OnPropertyDoubleClick(wxCommandEvent& event);
157 // virtual void OnDoubleClick(void);
158
159 void OnCheck(wxCommandEvent& event);
160 void OnCross(wxCommandEvent& event);
161 void OnEdit(wxCommandEvent& event);
162 void OnText(wxCommandEvent& event);
163
164 inline virtual wxListBox *GetPropertyScrollingList() { return propertyScrollingList; }
165 inline virtual wxListBox *GetValueList() { return valueList; }
166 inline virtual wxTextCtrl *GetValueText() { return valueText; }
167 inline virtual wxButton *GetConfirmButton() { return confirmButton; }
168 inline virtual wxButton *GetCancelButton() { return cancelButton; }
169 inline virtual wxButton *GetEditButton() { return editButton; }
170 inline virtual bool GetDetailedEditing(void) { return detailedEditing; }
171
172 inline virtual void AssociatePanel(wxPanel *win) { propertyWindow = win; }
173 inline virtual wxPanel *GetPanel(void) { return propertyWindow; }
174
175 inline virtual void SetManagedWindow(wxWindow *win) { managedWindow = win; }
176 inline virtual wxWindow *GetManagedWindow(void) { return managedWindow; }
177
178 inline virtual wxButton *GetWindowCloseButton() { return windowCloseButton; }
179 inline virtual wxButton *GetWindowCancelButton() { return windowCancelButton; }
180 inline virtual wxButton *GetHelpButton() { return windowHelpButton; }
181
182 bool OnClose(void);
183
184 DECLARE_EVENT_TABLE()
185 };
186
187 class wxPropertyTextEdit: public wxTextCtrl
188 {
189 DECLARE_CLASS(wxPropertyTextEdit)
190 public:
191 wxPropertyListView *view;
192 wxPropertyTextEdit(wxPropertyListView *v, wxWindow *parent, const wxWindowID id,
193 const wxString& value, const wxPoint& pos = wxDefaultPosition,
194 const wxSize& size = wxDefaultSize, long style = 0, const wxString& name = "text");
195 void OnSetFocus(void);
196 void OnKillFocus(void);
197 };
198
199 #define wxPROP_ALLOW_TEXT_EDITING 1
200
201 /*
202 * The type of validator used for property lists (Visual Basic style)
203 */
204
205 class wxPropertyListValidator: public wxPropertyValidator
206 {
207 DECLARE_DYNAMIC_CLASS(wxPropertyListValidator)
208 protected:
209 public:
210 wxPropertyListValidator(long flags = wxPROP_ALLOW_TEXT_EDITING): wxPropertyValidator(flags) { }
211 ~wxPropertyListValidator(void) {}
212
213 // Called when the property is selected or deselected: typically displays the value
214 // in the edit control (having chosen a suitable control to display: (non)editable text or listbox)
215 virtual bool OnSelect(bool select, wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
216
217 // Called when the property is double clicked. Extra functionality can be provided, such as
218 // cycling through possible values.
219 inline virtual bool OnDoubleClick(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow)
220 { return TRUE; }
221
222 // Called when the value listbox is selected. Default behaviour is to copy
223 // string to text control, and retrieve the value into the property.
224 virtual bool OnValueListSelect(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
225
226 // Called when the property value is edited using standard text control
227 virtual bool OnPrepareControls(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow)
228 {
229 return TRUE;
230 }
231
232 virtual bool OnClearControls(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
233
234 // Called when the property is edited in detail
235 virtual bool OnPrepareDetailControls(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow)
236 {
237 return TRUE;
238 }
239
240 // Called if focus lost, IF we're in a modeless property editing situation.
241 virtual bool OnClearDetailControls(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow)
242 {
243 return TRUE;
244 }
245
246 // Called when the edit (...) button is pressed. The default implementation
247 // calls view->BeginDetailedEditing; the filename validator (for example) overrides
248 // this function to show the file selector.
249 virtual void OnEdit(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
250
251 // Called when TICK is pressed or focus is lost.
252 // Return FALSE if value didn't check out; signal to restore old value.
253 virtual bool OnCheckValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow)
254 { return TRUE; }
255
256 // Called when TICK is pressed or focus is lost or view wants to update
257 // the property list.
258 // Does the transferance from the property editing area to the property itself
259 virtual bool OnRetrieveValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
260
261 virtual bool OnDisplayValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
262 };
263
264 /*
265 * A default dialog box class to use.
266 */
267
268 class wxPropertyListDialog: public wxDialog
269 {
270 DECLARE_CLASS(wxPropertyListDialog)
271 private:
272 wxPropertyListView *view;
273 public:
274 wxPropertyListDialog(wxPropertyListView *v, wxWindow *parent, const wxString& title,
275 const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
276 long style = wxDEFAULT_DIALOG_STYLE, const wxString& name = "dialogBox");
277 bool OnClose(void);
278 void OnDefaultAction(wxControl *item);
279 void OnCancel(wxCommandEvent& event);
280
281 // Extend event processing to search the view's event table
282 virtual bool ProcessEvent(wxEvent& event);
283
284 DECLARE_EVENT_TABLE()
285 };
286
287 /*
288 * A default panel class to use.
289 */
290
291 class wxPropertyListPanel: public wxPanel
292 {
293 DECLARE_CLASS(wxPropertyListPanel)
294 private:
295 wxPropertyListView *view;
296 public:
297 wxPropertyListPanel(wxPropertyListView *v, wxWindow *parent, const wxPoint& pos = wxDefaultPosition,
298 const wxSize& size = wxDefaultSize,
299 long style = 0, const wxString& name = "panel"):
300 wxPanel(parent, -1, pos, size, style, name)
301 {
302 view = v;
303 }
304 void OnDefaultAction(wxControl *item);
305
306 inline void SetView(wxPropertyListView* v) { view = v; }
307 inline wxPropertyListView* GetView() const { return view; }
308
309 // Extend event processing to search the view's event table
310 virtual bool ProcessEvent(wxEvent& event);
311
312 // Call Layout()
313 void OnSize(wxSizeEvent& event);
314
315 DECLARE_EVENT_TABLE()
316 };
317
318 /*
319 * A default frame class to use.
320 */
321
322 class wxPropertyListFrame: public wxFrame
323 {
324 DECLARE_CLASS(wxPropertyListFrame)
325 private:
326 wxPropertyListView *view;
327 wxPropertyListPanel *propertyPanel;
328 public:
329 wxPropertyListFrame(wxPropertyListView *v, wxFrame *parent, const wxString& title,
330 const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
331 long style = wxDEFAULT_FRAME, const wxString& name = "frame"):
332 wxFrame(parent, -1, title, pos, size, style, name)
333 {
334 view = v;
335 propertyPanel = NULL;
336 }
337 bool OnClose(void);
338
339 // Must call this to create panel and associate view
340 virtual bool Initialize(void);
341 virtual wxPropertyListPanel *OnCreatePanel(wxFrame *parent, wxPropertyListView *v);
342 inline virtual wxPropertyListPanel *GetPropertyPanel(void) { return propertyPanel; }
343 };
344
345 /*
346 * Some default validators
347 */
348
349 class wxRealListValidator: public wxPropertyListValidator
350 {
351 DECLARE_DYNAMIC_CLASS(wxRealListValidator)
352 protected:
353 float realMin;
354 float realMax;
355 public:
356 // 0.0, 0.0 means no range
357 wxRealListValidator(float min = 0.0, float max = 0.0, long flags = wxPROP_ALLOW_TEXT_EDITING):wxPropertyListValidator(flags)
358 {
359 realMin = min; realMax = max;
360 }
361 ~wxRealListValidator(void) {}
362
363 bool OnPrepareControls(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
364
365 // Called when TICK is pressed or focus is lost.
366 // Return FALSE if value didn't check out; signal to restore old value.
367 bool OnCheckValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
368
369 // Called when TICK is pressed or focus is lost or view wants to update
370 // the property list.
371 // Does the transfer from the property editing area to the property itself
372 bool OnRetrieveValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
373 };
374
375 class wxIntegerListValidator: public wxPropertyListValidator
376 {
377 DECLARE_DYNAMIC_CLASS(wxIntegerListValidator)
378 protected:
379 long integerMin;
380 long integerMax;
381 public:
382 // 0, 0 means no range
383 wxIntegerListValidator(long min = 0, long max = 0, long flags = wxPROP_ALLOW_TEXT_EDITING):wxPropertyListValidator(flags)
384 {
385 integerMin = min; integerMax = max;
386 }
387 ~wxIntegerListValidator(void) {}
388
389 bool OnPrepareControls(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
390
391 // Called when TICK is pressed or focus is lost.
392 // Return FALSE if value didn't check out; signal to restore old value.
393 bool OnCheckValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
394
395 // Called when TICK is pressed or focus is lost or view wants to update
396 // the property list.
397 // Does the transfer from the property editing area to the property itself
398 bool OnRetrieveValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
399 };
400
401 class wxBoolListValidator: public wxPropertyListValidator
402 {
403 DECLARE_DYNAMIC_CLASS(wxBoolListValidator)
404 protected:
405 public:
406 wxBoolListValidator(long flags = 0):wxPropertyListValidator(flags)
407 {
408 }
409 ~wxBoolListValidator(void) {}
410
411 bool OnPrepareControls(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
412 bool OnPrepareDetailControls(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
413 bool OnClearDetailControls(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
414
415 // Called when TICK is pressed or focus is lost.
416 // Return FALSE if value didn't check out; signal to restore old value.
417 bool OnCheckValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
418
419 // Called when TICK is pressed or focus is lost or view wants to update
420 // the property list.
421 // Does the transfer from the property editing area to the property itself
422 bool OnRetrieveValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
423 bool OnDisplayValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
424
425 // Called when the property is double clicked. Extra functionality can be provided,
426 // cycling through possible values.
427 virtual bool OnDoubleClick(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
428 };
429
430 class wxStringListValidator: public wxPropertyListValidator
431 {
432 DECLARE_DYNAMIC_CLASS(wxStringListValidator)
433 protected:
434 wxStringList *strings;
435 public:
436 wxStringListValidator(wxStringList *list = NULL, long flags = 0);
437
438 ~wxStringListValidator(void)
439 {
440 if (strings)
441 delete strings;
442 }
443
444 bool OnPrepareControls(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
445 bool OnPrepareDetailControls(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
446 bool OnClearDetailControls(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
447
448 // Called when TICK is pressed or focus is lost.
449 // Return FALSE if value didn't check out; signal to restore old value.
450 bool OnCheckValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
451
452 // Called when TICK is pressed or focus is lost or view wants to update
453 // the property list.
454 // Does the transfer from the property editing area to the property itself
455 bool OnRetrieveValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
456 bool OnDisplayValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
457
458 // Called when the property is double clicked. Extra functionality can be provided,
459 // cycling through possible values.
460 bool OnDoubleClick(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
461 };
462
463 class wxFilenameListValidator: public wxPropertyListValidator
464 {
465 DECLARE_DYNAMIC_CLASS(wxFilenameListValidator)
466 protected:
467 wxString filenameWildCard;
468 wxString filenameMessage;
469
470 public:
471 wxFilenameListValidator(wxString message = "Select a file", wxString wildcard = "*.*", long flags = 0);
472
473 ~wxFilenameListValidator(void);
474
475 // Called when TICK is pressed or focus is lost.
476 // Return FALSE if value didn't check out; signal to restore old value.
477 bool OnCheckValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
478
479 // Called when TICK is pressed or focus is lost or view wants to update
480 // the property list.
481 // Does the transferance from the property editing area to the property itself
482 bool OnRetrieveValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
483 bool OnDisplayValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
484
485 bool OnDoubleClick(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
486
487 bool OnPrepareControls(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
488
489 // Called when the edit (...) button is pressed.
490 void OnEdit(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
491 };
492
493 class wxColourListValidator: public wxPropertyListValidator
494 {
495 DECLARE_DYNAMIC_CLASS(wxColourListValidator)
496 protected:
497 public:
498 wxColourListValidator(long flags = 0);
499
500 ~wxColourListValidator(void);
501
502 bool OnCheckValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
503 bool OnRetrieveValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
504 bool OnDisplayValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
505
506 bool OnDoubleClick(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
507
508 bool OnPrepareControls(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
509
510 // Called when the edit (...) button is pressed.
511 void OnEdit(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
512 };
513
514 class wxListOfStringsListValidator: public wxPropertyListValidator
515 {
516 DECLARE_DYNAMIC_CLASS(wxListOfStringsListValidator)
517 protected:
518 public:
519 wxListOfStringsListValidator(long flags = 0);
520
521 ~wxListOfStringsListValidator(void)
522 {
523 }
524
525 bool OnPrepareControls(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
526
527 // Called when TICK is pressed or focus is lost.
528 // Return FALSE if value didn't check out; signal to restore old value.
529 bool OnCheckValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
530
531 // Called when TICK is pressed or focus is lost or view wants to update
532 // the property list.
533 // Does the transfer from the property editing area to the property itself
534 bool OnRetrieveValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
535 bool OnDisplayValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
536
537 // Called when the property is double clicked.
538 bool OnDoubleClick(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
539
540 bool EditStringList(wxWindow *parent, wxStringList *stringList, const char *title = "String List Editor");
541
542 // Called when the edit (...) button is pressed.
543 void OnEdit(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
544 };
545
546 #endif
547