X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1c4293cb91327247ad69e6ec8d589bfaa299db28..86ac84b8ce086e6bbda58f422d41f84268606e35:/include/wx/propgrid/propgridiface.h diff --git a/include/wx/propgrid/propgridiface.h b/include/wx/propgrid/propgridiface.h index 68634c8023..06712abf35 100644 --- a/include/wx/propgrid/propgridiface.h +++ b/include/wx/propgrid/propgridiface.h @@ -4,7 +4,7 @@ // Author: Jaakko Salli // Modified by: // Created: 2008-08-24 -// RCS-ID: $Id: +// RCS-ID: $Id$ // Copyright: (c) Jaakko Salli // Licence: wxWindows license ///////////////////////////////////////////////////////////////////////////// @@ -12,6 +12,8 @@ #ifndef __WX_PROPGRID_PROPGRIDIFACE_H__ #define __WX_PROPGRID_PROPGRIDIFACE_H__ +#if wxUSE_PROPGRID + #include "wx/propgrid/property.h" #include "wx/propgrid/propgridpagestate.h" @@ -31,61 +33,81 @@ 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.charName = str; + m_flags = IsCharPtr; + } +#if wxUSE_WCHAR_T + wxPGPropArgCls( const wchar_t* str ) { - m_ptr.rawname = str; - m_isName = 2; + m_ptr.wcharName = str; + m_flags = IsWCharPtr; } +#endif /** 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; +#if wxUSE_WCHAR_T + const wchar_t* wcharName; +#endif + const wxString* stringName; } m_ptr; - unsigned char m_isName; + unsigned char m_flags; }; #endif @@ -96,10 +118,10 @@ 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 +169,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 +200,22 @@ 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. + */ + 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,28 +239,21 @@ 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. */ void DeleteProperty( wxPGPropArg id ); - /** Deletes choice from a property. + /** + Removes and returns a property. - If selected item is deleted, then the value is set to unspecified. + @param id + Pointer or name of a property. - See AddPropertyChoice for more details. + @remarks Removed property cannot have any children. */ - void DeletePropertyChoice( wxPGPropArg id, int index ); + wxPGProperty* RemoveProperty( wxPGPropArg id ); /** Disables property. */ bool DisableProperty( wxPGPropArg id ) { return EnableProperty(id,false); } @@ -279,16 +285,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 +352,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 "." in place of "". + @remarks Properties which have non-category, non-root parent + can not be accessed globally by their name. Instead, use + "." instead of "". */ wxPGProperty* GetProperty( const wxString& name ) const { @@ -377,7 +371,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(); } @@ -441,12 +438,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 +459,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 +467,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. */ @@ -530,74 +513,59 @@ public: #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 @@ -619,12 +587,6 @@ public: } #endif - wxString GetPropertyValueType( wxPGPropArg id ) - { - wxPG_PROP_ARG_CALL_PROLOG_RETVAL(m_emptyString) - return p->GetValueType(); - } - /** Returns currently selected property. */ wxPGProperty* GetSelection() const { @@ -734,15 +696,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 { @@ -836,6 +789,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 +800,8 @@ public: ExpandedState | ScrollPosState | PageState | - SplitterPosState + SplitterPosState | + DescBoxState }; /** @@ -890,16 +847,6 @@ public: 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. - */ - void SetPropertiesFlag( const wxArrayPGProperty& srcArr, - wxPGProperty::FlagType flags, - bool inverse = false ); - /** Sets an attribute for this property. @param name Text identifier of attribute. See @ref propgrid_property_attributes. @@ -917,13 +864,66 @@ 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 recursively + If True, child properties are affected recursively. Property + categories are skipped if this flag is used. + */ + void SetPropertyBackgroundColour( wxPGPropArg id, + const wxColour& colour, + bool recursively = true ); + + /** 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 recursively + If True, child properties are affected recursively. Property + categories are skipped if this flag is used. + */ + void SetPropertyTextColour( wxPGPropArg id, + const wxColour& col, + bool recursively = true ); + + /** + 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,33 +937,7 @@ 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) ); - } - - /** 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(); - } + const wxColour& bgCol = wxNullColour ); #ifndef SWIG /** Sets client data (void*) of a property. @@ -1004,18 +978,22 @@ public: } /** Sets label of a property. - @remarks - This is the only way to set property's name. There is not - wxPGProperty::SetLabel() method. */ 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 ); } /** @@ -1037,14 +1015,19 @@ 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() + wxVariant nullVariant; + SetPropVal(p, nullVariant); + } #ifndef SWIG /** Sets various property values from a list of wxVariants. If property with @@ -1136,7 +1119,13 @@ public: wxVariant v(value); SetPropVal( id, v ); } - void SetPropertyValue( wxPGPropArg id, const wxChar* value ) +#if wxUSE_WCHAR_T + void SetPropertyValue( wxPGPropArg id, const wchar_t* value ) + { + SetPropertyValueString( id, wxString(value) ); + } +#endif + void SetPropertyValue( wxPGPropArg id, const char* value ) { SetPropertyValueString( id, wxString(value) ); } @@ -1175,20 +1164,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 ) @@ -1203,6 +1179,8 @@ public: wxVariant v = WXVARIANT(wxULongLong(value)); SetPropVal( id, v ); } +#endif + /** Sets value (wxArrayInt&) of a property. */ void SetPropertyValue( wxPGPropArg id, const wxArrayInt& value ) @@ -1245,245 +1223,36 @@ 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 @@." - "" - "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 @@." - "" - - 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; @@ -1494,6 +1263,27 @@ public: protected: + /** + 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 { @@ -1539,4 +1329,6 @@ private: friend class wxPropertyGridManager; }; +#endif // wxUSE_PROPGRID + #endif // __WX_PROPGRID_PROPGRIDIFACE_H__