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_
15 #include "wx/propgrid/propgriddefs.h"
17 // -----------------------------------------------------------------------
19 #define wxNullProperty ((wxPGProperty*)NULL)
22 /** @class wxPGPaintData
24 Contains information relayed to property's OnCustomPaint.
28 /** wxPropertyGrid. */
29 const wxPropertyGrid
* m_parent
;
32 Normally -1, otherwise index to drop-down list item that has to be
37 /** Set to drawn width in OnCustomPaint (optional). */
41 In a measure item call, set this to the height of item at m_choiceItem
48 // Structure for relaying choice/list info.
51 wxPGChoices
* m_choices
;
58 // space between vertical sides of a custom image
59 #define wxPG_CUSTOM_IMAGE_SPACINGY 1
61 // space between caption and selection rectangle,
62 #define wxPG_CAPRECTXMARGIN 2
64 // horizontally and vertically
65 #define wxPG_CAPRECTYMARGIN 1
68 /** @class wxPGCellRenderer
70 Base class for wxPropertyGrid cell renderers.
72 class WXDLLIMPEXP_PROPGRID wxPGCellRenderer
76 wxPGCellRenderer( unsigned int refCount
= 1 )
77 : m_refCount(refCount
) { }
78 virtual ~wxPGCellRenderer() { }
83 Selected
= 0x00010000,
87 virtual void Render( wxDC
& dc
,
89 const wxPropertyGrid
* propertyGrid
,
90 wxPGProperty
* property
,
93 int flags
) const = 0;
95 /** Returns size of the image in front of the editable area.
97 If property is NULL, then this call is for a custom value. In that case
98 the item is index to wxPropertyGrid's custom values.
100 virtual wxSize
GetImageSize( const wxPGProperty
* property
,
104 /** Paints property category selection rectangle.
106 virtual void DrawCaptionSelectionRect( wxDC
& dc
,
108 int w
, int h
) const;
110 /** Utility to draw vertically centered text.
112 void DrawText( wxDC
& dc
,
115 const wxString
& text
) const;
118 Utility to draw editor's value, or vertically aligned text if editor is
121 void DrawEditorValue( wxDC
& dc
, const wxRect
& rect
,
122 int xOffset
, const wxString
& text
,
123 wxPGProperty
* property
,
124 const wxPGEditor
* editor
) const;
126 /** Utility to render cell bitmap and set text colour plus bg brush colour.
128 Returns image width that, for instance, can be passed to DrawText.
130 int PreDrawCell( wxDC
& dc
,
132 const wxPGCell
& cell
,
149 unsigned int m_refCount
;
155 Base class for simple wxPropertyGrid cell information.
157 class WXDLLIMPEXP_PROPGRID wxPGCell
161 wxPGCell( const wxString
& text
,
162 const wxBitmap
& bitmap
= wxNullBitmap
,
163 const wxColour
& fgCol
= wxNullColour
,
164 const wxColour
& bgCol
= wxNullColour
);
166 virtual ~wxPGCell() { }
168 void SetText( const wxString
& text
) { m_text
= text
; }
169 void SetBitmap( const wxBitmap
& bitmap
) { m_bitmap
= bitmap
; }
170 void SetFgCol( const wxColour
& col
) { m_fgCol
= col
; }
171 void SetBgCol( const wxColour
& col
) { m_bgCol
= col
; }
173 const wxString
& GetText() const { return m_text
; }
174 const wxBitmap
& GetBitmap() const { return m_bitmap
; }
175 const wxColour
& GetFgCol() const { return m_fgCol
; }
176 const wxColour
& GetBgCol() const { return m_bgCol
; }
186 /** @class wxPGDefaultRenderer
188 Default cell renderer, that can handles the common
191 class WXDLLIMPEXP_PROPGRID wxPGDefaultRenderer
: public wxPGCellRenderer
194 virtual void Render( wxDC
& dc
,
196 const wxPropertyGrid
* propertyGrid
,
197 wxPGProperty
* property
,
202 virtual wxSize
GetImageSize( const wxPGProperty
* property
,
209 // -----------------------------------------------------------------------
211 /** @class wxPGAttributeStorage
213 wxPGAttributeStorage is somewhat optimized storage for
214 key=variant pairs (ie. a map).
216 class WXDLLIMPEXP_PROPGRID wxPGAttributeStorage
219 wxPGAttributeStorage();
220 ~wxPGAttributeStorage();
222 void Set( const wxString
& name
, const wxVariant
& value
);
223 size_t GetCount() const { return m_map
.size(); }
224 wxVariant
FindValue( const wxString
& name
) const
226 wxPGHashMapS2P::const_iterator it
= m_map
.find(name
);
227 if ( it
!= m_map
.end() )
229 wxVariantData
* data
= (wxVariantData
*) it
->second
;
231 return wxVariant(data
, it
->first
);
236 typedef wxPGHashMapS2P::const_iterator const_iterator
;
237 const_iterator
StartIteration() const
239 return m_map
.begin();
241 bool GetNext( const_iterator
& it
, wxVariant
& variant
) const
243 if ( it
== m_map
.end() )
246 wxVariantData
* data
= (wxVariantData
*) it
->second
;
248 variant
.SetData(data
);
249 variant
.SetName(it
->first
);
255 wxPGHashMapS2P m_map
;
260 // -----------------------------------------------------------------------
262 /** @section propgrid_propflags wxPGProperty Flags
266 enum wxPG_PROPERTY_FLAGS
269 /** Indicates bold font.
271 wxPG_PROP_MODIFIED
= 0x0001,
273 /** Disables ('greyed' text and editor does not activate) property.
275 wxPG_PROP_DISABLED
= 0x0002,
277 /** Hider button will hide this property.
279 wxPG_PROP_HIDDEN
= 0x0004,
281 /** This property has custom paint image just in front of its value.
282 If property only draws custom images into a popup list, then this
283 flag should not be set.
285 wxPG_PROP_CUSTOMIMAGE
= 0x0008,
287 /** Do not create text based editor for this property (but button-triggered
288 dialog and choice are ok).
290 wxPG_PROP_NOEDITOR
= 0x0010,
292 /** Property is collapsed, ie. it's children are hidden.
294 wxPG_PROP_COLLAPSED
= 0x0020,
297 If property is selected, then indicates that validation failed for pending
300 If property is not selected, then indicates that the the actual property
301 value has failed validation (NB: this behavior is not currently supported,
302 but may be used in future).
304 wxPG_PROP_INVALID_VALUE
= 0x0040,
308 /** Switched via SetWasModified(). Temporary flag - only used when
309 setting/changing property value.
311 wxPG_PROP_WAS_MODIFIED
= 0x0200,
314 If set, then child properties (if any) are private, and should be
315 "invisible" to the application.
317 wxPG_PROP_AGGREGATE
= 0x0400,
319 /** If set, then child properties (if any) are copies and should not
322 wxPG_PROP_CHILDREN_ARE_COPIES
= 0x0800,
325 Classifies this item as a non-category.
327 Used for faster item type identification.
329 wxPG_PROP_PROPERTY
= 0x1000,
332 Classifies this item as a category.
334 Used for faster item type identification.
336 wxPG_PROP_CATEGORY
= 0x2000,
338 /** Classifies this item as a property that has children, but is not aggregate
339 (ie children are not private).
341 wxPG_PROP_MISC_PARENT
= 0x4000,
343 /** Property is read-only. Editor is still created.
345 wxPG_PROP_READONLY
= 0x8000,
348 // NB: FLAGS ABOVE 0x8000 CANNOT BE USED WITH PROPERTY ITERATORS
351 /** Property's value is composed from values of child properties.
353 This flag cannot be used with property iterators.
355 wxPG_PROP_COMPOSED_VALUE
= 0x00010000,
357 /** Common value of property is selectable in editor.
359 This flag cannot be used with property iterators.
361 wxPG_PROP_USES_COMMON_VALUE
= 0x00020000,
363 /** Property can be set to unspecified value via editor.
364 Currently, this applies to following properties:
365 - wxIntProperty, wxUIntProperty, wxFloatProperty, wxEditEnumProperty:
369 This flag cannot be used with property iterators.
371 wxPG_PROP_AUTO_UNSPECIFIED
= 0x00040000,
373 /** Indicates the bit useable by derived properties.
375 wxPG_PROP_CLASS_SPECIFIC_1
= 0x00080000,
377 /** Indicates the bit useable by derived properties.
379 wxPG_PROP_CLASS_SPECIFIC_2
= 0x00100000
385 #define wxPG_PROP_MAX wxPG_PROP_AUTO_UNSPECIFIED
387 /** Property with children must have one of these set, otherwise iterators
388 will not work correctly.
389 Code should automatically take care of this, however.
391 #define wxPG_PROP_PARENTAL_FLAGS \
392 (wxPG_PROP_AGGREGATE|wxPG_PROP_CATEGORY|wxPG_PROP_MISC_PARENT)
397 // Amalgam of flags that should be inherited by sub-properties
398 #define wxPG_INHERITED_PROPFLAGS (wxPG_PROP_HIDDEN|wxPG_PROP_NOEDITOR)
400 // Combination of flags that can be stored by GetFlagsAsString
401 #define wxPG_STRING_STORED_FLAGS \
402 (wxPG_PROP_DISABLED|wxPG_PROP_HIDDEN|wxPG_PROP_NOEDITOR|wxPG_PROP_COLLAPSED)
404 // -----------------------------------------------------------------------
409 @section propgrid_property_attributes wxPropertyGrid Property Attribute
412 wxPGProperty::SetAttribute() and
413 wxPropertyGridInterfaces::SetPropertyAttribute() accept one of these as
414 attribute name argument.
416 You can use strings instead of constants. However, some of these
417 constants are redefined to use cached strings which may reduce
418 your binary size by some amount.
423 /** Set default value for property.
425 #define wxPG_ATTR_DEFAULT_VALUE wxS("DefaultValue")
427 /** Universal, int or double. Minimum value for numeric properties.
429 #define wxPG_ATTR_MIN wxS("Min")
431 /** Universal, int or double. Maximum value for numeric properties.
433 #define wxPG_ATTR_MAX wxS("Max")
435 /** Universal, string. When set, will be shown as text after the displayed
436 text value. Alternatively, if third column is enabled, text will be shown
437 there (for any type of property).
439 #define wxPG_ATTR_UNITS wxS("Units")
441 /** Universal, string. When set, will be shown in property's value cell
442 when displayed value string is empty, or value is unspecified.
444 #define wxPG_ATTR_INLINE_HELP wxS("InlineHelp")
446 /** wxBoolProperty specific, int, default 0. When 1 sets bool property to
447 use checkbox instead of choice.
449 #define wxPG_BOOL_USE_CHECKBOX wxS("UseCheckbox")
451 /** wxBoolProperty specific, int, default 0. When 1 sets bool property value
452 to cycle on double click (instead of showing the popup listbox).
454 #define wxPG_BOOL_USE_DOUBLE_CLICK_CYCLING wxS("UseDClickCycling")
457 wxFloatProperty (and similar) specific, int, default -1.
459 Sets the (max) precision used when floating point value is rendered as
460 text. The default -1 means infinite precision.
462 #define wxPG_FLOAT_PRECISION wxS("Precision")
465 The text will be echoed as asterisks (wxTE_PASSWORD will be passed to
468 #define wxPG_STRING_PASSWORD wxS("Password")
470 /** Define base used by a wxUIntProperty. Valid constants are
471 wxPG_BASE_OCT, wxPG_BASE_DEC, wxPG_BASE_HEX and wxPG_BASE_HEXL
472 (lowercase characters).
474 #define wxPG_UINT_BASE wxS("Base")
476 /** Define prefix rendered to wxUIntProperty. Accepted constants
477 wxPG_PREFIX_NONE, wxPG_PREFIX_0x, and wxPG_PREFIX_DOLLAR_SIGN.
478 <b>Note:</b> Only wxPG_PREFIX_NONE works with Decimal and Octal
481 #define wxPG_UINT_PREFIX wxS("Prefix")
484 wxFileProperty/wxImageFileProperty specific, wxChar*, default is
486 Sets the wildcard used in the triggered wxFileDialog. Format is the same.
488 #define wxPG_FILE_WILDCARD wxS("Wildcard")
490 /** wxFileProperty/wxImageFileProperty specific, int, default 1.
491 When 0, only the file name is shown (i.e. drive and directory are hidden).
493 #define wxPG_FILE_SHOW_FULL_PATH wxS("ShowFullPath")
495 /** Specific to wxFileProperty and derived properties, wxString, default empty.
496 If set, then the filename is shown relative to the given path string.
498 #define wxPG_FILE_SHOW_RELATIVE_PATH wxS("ShowRelativePath")
501 Specific to wxFileProperty and derived properties, wxString, default is
504 Sets the initial path of where to look for files.
506 #define wxPG_FILE_INITIAL_PATH wxS("InitialPath")
508 /** Specific to wxFileProperty and derivatives, wxString, default is empty.
509 Sets a specific title for the dir dialog.
511 #define wxPG_FILE_DIALOG_TITLE wxS("DialogTitle")
513 /** Specific to wxDirProperty, wxString, default is empty.
514 Sets a specific message for the dir dialog.
516 #define wxPG_DIR_DIALOG_MESSAGE wxS("DialogMessage")
518 /** Sets displayed date format for wxDateProperty.
520 #define wxPG_DATE_FORMAT wxS("DateFormat")
522 /** Sets wxDatePickerCtrl window style used with wxDateProperty. Default
523 is wxDP_DEFAULT | wxDP_SHOWCENTURY.
525 #define wxPG_DATE_PICKER_STYLE wxS("PickerStyle")
527 /** SpinCtrl editor, int or double. How much number changes when button is
528 pressed (or up/down on keybard).
530 #define wxPG_ATTR_SPINCTRL_STEP wxS("Step")
532 /** SpinCtrl editor, bool. If true, value wraps at Min/Max.
534 #define wxPG_ATTR_SPINCTRL_WRAP wxS("Wrap")
537 wxMultiChoiceProperty, int.
538 If 0, no user strings allowed. If 1, user strings appear before list
539 strings. If 2, user strings appear after list string.
541 #define wxPG_ATTR_MULTICHOICE_USERSTRINGMODE wxS("UserStringMode")
544 wxColourProperty and its kind, int, default 1.
546 Setting this attribute to 0 hides custom colour from property's list of
549 #define wxPG_COLOUR_ALLOW_CUSTOM wxS("AllowCustom")
551 /** First attribute id that is guaranteed not to be used built-in
554 //#define wxPG_USER_ATTRIBUTE 192
561 // Redefine attribute macros to use cached strings
563 #define wxPG_ATTR_MIN wxPGGlobalVars->m_strMin
565 #define wxPG_ATTR_MAX wxPGGlobalVars->m_strMax
566 #undef wxPG_ATTR_UNITS
567 #define wxPG_ATTR_UNITS wxPGGlobalVars->m_strUnits
568 #undef wxPG_ATTR_INLINE_HELP
569 #define wxPG_ATTR_INLINE_HELP wxPGGlobalVars->m_strInlineHelp
575 // -----------------------------------------------------------------------
577 /** @class wxPGProperty
579 wxPGProperty is base class for all wxPropertyGrid properties. In
580 sections below we cover few related topics.
582 @li @ref pgproperty_properties
583 @li @ref pgproperty_creating
585 @section pgproperty_properties Supplied Ready-to-use Property Classes
587 Here is a list and short description of supplied fully-functional
588 property classes. They are located in either props.h or advprops.h.
590 @li @ref wxArrayStringProperty
591 @li @ref wxBoolProperty
592 @li @ref wxColourProperty
593 @li @ref wxCursorProperty
594 @li @ref wxDateProperty
595 @li @ref wxDirProperty
596 @li @ref wxEditEnumProperty
597 @li @ref wxEnumProperty
598 @li @ref wxFileProperty
599 @li @ref wxFlagsProperty
600 @li @ref wxFloatProperty
601 @li @ref wxFontProperty
602 @li @ref wxImageFileProperty
603 @li @ref wxIntProperty
604 @li @ref wxLongStringProperty
605 @li @ref wxMultiChoiceProperty
606 @li @ref wxPropertyCategory
607 @li @ref wxStringProperty
608 @li @ref wxSystemColourProperty
609 @li @ref wxUIntProperty
611 @subsection wxPropertyCategory
613 Not an actual property per se, but a header for a group of properties.
614 Regardless inherits from wxPGProperty.
616 @subsection wxStringProperty
618 Simple string property. wxPG_STRING_PASSWORD attribute may be used
619 to echo value as asterisks and use wxTE_PASSWORD for wxTextCtrl.
622 * wxStringProperty has a special trait: if it has value of "<composed>",
623 and also has child properties, then its displayed value becomes
624 composition of child property values, similar as with wxFontProperty,
627 @subsection wxIntProperty
629 Like wxStringProperty, but converts text to a signed long integer.
630 wxIntProperty seamlessly supports 64-bit integers (ie. wxLongLong).
632 @subsection wxUIntProperty
634 Like wxIntProperty, but displays value as unsigned int. To set
635 the prefix used globally, manipulate wxPG_UINT_PREFIX string attribute.
636 To set the globally used base, manipulate wxPG_UINT_BASE int
637 attribute. Regardless of current prefix, understands (hex) values starting
638 with both "0x" and "$".
639 wxUIntProperty seamlessly supports 64-bit unsigned integers (ie.
642 @subsection wxFloatProperty
644 Like wxStringProperty, but converts text to a double-precision floating
645 point. Default float-to-text precision is 6 decimals, but this can be
646 changed by modifying wxPG_FLOAT_PRECISION attribute.
648 @subsection wxBoolProperty
650 Represents a boolean value. wxChoice is used as editor control, by the
651 default. wxPG_BOOL_USE_CHECKBOX attribute can be set to true inorder to use
654 @subsection wxLongStringProperty
656 Like wxStringProperty, but has a button that triggers a small text editor
657 dialog. Note that in long string values, tabs are represented by "\t" and
660 @subsection wxDirProperty
662 Like wxLongStringProperty, but the button triggers dir selector instead.
663 Supported properties (all with string value): wxPG_DIR_DIALOG_MESSAGE.
665 @subsection wxFileProperty
667 Like wxLongStringProperty, but the button triggers file selector instead.
668 Default wildcard is "All files..." but this can be changed by setting
669 wxPG_FILE_WILDCARD attribute (see wxFileDialog for format details).
670 Attribute wxPG_FILE_SHOW_FULL_PATH can be set to false inorder to show
671 only the filename, not the entire path.
673 @subsection wxEnumProperty
675 Represents a single selection from a list of choices -
676 wxOwnerDrawnComboBox is used to edit the value.
678 @subsection wxFlagsProperty
680 Represents a bit set that fits in a long integer. wxBoolProperty
681 sub-properties are created for editing individual bits. Textctrl is created
682 to manually edit the flags as a text; a continous sequence of spaces,
683 commas and semicolons is considered as a flag id separator.
684 <b>Note: </b> When changing "choices" (ie. flag labels) of wxFlagsProperty,
685 you will need to use SetPropertyChoices - otherwise they will not get
688 @subsection wxArrayStringProperty
690 Allows editing of a list of strings in wxTextCtrl and in a separate dialog.
692 @subsection wxDateProperty
694 wxDateTime property. Default editor is DatePickerCtrl, altough TextCtrl
695 should work as well. wxPG_DATE_FORMAT attribute can be used to change
696 string wxDateTime::Format uses (altough default is recommended as it is
697 locale-dependant), and wxPG_DATE_PICKER_STYLE allows changing window
698 style given to DatePickerCtrl (default is wxDP_DEFAULT|wxDP_SHOWCENTURY).
700 @subsection wxEditEnumProperty
702 Represents a string that can be freely edited or selected from list of
703 choices - custom combobox control is used to edit the value.
705 @subsection wxMultiChoiceProperty
707 Allows editing a multiple selection from a list of strings. This is
708 property is pretty much built around concept of wxMultiChoiceDialog.
709 It uses wxArrayString value.
711 @subsection wxImageFileProperty
713 Like wxFileProperty, but has thumbnail of the image in front of
714 the filename and autogenerates wildcard from available image handlers.
716 @subsection wxColourProperty
718 <b>Useful alternate editor:</b> Choice.
720 Represents wxColour. wxButton is used to trigger a colour picker dialog.
722 @subsection wxFontProperty
724 Represents wxFont. Various sub-properties are used to edit individual
727 @subsection wxSystemColourProperty
729 Represents wxColour and a system colour index. wxChoice is used to edit
730 the value. Drop-down list has color images. Note that value type
731 is wxColourPropertyValue instead of wxColour.
733 class wxColourPropertyValue : public wxObject
736 // An integer value relating to the colour, and which exact
737 // meaning depends on the property with which it is used.
739 // For wxSystemColourProperty:
740 // Any of wxSYS_COLOUR_XXX, or any web-colour (use
741 // wxPG_TO_WEB_COLOUR macro - (currently unsupported) ),
742 // or wxPG_COLOUR_CUSTOM.
745 // Resulting colour. Should be correct regardless of type.
750 @subsection wxCursorProperty
752 Represents a wxCursor. wxChoice is used to edit the value.
753 Drop-down list has cursor images under some (wxMSW) platforms.
756 @section pgproperty_creating Creating Custom Properties
758 New properties can be created by subclassing wxPGProperty or one
759 of the provided property classes, and (re)implementing necessary
760 member functions. Below, each virtual member function has ample
761 documentation about its purpose and any odd details which to keep
764 Here is a very simple 'template' code:
767 class MyProperty : public wxPGProperty
770 // All arguments of ctor must have a default value -
771 // use wxPG_LABEL for label and name
772 MyProperty( const wxString& label = wxPG_LABEL,
773 const wxString& name = wxPG_LABEL,
774 const wxString& value = wxEmptyString )
776 // m_value is wxVariant
780 virtual ~MyProperty() { }
782 const wxPGEditor* DoGetEditorClass() const
784 // Determines editor used by property.
785 // You can replace 'TextCtrl' below with any of these
786 // builtin-in property editor identifiers: Choice, ComboBox,
787 // TextCtrlAndButton, ChoiceAndButton, CheckBox, SpinCtrl,
789 return wxPGEditor_TextCtrl;
792 virtual wxString GetValueAsString( int argFlags ) const
794 // TODO: Return property value in string format
797 virtual bool StringToValue( wxVariant& variant,
798 const wxString& text,
801 // TODO: Adapt string to property value.
808 Since wxPGProperty derives from wxObject, you can use standard
809 DECLARE_DYNAMIC_CLASS and IMPLEMENT_DYNAMIC_CLASS macros. From the
810 above example they were omitted for sake of simplicity, and besides,
811 they are only really needed if you need to use wxRTTI with your
814 You can change the 'value type' of a property by simply assigning different
815 type of variant with SetValue. <b>It is mandatory to implement
816 wxVariantData class for all data types used as property values.</b> Also,
817 it is further recommended to derive your class from wxPGVariantData, like
822 // (replace DECL with required data declaration, use
823 // wxEMPTY_PARAMETER_VALUE if none)
824 WX_PG_DECLARE_VARIANT_DATA(wxPGVariantMyDataClass, MyDataClass, DECL)
827 WX_PG_IMPLEMENT_VARIANT_DATA(wxPGVariantMyDataClass, MyDataClass)
833 class WXDLLIMPEXP_PROPGRID wxPGProperty
: public wxObject
835 friend class wxPropertyGrid
;
836 friend class wxPropertyGridInterface
;
837 friend class wxPropertyGridPageState
;
838 friend class wxPropertyGridPopulator
;
839 friend class wxStringProperty
; // Proper "<composed>" support requires this
841 DECLARE_ABSTRACT_CLASS(wxPGProperty
)
844 typedef wxUint32 FlagType
;
846 /** Basic constructor.
851 Non-abstract property classes should have constructor of this style:
855 // If T is a class, then it should be a constant reference
856 // (e.g. const T& ) instead.
857 MyProperty( const wxString& label, const wxString& name, T value )
860 // Generally recommended way to set the initial value
861 // (as it should work in pretty much 100% of cases).
866 // If has private child properties then create them here, e.g.:
867 // AddChild( new wxStringProperty( "Subprop 1",
869 // value.GetSubProp1() ) );
874 wxPGProperty( const wxString
& label
, const wxString
& name
);
878 It is customary for derived properties to implement this.
880 virtual ~wxPGProperty();
882 /** This virtual function is called after m_value has been set.
885 - If m_value was set to Null variant (ie. unspecified value),
886 OnSetValue() will not be called.
887 - m_value may be of any variant type. Typically properties internally
888 support only one variant type, and as such OnSetValue() provides a
889 good opportunity to convert
890 supported values into internal type.
891 - Default implementation does nothing.
893 virtual void OnSetValue();
895 /** Override this to return something else than m_value as the value.
897 virtual wxVariant
DoGetValue() const { return m_value
; }
899 #if !defined(SWIG) || defined(CREATE_VCW)
900 /** Implement this function in derived class to check the value.
901 Return true if it is ok. Returning false prevents property change events
905 - Default implementation always returns true.
907 virtual bool ValidateValue( wxVariant
& value
,
908 wxPGValidationInfo
& validationInfo
) const;
911 Converts 'text' into proper value 'variant'.
912 Returns true if new (different than m_value) value could be interpreted
915 If wxPG_FULL_VALUE is set, returns complete, storable value instead
916 of displayable one (they may be different).
917 If wxPG_COMPOSITE_FRAGMENT is set, text is interpreted as a part of
918 composite property string value (as generated by GetValueAsString()
919 called with this same flag).
922 Default implementation converts semicolon delimited tokens into child
923 values. Only works for properties with children.
925 virtual bool StringToValue( wxVariant
& variant
,
926 const wxString
& text
,
927 int argFlags
= 0 ) const;
930 Converts 'number' (including choice selection) into proper value
933 Returns true if new (different than m_value) value could be interpreted
937 If wxPG_FULL_VALUE is set, returns complete, storable value instead
941 - If property is not supposed to use choice or spinctrl or other editor
942 with int-based value, it is not necessary to implement this method.
943 - Default implementation simply assign given int to m_value.
944 - If property uses choice control, and displays a dialog on some choice
945 items, then it is preferred to display that dialog in IntToValue
948 virtual bool IntToValue( wxVariant
& value
,
950 int argFlags
= 0 ) const;
951 #endif // !defined(SWIG) || defined(CREATE_VCW)
954 /** Returns text representation of property's value.
957 If wxPG_FULL_VALUE is set, returns complete, storable string value
958 instead of displayable. If wxPG_EDITABLE_VALUE is set, returns
959 string value that must be editable in textctrl. If
960 wxPG_COMPOSITE_FRAGMENT is set, returns text that is appropriate to
961 display as a part of composite property string value.
964 Default implementation returns string composed from text
965 representations of child properties.
967 virtual wxString
GetValueAsString( int argFlags
= 0 ) const;
969 /** Converts string to a value, and if successful, calls SetValue() on it.
970 Default behavior is to do nothing.
972 String to get the value from.
974 true if value was changed.
976 bool SetValueFromString( const wxString
& text
, int flags
= 0 );
978 /** Converts integer to a value, and if succesful, calls SetValue() on it.
979 Default behavior is to do nothing.
981 Int to get the value from.
983 If has wxPG_FULL_VALUE, then the value given is a actual value and
986 True if value was changed.
988 bool SetValueFromInt( long value
, int flags
= 0 );
991 Returns size of the custom painted image in front of property.
993 This method must be overridden to return non-default value if
994 OnCustomPaint is to be called.
996 Normally -1, but can be an index to the property's list of items.
998 - Default behavior is to return wxSize(0,0), which means no image.
999 - Default image width or height is indicated with dimension -1.
1000 - You can also return wxPG_DEFAULT_IMAGE_SIZE, i.e. wxSize(-1, -1).
1002 virtual wxSize
OnMeasureImage( int item
= -1 ) const;
1005 Events received by editor widgets are processed here.
1007 Note that editor class usually processes most events. Some, such as
1008 button press events of TextCtrlAndButton class, can be handled here.
1009 Also, if custom handling for regular events is desired, then that can
1010 also be done (for example, wxSystemColourProperty custom handles
1011 wxEVT_COMMAND_CHOICE_SELECTED to display colour picker dialog when
1012 'custom' selection is made).
1014 If the event causes value to be changed, SetValueInEvent()
1015 should be called to set the new value.
1020 Should return true if any changes in value should be reported.
1022 If property uses choice control, and displays a dialog on some choice
1023 items, then it is preferred to display that dialog in IntToValue
1026 virtual bool OnEvent( wxPropertyGrid
* propgrid
,
1027 wxWindow
* wnd_primary
,
1031 Called after value of a child property has been altered.
1033 Note that this function is usually called at the time that value of
1034 this property, or given child property, is still pending for change.
1036 Sample pseudo-code implementation:
1039 void MyProperty::ChildChanged( wxVariant& thisValue,
1041 wxVariant& childValue ) const
1043 // Acquire reference to actual type of data stored in variant
1044 // (TFromVariant only exists if wxPropertyGrid's wxVariant-macros
1045 // were used to create the variant class).
1046 T& data = TFromVariant(thisValue);
1048 // Copy childValue into data.
1049 switch ( childIndex )
1052 data.SetSubProp1( childvalue.GetLong() );
1055 data.SetSubProp2( childvalue.GetString() );
1063 Value of this property, that should be altered.
1065 Index of child changed (you can use Item(childIndex) to get).
1067 Value of the child property.
1069 virtual void ChildChanged( wxVariant
& thisValue
,
1071 wxVariant
& childValue
) const;
1073 /** Returns pointer to an instance of used editor.
1075 virtual const wxPGEditor
* DoGetEditorClass() const;
1077 /** Returns pointer to the wxValidator that should be used
1078 with the editor of this property (NULL for no validator).
1079 Setting validator explicitly via SetPropertyValidator
1082 In most situations, code like this should work well
1083 (macros are used to maintain one actual validator instance,
1084 so on the second call the function exits within the first
1089 wxValidator* wxMyPropertyClass::DoGetValidator () const
1091 WX_PG_DOGETVALIDATOR_ENTRY()
1093 wxMyValidator* validator = new wxMyValidator(...);
1095 ... prepare validator...
1097 WX_PG_DOGETVALIDATOR_EXIT(validator)
1103 You can get common filename validator by returning
1104 wxFileProperty::GetClassValidator(). wxDirProperty,
1105 for example, uses it.
1107 virtual wxValidator
* DoGetValidator () const;
1110 Returns current value's index to the choice control.
1112 May also return, through pointer arguments, strings that should be
1113 inserted to that control. Irrelevant to classes which do not employ
1114 wxPGEditor_Choice or similar.
1117 - If returns NULL in choiceinfo.m_choices, then this class must be
1118 derived from wxBaseEnumProperty.
1119 - Must be able to cope situation where property's set of choices is
1122 virtual int GetChoiceInfo( wxPGChoiceInfo
* choiceinfo
);
1125 Override to paint an image in front of the property value text or
1126 drop-down list item (but only if wxPGProperty::OnMeasureImage is
1127 overridden as well).
1129 If property's OnMeasureImage() returns size that has height != 0 but
1130 less than row height ( < 0 has special meanings), wxPropertyGrid calls
1131 this method to draw a custom image in a limited area in front of the
1132 editor control or value text/graphics, and if control has drop-down
1133 list, then the image is drawn there as well (even in the case
1134 OnMeasureImage() returned higher height than row height).
1136 NOTE: Following applies when OnMeasureImage() returns a "flexible"
1137 height ( using wxPG_FLEXIBLE_SIZE(W,H) macro), which implies variable
1138 height items: If rect.x is < 0, then this is a measure item call, which
1139 means that dc is invalid and only thing that should be done is to set
1140 paintdata.m_drawnHeight to the height of the image of item at index
1141 paintdata.m_choiceItem. This call may be done even as often as once
1142 every drop-down popup show.
1147 Box reserved for custom graphics. Includes surrounding rectangle,
1148 if any. If x is < 0, then this is a measure item call (see above).
1150 wxPGPaintData structure with much useful data.
1153 - You can actually exceed rect width, but if you do so then
1154 paintdata.m_drawnWidth must be set to the full width drawn in
1156 - Due to technical reasons, rect's height will be default even if
1157 custom height was reported during measure call.
1158 - Brush is guaranteed to be default background colour. It has been
1159 already used to clear the background of area being painted. It
1161 - Pen is guaranteed to be 1-wide 'black' (or whatever is the proper
1162 colour) pen for drawing framing rectangle. It can be changed as
1165 @see GetValueAsString()
1167 virtual void OnCustomPaint( wxDC
& dc
,
1169 wxPGPaintData
& paintdata
);
1172 Returns used wxPGCellRenderer instance for given property column
1175 Default implementation returns editor's renderer for all columns.
1177 virtual wxPGCellRenderer
* GetCellRenderer( int column
) const;
1180 Refresh values of child properties.
1182 Automatically called after value is set.
1184 virtual void RefreshChildren();
1186 /** Special handling for attributes of this property.
1188 If returns false, then the attribute will be automatically stored in
1191 Default implementation simply returns false.
1193 virtual bool DoSetAttribute( const wxString
& name
, wxVariant
& value
);
1195 /** Returns value of an attribute.
1197 Override if custom handling of attributes is needed.
1199 Default implementation simply return NULL variant.
1201 virtual wxVariant
DoGetAttribute( const wxString
& name
) const;
1203 /** Returns instance of a new wxPGEditorDialogAdapter instance, which is
1204 used when user presses the (optional) button next to the editor control;
1206 Default implementation returns NULL (ie. no action is generated when
1209 virtual wxPGEditorDialogAdapter
* GetEditorDialog() const;
1212 Adds entry to property's wxPGChoices and editor control (if it is
1215 Returns index of item added.
1217 int AppendChoice( const wxString
& label
, int value
= wxPG_INVALID_VALUE
)
1219 return InsertChoice(label
,-1,value
);
1222 /** Returns wxPGCell of given column, NULL if none. If valid
1223 object is returned, caller will gain its ownership.
1225 wxPGCell
* AcquireCell( unsigned int column
)
1227 if ( column
>= m_cells
.size() )
1230 wxPGCell
* cell
= (wxPGCell
*) m_cells
[column
];
1231 m_cells
[column
] = NULL
;
1236 Returns true if children of this property are component values (for
1237 instance, points size, face name, and is_underlined are component
1240 bool AreChildrenComponents() const
1242 if ( m_flags
& (wxPG_PROP_COMPOSED_VALUE
|wxPG_PROP_AGGREGATE
) )
1249 Removes entry from property's wxPGChoices and editor control (if it is
1252 If selected item is deleted, then the value is set to unspecified.
1254 void DeleteChoice( int index
);
1257 Call to enable or disable usage of common value (integer value that can
1258 be selected for properties instead of their normal values) for this
1261 Common values are disabled by the default for all properties.
1263 void EnableCommonValue( bool enable
= true )
1265 if ( enable
) SetFlag( wxPG_PROP_USES_COMMON_VALUE
);
1266 else ClearFlag( wxPG_PROP_USES_COMMON_VALUE
);
1269 /** Composes text from values of child properties. */
1270 void GenerateComposedValue( wxString
& text
, int argFlags
= 0 ) const;
1272 /** Returns property's label. */
1273 const wxString
& GetLabel() const { return m_label
; }
1275 /** Returns property's name with all (non-category, non-root) parents. */
1276 wxString
GetName() const;
1279 Returns property's base name (ie parent's name is not added in any
1282 const wxString
& GetBaseName() const { return m_name
; }
1284 wxPGChoices
& GetChoices();
1286 const wxPGChoices
& GetChoices() const;
1288 const wxPGChoiceEntry
* GetCurrentChoice() const;
1290 /** Returns coordinate to the top y of the property. Note that the
1291 position of scrollbars is not taken into account.
1295 wxVariant
GetValue() const
1297 return DoGetValue();
1301 /** Returns reference to the internal stored value. GetValue is preferred
1302 way to get the actual value, since GetValueRef ignores DoGetValue,
1303 which may override stored value.
1305 wxVariant
& GetValueRef()
1310 const wxVariant
& GetValueRef() const
1316 /** Same as GetValueAsString, except takes common value into account.
1318 wxString
GetValueString( int argFlags
= 0 ) const;
1320 void UpdateControl( wxWindow
* primary
);
1322 /** Returns wxPGCell of given column, NULL if none. wxPGProperty
1323 will retain ownership of the cell object.
1325 wxPGCell
* GetCell( unsigned int column
) const
1327 if ( column
>= m_cells
.size() )
1330 return (wxPGCell
*) m_cells
[column
];
1333 unsigned int GetChoiceCount() const;
1335 wxString
GetChoiceString( unsigned int index
);
1337 /** Return number of displayed common values for this property.
1339 int GetDisplayedCommonValueCount() const;
1341 wxString
GetDisplayedString() const
1343 return GetValueString(0);
1346 /** Returns property grid where property lies. */
1347 wxPropertyGrid
* GetGrid() const;
1349 /** Returns owner wxPropertyGrid, but only if one is currently on a page
1350 displaying this property. */
1351 wxPropertyGrid
* GetGridIfDisplayed() const;
1353 /** Returns highest level non-category, non-root parent. Useful when you
1354 have nested wxCustomProperties/wxParentProperties.
1356 Thus, if immediate parent is root or category, this will return the
1359 wxPGProperty
* GetMainParent() const;
1361 /** Return parent of property */
1362 wxPGProperty
* GetParent() const { return m_parent
; }
1364 /** Returns true if property has editable wxTextCtrl when selected.
1367 Altough disabled properties do not displayed editor, they still
1368 return True here as being disabled is considered a temporary
1369 condition (unlike being read-only or having limited editing enabled).
1371 bool IsTextEditable() const;
1373 bool IsValueUnspecified() const
1375 return m_value
.IsNull();
1378 FlagType
HasFlag( FlagType flag
) const
1380 return ( m_flags
& flag
);
1383 /** Returns comma-delimited string of property attributes.
1385 const wxPGAttributeStorage
& GetAttributes() const
1387 return m_attributes
;
1390 /** Returns m_attributes as list wxVariant.
1392 wxVariant
GetAttributesAsList() const;
1394 FlagType
GetFlags() const
1399 const wxPGEditor
* GetEditorClass() const;
1401 wxString
GetValueType() const
1403 return m_value
.GetType();
1406 /** Returns editor used for given column. NULL for no editor.
1408 const wxPGEditor
* GetColumnEditor( int column
) const
1411 return GetEditorClass();
1416 /** Returns common value selected for this property. -1 for none.
1418 int GetCommonValue() const
1420 return m_commonValue
;
1423 /** Returns true if property has even one visible child.
1425 bool HasVisibleChildren() const;
1428 Adds entry to property's wxPGChoices and editor control (if it is
1431 Returns index of item added.
1433 int InsertChoice( const wxString
& label
,
1435 int value
= wxPG_INVALID_VALUE
);
1438 Returns true if this property is actually a wxPropertyCategory.
1440 bool IsCategory() const { return HasFlag(wxPG_PROP_CATEGORY
)?true:false; }
1442 /** Returns true if this property is actually a wxRootProperty.
1444 bool IsRoot() const { return (m_parent
== NULL
); }
1446 /** Returns true if this is a sub-property. */
1447 bool IsSubProperty() const
1449 wxPGProperty
* parent
= (wxPGProperty
*)m_parent
;
1450 if ( parent
&& !parent
->IsCategory() )
1455 /** Returns last visible sub-property, recursively.
1457 const wxPGProperty
* GetLastVisibleSubItem() const;
1459 wxVariant
GetDefaultValue() const;
1461 int GetMaxLength() const
1463 return (int) m_maxLen
;
1467 Determines, recursively, if all children are not unspecified.
1469 Takes values in given list into account.
1471 bool AreAllChildrenSpecified( wxVariant
* pendingList
= NULL
) const;
1473 /** Updates composed values of parent non-category properties, recursively.
1474 Returns topmost property updated.
1477 - Must not call SetValue() (as can be called in it).
1479 wxPGProperty
* UpdateParentValues();
1481 /** Returns true if containing grid uses wxPG_EX_AUTO_UNSPECIFIED_VALUES.
1483 FlagType
UsesAutoUnspecified() const
1485 return HasFlag(wxPG_PROP_AUTO_UNSPECIFIED
);
1488 wxBitmap
* GetValueImage() const
1490 return m_valueBitmap
;
1493 wxVariant
GetAttribute( const wxString
& name
) const;
1496 Returns named attribute, as string, if found.
1498 Otherwise defVal is returned.
1500 wxString
GetAttribute( const wxString
& name
, const wxString
& defVal
) const;
1503 Returns named attribute, as long, if found.
1505 Otherwise defVal is returned.
1507 long GetAttributeAsLong( const wxString
& name
, long defVal
) const;
1510 Returns named attribute, as double, if found.
1512 Otherwise defVal is returned.
1514 double GetAttributeAsDouble( const wxString
& name
, double defVal
) const;
1516 unsigned int GetArrIndex() const { return m_arrIndex
; }
1518 unsigned int GetDepth() const { return (unsigned int)m_depth
; }
1520 /** Gets flags as a'|' delimited string. Note that flag names are not
1521 prepended with 'wxPG_PROP_'.
1523 String will only be made to include flags combined by this parameter.
1525 wxString
GetFlagsAsString( FlagType flagsMask
) const;
1527 /** Returns position in parent's array. */
1528 unsigned int GetIndexInParent() const
1530 return (unsigned int)m_arrIndex
;
1533 /** Hides or reveals the property.
1535 true for hide, false for reveal.
1537 By default changes are applied recursively. Set this paramter
1538 wxPG_DONT_RECURSE to prevent this.
1540 inline bool Hide( bool hide
, int flags
= wxPG_RECURSE
);
1542 bool IsExpanded() const
1543 { return (!(m_flags
& wxPG_PROP_COLLAPSED
) && GetChildCount()); }
1545 /** Returns true if all parents expanded.
1547 bool IsVisible() const;
1549 bool IsEnabled() const { return !(m_flags
& wxPG_PROP_DISABLED
); }
1551 /** If property's editor is created this forces its recreation.
1552 Useful in SetAttribute etc. Returns true if actually did anything.
1554 bool RecreateEditor();
1556 /** If property's editor is active, then update it's value.
1558 void RefreshEditor();
1560 /** Sets an attribute for this property.
1562 Text identifier of attribute. See @ref propgrid_property_attributes.
1566 void SetAttribute( const wxString
& name
, wxVariant value
);
1568 void SetAttributes( const wxPGAttributeStorage
& attributes
);
1571 /** Sets editor for a property.
1574 For builtin editors, use wxPGEditor_X, where X is builtin editor's
1575 name (TextCtrl, Choice, etc. see wxPGEditor documentation for full
1578 For custom editors, use pointer you received from
1579 wxPropertyGrid::RegisterEditorClass().
1581 void SetEditor( const wxPGEditor
* editor
)
1583 m_customEditor
= editor
;
1587 /** Sets editor for a property.
1589 inline void SetEditor( const wxString
& editorName
);
1591 /** Sets cell information for given column.
1593 Note that the property takes ownership of given wxPGCell instance.
1595 void SetCell( int column
, wxPGCell
* cellObj
);
1597 /** Changes value of a property with choices, but only
1598 works if the value type is long or string. */
1599 void SetChoiceSelection( int newValue
, const wxPGChoiceInfo
& choiceInfo
);
1601 /** Sets common value selected for this property. -1 for none.
1603 void SetCommonValue( int commonValue
)
1605 m_commonValue
= commonValue
;
1608 /** Sets flags from a '|' delimited string. Note that flag names are not
1609 prepended with 'wxPG_PROP_'.
1611 void SetFlagsFromString( const wxString
& str
);
1613 /** Sets property's "is it modified?" flag. Affects children recursively.
1615 void SetModifiedStatus( bool modified
)
1617 SetFlagRecursively(wxPG_PROP_MODIFIED
, modified
);
1620 /** Call in OnEvent(), OnButtonClick() etc. to change the property value
1621 based on user input.
1624 This method is const since it doesn't actually modify value, but posts
1625 given variant as pending value, stored in wxPropertyGrid.
1627 void SetValueInEvent( wxVariant value
) const;
1630 Call this to set value of the property.
1632 Unlike methods in wxPropertyGrid, this does not automatically update
1636 Use wxPropertyGrid::ChangePropertyValue() instead if you need to run
1637 through validation process and send property change event.
1639 If you need to change property value in event, based on user input, use
1640 SetValueInEvent() instead.
1643 Pointer to list variant that contains child values. Used to indicate
1644 which children should be marked as modified.
1646 Various flags (for instance, wxPG_SETVAL_REFRESH_EDITOR).
1648 void SetValue( wxVariant value
, wxVariant
* pList
= NULL
, int flags
= 0 );
1650 /** Set wxBitmap in front of the value. This bitmap may be ignored
1651 by custom cell renderers.
1653 void SetValueImage( wxBitmap
& bmp
);
1655 /** If property has choices and they are not yet exclusive, new such copy
1656 of them will be created.
1658 void SetChoicesExclusive();
1660 void SetExpanded( bool expanded
)
1662 if ( !expanded
) m_flags
|= wxPG_PROP_COLLAPSED
;
1663 else m_flags
&= ~wxPG_PROP_COLLAPSED
;
1666 void SetFlag( FlagType flag
) { m_flags
|= flag
; }
1668 void SetFlagRecursively( FlagType flag
, bool set
);
1670 void SetHelpString( const wxString
& helpString
)
1672 m_helpString
= helpString
;
1675 void SetLabel( const wxString
& label
) { m_label
= label
; }
1677 inline void SetName( const wxString
& newName
);
1679 void SetValueToUnspecified()
1681 wxVariant val
; // Create NULL variant
1685 #if wxUSE_VALIDATORS
1686 /** Sets wxValidator for a property*/
1687 void SetValidator( const wxValidator
& validator
)
1689 m_validator
= wxDynamicCast(validator
.Clone(),wxValidator
);
1692 /** Gets assignable version of property's validator. */
1693 wxValidator
* GetValidator() const
1697 return DoGetValidator();
1699 #endif // #if wxUSE_VALIDATORS
1701 /** Updates property value in case there were last minute
1702 changes. If value was unspecified, it will be set to default.
1703 Use only for properties that have TextCtrl-based editor.
1705 If you have code similar to
1707 // Update the value in case of last minute changes
1708 if ( primary && propgrid->IsEditorsValueModified() )
1709 GetEditorClass()->CopyValueFromControl( this, primary );
1711 in wxPGProperty::OnEvent wxEVT_COMMAND_BUTTON_CLICKED handler,
1712 then replace it with call to this method.
1714 True if value changed.
1716 bool PrepareValueForDialogEditing( wxPropertyGrid
* propgrid
);
1719 /** Returns client data (void*) of a property.
1721 void* GetClientData() const
1723 return m_clientData
;
1726 /** Sets client data (void*) of a property.
1728 This untyped client data has to be deleted manually.
1730 void SetClientData( void* clientData
)
1732 m_clientData
= clientData
;
1735 /** Returns client object of a property.
1737 void SetClientObject(wxClientData
* clientObject
)
1739 delete m_clientObject
;
1740 m_clientObject
= clientObject
;
1743 /** Sets managed client object of a property.
1745 wxClientData
*GetClientObject() const { return m_clientObject
; }
1748 /** Sets new set of choices for property.
1751 This operation clears the property value.
1753 bool SetChoices( wxPGChoices
& choices
);
1755 /** Sets new set of choices for property.
1757 inline bool SetChoices( const wxArrayString
& labels
,
1758 const wxArrayInt
& values
= wxArrayInt() );
1760 /** Set max length of text in text editor.
1762 inline bool SetMaxLength( int maxLen
);
1764 /** Call with 'false' in OnSetValue to cancel value changes after all
1765 (ie. cancel 'true' returned by StringToValue() or IntToValue()).
1767 void SetWasModified( bool set
= true )
1769 if ( set
) m_flags
|= wxPG_PROP_WAS_MODIFIED
;
1770 else m_flags
&= ~wxPG_PROP_WAS_MODIFIED
;
1773 const wxString
& GetHelpString() const
1775 return m_helpString
;
1778 void ClearFlag( FlagType flag
) { m_flags
&= ~(flag
); }
1780 // Use, for example, to detect if item is inside collapsed section.
1781 bool IsSomeParent( wxPGProperty
* candidate_parent
) const;
1784 Adapts list variant into proper value using consecutive
1787 void AdaptListToValue( wxVariant
& list
, wxVariant
* value
) const;
1789 /** This is used by properties that have fixed sub-properties. */
1790 void AddChild( wxPGProperty
* prop
);
1792 /** Returns height of children, recursively, and
1793 by taking expanded/collapsed status into account.
1795 iMax is used when finding property y-positions.
1797 int GetChildrenHeight( int lh
, int iMax
= -1 ) const;
1799 /** Returns number of child properties */
1800 unsigned int GetChildCount() const { return m_children
.GetCount(); }
1802 /** Returns sub-property at index i. */
1803 wxPGProperty
* Item( size_t i
) const
1804 { return (wxPGProperty
*)m_children
.Item(i
); }
1806 /** Returns last sub-property.
1808 wxPGProperty
* Last() const { return (wxPGProperty
*)m_children
.Last(); }
1810 /** Returns index of given sub-property. */
1811 int Index( const wxPGProperty
* p
) const
1812 { return m_children
.Index((wxPGProperty
*)p
); }
1814 /** Deletes all sub-properties. */
1817 // Puts correct indexes to children
1818 void FixIndexesOfChildren( size_t starthere
= 0 );
1821 // Returns wxPropertyGridPageState in which this property resides.
1822 wxPropertyGridPageState
* GetParentState() const { return m_parentState
; }
1825 wxPGProperty
* GetItemAtY( unsigned int y
,
1827 unsigned int* nextItemY
) const;
1829 /** Returns (direct) child property with given name (or NULL if not found).
1831 wxPGProperty
* GetPropertyByName( const wxString
& name
) const;
1835 DocStr(GetClientData
,
1836 "Returns the client data object for a property", "");
1837 PyObject
* GetClientData() {
1838 wxPyClientData
* data
= (wxPyClientData
*)self
->GetClientObject();
1840 Py_INCREF(data
->m_obj
);
1848 DocStr(SetClientData
,
1849 "Associate the given client data.", "");
1850 void SetClientData(PyObject
* clientData
) {
1851 wxPyClientData
* data
= new wxPyClientData(clientData
);
1852 self
->SetClientObject(data
);
1856 GetClientObject
= GetClientData
1857 SetClientObject
= SetClientData
1863 static wxString
* sm_wxPG_LABEL
;
1865 /** This member is public so scripting language bindings
1866 wrapper code can access it freely.
1871 /** Returns text for given column.
1873 wxString
GetColumnText( unsigned int col
) const;
1875 /** Returns (direct) child property with given name (or NULL if not found),
1879 Start looking for the child at this index.
1882 Does not support scope (ie. Parent.Child notation).
1884 wxPGProperty
* GetPropertyByNameWH( const wxString
& name
,
1885 unsigned int hintIndex
) const;
1887 /** This is used by Insert etc. */
1888 void AddChild2( wxPGProperty
* prop
,
1890 bool correct_mode
= true );
1892 void DoSetName(const wxString
& str
) { m_name
= str
; }
1894 // Call for after sub-properties added with AddChild
1895 void PrepareSubProperties();
1897 void SetParentalType( int flag
)
1899 m_flags
&= ~(wxPG_PROP_PROPERTY
|wxPG_PROP_PARENTAL_FLAGS
);
1903 void SetParentState( wxPropertyGridPageState
* pstate
)
1904 { m_parentState
= pstate
; }
1906 // Call after fixed sub-properties added/removed after creation.
1907 // if oldSelInd >= 0 and < new max items, then selection is
1909 void SubPropsChanged( int oldSelInd
= -1 );
1911 int GetY2( int lh
) const;
1915 wxPGProperty
* m_parent
;
1916 wxPropertyGridPageState
* m_parentState
;
1918 wxClientData
* m_clientObject
;
1920 // Overrides editor returned by property class
1921 const wxPGEditor
* m_customEditor
;
1922 #if wxUSE_VALIDATORS
1923 // Editor is going to get this validator
1924 wxValidator
* m_validator
;
1926 // Show this in front of the value
1928 // TODO: Can bitmap be implemented with wxPGCell?
1929 wxBitmap
* m_valueBitmap
;
1932 wxPGAttributeStorage m_attributes
;
1933 wxArrayPtrVoid m_children
;
1935 // Extended cell information
1936 wxArrayPtrVoid m_cells
;
1938 // Help shown in statusbar or help box.
1939 wxString m_helpString
;
1941 // Index in parent's property array.
1942 unsigned int m_arrIndex
;
1944 // If not -1, then overrides m_value
1949 // Maximum length (mainly for string properties). Could be in some sort of
1950 // wxBaseStringProperty, but currently, for maximum flexibility and
1951 // compatibility, we'll stick it here. Anyway, we had 3 excess bytes to use
1952 // so short int will fit in just fine.
1955 // Root has 0, categories etc. at that level 1, etc.
1956 unsigned char m_depth
;
1958 // m_depthBgCol indicates width of background colour between margin and item
1959 // (essentially this is category's depth, if none then equals m_depth).
1960 unsigned char m_depthBgCol
;
1962 unsigned char m_bgColIndex
; // Background brush index.
1963 unsigned char m_fgColIndex
; // Foreground colour index.
1966 // Called in constructors.
1968 void Init( const wxString
& label
, const wxString
& name
);
1969 #endif // #ifndef SWIG
1972 // -----------------------------------------------------------------------
1975 // Property class declaration helper macros
1976 // (wxPGRootPropertyClass and wxPropertyCategory require this).
1979 #define WX_PG_DECLARE_DOGETEDITORCLASS \
1980 virtual const wxPGEditor* DoGetEditorClass() const;
1983 #define WX_PG_DECLARE_PROPERTY_CLASS(CLASSNAME) \
1985 DECLARE_DYNAMIC_CLASS(CLASSNAME) \
1986 WX_PG_DECLARE_DOGETEDITORCLASS \
1989 #define WX_PG_DECLARE_PROPERTY_CLASS(CLASSNAME)
1992 // Implements sans constructor function. Also, first arg is class name, not
1994 #define WX_PG_IMPLEMENT_PROPERTY_CLASS_PLAIN(PROPNAME,T,EDITOR) \
1995 const wxPGEditor* PROPNAME::DoGetEditorClass() const \
1997 return wxPGEditor_##EDITOR; \
2000 // -----------------------------------------------------------------------
2004 /** @class wxPGRootProperty
2006 Root parent property.
2008 class WXDLLIMPEXP_PROPGRID wxPGRootProperty
: public wxPGProperty
2011 WX_PG_DECLARE_PROPERTY_CLASS(wxPGRootProperty
)
2016 virtual ~wxPGRootProperty();
2018 virtual bool StringToValue( wxVariant
&, const wxString
&, int ) const
2026 // -----------------------------------------------------------------------
2028 /** @class wxPropertyCategory
2030 Category (caption) property.
2032 class WXDLLIMPEXP_PROPGRID wxPropertyCategory
: public wxPGProperty
2034 friend class wxPropertyGrid
;
2035 friend class wxPropertyGridPageState
;
2036 WX_PG_DECLARE_PROPERTY_CLASS(wxPropertyCategory
)
2039 /** Default constructor is only used in special cases. */
2040 wxPropertyCategory();
2042 wxPropertyCategory( const wxString
& label
,
2043 const wxString
& name
= wxPG_LABEL
);
2044 ~wxPropertyCategory();
2046 int GetTextExtent( const wxWindow
* wnd
, const wxFont
& font
) const;
2049 virtual wxString
GetValueAsString( int argFlags
) const;
2051 void SetTextColIndex( unsigned int colInd
)
2052 { m_capFgColIndex
= (wxByte
) colInd
; }
2053 unsigned int GetTextColIndex() const
2054 { return (unsigned int) m_capFgColIndex
; }
2056 void CalculateTextExtent( wxWindow
* wnd
, const wxFont
& font
);
2058 int m_textExtent
; // pre-calculated length of text
2059 wxByte m_capFgColIndex
; // caption text colour index
2067 // -----------------------------------------------------------------------
2071 /** @class wxPGChoiceEntry
2072 Data of a single wxPGChoices choice.
2074 class WXDLLIMPEXP_PROPGRID wxPGChoiceEntry
: public wxPGCell
2078 wxPGChoiceEntry( const wxPGChoiceEntry
& entry
);
2079 wxPGChoiceEntry( const wxString
& label
,
2080 int value
= wxPG_INVALID_VALUE
)
2081 : wxPGCell(), m_value(value
)
2086 wxPGChoiceEntry( const wxString
& label
,
2088 const wxBitmap
& bitmap
,
2089 const wxColour
& fgCol
= wxNullColour
,
2090 const wxColour
& bgCol
= wxNullColour
)
2091 : wxPGCell(label
, bitmap
, fgCol
, bgCol
), m_value(value
)
2095 virtual ~wxPGChoiceEntry()
2099 void SetValue( int value
) { m_value
= value
; }
2101 int GetValue() const { return m_value
; }
2103 bool HasValue() const { return (m_value
!= wxPG_INVALID_VALUE
); }
2110 typedef void* wxPGChoicesId
;
2112 class WXDLLIMPEXP_PROPGRID wxPGChoicesData
2114 friend class wxPGChoices
;
2116 // Constructor sets m_refCount to 1.
2119 void CopyDataFrom( wxPGChoicesData
* data
);
2121 // Takes ownership of 'item'
2122 void Insert( int index
, wxPGChoiceEntry
* item
)
2124 wxArrayPtrVoid::iterator it
;
2128 index
= m_items
.size();
2132 it
= m_items
.begin() + index
;
2135 // Need to fix value?
2136 if ( item
->GetValue() == wxPG_INVALID_VALUE
)
2137 item
->SetValue(index
);
2139 m_items
.insert(it
, item
);
2142 // Delete all entries
2145 size_t GetCount() const { return m_items
.size(); }
2147 wxPGChoiceEntry
* Item( unsigned int i
) const
2149 wxCHECK_MSG( i
< GetCount(), NULL
, "invalid index" );
2151 return (wxPGChoiceEntry
*) m_items
[i
];
2157 wxASSERT( m_refCount
>= 0 );
2158 if ( m_refCount
== 0 )
2163 wxArrayPtrVoid m_items
;
2165 // So that multiple properties can use the same set
2168 virtual ~wxPGChoicesData();
2171 #define wxPGChoicesEmptyData ((wxPGChoicesData*)NULL)
2176 /** @class wxPGChoices
2178 Helper class for managing choices of wxPropertyGrid properties.
2179 Each entry can have label, value, bitmap, text colour, and background
2182 @library{wxpropgrid}
2185 class WXDLLIMPEXP_PROPGRID wxPGChoices
2188 typedef long ValArrItem
;
2190 /** Default constructor. */
2196 /** Copy constructor. */
2197 wxPGChoices( const wxPGChoices
& a
)
2199 if ( a
.m_data
!= wxPGChoicesEmptyData
)
2202 m_data
->m_refCount
++;
2207 wxPGChoices( const wxChar
** labels
, const long* values
= NULL
)
2214 wxPGChoices( const wxArrayString
& labels
,
2215 const wxArrayInt
& values
= wxArrayInt() )
2221 /** Simple interface constructor. */
2222 wxPGChoices( wxPGChoicesData
* data
)
2238 If did not have own copies, creates them now. If was empty, identical
2239 to set except that creates copies.
2241 void Add( const wxChar
** labels
, const ValArrItem
* values
= NULL
);
2243 /** Version that works with wxArrayString. */
2244 void Add( const wxArrayString
& arr
, const ValArrItem
* values
= NULL
);
2246 /** Version that works with wxArrayString and wxArrayInt. */
2247 void Add( const wxArrayString
& arr
, const wxArrayInt
& arrint
);
2249 /** Adds single item. */
2250 wxPGChoiceEntry
& Add( const wxString
& label
,
2251 int value
= wxPG_INVALID_VALUE
);
2253 /** Adds a single item, with bitmap. */
2254 wxPGChoiceEntry
& Add( const wxString
& label
,
2255 const wxBitmap
& bitmap
,
2256 int value
= wxPG_INVALID_VALUE
);
2258 /** Adds a single item with full entry information. */
2259 wxPGChoiceEntry
& Add( const wxPGChoiceEntry
& entry
)
2261 return Insert(entry
, -1);
2264 /** Adds single item. */
2265 wxPGChoiceEntry
& AddAsSorted( const wxString
& label
,
2266 int value
= wxPG_INVALID_VALUE
);
2268 void Assign( const wxPGChoices
& a
)
2270 AssignData(a
.m_data
);
2273 void AssignData( wxPGChoicesData
* data
);
2275 /** Delete all choices. */
2278 if ( m_data
!= wxPGChoicesEmptyData
)
2284 if ( m_data
== wxPGChoicesEmptyData
)
2285 m_data
= new wxPGChoicesData();
2288 /** Gets a unsigned number identifying this list. */
2289 wxPGChoicesId
GetId() const { return (wxPGChoicesId
) m_data
; };
2291 const wxString
& GetLabel( size_t ind
) const
2293 return Item(ind
).GetText();
2296 size_t GetCount () const
2298 wxASSERT_MSG( m_data
, "When checking if wxPGChoices is valid, "
2299 "use IsOk() instead of GetCount()" );
2300 return m_data
->GetCount();
2303 int GetValue( size_t ind
) const { return Item(ind
).GetValue(); }
2305 /** Returns array of values matching the given strings. Unmatching strings
2306 result in wxPG_INVALID_VALUE entry in array.
2308 wxArrayInt
GetValuesForStrings( const wxArrayString
& strings
) const;
2310 /** Returns array of indices matching given strings. Unmatching strings
2311 are added to 'unmatched', if not NULL.
2313 wxArrayInt
GetIndicesForStrings( const wxArrayString
& strings
,
2314 wxArrayString
* unmatched
= NULL
) const;
2316 /** Returns true if choices in general are likely to have values
2317 (depens on that all entries have values or none has)
2319 bool HasValues() const;
2321 bool HasValue( unsigned int i
) const
2322 { return (i
< m_data
->GetCount()) && m_data
->Item(i
)->HasValue(); }
2324 int Index( const wxString
& str
) const;
2325 int Index( int val
) const;
2327 /** Inserts single item. */
2328 wxPGChoiceEntry
& Insert( const wxString
& label
,
2330 int value
= wxPG_INVALID_VALUE
);
2332 /** Inserts a single item with full entry information. */
2333 wxPGChoiceEntry
& Insert( const wxPGChoiceEntry
& entry
, int index
);
2335 /** Returns false if this is a constant empty set of choices,
2336 which should not be modified.
2340 return ( m_data
!= wxPGChoicesEmptyData
);
2343 const wxPGChoiceEntry
& Item( unsigned int i
) const
2346 return *m_data
->Item(i
);
2349 wxPGChoiceEntry
& Item( unsigned int i
)
2352 return *m_data
->Item(i
);
2355 /** Removes count items starting at position nIndex. */
2356 void RemoveAt(size_t nIndex
, size_t count
= 1);
2359 /** Does not create copies for itself. */
2360 void Set( const wxChar
** labels
, const long* values
= NULL
)
2366 /** Version that works with wxArrayString.
2367 TODO: Deprecate this.
2369 void Set( wxArrayString
& arr
, const long* values
= (const long*) NULL
)
2376 /** Version that works with wxArrayString and wxArrayInt. */
2377 void Set( const wxArrayString
& labels
,
2378 const wxArrayInt
& values
= wxArrayInt() )
2387 // Creates exclusive copy of current choices
2390 if ( m_data
->m_refCount
!= 1 )
2392 wxPGChoicesData
* data
= new wxPGChoicesData();
2393 data
->CopyDataFrom(m_data
);
2399 // Returns data, increases refcount.
2400 wxPGChoicesData
* GetData()
2402 wxASSERT( m_data
->m_refCount
!= 0xFFFFFFF );
2403 m_data
->m_refCount
++;
2407 // Returns plain data ptr - no refcounting stuff is done.
2408 wxPGChoicesData
* GetDataPtr() const { return m_data
; }
2410 // Changes ownership of data to you.
2411 wxPGChoicesData
* ExtractData()
2413 wxPGChoicesData
* data
= m_data
;
2414 m_data
= wxPGChoicesEmptyData
;
2418 wxArrayString
GetLabels() const;
2421 void operator= (const wxPGChoices
& a
)
2423 AssignData(a
.m_data
);
2426 wxPGChoiceEntry
& operator[](unsigned int i
)
2431 const wxPGChoiceEntry
& operator[](unsigned int i
) const
2437 wxPGChoicesData
* m_data
;
2444 inline bool wxPGProperty::SetChoices( const wxArrayString
& labels
,
2445 const wxArrayInt
& values
)
2447 wxPGChoices
chs(labels
, values
);
2448 return SetChoices(chs
);
2451 // -----------------------------------------------------------------------
2453 #endif // _WX_PROPGRID_PROPERTY_H_