]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/propgrid/propgridiface.h
implementation of HotKey, see #12354
[wxWidgets.git] / include / wx / propgrid / propgridiface.h
index ec4f278b3228695924db21f7a4e6d947867ba68e..9cc773d493101fd6677b6f08544be526966521f0 100644 (file)
@@ -1,24 +1,26 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:        wx/propgeid/propgridiface.h
+// Name:        wx/propgrid/propgridiface.h
 // Purpose:     wxPropertyGridInterface class
 // Author:      Jaakko Salli
 // Modified by:
 // Created:     2008-08-24
-// RCS-ID:      $Id:
+// RCS-ID:      $Id$
 // Copyright:   (c) Jaakko Salli
-// Licence:     wxWindows license
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 #ifndef __WX_PROPGRID_PROPGRIDIFACE_H__
 #define __WX_PROPGRID_PROPGRIDIFACE_H__
 
+#include "wx/defs.h"
+
+#if wxUSE_PROPGRID
+
 #include "wx/propgrid/property.h"
 #include "wx/propgrid/propgridpagestate.h"
 
 // -----------------------------------------------------------------------
 
-#ifndef SWIG
-
 /** @section wxPGPropArgCls
 
     Most property grid functions have this type as their argument, as it can
@@ -31,75 +33,89 @@ public:
     wxPGPropArgCls( const wxPGProperty* property )
     {
         m_ptr.property = (wxPGProperty*) property;
-        m_isName = false;
+        m_flags = IsProperty;
     }
     wxPGPropArgCls( const wxString& str )
     {
-        m_ptr.name = &str;
-        m_isName = 1;
+        m_ptr.stringName = &str;
+        m_flags = IsWxString;
     }
     wxPGPropArgCls( const wxPGPropArgCls& id )
     {
         m_ptr = id.m_ptr;
-        m_isName = id.m_isName;
+        m_flags = id.m_flags;
     }
     // This is only needed for wxPython bindings
     wxPGPropArgCls( wxString* str, bool WXUNUSED(deallocPtr) )
     {
-        m_ptr.name = str;
-        m_isName = 3;  // Like 1, but causes ptr to be deallocated in dtor
+        m_ptr.stringName = str;
+        m_flags = IsWxString | OwnsWxString;
     }
     ~wxPGPropArgCls()
     {
-        if ( m_isName == 3 )
-            delete m_ptr.name;
+        if ( m_flags & OwnsWxString )
+            delete m_ptr.stringName;
     }
     wxPGProperty* GetPtr() const
     {
-        wxCHECK( !m_isName, NULL );
+        wxCHECK( m_flags == IsProperty, NULL );
         return m_ptr.property;
     }
-    wxPGPropArgCls( const wxChar* str )
+    wxPGPropArgCls( const char* str )
     {
-        m_ptr.rawname = str;
-        m_isName = 2;
+        m_ptr.charName = str;
+        m_flags = IsCharPtr;
+    }
+    wxPGPropArgCls( const wchar_t* str )
+    {
+        m_ptr.wcharName = str;
+        m_flags = IsWCharPtr;
     }
     /** This constructor is required for NULL. */
     wxPGPropArgCls( int )
     {
-        m_ptr.property = (wxPGProperty*) NULL;
-        m_isName = false;
+        m_ptr.property = NULL;
+        m_flags = IsProperty;
     }
-    wxPGProperty* GetPtr( wxPropertyGridInterface* methods ) const;
-    wxPGProperty* GetPtr( const wxPropertyGridInterface* methods ) const
+    wxPGProperty* GetPtr( wxPropertyGridInterface* iface ) const;
+    wxPGProperty* GetPtr( const wxPropertyGridInterface* iface ) const
     {
-        return GetPtr((wxPropertyGridInterface*)methods);
+        return GetPtr((wxPropertyGridInterface*)iface);
     }
     wxPGProperty* GetPtr0() const { return m_ptr.property; }
-    unsigned char HasName() const { return m_isName; }
-    const wxString& GetName() const { return *m_ptr.name; }
+    bool HasName() const { return (m_flags != IsProperty); }
+    const wxString& GetName() const { return *m_ptr.stringName; }
 private:
+
+    enum
+    {
+        IsProperty      = 0x00,
+        IsWxString      = 0x01,
+        IsCharPtr       = 0x02,
+        IsWCharPtr      = 0x04,
+        OwnsWxString    = 0x10
+    };
+
     union
     {
         wxPGProperty* property;
-        const wxChar* rawname;
-        const wxString* name;
+        const char* charName;
+        const wchar_t* wcharName;
+        const wxString* stringName;
     } m_ptr;
-    unsigned char m_isName;
+    unsigned char m_flags;
 };
 
-#endif
-
 typedef const wxPGPropArgCls& wxPGPropArg;
 
 // -----------------------------------------------------------------------
 
 WXDLLIMPEXP_PROPGRID
 void wxPGTypeOperationFailed( const wxPGProperty* p,
-                              const wxChar* typestr,
-                              const wxChar* op );
+                              const wxString& typestr,
+                              const wxString& op );
 WXDLLIMPEXP_PROPGRID
-void wxPGGetFailed( const wxPGProperty* p, const wxChar* typestr );
+void wxPGGetFailed( const wxPGProperty* p, const wxString& typestr );
 
 // -----------------------------------------------------------------------
 
@@ -147,20 +163,6 @@ public:
     /** Destructor */
     virtual ~wxPropertyGridInterface() { }
 
-    /** Adds choice to a property that can accept one.
-        @remarks
-        - If you need to make sure that you modify only the set of choices of
-          a single property (and not also choices of other properties with
-          initially identical set), call
-          wxPropertyGrid::SetPropertyChoicesPrivate.
-        - This usually only works for wxEnumProperty and derivatives
-          (wxFlagsProperty can get accept new items but its items may not get
-          updated).
-    */
-    void AddPropertyChoice( wxPGPropArg id,
-                            const wxString& label,
-                            int value = wxPG_INVALID_VALUE );
-
     /**
         Appends property to the list.
 
@@ -192,17 +194,26 @@ public:
     */
     virtual void Clear() = 0;
 
-    /** Deselect current selection, if any. Returns true if success
-        (ie. validator did not intercept). */
-    bool ClearSelection();
+    /**
+        Clears current selection, if any.
+
+        @param validation
+            If set to @false, deselecting the property will always work,
+            even if its editor had invalid value in it.
+
+        @return Returns @true if successful or if there was no selection. May
+                fail if validation was enabled and active editor had invalid
+                value.
+
+        @remarks In wxPropertyGrid 1.4, this member function used to send
+                 wxPG_EVT_SELECTED. In wxWidgets 2.9 and later, it no longer
+                 does that.
+    */
+    bool ClearSelection( bool validation = false );
 
     /** Resets modified status of all properties.
     */
-    void ClearModifiedStatus()
-    {
-        SetPropertyModifiedStatus(m_pState->m_properties, false);
-        m_pState->m_anyModified = false;
-    }
+    void ClearModifiedStatus();
 
     /** Collapses given category or property with children.
         Returns true if actually collapses.
@@ -226,30 +237,43 @@ public:
     */
     bool ChangePropertyValue( wxPGPropArg id, wxVariant newValue );
 
-    /** Resets value of a property to its default. */
-    bool ClearPropertyValue( wxPGPropArg id )
-    {
-        wxPG_PROP_ARG_CALL_PROLOG_RETVAL(false)
-        p->SetValue(p->GetDefaultValue());
-        RefreshProperty(p);
-        return true;
-    }
-
     /**
-        Deletes a property by id. If category is deleted, all children are
-        automatically deleted as well.
-     */
+        Removes and deletes a property and any children.
+
+        @param id
+            Pointer or name of a property.
+
+        @remarks If you delete a property in a wxPropertyGrid event
+                 handler, the actual deletion is postponed until the next
+                 idle event.
+
+                 This functions deselects selected property, if any.
+                 Validation failure option wxPG_VFB_STAY_IN_PROPERTY is not
+                 respected, ie. selection is cleared even if editor had
+                 invalid value.
+    */
     void DeleteProperty( wxPGPropArg id );
 
-    /** Deletes choice from a property.
+    /**
+        Removes a property. Does not delete the property object, but
+        instead returns it.
+
+        @param id
+            Pointer or name of a property.
 
-        If selected item is deleted, then the value is set to unspecified.
+        @remarks Removed property cannot have any children.
 
-        See AddPropertyChoice for more details.
+                 Also, if you remove property in a wxPropertyGrid event
+                 handler, the actual removal is postponed until the next
+                 idle event.
     */
-    void DeletePropertyChoice( wxPGPropArg id, int index );
+    wxPGProperty* RemoveProperty( wxPGPropArg id );
+
+    /**
+        Disables a property.
 
-    /** Disables property. */
+        @see EnableProperty(), wxPGProperty::Enable()
+    */
     bool DisableProperty( wxPGPropArg id ) { return EnableProperty(id,false); }
 
     /**
@@ -262,7 +286,14 @@ public:
 
     /**
         Enables or disables property, depending on whether enable is true or
-        false.
+        false. Disabled property usually appears as having grey text.
+
+        @param id
+            Name or pointer to a property.
+        @param enable
+            If @false, property is disabled instead.
+
+        @see wxPGProperty::Enable()
      */
     bool EnableProperty( wxPGPropArg id, bool enable = true );
 
@@ -279,16 +310,6 @@ public:
     */
     bool ExpandAll( bool expand = true );
 
-    /** Returns list of expanded properties.
-    */
-    wxArrayPGProperty GetExpandedProperties() const
-    {
-        wxArrayPGProperty array;
-        GetPropertiesWithFlag(&array, wxPG_PROP_COLLAPSED, true,
-            wxPG_ITERATE_ALL_PARENTS_RECURSIVELY|wxPG_ITERATE_HIDDEN);
-        return array;
-    }
-
     /** Returns id of first child of given property.
         @remarks
         Does not return sub-properties!
@@ -356,14 +377,12 @@ public:
     }
 
     /**
-        Returns id of property with given name (case-sensitive).
+        Returns pointer to a property with given name (case-sensitive).
+        If there is no property with such name, @NULL pointer is returned.
 
-        If there is no property with such name, returned property id is invalid
-        ( i.e. it will return false with IsOk method).
-        @remarks
-        - Sub-properties (i.e. properties which have parent that is not
-          category or root) can not be accessed globally by their name.
-          Instead, use "<property>.<subproperty>" in place of "<subproperty>".
+        @remarks Properties which have non-category, non-root parent
+                 cannot be accessed globally by their name. Instead, use
+                 "<property>.<subproperty>" instead of "<subproperty>".
     */
     wxPGProperty* GetProperty( const wxString& name ) const
     {
@@ -377,7 +396,10 @@ public:
     */
     const wxPGAttributeStorage& GetPropertyAttributes( wxPGPropArg id ) const
     {
-        wxPG_PROP_ARG_CALL_PROLOG_RETVAL(*((const wxPGAttributeStorage*)NULL));
+        // If 'id' refers to invalid property, then we will return dummy
+        // attributes (ie. root property's attributes, which contents should
+        // should always be empty and of no consequence).
+        wxPG_PROP_ARG_CALL_PROLOG_RETVAL(m_pState->DoGetRoot()->GetAttributes());
         return p->GetAttributes();
     }
 
@@ -414,14 +436,12 @@ public:
         return m_pState->GetPropertyCategory(p);
     }
 
-#ifndef SWIG
     /** Returns client data (void*) of a property. */
     void* GetPropertyClientData( wxPGPropArg id ) const
     {
         wxPG_PROP_ARG_CALL_PROLOG_RETVAL(NULL)
         return p->GetClientData();
     }
-#endif
 
     /**
         Returns first property which label matches given string.
@@ -441,12 +461,6 @@ public:
     wxPGProperty* GetPropertyByName( const wxString& name,
                                      const wxString& subname ) const;
 
-    /** Returns writable reference to property's list of choices (and relevant
-        values). If property does not have any choices, will return reference
-        to an invalid set of choices that will return false on IsOk call.
-    */
-    wxPGChoices& GetPropertyChoices( wxPGPropArg id );
-
     /** Returns property's editor. */
     const wxPGEditor* GetPropertyEditor( wxPGPropArg id ) const
     {
@@ -468,13 +482,6 @@ public:
         return p->GetValueImage();
     }
 
-    /** Returns property's position under its parent. */
-    unsigned int GetPropertyIndex( wxPGPropArg id )
-    {
-        wxPG_PROP_ARG_CALL_PROLOG_RETVAL(INT_MAX)
-        return p->GetIndexInParent();
-    }
-
     /** Returns label of a property. */
     const wxString& GetPropertyLabel( wxPGPropArg id )
     {
@@ -483,10 +490,9 @@ public:
     }
 
     /** Returns name of a property, by which it is globally accessible. */
-    wxString GetPropertyName( wxPGPropArg id )
+    wxString GetPropertyName( wxPGProperty* property )
     {
-        wxPG_PROP_ARG_CALL_PROLOG_RETVAL(m_emptyString)
-        return p->GetName();
+        return property->GetName();
     }
 
     /** Returns parent item of a property. */
@@ -524,84 +530,66 @@ public:
     {
         return (unsigned long) GetPropertyValueAsLong(id);
     }
-#ifndef SWIG
     int GetPropertyValueAsInt( wxPGPropArg id ) const
         { return (int)GetPropertyValueAsLong(id); }
-#endif
     bool GetPropertyValueAsBool( wxPGPropArg id ) const;
     double GetPropertyValueAsDouble( wxPGPropArg id ) const;
-    wxObject* GetPropertyValueAsWxObjectPtr( wxPGPropArg id ) const;
-    void* GetPropertyValueAsVoidPtr( wxPGPropArg id ) const;
 
 #define wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL(TYPENAME, DEFVAL) \
     wxPG_PROP_ARG_CALL_PROLOG_RETVAL(DEFVAL) \
-    if ( p->m_value.GetType() != TYPENAME ) \
+    wxString typeName(wxS(TYPENAME)); \
+    wxVariant value = p->GetValue(); \
+    if ( value.GetType() != typeName ) \
     { \
-        wxPGGetFailed(p, TYPENAME); \
+        wxPGGetFailed(p, typeName); \
         return DEFVAL; \
     }
 
 #define wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL_WFALLBACK(TYPENAME, DEFVAL) \
     wxPG_PROP_ARG_CALL_PROLOG_RETVAL(DEFVAL) \
-    if ( p->m_value.GetType() != TYPENAME ) \
+    wxVariant value = p->GetValue(); \
+    if ( value.GetType() != wxS(TYPENAME) ) \
         return DEFVAL; \
 
     wxArrayString GetPropertyValueAsArrayString( wxPGPropArg id ) const
     {
-        wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL(wxT("arrstring"),
+        wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL("arrstring",
                                                    wxArrayString())
-        return p->m_value.GetArrayString();
-    }
-
-    wxPoint GetPropertyValueAsPoint( wxPGPropArg id ) const
-    {
-        wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL(wxT("wxPoint"), wxPoint())
-        return WX_PG_VARIANT_GETVALUEREF(p->GetValue(), wxPoint);
-    }
-
-    wxSize GetPropertyValueAsSize( wxPGPropArg id ) const
-    {
-        wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL(wxT("wxSize"), wxSize())
-        return WX_PG_VARIANT_GETVALUEREF(p->GetValue(), wxSize);
+        return value.GetArrayString();
     }
 
+#ifdef wxLongLong_t
     wxLongLong_t GetPropertyValueAsLongLong( wxPGPropArg id ) const
     {
-        wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL_WFALLBACK(wxT("wxLongLong"),
-                                             (long) GetPropertyValueAsLong(id))
-        return WX_PG_VARIANT_GETVALUEREF(p->GetValue(), wxLongLong).GetValue();
+        wxPG_PROP_ARG_CALL_PROLOG_RETVAL(0)
+        return p->GetValue().GetLongLong().GetValue();
     }
 
     wxULongLong_t GetPropertyValueAsULongLong( wxPGPropArg id ) const
     {
-        wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL_WFALLBACK(wxT("wxULongLong"),
-                                    (unsigned long) GetPropertyValueAsULong(id))
-        return WX_PG_VARIANT_GETVALUEREF(p->GetValue(), wxULongLong).GetValue();
+        wxPG_PROP_ARG_CALL_PROLOG_RETVAL(0)
+        return p->GetValue().GetULongLong().GetValue();
     }
+#endif
 
     wxArrayInt GetPropertyValueAsArrayInt( wxPGPropArg id ) const
     {
-        wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL(wxT("wxArrayInt"),
+        wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL("wxArrayInt",
                                                    wxArrayInt())
-        wxArrayInt arr = WX_PG_VARIANT_GETVALUEREF(p->GetValue(), wxArrayInt);
+        wxArrayInt arr;
+        arr << value;
         return arr;
     }
 
 #if wxUSE_DATETIME
     wxDateTime GetPropertyValueAsDateTime( wxPGPropArg id ) const
     {
-        wxPG_PROP_ARG_CALL_PROLOG_RETVAL(wxDateTime())
-
-        if ( wxStrcmp(p->m_value.GetType(), wxT("datetime")) != 0 )
-        {
-            wxPGGetFailed(p, wxT("datetime"));
-            return wxDateTime();
-        }
-        return p->m_value.GetDateTime();
+        wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL("datetime",
+                                                   wxDateTime())
+        return value.GetDateTime();
     }
 #endif
 
-#ifndef SWIG
     /** Returns a wxVariant list containing wxVariant versions of all
         property values. Order is not guaranteed.
         @param flags
@@ -617,23 +605,27 @@ public:
     {
         return m_pState->DoGetPropertyValues(listname, baseparent, flags);
     }
-#endif
 
-    wxString GetPropertyValueType( wxPGPropArg id )
-    {
-        wxPG_PROP_ARG_CALL_PROLOG_RETVAL(m_emptyString)
-        return p->GetValueType();
-    }
+    /**
+        Returns currently selected property. NULL if none.
+
+        @remarks When wxPG_EX_MULTIPLE_SELECTION extra style is used, this
+                 member function returns the focused property, that is the
+                 one which can have active editor.
+    */
+    wxPGProperty* GetSelection() const;
+
+    /**
+        Returns list of currently selected properties.
 
-    /** Returns currently selected property. */
-    wxPGProperty* GetSelection() const
+        @remarks wxArrayPGProperty should be compatible with std::vector API.
+    */
+    const wxArrayPGProperty& GetSelectedProperties() const
     {
-        return m_pState->GetSelection();
+        return m_pState->m_selection;
     }
 
-#ifndef SWIG
     wxPropertyGridPageState* GetState() const { return m_pState; }
-#endif
 
     /** Similar to GetIterator(), but instead returns wxPGVIterator instance,
         which can be useful for forward-iterating through arbitrary property
@@ -734,15 +726,6 @@ public:
         return p->IsCategory();
     }
 
-    /** Inserts choice to a property that can accept one.
-
-        See AddPropertyChoice for more details.
-    */
-    void InsertPropertyChoice( wxPGPropArg id,
-                               const wxString& label,
-                               int index,
-                               int value = wxPG_INVALID_VALUE );
-
     /** Returns true if property is enabled. */
     bool IsPropertyEnabled( wxPGPropArg id ) const
     {
@@ -767,10 +750,19 @@ public:
         return ( (p->GetFlags() & wxPG_PROP_MODIFIED) ? true : false );
     }
 
+    /**
+        Returns true if property is selected.
+    */
+    bool IsPropertySelected( wxPGPropArg id ) const
+    {
+        wxPG_PROP_ARG_CALL_PROLOG_RETVAL(false)
+        return m_pState->DoIsPropertySelected(p);
+    }
+
     /**
         Returns true if property is shown (ie hideproperty with true not
         called for it).
-     */
+    */
     bool IsPropertyShown( wxPGPropArg id ) const
     {
         wxPG_PROP_ARG_CALL_PROLOG_RETVAL(false)
@@ -836,6 +828,9 @@ public:
         PageState        = 0x08,
         /** Include splitter position. Stored for each page. */
         SplitterPosState = 0x10,
+        /** Include description box size.
+            Only applies to wxPropertyGridManager. */
+        DescBoxState     = 0x20,
 
         /**
             Include all supported user editable state information.
@@ -844,7 +839,8 @@ public:
                            ExpandedState |
                            ScrollPosState |
                            PageState |
-                           SplitterPosState
+                           SplitterPosState |
+                           DescBoxState
     };
 
     /**
@@ -883,22 +879,36 @@ public:
     wxString SaveEditableState( int includedStates = AllStates ) const;
 
     /**
-        Lets user to set the strings listed in the choice dropdown of a
+        Lets user set the strings listed in the choice dropdown of a
         wxBoolProperty. Defaults are "True" and "False", so changing them to,
         say, "Yes" and "No" may be useful in some less technical applications.
     */
     static void SetBoolChoices( const wxString& trueChoice,
                                 const wxString& falseChoice );
 
-    /** Sets or clears flag(s) of all properties in given array.
-        @param flags
-        Property flags to set or clear.
-        @param inverse
-        Set to true if you want to clear flag instead of setting them.
+    /**
+        Set proportion of a auto-stretchable column. wxPG_SPLITTER_AUTO_CENTER
+        window style needs to be used to indicate that columns are auto-
+        resizable.
+
+        @returns Returns @false on failure.
+
+        @remarks You should call this for individual pages of
+                 wxPropertyGridManager (if used).
+
+        @see GetColumnProportion()
+    */
+    bool SetColumnProportion( unsigned int column, int proportion );
+
+    /**
+        Returns auto-resize proportion of the given column.
+
+        @see SetColumnProportion()
     */
-    void SetPropertiesFlag( const wxArrayPGProperty& srcArr,
-                            wxPGProperty::FlagType flags,
-                            bool inverse = false );
+    int GetColumnProportion( unsigned int column ) const
+    {
+        return m_pState->DoGetColumnProportion(column);
+    }
 
     /** Sets an attribute for this property.
         @param name
@@ -917,13 +927,68 @@ public:
         DoSetPropertyAttribute(id,attrName,value,argFlags);
     }
 
-    /** Sets attributes from a wxPGAttributeStorage.
+    /** Sets property attribute for all applicapple properties.
+        Be sure to use this method only after all properties have been
+        added to the grid.
     */
-    void SetPropertyAttributes( wxPGPropArg id,
-                                const wxPGAttributeStorage& attributes )
+    void SetPropertyAttributeAll( const wxString& attrName, wxVariant value );
+
+    /**
+        Sets background colour of a property.
+
+        @param id
+            Property name or pointer.
+
+        @param colour
+            New background colour.
+
+        @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 SetPropertyBackgroundColour( wxPGPropArg id,
+                                      const wxColour& colour,
+                                      int flags = wxPG_RECURSE );
+
+    /** Resets text and background colours of given property.
+    */
+    void SetPropertyColoursToDefault( wxPGPropArg id );
+
+    /**
+        Sets text colour of a property.
+
+        @param id
+            Property name or pointer.
+
+        @param colour
+            New background colour.
+
+        @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 SetPropertyTextColour( wxPGPropArg id,
+                                const wxColour& col,
+                                int flags = wxPG_RECURSE );
+
+    /**
+        Returns background colour of first cell of a property.
+    */
+    wxColour GetPropertyBackgroundColour( wxPGPropArg id ) const
     {
-        wxPG_PROP_ARG_CALL_PROLOG()
-        p->SetAttributes(attributes);
+        wxPG_PROP_ARG_CALL_PROLOG_RETVAL(wxColour())
+        return p->GetCell(0).GetBgCol();
+    }
+
+    /**
+        Returns text colour of first cell of a property.
+    */
+    wxColour GetPropertyTextColour( wxPGPropArg id ) const
+    {
+        wxPG_PROP_ARG_CALL_PROLOG_RETVAL(wxColour())
+        return p->GetCell(0).GetFgCol();
     }
 
     /** Sets text, bitmap, and colours for given column's cell.
@@ -937,35 +1002,8 @@ public:
                           const wxString& text = wxEmptyString,
                           const wxBitmap& bitmap = wxNullBitmap,
                           const wxColour& fgCol = wxNullColour,
-                          const wxColour& bgCol = wxNullColour )
-    {
-        wxPG_PROP_ARG_CALL_PROLOG()
-        p->SetCell( column, new wxPGCell(text, bitmap, fgCol, bgCol) );
-    }
+                          const wxColour& bgCol = wxNullColour );
 
-    /** Set choices of a property to specified set of labels and values.
-
-        @remarks
-        This operation clears the property value.
-    */
-    void SetPropertyChoices( wxPGPropArg id, wxPGChoices& choices)
-    {
-        wxPG_PROP_ARG_CALL_PROLOG()
-        p->SetChoices(choices);
-    }
-
-
-    /**
-        If property's set of choices is shared, then calling this method
-        converts it to private.
-    */
-    void SetPropertyChoicesExclusive( wxPGPropArg id )
-    {
-        wxPG_PROP_ARG_CALL_PROLOG()
-        p->SetChoicesExclusive();
-    }
-
-#ifndef SWIG
     /** Sets client data (void*) of a property.
         @remarks
         This untyped client data has to be deleted manually.
@@ -993,7 +1031,6 @@ public:
         p->SetEditor(editor);
         RefreshProperty(p);
     }
-#endif
 
     /** Sets editor control of a property. As editor argument, use
         editor name string, such as "TextCtrl" or "Choice".
@@ -1007,12 +1044,19 @@ public:
     */
     void SetPropertyLabel( wxPGPropArg id, const wxString& newproplabel );
 
-    /** Set modified status of a property and all its children.
+    /**
+        Sets name of a property.
+
+        @param id
+            Name or pointer of property which name to change.
+
+        @param newName
+            New name for property.
     */
-    void SetPropertyModifiedStatus( wxPGPropArg id, bool modified )
+    void SetPropertyName( wxPGPropArg id, const wxString& newName )
     {
         wxPG_PROP_ARG_CALL_PROLOG()
-        p->SetModifiedStatus(modified);
+        m_pState->DoSetPropertyName( p, newName );
     }
 
     /**
@@ -1034,19 +1078,21 @@ public:
         if ( flags & wxPG_RECURSE )
             p->SetFlagRecursively(wxPG_PROP_READONLY, set);
         else
-            p->SetFlag(wxPG_PROP_READONLY);
+            p->ChangeFlag(wxPG_PROP_READONLY, set);
     }
 
     /** Sets property's value to unspecified.
         If it has children (it may be category), then the same thing is done to
         them.
     */
-    void SetPropertyValueUnspecified( wxPGPropArg id );
+    void SetPropertyValueUnspecified( wxPGPropArg id )
+    {
+        wxPG_PROP_ARG_CALL_PROLOG()
+        p->SetValueToUnspecified();
+    }
 
-#ifndef SWIG
-    /** Sets various property values from a list of wxVariants. If property with
-        name is missing from the grid, new property is created under given
-        default category (or root if omitted).
+    /**
+        Sets property values from a list of wxVariants.
     */
     void SetPropertyValues( const wxVariantList& list,
                             wxPGPropArg defaultCategory = wxNullProperty )
@@ -1057,12 +1103,14 @@ public:
         m_pState->DoSetPropertyValues(list, p);
     }
 
+    /**
+        Sets property values from a list of wxVariants.
+    */
     void SetPropertyValues( const wxVariant& list,
                             wxPGPropArg defaultCategory = wxNullProperty )
     {
         SetPropertyValues(list.GetList(),defaultCategory);
     }
-#endif
 
     /** Associates the help string with property.
         @remarks
@@ -1103,7 +1151,6 @@ public:
     }
 #endif
 
-#ifndef SWIG
     /** Sets value (long integer) of a property.
     */
     void SetPropertyValue( wxPGPropArg id, long value )
@@ -1133,7 +1180,11 @@ public:
         wxVariant v(value);
         SetPropVal( id, v );
     }
-    void SetPropertyValue( wxPGPropArg id, const wxChar* value )
+    void SetPropertyValue( wxPGPropArg id, const wchar_t* value )
+    {
+        SetPropertyValueString( id, wxString(value) );
+    }
+    void SetPropertyValue( wxPGPropArg id, const char* value )
     {
         SetPropertyValueString( id, wxString(value) );
     }
@@ -1172,20 +1223,7 @@ public:
         SetPropVal( id, v );
     }
 
-    /** Sets value (wxPoint&) of a property.
-    */
-    void SetPropertyValue( wxPGPropArg id, const wxPoint& value )
-    {
-        wxVariant v = WXVARIANT(value);
-        SetPropVal( id, v );
-    }
-    /** Sets value (wxSize&) of a property.
-    */
-    void SetPropertyValue( wxPGPropArg id, const wxSize& value )
-    {
-        wxVariant v = WXVARIANT(value);
-        SetPropVal( id, v );
-    }
+#ifdef wxLongLong_t
     /** Sets value (wxLongLong&) of a property.
     */
     void SetPropertyValue( wxPGPropArg id, wxLongLong_t value )
@@ -1200,6 +1238,8 @@ public:
         wxVariant v = WXVARIANT(wxULongLong(value));
         SetPropVal( id, v );
     }
+#endif
+
     /** Sets value (wxArrayInt&) of a property.
     */
     void SetPropertyValue( wxPGPropArg id, const wxArrayInt& value )
@@ -1207,7 +1247,6 @@ public:
         wxVariant v = WXVARIANT(value);
         SetPropVal( id, v );
     }
-#endif  // !SWIG
 
     /** Sets value (wxString) of a property.
 
@@ -1229,11 +1268,9 @@ public:
         SetPropVal( id, value );
     }
 
-#ifndef SWIG
     /** Sets value (wxVariant&) of a property. Same as SetPropertyValue, but
         accepts reference. */
     void SetPropVal( wxPGPropArg id, wxVariant& value );
-#endif
 
     /** Adjusts how wxPropertyGrid behaves when invalid value is entered
         in a property.
@@ -1242,255 +1279,73 @@ public:
     */
     void SetValidationFailureBehavior( int vfbFlags );
 
-#ifdef SWIG
-    %pythoncode {
-        def MapType(class_,factory):
-            "Registers Python type/class to property mapping.\n\nfactory: Property builder function/class."
-            global _type2property
-            try:
-                mappings = _type2property
-            except NameError:
-                raise AssertionError("call only after a propertygrid or manager instance constructed")
-
-            mappings[class_] = factory
-
-
-        def DoDefaultTypeMappings(self):
-            "Map built-in properties."
-            global _type2property
-            try:
-                mappings = _type2property
-
-                return
-            except NameError:
-                mappings = {}
-                _type2property = mappings
-
-            mappings[str] = StringProperty
-            mappings[unicode] = StringProperty
-            mappings[int] = IntProperty
-            mappings[float] = FloatProperty
-            mappings[bool] = BoolProperty
-            mappings[list] = ArrayStringProperty
-            mappings[tuple] = ArrayStringProperty
-            mappings[wx.Font] = FontProperty
-            mappings[wx.Colour] = ColourProperty
-            "mappings[wx.Size] = SizeProperty"
-            "mappings[wx.Point] = PointProperty"
-            "mappings[wx.FontData] = FontDataProperty"
-
-        def DoDefaultValueTypeMappings(self):
-            "Map pg value type ids to getter methods."
-            global _vt2getter
-            try:
-                vt2getter = _vt2getter
-
-                return
-            except NameError:
-                vt2getter = {}
-                _vt2getter = vt2getter
-
-        def GetPropertyValues(self,dict_=None, as_strings=False, inc_attributes=False):
-            "Returns values in the grid."
-            ""
-            "dict_: if not given, then a new one is created. dict_ can be"
-            "  object as well, in which case it's __dict__ is used."
-            "as_strings: if True, then string representations of values"
-            "  are fetched instead of native types. Useful for config and such."
-            "inc_attributes: if True, then property attributes are added"
-            "  as @<propname>@<attr>."
-            ""
-            "Return value: dictionary with values. It is always a dictionary,"
-            "so if dict_ was object with __dict__ attribute, then that attribute"
-            "is returned."
-
-            if dict_ is None:
-                dict_ = {}
-            elif hasattr(dict_,'__dict__'):
-                dict_ = dict_.__dict__
-
-            if not as_strings:
-                getter = self.GetPropertyValue
-            else:
-                getter = self.GetPropertyValueAsString
-
-            it = self.GetVIterator(PG_ITERATE_PROPERTIES)
-            while not it.AtEnd():
-                p = it.GetProperty()
-                name = p.GetName()
-
-                dict_[name] = getter(p)
-
-                if inc_attributes:
-                    attrs = p.GetAttributes()
-                    if attrs and len(attrs):
-                        dict_['@%s@attr'%name] = attrs
-
-                it.Next()
-
-            return dict_
-
-        GetValues = GetPropertyValues
-
-
-        def SetPropertyValues(self,dict_):
-            "Sets property values from dict_, which can be either\ndictionary or an object with __dict__ attribute."
-            ""
-            "autofill: If true, keys with not relevant properties"
-            "  are auto-created. For more info, see AutoFill."
-            ""
-            "Notes:"
-            "  * Keys starting with underscore are ignored."
-            "  * Attributes can be set with entries named @<propname>@<attr>."
-            ""
-
-            autofill = False
-
-            if dict_ is None:
-                dict_ = {}
-            elif hasattr(dict_,'__dict__'):
-                dict_ = dict_.__dict__
-
-            attr_dicts = []
-
-            def set_sub_obj(k0,dict_):
-                for k,v in dict_.iteritems():
-                    if k[0] != '_':
-                        if k.endswith('@attr'):
-                            attr_dicts.append((k[1:-5],v))
-                        else:
-                            try:
-                                self.SetPropertyValue(k,v)
-                            except:
-                                try:
-                                    if autofill:
-                                        self._AutoFillOne(k0,k,v)
-                                        continue
-                                except:
-                                    if isinstance(v,dict):
-                                        set_sub_obj(k,v)
-                                    elif hasattr(v,'__dict__'):
-                                        set_sub_obj(k,v.__dict__)
-
-
-            for k,v in attr_dicts:
-                p = GetPropertyByName(k)
-                if not p:
-                    raise AssertionError("No such property: '%s'"%k)
-                for an,av in v.iteritems():
-                    p.SetAttribute(an, av)
-
-
-            cur_page = False
-            is_manager = isinstance(self,PropertyGridManager)
-
-            try:
-                set_sub_obj(self.GetGrid().GetRoot(),dict_)
-            except:
-                import traceback
-                traceback.print_exc()
-
-            self.Refresh()
-
-        SetValues = SetPropertyValues
-
-        def _AutoFillMany(self,cat,dict_):
-            for k,v in dict_.iteritems():
-                self._AutoFillOne(cat,k,v)
-
-
-        def _AutoFillOne(self,cat,k,v):
-            global _type2property
-
-            factory = _type2property.get(v.__class__,None)
-
-            if factory:
-                self.AppendIn( cat, factory(k,k,v) )
-            elif hasattr(v,'__dict__'):
-                cat2 = self.AppendIn( cat, PropertyCategory(k) )
-                self._AutoFillMany(cat2,v.__dict__)
-            elif isinstance(v,dict):
-                cat2 = self.AppendIn( cat, PropertyCategory(k) )
-                self._AutoFillMany(cat2,v)
-            elif not k.startswith('_'):
-                raise AssertionError("member '%s' is of unregisted type/class '%s'"%(k,v.__class__))
-
-
-        def AutoFill(self,obj,parent=None):
-            "Clears properties and re-fills to match members and\nvalues of given object or dictionary obj."
-
-            self.edited_objects[parent] = obj
-
-            cur_page = False
-            is_manager = isinstance(self,PropertyGridManager)
-
-            if not parent:
-                if is_manager:
-                    page = self.GetCurrentPage()
-                    page.Clear()
-                    parent = page.GetRoot()
-                else:
-                    self.Clear()
-                    parent = self.GetGrid().GetRoot()
-            else:
-                it = self.GetIterator(PG_ITERATE_PROPERTIES, parent)
-                it.Next()  # Skip the parent
-                while not it.AtEnd():
-                    p = it.GetProperty()
-                    if not p.IsSomeParent(parent):
-                        break
-
-                    self.DeleteProperty(p)
-
-                    name = p.GetName()
-                    it.Next()
-
-            if not is_manager or page == self.GetCurrentPage():
-                self.Freeze()
-                cur_page = True
-
-            try:
-                self._AutoFillMany(parent,obj.__dict__)
-            except:
-                import traceback
-                traceback.print_exc()
-
-            if cur_page:
-                self.Thaw()
-
-        def RegisterEditor(self, editor, editorName=None):
-            "Transform class into instance, if necessary."
-            if not isinstance(editor, PGEditor):
-                editor = editor()
-            if not editorName:
-                editorName = editor.__class__.__name__
-            try:
-                self._editor_instances.append(editor)
-            except:
-                self._editor_instances = [editor]
-            RegisterEditor(editor, editorName)
-
-        def GetPropertyClientData(self, p):
-            if isinstance(p, basestring):
-                p = self.GetPropertyByName(p)
-            return p.GetClientData()
-
-        def SetPropertyClientData(self, p, data):
-            if isinstance(p, basestring):
-                p = self.GetPropertyByName(p)
-            return p.SetClientData(data)
+    /**
+        Sorts all properties recursively.
+
+        @param flags
+            This can contain any of the following options:
+              wxPG_SORT_TOP_LEVEL_ONLY: Only sort categories and their
+                immediate children. Sorting done by wxPG_AUTO_SORT option
+                uses this.
+
+        @see SortChildren, wxPropertyGrid::SetSortFunction
+    */
+    void Sort( int flags = 0 );
+
+    /**
+        Sorts children of a property.
+
+        @param id
+            Name or pointer to a property.
+
+        @param flags
+            This can contain any of the following options:
+              wxPG_RECURSE: Sorts recursively.
+
+        @see Sort, wxPropertyGrid::SetSortFunction
+    */
+    void SortChildren( wxPGPropArg id, int flags = 0 )
+    {
+        wxPG_PROP_ARG_CALL_PROLOG()
+        m_pState->DoSortChildren(p, flags);
     }
-#endif
 
     // GetPropertyByName With nice assertion error message.
     wxPGProperty* GetPropertyByNameA( const wxString& name ) const;
 
     static wxPGEditor* GetEditorByName( const wxString& editorName );
 
+    // NOTE: This function reselects the property and may cause
+    //       excess flicker, so to just call Refresh() on a rect
+    //       of single property, call DrawItem() instead.
     virtual void RefreshProperty( wxPGProperty* p ) = 0;
 
 protected:
 
+    bool DoClearSelection( bool validation = false,
+                           int selFlags = 0 );
+
+    /**
+        In derived class, implement to set editable state component with
+        given name to given value.
+    */
+    virtual bool SetEditableStateItem( const wxString& name, wxVariant value )
+    {
+        wxUnusedVar(name);
+        wxUnusedVar(value);
+        return false;
+    }
+
+    /**
+        In derived class, implement to return editable state component with
+        given name.
+    */
+    virtual wxVariant GetEditableStateItem( const wxString& name ) const
+    {
+        wxUnusedVar(name);
+        return wxNullVariant;
+    }
+
     // Returns page state data for given (sub) page (-1 means current page).
     virtual wxPropertyGridPageState* GetPageState( int pageIndex ) const
     {
@@ -1504,8 +1359,6 @@ protected:
     // Default call's m_pState's BaseGetPropertyByName
     virtual wxPGProperty* DoGetPropertyByName( const wxString& name ) const;
 
-#ifndef SWIG
-
     // Deriving classes must set this (it must be only or current page).
     wxPropertyGridPageState*         m_pState;
 
@@ -1522,18 +1375,24 @@ private:
     // Cannot be GetGrid() due to ambiguity issues.
     wxPropertyGrid* GetPropertyGrid()
     {
+        if ( !m_pState )
+            return NULL;
         return m_pState->GetGrid();
     }
 
     // Cannot be GetGrid() due to ambiguity issues.
     const wxPropertyGrid* GetPropertyGrid() const
     {
-        return (const wxPropertyGrid*) m_pState->GetGrid();
+        if ( !m_pState )
+            return NULL;
+
+        return m_pState->GetGrid();
     }
-#endif // #ifndef SWIG
 
     friend class wxPropertyGrid;
     friend class wxPropertyGridManager;
 };
 
+#endif // wxUSE_PROPGRID
+
 #endif // __WX_PROPGRID_PROPGRIDIFACE_H__