X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d7e2b52235d70e25d7797ce1dccd97fa6989f4b5..66c2bf7b1d9326fb650acfaae22ec50528cfbf7c:/include/wx/propgrid/propgridiface.h?ds=sidebyside diff --git a/include/wx/propgrid/propgridiface.h b/include/wx/propgrid/propgridiface.h index b8f864d52b..a553d6dba1 100644 --- a/include/wx/propgrid/propgridiface.h +++ b/include/wx/propgrid/propgridiface.h @@ -1,17 +1,18 @@ ///////////////////////////////////////////////////////////////////////////// -// 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$ // 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" @@ -19,8 +20,6 @@ // ----------------------------------------------------------------------- -#ifndef SWIG - /** @section wxPGPropArgCls Most property grid functions have this type as their argument, as it can @@ -29,7 +28,6 @@ class WXDLLIMPEXP_PROPGRID wxPGPropArgCls { public: - wxPGPropArgCls() { } wxPGPropArgCls( const wxPGProperty* property ) { m_ptr.property = (wxPGProperty*) property; @@ -66,17 +64,15 @@ public: m_ptr.charName = str; m_flags = IsCharPtr; } -#if wxUSE_WCHAR_T wxPGPropArgCls( const wchar_t* str ) { m_ptr.wcharName = str; m_flags = IsWCharPtr; } -#endif /** This constructor is required for NULL. */ wxPGPropArgCls( int ) { - m_ptr.property = (wxPGProperty*) NULL; + m_ptr.property = NULL; m_flags = IsProperty; } wxPGProperty* GetPtr( wxPropertyGridInterface* iface ) const; @@ -95,23 +91,19 @@ private: IsWxString = 0x01, IsCharPtr = 0x02, IsWCharPtr = 0x04, - OwnsWxString = 0x10, + OwnsWxString = 0x10 }; union { wxPGProperty* property; const char* charName; -#if wxUSE_WCHAR_T const wchar_t* wcharName; -#endif const wxString* stringName; } m_ptr; unsigned char m_flags; }; -#endif - typedef const wxPGPropArgCls& wxPGPropArg; // ----------------------------------------------------------------------- @@ -200,9 +192,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. + + @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. */ @@ -231,12 +236,42 @@ public: bool ChangePropertyValue( wxPGPropArg id, wxVariant newValue ); /** - 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 ); - /** Disables property. */ + /** + Removes a property. Does not delete the property object, but + instead returns it. + + @param id + Pointer or name of a property. + + @remarks Removed property cannot have any children. + + Also, if you remove property in a wxPropertyGrid event + handler, the actual removal is postponed until the next + idle event. + */ + wxPGProperty* RemoveProperty( wxPGPropArg id ); + + /** + Disables a property. + + @see EnableProperty(), wxPGProperty::Enable() + */ bool DisableProperty( wxPGPropArg id ) { return EnableProperty(id,false); } /** @@ -249,7 +284,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 ); @@ -333,14 +375,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 + cannot be accessed globally by their name. Instead, use + "." instead of "". */ wxPGProperty* GetProperty( const wxString& name ) const { @@ -354,7 +394,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(); } @@ -391,14 +434,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. @@ -487,10 +528,8 @@ 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; @@ -517,23 +556,17 @@ public: return value.GetArrayString(); } -#if wxUSE_LONGLONG_NATIVE +#ifdef wxLongLong_t wxLongLong_t GetPropertyValueAsLongLong( wxPGPropArg id ) const { - wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL_WFALLBACK("wxLongLong", - (long) GetPropertyValueAsLong(id)) - wxLongLong ll; - ll << value; - return ll.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("wxULongLong", - (unsigned long) GetPropertyValueAsULong(id)) - wxULongLong ull; - ull << value; - return ull.GetValue(); + wxPG_PROP_ARG_CALL_PROLOG_RETVAL(0) + return p->GetValue().GetULongLong().GetValue(); } #endif @@ -555,7 +588,6 @@ public: } #endif -#ifndef SWIG /** Returns a wxVariant list containing wxVariant versions of all property values. Order is not guaranteed. @param flags @@ -571,17 +603,27 @@ public: { return m_pState->DoGetPropertyValues(listname, baseparent, flags); } -#endif - /** Returns currently selected property. */ - wxPGProperty* GetSelection() const + /** + 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. + + @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 @@ -706,10 +748,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) @@ -826,13 +877,37 @@ 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 ); + /** + 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() + */ + int GetColumnProportion( unsigned int column ) const + { + return m_pState->DoGetColumnProportion(column); + } + /** Sets an attribute for this property. @param name Text identifier of attribute. See @ref propgrid_property_attributes. @@ -856,6 +931,64 @@ public: */ 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_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. @remarks @@ -869,7 +1002,6 @@ public: const wxColour& fgCol = wxNullColour, const wxColour& bgCol = wxNullColour ); -#ifndef SWIG /** Sets client data (void*) of a property. @remarks This untyped client data has to be deleted manually. @@ -897,7 +1029,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". @@ -945,19 +1076,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 ) @@ -968,12 +1101,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 @@ -1014,7 +1149,6 @@ public: } #endif -#ifndef SWIG /** Sets value (long integer) of a property. */ void SetPropertyValue( wxPGPropArg id, long value ) @@ -1044,12 +1178,10 @@ public: wxVariant v(value); SetPropVal( id, v ); } -#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) ); @@ -1089,7 +1221,7 @@ public: SetPropVal( id, v ); } -#if wxUSE_LONGLONG_NATIVE +#ifdef wxLongLong_t /** Sets value (wxLongLong&) of a property. */ void SetPropertyValue( wxPGPropArg id, wxLongLong_t value ) @@ -1113,7 +1245,6 @@ public: wxVariant v = WXVARIANT(value); SetPropVal( id, v ); } -#endif // !SWIG /** Sets value (wxString) of a property. @@ -1135,11 +1266,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. @@ -1148,255 +1277,52 @@ 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; 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. @@ -1431,8 +1357,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; @@ -1449,15 +1373,19 @@ 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;