// Author: Jaakko Salli
// Modified by:
// Created: 2008-08-24
-// RCS-ID: $Id:
+// RCS-ID: $Id$
// Copyright: (c) Jaakko Salli
// Licence: wxWindows license
/////////////////////////////////////////////////////////////////////////////
/** 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;
IsWxString = 0x01,
IsCharPtr = 0x02,
IsWCharPtr = 0x04,
- OwnsWxString = 0x10,
+ OwnsWxString = 0x10
};
union
*/
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.
*/
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 );
+ /**
+ Removes and returns a property.
+
+ @param id
+ Pointer or name of a property.
+
+ @remarks Removed property cannot have any children.
+ */
+ wxPGProperty* RemoveProperty( wxPGPropArg id );
+
/** Disables property. */
bool DisableProperty( wxPGPropArg id ) { return EnableProperty(id,false); }
*/
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!
}
/**
- 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
+ can not be accessed globally by their name. Instead, use
+ "<property>.<subproperty>" instead of "<subproperty>".
*/
wxPGProperty* GetProperty( const wxString& name ) const
{
*/
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();
}
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 )
{
}
/** 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. */
#endif
bool GetPropertyValueAsBool( wxPGPropArg id ) const;
double GetPropertyValueAsDouble( 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) \
return value.GetArrayString();
}
- wxPoint GetPropertyValueAsPoint( wxPGPropArg id ) const
- {
- wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL("wxPoint", wxPoint())
- wxPoint pt;
- pt << value;
- return pt;
- }
-
- wxSize GetPropertyValueAsSize( wxPGPropArg id ) const
- {
- wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL("wxSize", wxSize())
- wxSize sz;
- sz << value;
- return sz;
- }
-
+#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
wxArrayInt GetPropertyValueAsArrayInt( wxPGPropArg id ) const
{
}
#endif
- wxString GetPropertyValueType( wxPGPropArg id )
- {
- wxPG_PROP_ARG_CALL_PROLOG_RETVAL(m_emptyString)
- return p->GetValueType();
- }
-
/** Returns currently selected property. */
wxPGProperty* GetSelection() const
{
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.
ExpandedState |
ScrollPosState |
PageState |
- SplitterPosState
+ SplitterPosState |
+ DescBoxState
};
/**
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.
*/
void SetPropertyAttributeAll( const wxString& attrName, wxVariant value );
- /** Sets attributes from a wxPGAttributeStorage.
+ /**
+ 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 SetPropertyAttributes( wxPGPropArg id,
- const wxPGAttributeStorage& attributes )
+ 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.
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 );
#ifndef SWIG
/** Sets client data (void*) of a property.
*/
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 );
}
/**
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
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) );
}
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 )
wxVariant v = WXVARIANT(wxULongLong(value));
SetPropVal( id, v );
}
+#endif
+
/** Sets value (wxArrayInt&) of a property.
*/
void SetPropertyValue( wxPGPropArg id, const wxArrayInt& value )
*/
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;
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
{