]> git.saurik.com Git - wxWidgets.git/blob - include/wx/propgrid/propgrid.h
Update from Brian.
[wxWidgets.git] / include / wx / propgrid / propgrid.h
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: wx/propgrid/propgrid.h
3 // Purpose: wxPropertyGrid
4 // Author: Jaakko Salli
5 // Modified by:
6 // Created: 2004-09-25
7 // RCS-ID: $Id:
8 // Copyright: (c) Jaakko Salli
9 // Licence: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
11
12 #ifndef _WX_PROPGRID_PROPGRID_H_
13 #define _WX_PROPGRID_PROPGRID_H_
14
15 #if wxUSE_PROPGRID
16
17 #include "wx/dcclient.h"
18 #include "wx/scrolwin.h"
19 #include "wx/tooltip.h"
20 #include "wx/datetime.h"
21
22 #include "wx/propgrid/property.h"
23 #include "wx/propgrid/propgridiface.h"
24
25
26 #ifndef SWIG
27 extern WXDLLIMPEXP_PROPGRID const wxChar *wxPropertyGridNameStr;
28 #endif
29
30
31 // -----------------------------------------------------------------------
32 // Global variables
33 // -----------------------------------------------------------------------
34
35 #ifndef SWIG
36
37 // This is required for sharing common global variables.
38 class WXDLLIMPEXP_PROPGRID wxPGGlobalVarsClass
39 {
40 public:
41
42 wxPGGlobalVarsClass();
43 ~wxPGGlobalVarsClass();
44
45 // Used by advprops, but here to make things easier.
46 wxString m_pDefaultImageWildcard;
47
48 // Map of editor class instances (keys are name string).
49 wxPGHashMapS2P m_mapEditorClasses;
50
51 #if wxUSE_VALIDATORS
52 wxArrayPtrVoid m_arrValidators; // These wxValidators need to be freed
53 #endif
54
55 wxPGHashMapS2P m_dictPropertyClassInfo; // PropertyName -> ClassInfo
56
57 wxPGChoices* m_fontFamilyChoices;
58
59 // Replace with your own to affect all properties using default renderer.
60 wxPGCellRenderer* m_defaultRenderer;
61
62 wxPGChoices m_boolChoices;
63
64 wxVariant m_vEmptyString;
65 wxVariant m_vZero;
66 wxVariant m_vMinusOne;
67 wxVariant m_vTrue;
68 wxVariant m_vFalse;
69
70 // Cached constant strings
71 wxPGCachedString m_strstring;
72 wxPGCachedString m_strlong;
73 wxPGCachedString m_strbool;
74 wxPGCachedString m_strlist;
75
76 wxPGCachedString m_strMin;
77 wxPGCachedString m_strMax;
78 wxPGCachedString m_strUnits;
79 wxPGCachedString m_strInlineHelp;
80
81 // If true then some things are automatically translated
82 bool m_autoGetTranslation;
83
84 // > 0 if errors cannot or should not be shown in statusbar etc.
85 int m_offline;
86
87 int m_extraStyle; // global extra style
88
89 #ifdef __WXDEBUG__
90 int m_warnings;
91 #endif
92
93 int HasExtraStyle( int style ) const { return (m_extraStyle & style); }
94 };
95
96 extern WXDLLIMPEXP_PROPGRID wxPGGlobalVarsClass* wxPGGlobalVars;
97
98 #define wxPGVariant_EmptyString (wxPGGlobalVars->m_vEmptyString)
99 #define wxPGVariant_Zero (wxPGGlobalVars->m_vZero)
100 #define wxPGVariant_MinusOne (wxPGGlobalVars->m_vMinusOne)
101 #define wxPGVariant_True (wxPGGlobalVars->m_vTrue)
102 #define wxPGVariant_False (wxPGGlobalVars->m_vFalse)
103
104 #define wxPGVariant_Bool(A) (A?wxPGVariant_True:wxPGVariant_False)
105
106 #endif // !SWIG
107
108 // -----------------------------------------------------------------------
109
110 /** @section propgrid_window_styles wxPropertyGrid Window Styles
111
112 SetWindowStyleFlag method can be used to modify some of these at run-time.
113 @{
114 */
115 enum wxPG_WINDOW_STYLES
116 {
117
118 /** This will cause Sort() automatically after an item is added.
119 When inserting a lot of items in this mode, it may make sense to
120 use Freeze() before operations and Thaw() afterwards to increase
121 performance.
122 */
123 wxPG_AUTO_SORT = 0x00000010,
124
125 /** Categories are not initially shown (even if added).
126 IMPORTANT NOTE: If you do not plan to use categories, then this
127 style will waste resources.
128 This flag can also be changed using wxPropertyGrid::EnableCategories method.
129 */
130 wxPG_HIDE_CATEGORIES = 0x00000020,
131
132 /* This style combines non-categoric mode and automatic sorting.
133 */
134 wxPG_ALPHABETIC_MODE = (wxPG_HIDE_CATEGORIES|wxPG_AUTO_SORT),
135
136 /** Modified values are shown in bold font. Changing this requires Refresh()
137 to show changes.
138 */
139 wxPG_BOLD_MODIFIED = 0x00000040,
140
141 /** When wxPropertyGrid is resized, splitter moves to the center. This
142 behavior stops once the user manually moves the splitter.
143 */
144 wxPG_SPLITTER_AUTO_CENTER = 0x00000080,
145
146 /** Display tooltips for cell text that cannot be shown completely. If
147 wxUSE_TOOLTIPS is 0, then this doesn't have any effect.
148 */
149 wxPG_TOOLTIPS = 0x00000100,
150
151 /** Disables margin and hides all expand/collapse buttons that would appear
152 outside the margin (for sub-properties). Toggling this style automatically
153 expands all collapsed items.
154 */
155 wxPG_HIDE_MARGIN = 0x00000200,
156
157 /** This style prevents user from moving the splitter.
158 */
159 wxPG_STATIC_SPLITTER = 0x00000400,
160
161 /** Combination of other styles that make it impossible for user to modify
162 the layout.
163 */
164 wxPG_STATIC_LAYOUT = (wxPG_HIDE_MARGIN|wxPG_STATIC_SPLITTER),
165
166 /** Disables wxTextCtrl based editors for properties which
167 can be edited in another way.
168
169 Equals calling wxPropertyGrid::LimitPropertyEditing for all added
170 properties.
171 */
172 wxPG_LIMITED_EDITING = 0x00000800,
173
174 /** wxPropertyGridManager only: Show toolbar for mode and page selection. */
175 wxPG_TOOLBAR = 0x00001000,
176
177 /** wxPropertyGridManager only: Show adjustable text box showing description
178 or help text, if available, for currently selected property.
179 */
180 wxPG_DESCRIPTION = 0x00002000
181
182 };
183
184 enum wxPG_EX_WINDOW_STYLES
185 {
186
187 /**
188 NOTE: wxPG_EX_xxx are extra window styles and must be set using
189 SetExtraStyle() member function.
190
191 Speeds up switching to wxPG_HIDE_CATEGORIES mode. Initially, if
192 wxPG_HIDE_CATEGORIES is not defined, the non-categorized data storage is
193 not activated, and switching the mode first time becomes somewhat slower.
194 wxPG_EX_INIT_NOCAT activates the non-categorized data storage right away.
195 IMPORTANT NOTE: If you do plan not switching to non-categoric mode, or if
196 you don't plan to use categories at all, then using this style will result
197 in waste of resources.
198
199 */
200 wxPG_EX_INIT_NOCAT = 0x00001000,
201
202 /** Extended window style that sets wxPropertyGridManager toolbar to not
203 use flat style.
204 */
205 wxPG_EX_NO_FLAT_TOOLBAR = 0x00002000,
206
207 /** Shows alphabetic/categoric mode buttons from toolbar.
208 */
209 wxPG_EX_MODE_BUTTONS = 0x00008000,
210
211 /** Show property help strings as tool tips instead as text on the status bar.
212 You can set the help strings using SetPropertyHelpString member function.
213 */
214 wxPG_EX_HELP_AS_TOOLTIPS = 0x00010000,
215
216 /** Prevent TAB from focusing to wxButtons. This behavior was default
217 in version 1.2.0 and earlier.
218 NOTE! Tabbing to button doesn't work yet. Problem seems to be that on wxMSW
219 atleast the button doesn't properly propagate key events (yes, I'm using
220 wxWANTS_CHARS).
221 */
222 //wxPG_EX_NO_TAB_TO_BUTTON = 0x00020000,
223
224 /** Allows relying on native double-buffering.
225 */
226 wxPG_EX_NATIVE_DOUBLE_BUFFERING = 0x00080000,
227
228 /** Set this style to let user have ability to set values of properties to
229 unspecified state. Same as setting wxPG_PROP_AUTO_UNSPECIFIED for
230 all properties.
231 */
232 wxPG_EX_AUTO_UNSPECIFIED_VALUES = 0x00200000,
233
234 /**
235 If this style is used, built-in attributes (such as wxPG_FLOAT_PRECISION
236 and wxPG_STRING_PASSWORD) are not stored into property's attribute storage
237 (thus they are not readable).
238
239 Note that this option is global, and applies to all wxPG property
240 containers.
241 */
242 wxPG_EX_WRITEONLY_BUILTIN_ATTRIBUTES = 0x00400000,
243
244 /** Hides page selection buttons from toolbar.
245 */
246 wxPG_EX_HIDE_PAGE_BUTTONS = 0x01000000
247
248 };
249
250 /** Combines various styles.
251 */
252 #define wxPG_DEFAULT_STYLE (0)
253
254 /** Combines various styles.
255 */
256 #define wxPGMAN_DEFAULT_STYLE (0)
257
258 /** @}
259 */
260
261 // -----------------------------------------------------------------------
262
263 //
264 // Ids for sub-controls
265 // NB: It should not matter what these are.
266 #define wxPG_SUBID1 2
267 #define wxPG_SUBID2 3
268 #define wxPG_SUBID_TEMP1 4
269
270 // -----------------------------------------------------------------------
271
272 /** @class wxPGCommonValue
273
274 wxPropertyGrid stores information about common values in these
275 records.
276
277 NB: Common value feature is not complete, and thus not mentioned in
278 documentation.
279 */
280 class WXDLLIMPEXP_PROPGRID wxPGCommonValue
281 {
282 public:
283
284 wxPGCommonValue( const wxString& label, wxPGCellRenderer* renderer )
285 {
286 m_label = label;
287 m_renderer = renderer;
288 renderer->IncRef();
289 }
290 virtual ~wxPGCommonValue()
291 {
292 m_renderer->DecRef();
293 }
294
295 virtual wxString GetEditableText() const { return m_label; }
296 const wxString& GetLabel() const { return m_label; }
297 wxPGCellRenderer* GetRenderer() const { return m_renderer; }
298
299 protected:
300 wxString m_label;
301 wxPGCellRenderer* m_renderer;
302 };
303
304 // -----------------------------------------------------------------------
305
306 /** @section propgrid_vfbflags wxPropertyGrid Validation Failure Behavior Flags
307 @{
308 */
309
310 enum wxPG_VALIDATION_FAILURE_BEHAVIOR_FLAGS
311 {
312
313 /** Prevents user from leaving property unless value is valid. If this
314 behavior flag is not used, then value change is instead cancelled.
315 */
316 wxPG_VFB_STAY_IN_PROPERTY = 0x01,
317
318 /** Calls wxBell() on validation failure.
319 */
320 wxPG_VFB_BEEP = 0x02,
321
322 /** Cell with invalid value will be marked (with red colour).
323 */
324 wxPG_VFB_MARK_CELL = 0x04,
325
326 /** Display customizable text message explaining the situation.
327 */
328 wxPG_VFB_SHOW_MESSAGE = 0x08,
329
330 /** Defaults. */
331 wxPG_VFB_DEFAULT = wxPG_VFB_STAY_IN_PROPERTY|wxPG_VFB_BEEP,
332
333 /** Only used internally. */
334 wxPG_VFB_UNDEFINED = 0x80
335
336 };
337
338 /** @}
339 */
340
341 typedef wxByte wxPGVFBFlags;
342
343 /**
344 wxPGValidationInfo
345
346 Used to convey validation information to and from functions that
347 actually perform validation. Mostly used in custom property
348 classes.
349 */
350 class WXDLLIMPEXP_PROPGRID wxPGValidationInfo
351 {
352 friend class wxPropertyGrid;
353 public:
354 /**
355 @return Returns failure behavior which is a combination of
356 @ref propgrid_vfbflags.
357 */
358 wxPGVFBFlags GetFailureBehavior() const
359 { return m_failureBehavior; }
360
361 /**
362 Returns current failure message.
363 */
364 const wxString& GetFailureMessage() const
365 { return m_failureMessage; }
366
367 /**
368 Returns reference to pending value.
369 */
370 const wxVariant& GetValue() const
371 {
372 wxASSERT(m_pValue);
373 return *m_pValue;
374 }
375
376 /** Set validation failure behavior
377
378 @param failureBehavior
379 Mixture of @ref propgrid_vfbflags.
380 */
381 void SetFailureBehavior(wxPGVFBFlags failureBehavior)
382 { m_failureBehavior = failureBehavior; }
383
384 /**
385 Set current failure message.
386 */
387 void SetFailureMessage(const wxString& message)
388 { m_failureMessage = message; }
389
390 private:
391 /** Value to be validated.
392 */
393 wxVariant* m_pValue;
394
395 /** Message displayed on validation failure.
396 */
397 wxString m_failureMessage;
398
399 /** Validation failure behavior. Use wxPG_VFB_XXX flags.
400 */
401 wxPGVFBFlags m_failureBehavior;
402 };
403
404 // -----------------------------------------------------------------------
405
406 /** @section propgrid_pgactions wxPropertyGrid Action Identifiers
407
408 These are used with wxPropertyGrid::AddActionTrigger() and
409 wxPropertyGrid::ClearActionTriggers().
410 @{
411 */
412
413 enum wxPG_KEYBOARD_ACTIONS
414 {
415 wxPG_ACTION_INVALID = 0,
416 wxPG_ACTION_NEXT_PROPERTY,
417 wxPG_ACTION_PREV_PROPERTY,
418 wxPG_ACTION_EXPAND_PROPERTY,
419 wxPG_ACTION_COLLAPSE_PROPERTY,
420 wxPG_ACTION_CANCEL_EDIT,
421 wxPG_ACTION_CUT,
422 wxPG_ACTION_COPY,
423 wxPG_ACTION_PASTE,
424 wxPG_ACTION_MAX
425 };
426
427 /** @}
428 */
429
430 // -----------------------------------------------------------------------
431
432
433 // wxPropertyGrid::DoSelectProperty flags (selFlags)
434
435 // Focuses to created editor
436 #define wxPG_SEL_FOCUS 0x01
437 // Forces deletion and recreation of editor
438 #define wxPG_SEL_FORCE 0x02
439 // For example, doesn't cause EnsureVisible
440 #define wxPG_SEL_NONVISIBLE 0x04
441 // Do not validate editor's value before selecting
442 #define wxPG_SEL_NOVALIDATE 0x08
443 // Property being deselected is about to be deleted
444 #define wxPG_SEL_DELETING 0x10
445 // Property's values was set to unspecified by the user
446 #define wxPG_SEL_SETUNSPEC 0x20
447 // Property's event handler changed the value
448 #define wxPG_SEL_DIALOGVAL 0x40
449
450
451 // -----------------------------------------------------------------------
452
453 #ifndef SWIG
454
455 // Internal flags
456 #define wxPG_FL_INITIALIZED 0x0001
457 // Set when creating editor controls if it was clicked on.
458 #define wxPG_FL_ACTIVATION_BY_CLICK 0x0002
459 #define wxPG_FL_DONT_CENTER_SPLITTER 0x0004
460 #define wxPG_FL_FOCUSED 0x0008
461 #define wxPG_FL_MOUSE_CAPTURED 0x0010
462 #define wxPG_FL_MOUSE_INSIDE 0x0020
463 #define wxPG_FL_VALUE_MODIFIED 0x0040
464 // don't clear background of m_wndEditor
465 #define wxPG_FL_PRIMARY_FILLS_ENTIRE 0x0080
466 // currently active editor uses custom image
467 #define wxPG_FL_CUR_USES_CUSTOM_IMAGE 0x0100
468 // cell colours override selection colours for selected cell
469 #define wxPG_FL_CELL_OVERRIDES_SEL 0x0200
470 #define wxPG_FL_SCROLLED 0x0400
471 // set when all added/inserted properties get hideable flag
472 #define wxPG_FL_ADDING_HIDEABLES 0x0800
473 // Disables showing help strings on statusbar.
474 #define wxPG_FL_NOSTATUSBARHELP 0x1000
475 // Marks that we created the state, so we have to destroy it too.
476 #define wxPG_FL_CREATEDSTATE 0x2000
477 // Set if scrollbar's existence was detected in last onresize.
478 #define wxPG_FL_SCROLLBAR_DETECTED 0x4000
479 // Set if wxPGMan requires redrawing of description text box.
480 #define wxPG_FL_DESC_REFRESH_REQUIRED 0x8000
481 // Set if contained in wxPropertyGridManager
482 #define wxPG_FL_IN_MANAGER 0x00020000
483 // Set after wxPropertyGrid is shown in its initial good size
484 #define wxPG_FL_GOOD_SIZE_SET 0x00040000
485 // Next navigation key event will get ignored
486 #define wxPG_FL_IGNORE_NEXT_NAVKEY 0x00080000
487 // Set when in SelectProperty.
488 #define wxPG_FL_IN_SELECT_PROPERTY 0x00100000
489 // Set when help string is shown in status bar
490 #define wxPG_FL_STRING_IN_STATUSBAR 0x00200000
491 // Splitter position has been custom-set by the user
492 #define wxPG_FL_SPLITTER_PRE_SET 0x00400000
493 // Validation failed. Clear on modify event.
494 #define wxPG_FL_VALIDATION_FAILED 0x00800000
495 // Set if selected is fully painted (ie. both image and text)
496 //#define wxPG_FL_SELECTED_IS_FULL_PAINT 0x01000000
497 // Set after page has been inserted to manager
498 #define wxPG_MAN_FL_PAGE_INSERTED 0x02000000
499 // Active editor control is abnormally large
500 #define wxPG_FL_ABNORMAL_EDITOR 0x04000000
501 // Recursion guard for OnCustomEditorEvent
502 #define wxPG_FL_IN_ONCUSTOMEDITOREVENT 0x08000000
503 #define wxPG_FL_VALUE_CHANGE_IN_EVENT 0x10000000
504 // Editor control width should not change on resize
505 #define wxPG_FL_FIXED_WIDTH_EDITOR 0x20000000
506 // Width of panel can be different than width of grid
507 #define wxPG_FL_HAS_VIRTUAL_WIDTH 0x40000000
508 // Prevents RecalculateVirtualSize re-entrancy
509 #define wxPG_FL_RECALCULATING_VIRTUAL_SIZE 0x80000000
510
511 #endif // #ifndef SWIG
512
513 #if !defined(__wxPG_SOURCE_FILE__) && !defined(SWIG)
514 // Reduce compile time, but still include in user app
515 #include "wx/propgrid/props.h"
516 #endif
517
518 // -----------------------------------------------------------------------
519
520 /** @class wxPropertyGrid
521
522 wxPropertyGrid is a specialized grid for editing properties
523 such as strings, numbers, flagsets, fonts, and colours. wxPropertySheet
524 used to do the very same thing, but it hasn't been updated for a while
525 and it is currently deprecated.
526
527 Please note that most member functions are inherited and as such not
528 documented on this page. This means you will probably also want to read
529 wxPropertyGridInterface class reference.
530
531 See also @ref overview_propgrid.
532
533 @section propgrid_window_styles_ Window Styles
534
535 See @ref propgrid_window_styles.
536
537 @section propgrid_event_handling Event Handling
538
539 To process input from a propertygrid control, use these event handler
540 macros to direct input to member functions that take a wxPropertyGridEvent
541 argument.
542
543 @beginEventTable{wxPropertyGridEvent}
544 @event{EVT_PG_SELECTED (id, func)}
545 Respond to wxEVT_PG_SELECTED event, generated when property value
546 has been changed by user.
547 @event{EVT_PG_CHANGING(id, func)}
548 Respond to wxEVT_PG_CHANGING event, generated when property value
549 is about to be changed by user. Use wxPropertyGridEvent::GetValue()
550 to take a peek at the pending value, and wxPropertyGridEvent::Veto()
551 to prevent change from taking place, if necessary.
552 @event{EVT_PG_HIGHLIGHTED(id, func)}
553 Respond to wxEVT_PG_HIGHLIGHTED event, which occurs when mouse
554 moves over a property. Event's property is NULL if hovered area does
555 not belong to any property.
556 @event{EVT_PG_RIGHT_CLICK(id, func)}
557 Respond to wxEVT_PG_RIGHT_CLICK event, which occurs when property is
558 clicked on with right mouse button.
559 @event{EVT_PG_DOUBLE_CLICK(id, func)}
560 Respond to wxEVT_PG_DOUBLE_CLICK event, which occurs when property is
561 double-clicked onwith left mouse button.
562 @event{EVT_PG_ITEM_COLLAPSED(id, func)}
563 Respond to wxEVT_PG_ITEM_COLLAPSED event, generated when user collapses
564 a property or category..
565 @event{EVT_PG_ITEM_EXPANDED(id, func)}
566 Respond to wxEVT_PG_ITEM_EXPANDED event, generated when user expands
567 a property or category..
568 @endEventTable
569
570 @remarks
571
572 - Use Freeze() and Thaw() respectively to disable and enable drawing. This
573 will also delay sorting etc. miscellaneous calculations to the last
574 possible moment.
575
576 @library{wxpropgrid}
577 @category{propgrid}
578 */
579 class WXDLLIMPEXP_PROPGRID
580 wxPropertyGrid : public wxScrolledWindow, public wxPropertyGridInterface
581 {
582 friend class wxPropertyGridPageState;
583 friend class wxPropertyGridInterface;
584 friend class wxPropertyGridManager;
585 friend class wxPGCanvas;
586
587 #ifndef SWIG
588 DECLARE_DYNAMIC_CLASS(wxPropertyGrid)
589 #endif
590 public:
591
592 #ifdef SWIG
593 %pythonAppend wxPropertyGrid {
594 self._setOORInfo(self)
595 self.DoDefaultTypeMappings()
596 self.edited_objects = {}
597 self.DoDefaultValueTypeMappings()
598 if not hasattr(self.__class__,'_vt2setter'):
599 self.__class__._vt2setter = {}
600 }
601 %pythonAppend wxPropertyGrid() ""
602
603 wxPropertyGrid( wxWindow *parent, wxWindowID id = wxID_ANY,
604 const wxPoint& pos = wxDefaultPosition,
605 const wxSize& size = wxDefaultSize,
606 long style = wxPG_DEFAULT_STYLE,
607 const wxChar* name = wxPyPropertyGridNameStr );
608 %RenameCtor(PrePropertyGrid, wxPropertyGrid());
609 #else
610
611 /**
612 Two step constructor.
613
614 Call Create when this constructor is called to build up the
615 wxPropertyGrid
616 */
617 wxPropertyGrid();
618
619 /** The default constructor. The styles to be used are styles valid for
620 the wxWindow and wxScrolledWindow.
621 @see @link wndflags Additional Window Styles@endlink
622 */
623 wxPropertyGrid( wxWindow *parent, wxWindowID id = wxID_ANY,
624 const wxPoint& pos = wxDefaultPosition,
625 const wxSize& size = wxDefaultSize,
626 long style = wxPG_DEFAULT_STYLE,
627 const wxChar* name = wxPropertyGridNameStr );
628
629 /** Destructor */
630 virtual ~wxPropertyGrid();
631 #endif
632
633 /** Adds given key combination to trigger given action.
634 @param action
635 Which action to trigger. See @link pgactions List of list of
636 wxPropertyGrid actions@endlink.
637 */
638 void AddActionTrigger( int action, int keycode, int modifiers = 0 );
639
640 /**
641 This static function enables or disables automatic use of
642 wxGetTranslation for following strings: wxEnumProperty list labels,
643 wxFlagsProperty sub-property labels.
644
645 Default is false.
646 */
647 static void AutoGetTranslation( bool enable );
648
649 /**
650 Changes value of a property, as if from an editor.
651
652 Use this instead of SetPropertyValue() if you need the value to run
653 through validation process, and also send the property change event.
654
655 @return
656 Returns true if value was successfully changed.
657 */
658 bool ChangePropertyValue( wxPGPropArg id, wxVariant newValue );
659
660 /**
661 Centers the splitter.
662
663 If argument is true, automatic splitter centering is enabled (only
664 applicapple if style wxPG_SPLITTER_AUTO_CENTER was defined).
665 */
666 void CenterSplitter( bool enable_auto_centering = false );
667
668 /** Deletes all properties.
669 */
670 virtual void Clear();
671
672 /** Clears action triggers for given action.
673 @param action
674 Which action to trigger. See @link pgactions List of list of
675 wxPropertyGrid actions@endlink.
676 */
677 void ClearActionTriggers( int action );
678
679 /** Forces updating the value of property from the editor control.
680
681 Note that wxEVT_PG_CHANGING and wxEVT_PG_CHANGED are dispatched using
682 ProcessEvent, meaning your event handlers will be called immediately.
683
684 @return
685 Returns true if anything was changed.
686 */
687 virtual bool CommitChangesFromEditor( wxUint32 flags = 0 );
688
689 /**
690 Two step creation.
691
692 Whenever the control is created without any parameters, use Create to
693 actually create it. Don't access the control's public methods before
694 this is called @see @link wndflags Additional Window Styles@endlink
695 */
696 bool Create( wxWindow *parent, wxWindowID id = wxID_ANY,
697 const wxPoint& pos = wxDefaultPosition,
698 const wxSize& size = wxDefaultSize,
699 long style = wxPG_DEFAULT_STYLE,
700 const wxChar* name = wxPropertyGridNameStr );
701
702 /**
703 Call when editor widget's contents is modified.
704
705 For example, this is called when changes text in wxTextCtrl (used in
706 wxStringProperty and wxIntProperty).
707
708 @remarks
709 This function should only be called by custom properties.
710
711 @see wxPGProperty::OnEvent()
712 */
713 void EditorsValueWasModified() { m_iFlags |= wxPG_FL_VALUE_MODIFIED; }
714
715 /** Reverse of EditorsValueWasModified().
716
717 @remarks
718 This function should only be called by custom properties.
719 */
720 void EditorsValueWasNotModified()
721 {
722 m_iFlags &= ~(wxPG_FL_VALUE_MODIFIED);
723 }
724
725 /**
726 Enables or disables (shows/hides) categories according to parameter
727 enable.
728 */
729 bool EnableCategories( bool enable );
730
731 /** Scrolls and/or expands items to ensure that the given item is visible.
732 Returns true if something was actually done.
733 */
734 bool EnsureVisible( wxPGPropArg id );
735
736 /**
737 Reduces column sizes to minimum possible that contents are still
738 visibly (naturally some margin space will be applied as well).
739
740 @return
741 Minimum size for the grid to still display everything.
742
743 @remarks
744 Does not work well with wxPG_SPLITTER_AUTO_CENTER window style.
745
746 This function only works properly if grid size prior to call was already
747 fairly large.
748
749 Note that you can also get calculated column widths by calling
750 GetState->GetColumnWidth() immediately after this function returns.
751 */
752 wxSize FitColumns()
753 {
754 wxSize sz = m_pState->DoFitColumns();
755 return sz;
756 }
757
758 /**
759 Returns wxWindow that the properties are painted on, and which should
760 be used as the parent for editor controls.
761 */
762 wxPanel* GetPanel() const
763 {
764 return m_canvas;
765 }
766
767 /** Returns current category caption background colour. */
768 wxColour GetCaptionBackgroundColour() const { return m_colCapBack; }
769
770 wxFont& GetCaptionFont() { return m_captionFont; }
771
772 const wxFont& GetCaptionFont() const { return m_captionFont; }
773
774 /** Returns current category caption text colour. */
775 wxColour GetCaptionForegroundColour() const { return m_colCapFore; }
776
777 /** Returns current cell background colour. */
778 wxColour GetCellBackgroundColour() const { return m_colPropBack; }
779
780 /** Returns current cell text colour when disabled. */
781 wxColour GetCellDisabledTextColour() const { return m_colDisPropFore; }
782
783 /** Returns current cell text colour. */
784 wxColour GetCellTextColour() const { return m_colPropFore; }
785
786 /**
787 Returns number of columns currently on grid.
788 */
789 int GetColumnCount() const
790 {
791 return m_pState->m_colWidths.size();
792 }
793
794 /** Returns colour of empty space below properties. */
795 wxColour GetEmptySpaceColour() const { return m_colEmptySpace; }
796
797 /** Returns height of highest characters of used font. */
798 int GetFontHeight() const { return m_fontHeight; }
799
800 /** Returns pointer to itself. Dummy function that enables same kind
801 of code to use wxPropertyGrid and wxPropertyGridManager.
802 */
803 wxPropertyGrid* GetGrid() { return this; }
804
805 /** Returns rectangle of custom paint image.
806 */
807 wxRect GetImageRect( wxPGProperty* p, int item ) const;
808
809 /** Returns size of the custom paint image in front of property.
810 If no argument is given, returns preferred size.
811 */
812 wxSize GetImageSize( wxPGProperty* p = NULL, int item = -1 ) const;
813
814 //@{
815 /** Returns last item which could be iterated using given flags.
816 @param flags
817 See @ref propgrid_iterator_flags.
818 */
819 wxPGProperty* GetLastItem( int flags = wxPG_ITERATE_DEFAULT )
820 {
821 return m_pState->GetLastItem(flags);
822 }
823
824 const wxPGProperty* GetLastItem( int flags = wxPG_ITERATE_DEFAULT ) const
825 {
826 return m_pState->GetLastItem(flags);
827 }
828 //@}
829
830 /** Returns colour of lines between cells. */
831 wxColour GetLineColour() const { return m_colLine; }
832
833 /** Returns background colour of margin. */
834 wxColour GetMarginColour() const { return m_colMargin; }
835
836 /** Returns cell background colour of a property. */
837 wxColour GetPropertyBackgroundColour( wxPGPropArg id ) const;
838
839 /** Returns cell background colour of a property. */
840 wxColour GetPropertyTextColour( wxPGPropArg id ) const;
841
842 /** Returns "root property". It does not have name, etc. and it is not
843 visible. It is only useful for accessing its children.
844 */
845 wxPGProperty* GetRoot() const { return m_pState->m_properties; }
846
847 /** Returns height of a single grid row (in pixels). */
848 int GetRowHeight() const { return m_lineHeight; }
849
850 /** Returns currently selected property. */
851 wxPGProperty* GetSelectedProperty() const { return GetSelection(); }
852
853 /** Returns currently selected property. */
854 wxPGProperty* GetSelection() const
855 {
856 return m_selected;
857 }
858
859 /** Returns current selection background colour. */
860 wxColour GetSelectionBackgroundColour() const { return m_colSelBack; }
861
862 /** Returns current selection text colour. */
863 wxColour GetSelectionForegroundColour() const { return m_colSelFore; }
864
865 /** Returns current splitter x position. */
866 int GetSplitterPosition() const
867 { return m_pState->DoGetSplitterPosition(0); }
868
869 /** Returns wxTextCtrl active in currently selected property, if any. Takes
870 into account wxOwnerDrawnComboBox.
871 */
872 wxTextCtrl* GetEditorTextCtrl() const;
873
874 wxPGValidationInfo& GetValidationInfo()
875 {
876 return m_validationInfo;
877 }
878
879 /** Returns current vertical spacing. */
880 int GetVerticalSpacing() const { return (int)m_vspacing; }
881
882 /** Returns true if editor's value was marked modified.
883 */
884 bool IsEditorsValueModified() const
885 { return ( m_iFlags & wxPG_FL_VALUE_MODIFIED ) ? true : false; }
886
887 /** Returns information about arbitrary position in the grid.
888
889 For wxPropertyGridHitTestResult definition, see
890 wxPropertyGridPageState::HitTest().
891 */
892 wxPropertyGridHitTestResult HitTest( const wxPoint& pt ) const;
893
894 /** Returns true if any property has been modified by the user. */
895 bool IsAnyModified() const { return (m_pState->m_anyModified>0); }
896
897 /**
898 Returns true if updating is frozen (ie Freeze() called but not yet
899 Thaw() ).
900 */
901 bool IsFrozen() const { return (m_frozen>0)?true:false; }
902
903 /** Redraws given property.
904 */
905 virtual void RefreshProperty( wxPGProperty* p );
906
907 #ifndef SWIG
908 /** Registers a new editor class.
909 @return
910 Pointer to the editor class instance that should be used.
911 */
912 static wxPGEditor* RegisterEditorClass( wxPGEditor* editor,
913 bool noDefCheck = false );
914 #endif
915
916 /** Resets all colours to the original system values.
917 */
918 void ResetColours();
919
920 /**
921 Selects a property.
922 Editor widget is automatically created, but not focused unless focus is
923 true. This will generate wxEVT_PG_SELECT event.
924 @param id
925 Property to select.
926 @return
927 True if selection finished successfully. Usually only fails if
928 current value in editor is not valid.
929 @see wxPropertyGrid::Unselect
930 */
931 bool SelectProperty( wxPGPropArg id, bool focus = false )
932 {
933 wxPG_PROP_ARG_CALL_PROLOG_RETVAL(false)
934 return DoSelectProperty(p,focus?wxPG_SEL_FOCUS:0);
935 }
936
937 /** Changes keyboard shortcut to push the editor button.
938 @remarks
939 You can set default with keycode 0. Good value for the platform is
940 guessed, but don't expect it to be very accurate.
941 */
942 void SetButtonShortcut( int keycode,
943 bool ctrlDown = false,
944 bool altDown = false );
945
946 /** Sets category caption background colour. */
947 void SetCaptionBackgroundColour(const wxColour& col);
948
949 /** Sets category caption text colour. */
950 void SetCaptionTextColour(const wxColour& col);
951
952 /** Sets default cell background colour - applies to property cells.
953 Note that appearance of editor widgets may not be affected.
954 */
955 void SetCellBackgroundColour(const wxColour& col);
956
957 /** Sets cell text colour for disabled properties.
958 */
959 void SetCellDisabledTextColour(const wxColour& col);
960
961 /** Sets default cell text colour - applies to property name and value text.
962 Note that appearance of editor widgets may not be affected.
963 */
964 void SetCellTextColour(const wxColour& col);
965
966 /** Set number of columns (2 or more).
967 */
968 void SetColumnCount( int colCount )
969 {
970 m_pState->SetColumnCount(colCount);
971 Refresh();
972 }
973
974 /**
975 Sets the 'current' category - Append will add non-category properties
976 under it.
977 */
978 void SetCurrentCategory( wxPGPropArg id )
979 {
980 wxPG_PROP_ARG_CALL_PROLOG()
981 wxPropertyCategory* pc = wxDynamicCast(p, wxPropertyCategory);
982 wxASSERT(pc);
983 m_pState->m_currentCategory = pc;
984 }
985
986 /** Sets colour of empty space below properties. */
987 void SetEmptySpaceColour(const wxColour& col);
988
989 /** Sets colour of lines between cells. */
990 void SetLineColour(const wxColour& col);
991
992 /** Sets background colour of margin. */
993 void SetMarginColour(const wxColour& col);
994
995 /** Sets background colour of property and all its children. Colours of
996 captions are not affected. Background brush cache is optimized for often
997 set colours to be set last.
998 */
999 void SetPropertyBackgroundColour( wxPGPropArg id, const wxColour& col );
1000
1001 /** Resets text and background colours of given property.
1002 */
1003 void SetPropertyColoursToDefault( wxPGPropArg id );
1004
1005 /** Sets text colour of property and all its children.
1006 */
1007 void SetPropertyTextColour( wxPGPropArg id,
1008 const wxColour& col,
1009 bool recursively = true );
1010
1011 /**
1012 Sets selection background colour - applies to selected property name
1013 background.
1014 */
1015 void SetSelectionBackgroundColour(const wxColour& col);
1016
1017 /**
1018 Sets selection foreground colour - applies to selected property name
1019 text.
1020 */
1021 void SetSelectionTextColour(const wxColour& col);
1022
1023 /** Sets x coordinate of the splitter.
1024 @remarks
1025 Splitter position cannot exceed grid size, and therefore setting it
1026 during form creation may fail as initial grid size is often smaller
1027 than desired splitter position, especially when sizers are being used.
1028 */
1029 void SetSplitterPosition( int newxpos, int col = 0 )
1030 {
1031 DoSetSplitterPosition_(newxpos, true, col);
1032 m_iFlags |= wxPG_FL_SPLITTER_PRE_SET;
1033 }
1034
1035 /** Set virtual width for this particular page. Width -1 indicates that the
1036 virtual width should be disabled. */
1037 void SetVirtualWidth( int width );
1038
1039 /**
1040 Moves splitter as left as possible, while still allowing all
1041 labels to be shown in full.
1042
1043 @param privateChildrenToo
1044 If @false, will still allow private children to be cropped.
1045 */
1046 void SetSplitterLeft( bool privateChildrenToo = false )
1047 {
1048 m_pState->SetSplitterLeft(privateChildrenToo);
1049 }
1050
1051 /** Sets vertical spacing. Can be 1, 2, or 3 - a value relative to font
1052 height. Value of 2 should be default on most platforms.
1053 */
1054 void SetVerticalSpacing( int vspacing )
1055 {
1056 m_vspacing = (unsigned char)vspacing;
1057 CalculateFontAndBitmapStuff( vspacing );
1058 if ( !m_pState->m_itemsAdded ) Refresh();
1059 }
1060
1061 /** Shows an brief error message that is related to a property. */
1062 void ShowPropertyError( wxPGPropArg id, const wxString& msg )
1063 {
1064 wxPG_PROP_ARG_CALL_PROLOG()
1065 DoShowPropertyError(p, msg);
1066 }
1067
1068 /** Sorts all items at all levels (except sub-properties). */
1069 void Sort();
1070
1071 /** Sorts children of a category.
1072 */
1073 void SortChildren( wxPGPropArg id );
1074
1075 /////////////////////////////////////////////////////////////////
1076 //
1077 // Following methods do not need to be (currently) documented
1078 //
1079 /////////////////////////////////////////////////////////////////
1080
1081 bool HasVirtualWidth() const
1082 { return (m_iFlags & wxPG_FL_HAS_VIRTUAL_WIDTH) ? true : false; }
1083
1084 const wxPGCommonValue* GetCommonValue( unsigned int i ) const
1085 {
1086 return (wxPGCommonValue*) m_commonValues[i];
1087 }
1088
1089 /** Returns number of common values.
1090 */
1091 unsigned int GetCommonValueCount() const
1092 {
1093 return m_commonValues.size();
1094 }
1095
1096 /** Returns label of given common value.
1097 */
1098 wxString GetCommonValueLabel( unsigned int i ) const
1099 {
1100 wxASSERT( GetCommonValue(i) );
1101 return GetCommonValue(i)->GetLabel();
1102 }
1103
1104 /**
1105 Returns index of common value that will truly change value to
1106 unspecified.
1107 */
1108 int GetUnspecifiedCommonValue() const { return m_cvUnspecified; }
1109
1110 /** Set index of common value that will truly change value to unspecified.
1111 Using -1 will set none to have such effect.
1112 Default is 0.
1113 */
1114 void SetUnspecifiedCommonValue( int index ) { m_cvUnspecified = index; }
1115
1116 /**
1117 Shortcut for creating dialog-caller button. Used, for example, by
1118 wxFontProperty.
1119 @remarks
1120 This should only be called by properties.
1121 */
1122 wxWindow* GenerateEditorButton( const wxPoint& pos, const wxSize& sz );
1123
1124 /** Fixes position of wxTextCtrl-like control (wxSpinCtrl usually
1125 fits as one). Call after control has been created (but before
1126 shown).
1127 */
1128 void FixPosForTextCtrl( wxWindow* ctrl,
1129 const wxPoint& offset = wxPoint(0, 0) );
1130
1131 /** Shortcut for creating text editor widget.
1132 @param pos
1133 Same as pos given for CreateEditor.
1134 @param sz
1135 Same as sz given for CreateEditor.
1136 @param value
1137 Initial text for wxTextCtrl.
1138 @param secondary
1139 If right-side control, such as button, also created, then create it
1140 first and pass it as this parameter.
1141 @param extraStyle
1142 Extra style flags to pass for wxTextCtrl.
1143 @remarks
1144 Note that this should generally be called only by new classes derived
1145 from wxPGProperty.
1146 */
1147 wxWindow* GenerateEditorTextCtrl( const wxPoint& pos,
1148 const wxSize& sz,
1149 const wxString& value,
1150 wxWindow* secondary,
1151 int extraStyle = 0,
1152 int maxLen = 0 );
1153
1154 /* Generates both textctrl and button.
1155 */
1156 wxWindow* GenerateEditorTextCtrlAndButton( const wxPoint& pos,
1157 const wxSize& sz, wxWindow** psecondary, int limited_editing,
1158 wxPGProperty* property );
1159
1160 /** Generates position for a widget editor dialog box.
1161 @param p
1162 Property for which dialog is positioned.
1163 @param sz
1164 Known or over-approximated size of the dialog.
1165 @return
1166 Position for dialog.
1167 */
1168 wxPoint GetGoodEditorDialogPosition( wxPGProperty* p,
1169 const wxSize& sz );
1170
1171 // Converts escape sequences in src_str to newlines,
1172 // tabs, etc. and copies result to dst_str.
1173 static wxString& ExpandEscapeSequences( wxString& dst_str,
1174 wxString& src_str );
1175
1176 // Converts newlines, tabs, etc. in src_str to escape
1177 // sequences, and copies result to dst_str.
1178 static wxString& CreateEscapeSequences( wxString& dst_str,
1179 wxString& src_str );
1180
1181 /**
1182 Returns rectangle that fully contains properties between and including
1183 p1 and p2.
1184 */
1185 wxRect GetPropertyRect( const wxPGProperty* p1,
1186 const wxPGProperty* p2 ) const;
1187
1188 /** Returns pointer to current active primary editor control (NULL if none).
1189
1190 If editor uses clipper window, pointer is returned to the actual
1191 editor, not the clipper.
1192 */
1193 wxWindow* GetEditorControl() const;
1194
1195 /** Adjusts given position if topCtrlWnd is child of clipper window.
1196 */
1197 bool AdjustPosForClipperWindow( wxWindow* topCtrlWnd, int* x, int* y );
1198
1199 wxWindow* GetPrimaryEditor() const
1200 {
1201 return GetEditorControl();
1202 }
1203
1204 /**
1205 Returns pointer to current active secondary editor control (NULL if
1206 none).
1207 */
1208 wxWindow* GetEditorControlSecondary() const
1209 {
1210 return m_wndEditor2;
1211 }
1212
1213 #ifndef SWIG
1214
1215 /**
1216 Generates contents for string dst based on the contents of
1217 wxArrayString src.
1218
1219 Format will be "(preDelim)str1(postDelim) (preDelim)str2(postDelim) and
1220 so on. Set flags to 1 inorder to convert backslashes to double-back-
1221 slashes and "(preDelims)"'s to "(preDelims)".
1222 */
1223 static void ArrayStringToString( wxString& dst, const wxArrayString& src,
1224 wxChar preDelim, wxChar postDelim,
1225 int flags );
1226
1227 // Mostly useful for page switching.
1228 void SwitchState( wxPropertyGridPageState* pNewState );
1229
1230 /** Pass this function to Connect calls in propertyclass::CreateEditor.
1231 */
1232 void OnCustomEditorEvent( wxCommandEvent &event );
1233
1234 long GetInternalFlags() const { return m_iFlags; }
1235 void SetInternalFlag( long flag ) { m_iFlags |= flag; }
1236 void ClearInternalFlag( long flag ) { m_iFlags &= ~(flag); }
1237 void IncFrozen() { m_frozen++; }
1238 void DecFrozen() { m_frozen--; }
1239
1240 void OnComboItemPaint( wxPGCustomComboControl* pCb,int item,wxDC& dc,
1241 wxRect& rect,int flags );
1242
1243 // Used by simple check box for keyboard navigation
1244 void SendNavigationKeyEvent( int dir );
1245
1246 /** Standardized double-to-string conversion.
1247 */
1248 static void DoubleToString( wxString& target,
1249 double value,
1250 int precision,
1251 bool removeZeroes,
1252 wxString* precTemplate );
1253
1254 /**
1255 Call this from wxPGProperty::OnEvent() to cause property value to be
1256 changed after the function returns (with true as return value).
1257 ValueChangeInEvent() must be used if you wish the application to be
1258 able to use wxEVT_PG_CHANGING to potentially veto the given value.
1259 */
1260 void ValueChangeInEvent( wxVariant variant )
1261 {
1262 m_changeInEventValue = variant;
1263 m_iFlags |= wxPG_FL_VALUE_CHANGE_IN_EVENT;
1264 }
1265
1266 /** Returns true if given event is from first of an array of buttons
1267 (as can be in case when wxPGMultiButton is used).
1268 */
1269 bool IsMainButtonEvent( const wxEvent& event )
1270 {
1271 return (event.GetEventType() == wxEVT_COMMAND_BUTTON_CLICKED)
1272 && (m_wndSecId == event.GetId());
1273 }
1274
1275 /** Pending value is expected to be passed in PerformValidation().
1276 */
1277 virtual bool DoPropertyChanged( wxPGProperty* p,
1278 unsigned int selFlags = 0 );
1279
1280 /**
1281 Runs all validation functionality (includes sending wxEVT_PG_CHANGING).
1282 Returns true if all tests passed.
1283 */
1284 virtual bool PerformValidation( wxPGProperty* p, wxVariant& pendingValue );
1285
1286 /** Called when validation for given property fails.
1287 @param invalidValue
1288 Value which failed in validation.
1289 @return
1290 Return true if user is allowed to change to another property even
1291 if current has invalid value.
1292 @remarks
1293 To add your own validation failure behavior, override
1294 wxPropertyGrid::DoOnValidationFailure().
1295 */
1296 bool OnValidationFailure( wxPGProperty* property, wxVariant& invalidValue )
1297 {
1298 bool res = DoOnValidationFailure(property, invalidValue);
1299 property->SetFlag(wxPG_PROP_INVALID_VALUE);
1300 return res;
1301 }
1302
1303 /** Called to indicate property and editor has valid value now.
1304 */
1305 void OnValidationFailureReset( wxPGProperty* property )
1306 {
1307 if ( property && property->HasFlag(wxPG_PROP_INVALID_VALUE) )
1308 {
1309 DoOnValidationFailureReset(property);
1310 property->ClearFlag(wxPG_PROP_INVALID_VALUE);
1311 }
1312 m_validationInfo.m_failureMessage.clear();
1313 }
1314
1315 /** Override in derived class to display error messages in custom manner
1316 (these message usually only result from validation failure).
1317 */
1318 virtual void DoShowPropertyError( wxPGProperty* property,
1319 const wxString& msg );
1320
1321 /** Override to customize property validation failure behavior.
1322 @param invalidValue
1323 Value which failed in validation.
1324 @return
1325 Return true if user is allowed to change to another property even
1326 if current has invalid value.
1327 */
1328 virtual bool DoOnValidationFailure( wxPGProperty* property,
1329 wxVariant& invalidValue );
1330
1331 /** Override to customize resetting of property validation failure status.
1332 @remarks
1333 Property is guaranteed to have flag wxPG_PROP_INVALID_VALUE set.
1334 */
1335 virtual void DoOnValidationFailureReset( wxPGProperty* property );
1336
1337 int GetSpacingY() const { return m_spacingy; }
1338
1339 /**
1340 Must be called in wxPGEditor::CreateControls() if primary editor window
1341 is wxTextCtrl, just before textctrl is created.
1342 @param text
1343 Initial text value of created wxTextCtrl.
1344 */
1345 void SetupTextCtrlValue( const wxString text ) { m_prevTcValue = text; }
1346
1347 /**
1348 Unfocuses or closes editor if one was open, but does not deselect
1349 property.
1350 */
1351 bool UnfocusEditor();
1352
1353 protected:
1354
1355 /**
1356 wxPropertyGridPageState used by the grid is created here.
1357
1358 If grid is used in wxPropertyGridManager, there is no point overriding
1359 this - instead, set custom wxPropertyGridPage classes.
1360 */
1361 virtual wxPropertyGridPageState* CreateState() const;
1362
1363 #ifndef DOXYGEN
1364 public:
1365
1366 // Control font changer helper.
1367 void SetCurControlBoldFont();
1368
1369 //
1370 // Public methods for semi-public use
1371 // (not protected for optimization)
1372 //
1373 bool DoSelectProperty( wxPGProperty* p, unsigned int flags = 0 );
1374
1375 // Overridden functions.
1376 virtual bool Destroy();
1377 virtual wxSize DoGetBestSize() const;
1378 // Returns property at given y coordinate (relative to grid's top left).
1379 wxPGProperty* GetItemAtY( int y ) const { return DoGetItemAtY(y); }
1380
1381 virtual void Refresh( bool eraseBackground = true,
1382 const wxRect *rect = (const wxRect *) NULL );
1383 virtual bool SetFont( const wxFont& font );
1384 #if wxPG_SUPPORT_TOOLTIPS
1385 void SetToolTip( const wxString& tipString );
1386 #endif
1387 virtual void Freeze();
1388 virtual void SetExtraStyle( long exStyle );
1389 virtual void Thaw();
1390
1391
1392 protected:
1393
1394 #ifndef wxPG_ICON_WIDTH
1395 wxBitmap *m_expandbmp, *m_collbmp;
1396 #endif
1397
1398 wxCursor *m_cursorSizeWE;
1399
1400 /** wxWindow pointers to editor control(s). */
1401 wxWindow *m_wndEditor;
1402 wxWindow *m_wndEditor2;
1403
1404 /** wxPGCanvas instance. */
1405 wxPanel *m_canvas;
1406
1407 #if wxPG_DOUBLE_BUFFER
1408 wxBitmap *m_doubleBuffer;
1409 #endif
1410
1411 wxArrayPtrVoid *m_windowsToDelete;
1412
1413 /** Local time ms when control was created. */
1414 wxLongLong m_timeCreated;
1415
1416 /** wxPGProperty::OnEvent can change value by setting this. */
1417 wxVariant m_changeInEventValue;
1418
1419 /** Id of m_wndEditor2, or its first child, if any. */
1420 int m_wndSecId;
1421
1422 /** Extra Y spacing between the items. */
1423 int m_spacingy;
1424
1425 /** Control client area width; updated on resize. */
1426 int m_width;
1427
1428 /** Control client area height; updated on resize. */
1429 int m_height;
1430
1431 /** Current non-client width (needed when auto-centering). */
1432 int m_ncWidth;
1433
1434 /** Non-client width (auto-centering helper). */
1435 //int m_fWidth;
1436
1437 /** Previously recorded scroll start position. */
1438 int m_prevVY;
1439
1440 /**
1441 The gutter spacing in front and back of the image.
1442 This determines the amount of spacing in front of each item
1443 */
1444 int m_gutterWidth;
1445
1446 /** Includes separator line. */
1447 int m_lineHeight;
1448
1449 /** Gutter*2 + image width. */
1450 int m_marginWidth;
1451
1452 // y spacing for expand/collapse button.
1453 int m_buttonSpacingY;
1454
1455 /** Extra margin for expanded sub-group items. */
1456 int m_subgroup_extramargin;
1457
1458 /**
1459 The image width of the [+] icon.
1460
1461 This is also calculated in the gutter
1462 */
1463 int m_iconWidth;
1464
1465 #ifndef wxPG_ICON_WIDTH
1466
1467 /**
1468 The image height of the [+] icon.
1469
1470 This is calculated as minimal size and to align
1471 */
1472 int m_iconHeight;
1473 #endif
1474
1475 /** Current cursor id. */
1476 int m_curcursor;
1477
1478 /**
1479 This captionFont is made equal to the font of the wxScrolledWindow.
1480
1481 As extra the bold face is set on it when this is wanted by the user
1482 (see flags)
1483 */
1484 wxFont m_captionFont;
1485
1486 int m_fontHeight; // Height of the font.
1487
1488 // Base keycode for triggering push button.
1489 int m_pushButKeyCode;
1490
1491 /** m_splitterx when drag began. */
1492 int m_startingSplitterX;
1493
1494 /**
1495 Index to splitter currently being dragged (0=one after the first
1496 column).
1497 */
1498 int m_draggedSplitter;
1499
1500 /** Changed property, calculated in PerformValidation(). */
1501 wxPGProperty* m_chgInfo_changedProperty;
1502
1503 /**
1504 Lowest property for which editing happened, but which does not have
1505 aggregate parent
1506 */
1507 wxPGProperty* m_chgInfo_baseChangedProperty;
1508
1509 /** Changed property value, calculated in PerformValidation(). */
1510 wxVariant m_chgInfo_pendingValue;
1511
1512 /** Passed to SetValue. */
1513 wxVariant m_chgInfo_valueList;
1514
1515 /** Validation information. */
1516 wxPGValidationInfo m_validationInfo;
1517
1518 /** Actions and keys that trigger them. */
1519 wxPGHashMapI2I m_actionTriggers;
1520
1521 //
1522 // Temporary values
1523 //
1524
1525 /** Bits are used to indicate which colours are customized. */
1526 unsigned short m_coloursCustomized;
1527
1528 /** x - m_splitterx. */
1529 signed char m_dragOffset;
1530
1531 /** 0 = not dragging, 1 = drag just started, 2 = drag in progress */
1532 unsigned char m_dragStatus;
1533
1534 /** 0 = margin, 1 = label, 2 = value. */
1535 unsigned char m_mouseSide;
1536
1537 /** True when editor control is focused. */
1538 unsigned char m_editorFocused;
1539
1540 /** 1 if m_latsCaption is also the bottommost caption. */
1541 //unsigned char m_lastCaptionBottomnest;
1542
1543 /** Set to 1 when graphics frozen. */
1544 unsigned char m_frozen;
1545
1546 unsigned char m_vspacing;
1547
1548 // Does triggering push button need Alt down?
1549 unsigned char m_pushButKeyCodeNeedsAlt;
1550
1551 // Does triggering push button need Ctrl down?
1552 unsigned char m_pushButKeyCodeNeedsCtrl;
1553
1554 // Used to track when Alt/Ctrl+Key was consumed.
1555 unsigned char m_keyComboConsumed;
1556
1557 /** 1 if in DoPropertyChanged() */
1558 unsigned char m_inDoPropertyChanged;
1559
1560 /** 1 if in CommitChangesFromEditor() */
1561 unsigned char m_inCommitChangesFromEditor;
1562
1563 /** 1 if in DoSelectProperty() */
1564 unsigned char m_inDoSelectProperty;
1565
1566 wxPGVFBFlags m_permanentValidationFailureBehavior; // Set by app
1567
1568 /** Internal flags - see wxPG_FL_XXX constants. */
1569 wxUint32 m_iFlags;
1570
1571 /** When drawing next time, clear this many item slots at the end. */
1572 int m_clearThisMany;
1573
1574 /** Pointer to selected property. Note that this is duplicated in
1575 m_state for better transiency between pages so that the selected
1576 item can be retained.
1577 */
1578 wxPGProperty* m_selected;
1579
1580 // pointer to property that has mouse hovering
1581 wxPGProperty* m_propHover;
1582
1583 // EventObject for wxPropertyGridEvents
1584 wxWindow* m_eventObject;
1585
1586 // What (global) window is currently focused (needed to resolve event
1587 // handling mess).
1588 wxWindow* m_curFocused;
1589
1590 // wxPGTLWHandler
1591 wxEvtHandler* m_tlwHandler;
1592
1593 // Top level parent
1594 wxWindow* m_tlp;
1595
1596 // y coordinate of property that mouse hovering
1597 int m_propHoverY;
1598 // Which column's editor is selected (usually 1)?
1599 int m_selColumn;
1600
1601 // x relative to splitter (needed for resize).
1602 int m_ctrlXAdjust;
1603
1604 // lines between cells
1605 wxColour m_colLine;
1606 // property labels and values are written in this colour
1607 wxColour m_colPropFore;
1608 // or with this colour when disabled
1609 wxColour m_colDisPropFore;
1610 // background for m_colPropFore
1611 wxColour m_colPropBack;
1612 // text color for captions
1613 wxColour m_colCapFore;
1614 // background color for captions
1615 wxColour m_colCapBack;
1616 // foreground for selected property
1617 wxColour m_colSelFore;
1618 // background for selected property (actually use background color when
1619 // control out-of-focus)
1620 wxColour m_colSelBack;
1621 // background colour for margin
1622 wxColour m_colMargin;
1623 // background colour for empty space below the grid
1624 wxColour m_colEmptySpace;
1625
1626 // NB: These *cannot* be moved to globals.
1627
1628 // Array of background colour brushes.
1629 wxArrayPtrVoid m_arrBgBrushes;
1630 // Array of foreground colours.
1631 wxArrayPtrVoid m_arrFgCols;
1632
1633 // labels when properties use common values
1634 wxArrayPtrVoid m_commonValues;
1635 // Which cv selection really sets value to unspecified?
1636 int m_cvUnspecified;
1637
1638 // Used to skip excess text editor events
1639 wxString m_prevTcValue;
1640
1641 protected:
1642
1643 // Sets some members to defaults (called constructors).
1644 void Init1();
1645
1646 // Initializes some members (called by Create and complex constructor).
1647 void Init2();
1648
1649 void OnPaint(wxPaintEvent &event );
1650
1651 // main event receivers
1652 void OnMouseMove( wxMouseEvent &event );
1653 void OnMouseMoveBottom( wxMouseEvent &event );
1654 void OnMouseClick( wxMouseEvent &event );
1655 void OnMouseRightClick( wxMouseEvent &event );
1656 void OnMouseDoubleClick( wxMouseEvent &event );
1657 void OnMouseUp( wxMouseEvent &event );
1658 void OnKey( wxKeyEvent &event );
1659 void OnKeyUp( wxKeyEvent &event );
1660 void OnNavigationKey( wxNavigationKeyEvent& event );
1661 void OnResize( wxSizeEvent &event );
1662
1663 // event handlers
1664 bool HandleMouseMove( int x, unsigned int y, wxMouseEvent &event );
1665 bool HandleMouseClick( int x, unsigned int y, wxMouseEvent &event );
1666 bool HandleMouseRightClick( int x, unsigned int y, wxMouseEvent &event );
1667 bool HandleMouseDoubleClick( int x, unsigned int y, wxMouseEvent &event );
1668 bool HandleMouseUp( int x, unsigned int y, wxMouseEvent &event );
1669 void HandleKeyEvent( wxKeyEvent &event );
1670 // Handle TAB and ESCAPE in control
1671 bool HandleChildKey( wxKeyEvent& event );
1672
1673 void OnMouseEntry( wxMouseEvent &event );
1674
1675 void OnIdle( wxIdleEvent &event );
1676 void OnFocusEvent( wxFocusEvent &event );
1677 void OnChildFocusEvent( wxChildFocusEvent& event );
1678
1679 bool OnMouseCommon( wxMouseEvent &event, int* px, int *py );
1680 bool OnMouseChildCommon( wxMouseEvent &event, int* px, int *py );
1681
1682 // sub-control event handlers
1683 void OnMouseClickChild( wxMouseEvent &event );
1684 void OnMouseRightClickChild( wxMouseEvent &event );
1685 void OnMouseMoveChild( wxMouseEvent &event );
1686 void OnMouseUpChild( wxMouseEvent &event );
1687 void OnChildKeyDown( wxKeyEvent &event );
1688 void OnChildKeyUp( wxKeyEvent &event );
1689
1690 void OnCaptureChange( wxMouseCaptureChangedEvent &event );
1691
1692 void OnScrollEvent( wxScrollWinEvent &event );
1693
1694 void OnSysColourChanged( wxSysColourChangedEvent &event );
1695
1696 protected:
1697
1698 /**
1699 Adjust the centering of the bitmap icons (collapse / expand) when the
1700 caption font changes.
1701
1702 They need to be centered in the middle of the font, so a bit of deltaY
1703 adjustment is needed. On entry, m_captionFont must be set to window
1704 font. It will be modified properly.
1705 */
1706 void CalculateFontAndBitmapStuff( int vspacing );
1707
1708 wxRect GetEditorWidgetRect( wxPGProperty* p, int column ) const;
1709
1710 void CorrectEditorWidgetSizeX();
1711
1712 /** Called in RecalculateVirtualSize() to reposition control
1713 on virtual height changes.
1714 */
1715 void CorrectEditorWidgetPosY();
1716
1717 #ifdef __WXDEBUG__
1718 void _log_items();
1719 void OnScreenNote( const wxChar* format, ... );
1720 #endif
1721
1722 /** Deselect current selection, if any. Returns true if success
1723 (ie. validator did not intercept). */
1724 bool DoClearSelection();
1725
1726 int DoDrawItems( wxDC& dc,
1727 const wxPGProperty* first_item,
1728 const wxPGProperty* last_item,
1729 const wxRect* clip_rect,
1730 bool isBuffered ) const;
1731
1732 void DoSetPropertyValueUnspecified( wxPGProperty* p );
1733
1734 /** Draws an expand/collapse (ie. +/-) button.
1735 */
1736 virtual void DrawExpanderButton( wxDC& dc, const wxRect& rect,
1737 wxPGProperty* property ) const;
1738
1739 /** Draws items from topitemy to bottomitemy */
1740 void DrawItems( wxDC& dc, unsigned int topitemy, unsigned int bottomitemy,
1741 const wxRect* clip_rect = (const wxRect*) NULL );
1742
1743 void DrawItems( const wxPGProperty* p1, const wxPGProperty* p2 );
1744
1745 void DrawItem( wxPGProperty* p )
1746 {
1747 DrawItems(p,p);
1748 }
1749
1750 virtual void DrawItemAndChildren( wxPGProperty* p );
1751
1752 /**
1753 Draws item, children, and consequtive parents as long as category is
1754 not met.
1755 */
1756 void DrawItemAndValueRelated( wxPGProperty* p );
1757
1758 // Translate wxKeyEvent to wxPG_ACTION_XXX
1759 int KeyEventToActions(wxKeyEvent &event, int* pSecond) const;
1760
1761 int KeyEventToAction(wxKeyEvent &event) const
1762 {
1763 return KeyEventToActions(event, NULL);
1764 }
1765
1766 void ImprovedClientToScreen( int* px, int* py );
1767
1768 // Called by focus event handlers. newFocused is the window that becomes
1769 // focused.
1770 void HandleFocusChange( wxWindow* newFocused );
1771
1772 /** Reloads all non-customized colours from system settings. */
1773 void RegainColours();
1774
1775 bool DoEditorValidate();
1776
1777 wxPGProperty* DoGetItemAtY( int y ) const;
1778
1779 void DoSetSplitterPosition_( int newxpos,
1780 bool refresh = true,
1781 int splitterIndex = 0,
1782 bool allPages = false );
1783
1784 void FreeEditors();
1785
1786 virtual bool DoExpand( wxPGProperty* p, bool sendEvent = false );
1787
1788 virtual bool DoCollapse( wxPGProperty* p, bool sendEvent = false );
1789
1790 // Returns nearest paint visible property (such that will be painted unless
1791 // window is scrolled or resized). If given property is paint visible, then
1792 // it itself will be returned.
1793 wxPGProperty* GetNearestPaintVisible( wxPGProperty* p ) const;
1794
1795 static void RegisterDefaultEditors();
1796
1797 // Sets m_bgColIndex to this property and all its children.
1798 void SetBackgroundColourIndex( wxPGProperty* p, int index );
1799
1800 // Sets m_fgColIndex to this property and all its children.
1801 void SetTextColourIndex( wxPGProperty* p, int index, int flags );
1802
1803 int CacheColour( const wxColour& colour );
1804
1805 // Sets up basic event handling for child control
1806 void SetupChildEventHandling( wxWindow* wnd, int id );
1807
1808 void CustomSetCursor( int type, bool override = false );
1809
1810 virtual bool ProcessEvent(wxEvent& event);
1811 virtual void SetWindowStyleFlag( long style );
1812
1813 /**
1814 Repositions scrollbar and underlying panel according to changed virtual
1815 size.
1816 */
1817 void RecalculateVirtualSize( int forceXPos = -1 );
1818
1819 void PrepareAfterItemsAdded();
1820
1821 bool SendEvent( int eventType,
1822 wxPGProperty* p,
1823 wxVariant* pValue = NULL,
1824 unsigned int selFlags = 0 );
1825
1826 void SetFocusOnCanvas();
1827
1828 bool DoHideProperty( wxPGProperty* p, bool hide, int flags );
1829
1830 private:
1831
1832 bool ButtonTriggerKeyTest( wxKeyEvent &event );
1833
1834 #endif // DOXYGEN_SHOULD_SKIP_THIS
1835
1836 private:
1837 DECLARE_EVENT_TABLE()
1838 #endif // #ifndef SWIG
1839 };
1840
1841 // -----------------------------------------------------------------------
1842 //
1843 // Bunch of inlines that need to resolved after all classes have been defined.
1844 //
1845
1846 #ifndef SWIG
1847 inline bool wxPropertyGridPageState::IsDisplayed() const
1848 {
1849 return ( this == m_pPropGrid->GetState() );
1850 }
1851
1852 inline unsigned int wxPropertyGridPageState::GetActualVirtualHeight() const
1853 {
1854 return DoGetRoot()->GetChildrenHeight(GetGrid()->GetRowHeight());
1855 }
1856 #endif
1857
1858 inline int wxPGProperty::GetDisplayedCommonValueCount() const
1859 {
1860 if ( HasFlag(wxPG_PROP_USES_COMMON_VALUE) )
1861 {
1862 wxPropertyGrid* pg = GetGrid();
1863 if ( pg )
1864 return pg->GetCommonValueCount();
1865 }
1866 return 0;
1867 }
1868
1869 inline void wxPGProperty::SetEditor( const wxString& editorName )
1870 {
1871 m_customEditor = wxPropertyGridInterface::GetEditorByName(editorName);
1872 }
1873
1874 inline void wxPGProperty::SetName( const wxString& newName )
1875 {
1876 GetGrid()->SetPropertyName(this, newName);
1877 }
1878
1879 inline bool wxPGProperty::Hide( bool hide, int flags )
1880 {
1881 return GetGrid()->HideProperty(this, hide, flags);
1882 }
1883
1884 inline bool wxPGProperty::SetMaxLength( int maxLen )
1885 {
1886 return GetGrid()->SetPropertyMaxLength(this,maxLen);
1887 }
1888
1889 // -----------------------------------------------------------------------
1890
1891
1892 #ifndef SWIG
1893
1894 #define wxPG_BASE_EVT_PRE_ID 1775
1895
1896 BEGIN_DECLARE_EVENT_TYPES()
1897 DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_PROPGRID, wxEVT_PG_SELECTED, wxPG_BASE_EVT_PRE_ID)
1898 DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_PROPGRID, wxEVT_PG_CHANGING, wxPG_BASE_EVT_PRE_ID+1)
1899 DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_PROPGRID, wxEVT_PG_CHANGED, wxPG_BASE_EVT_PRE_ID+2)
1900 DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_PROPGRID, wxEVT_PG_HIGHLIGHTED, wxPG_BASE_EVT_PRE_ID+3)
1901 DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_PROPGRID, wxEVT_PG_RIGHT_CLICK, wxPG_BASE_EVT_PRE_ID+4)
1902 DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_PROPGRID, wxEVT_PG_PAGE_CHANGED, wxPG_BASE_EVT_PRE_ID+5)
1903 DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_PROPGRID, wxEVT_PG_ITEM_COLLAPSED, wxPG_BASE_EVT_PRE_ID+6)
1904 DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_PROPGRID, wxEVT_PG_ITEM_EXPANDED, wxPG_BASE_EVT_PRE_ID+7)
1905 DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_PROPGRID, wxEVT_PG_DOUBLE_CLICK, wxPG_BASE_EVT_PRE_ID+8)
1906 END_DECLARE_EVENT_TYPES()
1907 #else
1908 enum {
1909 wxEVT_PG_SELECTED = wxPG_BASE_EVT_PRE_ID,
1910 wxEVT_PG_CHANGING,
1911 wxEVT_PG_CHANGED,
1912 wxEVT_PG_HIGHLIGHTED,
1913 wxEVT_PG_RIGHT_CLICK,
1914 wxEVT_PG_PAGE_CHANGED,
1915 wxEVT_PG_ITEM_COLLAPSED,
1916 wxEVT_PG_ITEM_EXPANDED,
1917 wxEVT_PG_DOUBLE_CLICK
1918 };
1919 #endif
1920
1921
1922 #define wxPG_BASE_EVT_TYPE wxEVT_PG_SELECTED
1923 #define wxPG_MAX_EVT_TYPE (wxPG_BASE_EVT_TYPE+30)
1924
1925
1926 #ifndef SWIG
1927 typedef void (wxEvtHandler::*wxPropertyGridEventFunction)(wxPropertyGridEvent&);
1928
1929 #define EVT_PG_SELECTED(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_SELECTED, id, -1, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxPropertyGridEventFunction, & fn ), (wxObject *) NULL ),
1930 #define EVT_PG_CHANGING(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_CHANGING, id, -1, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxPropertyGridEventFunction, & fn ), (wxObject *) NULL ),
1931 #define EVT_PG_CHANGED(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_CHANGED, id, -1, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxPropertyGridEventFunction, & fn ), (wxObject *) NULL ),
1932 #define EVT_PG_HIGHLIGHTED(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_HIGHLIGHTED, id, -1, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxPropertyGridEventFunction, & fn ), (wxObject *) NULL ),
1933 #define EVT_PG_RIGHT_CLICK(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_RIGHT_CLICK, id, -1, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxPropertyGridEventFunction, & fn ), (wxObject *) NULL ),
1934 #define EVT_PG_DOUBLE_CLICK(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_DOUBLE_CLICK, id, -1, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxPropertyGridEventFunction, & fn ), (wxObject *) NULL ),
1935 #define EVT_PG_PAGE_CHANGED(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_PAGE_CHANGED, id, -1, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxPropertyGridEventFunction, & fn ), (wxObject *) NULL ),
1936 #define EVT_PG_ITEM_COLLAPSED(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_ITEM_COLLAPSED, id, -1, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxPropertyGridEventFunction, & fn ), (wxObject *) NULL ),
1937 #define EVT_PG_ITEM_EXPANDED(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_ITEM_EXPANDED, id, -1, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxPropertyGridEventFunction, & fn ), (wxObject *) NULL ),
1938
1939 #define wxPropertyGridEventHandler(A) \
1940 ((wxObjectEventFunction)(wxEventFunction)(wxPropertyGridEventFunction)&A)
1941
1942 #endif
1943
1944
1945 /** @class wxPropertyGridEvent
1946
1947 A propertygrid event holds information about events associated with
1948 wxPropertyGrid objects.
1949
1950 @library{wxpropgrid}
1951 @category{propgrid}
1952 */
1953 class WXDLLIMPEXP_PROPGRID wxPropertyGridEvent : public wxCommandEvent
1954 {
1955 public:
1956
1957 /** Constructor. */
1958 wxPropertyGridEvent(wxEventType commandType=0, int id=0);
1959 #ifndef SWIG
1960 /** Copy constructor. */
1961 wxPropertyGridEvent(const wxPropertyGridEvent& event);
1962 #endif
1963 /** Destructor. */
1964 ~wxPropertyGridEvent();
1965
1966 /** Copyer. */
1967 virtual wxEvent* Clone() const;
1968
1969 wxPGProperty* GetMainParent() const
1970 {
1971 wxASSERT(m_property);
1972 return m_property->GetMainParent();
1973 }
1974
1975 /** Returns id of associated property. */
1976 wxPGProperty* GetProperty() const
1977 {
1978 return m_property;
1979 }
1980
1981 wxPGValidationInfo& GetValidationInfo()
1982 {
1983 wxASSERT(m_validationInfo);
1984 return *m_validationInfo;
1985 }
1986
1987 /** Returns true if you can veto the action that the event is signaling.
1988 */
1989 bool CanVeto() const { return m_canVeto; }
1990
1991 /**
1992 Call this from your event handler to veto action that the event is
1993 signaling.
1994
1995 You can only veto a shutdown if wxPropertyGridEvent::CanVeto returns
1996 true.
1997 @remarks
1998 Currently only wxEVT_PG_CHANGING supports vetoing.
1999 */
2000 void Veto( bool veto = true ) { m_wasVetoed = veto; }
2001
2002 /** Returns value that is about to be set for wxEVT_PG_CHANGING.
2003 */
2004 const wxVariant& GetValue() const
2005 {
2006 wxASSERT_MSG( m_validationInfo,
2007 "Only call GetValue from a handler "
2008 "of event type that supports it" );
2009 return m_validationInfo->GetValue();
2010 }
2011
2012 /**
2013 Set override validation failure behavior.
2014
2015 Only effective if Veto was also called, and only allowed if event type
2016 is wxEVT_PG_CHANGING.
2017 */
2018 void SetValidationFailureBehavior( wxPGVFBFlags flags )
2019 {
2020 wxASSERT( GetEventType() == wxEVT_PG_CHANGING );
2021 m_validationInfo->SetFailureBehavior( flags );
2022 }
2023
2024 /** Sets custom failure message for this time only. Only applies if
2025 wxPG_VFB_SHOW_MESSAGE is set in validation failure flags.
2026 */
2027 void SetValidationFailureMessage( const wxString& message )
2028 {
2029 wxASSERT( GetEventType() == wxEVT_PG_CHANGING );
2030 m_validationInfo->SetFailureMessage( message );
2031 }
2032
2033 #ifndef SWIG
2034 wxPGVFBFlags GetValidationFailureBehavior() const
2035 {
2036 wxASSERT( GetEventType() == wxEVT_PG_CHANGING );
2037 return m_validationInfo->GetFailureBehavior();
2038 }
2039
2040 void SetCanVeto( bool canVeto ) { m_canVeto = canVeto; }
2041 bool WasVetoed() const { return m_wasVetoed; }
2042
2043 /** Changes the associated property. */
2044 void SetProperty( wxPGProperty* p ) { m_property = p; }
2045
2046 void SetPropertyGrid( wxPropertyGrid* pg ) { m_pg = pg; }
2047
2048 void SetupValidationInfo()
2049 {
2050 wxASSERT(m_pg);
2051 wxASSERT( GetEventType() == wxEVT_PG_CHANGING );
2052 m_validationInfo = &m_pg->GetValidationInfo();
2053 }
2054
2055 private:
2056 void Init();
2057 DECLARE_DYNAMIC_CLASS(wxPropertyGridEvent)
2058
2059 wxPGProperty* m_property;
2060 wxPropertyGrid* m_pg;
2061 wxPGValidationInfo* m_validationInfo;
2062
2063 bool m_canVeto;
2064 bool m_wasVetoed;
2065
2066 #endif
2067 };
2068
2069
2070 // -----------------------------------------------------------------------
2071
2072 /** @class wxPropertyGridPopulator
2073 @ingroup classes
2074 Allows populating wxPropertyGrid from arbitrary text source.
2075 */
2076 class WXDLLIMPEXP_PROPGRID wxPropertyGridPopulator
2077 {
2078 public:
2079 /** Default constructor.
2080 */
2081 wxPropertyGridPopulator();
2082
2083 /** Destructor. */
2084 virtual ~wxPropertyGridPopulator();
2085
2086 void SetState( wxPropertyGridPageState* state );
2087
2088 void SetGrid( wxPropertyGrid* pg );
2089
2090 /** Appends a new property under bottommost parent.
2091 @param propClass
2092 Property class as string.
2093 */
2094 wxPGProperty* Add( const wxString& propClass,
2095 const wxString& propLabel,
2096 const wxString& propName,
2097 const wxString* propValue,
2098 wxPGChoices* pChoices = NULL );
2099
2100 /**
2101 Pushes property to the back of parent array (ie it becomes bottommost
2102 parent), and starts scanning/adding children for it.
2103
2104 When finished, parent array is returned to the original state.
2105 */
2106 void AddChildren( wxPGProperty* property );
2107
2108 /** Adds attribute to the bottommost property.
2109 @param type
2110 Allowed values: "string", (same as string), "int", "bool". Empty string
2111 mean autodetect.
2112 */
2113 bool AddAttribute( const wxString& name,
2114 const wxString& type,
2115 const wxString& value );
2116
2117 /** Called once in AddChildren.
2118 */
2119 virtual void DoScanForChildren() = 0;
2120
2121 /**
2122 Returns id of parent property for which children can currently be
2123 added.
2124 */
2125 wxPGProperty* GetCurParent() const
2126 {
2127 return (wxPGProperty*) m_propHierarchy[m_propHierarchy.size()-1];
2128 }
2129
2130 wxPropertyGridPageState* GetState() { return m_state; }
2131 const wxPropertyGridPageState* GetState() const { return m_state; }
2132
2133 /** Like wxString::ToLong, except allows N% in addition of N.
2134 */
2135 static bool ToLongPCT( const wxString& s, long* pval, long max );
2136
2137 /** Parses strings of format "choice1"[=value1] ... "choiceN"[=valueN] into
2138 wxPGChoices. Registers parsed result using idString (if not empty).
2139 Also, if choices with given id already registered, then don't parse but
2140 return those choices instead.
2141 */
2142 wxPGChoices ParseChoices( const wxString& choicesString,
2143 const wxString& idString );
2144
2145 /** Implement in derived class to do custom process when an error occurs.
2146 Default implementation uses wxLogError.
2147 */
2148 virtual void ProcessError( const wxString& msg );
2149
2150 protected:
2151
2152 /** Used property grid. */
2153 wxPropertyGrid* m_pg;
2154
2155 /** Used property grid state. */
2156 wxPropertyGridPageState* m_state;
2157
2158 /** Tree-hierarchy of added properties (that can have children). */
2159 wxArrayPGProperty m_propHierarchy;
2160
2161 /** Hashmap for string-id to wxPGChoicesData mapping. */
2162 wxPGHashMapS2P m_dictIdChoices;
2163 };
2164
2165 // -----------------------------------------------------------------------
2166
2167 //
2168 // Undefine macros that are not needed outside propertygrid sources
2169 //
2170 #ifndef __wxPG_SOURCE_FILE__
2171 #undef wxPG_FL_DESC_REFRESH_REQUIRED
2172 #undef wxPG_FL_SCROLLBAR_DETECTED
2173 #undef wxPG_FL_CREATEDSTATE
2174 #undef wxPG_FL_NOSTATUSBARHELP
2175 #undef wxPG_FL_SCROLLED
2176 #undef wxPG_FL_FOCUS_INSIDE_CHILD
2177 #undef wxPG_FL_FOCUS_INSIDE
2178 #undef wxPG_FL_MOUSE_INSIDE_CHILD
2179 #undef wxPG_FL_CUR_USES_CUSTOM_IMAGE
2180 #undef wxPG_FL_PRIMARY_FILLS_ENTIRE
2181 #undef wxPG_FL_VALUE_MODIFIED
2182 #undef wxPG_FL_MOUSE_INSIDE
2183 #undef wxPG_FL_FOCUSED
2184 #undef wxPG_FL_MOUSE_CAPTURED
2185 #undef wxPG_FL_INITIALIZED
2186 #undef wxPG_FL_ACTIVATION_BY_CLICK
2187 #undef wxPG_FL_DONT_CENTER_SPLITTER
2188 #undef wxPG_SUPPORT_TOOLTIPS
2189 #undef wxPG_DOUBLE_BUFFER
2190 #undef wxPG_ICON_WIDTH
2191 #undef wxPG_USE_RENDERER_NATIVE
2192 // Following are needed by the manager headers
2193 // #undef const wxString&
2194 #endif
2195
2196 // Doxygen special
2197 #ifdef DOXYGEN
2198 #include "wx/propgrid/editor.h"
2199 #include "wx/propgrid/manager.h"
2200 #endif
2201
2202 // -----------------------------------------------------------------------
2203
2204 #endif
2205
2206 #endif // _WX_PROPGRID_PROPGRID_H_
2207