/////////////////////////////////////////////////////////////////////////////
-// 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"
// -----------------------------------------------------------------------
-#ifndef SWIG
-
/** @section wxPGPropArgCls
Most property grid functions have this type as their argument, as it can
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;
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;
// -----------------------------------------------------------------------
@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);
+ bool ClearSelection( bool validation = false );
/** Resets modified status of all properties.
*/
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); }
/**
/**
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 );
}
/**
- 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
{
*/
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 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.
{
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;
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
}
#endif
-#ifndef SWIG
/** Returns a wxVariant list containing wxVariant versions of all
property values. Order is not guaranteed.
@param flags
{
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
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)
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.
@param colour
New background colour.
- @param recursively
- If True, child properties are affected recursively. Property
- categories are skipped if this flag is used.
+ @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,
- bool recursively = true );
+ int flags = wxPG_RECURSE );
/** Resets text and background colours of given property.
*/
@param colour
New background colour.
- @param recursively
- If True, child properties are affected recursively. Property
- categories are skipped if this flag is used.
+ @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,
- bool recursively = true );
+ int flags = wxPG_RECURSE );
/**
Returns background colour of first cell of a property.
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.
p->SetEditor(editor);
RefreshProperty(p);
}
-#endif
/** Sets editor control of a property. As editor argument, use
editor name string, such as "TextCtrl" or "Choice".
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 )
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
}
#endif
-#ifndef SWIG
/** Sets value (long integer) of a property.
*/
void SetPropertyValue( wxPGPropArg id, long value )
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) );
SetPropVal( id, v );
}
-#if wxUSE_LONGLONG_NATIVE
+#ifdef wxLongLong_t
/** Sets value (wxLongLong&) of a property.
*/
void SetPropertyValue( wxPGPropArg id, wxLongLong_t value )
wxVariant v = WXVARIANT(value);
SetPropVal( id, v );
}
-#endif // !SWIG
/** Sets value (wxString) of a property.
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.
*/
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.
// 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;
// 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;