]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/propgrid/property.h
fixing infinite recursion for rotated text, introduced in cleanup r57915
[wxWidgets.git] / include / wx / propgrid / property.h
index 1986c326bdc8777186a66f55615ee5696a18fde2..176db3d61ee0e0c1af93e891659222d32772cbb6 100644 (file)
@@ -4,7 +4,7 @@
 // Author:      Jaakko Salli
 // Modified by:
 // Created:     2008-08-23
-// RCS-ID:      $Id:
+// RCS-ID:      $Id$
 // Copyright:   (c) Jaakko Salli
 // Licence:     wxWindows license
 /////////////////////////////////////////////////////////////////////////////
@@ -12,6 +12,8 @@
 #ifndef _WX_PROPGRID_PROPERTY_H_
 #define _WX_PROPGRID_PROPERTY_H_
 
+#if wxUSE_PROPGRID
+
 #include "wx/propgrid/propgriddefs.h"
 
 // -----------------------------------------------------------------------
@@ -45,13 +47,6 @@ struct wxPGPaintData
 };
 
 
-// Structure for relaying choice/list info.
-struct wxPGChoiceInfo
-{
-    wxPGChoices*    m_choices;
-};
-
-
 #ifndef SWIG
 
 
@@ -80,8 +75,27 @@ public:
     // Render flags
     enum
     {
+        // We are painting selected item
         Selected        = 0x00010000,
-        Control         = 0x00020000
+
+        // We are painting item in choice popup
+        ChoicePopup     = 0x00020000,
+
+        // We are rendering wxOwnerDrawnComboBox control
+        // (or other owner drawn control, but that is only
+        // officially supported one ATM).
+        Control         = 0x00040000,
+
+        // We are painting a disable property
+        Disabled        = 0x00080000,
+
+        // We are painting selected, disabled, or similar
+        // item that dictates fore- and background colours,
+        // overriding any cell values.
+        DontUseCellFgCol    = 0x00100000,
+        DontUseCellBgCol    = 0x00200000,
+        DontUseCellColours  = DontUseCellFgCol |
+                              DontUseCellBgCol
     };
 
     virtual void Render( wxDC& dc,
@@ -150,14 +164,46 @@ private:
 };
 
 
+class WXDLLIMPEXP_PROPGRID wxPGCellData : public wxObjectRefData
+{
+    friend class wxPGCell;
+public:
+    wxPGCellData();
+
+    void SetText( const wxString& text )
+    {
+        m_text = text;
+        m_hasValidText = true;
+    }
+    void SetBitmap( const wxBitmap& bitmap ) { m_bitmap = bitmap; }
+    void SetFgCol( const wxColour& col ) { m_fgCol = col; }
+    void SetBgCol( const wxColour& col ) { m_bgCol = col; }
+
+protected:
+    virtual ~wxPGCellData() { }
+
+    wxString    m_text;
+    wxBitmap    m_bitmap;
+    wxColour    m_fgCol;
+    wxColour    m_bgCol;
+
+    // True if m_text is valid and specified
+    bool        m_hasValidText;
+};
+
 /** @class wxPGCell
 
     Base class for simple wxPropertyGrid cell information.
 */
-class WXDLLIMPEXP_PROPGRID wxPGCell
+class WXDLLIMPEXP_PROPGRID wxPGCell : public wxObject
 {
 public:
     wxPGCell();
+    wxPGCell(const wxPGCell& other)
+        : wxObject(other)
+    {
+    }
+
     wxPGCell( const wxString& text,
               const wxBitmap& bitmap = wxNullBitmap,
               const wxColour& fgCol = wxNullColour,
@@ -165,21 +211,50 @@ public:
 
     virtual ~wxPGCell() { }
 
-    void SetText( const wxString& text ) { m_text = text; }
-    void SetBitmap( const wxBitmap& bitmap ) { m_bitmap = bitmap; }
-    void SetFgCol( const wxColour& col ) { m_fgCol = col; }
-    void SetBgCol( const wxColour& col ) { m_bgCol = col; }
+    wxPGCellData* GetData()
+    {
+        return (wxPGCellData*) m_refData;
+    }
+
+    const wxPGCellData* GetData() const
+    {
+        return (const wxPGCellData*) m_refData;
+    }
+
+    bool HasText() const
+    {
+        return (m_refData && GetData()->m_hasValidText);
+    }
+
+    /**
+        Merges valid data from srcCell into this.
+    */
+    void MergeFrom( const wxPGCell& srcCell );
 
-    const wxString& GetText() const { return m_text; }
-    const wxBitmap& GetBitmap() const { return m_bitmap; }
-    const wxColour& GetFgCol() const { return m_fgCol; }
-    const wxColour& GetBgCol() const { return m_bgCol; }
+    void SetText( const wxString& text );
+    void SetBitmap( const wxBitmap& bitmap );
+    void SetFgCol( const wxColour& col );
+    void SetBgCol( const wxColour& col );
+
+    const wxString& GetText() const { return GetData()->m_text; }
+    const wxBitmap& GetBitmap() const { return GetData()->m_bitmap; }
+    const wxColour& GetFgCol() const { return GetData()->m_fgCol; }
+    const wxColour& GetBgCol() const { return GetData()->m_bgCol; }
+
+    wxPGCell& operator=( const wxPGCell& other )
+    {
+        if ( this != &other )
+        {
+            Ref(other);
+        }
+        return *this;
+    }
 
 protected:
-    wxString    m_text;
-    wxBitmap    m_bitmap;
-    wxColour    m_fgCol;
-    wxColour    m_bgCol;
+    virtual wxObjectRefData *CreateRefData() const
+        { return new wxPGCellData(); }
+
+    virtual wxObjectRefData *CloneRefData(const wxObjectRefData *data) const;
 };
 
 
@@ -220,7 +295,7 @@ public:
     ~wxPGAttributeStorage();
 
     void Set( const wxString& name, const wxVariant& value );
-    size_t GetCount() const { return m_map.size(); }
+    unsigned int GetCount() const { return (unsigned int) m_map.size(); }
     wxVariant FindValue( const wxString& name ) const
     {
         wxPGHashMapS2P::const_iterator it = m_map.find(name);
@@ -247,7 +322,7 @@ public:
         data->IncRef();
         variant.SetData(data);
         variant.SetName(it->first);
-        it++;
+        ++it;
         return true;
     }
 
@@ -394,9 +469,6 @@ wxPG_PROP_CLASS_SPECIFIC_2          = 0x00100000
 /** @}
 */
 
-// Amalgam of flags that should be inherited by sub-properties
-#define wxPG_INHERITED_PROPFLAGS        (wxPG_PROP_HIDDEN|wxPG_PROP_NOEDITOR)
-
 // Combination of flags that can be stored by GetFlagsAsString
 #define wxPG_STRING_STORED_FLAGS \
     (wxPG_PROP_DISABLED|wxPG_PROP_HIDDEN|wxPG_PROP_NOEDITOR|wxPG_PROP_COLLAPSED)
@@ -410,7 +482,7 @@ wxPG_PROP_CLASS_SPECIFIC_2          = 0x00100000
     Identifiers.
 
     wxPGProperty::SetAttribute() and
-    wxPropertyGridInterfaces::SetPropertyAttribute() accept one of these as
+    wxPropertyGridInterface::SetPropertyAttribute() accept one of these as
     attribute name argument.
 
     You can use strings instead of constants. However, some of these
@@ -548,16 +620,9 @@ wxPG_PROP_CLASS_SPECIFIC_2          = 0x00100000
 */
 #define wxPG_COLOUR_ALLOW_CUSTOM            wxS("AllowCustom")
 
-/** First attribute id that is guaranteed not to be used built-in
-    properties.
-*/
-//#define wxPG_USER_ATTRIBUTE                 192
-
 /** @}
 */
 
-#ifndef DOXYGEN
-
 // Redefine attribute macros to use cached strings
 #undef wxPG_ATTR_MIN
 #define wxPG_ATTR_MIN                     wxPGGlobalVars->m_strMin
@@ -568,266 +633,395 @@ wxPG_PROP_CLASS_SPECIFIC_2          = 0x00100000
 #undef wxPG_ATTR_INLINE_HELP
 #define wxPG_ATTR_INLINE_HELP             wxPGGlobalVars->m_strInlineHelp
 
-#endif  // !DOXYGEN
-
 #endif  // !SWIG
 
 // -----------------------------------------------------------------------
 
-/** @class wxPGProperty
-
-    wxPGProperty is base class for all wxPropertyGrid properties. In
-    sections below we cover few related topics.
-
-    @li @ref pgproperty_properties
-    @li @ref pgproperty_creating
-
-    @section pgproperty_properties Supplied Ready-to-use Property Classes
+#ifndef SWIG
 
-    Here is a list and short description of supplied fully-functional
-    property classes. They are located in either props.h or advprops.h.
+/** @class wxPGChoiceEntry
+    Data of a single wxPGChoices choice.
+*/
+class WXDLLIMPEXP_PROPGRID wxPGChoiceEntry : public wxPGCell
+{
+public:
+    wxPGChoiceEntry();
+    wxPGChoiceEntry(const wxPGChoiceEntry& other)
+        : wxPGCell(other)
+    {
+        m_value = other.m_value;
+    }
+    wxPGChoiceEntry( const wxString& label,
+                     int value = wxPG_INVALID_VALUE )
+        : wxPGCell(), m_value(value)
+    {
+        SetText(label);
+    }
 
-    @li @ref wxArrayStringProperty
-    @li @ref wxBoolProperty
-    @li @ref wxColourProperty
-    @li @ref wxCursorProperty
-    @li @ref wxDateProperty
-    @li @ref wxDirProperty
-    @li @ref wxEditEnumProperty
-    @li @ref wxEnumProperty
-    @li @ref wxFileProperty
-    @li @ref wxFlagsProperty
-    @li @ref wxFloatProperty
-    @li @ref wxFontProperty
-    @li @ref wxImageFileProperty
-    @li @ref wxIntProperty
-    @li @ref wxLongStringProperty
-    @li @ref wxMultiChoiceProperty
-    @li @ref wxPropertyCategory
-    @li @ref wxStringProperty
-    @li @ref wxSystemColourProperty
-    @li @ref wxUIntProperty
+    virtual ~wxPGChoiceEntry() { }
 
-    @subsection wxPropertyCategory
+    void SetValue( int value ) { m_value = value; }
+    int GetValue() const { return m_value; }
 
-    Not an actual property per se, but a header for a group of properties.
-    Regardless inherits from wxPGProperty.
+    wxPGChoiceEntry& operator=( const wxPGChoiceEntry& other )
+    {
+        if ( this != &other )
+        {
+            Ref(other);
+        }
+        m_value = other.m_value;
+        return *this;
+    }
 
-    @subsection wxStringProperty
+protected:
+    int m_value;
+};
 
-    Simple string property. wxPG_STRING_PASSWORD attribute may be used
-    to echo value as asterisks and use wxTE_PASSWORD for wxTextCtrl.
 
-    @remarks
-    * wxStringProperty has a special trait: if it has value of "<composed>",
-      and also has child properties, then its displayed value becomes
-      composition of child property values, similar as with wxFontProperty,
-      for instance.
+typedef void* wxPGChoicesId;
 
-    @subsection wxIntProperty
+class WXDLLIMPEXP_PROPGRID wxPGChoicesData
+{
+    friend class wxPGChoices;
+public:
+    // Constructor sets m_refCount to 1.
+    wxPGChoicesData();
 
-    Like wxStringProperty, but converts text to a signed long integer.
-    wxIntProperty seamlessly supports 64-bit integers (ie. wxLongLong).
+    void CopyDataFrom( wxPGChoicesData* data );
 
-    @subsection wxUIntProperty
+    wxPGChoiceEntry& Insert( int index, const wxPGChoiceEntry& item );
 
-    Like wxIntProperty, but displays value as unsigned int. To set
-    the prefix used globally, manipulate wxPG_UINT_PREFIX string attribute.
-    To set the globally used base, manipulate wxPG_UINT_BASE int
-    attribute. Regardless of current prefix, understands (hex) values starting
-    with both "0x" and "$".
-    wxUIntProperty seamlessly supports 64-bit unsigned integers (ie.
-    wxULongLong).
+    // Delete all entries
+    void Clear();
 
-    @subsection wxFloatProperty
+    unsigned int GetCount() const
+    {
+        return (unsigned int) m_items.size();
+    }
 
-    Like wxStringProperty, but converts text to a double-precision floating
-    point. Default float-to-text precision is 6 decimals, but this can be
-    changed by modifying wxPG_FLOAT_PRECISION attribute.
+    const wxPGChoiceEntry& Item( unsigned int i ) const
+    {
+        wxASSERT_MSG( i < GetCount(), "invalid index" );
+        return m_items[i];
+    }
 
-    @subsection wxBoolProperty
+    wxPGChoiceEntry& Item( unsigned int i )
+    {
+        wxASSERT_MSG( i < GetCount(), "invalid index" );
+        return m_items[i];
+    }
 
-    Represents a boolean value. wxChoice is used as editor control, by the
-    default. wxPG_BOOL_USE_CHECKBOX attribute can be set to true inorder to use
-    check box instead.
+    void DecRef()
+    {
+        m_refCount--;
+        wxASSERT( m_refCount >= 0 );
+        if ( m_refCount == 0 )
+            delete this;
+    }
 
-    @subsection wxLongStringProperty
+private:
+    wxVector<wxPGChoiceEntry>   m_items;
 
-    Like wxStringProperty, but has a button that triggers a small text editor
-    dialog. Note that in long string values, tabs are represented by "\t" and
-    line break by "\n".
+    // So that multiple properties can use the same set
+    int             m_refCount;
 
-    @subsection wxDirProperty
+    virtual ~wxPGChoicesData();
+};
 
-    Like wxLongStringProperty, but the button triggers dir selector instead.
-    Supported properties (all with string value): wxPG_DIR_DIALOG_MESSAGE.
+#define wxPGChoicesEmptyData    ((wxPGChoicesData*)NULL)
 
-    @subsection wxFileProperty
+#endif // SWIG
 
-    Like wxLongStringProperty, but the button triggers file selector instead.
-    Default wildcard is "All files..." but this can be changed by setting
-    wxPG_FILE_WILDCARD attribute (see wxFileDialog for format details).
-    Attribute wxPG_FILE_SHOW_FULL_PATH can be set to false inorder to show
-    only the filename, not the entire path.
+/** @class wxPGChoices
 
-    @subsection wxEnumProperty
+    Helper class for managing choices of wxPropertyGrid properties.
+    Each entry can have label, value, bitmap, text colour, and background
+    colour.
 
-    Represents a single selection from a list of choices -
-    wxOwnerDrawnComboBox is used to edit the value.
+    @remarks If you do not specify value for entry, index is used.
 
-    @subsection wxFlagsProperty
+    @library{wxpropgrid}
+    @category{propgrid}
+*/
+class WXDLLIMPEXP_PROPGRID wxPGChoices
+{
+public:
+    typedef long ValArrItem;
 
-    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 SetPropertyChoices - otherwise they will not get
-    updated properly.
+    /** Default constructor. */
+    wxPGChoices()
+    {
+        Init();
+    }
 
-    @subsection wxArrayStringProperty
+    /** Copy constructor. */
+    wxPGChoices( const wxPGChoices& a )
+    {
+        if ( a.m_data != wxPGChoicesEmptyData )
+        {
+            m_data = a.m_data;
+            m_data->m_refCount++;
+        }
+    }
 
-    Allows editing of a list of strings in wxTextCtrl and in a separate dialog.
+    /**
+        Constructor.
 
-    @subsection wxDateProperty
+        @param labels
+            Labels for choices
 
-    wxDateTime property. Default editor is DatePickerCtrl, altough TextCtrl
-    should work as well. wxPG_DATE_FORMAT attribute can be used to change
-    string wxDateTime::Format uses (altough default is recommended as it is
-    locale-dependant), and wxPG_DATE_PICKER_STYLE allows changing window
-    style given to DatePickerCtrl (default is wxDP_DEFAULT|wxDP_SHOWCENTURY).
+        @param values
+            Values for choices. If NULL, indexes are used.
+    */
+    wxPGChoices( const wxChar** labels, const long* values = NULL )
+    {
+        Init();
+        Set(labels,values);
+    }
 
-    @subsection wxEditEnumProperty
+    /**
+        Constructor.
 
-    Represents a string that can be freely edited or selected from list of
-    choices - custom combobox control is used to edit the value.
+        @param labels
+            Labels for choices
 
-    @subsection wxMultiChoiceProperty
+        @param values
+            Values for choices. If empty, indexes are used.
+    */
+    wxPGChoices( const wxArrayString& labels,
+                 const wxArrayInt& values = wxArrayInt() )
+    {
+        Init();
+        Set(labels,values);
+    }
 
-    Allows editing a multiple selection from a list of strings. This is
-    property is pretty much built around concept of wxMultiChoiceDialog.
-    It uses wxArrayString value.
+    /** Simple interface constructor. */
+    wxPGChoices( wxPGChoicesData* data )
+    {
+        wxASSERT(data);
+        m_data = data;
+        data->m_refCount++;
+    }
 
-    @subsection wxImageFileProperty
+    /** Destructor. */
+    ~wxPGChoices()
+    {
+        Free();
+    }
 
-    Like wxFileProperty, but has thumbnail of the image in front of
-    the filename and autogenerates wildcard from available image handlers.
+    /**
+        Adds to current.
 
-    @subsection wxColourProperty
+        If did not have own copies, creates them now. If was empty, identical
+        to set except that creates copies.
 
-    <b>Useful alternate editor:</b> Choice.
+        @param labels
+            Labels for added choices.
 
-    Represents wxColour. wxButton is used to trigger a colour picker dialog.
+        @param values
+            Values for added choices. If empty, relevant entry indexes are used.
+    */
+    void Add( const wxChar** labels, const ValArrItem* values = NULL );
 
-    @subsection wxFontProperty
+    /** Version that works with wxArrayString and wxArrayInt. */
+    void Add( const wxArrayString& arr, const wxArrayInt& arrint = wxArrayInt() );
 
-    Represents wxFont. Various sub-properties are used to edit individual
-    subvalues.
+    /**
+        Adds a single choice.
 
-    @subsection wxSystemColourProperty
+        @param label
+            Label for added choice.
 
-    Represents wxColour and a system colour index. wxChoice is used to edit
-    the value. Drop-down list has color images. Note that value type
-    is wxColourPropertyValue instead of wxColour.
-    @code
-        class wxColourPropertyValue : public wxObject
-        {
-        public:
-            //  An integer value relating to the colour, and which exact
-            //  meaning depends on the property with which it is used.
-            //
-            //  For wxSystemColourProperty:
-            //  Any of wxSYS_COLOUR_XXX, or any web-colour (use
-            //  wxPG_TO_WEB_COLOUR macro - (currently unsupported) ),
-            //  or wxPG_COLOUR_CUSTOM.
-            wxUint32    m_type;
+        @param value
+            Value for added choice. If unspecified, index is used.
+    */
+    wxPGChoiceEntry& Add( const wxString& label,
+                          int value = wxPG_INVALID_VALUE );
 
-            // Resulting colour. Should be correct regardless of type.
-            wxColour    m_colour;
-        };
-    @endcode
+    /** Adds a single item, with bitmap. */
+    wxPGChoiceEntry& Add( const wxString& label,
+                          const wxBitmap& bitmap,
+                          int value = wxPG_INVALID_VALUE );
 
-    @subsection wxCursorProperty
+    /** Adds a single item with full entry information. */
+    wxPGChoiceEntry& Add( const wxPGChoiceEntry& entry )
+    {
+        return Insert(entry, -1);
+    }
 
-    Represents a wxCursor. wxChoice is used to edit the value.
-    Drop-down list has cursor images under some (wxMSW) platforms.
+    /** Adds single item. */
+    wxPGChoiceEntry& AddAsSorted( const wxString& label,
+                                  int value = wxPG_INVALID_VALUE );
 
+    void Assign( const wxPGChoices& a )
+    {
+        AssignData(a.m_data);
+    }
 
-    @section pgproperty_creating Creating Custom Properties
+    void AssignData( wxPGChoicesData* data );
 
-    New properties can be created by subclassing wxPGProperty or one
-    of the provided property classes, and (re)implementing necessary
-    member functions. Below, each virtual member function has ample
-    documentation about its purpose and any odd details which to keep
-    in mind.
+    /** Delete all choices. */
+    void Clear()
+    {
+        if ( m_data != wxPGChoicesEmptyData )
+            m_data->Clear();
+    }
 
-    Here is a very simple 'template' code:
+    void EnsureData()
+    {
+        if ( m_data == wxPGChoicesEmptyData )
+            m_data = new wxPGChoicesData();
+    }
 
-    @code
-        class MyProperty : public wxPGProperty
-        {
-        public:
-            // All arguments of 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 )
-            {
-                // m_value is wxVariant
-                m_value = value;
-            }
+    /** Gets a unsigned number identifying this list. */
+    wxPGChoicesId GetId() const { return (wxPGChoicesId) m_data; };
 
-            virtual ~MyProperty() { }
+    const wxString& GetLabel( unsigned int ind ) const
+    {
+        return Item(ind).GetText();
+    }
 
-            const wxPGEditor* DoGetEditorClass() const
-            {
-                // Determines editor used by property.
-                // You can replace 'TextCtrl' below with any of these
-                // builtin-in property editor identifiers: Choice, ComboBox,
-                // TextCtrlAndButton, ChoiceAndButton, CheckBox, SpinCtrl,
-                // DatePickerCtrl.
-                return wxPGEditor_TextCtrl;
-            }
+    unsigned int GetCount () const
+    {
+        if ( !m_data )
+            return 0;
 
-            virtual wxString GetValueAsString( int argFlags ) const
-            {
-                // TODO: Return property value in string format
-            }
+        return m_data->GetCount();
+    }
 
-            virtual bool StringToValue( wxVariant& variant,
-                                        const wxString& text,
-                                        int argFlags )
-            {
-                // TODO: Adapt string to property value.
-            }
+    int GetValue( unsigned int ind ) const { return Item(ind).GetValue(); }
 
-        protected:
-        };
-    @endcode
+    /** Returns array of values matching the given strings. Unmatching strings
+        result in wxPG_INVALID_VALUE entry in array.
+    */
+    wxArrayInt GetValuesForStrings( const wxArrayString& strings ) const;
 
-    Since wxPGProperty derives from wxObject, you can use standard
-    DECLARE_DYNAMIC_CLASS and IMPLEMENT_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.
+    /** Returns array of indices matching given strings. Unmatching strings
+        are added to 'unmatched', if not NULL.
+    */
+    wxArrayInt GetIndicesForStrings( const wxArrayString& strings,
+                                     wxArrayString* unmatched = NULL ) const;
 
-    You can change the 'value type' of a property by simply assigning different
-    type of variant with SetValue. <b>It is mandatory to implement
-    wxVariantData class for all data types used as property values.</b>
-    You can use macros declared in wxPropertyGrid headers. For instance:
+    int Index( const wxString& str ) const;
+    int Index( int val ) const;
 
-    @code
-        // In header file:
-        // (If you need to have export declaration, use version of macros
-        // with _EXPORTED postfix)
-        WX_PG_DECLARE_VARIANT_DATA(MyDataClass)
+    /** Inserts single item. */
+    wxPGChoiceEntry& Insert( const wxString& label,
+                             int index,
+                             int value = wxPG_INVALID_VALUE );
 
-        // In sources file:
-        WX_PG_IMPLEMENT_VARIANT_DATA(MyDataClass)
+    /** Inserts a single item with full entry information. */
+    wxPGChoiceEntry& Insert( const wxPGChoiceEntry& entry, int index );
 
-        // Or, if you don't have valid == operator:
-        WX_PG_IMPLEMENT_VARIANT_DATA_DUMMY_EQ(MyDataClass)
-    @endcode
+    /** Returns false if this is a constant empty set of choices,
+        which should not be modified.
+    */
+    bool IsOk() const
+    {
+        return ( m_data != wxPGChoicesEmptyData );
+    }
+
+    const wxPGChoiceEntry& Item( unsigned int i ) const
+    {
+        wxASSERT( IsOk() );
+        return m_data->Item(i);
+    }
+
+    wxPGChoiceEntry& Item( unsigned int i )
+    {
+        wxASSERT( IsOk() );
+        return m_data->Item(i);
+    }
+
+    /** Removes count items starting at position nIndex. */
+    void RemoveAt(size_t nIndex, size_t count = 1);
+
+#ifndef SWIG
+    /** Does not create copies for itself. */
+    void Set( const wxChar** labels, const long* values = NULL )
+    {
+        Free();
+        Add(labels,values);
+    }
+#endif // SWIG
+
+    /** Version that works with wxArrayString and wxArrayInt. */
+    void Set( const wxArrayString& labels,
+              const wxArrayInt& values = wxArrayInt() )
+    {
+        Free();
+        if ( &values )
+            Add(labels,values);
+        else
+            Add(labels);
+    }
+
+    // Creates exclusive copy of current choices
+    void SetExclusive()
+    {
+        if ( m_data->m_refCount != 1 )
+        {
+            wxPGChoicesData* data = new wxPGChoicesData();
+            data->CopyDataFrom(m_data);
+            Free();
+            m_data = data;
+        }
+    }
+
+    // Returns data, increases refcount.
+    wxPGChoicesData* GetData()
+    {
+        wxASSERT( m_data->m_refCount != 0xFFFFFFF );
+        m_data->m_refCount++;
+        return m_data;
+    }
+
+    // Returns plain data ptr - no refcounting stuff is done.
+    wxPGChoicesData* GetDataPtr() const { return m_data; }
+
+    // Changes ownership of data to you.
+    wxPGChoicesData* ExtractData()
+    {
+        wxPGChoicesData* data = m_data;
+        m_data = wxPGChoicesEmptyData;
+        return data;
+    }
+
+    wxArrayString GetLabels() const;
+
+#ifndef SWIG
+    void operator= (const wxPGChoices& a)
+    {
+        if (this != &a)
+            AssignData(a.m_data);
+    }
+
+    wxPGChoiceEntry& operator[](unsigned int i)
+    {
+        return Item(i);
+    }
+
+    const wxPGChoiceEntry& operator[](unsigned int i) const
+    {
+        return Item(i);
+    }
+
+protected:
+    wxPGChoicesData*    m_data;
+
+    void Init();
+    void Free();
+#endif  // !SWIG
+};
+
+// -----------------------------------------------------------------------
+
+/** @class wxPGProperty
+
+    wxPGProperty is base class for all wxPropertyGrid properties.
+
+    NB: Full class overview is now only present in
+        interface/wx/propgrid/property.h.
 
     @library{wxpropgrid}
     @category{propgrid}
@@ -865,7 +1059,11 @@ public:
             variant << value;
             SetValue(variant);
 
-            // If has private child properties then create them here, e.g.:
+            // If has private child properties then create them here. Also
+            // set flag that indicates presence of private children. E.g.:
+            //
+            //     SetParentalType(wxPG_PROP_AGGREGATE);
+            //
             //     AddChild( new wxStringProperty( "Subprop 1",
             //                                     wxPG_LABEL,
             //                                     value.GetSubProp1() ) );
@@ -910,35 +1108,52 @@ public:
                                 wxPGValidationInfo& validationInfo ) const;
 
     /**
-        Converts 'text' into proper value 'variant'.
-        Returns true if new (different than m_value) value could be interpreted
-        from the text.
+        Converts text into wxVariant value appropriate for this property.
+
+        @param variant
+            On function entry this is the old value (should not be wxNullVariant
+            in normal cases). Translated value must be assigned back to it.
+
+        @param text
+            Text to be translated into variant.
+
         @param argFlags
             If wxPG_FULL_VALUE is set, returns complete, storable value instead
             of displayable one (they may be different).
             If wxPG_COMPOSITE_FRAGMENT is set, text is interpreted as a part of
-            composite property string value (as generated by GetValueAsString()
+            composite property string value (as generated by ValueToString()
             called with this same flag).
 
-        @remarks
-        Default implementation converts semicolon delimited tokens into child
-        values. Only works for properties with children.
+        @return Returns @true if resulting wxVariant value was different.
+
+        @remarks Default implementation converts semicolon delimited tokens into
+                child values. Only works for properties with children.
+
+                You might want to take into account that m_value is Null variant
+                if property value is unspecified (which is usually only case if
+                you explicitly enabled that sort behavior).
     */
     virtual bool StringToValue( wxVariant& variant,
                                 const wxString& text,
                                 int argFlags = 0 ) const;
 
     /**
-        Converts 'number' (including choice selection) into proper value
-        'variant'.
+        Converts integer (possibly a choice selection) into wxVariant value
+        appropriate for this property.
 
-        Returns true if new (different than m_value) value could be interpreted
-        from the integer.
+        @param variant
+            On function entry this is the old value (should not be wxNullVariant
+            in normal cases). Translated value must be assigned back to it.
+
+        @param number
+            Integer to be translated into variant.
 
         @param argFlags
             If wxPG_FULL_VALUE is set, returns complete, storable value instead
             of displayable one.
 
+        @return Returns @true if resulting wxVariant value was different.
+
         @remarks
         - If property is not supposed to use choice or spinctrl or other editor
           with int-based value, it is not necessary to implement this method.
@@ -946,27 +1161,32 @@ public:
         - If property uses choice control, and displays a dialog on some choice
           items, then it is preferred to display that dialog in IntToValue
           instead of OnEvent.
+        - You might want to take into account that m_value is Null variant if
+          property value is unspecified (which is usually only case if you
+          explicitly enabled that sort behavior).
     */
     virtual bool IntToValue( wxVariant& value,
                              int number,
                              int argFlags = 0 ) const;
 #endif  // !defined(SWIG) || defined(CREATE_VCW)
+    /**
+        Converts property value into a text representation.
 
-public:
-    /** Returns text representation of property's value.
+        @param value
+            Value to be converted.
 
         @param argFlags
+            If 0 (default value), then displayed string is returned.
             If wxPG_FULL_VALUE is set, returns complete, storable string value
             instead of displayable. If wxPG_EDITABLE_VALUE is set, returns
             string value that must be editable in textctrl. If
             wxPG_COMPOSITE_FRAGMENT is set, returns text that is appropriate to
-            display as a part of composite property string value.
+            display as a part of string property's composite text
+            representation.
 
-        @remarks
-        Default implementation returns string composed from text
-        representations of child properties.
+        @remarks Default implementation calls GenerateComposedValue().
     */
-    virtual wxString GetValueAsString( int argFlags = 0 ) const;
+    virtual wxString ValueToString( wxVariant& value, int argFlags = 0 ) const;
 
     /** Converts string to a value, and if successful, calls SetValue() on it.
         Default behavior is to do nothing.
@@ -975,7 +1195,7 @@ public:
         @return
         true if value was changed.
     */
-    bool SetValueFromString( const wxString& text, int flags = 0 );
+    bool SetValueFromString( const wxString& text, int flags = wxPG_PROGRAMMATIC_VALUE );
 
     /** Converts integer to a value, and if succesful, calls SetValue() on it.
         Default behavior is to do nothing.
@@ -1108,21 +1328,6 @@ public:
     */
     virtual wxValidator* DoGetValidator () const;
 
-    /**
-        Returns current value's index to the choice control.
-
-        May also return, through pointer arguments, strings that should be
-        inserted to that control. Irrelevant to classes which do not employ
-        wxPGEditor_Choice or similar.
-
-        @remarks
-        - If returns NULL in choiceinfo.m_choices, then this class must be
-          derived from wxBaseEnumProperty.
-        - Must be able to cope situation where property's set of choices is
-          uninitialized.
-    */
-    virtual int GetChoiceInfo( wxPGChoiceInfo* choiceinfo );
-
     /**
         Override to paint an image in front of the property value text or
         drop-down list item (but only if wxPGProperty::OnMeasureImage is
@@ -1164,7 +1369,7 @@ public:
               colour) pen for drawing framing rectangle. It can be changed as
               well.
 
-        @see GetValueAsString()
+        @see ValueToString()
     */
     virtual void OnCustomPaint( wxDC& dc,
                                 const wxRect& rect,
@@ -1178,6 +1383,14 @@ public:
     */
     virtual wxPGCellRenderer* GetCellRenderer( int column ) const;
 
+    /** Returns which choice is currently selected. Only applies to properties
+        which have choices.
+
+        Needs to reimplemented in derived class if property value does not
+        map directly to a choice. Integer as index, bool, and string usually do.
+    */
+    virtual int GetChoiceSelection() const;
+
     /**
         Refresh values of child properties.
 
@@ -1211,27 +1424,19 @@ public:
     virtual wxPGEditorDialogAdapter* GetEditorDialog() const;
 
     /**
-        Adds entry to property's wxPGChoices and editor control (if it is
-        active).
+        Called whenever validation has failed with given pending value.
 
-        Returns index of item added.
+        @remarks If you implement this in your custom property class, please
+                 remember to call the baser implementation as well, since they
+                 may use it to revert property into pre-change state.
     */
-    int AppendChoice( const wxString& label, int value = wxPG_INVALID_VALUE )
-    {
-        return InsertChoice(label,-1,value);
-    }
+    virtual void OnValidationFailure( wxVariant& pendingValue );
 
-    /** Returns wxPGCell of given column, NULL if none. If valid
-        object is returned, caller will gain its ownership.
+    /** Append a new choice to property's list of choices.
     */
-    wxPGCell* AcquireCell( unsigned int column )
+    int AddChoice( const wxString& label, int value = wxPG_INVALID_VALUE )
     {
-        if ( column >= m_cells.size() )
-            return NULL;
-
-        wxPGCell* cell = (wxPGCell*) m_cells[column];
-        m_cells[column] = NULL;
-        return cell;
+        return InsertChoice(label, wxNOT_FOUND, value);
     }
 
     /**
@@ -1247,6 +1452,11 @@ public:
         return false;
     }
 
+    /**
+        Deletes children of the property.
+    */
+    void DeleteChildren();
+
     /**
         Removes entry from property's wxPGChoices and editor control (if it is
         active).
@@ -1268,8 +1478,15 @@ public:
         else ClearFlag( wxPG_PROP_USES_COMMON_VALUE );
     }
 
-    /** Composes text from values of child properties. */
-    void GenerateComposedValue( wxString& text, int argFlags = 0 ) const;
+    /**
+        Composes text from values of child properties.
+    */
+    wxString GenerateComposedValue() const
+    {
+        wxString s;
+        DoGenerateComposedValue(s);
+        return s;
+    }
 
     /** Returns property's label. */
     const wxString& GetLabel() const { return m_label; }
@@ -1283,11 +1500,12 @@ public:
      */
     const wxString& GetBaseName() const { return m_name; }
 
-    wxPGChoices& GetChoices();
-
-    const wxPGChoices& GetChoices() const;
-
-    const wxPGChoiceEntry* GetCurrentChoice() const;
+    /** Returns read-only reference to property's list of choices.
+    */
+    const wxPGChoices& GetChoices() const
+    {
+        return m_choices;
+    }
 
     /** Returns coordinate to the top y of the property. Note that the
         position of scrollbars is not taken into account.
@@ -1315,26 +1533,38 @@ public:
     }
 #endif
 
-    /** Same as GetValueAsString, except takes common value into account.
-    */
-    wxString GetValueString( int argFlags = 0 ) const;
+    /** Returns text representation of property's value.
 
-    void UpdateControl( wxWindow* primary );
+        @param argFlags
+            If 0 (default value), then displayed string is returned.
+            If wxPG_FULL_VALUE is set, returns complete, storable string value
+            instead of displayable. If wxPG_EDITABLE_VALUE is set, returns
+            string value that must be editable in textctrl. If
+            wxPG_COMPOSITE_FRAGMENT is set, returns text that is appropriate to
+            display as a part of string property's composite text
+            representation.
 
-    /** Returns wxPGCell of given column, NULL if none. wxPGProperty
-        will retain ownership of the cell object.
+        @remarks In older versions, this function used to be overridden to convert
+                 property's value into a string representation. This function is
+                 now handled by ValueToString(), and overriding this function now
+                 will result in run-time assertion failure.
     */
-    wxPGCell* GetCell( unsigned int column ) const
-    {
-        if ( column >= m_cells.size() )
-            return NULL;
+    virtual wxString GetValueAsString( int argFlags = 0 ) const;
 
-        return (wxPGCell*) m_cells[column];
-    }
+    /** Synonymous to GetValueAsString().
+
+        @deprecated Use GetValueAsString() instead.
+
+        @see GetValueAsString()
+    */
+    wxDEPRECATED( wxString GetValueString( int argFlags = 0 ) const );
 
-    unsigned int GetChoiceCount() const;
+    /**
+        Returns wxPGCell of given column.
+    */
+    const wxPGCell& GetCell( unsigned int column ) const;
 
-    wxString GetChoiceString( unsigned int index );
+    wxPGCell& GetCell( unsigned int column );
 
     /** Return number of displayed common values for this property.
     */
@@ -1342,7 +1572,7 @@ public:
 
     wxString GetDisplayedString() const
     {
-        return GetValueString(0);
+        return GetValueAsString(0);
     }
 
     /** Returns property grid where property lies. */
@@ -1426,15 +1656,9 @@ public:
     */
     bool HasVisibleChildren() const;
 
-    /**
-        Adds entry to property's wxPGChoices and editor control (if it is
-        active).
-
-        Returns index of item added.
+    /** Inserts a new choice to property's list of choices.
     */
-    int InsertChoice( const wxString& label,
-                      int index,
-                      int value = wxPG_INVALID_VALUE );
+    int InsertChoice( const wxString& label, int index, int value = wxPG_INVALID_VALUE );
 
     /**
         Returns true if this property is actually a wxPropertyCategory.
@@ -1468,7 +1692,9 @@ public:
     /**
         Determines, recursively, if all children are not unspecified.
 
-        Takes values in given list into account.
+        @param pendingList
+            Assumes members in this wxVariant list as pending
+            replacement values.
     */
     bool AreAllChildrenSpecified( wxVariant* pendingList = NULL ) const;
 
@@ -1482,9 +1708,9 @@ public:
 
     /** Returns true if containing grid uses wxPG_EX_AUTO_UNSPECIFIED_VALUES.
     */
-    FlagType UsesAutoUnspecified() const
+    bool UsesAutoUnspecified() const
     {
-        return HasFlag(wxPG_PROP_AUTO_UNSPECIFIED);
+        return HasFlag(wxPG_PROP_AUTO_UNSPECIFIED)?true:false;
     }
 
     wxBitmap* GetValueImage() const
@@ -1515,8 +1741,6 @@ public:
     */
     double GetAttributeAsDouble( const wxString& name, double defVal ) const;
 
-    unsigned int GetArrIndex() const { return m_arrIndex; }
-
     unsigned int GetDepth() const { return (unsigned int)m_depth; }
 
     /** Gets flags as a'|' delimited string. Note that flag names are not
@@ -1569,6 +1793,32 @@ public:
 
     void SetAttributes( const wxPGAttributeStorage& attributes );
 
+    /**
+        Sets property's background colour.
+
+        @param colour
+            Background colour to use.
+
+        @param recursively
+            If @true, children are affected recursively, and any categories
+            are not.
+    */
+    void SetBackgroundColour( const wxColour& colour,
+                              bool recursively = false );
+
+    /**
+        Sets property's text colour.
+
+        @param colour
+            Text colour to use.
+
+        @param recursively
+            If @true, children are affected recursively, and any categories
+            are not.
+    */
+    void SetTextColour( const wxColour& colour,
+                        bool recursively = false );
+
 #ifndef SWIG
     /** Sets editor for a property.
 
@@ -1590,15 +1840,10 @@ public:
     */
     inline void SetEditor( const wxString& editorName );
 
-    /** Sets cell information for given column.
-
-        Note that the property takes ownership of given wxPGCell instance.
+    /**
+        Sets cell information for given column.
     */
-    void SetCell( int column, wxPGCell* cellObj );
-
-    /** Changes value of a property with choices, but only
-        works if the value type is long or string. */
-    void SetChoiceSelection( int newValue, const wxPGChoiceInfo& choiceInfo );
+    void SetCell( int column, const wxPGCell& cell );
 
     /** Sets common value selected for this property. -1 for none.
     */
@@ -1657,7 +1902,17 @@ public:
     /** If property has choices and they are not yet exclusive, new such copy
         of them will be created.
     */
-    void SetChoicesExclusive();
+    void SetChoicesExclusive()
+    {
+        m_choices.SetExclusive();
+    }
+
+    /** Sets selected choice and changes property value.
+
+        Tries to retain value type, although currently if it is not string,
+        then it is forced to integer.
+    */
+    void SetChoiceSelection( int newValue );
 
     void SetExpanded( bool expanded )
     {
@@ -1678,6 +1933,27 @@ public:
 
     inline void SetName( const wxString& newName );
 
+    /**
+        Changes what sort of parent this property is for its children.
+
+        @param flag
+            Use one of the following values: wxPG_PROP_MISC_PARENT (for generic
+            parents), wxPG_PROP_CATEGORY (for categories), or
+            wxPG_PROP_AGGREGATE (for derived property classes with private
+            children).
+
+        @remarks You only need to call this if you use AddChild() to add
+                 child properties. Adding properties with
+                 wxPropertyGridInterface::Insert() or
+                 wxPropertyGridInterface::AppendIn() will automatically set
+                 property to use wxPG_PROP_MISC_PARENT style.
+    */
+    void SetParentalType( int flag )
+    {
+        m_flags &= ~(wxPG_PROP_PROPERTY|wxPG_PROP_PARENTAL_FLAGS);
+        m_flags |= flag;
+    }
+
     void SetValueToUnspecified()
     {
         wxVariant val;  // Create NULL variant
@@ -1700,23 +1976,6 @@ public:
     }
 #endif // #if wxUSE_VALIDATORS
 
-    /** Updates property value in case there were last minute
-        changes. If value was unspecified, it will be set to default.
-        Use only for properties that have TextCtrl-based editor.
-        @remarks
-        If you have code similar to
-        @code
-            // Update the value in case of last minute changes
-            if ( primary && propgrid->IsEditorsValueModified() )
-                 GetEditorClass()->CopyValueFromControl( this, primary );
-        @endcode
-        in wxPGProperty::OnEvent wxEVT_COMMAND_BUTTON_CLICKED handler,
-        then replace it with call to this method.
-        @return
-        True if value changed.
-    */
-    bool PrepareValueForDialogEditing( wxPropertyGrid* propgrid );
-
 #ifndef SWIG
     /** Returns client data (void*) of a property.
     */
@@ -1754,11 +2013,6 @@ public:
     */
     bool SetChoices( wxPGChoices& choices );
 
-    /** Sets new set of choices for property.
-    */
-    inline bool SetChoices( const wxArrayString& labels,
-                            const wxArrayInt& values = wxArrayInt() );
-
     /** Set max length of text in text editor.
     */
     inline bool SetMaxLength( int maxLen );
@@ -1788,7 +2042,23 @@ public:
     */
     void AdaptListToValue( wxVariant& list, wxVariant* value ) const;
 
-    /** This is used by properties that have fixed sub-properties. */
+    /**
+        Adds a child property. If you use this instead of
+        wxPropertyGridInterface::Insert() or
+        wxPropertyGridInterface::AppendIn(), then you must set up
+        property's parental type before making the call. To do this,
+        call property's SetParentalType() function with either
+        wxPG_PROP_MISC_PARENT (normal, public children) or with
+        wxPG_PROP_AGGREGATE (private children for subclassed property).
+        For instance:
+
+        @code
+            wxPGProperty* prop = new wxStringProperty(wxS("Property"));
+            prop->SetParentalType(wxPG_PROP_MISC_PARENT);
+            wxPGProperty* prop2 = new wxStringProperty(wxS("Property2"));
+            prop->AddChild(prop2);
+        @endcode
+    */
     void AddChild( wxPGProperty* prop );
 
     /** Returns height of children, recursively, and
@@ -1799,25 +2069,24 @@ public:
     int GetChildrenHeight( int lh, int iMax = -1 ) const;
 
     /** Returns number of child properties */
-    unsigned int GetChildCount() const { return m_children.GetCount(); }
+    unsigned int GetChildCount() const
+    {
+        return (unsigned int) m_children.size();
+    }
 
     /** Returns sub-property at index i. */
-    wxPGProperty* Item( size_t i ) const
-        { return (wxPGProperty*)m_children.Item(i); }
+    wxPGProperty* Item( unsigned int i ) const
+        { return m_children[i]; }
 
     /** Returns last sub-property.
     */
-    wxPGProperty* Last() const { return (wxPGProperty*)m_children.Last(); }
+    wxPGProperty* Last() const { return m_children.back(); }
 
-    /** Returns index of given sub-property. */
-    int Index( const wxPGProperty* p ) const
-        { return m_children.Index((wxPGProperty*)p); }
-
-    /** Deletes all sub-properties. */
-    void Empty();
+    /** Returns index of given child property. */
+    int Index( const wxPGProperty* p ) const;
 
     // Puts correct indexes to children
-    void FixIndexesOfChildren( size_t starthere = 0 );
+    void FixIndicesOfChildren( unsigned int starthere = 0 );
 
 #ifndef SWIG
     // Returns wxPropertyGridPageState in which this property resides.
@@ -1862,6 +2131,13 @@ public:
 
 #ifndef SWIG
 
+    // Returns various display-related information for given column
+    void GetDisplayInfo( unsigned int column,
+                         int choiceIndex,
+                         int flags,
+                         wxString* pString,
+                         const wxPGCell** pCell );
+
     static wxString*            sm_wxPG_LABEL;
 
     /** This member is public so scripting language bindings
@@ -1870,9 +2146,49 @@ public:
     void*                       m_clientData;
 
 protected:
-    /** Returns text for given column.
+
+    /**
+        Sets property cell in fashion that reduces number of exclusive
+        copies of cell data. Used when setting, for instance, same
+        background colour for a number of properties.
+
+        @param firstCol
+            First column to affect.
+
+        @param lastCol
+            Last column to affect.
+
+        @param preparedCell
+            Pre-prepared cell that is used for those which cell data
+            before this matched unmodCellData.
+
+        @param srcData
+            If unmodCellData did not match, valid cell data from this
+            is merged into cell (usually generating new exclusive copy
+            of cell's data).
+
+        @param unmodCellData
+            If cell's cell data matches this, its cell is now set to
+            preparedCell.
+
+        @param ignoreWithFlags
+            Properties with any one of these flags are skipped.
+
+        @param recursively
+            If @true, apply this operation recursively in child properties.
+    */
+    void AdaptiveSetCell( unsigned int firstCol,
+                          unsigned int lastCol,
+                          const wxPGCell& preparedCell,
+                          const wxPGCell& srcData,
+                          wxPGCellData* unmodCellData,
+                          FlagType ignoreWithFlags,
+                          bool recursively );
+
+    /**
+        Makes sure m_cells has size of column+1 (or more).
     */
-    wxString GetColumnText( unsigned int col ) const;
+    void EnsureCells( unsigned int column );
 
     /** Returns (direct) child property with given name (or NULL if not found),
         with hint index.
@@ -1891,16 +2207,21 @@ protected:
                     int index = -1,
                     bool correct_mode = true );
 
+    void DoGenerateComposedValue( wxString& text,
+                                  int argFlags = wxPG_VALUE_IS_CURRENT,
+                                  const wxVariantList* valueOverrides = NULL,
+                                  wxPGHashMapS2S* childResults = NULL ) const;
+
     void DoSetName(const wxString& str) { m_name = str; }
 
-    // Call for after sub-properties added with AddChild
-    void PrepareSubProperties();
+    /** Deletes all sub-properties. */
+    void Empty();
 
-    void SetParentalType( int flag )
-    {
-        m_flags &= ~(wxPG_PROP_PROPERTY|wxPG_PROP_PARENTAL_FLAGS);
-        m_flags |= flag;
-    }
+    void InitAfterAdded( wxPropertyGridPageState* pageState,
+                         wxPropertyGrid* propgrid );
+
+    // Removes child property with given pointer. Does not delete it.
+    void RemoveChild( wxPGProperty* p );
 
     void SetParentState( wxPropertyGridPageState* pstate )
         { m_parentState = pstate; }
@@ -1915,7 +2236,7 @@ protected:
     wxString                    m_label;
     wxString                    m_name;
     wxPGProperty*               m_parent;
-    wxPropertyGridPageState*        m_parentState;
+    wxPropertyGridPageState*    m_parentState;
 
     wxClientData*               m_clientObject;
 
@@ -1932,10 +2253,13 @@ protected:
 
     wxVariant                   m_value;
     wxPGAttributeStorage        m_attributes;
-    wxArrayPtrVoid              m_children;
+    wxArrayPGProperty           m_children;
 
     // Extended cell information
-    wxArrayPtrVoid              m_cells;
+    wxVector<wxPGCell>          m_cells;
+
+    // Choices shown in drop-down list of editor control.
+    wxPGChoices                 m_choices;
 
     // Help shown in statusbar or help box.
     wxString                    m_helpString;
@@ -1961,9 +2285,6 @@ protected:
     // (essentially this is category's depth, if none then equals m_depth).
     unsigned char               m_depthBgCol;
 
-    unsigned char               m_bgColIndex; // Background brush index.
-    unsigned char               m_fgColIndex; // Foreground colour index.
-
 private:
     // Called in constructors.
     void Init();
@@ -2047,9 +2368,9 @@ public:
 
     int GetTextExtent( const wxWindow* wnd, const wxFont& font ) const;
 
-protected:
-    virtual wxString GetValueAsString( int argFlags ) const;
+    virtual wxString ValueToString( wxVariant& value, int argFlags ) const;
 
+protected:
     void SetTextColIndex( unsigned int colInd )
         { m_capFgColIndex = (wxByte) colInd; }
     unsigned int GetTextColIndex() const
@@ -2068,388 +2389,6 @@ private:
 
 // -----------------------------------------------------------------------
 
-#ifndef SWIG
-
-/** @class wxPGChoiceEntry
-    Data of a single wxPGChoices choice.
-*/
-class WXDLLIMPEXP_PROPGRID wxPGChoiceEntry : public wxPGCell
-{
-public:
-    wxPGChoiceEntry();
-    wxPGChoiceEntry( const wxPGChoiceEntry& entry );
-    wxPGChoiceEntry( const wxString& label,
-                     int value = wxPG_INVALID_VALUE )
-        : wxPGCell(), m_value(value)
-    {
-        m_text = label;
-    }
-
-    wxPGChoiceEntry( const wxString& label,
-                     int value,
-                     const wxBitmap& bitmap,
-                     const wxColour& fgCol = wxNullColour,
-                     const wxColour& bgCol = wxNullColour )
-        : wxPGCell(label, bitmap, fgCol, bgCol), m_value(value)
-    {
-    }
-
-    virtual ~wxPGChoiceEntry()
-    {
-    }
-
-    void SetValue( int value ) { m_value = value; }
-
-    int GetValue() const { return m_value; }
-
-    bool HasValue() const { return (m_value != wxPG_INVALID_VALUE); }
-
-protected:
-    int m_value;
-};
-
-
-typedef void* wxPGChoicesId;
-
-class WXDLLIMPEXP_PROPGRID wxPGChoicesData
-{
-    friend class wxPGChoices;
-public:
-    // Constructor sets m_refCount to 1.
-    wxPGChoicesData();
-
-    void CopyDataFrom( wxPGChoicesData* data );
-
-    // Takes ownership of 'item'
-    void Insert( int index, wxPGChoiceEntry* item )
-    {
-        wxArrayPtrVoid::iterator it;
-        if ( index == -1 )
-        {
-            it = m_items.end();
-            index = m_items.size();
-        }
-        else
-        {
-            it = m_items.begin() + index;
-        }
-
-        // Need to fix value?
-        if ( item->GetValue() == wxPG_INVALID_VALUE )
-            item->SetValue(index);
-
-        m_items.insert(it, item);
-    }
-
-    // Delete all entries
-    void Clear();
-
-    size_t GetCount() const { return m_items.size(); }
-
-    wxPGChoiceEntry* Item( unsigned int i ) const
-    {
-        wxCHECK_MSG( i < GetCount(), NULL, "invalid index" );
-
-        return (wxPGChoiceEntry*) m_items[i];
-    }
-
-    void DecRef()
-    {
-        m_refCount--;
-        wxASSERT( m_refCount >= 0 );
-        if ( m_refCount == 0 )
-            delete this;
-    }
-
-private:
-    wxArrayPtrVoid  m_items;
-
-    // So that multiple properties can use the same set
-    int             m_refCount;
-
-    virtual ~wxPGChoicesData();
-};
-
-#define wxPGChoicesEmptyData    ((wxPGChoicesData*)NULL)
-
-#endif // SWIG
-
-
-/** @class wxPGChoices
-
-    Helper class for managing choices of wxPropertyGrid properties.
-    Each entry can have label, value, bitmap, text colour, and background
-    colour.
-
-    @library{wxpropgrid}
-    @category{propgrid}
-*/
-class WXDLLIMPEXP_PROPGRID wxPGChoices
-{
-public:
-    typedef long ValArrItem;
-
-    /** Default constructor. */
-    wxPGChoices()
-    {
-        Init();
-    }
-
-    /** Copy constructor. */
-    wxPGChoices( const wxPGChoices& a )
-    {
-        if ( a.m_data != wxPGChoicesEmptyData )
-        {
-            m_data = a.m_data;
-            m_data->m_refCount++;
-        }
-    }
-
-    /** Constructor. */
-    wxPGChoices( const wxChar** labels, const long* values = NULL )
-    {
-        Init();
-        Set(labels,values);
-    }
-
-    /** Constructor. */
-    wxPGChoices( const wxArrayString& labels,
-                 const wxArrayInt& values = wxArrayInt() )
-    {
-        Init();
-        Set(labels,values);
-    }
-
-    /** Simple interface constructor. */
-    wxPGChoices( wxPGChoicesData* data )
-    {
-        wxASSERT(data);
-        m_data = data;
-        data->m_refCount++;
-    }
-
-    /** Destructor. */
-    ~wxPGChoices()
-    {
-        Free();
-    }
-
-    /**
-        Adds to current.
-
-        If did not have own copies, creates them now. If was empty, identical
-        to set except that creates copies.
-    */
-    void Add( const wxChar** labels, const ValArrItem* values = NULL );
-
-    /** Version that works with wxArrayString. */
-    void Add( const wxArrayString& arr, const ValArrItem* values = NULL );
-
-    /** Version that works with wxArrayString and wxArrayInt. */
-    void Add( const wxArrayString& arr, const wxArrayInt& arrint );
-
-    /** Adds single item. */
-    wxPGChoiceEntry& Add( const wxString& label,
-                          int value = wxPG_INVALID_VALUE );
-
-    /** Adds a single item, with bitmap. */
-    wxPGChoiceEntry& Add( const wxString& label,
-                          const wxBitmap& bitmap,
-                          int value = wxPG_INVALID_VALUE );
-
-    /** Adds a single item with full entry information. */
-    wxPGChoiceEntry& Add( const wxPGChoiceEntry& entry )
-    {
-        return Insert(entry, -1);
-    }
-
-    /** Adds single item. */
-    wxPGChoiceEntry& AddAsSorted( const wxString& label,
-                                  int value = wxPG_INVALID_VALUE );
-
-    void Assign( const wxPGChoices& a )
-    {
-        AssignData(a.m_data);
-    }
-
-    void AssignData( wxPGChoicesData* data );
-
-    /** Delete all choices. */
-    void Clear()
-    {
-        if ( m_data != wxPGChoicesEmptyData )
-            m_data->Clear();
-    }
-
-    void EnsureData()
-    {
-        if ( m_data == wxPGChoicesEmptyData )
-            m_data = new wxPGChoicesData();
-    }
-
-    /** Gets a unsigned number identifying this list. */
-    wxPGChoicesId GetId() const { return (wxPGChoicesId) m_data; };
-
-    const wxString& GetLabel( size_t ind ) const
-    {
-        return Item(ind).GetText();
-    }
-
-    size_t GetCount () const
-    {
-        wxASSERT_MSG( m_data, "When checking if wxPGChoices is valid, "
-                              "use IsOk() instead of GetCount()" );
-        return m_data->GetCount();
-    }
-
-    int GetValue( size_t ind ) const { return Item(ind).GetValue(); }
-
-    /** Returns array of values matching the given strings. Unmatching strings
-        result in wxPG_INVALID_VALUE entry in array.
-    */
-    wxArrayInt GetValuesForStrings( const wxArrayString& strings ) const;
-
-    /** Returns array of indices matching given strings. Unmatching strings
-        are added to 'unmatched', if not NULL.
-    */
-    wxArrayInt GetIndicesForStrings( const wxArrayString& strings,
-                                     wxArrayString* unmatched = NULL ) const;
-
-    /** Returns true if choices in general are likely to have values
-        (depens on that all entries have values or none has)
-    */
-    bool HasValues() const;
-
-    bool HasValue( unsigned int i ) const
-        { return (i < m_data->GetCount()) && m_data->Item(i)->HasValue(); }
-
-    int Index( const wxString& str ) const;
-    int Index( int val ) const;
-
-    /** Inserts single item. */
-    wxPGChoiceEntry& Insert( const wxString& label,
-                             int index,
-                             int value = wxPG_INVALID_VALUE );
-
-    /** Inserts a single item with full entry information. */
-    wxPGChoiceEntry& Insert( const wxPGChoiceEntry& entry, int index );
-
-    /** Returns false if this is a constant empty set of choices,
-        which should not be modified.
-    */
-    bool IsOk() const
-    {
-        return ( m_data != wxPGChoicesEmptyData );
-    }
-
-    const wxPGChoiceEntry& Item( unsigned int i ) const
-    {
-        wxASSERT( IsOk() );
-        return *m_data->Item(i);
-    }
-
-    wxPGChoiceEntry& Item( unsigned int i )
-    {
-        wxASSERT( IsOk() );
-        return *m_data->Item(i);
-    }
-
-    /** Removes count items starting at position nIndex. */
-    void RemoveAt(size_t nIndex, size_t count = 1);
-
-#ifndef SWIG
-    /** Does not create copies for itself. */
-    void Set( const wxChar** labels, const long* values = NULL )
-    {
-        Free();
-        Add(labels,values);
-    }
-
-    /** Version that works with wxArrayString.
-        TODO: Deprecate this.
-    */
-    void Set( wxArrayString& arr, const long* values = (const long*) NULL )
-    {
-        Free();
-        Add(arr,values);
-    }
-#endif // SWIG
-
-    /** Version that works with wxArrayString and wxArrayInt. */
-    void Set( const wxArrayString& labels,
-              const wxArrayInt& values = wxArrayInt() )
-    {
-        Free();
-        if ( &values )
-            Add(labels,values);
-        else
-            Add(labels);
-    }
-
-    // Creates exclusive copy of current choices
-    void SetExclusive()
-    {
-        if ( m_data->m_refCount != 1 )
-        {
-            wxPGChoicesData* data = new wxPGChoicesData();
-            data->CopyDataFrom(m_data);
-            Free();
-            m_data = data;
-        }
-    }
-
-    // Returns data, increases refcount.
-    wxPGChoicesData* GetData()
-    {
-        wxASSERT( m_data->m_refCount != 0xFFFFFFF );
-        m_data->m_refCount++;
-        return m_data;
-    }
-
-    // Returns plain data ptr - no refcounting stuff is done.
-    wxPGChoicesData* GetDataPtr() const { return m_data; }
-
-    // Changes ownership of data to you.
-    wxPGChoicesData* ExtractData()
-    {
-        wxPGChoicesData* data = m_data;
-        m_data = wxPGChoicesEmptyData;
-        return data;
-    }
-
-    wxArrayString GetLabels() const;
-
-#ifndef SWIG
-    void operator= (const wxPGChoices& a)
-    {
-        AssignData(a.m_data);
-    }
-
-    wxPGChoiceEntry& operator[](unsigned int i)
-    {
-        return Item(i);
-    }
-
-    const wxPGChoiceEntry& operator[](unsigned int i) const
-    {
-        return Item(i);
-    }
-
-protected:
-    wxPGChoicesData*    m_data;
-
-    void Init();
-    void Free();
-#endif  // !SWIG
-};
-
-inline bool wxPGProperty::SetChoices( const wxArrayString& labels,
-                                      const wxArrayInt& values )
-{
-    wxPGChoices chs(labels, values);
-    return SetChoices(chs);
-}
-
-// -----------------------------------------------------------------------
+#endif // wxUSE_PROPGRID
 
 #endif // _WX_PROPGRID_PROPERTY_H_