]> git.saurik.com Git - wxWidgets.git/blobdiff - interface/wx/propgrid/property.h
Allow wxAutomationObject::GetInstance() create new instance if needed.
[wxWidgets.git] / interface / wx / propgrid / property.h
index 2c4b99c16f320ba5063f501c3727bd15f525d59e..e2bbb158ec33710188ef7b0e006f643a9d2a57e6 100644 (file)
@@ -3,7 +3,7 @@
 // Purpose:     interface of wxPGProperty
 // Author:      wxWidgets team
 // RCS-ID:      $Id$
-// Licence:     wxWindows license
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 
 */
 #define wxPG_ATTR_UNITS                     wxS("Units")
 
-/** Universal, string. When set, will be shown in property's value cell
-    when displayed value string is empty, or value is unspecified.
+/** When set, will be shown as 'greyed' text in property's value cell when
+    the actual displayed value is blank.
+*/
+#define wxPG_ATTR_HINT                      wxS("Hint")
+
+/**
+    @deprecated Use "Hint" (wxPG_ATTR_HINT) instead.
 */
 #define wxPG_ATTR_INLINE_HELP               wxS("InlineHelp")
 
 */
 #define wxPG_ATTR_AUTOCOMPLETE              wxS("AutoComplete")
 
-/** wxBoolProperty specific, int, default 0. When 1 sets bool property to
-    use checkbox instead of choice.
+/** wxBoolProperty and wxFlagsProperty specific. Value type is bool.
+    Default value is False.
+
+    When set to True, bool property will use check box instead of a
+    combo box as its editor control. If you set this attribute
+    for a wxFlagsProperty, it is automatically applied to child
+    bool properties.
 */
 #define wxPG_BOOL_USE_CHECKBOX              wxS("UseCheckbox")
 
-/** wxBoolProperty specific, int, default 0. When 1 sets bool property value
-    to cycle on double click (instead of showing the popup listbox).
+/** wxBoolProperty and wxFlagsProperty specific. Value type is bool.
+    Default value is False.
+
+    Set to True for the bool property to cycle value on double click
+    (instead of showing the popup listbox). If you set this attribute
+    for a wxFlagsProperty, it is automatically applied to child
+    bool properties.
 */
 #define wxPG_BOOL_USE_DOUBLE_CLICK_CYCLING  wxS("UseDClickCycling")
 
 */
 #define wxPG_DIR_DIALOG_MESSAGE             wxS("DialogMessage")
 
+/**
+    wxArrayStringProperty's string delimiter character. If this is aquotation
+    mark or hyphen, then strings will be quoted instead (with given
+    character).
+
+    Default delimiter is quotation mark.
+*/
+#define wxPG_ARRAY_DELIMITER                wxS("Delimiter")
+
 /** Sets displayed date format for wxDateProperty.
 */
 #define wxPG_DATE_FORMAT                    wxS("DateFormat")
 */
 
 
+/** @section propgrid_propflags wxPGProperty Flags
+    @{
+*/
+
+enum wxPGPropertyFlags
+{
+
+/** Indicates bold font.
+*/
+wxPG_PROP_MODIFIED                  = 0x0001,
+
+/** Disables ('greyed' text and editor does not activate) property.
+*/
+wxPG_PROP_DISABLED                  = 0x0002,
+
+/** Hider button will hide this property.
+*/
+wxPG_PROP_HIDDEN                    = 0x0004,
+
+/** This property has custom paint image just in front of its value.
+    If property only draws custom images into a popup list, then this
+    flag should not be set.
+*/
+wxPG_PROP_CUSTOMIMAGE               = 0x0008,
+
+/** Do not create text based editor for this property (but button-triggered
+    dialog and choice are ok).
+*/
+wxPG_PROP_NOEDITOR                  = 0x0010,
+
+/** Property is collapsed, ie. it's children are hidden.
+*/
+wxPG_PROP_COLLAPSED                 = 0x0020,
+
+/**
+    If property is selected, then indicates that validation failed for pending
+    value.
+
+    If property is not selected, then indicates that the the actual property
+    value has failed validation (NB: this behavior is not currently supported,
+    but may be used in future).
+*/
+wxPG_PROP_INVALID_VALUE             = 0x0040,
+
+// 0x0080,
+
+/** Switched via SetWasModified(). Temporary flag - only used when
+    setting/changing property value.
+*/
+wxPG_PROP_WAS_MODIFIED              = 0x0200,
+
+/**
+    If set, then child properties (if any) are private, and should be
+    "invisible" to the application.
+*/
+wxPG_PROP_AGGREGATE                 = 0x0400,
+
+/** If set, then child properties (if any) are copies and should not
+    be deleted in dtor.
+*/
+wxPG_PROP_CHILDREN_ARE_COPIES       = 0x0800,
+
+/**
+    Classifies this item as a non-category.
+
+    Used for faster item type identification.
+*/
+wxPG_PROP_PROPERTY                  = 0x1000,
+
+/**
+    Classifies this item as a category.
+
+    Used for faster item type identification.
+*/
+wxPG_PROP_CATEGORY                  = 0x2000,
+
+/** Classifies this item as a property that has children, but is not aggregate
+    (ie children are not private).
+*/
+wxPG_PROP_MISC_PARENT               = 0x4000,
+
+/** Property is read-only. Editor is still created for wxTextCtrl-based
+    property editors. For others, editor is not usually created because
+    they do implement wxTE_READONLY style or equivalent.
+*/
+wxPG_PROP_READONLY                  = 0x8000,
+
+//
+// NB: FLAGS ABOVE 0x8000 CANNOT BE USED WITH PROPERTY ITERATORS
+//
+
+/** Property's value is composed from values of child properties.
+    @remarks
+    This flag cannot be used with property iterators.
+*/
+wxPG_PROP_COMPOSED_VALUE            = 0x00010000,
+
+/** Common value of property is selectable in editor.
+    @remarks
+    This flag cannot be used with property iterators.
+*/
+wxPG_PROP_USES_COMMON_VALUE         = 0x00020000,
+
+/** Property can be set to unspecified value via editor.
+    Currently, this applies to following properties:
+    - wxIntProperty, wxUIntProperty, wxFloatProperty, wxEditEnumProperty:
+      Clear the text field
+
+    @remarks
+    This flag cannot be used with property iterators.
+
+    @see wxPGProperty::SetAutoUnspecified()
+*/
+wxPG_PROP_AUTO_UNSPECIFIED          = 0x00040000,
+
+/** Indicates the bit useable by derived properties.
+*/
+wxPG_PROP_CLASS_SPECIFIC_1          = 0x00080000,
+
+/** Indicates the bit useable by derived properties.
+*/
+wxPG_PROP_CLASS_SPECIFIC_2          = 0x00100000,
+
+/** Indicates that the property is being deleted and should be ignored.
+*/
+wxPG_PROP_BEING_DELETED             = 0x00200000
+
+};
+
+/** Topmost flag.
+*/
+#define wxPG_PROP_MAX               wxPG_PROP_AUTO_UNSPECIFIED
+
+/** Property with children must have one of these set, otherwise iterators
+    will not work correctly.
+    Code should automatically take care of this, however.
+*/
+#define wxPG_PROP_PARENTAL_FLAGS \
+    ((wxPGPropertyFlags)(wxPG_PROP_AGGREGATE | \
+                         wxPG_PROP_CATEGORY | \
+                         wxPG_PROP_MISC_PARENT))
+
+/** @}
+*/
+
 
 /**
     @class wxPGProperty
     @subsection wxPropertyCategory
 
     Not an actual property per se, but a header for a group of properties.
-    Regardless inherits from wxPGProperty.
+    Regardless inherits from wxPGProperty, and supports displaying 'labels'
+    for columns other than the first one. Easiest way to set category's
+    label for second column is to call wxPGProperty::SetValue() with string
+    argument.
 
     @subsection wxStringProperty
 
 
     @subsection wxFlagsProperty
 
-    Represents a bit set that fits in a long integer. wxBoolProperty sub-properties
-    are created for editing individual bits. Textctrl is created to manually edit
-    the flags as a text; a continous sequence of spaces, commas and semicolons
-    is considered as a flag id separator.
-    <b>Note: </b> When changing "choices" (ie. flag labels) of wxFlagsProperty, you
-    will need to use wxPGProperty::SetChoices() - otherwise they will not get updated
-    properly.
+    Represents a bit set that fits in a long integer. wxBoolProperty sub-
+    properties are created for editing individual bits. Textctrl is created to
+    manually edit the flags as a text; a continous sequence of spaces, commas
+    and semicolons are considered as a flag id separator.
+
+    <b>Note:</b> When changing "choices" (ie. flag labels) of wxFlagsProperty,
+    you will need to use wxPGProperty::SetChoices() - otherwise they will not
+    get updated properly.
+
+    wxFlagsProperty supports the same attributes as wxBoolProperty.
 
     @subsection wxArrayStringProperty
 
-    Allows editing of a list of strings in wxTextCtrl and in a separate dialog.
+    Allows editing of a list of strings in wxTextCtrl and in a separate
+    dialog. Supports "Delimiter" attribute, which defaults to comma (',').
 
     @subsection wxDateProperty
 
         class MyProperty : public wxPGProperty
         {
         public:
-            // All arguments of ctor must have a default value -
+            // Default constructor
+            MyProperty() { }
+
+            // All arguments of this ctor must have a default value -
             // use wxPG_LABEL for label and name
             MyProperty( const wxString& label = wxPG_LABEL,
                         const wxString& name = wxPG_LABEL,
                         const wxString& value = wxEmptyString )
+                : wxPGProperty(label, name)
             {
                 // m_value is wxVariant
                 m_value = value;
     @endcode
 
     Since wxPGProperty derives from wxObject, you can use standard
-    DECLARE_DYNAMIC_CLASS and IMPLEMENT_DYNAMIC_CLASS macros. From the
+    wxDECLARE_DYNAMIC_CLASS and wxIMPLEMENT_DYNAMIC_CLASS macros. From the
     above example they were omitted for sake of simplicity, and besides,
     they are only really needed if you need to use wxRTTI with your
     property class.
@@ -496,7 +676,7 @@ public:
         @code
 
         MyProperty( const wxString& label, const wxString& name, const T& value )
-            : wxPGProperty()
+            : wxPGProperty(label, name)
         {
             // Generally recommended way to set the initial value
             // (as it should work in pretty much 100% of cases).
@@ -685,18 +865,25 @@ public:
     virtual bool OnEvent( wxPropertyGrid* propgrid, wxWindow* wnd_primary, wxEvent& event );
 
     /**
-        Called after value of a child property has been altered. Note that this function is
-        usually called at the time that value of this property, or given child property, is
-        still pending for change.
+        Called after value of a child property has been altered. Must return
+        new value of the whole property (after any alterations warrented by
+        child's new value).
+
+        Note that this function is usually called at the time that value of
+        this property, or given child property, is still pending for change,
+        and as such, result of GetValue() or m_value should not be relied
+        on.
 
         Sample pseudo-code implementation:
 
         @code
-        void MyProperty::ChildChanged( wxVariant& thisValue, int childIndex, wxVariant& childValue ) const
+        wxVariant MyProperty::ChildChanged( wxVariant& thisValue,
+                                            int childIndex,
+                                            wxVariant& childValue ) const
         {
             // Acquire reference to actual type of data stored in variant
-            // (TFromVariant only exists if wxPropertyGrid's wxVariant-macros were used to create
-            // the variant class).
+            // (TFromVariant only exists if wxPropertyGrid's wxVariant-macros
+            // were used to create the variant class).
             T& data = TFromVariant(thisValue);
 
             // Copy childValue into data.
@@ -710,17 +897,28 @@ public:
                     break;
                 ...
             }
+
+            // Return altered data
+            return data;
         }
         @endcode
 
         @param thisValue
-            Value of this property, that should be altered.
+            Value of this property. Changed value should be returned (in
+            previous versions of wxPropertyGrid it was only necessary to
+            write value back to this argument).
         @param childIndex
-            Index of child changed (you can use Item(childIndex) to get).
+            Index of child changed (you can use Item(childIndex) to get
+            child property).
         @param childValue
-            Value of the child property.
+            (Pending) value of the child property.
+
+        @return
+            Modified value of the whole property.
     */
-    virtual void ChildChanged( wxVariant& thisValue, int childIndex, wxVariant& childValue ) const;
+    virtual wxVariant ChildChanged( wxVariant& thisValue,
+                                    int childIndex,
+                                    wxVariant& childValue ) const;
 
     /**
         Returns pointer to an instance of used editor.
@@ -838,12 +1036,15 @@ public:
     virtual void RefreshChildren();
 
     /**
-        Special handling for attributes of this property.
+        Reimplement this member function to add special handling for
+        attributes of this property.
 
-        If returns @false, then the attribute will be automatically stored in
-        m_attributes.
+        @return Return @false to have the attribute automatically stored in
+                m_attributes. Default implementation simply does that and
+                nothing else.
 
-        Default implementation simply returns @false.
+        @remarks To actually set property attribute values from the
+                 application, use wxPGProperty::SetAttribute() instead.
     */
     virtual bool DoSetAttribute( const wxString& name, wxVariant& value );
 
@@ -941,6 +1142,18 @@ public:
     */
     bool AreChildrenComponents() const;
 
+    /**
+        Sets or clears given property flag. Mainly for internal use.
+
+        @remarks Setting a property flag never has any side-effect, and is
+                 intended almost exclusively for internal use. So, for
+                 example, if you want to disable a property, call
+                 Enable(false) instead of setting wxPG_PROP_DISABLED flag.
+
+        @see HasFlag(), GetFlags()
+    */
+    void ChangeFlag( wxPGPropertyFlags flag, bool set );
+
     /**
         Deletes children of the property.
     */
@@ -956,6 +1169,17 @@ public:
     /** Deletes all child properties. */
     void Empty();
 
+    /**
+        Enables or disables the property. Disabled property usually appears
+        as having grey text.
+
+        @param enable
+            If @false, property is disabled instead.
+
+        @see wxPropertyGridInterface::EnableProperty()
+    */
+    void Enable( bool enable = true );
+
     /**
         Composes text from values of child properties.
     */
@@ -993,9 +1217,23 @@ public:
 
     /**
         Returns wxPGCell of given column.
+
+        @remarks const version of this member function returns 'default'
+                 wxPGCell object if the property itself didn't hold
+                 cell data.
     */
     const wxPGCell& GetCell( unsigned int column ) const;
 
+    /**
+        Returns wxPGCell of given column, creating one if necessary.
+    */
+    wxPGCell& GetCell( unsigned int column );
+
+    /**
+        Returns wxPGCell of given column, creating one if necessary.
+    */
+    wxPGCell& GetOrCreateCell( unsigned int column );
+
     /**
         Returns number of child properties.
     */
@@ -1045,6 +1283,11 @@ public:
     */
     const wxPGEditor* GetEditorClass() const;
 
+    /**
+        Returns property flags.
+    */
+    FlagType GetFlags() const;
+
     /** Returns property grid where property lies. */
     wxPropertyGrid* GetGrid() const;
 
@@ -1149,6 +1392,13 @@ public:
     */
     int GetY() const;
 
+    /**
+        Returns non-zero if property has given flag set.
+
+        @see propgrid_propflags
+    */
+    FlagType HasFlag( wxPGPropertyFlags flag ) const;
+
     /**
         Returns @true if property has even one visible child.
     */
@@ -1268,18 +1518,31 @@ public:
     */
     void SetAttribute( const wxString& name, wxVariant value );
 
+    /**
+        Set if user can change the property's value to unspecified by
+        modifying the value of the editor control (usually by clearing
+        it).  Currently, this can work with following properties:
+        wxIntProperty, wxUIntProperty, wxFloatProperty, wxEditEnumProperty.
+
+        @param enable
+            Whether to enable or disable this behavior (it is disabled by
+            default).
+    */
+    void SetAutoUnspecified( bool enable = true );
+
     /**
         Sets property's background colour.
 
         @param colour
             Background colour to use.
 
-        @param recursively
-            If @true, children are affected recursively, and any categories
-            are not.
+        @param flags
+            Default is wxPG_RECURSE which causes colour to be set recursively.
+            Omit this flag to only set colour for the property in question
+            and not any of its children.
     */
     void SetBackgroundColour( const wxColour& colour,
-                              bool recursively = false );
+                              int flags = wxPG_RECURSE );
 
     /**
         Sets editor for a property.
@@ -1303,9 +1566,10 @@ public:
     void SetCell( int column, const wxPGCell& cell );
 
     /**
-        Sets new set of choices for property.
+        Sets new set of choices for the property.
 
-        @remarks This operation clears the property value.
+        @remarks This operation deselects the property and clears its
+                 value.
     */
     bool SetChoices( wxPGChoices& choices );
 
@@ -1328,6 +1592,22 @@ public:
     */
     void SetChoiceSelection( int newValue );
 
+    /** Set default value of a property. Synonymous to
+
+        @code
+            SetAttribute("DefaultValue", value);
+        @endcode
+    */
+    void SetDefaultValue( wxVariant& value );
+
+    /**
+        Sets or clears given property flag, recursively. This function is
+        primarily intended for internal use.
+
+        @see ChangeFlag()
+    */
+    void SetFlagRecursively( wxPGPropertyFlags flag, bool set );
+
     /**
         Sets property's help string, which is shown, for example, in
         wxPropertyGridManager's description text box.
@@ -1376,12 +1656,13 @@ public:
         @param colour
             Text colour to use.
 
-        @param recursively
-            If @true, children are affected recursively, and any categories
-            are not.
+        @param flags
+            Default is wxPG_RECURSE which causes colour to be set recursively.
+            Omit this flag to only set colour for the property in question
+            and not any of its children.
     */
     void SetTextColour( const wxColour& colour,
-                        bool recursively = false );
+                        int flags = wxPG_RECURSE );
 
     /** Sets wxValidator for a property */
     void SetValidator( const wxValidator& validator );
@@ -1448,13 +1729,80 @@ public:
 };
 
 
+/**
+    @class wxPGCell
+
+    Base class for wxPropertyGrid cell information.
+
+    @library{wxpropgrid}
+    @category{propgrid}
+*/
+class wxPGCell : public wxObject
+{
+public:
+    wxPGCell();
+    wxPGCell(const wxPGCell& other);
+    wxPGCell( const wxString& text,
+              const wxBitmap& bitmap = wxNullBitmap,
+              const wxColour& fgCol = wxNullColour,
+              const wxColour& bgCol = wxNullColour );
+
+    virtual ~wxPGCell();
+
+    const wxPGCellData* GetData() const;
+
+    /**
+        Returns @true if this cell has custom text stored within.
+    */
+    bool HasText() const;
+
+    /**
+        Merges valid data from srcCell into this.
+    */
+    void MergeFrom( const wxPGCell& srcCell );
+
+    void SetText( const wxString& text );
+    void SetBitmap( const wxBitmap& bitmap );
+    void SetFgCol( const wxColour& col );
+
+    /**
+        Sets font of the cell.
+
+        @remarks Because wxPropertyGrid does not support rows of
+                 different height, it makes little sense to change
+                 size of the font. Therefore it is recommended
+                 to use return value of wxPropertyGrid::GetFont()
+                 or wxPropertyGrid::GetCaptionFont() as a basis
+                 for the font that, after modifications, is passed
+                 to this member function.
+    */
+    void SetFont( const wxFont& font );
+
+    void SetBgCol( const wxColour& col );
+
+    const wxString& GetText() const;
+    const wxBitmap& GetBitmap() const;
+    const wxColour& GetFgCol() const;
+
+    /**
+        Returns font of the cell. If no specific font is set for this
+        cell, then the font will be invalid.
+    */
+    const wxFont& GetFont() const;
+
+    const wxColour& GetBgCol() const;
+
+    wxPGCell& operator=( const wxPGCell& other );
+};
+
+
 /**
     @class wxPGChoices
 
     Helper class for managing choices of wxPropertyGrid properties.
     Each entry can have label, value, bitmap, text colour, and background
     colour.
+
     wxPGChoices uses reference counting, similar to other wxWidgets classes.
     This means that assignment operator and copy constructor only copy the
     reference and not the actual data. Use Copy() member function to create a
@@ -1465,7 +1813,7 @@ public:
     @library{wxpropgrid}
     @category{propgrid}
 */
-class WXDLLIMPEXP_PROPGRID wxPGChoices
+class wxPGChoices
 {
 public:
     typedef long ValArrItem;
@@ -1567,6 +1915,10 @@ public:
     wxArrayInt GetIndicesForStrings( const wxArrayString& strings,
                                      wxArrayString* unmatched = NULL ) const;
 
+    /** Returns property at given virtual y coordinate.
+    */
+    wxPGProperty* GetItemAtY( unsigned int y ) const;
+
     /**
         Returns @true if item at given index has a valid value;
     */