1 /////////////////////////////////////////////////////////////////////////////
2 // Name: wx/propgrid/property.h
3 // Purpose: wxPGProperty and related support classes
4 // Author: Jaakko Salli
8 // Copyright: (c) Jaakko Salli
9 // Licence: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
12 #ifndef _WX_PROPGRID_PROPERTY_H_
13 #define _WX_PROPGRID_PROPERTY_H_
17 #include "wx/propgrid/propgriddefs.h"
19 // -----------------------------------------------------------------------
21 #define wxNullProperty ((wxPGProperty*)NULL)
24 /** @class wxPGPaintData
26 Contains information relayed to property's OnCustomPaint.
30 /** wxPropertyGrid. */
31 const wxPropertyGrid
* m_parent
;
34 Normally -1, otherwise index to drop-down list item that has to be
39 /** Set to drawn width in OnCustomPaint (optional). */
43 In a measure item call, set this to the height of item at m_choiceItem
50 // Structure for relaying choice/list info.
53 wxPGChoices
* m_choices
;
60 // space between vertical sides of a custom image
61 #define wxPG_CUSTOM_IMAGE_SPACINGY 1
63 // space between caption and selection rectangle,
64 #define wxPG_CAPRECTXMARGIN 2
66 // horizontally and vertically
67 #define wxPG_CAPRECTYMARGIN 1
70 /** @class wxPGCellRenderer
72 Base class for wxPropertyGrid cell renderers.
74 class WXDLLIMPEXP_PROPGRID wxPGCellRenderer
78 wxPGCellRenderer( unsigned int refCount
= 1 )
79 : m_refCount(refCount
) { }
80 virtual ~wxPGCellRenderer() { }
85 Selected
= 0x00010000,
89 virtual void Render( wxDC
& dc
,
91 const wxPropertyGrid
* propertyGrid
,
92 wxPGProperty
* property
,
95 int flags
) const = 0;
97 /** Returns size of the image in front of the editable area.
99 If property is NULL, then this call is for a custom value. In that case
100 the item is index to wxPropertyGrid's custom values.
102 virtual wxSize
GetImageSize( const wxPGProperty
* property
,
106 /** Paints property category selection rectangle.
108 virtual void DrawCaptionSelectionRect( wxDC
& dc
,
110 int w
, int h
) const;
112 /** Utility to draw vertically centered text.
114 void DrawText( wxDC
& dc
,
117 const wxString
& text
) const;
120 Utility to draw editor's value, or vertically aligned text if editor is
123 void DrawEditorValue( wxDC
& dc
, const wxRect
& rect
,
124 int xOffset
, const wxString
& text
,
125 wxPGProperty
* property
,
126 const wxPGEditor
* editor
) const;
128 /** Utility to render cell bitmap and set text colour plus bg brush colour.
130 Returns image width that, for instance, can be passed to DrawText.
132 int PreDrawCell( wxDC
& dc
,
134 const wxPGCell
& cell
,
151 unsigned int m_refCount
;
157 Base class for simple wxPropertyGrid cell information.
159 class WXDLLIMPEXP_PROPGRID wxPGCell
163 wxPGCell( const wxString
& text
,
164 const wxBitmap
& bitmap
= wxNullBitmap
,
165 const wxColour
& fgCol
= wxNullColour
,
166 const wxColour
& bgCol
= wxNullColour
);
168 virtual ~wxPGCell() { }
170 void SetText( const wxString
& text
) { m_text
= text
; }
171 void SetBitmap( const wxBitmap
& bitmap
) { m_bitmap
= bitmap
; }
172 void SetFgCol( const wxColour
& col
) { m_fgCol
= col
; }
173 void SetBgCol( const wxColour
& col
) { m_bgCol
= col
; }
175 const wxString
& GetText() const { return m_text
; }
176 const wxBitmap
& GetBitmap() const { return m_bitmap
; }
177 const wxColour
& GetFgCol() const { return m_fgCol
; }
178 const wxColour
& GetBgCol() const { return m_bgCol
; }
188 /** @class wxPGDefaultRenderer
190 Default cell renderer, that can handles the common
193 class WXDLLIMPEXP_PROPGRID wxPGDefaultRenderer
: public wxPGCellRenderer
196 virtual void Render( wxDC
& dc
,
198 const wxPropertyGrid
* propertyGrid
,
199 wxPGProperty
* property
,
204 virtual wxSize
GetImageSize( const wxPGProperty
* property
,
211 // -----------------------------------------------------------------------
213 /** @class wxPGAttributeStorage
215 wxPGAttributeStorage is somewhat optimized storage for
216 key=variant pairs (ie. a map).
218 class WXDLLIMPEXP_PROPGRID wxPGAttributeStorage
221 wxPGAttributeStorage();
222 ~wxPGAttributeStorage();
224 void Set( const wxString
& name
, const wxVariant
& value
);
225 size_t GetCount() const { return m_map
.size(); }
226 wxVariant
FindValue( const wxString
& name
) const
228 wxPGHashMapS2P::const_iterator it
= m_map
.find(name
);
229 if ( it
!= m_map
.end() )
231 wxVariantData
* data
= (wxVariantData
*) it
->second
;
233 return wxVariant(data
, it
->first
);
238 typedef wxPGHashMapS2P::const_iterator const_iterator
;
239 const_iterator
StartIteration() const
241 return m_map
.begin();
243 bool GetNext( const_iterator
& it
, wxVariant
& variant
) const
245 if ( it
== m_map
.end() )
248 wxVariantData
* data
= (wxVariantData
*) it
->second
;
250 variant
.SetData(data
);
251 variant
.SetName(it
->first
);
257 wxPGHashMapS2P m_map
;
262 // -----------------------------------------------------------------------
264 /** @section propgrid_propflags wxPGProperty Flags
268 enum wxPG_PROPERTY_FLAGS
271 /** Indicates bold font.
273 wxPG_PROP_MODIFIED
= 0x0001,
275 /** Disables ('greyed' text and editor does not activate) property.
277 wxPG_PROP_DISABLED
= 0x0002,
279 /** Hider button will hide this property.
281 wxPG_PROP_HIDDEN
= 0x0004,
283 /** This property has custom paint image just in front of its value.
284 If property only draws custom images into a popup list, then this
285 flag should not be set.
287 wxPG_PROP_CUSTOMIMAGE
= 0x0008,
289 /** Do not create text based editor for this property (but button-triggered
290 dialog and choice are ok).
292 wxPG_PROP_NOEDITOR
= 0x0010,
294 /** Property is collapsed, ie. it's children are hidden.
296 wxPG_PROP_COLLAPSED
= 0x0020,
299 If property is selected, then indicates that validation failed for pending
302 If property is not selected, then indicates that the the actual property
303 value has failed validation (NB: this behavior is not currently supported,
304 but may be used in future).
306 wxPG_PROP_INVALID_VALUE
= 0x0040,
310 /** Switched via SetWasModified(). Temporary flag - only used when
311 setting/changing property value.
313 wxPG_PROP_WAS_MODIFIED
= 0x0200,
316 If set, then child properties (if any) are private, and should be
317 "invisible" to the application.
319 wxPG_PROP_AGGREGATE
= 0x0400,
321 /** If set, then child properties (if any) are copies and should not
324 wxPG_PROP_CHILDREN_ARE_COPIES
= 0x0800,
327 Classifies this item as a non-category.
329 Used for faster item type identification.
331 wxPG_PROP_PROPERTY
= 0x1000,
334 Classifies this item as a category.
336 Used for faster item type identification.
338 wxPG_PROP_CATEGORY
= 0x2000,
340 /** Classifies this item as a property that has children, but is not aggregate
341 (ie children are not private).
343 wxPG_PROP_MISC_PARENT
= 0x4000,
345 /** Property is read-only. Editor is still created.
347 wxPG_PROP_READONLY
= 0x8000,
350 // NB: FLAGS ABOVE 0x8000 CANNOT BE USED WITH PROPERTY ITERATORS
353 /** Property's value is composed from values of child properties.
355 This flag cannot be used with property iterators.
357 wxPG_PROP_COMPOSED_VALUE
= 0x00010000,
359 /** Common value of property is selectable in editor.
361 This flag cannot be used with property iterators.
363 wxPG_PROP_USES_COMMON_VALUE
= 0x00020000,
365 /** Property can be set to unspecified value via editor.
366 Currently, this applies to following properties:
367 - wxIntProperty, wxUIntProperty, wxFloatProperty, wxEditEnumProperty:
371 This flag cannot be used with property iterators.
373 wxPG_PROP_AUTO_UNSPECIFIED
= 0x00040000,
375 /** Indicates the bit useable by derived properties.
377 wxPG_PROP_CLASS_SPECIFIC_1
= 0x00080000,
379 /** Indicates the bit useable by derived properties.
381 wxPG_PROP_CLASS_SPECIFIC_2
= 0x00100000
387 #define wxPG_PROP_MAX wxPG_PROP_AUTO_UNSPECIFIED
389 /** Property with children must have one of these set, otherwise iterators
390 will not work correctly.
391 Code should automatically take care of this, however.
393 #define wxPG_PROP_PARENTAL_FLAGS \
394 (wxPG_PROP_AGGREGATE|wxPG_PROP_CATEGORY|wxPG_PROP_MISC_PARENT)
399 // Amalgam of flags that should be inherited by sub-properties
400 #define wxPG_INHERITED_PROPFLAGS (wxPG_PROP_HIDDEN|wxPG_PROP_NOEDITOR)
402 // Combination of flags that can be stored by GetFlagsAsString
403 #define wxPG_STRING_STORED_FLAGS \
404 (wxPG_PROP_DISABLED|wxPG_PROP_HIDDEN|wxPG_PROP_NOEDITOR|wxPG_PROP_COLLAPSED)
406 // -----------------------------------------------------------------------
411 @section propgrid_property_attributes wxPropertyGrid Property Attribute
414 wxPGProperty::SetAttribute() and
415 wxPropertyGridInterfaces::SetPropertyAttribute() accept one of these as
416 attribute name argument.
418 You can use strings instead of constants. However, some of these
419 constants are redefined to use cached strings which may reduce
420 your binary size by some amount.
425 /** Set default value for property.
427 #define wxPG_ATTR_DEFAULT_VALUE wxS("DefaultValue")
429 /** Universal, int or double. Minimum value for numeric properties.
431 #define wxPG_ATTR_MIN wxS("Min")
433 /** Universal, int or double. Maximum value for numeric properties.
435 #define wxPG_ATTR_MAX wxS("Max")
437 /** Universal, string. When set, will be shown as text after the displayed
438 text value. Alternatively, if third column is enabled, text will be shown
439 there (for any type of property).
441 #define wxPG_ATTR_UNITS wxS("Units")
443 /** Universal, string. When set, will be shown in property's value cell
444 when displayed value string is empty, or value is unspecified.
446 #define wxPG_ATTR_INLINE_HELP wxS("InlineHelp")
448 /** wxBoolProperty specific, int, default 0. When 1 sets bool property to
449 use checkbox instead of choice.
451 #define wxPG_BOOL_USE_CHECKBOX wxS("UseCheckbox")
453 /** wxBoolProperty specific, int, default 0. When 1 sets bool property value
454 to cycle on double click (instead of showing the popup listbox).
456 #define wxPG_BOOL_USE_DOUBLE_CLICK_CYCLING wxS("UseDClickCycling")
459 wxFloatProperty (and similar) specific, int, default -1.
461 Sets the (max) precision used when floating point value is rendered as
462 text. The default -1 means infinite precision.
464 #define wxPG_FLOAT_PRECISION wxS("Precision")
467 The text will be echoed as asterisks (wxTE_PASSWORD will be passed to
470 #define wxPG_STRING_PASSWORD wxS("Password")
472 /** Define base used by a wxUIntProperty. Valid constants are
473 wxPG_BASE_OCT, wxPG_BASE_DEC, wxPG_BASE_HEX and wxPG_BASE_HEXL
474 (lowercase characters).
476 #define wxPG_UINT_BASE wxS("Base")
478 /** Define prefix rendered to wxUIntProperty. Accepted constants
479 wxPG_PREFIX_NONE, wxPG_PREFIX_0x, and wxPG_PREFIX_DOLLAR_SIGN.
480 <b>Note:</b> Only wxPG_PREFIX_NONE works with Decimal and Octal
483 #define wxPG_UINT_PREFIX wxS("Prefix")
486 wxFileProperty/wxImageFileProperty specific, wxChar*, default is
488 Sets the wildcard used in the triggered wxFileDialog. Format is the same.
490 #define wxPG_FILE_WILDCARD wxS("Wildcard")
492 /** wxFileProperty/wxImageFileProperty specific, int, default 1.
493 When 0, only the file name is shown (i.e. drive and directory are hidden).
495 #define wxPG_FILE_SHOW_FULL_PATH wxS("ShowFullPath")
497 /** Specific to wxFileProperty and derived properties, wxString, default empty.
498 If set, then the filename is shown relative to the given path string.
500 #define wxPG_FILE_SHOW_RELATIVE_PATH wxS("ShowRelativePath")
503 Specific to wxFileProperty and derived properties, wxString, default is
506 Sets the initial path of where to look for files.
508 #define wxPG_FILE_INITIAL_PATH wxS("InitialPath")
510 /** Specific to wxFileProperty and derivatives, wxString, default is empty.
511 Sets a specific title for the dir dialog.
513 #define wxPG_FILE_DIALOG_TITLE wxS("DialogTitle")
515 /** Specific to wxDirProperty, wxString, default is empty.
516 Sets a specific message for the dir dialog.
518 #define wxPG_DIR_DIALOG_MESSAGE wxS("DialogMessage")
520 /** Sets displayed date format for wxDateProperty.
522 #define wxPG_DATE_FORMAT wxS("DateFormat")
524 /** Sets wxDatePickerCtrl window style used with wxDateProperty. Default
525 is wxDP_DEFAULT | wxDP_SHOWCENTURY.
527 #define wxPG_DATE_PICKER_STYLE wxS("PickerStyle")
529 /** SpinCtrl editor, int or double. How much number changes when button is
530 pressed (or up/down on keybard).
532 #define wxPG_ATTR_SPINCTRL_STEP wxS("Step")
534 /** SpinCtrl editor, bool. If true, value wraps at Min/Max.
536 #define wxPG_ATTR_SPINCTRL_WRAP wxS("Wrap")
539 wxMultiChoiceProperty, int.
540 If 0, no user strings allowed. If 1, user strings appear before list
541 strings. If 2, user strings appear after list string.
543 #define wxPG_ATTR_MULTICHOICE_USERSTRINGMODE wxS("UserStringMode")
546 wxColourProperty and its kind, int, default 1.
548 Setting this attribute to 0 hides custom colour from property's list of
551 #define wxPG_COLOUR_ALLOW_CUSTOM wxS("AllowCustom")
553 /** First attribute id that is guaranteed not to be used built-in
556 //#define wxPG_USER_ATTRIBUTE 192
563 // Redefine attribute macros to use cached strings
565 #define wxPG_ATTR_MIN wxPGGlobalVars->m_strMin
567 #define wxPG_ATTR_MAX wxPGGlobalVars->m_strMax
568 #undef wxPG_ATTR_UNITS
569 #define wxPG_ATTR_UNITS wxPGGlobalVars->m_strUnits
570 #undef wxPG_ATTR_INLINE_HELP
571 #define wxPG_ATTR_INLINE_HELP wxPGGlobalVars->m_strInlineHelp
577 // -----------------------------------------------------------------------
579 /** @class wxPGProperty
581 wxPGProperty is base class for all wxPropertyGrid properties. In
582 sections below we cover few related topics.
584 @li @ref pgproperty_properties
585 @li @ref pgproperty_creating
587 @section pgproperty_properties Supplied Ready-to-use Property Classes
589 Here is a list and short description of supplied fully-functional
590 property classes. They are located in either props.h or advprops.h.
592 @li @ref wxArrayStringProperty
593 @li @ref wxBoolProperty
594 @li @ref wxColourProperty
595 @li @ref wxCursorProperty
596 @li @ref wxDateProperty
597 @li @ref wxDirProperty
598 @li @ref wxEditEnumProperty
599 @li @ref wxEnumProperty
600 @li @ref wxFileProperty
601 @li @ref wxFlagsProperty
602 @li @ref wxFloatProperty
603 @li @ref wxFontProperty
604 @li @ref wxImageFileProperty
605 @li @ref wxIntProperty
606 @li @ref wxLongStringProperty
607 @li @ref wxMultiChoiceProperty
608 @li @ref wxPropertyCategory
609 @li @ref wxStringProperty
610 @li @ref wxSystemColourProperty
611 @li @ref wxUIntProperty
613 @subsection wxPropertyCategory
615 Not an actual property per se, but a header for a group of properties.
616 Regardless inherits from wxPGProperty.
618 @subsection wxStringProperty
620 Simple string property. wxPG_STRING_PASSWORD attribute may be used
621 to echo value as asterisks and use wxTE_PASSWORD for wxTextCtrl.
624 * wxStringProperty has a special trait: if it has value of "<composed>",
625 and also has child properties, then its displayed value becomes
626 composition of child property values, similar as with wxFontProperty,
629 @subsection wxIntProperty
631 Like wxStringProperty, but converts text to a signed long integer.
632 wxIntProperty seamlessly supports 64-bit integers (ie. wxLongLong).
634 @subsection wxUIntProperty
636 Like wxIntProperty, but displays value as unsigned int. To set
637 the prefix used globally, manipulate wxPG_UINT_PREFIX string attribute.
638 To set the globally used base, manipulate wxPG_UINT_BASE int
639 attribute. Regardless of current prefix, understands (hex) values starting
640 with both "0x" and "$".
641 wxUIntProperty seamlessly supports 64-bit unsigned integers (ie.
644 @subsection wxFloatProperty
646 Like wxStringProperty, but converts text to a double-precision floating
647 point. Default float-to-text precision is 6 decimals, but this can be
648 changed by modifying wxPG_FLOAT_PRECISION attribute.
650 @subsection wxBoolProperty
652 Represents a boolean value. wxChoice is used as editor control, by the
653 default. wxPG_BOOL_USE_CHECKBOX attribute can be set to true inorder to use
656 @subsection wxLongStringProperty
658 Like wxStringProperty, but has a button that triggers a small text editor
659 dialog. Note that in long string values, tabs are represented by "\t" and
662 @subsection wxDirProperty
664 Like wxLongStringProperty, but the button triggers dir selector instead.
665 Supported properties (all with string value): wxPG_DIR_DIALOG_MESSAGE.
667 @subsection wxFileProperty
669 Like wxLongStringProperty, but the button triggers file selector instead.
670 Default wildcard is "All files..." but this can be changed by setting
671 wxPG_FILE_WILDCARD attribute (see wxFileDialog for format details).
672 Attribute wxPG_FILE_SHOW_FULL_PATH can be set to false inorder to show
673 only the filename, not the entire path.
675 @subsection wxEnumProperty
677 Represents a single selection from a list of choices -
678 wxOwnerDrawnComboBox is used to edit the value.
680 @subsection wxFlagsProperty
682 Represents a bit set that fits in a long integer. wxBoolProperty
683 sub-properties are created for editing individual bits. Textctrl is created
684 to manually edit the flags as a text; a continous sequence of spaces,
685 commas and semicolons is considered as a flag id separator.
686 <b>Note: </b> When changing "choices" (ie. flag labels) of wxFlagsProperty,
687 you will need to use SetPropertyChoices - otherwise they will not get
690 @subsection wxArrayStringProperty
692 Allows editing of a list of strings in wxTextCtrl and in a separate dialog.
694 @subsection wxDateProperty
696 wxDateTime property. Default editor is DatePickerCtrl, altough TextCtrl
697 should work as well. wxPG_DATE_FORMAT attribute can be used to change
698 string wxDateTime::Format uses (altough default is recommended as it is
699 locale-dependant), and wxPG_DATE_PICKER_STYLE allows changing window
700 style given to DatePickerCtrl (default is wxDP_DEFAULT|wxDP_SHOWCENTURY).
702 @subsection wxEditEnumProperty
704 Represents a string that can be freely edited or selected from list of
705 choices - custom combobox control is used to edit the value.
707 @subsection wxMultiChoiceProperty
709 Allows editing a multiple selection from a list of strings. This is
710 property is pretty much built around concept of wxMultiChoiceDialog.
711 It uses wxArrayString value.
713 @subsection wxImageFileProperty
715 Like wxFileProperty, but has thumbnail of the image in front of
716 the filename and autogenerates wildcard from available image handlers.
718 @subsection wxColourProperty
720 <b>Useful alternate editor:</b> Choice.
722 Represents wxColour. wxButton is used to trigger a colour picker dialog.
724 @subsection wxFontProperty
726 Represents wxFont. Various sub-properties are used to edit individual
729 @subsection wxSystemColourProperty
731 Represents wxColour and a system colour index. wxChoice is used to edit
732 the value. Drop-down list has color images. Note that value type
733 is wxColourPropertyValue instead of wxColour.
735 class wxColourPropertyValue : public wxObject
738 // An integer value relating to the colour, and which exact
739 // meaning depends on the property with which it is used.
741 // For wxSystemColourProperty:
742 // Any of wxSYS_COLOUR_XXX, or any web-colour (use
743 // wxPG_TO_WEB_COLOUR macro - (currently unsupported) ),
744 // or wxPG_COLOUR_CUSTOM.
747 // Resulting colour. Should be correct regardless of type.
752 @subsection wxCursorProperty
754 Represents a wxCursor. wxChoice is used to edit the value.
755 Drop-down list has cursor images under some (wxMSW) platforms.
758 @section pgproperty_creating Creating Custom Properties
760 New properties can be created by subclassing wxPGProperty or one
761 of the provided property classes, and (re)implementing necessary
762 member functions. Below, each virtual member function has ample
763 documentation about its purpose and any odd details which to keep
766 Here is a very simple 'template' code:
769 class MyProperty : public wxPGProperty
772 // All arguments of ctor must have a default value -
773 // use wxPG_LABEL for label and name
774 MyProperty( const wxString& label = wxPG_LABEL,
775 const wxString& name = wxPG_LABEL,
776 const wxString& value = wxEmptyString )
778 // m_value is wxVariant
782 virtual ~MyProperty() { }
784 const wxPGEditor* DoGetEditorClass() const
786 // Determines editor used by property.
787 // You can replace 'TextCtrl' below with any of these
788 // builtin-in property editor identifiers: Choice, ComboBox,
789 // TextCtrlAndButton, ChoiceAndButton, CheckBox, SpinCtrl,
791 return wxPGEditor_TextCtrl;
794 virtual wxString GetValueAsString( int argFlags ) const
796 // TODO: Return property value in string format
799 virtual bool StringToValue( wxVariant& variant,
800 const wxString& text,
803 // TODO: Adapt string to property value.
810 Since wxPGProperty derives from wxObject, you can use standard
811 DECLARE_DYNAMIC_CLASS and IMPLEMENT_DYNAMIC_CLASS macros. From the
812 above example they were omitted for sake of simplicity, and besides,
813 they are only really needed if you need to use wxRTTI with your
816 You can change the 'value type' of a property by simply assigning different
817 type of variant with SetValue. <b>It is mandatory to implement
818 wxVariantData class for all data types used as property values.</b>
819 You can use macros declared in wxPropertyGrid headers. For instance:
823 // (If you need to have export declaration, use version of macros
824 // with _EXPORTED postfix)
825 WX_PG_DECLARE_VARIANT_DATA(MyDataClass)
828 WX_PG_IMPLEMENT_VARIANT_DATA(MyDataClass)
830 // Or, if you don't have valid == operator:
831 WX_PG_IMPLEMENT_VARIANT_DATA_DUMMY_EQ(MyDataClass)
837 class WXDLLIMPEXP_PROPGRID wxPGProperty
: public wxObject
839 friend class wxPropertyGrid
;
840 friend class wxPropertyGridInterface
;
841 friend class wxPropertyGridPageState
;
842 friend class wxPropertyGridPopulator
;
843 friend class wxStringProperty
; // Proper "<composed>" support requires this
845 DECLARE_ABSTRACT_CLASS(wxPGProperty
)
848 typedef wxUint32 FlagType
;
850 /** Basic constructor.
855 Non-abstract property classes should have constructor of this style:
859 // If T is a class, then it should be a constant reference
860 // (e.g. const T& ) instead.
861 MyProperty( const wxString& label, const wxString& name, T value )
864 // Generally recommended way to set the initial value
865 // (as it should work in pretty much 100% of cases).
870 // If has private child properties then create them here, e.g.:
871 // AddChild( new wxStringProperty( "Subprop 1",
873 // value.GetSubProp1() ) );
878 wxPGProperty( const wxString
& label
, const wxString
& name
);
882 It is customary for derived properties to implement this.
884 virtual ~wxPGProperty();
886 /** This virtual function is called after m_value has been set.
889 - If m_value was set to Null variant (ie. unspecified value),
890 OnSetValue() will not be called.
891 - m_value may be of any variant type. Typically properties internally
892 support only one variant type, and as such OnSetValue() provides a
893 good opportunity to convert
894 supported values into internal type.
895 - Default implementation does nothing.
897 virtual void OnSetValue();
899 /** Override this to return something else than m_value as the value.
901 virtual wxVariant
DoGetValue() const { return m_value
; }
903 #if !defined(SWIG) || defined(CREATE_VCW)
904 /** Implement this function in derived class to check the value.
905 Return true if it is ok. Returning false prevents property change events
909 - Default implementation always returns true.
911 virtual bool ValidateValue( wxVariant
& value
,
912 wxPGValidationInfo
& validationInfo
) const;
915 Converts 'text' into proper value 'variant'.
916 Returns true if new (different than m_value) value could be interpreted
919 If wxPG_FULL_VALUE is set, returns complete, storable value instead
920 of displayable one (they may be different).
921 If wxPG_COMPOSITE_FRAGMENT is set, text is interpreted as a part of
922 composite property string value (as generated by GetValueAsString()
923 called with this same flag).
926 Default implementation converts semicolon delimited tokens into child
927 values. Only works for properties with children.
929 virtual bool StringToValue( wxVariant
& variant
,
930 const wxString
& text
,
931 int argFlags
= 0 ) const;
934 Converts 'number' (including choice selection) into proper value
937 Returns true if new (different than m_value) value could be interpreted
941 If wxPG_FULL_VALUE is set, returns complete, storable value instead
945 - If property is not supposed to use choice or spinctrl or other editor
946 with int-based value, it is not necessary to implement this method.
947 - Default implementation simply assign given int to m_value.
948 - If property uses choice control, and displays a dialog on some choice
949 items, then it is preferred to display that dialog in IntToValue
952 virtual bool IntToValue( wxVariant
& value
,
954 int argFlags
= 0 ) const;
955 #endif // !defined(SWIG) || defined(CREATE_VCW)
958 /** Returns text representation of property's value.
961 If wxPG_FULL_VALUE is set, returns complete, storable string value
962 instead of displayable. If wxPG_EDITABLE_VALUE is set, returns
963 string value that must be editable in textctrl. If
964 wxPG_COMPOSITE_FRAGMENT is set, returns text that is appropriate to
965 display as a part of composite property string value.
968 Default implementation returns string composed from text
969 representations of child properties.
971 virtual wxString
GetValueAsString( int argFlags
= 0 ) const;
973 /** Converts string to a value, and if successful, calls SetValue() on it.
974 Default behavior is to do nothing.
976 String to get the value from.
978 true if value was changed.
980 bool SetValueFromString( const wxString
& text
, int flags
= 0 );
982 /** Converts integer to a value, and if succesful, calls SetValue() on it.
983 Default behavior is to do nothing.
985 Int to get the value from.
987 If has wxPG_FULL_VALUE, then the value given is a actual value and
990 True if value was changed.
992 bool SetValueFromInt( long value
, int flags
= 0 );
995 Returns size of the custom painted image in front of property.
997 This method must be overridden to return non-default value if
998 OnCustomPaint is to be called.
1000 Normally -1, but can be an index to the property's list of items.
1002 - Default behavior is to return wxSize(0,0), which means no image.
1003 - Default image width or height is indicated with dimension -1.
1004 - You can also return wxPG_DEFAULT_IMAGE_SIZE, i.e. wxSize(-1, -1).
1006 virtual wxSize
OnMeasureImage( int item
= -1 ) const;
1009 Events received by editor widgets are processed here.
1011 Note that editor class usually processes most events. Some, such as
1012 button press events of TextCtrlAndButton class, can be handled here.
1013 Also, if custom handling for regular events is desired, then that can
1014 also be done (for example, wxSystemColourProperty custom handles
1015 wxEVT_COMMAND_CHOICE_SELECTED to display colour picker dialog when
1016 'custom' selection is made).
1018 If the event causes value to be changed, SetValueInEvent()
1019 should be called to set the new value.
1024 Should return true if any changes in value should be reported.
1026 If property uses choice control, and displays a dialog on some choice
1027 items, then it is preferred to display that dialog in IntToValue
1030 virtual bool OnEvent( wxPropertyGrid
* propgrid
,
1031 wxWindow
* wnd_primary
,
1035 Called after value of a child property has been altered.
1037 Note that this function is usually called at the time that value of
1038 this property, or given child property, is still pending for change.
1040 Sample pseudo-code implementation:
1043 void MyProperty::ChildChanged( wxVariant& thisValue,
1045 wxVariant& childValue ) const
1047 // Acquire reference to actual type of data stored in variant
1048 // (TFromVariant only exists if wxPropertyGrid's wxVariant-macros
1049 // were used to create the variant class).
1050 T& data = TFromVariant(thisValue);
1052 // Copy childValue into data.
1053 switch ( childIndex )
1056 data.SetSubProp1( childvalue.GetLong() );
1059 data.SetSubProp2( childvalue.GetString() );
1067 Value of this property, that should be altered.
1069 Index of child changed (you can use Item(childIndex) to get).
1071 Value of the child property.
1073 virtual void ChildChanged( wxVariant
& thisValue
,
1075 wxVariant
& childValue
) const;
1077 /** Returns pointer to an instance of used editor.
1079 virtual const wxPGEditor
* DoGetEditorClass() const;
1081 /** Returns pointer to the wxValidator that should be used
1082 with the editor of this property (NULL for no validator).
1083 Setting validator explicitly via SetPropertyValidator
1086 In most situations, code like this should work well
1087 (macros are used to maintain one actual validator instance,
1088 so on the second call the function exits within the first
1093 wxValidator* wxMyPropertyClass::DoGetValidator () const
1095 WX_PG_DOGETVALIDATOR_ENTRY()
1097 wxMyValidator* validator = new wxMyValidator(...);
1099 ... prepare validator...
1101 WX_PG_DOGETVALIDATOR_EXIT(validator)
1107 You can get common filename validator by returning
1108 wxFileProperty::GetClassValidator(). wxDirProperty,
1109 for example, uses it.
1111 virtual wxValidator
* DoGetValidator () const;
1114 Returns current value's index to the choice control.
1116 May also return, through pointer arguments, strings that should be
1117 inserted to that control. Irrelevant to classes which do not employ
1118 wxPGEditor_Choice or similar.
1121 - If returns NULL in choiceinfo.m_choices, then this class must be
1122 derived from wxBaseEnumProperty.
1123 - Must be able to cope situation where property's set of choices is
1126 virtual int GetChoiceInfo( wxPGChoiceInfo
* choiceinfo
);
1129 Override to paint an image in front of the property value text or
1130 drop-down list item (but only if wxPGProperty::OnMeasureImage is
1131 overridden as well).
1133 If property's OnMeasureImage() returns size that has height != 0 but
1134 less than row height ( < 0 has special meanings), wxPropertyGrid calls
1135 this method to draw a custom image in a limited area in front of the
1136 editor control or value text/graphics, and if control has drop-down
1137 list, then the image is drawn there as well (even in the case
1138 OnMeasureImage() returned higher height than row height).
1140 NOTE: Following applies when OnMeasureImage() returns a "flexible"
1141 height ( using wxPG_FLEXIBLE_SIZE(W,H) macro), which implies variable
1142 height items: If rect.x is < 0, then this is a measure item call, which
1143 means that dc is invalid and only thing that should be done is to set
1144 paintdata.m_drawnHeight to the height of the image of item at index
1145 paintdata.m_choiceItem. This call may be done even as often as once
1146 every drop-down popup show.
1151 Box reserved for custom graphics. Includes surrounding rectangle,
1152 if any. If x is < 0, then this is a measure item call (see above).
1154 wxPGPaintData structure with much useful data.
1157 - You can actually exceed rect width, but if you do so then
1158 paintdata.m_drawnWidth must be set to the full width drawn in
1160 - Due to technical reasons, rect's height will be default even if
1161 custom height was reported during measure call.
1162 - Brush is guaranteed to be default background colour. It has been
1163 already used to clear the background of area being painted. It
1165 - Pen is guaranteed to be 1-wide 'black' (or whatever is the proper
1166 colour) pen for drawing framing rectangle. It can be changed as
1169 @see GetValueAsString()
1171 virtual void OnCustomPaint( wxDC
& dc
,
1173 wxPGPaintData
& paintdata
);
1176 Returns used wxPGCellRenderer instance for given property column
1179 Default implementation returns editor's renderer for all columns.
1181 virtual wxPGCellRenderer
* GetCellRenderer( int column
) const;
1184 Refresh values of child properties.
1186 Automatically called after value is set.
1188 virtual void RefreshChildren();
1190 /** Special handling for attributes of this property.
1192 If returns false, then the attribute will be automatically stored in
1195 Default implementation simply returns false.
1197 virtual bool DoSetAttribute( const wxString
& name
, wxVariant
& value
);
1199 /** Returns value of an attribute.
1201 Override if custom handling of attributes is needed.
1203 Default implementation simply return NULL variant.
1205 virtual wxVariant
DoGetAttribute( const wxString
& name
) const;
1207 /** Returns instance of a new wxPGEditorDialogAdapter instance, which is
1208 used when user presses the (optional) button next to the editor control;
1210 Default implementation returns NULL (ie. no action is generated when
1213 virtual wxPGEditorDialogAdapter
* GetEditorDialog() const;
1216 Adds entry to property's wxPGChoices and editor control (if it is
1219 Returns index of item added.
1221 int AppendChoice( const wxString
& label
, int value
= wxPG_INVALID_VALUE
)
1223 return InsertChoice(label
,-1,value
);
1226 /** Returns wxPGCell of given column, NULL if none. If valid
1227 object is returned, caller will gain its ownership.
1229 wxPGCell
* AcquireCell( unsigned int column
)
1231 if ( column
>= m_cells
.size() )
1234 wxPGCell
* cell
= (wxPGCell
*) m_cells
[column
];
1235 m_cells
[column
] = NULL
;
1240 Returns true if children of this property are component values (for
1241 instance, points size, face name, and is_underlined are component
1244 bool AreChildrenComponents() const
1246 if ( m_flags
& (wxPG_PROP_COMPOSED_VALUE
|wxPG_PROP_AGGREGATE
) )
1253 Removes entry from property's wxPGChoices and editor control (if it is
1256 If selected item is deleted, then the value is set to unspecified.
1258 void DeleteChoice( int index
);
1261 Call to enable or disable usage of common value (integer value that can
1262 be selected for properties instead of their normal values) for this
1265 Common values are disabled by the default for all properties.
1267 void EnableCommonValue( bool enable
= true )
1269 if ( enable
) SetFlag( wxPG_PROP_USES_COMMON_VALUE
);
1270 else ClearFlag( wxPG_PROP_USES_COMMON_VALUE
);
1273 /** Composes text from values of child properties. */
1274 void GenerateComposedValue( wxString
& text
, int argFlags
= 0 ) const;
1276 /** Returns property's label. */
1277 const wxString
& GetLabel() const { return m_label
; }
1279 /** Returns property's name with all (non-category, non-root) parents. */
1280 wxString
GetName() const;
1283 Returns property's base name (ie parent's name is not added in any
1286 const wxString
& GetBaseName() const { return m_name
; }
1288 wxPGChoices
& GetChoices();
1290 const wxPGChoices
& GetChoices() const;
1292 const wxPGChoiceEntry
* GetCurrentChoice() const;
1294 /** Returns coordinate to the top y of the property. Note that the
1295 position of scrollbars is not taken into account.
1299 wxVariant
GetValue() const
1301 return DoGetValue();
1305 /** Returns reference to the internal stored value. GetValue is preferred
1306 way to get the actual value, since GetValueRef ignores DoGetValue,
1307 which may override stored value.
1309 wxVariant
& GetValueRef()
1314 const wxVariant
& GetValueRef() const
1320 /** Same as GetValueAsString, except takes common value into account.
1322 wxString
GetValueString( int argFlags
= 0 ) const;
1324 void UpdateControl( wxWindow
* primary
);
1326 /** Returns wxPGCell of given column, NULL if none. wxPGProperty
1327 will retain ownership of the cell object.
1329 wxPGCell
* GetCell( unsigned int column
) const
1331 if ( column
>= m_cells
.size() )
1334 return (wxPGCell
*) m_cells
[column
];
1337 unsigned int GetChoiceCount() const;
1339 wxString
GetChoiceString( unsigned int index
);
1341 /** Return number of displayed common values for this property.
1343 int GetDisplayedCommonValueCount() const;
1345 wxString
GetDisplayedString() const
1347 return GetValueString(0);
1350 /** Returns property grid where property lies. */
1351 wxPropertyGrid
* GetGrid() const;
1353 /** Returns owner wxPropertyGrid, but only if one is currently on a page
1354 displaying this property. */
1355 wxPropertyGrid
* GetGridIfDisplayed() const;
1357 /** Returns highest level non-category, non-root parent. Useful when you
1358 have nested wxCustomProperties/wxParentProperties.
1360 Thus, if immediate parent is root or category, this will return the
1363 wxPGProperty
* GetMainParent() const;
1365 /** Return parent of property */
1366 wxPGProperty
* GetParent() const { return m_parent
; }
1368 /** Returns true if property has editable wxTextCtrl when selected.
1371 Altough disabled properties do not displayed editor, they still
1372 return True here as being disabled is considered a temporary
1373 condition (unlike being read-only or having limited editing enabled).
1375 bool IsTextEditable() const;
1377 bool IsValueUnspecified() const
1379 return m_value
.IsNull();
1382 FlagType
HasFlag( FlagType flag
) const
1384 return ( m_flags
& flag
);
1387 /** Returns comma-delimited string of property attributes.
1389 const wxPGAttributeStorage
& GetAttributes() const
1391 return m_attributes
;
1394 /** Returns m_attributes as list wxVariant.
1396 wxVariant
GetAttributesAsList() const;
1398 FlagType
GetFlags() const
1403 const wxPGEditor
* GetEditorClass() const;
1405 wxString
GetValueType() const
1407 return m_value
.GetType();
1410 /** Returns editor used for given column. NULL for no editor.
1412 const wxPGEditor
* GetColumnEditor( int column
) const
1415 return GetEditorClass();
1420 /** Returns common value selected for this property. -1 for none.
1422 int GetCommonValue() const
1424 return m_commonValue
;
1427 /** Returns true if property has even one visible child.
1429 bool HasVisibleChildren() const;
1432 Adds entry to property's wxPGChoices and editor control (if it is
1435 Returns index of item added.
1437 int InsertChoice( const wxString
& label
,
1439 int value
= wxPG_INVALID_VALUE
);
1442 Returns true if this property is actually a wxPropertyCategory.
1444 bool IsCategory() const { return HasFlag(wxPG_PROP_CATEGORY
)?true:false; }
1446 /** Returns true if this property is actually a wxRootProperty.
1448 bool IsRoot() const { return (m_parent
== NULL
); }
1450 /** Returns true if this is a sub-property. */
1451 bool IsSubProperty() const
1453 wxPGProperty
* parent
= (wxPGProperty
*)m_parent
;
1454 if ( parent
&& !parent
->IsCategory() )
1459 /** Returns last visible sub-property, recursively.
1461 const wxPGProperty
* GetLastVisibleSubItem() const;
1463 wxVariant
GetDefaultValue() const;
1465 int GetMaxLength() const
1467 return (int) m_maxLen
;
1471 Determines, recursively, if all children are not unspecified.
1473 Takes values in given list into account.
1475 bool AreAllChildrenSpecified( wxVariant
* pendingList
= NULL
) const;
1477 /** Updates composed values of parent non-category properties, recursively.
1478 Returns topmost property updated.
1481 - Must not call SetValue() (as can be called in it).
1483 wxPGProperty
* UpdateParentValues();
1485 /** Returns true if containing grid uses wxPG_EX_AUTO_UNSPECIFIED_VALUES.
1487 FlagType
UsesAutoUnspecified() const
1489 return HasFlag(wxPG_PROP_AUTO_UNSPECIFIED
);
1492 wxBitmap
* GetValueImage() const
1494 return m_valueBitmap
;
1497 wxVariant
GetAttribute( const wxString
& name
) const;
1500 Returns named attribute, as string, if found.
1502 Otherwise defVal is returned.
1504 wxString
GetAttribute( const wxString
& name
, const wxString
& defVal
) const;
1507 Returns named attribute, as long, if found.
1509 Otherwise defVal is returned.
1511 long GetAttributeAsLong( const wxString
& name
, long defVal
) const;
1514 Returns named attribute, as double, if found.
1516 Otherwise defVal is returned.
1518 double GetAttributeAsDouble( const wxString
& name
, double defVal
) const;
1520 unsigned int GetArrIndex() const { return m_arrIndex
; }
1522 unsigned int GetDepth() const { return (unsigned int)m_depth
; }
1524 /** Gets flags as a'|' delimited string. Note that flag names are not
1525 prepended with 'wxPG_PROP_'.
1527 String will only be made to include flags combined by this parameter.
1529 wxString
GetFlagsAsString( FlagType flagsMask
) const;
1531 /** Returns position in parent's array. */
1532 unsigned int GetIndexInParent() const
1534 return (unsigned int)m_arrIndex
;
1537 /** Hides or reveals the property.
1539 true for hide, false for reveal.
1541 By default changes are applied recursively. Set this paramter
1542 wxPG_DONT_RECURSE to prevent this.
1544 inline bool Hide( bool hide
, int flags
= wxPG_RECURSE
);
1546 bool IsExpanded() const
1547 { return (!(m_flags
& wxPG_PROP_COLLAPSED
) && GetChildCount()); }
1549 /** Returns true if all parents expanded.
1551 bool IsVisible() const;
1553 bool IsEnabled() const { return !(m_flags
& wxPG_PROP_DISABLED
); }
1555 /** If property's editor is created this forces its recreation.
1556 Useful in SetAttribute etc. Returns true if actually did anything.
1558 bool RecreateEditor();
1560 /** If property's editor is active, then update it's value.
1562 void RefreshEditor();
1564 /** Sets an attribute for this property.
1566 Text identifier of attribute. See @ref propgrid_property_attributes.
1570 void SetAttribute( const wxString
& name
, wxVariant value
);
1572 void SetAttributes( const wxPGAttributeStorage
& attributes
);
1575 /** Sets editor for a property.
1578 For builtin editors, use wxPGEditor_X, where X is builtin editor's
1579 name (TextCtrl, Choice, etc. see wxPGEditor documentation for full
1582 For custom editors, use pointer you received from
1583 wxPropertyGrid::RegisterEditorClass().
1585 void SetEditor( const wxPGEditor
* editor
)
1587 m_customEditor
= editor
;
1591 /** Sets editor for a property.
1593 inline void SetEditor( const wxString
& editorName
);
1595 /** Sets cell information for given column.
1597 Note that the property takes ownership of given wxPGCell instance.
1599 void SetCell( int column
, wxPGCell
* cellObj
);
1601 /** Changes value of a property with choices, but only
1602 works if the value type is long or string. */
1603 void SetChoiceSelection( int newValue
, const wxPGChoiceInfo
& choiceInfo
);
1605 /** Sets common value selected for this property. -1 for none.
1607 void SetCommonValue( int commonValue
)
1609 m_commonValue
= commonValue
;
1612 /** Sets flags from a '|' delimited string. Note that flag names are not
1613 prepended with 'wxPG_PROP_'.
1615 void SetFlagsFromString( const wxString
& str
);
1617 /** Sets property's "is it modified?" flag. Affects children recursively.
1619 void SetModifiedStatus( bool modified
)
1621 SetFlagRecursively(wxPG_PROP_MODIFIED
, modified
);
1624 /** Call in OnEvent(), OnButtonClick() etc. to change the property value
1625 based on user input.
1628 This method is const since it doesn't actually modify value, but posts
1629 given variant as pending value, stored in wxPropertyGrid.
1631 void SetValueInEvent( wxVariant value
) const;
1634 Call this to set value of the property.
1636 Unlike methods in wxPropertyGrid, this does not automatically update
1640 Use wxPropertyGrid::ChangePropertyValue() instead if you need to run
1641 through validation process and send property change event.
1643 If you need to change property value in event, based on user input, use
1644 SetValueInEvent() instead.
1647 Pointer to list variant that contains child values. Used to indicate
1648 which children should be marked as modified.
1650 Various flags (for instance, wxPG_SETVAL_REFRESH_EDITOR).
1652 void SetValue( wxVariant value
, wxVariant
* pList
= NULL
, int flags
= 0 );
1654 /** Set wxBitmap in front of the value. This bitmap may be ignored
1655 by custom cell renderers.
1657 void SetValueImage( wxBitmap
& bmp
);
1659 /** If property has choices and they are not yet exclusive, new such copy
1660 of them will be created.
1662 void SetChoicesExclusive();
1664 void SetExpanded( bool expanded
)
1666 if ( !expanded
) m_flags
|= wxPG_PROP_COLLAPSED
;
1667 else m_flags
&= ~wxPG_PROP_COLLAPSED
;
1670 void SetFlag( FlagType flag
) { m_flags
|= flag
; }
1672 void SetFlagRecursively( FlagType flag
, bool set
);
1674 void SetHelpString( const wxString
& helpString
)
1676 m_helpString
= helpString
;
1679 void SetLabel( const wxString
& label
) { m_label
= label
; }
1681 inline void SetName( const wxString
& newName
);
1683 void SetValueToUnspecified()
1685 wxVariant val
; // Create NULL variant
1689 #if wxUSE_VALIDATORS
1690 /** Sets wxValidator for a property*/
1691 void SetValidator( const wxValidator
& validator
)
1693 m_validator
= wxDynamicCast(validator
.Clone(),wxValidator
);
1696 /** Gets assignable version of property's validator. */
1697 wxValidator
* GetValidator() const
1701 return DoGetValidator();
1703 #endif // #if wxUSE_VALIDATORS
1705 /** Updates property value in case there were last minute
1706 changes. If value was unspecified, it will be set to default.
1707 Use only for properties that have TextCtrl-based editor.
1709 If you have code similar to
1711 // Update the value in case of last minute changes
1712 if ( primary && propgrid->IsEditorsValueModified() )
1713 GetEditorClass()->CopyValueFromControl( this, primary );
1715 in wxPGProperty::OnEvent wxEVT_COMMAND_BUTTON_CLICKED handler,
1716 then replace it with call to this method.
1718 True if value changed.
1720 bool PrepareValueForDialogEditing( wxPropertyGrid
* propgrid
);
1723 /** Returns client data (void*) of a property.
1725 void* GetClientData() const
1727 return m_clientData
;
1730 /** Sets client data (void*) of a property.
1732 This untyped client data has to be deleted manually.
1734 void SetClientData( void* clientData
)
1736 m_clientData
= clientData
;
1739 /** Returns client object of a property.
1741 void SetClientObject(wxClientData
* clientObject
)
1743 delete m_clientObject
;
1744 m_clientObject
= clientObject
;
1747 /** Sets managed client object of a property.
1749 wxClientData
*GetClientObject() const { return m_clientObject
; }
1752 /** Sets new set of choices for property.
1755 This operation clears the property value.
1757 bool SetChoices( wxPGChoices
& choices
);
1759 /** Sets new set of choices for property.
1761 inline bool SetChoices( const wxArrayString
& labels
,
1762 const wxArrayInt
& values
= wxArrayInt() );
1764 /** Set max length of text in text editor.
1766 inline bool SetMaxLength( int maxLen
);
1768 /** Call with 'false' in OnSetValue to cancel value changes after all
1769 (ie. cancel 'true' returned by StringToValue() or IntToValue()).
1771 void SetWasModified( bool set
= true )
1773 if ( set
) m_flags
|= wxPG_PROP_WAS_MODIFIED
;
1774 else m_flags
&= ~wxPG_PROP_WAS_MODIFIED
;
1777 const wxString
& GetHelpString() const
1779 return m_helpString
;
1782 void ClearFlag( FlagType flag
) { m_flags
&= ~(flag
); }
1784 // Use, for example, to detect if item is inside collapsed section.
1785 bool IsSomeParent( wxPGProperty
* candidate_parent
) const;
1788 Adapts list variant into proper value using consecutive
1791 void AdaptListToValue( wxVariant
& list
, wxVariant
* value
) const;
1793 /** This is used by properties that have fixed sub-properties. */
1794 void AddChild( wxPGProperty
* prop
);
1796 /** Returns height of children, recursively, and
1797 by taking expanded/collapsed status into account.
1799 iMax is used when finding property y-positions.
1801 int GetChildrenHeight( int lh
, int iMax
= -1 ) const;
1803 /** Returns number of child properties */
1804 unsigned int GetChildCount() const { return m_children
.GetCount(); }
1806 /** Returns sub-property at index i. */
1807 wxPGProperty
* Item( size_t i
) const
1808 { return (wxPGProperty
*)m_children
.Item(i
); }
1810 /** Returns last sub-property.
1812 wxPGProperty
* Last() const { return (wxPGProperty
*)m_children
.Last(); }
1814 /** Returns index of given sub-property. */
1815 int Index( const wxPGProperty
* p
) const
1816 { return m_children
.Index((wxPGProperty
*)p
); }
1818 /** Deletes all sub-properties. */
1821 // Puts correct indexes to children
1822 void FixIndexesOfChildren( size_t starthere
= 0 );
1825 // Returns wxPropertyGridPageState in which this property resides.
1826 wxPropertyGridPageState
* GetParentState() const { return m_parentState
; }
1829 wxPGProperty
* GetItemAtY( unsigned int y
,
1831 unsigned int* nextItemY
) const;
1833 /** Returns (direct) child property with given name (or NULL if not found).
1835 wxPGProperty
* GetPropertyByName( const wxString
& name
) const;
1839 DocStr(GetClientData
,
1840 "Returns the client data object for a property", "");
1841 PyObject
* GetClientData() {
1842 wxPyClientData
* data
= (wxPyClientData
*)self
->GetClientObject();
1844 Py_INCREF(data
->m_obj
);
1852 DocStr(SetClientData
,
1853 "Associate the given client data.", "");
1854 void SetClientData(PyObject
* clientData
) {
1855 wxPyClientData
* data
= new wxPyClientData(clientData
);
1856 self
->SetClientObject(data
);
1860 GetClientObject
= GetClientData
1861 SetClientObject
= SetClientData
1867 static wxString
* sm_wxPG_LABEL
;
1869 /** This member is public so scripting language bindings
1870 wrapper code can access it freely.
1875 /** Returns text for given column.
1877 wxString
GetColumnText( unsigned int col
) const;
1879 /** Returns (direct) child property with given name (or NULL if not found),
1883 Start looking for the child at this index.
1886 Does not support scope (ie. Parent.Child notation).
1888 wxPGProperty
* GetPropertyByNameWH( const wxString
& name
,
1889 unsigned int hintIndex
) const;
1891 /** This is used by Insert etc. */
1892 void AddChild2( wxPGProperty
* prop
,
1894 bool correct_mode
= true );
1896 void DoSetName(const wxString
& str
) { m_name
= str
; }
1898 // Call for after sub-properties added with AddChild
1899 void PrepareSubProperties();
1901 void SetParentalType( int flag
)
1903 m_flags
&= ~(wxPG_PROP_PROPERTY
|wxPG_PROP_PARENTAL_FLAGS
);
1907 void SetParentState( wxPropertyGridPageState
* pstate
)
1908 { m_parentState
= pstate
; }
1910 // Call after fixed sub-properties added/removed after creation.
1911 // if oldSelInd >= 0 and < new max items, then selection is
1913 void SubPropsChanged( int oldSelInd
= -1 );
1915 int GetY2( int lh
) const;
1919 wxPGProperty
* m_parent
;
1920 wxPropertyGridPageState
* m_parentState
;
1922 wxClientData
* m_clientObject
;
1924 // Overrides editor returned by property class
1925 const wxPGEditor
* m_customEditor
;
1926 #if wxUSE_VALIDATORS
1927 // Editor is going to get this validator
1928 wxValidator
* m_validator
;
1930 // Show this in front of the value
1932 // TODO: Can bitmap be implemented with wxPGCell?
1933 wxBitmap
* m_valueBitmap
;
1936 wxPGAttributeStorage m_attributes
;
1937 wxArrayPtrVoid m_children
;
1939 // Extended cell information
1940 wxArrayPtrVoid m_cells
;
1942 // Help shown in statusbar or help box.
1943 wxString m_helpString
;
1945 // Index in parent's property array.
1946 unsigned int m_arrIndex
;
1948 // If not -1, then overrides m_value
1953 // Maximum length (mainly for string properties). Could be in some sort of
1954 // wxBaseStringProperty, but currently, for maximum flexibility and
1955 // compatibility, we'll stick it here. Anyway, we had 3 excess bytes to use
1956 // so short int will fit in just fine.
1959 // Root has 0, categories etc. at that level 1, etc.
1960 unsigned char m_depth
;
1962 // m_depthBgCol indicates width of background colour between margin and item
1963 // (essentially this is category's depth, if none then equals m_depth).
1964 unsigned char m_depthBgCol
;
1966 unsigned char m_bgColIndex
; // Background brush index.
1967 unsigned char m_fgColIndex
; // Foreground colour index.
1970 // Called in constructors.
1972 void Init( const wxString
& label
, const wxString
& name
);
1973 #endif // #ifndef SWIG
1976 // -----------------------------------------------------------------------
1979 // Property class declaration helper macros
1980 // (wxPGRootPropertyClass and wxPropertyCategory require this).
1983 #define WX_PG_DECLARE_DOGETEDITORCLASS \
1984 virtual const wxPGEditor* DoGetEditorClass() const;
1987 #define WX_PG_DECLARE_PROPERTY_CLASS(CLASSNAME) \
1989 DECLARE_DYNAMIC_CLASS(CLASSNAME) \
1990 WX_PG_DECLARE_DOGETEDITORCLASS \
1993 #define WX_PG_DECLARE_PROPERTY_CLASS(CLASSNAME)
1996 // Implements sans constructor function. Also, first arg is class name, not
1998 #define WX_PG_IMPLEMENT_PROPERTY_CLASS_PLAIN(PROPNAME,T,EDITOR) \
1999 const wxPGEditor* PROPNAME::DoGetEditorClass() const \
2001 return wxPGEditor_##EDITOR; \
2004 // -----------------------------------------------------------------------
2008 /** @class wxPGRootProperty
2010 Root parent property.
2012 class WXDLLIMPEXP_PROPGRID wxPGRootProperty
: public wxPGProperty
2015 WX_PG_DECLARE_PROPERTY_CLASS(wxPGRootProperty
)
2020 virtual ~wxPGRootProperty();
2022 virtual bool StringToValue( wxVariant
&, const wxString
&, int ) const
2030 // -----------------------------------------------------------------------
2032 /** @class wxPropertyCategory
2034 Category (caption) property.
2036 class WXDLLIMPEXP_PROPGRID wxPropertyCategory
: public wxPGProperty
2038 friend class wxPropertyGrid
;
2039 friend class wxPropertyGridPageState
;
2040 WX_PG_DECLARE_PROPERTY_CLASS(wxPropertyCategory
)
2043 /** Default constructor is only used in special cases. */
2044 wxPropertyCategory();
2046 wxPropertyCategory( const wxString
& label
,
2047 const wxString
& name
= wxPG_LABEL
);
2048 ~wxPropertyCategory();
2050 int GetTextExtent( const wxWindow
* wnd
, const wxFont
& font
) const;
2053 virtual wxString
GetValueAsString( int argFlags
) const;
2055 void SetTextColIndex( unsigned int colInd
)
2056 { m_capFgColIndex
= (wxByte
) colInd
; }
2057 unsigned int GetTextColIndex() const
2058 { return (unsigned int) m_capFgColIndex
; }
2060 void CalculateTextExtent( wxWindow
* wnd
, const wxFont
& font
);
2062 int m_textExtent
; // pre-calculated length of text
2063 wxByte m_capFgColIndex
; // caption text colour index
2071 // -----------------------------------------------------------------------
2075 /** @class wxPGChoiceEntry
2076 Data of a single wxPGChoices choice.
2078 class WXDLLIMPEXP_PROPGRID wxPGChoiceEntry
: public wxPGCell
2082 wxPGChoiceEntry( const wxPGChoiceEntry
& entry
);
2083 wxPGChoiceEntry( const wxString
& label
,
2084 int value
= wxPG_INVALID_VALUE
)
2085 : wxPGCell(), m_value(value
)
2090 wxPGChoiceEntry( const wxString
& label
,
2092 const wxBitmap
& bitmap
,
2093 const wxColour
& fgCol
= wxNullColour
,
2094 const wxColour
& bgCol
= wxNullColour
)
2095 : wxPGCell(label
, bitmap
, fgCol
, bgCol
), m_value(value
)
2099 virtual ~wxPGChoiceEntry()
2103 void SetValue( int value
) { m_value
= value
; }
2105 int GetValue() const { return m_value
; }
2107 bool HasValue() const { return (m_value
!= wxPG_INVALID_VALUE
); }
2114 typedef void* wxPGChoicesId
;
2116 class WXDLLIMPEXP_PROPGRID wxPGChoicesData
2118 friend class wxPGChoices
;
2120 // Constructor sets m_refCount to 1.
2123 void CopyDataFrom( wxPGChoicesData
* data
);
2125 // Takes ownership of 'item'
2126 void Insert( int index
, wxPGChoiceEntry
* item
)
2128 wxArrayPtrVoid::iterator it
;
2132 index
= m_items
.size();
2136 it
= m_items
.begin() + index
;
2139 // Need to fix value?
2140 if ( item
->GetValue() == wxPG_INVALID_VALUE
)
2141 item
->SetValue(index
);
2143 m_items
.insert(it
, item
);
2146 // Delete all entries
2149 size_t GetCount() const { return m_items
.size(); }
2151 wxPGChoiceEntry
* Item( unsigned int i
) const
2153 wxCHECK_MSG( i
< GetCount(), NULL
, "invalid index" );
2155 return (wxPGChoiceEntry
*) m_items
[i
];
2161 wxASSERT( m_refCount
>= 0 );
2162 if ( m_refCount
== 0 )
2167 wxArrayPtrVoid m_items
;
2169 // So that multiple properties can use the same set
2172 virtual ~wxPGChoicesData();
2175 #define wxPGChoicesEmptyData ((wxPGChoicesData*)NULL)
2180 /** @class wxPGChoices
2182 Helper class for managing choices of wxPropertyGrid properties.
2183 Each entry can have label, value, bitmap, text colour, and background
2186 @library{wxpropgrid}
2189 class WXDLLIMPEXP_PROPGRID wxPGChoices
2192 typedef long ValArrItem
;
2194 /** Default constructor. */
2200 /** Copy constructor. */
2201 wxPGChoices( const wxPGChoices
& a
)
2203 if ( a
.m_data
!= wxPGChoicesEmptyData
)
2206 m_data
->m_refCount
++;
2211 wxPGChoices( const wxChar
** labels
, const long* values
= NULL
)
2218 wxPGChoices( const wxArrayString
& labels
,
2219 const wxArrayInt
& values
= wxArrayInt() )
2225 /** Simple interface constructor. */
2226 wxPGChoices( wxPGChoicesData
* data
)
2242 If did not have own copies, creates them now. If was empty, identical
2243 to set except that creates copies.
2245 void Add( const wxChar
** labels
, const ValArrItem
* values
= NULL
);
2247 /** Version that works with wxArrayString. */
2248 void Add( const wxArrayString
& arr
, const ValArrItem
* values
= NULL
);
2250 /** Version that works with wxArrayString and wxArrayInt. */
2251 void Add( const wxArrayString
& arr
, const wxArrayInt
& arrint
);
2253 /** Adds single item. */
2254 wxPGChoiceEntry
& Add( const wxString
& label
,
2255 int value
= wxPG_INVALID_VALUE
);
2257 /** Adds a single item, with bitmap. */
2258 wxPGChoiceEntry
& Add( const wxString
& label
,
2259 const wxBitmap
& bitmap
,
2260 int value
= wxPG_INVALID_VALUE
);
2262 /** Adds a single item with full entry information. */
2263 wxPGChoiceEntry
& Add( const wxPGChoiceEntry
& entry
)
2265 return Insert(entry
, -1);
2268 /** Adds single item. */
2269 wxPGChoiceEntry
& AddAsSorted( const wxString
& label
,
2270 int value
= wxPG_INVALID_VALUE
);
2272 void Assign( const wxPGChoices
& a
)
2274 AssignData(a
.m_data
);
2277 void AssignData( wxPGChoicesData
* data
);
2279 /** Delete all choices. */
2282 if ( m_data
!= wxPGChoicesEmptyData
)
2288 if ( m_data
== wxPGChoicesEmptyData
)
2289 m_data
= new wxPGChoicesData();
2292 /** Gets a unsigned number identifying this list. */
2293 wxPGChoicesId
GetId() const { return (wxPGChoicesId
) m_data
; };
2295 const wxString
& GetLabel( size_t ind
) const
2297 return Item(ind
).GetText();
2300 size_t GetCount () const
2302 wxASSERT_MSG( m_data
, "When checking if wxPGChoices is valid, "
2303 "use IsOk() instead of GetCount()" );
2304 return m_data
->GetCount();
2307 int GetValue( size_t ind
) const { return Item(ind
).GetValue(); }
2309 /** Returns array of values matching the given strings. Unmatching strings
2310 result in wxPG_INVALID_VALUE entry in array.
2312 wxArrayInt
GetValuesForStrings( const wxArrayString
& strings
) const;
2314 /** Returns array of indices matching given strings. Unmatching strings
2315 are added to 'unmatched', if not NULL.
2317 wxArrayInt
GetIndicesForStrings( const wxArrayString
& strings
,
2318 wxArrayString
* unmatched
= NULL
) const;
2320 /** Returns true if choices in general are likely to have values
2321 (depens on that all entries have values or none has)
2323 bool HasValues() const;
2325 bool HasValue( unsigned int i
) const
2326 { return (i
< m_data
->GetCount()) && m_data
->Item(i
)->HasValue(); }
2328 int Index( const wxString
& str
) const;
2329 int Index( int val
) const;
2331 /** Inserts single item. */
2332 wxPGChoiceEntry
& Insert( const wxString
& label
,
2334 int value
= wxPG_INVALID_VALUE
);
2336 /** Inserts a single item with full entry information. */
2337 wxPGChoiceEntry
& Insert( const wxPGChoiceEntry
& entry
, int index
);
2339 /** Returns false if this is a constant empty set of choices,
2340 which should not be modified.
2344 return ( m_data
!= wxPGChoicesEmptyData
);
2347 const wxPGChoiceEntry
& Item( unsigned int i
) const
2350 return *m_data
->Item(i
);
2353 wxPGChoiceEntry
& Item( unsigned int i
)
2356 return *m_data
->Item(i
);
2359 /** Removes count items starting at position nIndex. */
2360 void RemoveAt(size_t nIndex
, size_t count
= 1);
2363 /** Does not create copies for itself. */
2364 void Set( const wxChar
** labels
, const long* values
= NULL
)
2370 /** Version that works with wxArrayString.
2371 TODO: Deprecate this.
2373 void Set( wxArrayString
& arr
, const long* values
= (const long*) NULL
)
2380 /** Version that works with wxArrayString and wxArrayInt. */
2381 void Set( const wxArrayString
& labels
,
2382 const wxArrayInt
& values
= wxArrayInt() )
2391 // Creates exclusive copy of current choices
2394 if ( m_data
->m_refCount
!= 1 )
2396 wxPGChoicesData
* data
= new wxPGChoicesData();
2397 data
->CopyDataFrom(m_data
);
2403 // Returns data, increases refcount.
2404 wxPGChoicesData
* GetData()
2406 wxASSERT( m_data
->m_refCount
!= 0xFFFFFFF );
2407 m_data
->m_refCount
++;
2411 // Returns plain data ptr - no refcounting stuff is done.
2412 wxPGChoicesData
* GetDataPtr() const { return m_data
; }
2414 // Changes ownership of data to you.
2415 wxPGChoicesData
* ExtractData()
2417 wxPGChoicesData
* data
= m_data
;
2418 m_data
= wxPGChoicesEmptyData
;
2422 wxArrayString
GetLabels() const;
2425 void operator= (const wxPGChoices
& a
)
2427 AssignData(a
.m_data
);
2430 wxPGChoiceEntry
& operator[](unsigned int i
)
2435 const wxPGChoiceEntry
& operator[](unsigned int i
) const
2441 wxPGChoicesData
* m_data
;
2448 inline bool wxPGProperty::SetChoices( const wxArrayString
& labels
,
2449 const wxArrayInt
& values
)
2451 wxPGChoices
chs(labels
, values
);
2452 return SetChoices(chs
);
2455 // -----------------------------------------------------------------------
2457 #endif // wxUSE_PROPGRID
2459 #endif // _WX_PROPGRID_PROPERTY_H_