wxWidgets/include/wx/propgrid/propgridiface.h

1171 lines
43 KiB
C
Raw Normal View History

/////////////////////////////////////////////////////////////////////////////
// Name: wx/propgrid/propgridiface.h
// Purpose: wxPropertyGridInterface class
// Author: Jaakko Salli
// Modified by:
// Created: 2008-08-24
// Copyright: (c) Jaakko Salli
// 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"
// -----------------------------------------------------------------------
// Most property grid functions have this type as their argument, as it can
// convey a property by either a pointer or name.
class WXDLLIMPEXP_PROPGRID wxPGPropArgCls
{
public:
wxPGPropArgCls( const wxPGProperty* property )
{
m_ptr.property = const_cast<wxPGProperty*>(property);
m_flags = IsProperty;
}
wxPGPropArgCls( const wxString& str )
{
m_ptr.stringName = &str;
m_flags = IsWxString;
}
wxPGPropArgCls( const wxPGPropArgCls& id )
{
m_ptr = id.m_ptr;
m_flags = id.m_flags;
}
// This is only needed for wxPython bindings.
wxPGPropArgCls( wxString* str, bool WXUNUSED(deallocPtr) )
{
m_ptr.stringName = str;
m_flags = IsWxString | OwnsWxString;
}
~wxPGPropArgCls()
{
if ( m_flags & OwnsWxString )
delete m_ptr.stringName;
}
wxPGProperty* GetPtr() const
{
wxCHECK( m_flags == IsProperty, NULL );
return m_ptr.property;
}
wxPGPropArgCls( const char* str )
{
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 = NULL;
m_flags = IsProperty;
}
wxPGProperty* GetPtr( wxPropertyGridInterface* iface ) const;
wxPGProperty* GetPtr( const wxPropertyGridInterface* iface ) const
{
2019-06-16 11:09:23 -04:00
return GetPtr(const_cast<wxPropertyGridInterface*>(iface));
}
wxPGProperty* GetPtr0() const { return m_ptr.property; }
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 char* charName;
const wchar_t* wcharName;
const wxString* stringName;
} m_ptr;
unsigned char m_flags;
};
typedef const wxPGPropArgCls& wxPGPropArg;
// -----------------------------------------------------------------------
WXDLLIMPEXP_PROPGRID
void wxPGTypeOperationFailed( const wxPGProperty* p,
const wxString& typestr,
const wxString& op );
WXDLLIMPEXP_PROPGRID
void wxPGGetFailed( const wxPGProperty* p, const wxString& typestr );
// -----------------------------------------------------------------------
// Helper macro that does necessary preparations when calling
// some wxPGProperty's member function.
#define wxPG_PROP_ARG_CALL_PROLOG_0(PROPERTY) \
PROPERTY *p = (PROPERTY*)id.GetPtr(this); \
if ( !p ) return;
#define wxPG_PROP_ARG_CALL_PROLOG_RETVAL_0(PROPERTY, RETVAL) \
PROPERTY *p = (PROPERTY*)id.GetPtr(this); \
if ( !p ) return RETVAL;
#define wxPG_PROP_ARG_CALL_PROLOG() \
wxPG_PROP_ARG_CALL_PROLOG_0(wxPGProperty)
#define wxPG_PROP_ARG_CALL_PROLOG_RETVAL(RVAL) \
wxPG_PROP_ARG_CALL_PROLOG_RETVAL_0(wxPGProperty, RVAL)
#define wxPG_PROP_ID_CONST_CALL_PROLOG() \
wxPG_PROP_ARG_CALL_PROLOG_0(const wxPGProperty)
#define wxPG_PROP_ID_CONST_CALL_PROLOG_RETVAL(RVAL) \
wxPG_PROP_ARG_CALL_PROLOG_RETVAL_0(const wxPGProperty, RVAL)
// -----------------------------------------------------------------------
// Most of the shared property manipulation interface shared by wxPropertyGrid,
// wxPropertyGridPage, and wxPropertyGridManager is defined in this class.
// In separate wxPropertyGrid component this class was known as
// wxPropertyContainerMethods.
// wxPropertyGridInterface's property operation member functions all accept
// a special wxPGPropArg id argument, using which you can refer to properties
// either by their pointer (for performance) or by their name (for conveniency).
class WXDLLIMPEXP_PROPGRID wxPropertyGridInterface
{
public:
// Destructor.
virtual ~wxPropertyGridInterface() { }
// Appends property to the list.
// wxPropertyGrid assumes ownership of the object.
// Becomes child of most recently added category.
// wxPropertyGrid takes the ownership of the property pointer.
// If appending a category with name identical to a category already in
// the wxPropertyGrid, then newly created category is deleted, and most
// recently added category (under which properties are appended) is set
// to the one with same name. This allows easier adding of items to same
// categories in multiple passes.
// Does not automatically redraw the control, so you may need to call
// Refresh when calling this function after control has been shown for
// the first time.
// 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.
wxPGProperty* Append( wxPGProperty* property );
// Same as Append(), but appends under given parent property.
wxPGProperty* AppendIn( wxPGPropArg id, wxPGProperty* newproperty );
// In order to add new items into a property with fixed children (for
// instance, wxFlagsProperty), you need to call this method. After
// populating has been finished, you need to call EndAddChildren.
void BeginAddChildren( wxPGPropArg id );
// Deletes all properties.
virtual void Clear() = 0;
// Clears current selection, if any.
// validation - If set to false, deselecting the property will always work,
// even if its editor had invalid value in it.
// 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();
// Collapses given category or property with children.
// Returns true if actually collapses.
bool Collapse( wxPGPropArg id );
// Collapses all items that can be collapsed.
// Return false if failed (may fail if editor value cannot be validated).
bool CollapseAll() { return ExpandAll(false); }
// Changes value of a property, as if from an editor.
// Use this instead of SetPropertyValue() if you need the value to run
// through validation process, and also send the property change event.
// Returns true if value was successfully changed.
bool ChangePropertyValue( wxPGPropArg id, wxVariant newValue );
// Removes and deletes a property and any children.
// id - Pointer or name of a property.
// 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 );
// Removes a property. Does not delete the property object, but
// instead returns it.
// id - Pointer or name of a property.
// 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.
bool DisableProperty( wxPGPropArg id ) { return EnableProperty(id,false); }
// Returns true if all property grid data changes have been committed.
// Usually only returns false if value in active editor has been
// invalidated by a wxValidator.
bool EditorValidate();
// Enables or disables property, depending on whether enable is true or
// false. Disabled property usually appears as having grey text.
// id - Name or pointer to a property.
// enable - If false, property is disabled instead.
bool EnableProperty( wxPGPropArg id, bool enable = true );
// Called after population of property with fixed children has finished.
void EndAddChildren( wxPGPropArg id );
// Expands given category or property with children.
// Returns true if actually expands.
bool Expand( wxPGPropArg id );
// Expands all items that can be expanded.
bool ExpandAll( bool expand = true );
// Returns id of first child of given property.
// Does not return sub-properties!
wxPGProperty* GetFirstChild( wxPGPropArg id )
{
wxPG_PROP_ARG_CALL_PROLOG_RETVAL(wxNullProperty)
if ( !p->GetChildCount() || p->HasFlag(wxPG_PROP_AGGREGATE) )
return wxNullProperty;
return p->Item(0);
}
// Returns iterator class instance.
// flags - See wxPG_ITERATOR_FLAGS. Value wxPG_ITERATE_DEFAULT causes
// iteration over everything except private child properties.
// firstProp - Property to start iteration from. If NULL, then first
// child of root is used.
wxPropertyGridIterator GetIterator( int flags = wxPG_ITERATE_DEFAULT,
wxPGProperty* firstProp = NULL )
{
return wxPropertyGridIterator( m_pState, flags, firstProp );
}
wxPropertyGridConstIterator
GetIterator( int flags = wxPG_ITERATE_DEFAULT,
wxPGProperty* firstProp = NULL ) const
{
return wxPropertyGridConstIterator( m_pState, flags, firstProp );
}
// Returns iterator class instance.
// flags - See wxPG_ITERATOR_FLAGS. Value wxPG_ITERATE_DEFAULT causes
// iteration over everything except private child properties.
// startPos - Either wxTOP or wxBOTTOM. wxTOP will indicate that iterations start
// from the first property from the top, and wxBOTTOM means that the
// iteration will instead begin from bottommost valid item.
wxPropertyGridIterator GetIterator( int flags, int startPos )
{
return wxPropertyGridIterator( m_pState, flags, startPos );
}
wxPropertyGridConstIterator GetIterator( int flags, int startPos ) const
{
return wxPropertyGridConstIterator( m_pState, flags, startPos );
}
// Returns id of first item that matches given criteria.
wxPGProperty* GetFirst( int flags = wxPG_ITERATE_ALL )
{
wxPropertyGridIterator it( m_pState, flags, wxNullProperty, 1 );
return *it;
}
const wxPGProperty* GetFirst( int flags = wxPG_ITERATE_ALL ) const
{
return const_cast<wxPropertyGridInterface*>(this)->GetFirst(flags);
}
// Returns pointer to a property with given name (case-sensitive).
// If there is no property with such name, NULL pointer is returned.
// 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
{
return GetPropertyByName(name);
}
// Returns map-like storage of property's attributes.
// Note that if extra style wxPG_EX_WRITEONLY_BUILTIN_ATTRIBUTES is set,
// then builtin-attributes are not included in the storage.
const wxPGAttributeStorage& GetPropertyAttributes( wxPGPropArg id ) const
{
// If 'id' refers to invalid property, then we will return dummy
// attributes (i.e. root property's attributes, which contents
// should always be empty and of no consequence).
2019-07-21 09:15:36 -04:00
wxPG_PROP_ARG_CALL_PROLOG_RETVAL(m_pState->DoGetRoot()->GetAttributes())
return p->GetAttributes();
}
// Adds to 'targetArr' pointers to properties that have given
// flags 'flags' set. However, if 'inverse' is set to true, then
// only properties without given flags are stored.
// flags - Property flags to use.
// iterFlags - Iterator flags to use. Default is everything expect private children.
void GetPropertiesWithFlag( wxArrayPGProperty* targetArr,
wxPGProperty::FlagType flags,
bool inverse = false,
int iterFlags = wxPG_ITERATE_PROPERTIES |
wxPG_ITERATE_HIDDEN |
wxPG_ITERATE_CATEGORIES) const;
// Returns value of given attribute. If none found, returns wxNullVariant.
wxVariant GetPropertyAttribute( wxPGPropArg id,
const wxString& attrName ) const
{
wxPG_PROP_ARG_CALL_PROLOG_RETVAL(wxNullVariant)
return p->GetAttribute(attrName);
}
// Returns pointer of property's nearest parent category. If no category
// found, returns NULL.
wxPropertyCategory* GetPropertyCategory( wxPGPropArg id ) const
{
wxPG_PROP_ID_CONST_CALL_PROLOG_RETVAL(NULL)
return m_pState->GetPropertyCategory(p);
}
// Returns client data (void*) of a property.
void* GetPropertyClientData( wxPGPropArg id ) const
{
wxPG_PROP_ARG_CALL_PROLOG_RETVAL(NULL)
return p->GetClientData();
}
// Returns first property which label matches given string.
// NULL if none found. Note that this operation is extremely slow when
// compared to GetPropertyByName().
wxPGProperty* GetPropertyByLabel( const wxString& label ) const;
// Returns pointer to a property with given name (case-sensitive).
// If there is no property with such name, @NULL pointer is returned.
wxPGProperty* GetPropertyByName( const wxString& name ) const;
// Returns child property 'subname' of property 'name'. Same as
// calling GetPropertyByName("name.subname"), albeit slightly faster.
wxPGProperty* GetPropertyByName( const wxString& name,
const wxString& subname ) const;
// Returns property's editor.
const wxPGEditor* GetPropertyEditor( wxPGPropArg id ) const
{
wxPG_PROP_ARG_CALL_PROLOG_RETVAL(NULL)
return p->GetEditorClass();
}
// Returns help string associated with a property.
wxString GetPropertyHelpString( wxPGPropArg id ) const
{
wxPG_PROP_ARG_CALL_PROLOG_RETVAL(wxEmptyString)
return p->GetHelpString();
}
// Returns property's custom value image (NULL of none).
wxBitmap* GetPropertyImage( wxPGPropArg id ) const
{
wxPG_PROP_ARG_CALL_PROLOG_RETVAL(NULL)
return p->GetValueImage();
}
// Returns label of a property.
const wxString& GetPropertyLabel( wxPGPropArg id )
{
wxPG_PROP_ARG_CALL_PROLOG_RETVAL(m_emptyString)
return p->GetLabel();
}
// Returns name of a property, by which it is globally accessible.
wxString GetPropertyName( wxPGProperty* property )
{
return property->GetName();
}
// Returns parent item of a property.
wxPGProperty* GetPropertyParent( wxPGPropArg id )
{
wxPG_PROP_ARG_CALL_PROLOG_RETVAL(wxNullProperty)
return p->GetParent();
}
#if wxUSE_VALIDATORS
// Returns validator of a property as a reference, which you
// can pass to any number of SetPropertyValidator.
wxValidator* GetPropertyValidator( wxPGPropArg id )
{
wxPG_PROP_ARG_CALL_PROLOG_RETVAL(NULL)
return p->GetValidator();
}
#endif
// Returns value as wxVariant. To get wxObject pointer from it,
// you will have to use WX_PG_VARIANT_TO_WXOBJECT(VARIANT,CLASSNAME) macro.
// If property value is unspecified, wxNullVariant is returned.
wxVariant GetPropertyValue( wxPGPropArg id )
{
wxPG_PROP_ARG_CALL_PROLOG_RETVAL(wxVariant())
return p->GetValue();
}
wxString GetPropertyValueAsString( wxPGPropArg id ) const;
long GetPropertyValueAsLong( wxPGPropArg id ) const;
unsigned long GetPropertyValueAsULong( wxPGPropArg id ) const
{
return (unsigned long) GetPropertyValueAsLong(id);
}
int GetPropertyValueAsInt( wxPGPropArg id ) const
{ return (int)GetPropertyValueAsLong(id); }
bool GetPropertyValueAsBool( wxPGPropArg id ) const;
double GetPropertyValueAsDouble( wxPGPropArg id ) const;
#define wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL(PGTypeName, DEFVAL) \
wxPG_PROP_ARG_CALL_PROLOG_RETVAL(DEFVAL) \
wxVariant value = p->GetValue(); \
if ( !value.IsType(PGTypeName) ) \
{ \
wxPGGetFailed(p, PGTypeName); \
return DEFVAL; \
}
#define wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL_WFALLBACK(PGTypeName, DEFVAL) \
wxPG_PROP_ARG_CALL_PROLOG_RETVAL(DEFVAL) \
wxVariant value = p->GetValue(); \
if ( !value.IsType(PGTypeName) ) \
return DEFVAL; \
wxArrayString GetPropertyValueAsArrayString( wxPGPropArg id ) const
{
wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL(wxPG_VARIANT_TYPE_ARRSTRING,
wxArrayString())
return value.GetArrayString();
}
#if defined(wxLongLong_t) && wxUSE_LONGLONG
wxLongLong_t GetPropertyValueAsLongLong( wxPGPropArg id ) const
{
wxPG_PROP_ARG_CALL_PROLOG_RETVAL(0)
return p->GetValue().GetLongLong().GetValue();
}
wxULongLong_t GetPropertyValueAsULongLong( wxPGPropArg id ) const
{
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(wxArrayInt_VariantType,
wxArrayInt())
wxArrayInt arr;
arr << value;
return arr;
}
#if wxUSE_DATETIME
wxDateTime GetPropertyValueAsDateTime( wxPGPropArg id ) const
{
wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL(wxPG_VARIANT_TYPE_DATETIME,
wxDateTime())
return value.GetDateTime();
}
#endif
// Returns a wxVariant list containing wxVariant versions of all
// property values. Order is not guaranteed.
// flags - Use wxPG_KEEP_STRUCTURE to retain category structure; each sub
// category will be its own wxVariantList of wxVariant.
// Use wxPG_INC_ATTRIBUTES to include property attributes as well.
// Each attribute will be stored as list variant named
// "@<propname>@attr."
wxVariant GetPropertyValues( const wxString& listname = wxEmptyString,
wxPGProperty* baseparent = NULL, long flags = 0 ) const
{
return m_pState->DoGetPropertyValues(listname, baseparent, flags);
}
// Returns currently selected property. NULL if none.
// 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.
// wxArrayPGProperty should be compatible with std::vector API.
const wxArrayPGProperty& GetSelectedProperties() const
{
return m_pState->m_selection;
}
wxPropertyGridPageState* GetState() const { return m_pState; }
// Similar to GetIterator(), but instead returns wxPGVIterator instance,
// which can be useful for forward-iterating through arbitrary property
// containers.
// flags - See wxPG_ITERATOR_FLAGS.
virtual wxPGVIterator GetVIterator( int flags ) const;
// Hides or reveals a property.
// hide - If true, hides property, otherwise reveals it.
// flags - By default changes are applied recursively. Set this parameter
// wxPG_DONT_RECURSE to prevent this.
bool HideProperty( wxPGPropArg id,
bool hide = true,
int flags = wxPG_RECURSE );
#if wxPG_INCLUDE_ADVPROPS
// Initializes *all* property types. Causes references to most object
// files in the library, so calling this may cause significant increase
// in executable size when linking with static library.
static void InitAllTypeHandlers();
#else
static void InitAllTypeHandlers() { }
#endif
// Inserts property to the property container.
// priorThis - New property is inserted just prior to this. Available only
// in the first variant. There are two versions of this function
// to allow this parameter to be either an id or name to
// a property.
// newproperty - Pointer to the inserted property. wxPropertyGrid will take
// ownership of this object.
// Returns id for the property,
// wxPropertyGrid takes the ownership of the property pointer.
// While Append may be faster way to add items, make note that when
// both types of data storage (categoric and
// non-categoric) are active, Insert becomes even more slow. This is
// especially true if current mode is non-categoric.
// Example of use:
// // append category
// wxPGProperty* my_cat_id = propertygrid->Append(
// new wxPropertyCategory("My Category") );
// ...
// // insert into category - using second variant
// wxPGProperty* my_item_id_1 = propertygrid->Insert(
// my_cat_id, 0, new wxStringProperty("My String 1") );
// // insert before to first item - using first variant
// wxPGProperty* my_item_id_2 = propertygrid->Insert(
// my_item_id, new wxStringProperty("My String 2") );
wxPGProperty* Insert( wxPGPropArg priorThis, wxPGProperty* newproperty );
// Inserts property to the property container.
//See the other overload for more details.
// parent - New property is inserted under this category. Available only
// in the second variant. There are two versions of this function
// to allow this parameter to be either an id or name to
// a property.
// index - Index under category. Available only in the second variant.
// If index is < 0, property is appended in category.
// newproperty - Pointer to the inserted property. wxPropertyGrid will take
// ownership of this object.
// Returns id for the property.
wxPGProperty* Insert( wxPGPropArg parent,
int index,
wxPGProperty* newproperty );
// Returns true if property is a category.
bool IsPropertyCategory( wxPGPropArg id ) const
{
wxPG_PROP_ARG_CALL_PROLOG_RETVAL(false)
return p->IsCategory();
}
// Returns true if property is enabled.
bool IsPropertyEnabled( wxPGPropArg id ) const
{
wxPG_PROP_ARG_CALL_PROLOG_RETVAL(false)
return !p->HasFlag(wxPG_PROP_DISABLED);
}
// Returns true if given property is expanded.
// Naturally, always returns false for properties that cannot be expanded.
bool IsPropertyExpanded( wxPGPropArg id ) const;
// Returns true if property has been modified after value set or modify
// flag clear by software.
bool IsPropertyModified( wxPGPropArg id ) const
{
wxPG_PROP_ARG_CALL_PROLOG_RETVAL(false)
#if WXWIN_COMPATIBILITY_3_0
return p->HasFlag(wxPG_PROP_MODIFIED)?true:false;
#else
return p->HasFlag(wxPG_PROP_MODIFIED);
#endif
}
// 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 (i.e. HideProperty with true not
// called for it).
bool IsPropertyShown( wxPGPropArg id ) const
{
wxPG_PROP_ARG_CALL_PROLOG_RETVAL(false)
return !p->HasFlag(wxPG_PROP_HIDDEN);
}
// Returns true if property value is set to unspecified.
bool IsPropertyValueUnspecified( wxPGPropArg id ) const
{
wxPG_PROP_ARG_CALL_PROLOG_RETVAL(false)
return p->IsValueUnspecified();
}
// Disables (limit = true) or enables (limit = false) wxTextCtrl editor
// of a property, if it is not the sole mean to edit the value.
void LimitPropertyEditing( wxPGPropArg id, bool limit = true );
// If state is shown in it's grid, refresh it now.
virtual void RefreshGrid( wxPropertyGridPageState* state = NULL );
#if wxPG_INCLUDE_ADVPROPS
// Initializes additional property editors (SpinCtrl etc.). Causes
// references to most object files in the library, so calling this may
// cause significant increase in executable size when linking with static
// library.
static void RegisterAdditionalEditors();
#else
static void RegisterAdditionalEditors() { }
#endif
// Replaces property with id with newly created property. For example,
// this code replaces existing property named "Flags" with one that
// will have different set of items:
// pg->ReplaceProperty("Flags",
// wxFlagsProperty("Flags", wxPG_LABEL, newItems))
// For more info, see wxPropertyGrid::Insert.
wxPGProperty* ReplaceProperty( wxPGPropArg id, wxPGProperty* property );
// Flags for wxPropertyGridInterface::SaveEditableState()
// and wxPropertyGridInterface::RestoreEditableState().
enum EditableStateFlags
{
// Include selected property.
SelectionState = 0x01,
// Include expanded/collapsed property information.
ExpandedState = 0x02,
// Include scrolled position.
ScrollPosState = 0x04,
// Include selected page information.
// Only applies to wxPropertyGridManager.
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.
// This is usually the default value.
AllStates = SelectionState |
ExpandedState |
ScrollPosState |
PageState |
SplitterPosState |
DescBoxState
};
// Restores user-editable state.
// See also wxPropertyGridInterface::SaveEditableState().
// src - String generated by SaveEditableState.
// restoreStates - Which parts to restore from source string. See @ref
// propgridinterface_editablestate_flags "list of editable state
// flags".
// Returns false if there was problem reading the string.
// If some parts of state (such as scrolled or splitter position) fail to
// restore correctly, please make sure that you call this function after
// wxPropertyGrid size has been set (this may sometimes be tricky when
// sizers are used).
bool RestoreEditableState( const wxString& src,
int restoreStates = AllStates );
// Used to acquire user-editable state (selected property, expanded
// properties, scrolled position, splitter positions).
// includedStates - Which parts of state to include. See EditableStateFlags.
wxString SaveEditableState( int includedStates = AllStates ) const;
// 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 false on failure.
// You should call this for individual pages of wxPropertyGridManager
// (if used).
bool SetColumnProportion( unsigned int column, int proportion );
// Returns auto-resize proportion of the given column.
int GetColumnProportion( unsigned int column ) const
{
return m_pState->DoGetColumnProportion(column);
}
// Sets an attribute for this property.
// name - Text identifier of attribute. See @ref propgrid_property_attributes.
// value - Value of attribute.
// argFlags - Optional. Use wxPG_RECURSE to set the attribute to child
// properties recursively.
// Setting attribute's value to wxNullVariant will simply remove it
// from property's set of attributes.
void SetPropertyAttribute( wxPGPropArg id,
const wxString& attrName,
wxVariant value,
long argFlags = 0 )
{
DoSetPropertyAttribute(id,attrName,value,argFlags);
}
// Sets property attribute for all applicable properties.
// Be sure to use this method only after all properties have been
// added to the grid.
void SetPropertyAttributeAll( const wxString& attrName, wxVariant value );
// Sets background colour of a property.
// id - Property name or pointer.
// colour - New background colour.
// 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.
// id - Property name or pointer.
// flags - Default is wxPG_DONT_RECURSE which causes colour to be reset
// only for the property in question (for backward compatibility).
#if WXWIN_COMPATIBILITY_3_0
void SetPropertyColoursToDefault(wxPGPropArg id);
void SetPropertyColoursToDefault(wxPGPropArg id, int flags);
#else
void SetPropertyColoursToDefault(wxPGPropArg id, int flags = wxPG_DONT_RECURSE);
#endif // WXWIN_COMPATIBILITY_3_0
// Sets text colour of a property.
// id - Property name or pointer.
// colour - New background colour.
// 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.
// You can set label cell by setting column to 0.
// You can use wxPG_LABEL as text to use default text for column.
void SetPropertyCell( wxPGPropArg id,
int column,
const wxString& text = wxEmptyString,
const wxBitmap& bitmap = wxNullBitmap,
const wxColour& fgCol = wxNullColour,
const wxColour& bgCol = wxNullColour );
// Sets client data (void*) of a property.
// This untyped client data has to be deleted manually.
void SetPropertyClientData( wxPGPropArg id, void* clientData )
{
wxPG_PROP_ARG_CALL_PROLOG()
p->SetClientData(clientData);
}
// Sets editor for a property.
// editor - For builtin editors, use wxPGEditor_X, where X is builtin editor's
// name (TextCtrl, Choice, etc. see wxPGEditor documentation for full
// list).
// For custom editors, use pointer you received from
// wxPropertyGrid::RegisterEditorClass().
void SetPropertyEditor( wxPGPropArg id, const wxPGEditor* editor )
{
wxPG_PROP_ARG_CALL_PROLOG()
wxCHECK_RET( editor, wxS("unknown/NULL editor") );
p->SetEditor(editor);
RefreshProperty(p);
}
// Sets editor control of a property. As editor argument, use
// editor name string, such as "TextCtrl" or "Choice".
void SetPropertyEditor( wxPGPropArg id, const wxString& editorName )
{
SetPropertyEditor(id,GetEditorByName(editorName));
}
// Sets label of a property.
// Properties under same parent may have same labels. However,
// property names must still remain unique.
void SetPropertyLabel( wxPGPropArg id, const wxString& newproplabel );
// Sets name of a property.
// id - Name or pointer of property which name to change.
// newName - New name for property.
void SetPropertyName( wxPGPropArg id, const wxString& newName )
{
wxPG_PROP_ARG_CALL_PROLOG()
m_pState->DoSetPropertyName( p, newName );
}
// Sets property (and, recursively, its children) to have read-only value.
// In other words, user cannot change the value in the editor, but they
// can still copy it.
// This is mainly for use with textctrl editor. Not all other editors fully
// support it.
// By default changes are applied recursively. Set parameter "flags"
// to wxPG_DONT_RECURSE to prevent this.
void SetPropertyReadOnly( wxPGPropArg id,
bool set = true,
int flags = wxPG_RECURSE );
// 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 )
{
wxPG_PROP_ARG_CALL_PROLOG()
p->SetValueToUnspecified();
}
// Sets property values from a list of wxVariants.
void SetPropertyValues( const wxVariantList& list,
wxPGPropArg defaultCategory = wxNullProperty )
{
wxPGProperty *p;
if ( defaultCategory.HasName() ) p = defaultCategory.GetPtr(this);
else p = defaultCategory.GetPtr0();
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);
}
// Associates the help string with property.
// By default, text is shown either in the manager's "description"
// text box or in the status bar. If extra window style
// wxPG_EX_HELP_AS_TOOLTIPS is used, then the text will appear as a
// tooltip.
void SetPropertyHelpString( wxPGPropArg id, const wxString& helpString )
{
wxPG_PROP_ARG_CALL_PROLOG()
p->SetHelpString(helpString);
}
// Set wxBitmap in front of the value.
// Bitmap will be scaled to a size returned by
// wxPropertyGrid::GetImageSize();
void SetPropertyImage( wxPGPropArg id, wxBitmap& bmp )
{
wxPG_PROP_ARG_CALL_PROLOG()
p->SetValueImage(bmp);
RefreshProperty(p);
}
// Sets max length of property's text.
bool SetPropertyMaxLength( wxPGPropArg id, int maxLen );
#if wxUSE_VALIDATORS
// Sets validator of a property.
void SetPropertyValidator( wxPGPropArg id, const wxValidator& validator )
{
wxPG_PROP_ARG_CALL_PROLOG()
p->SetValidator(validator);
}
#endif
// Sets value (long integer) of a property.
void SetPropertyValue( wxPGPropArg id, long value )
{
wxVariant v(value);
SetPropVal( id, v );
}
// Sets value (integer) of a property.
void SetPropertyValue( wxPGPropArg id, int value )
{
wxVariant v((long)value);
SetPropVal( id, v );
}
// Sets value (floating point) of a property.
void SetPropertyValue( wxPGPropArg id, double value )
{
wxVariant v(value);
SetPropVal( id, v );
}
// Sets value (bool) of a property.
void SetPropertyValue( wxPGPropArg id, bool value )
{
wxVariant v(value);
SetPropVal( id, v );
}
// Sets value (wchar_t*) of a property.
void SetPropertyValue( wxPGPropArg id, const wchar_t* value )
{
SetPropertyValueString( id, wxString(value) );
}
// Sets value (char*) of a property.
void SetPropertyValue( wxPGPropArg id, const char* value )
{
SetPropertyValueString( id, wxString(value) );
}
// Sets value (string) of a property.
void SetPropertyValue( wxPGPropArg id, const wxString& value )
{
SetPropertyValueString( id, value );
}
// Sets value (wxArrayString) of a property.
void SetPropertyValue( wxPGPropArg id, const wxArrayString& value )
{
wxVariant v(value);
SetPropVal( id, v );
}
#if wxUSE_DATETIME
// Sets value (wxDateTime) of a property.
void SetPropertyValue( wxPGPropArg id, const wxDateTime& value )
{
wxVariant v(value);
SetPropVal( id, v );
}
#endif
// Sets value (wxObject*) of a property.
void SetPropertyValue( wxPGPropArg id, wxObject* value )
{
wxVariant v(value);
SetPropVal( id, v );
}
// Sets value (wxObject&) of a property.
void SetPropertyValue( wxPGPropArg id, wxObject& value )
{
wxVariant v(&value);
SetPropVal( id, v );
}
#if wxUSE_LONGLONG
#ifdef wxLongLong_t
// Sets value (native 64-bit int) of a property.
void SetPropertyValue(wxPGPropArg id, wxLongLong_t value)
{
wxVariant v = wxLongLong(value);
SetPropVal(id, v);
}
#endif
// Sets value (wxLongLong) of a property.
void SetPropertyValue( wxPGPropArg id, wxLongLong value )
{
wxVariant v(value);
SetPropVal( id, v );
}
#ifdef wxULongLong_t
// Sets value (native 64-bit unsigned int) of a property.
void SetPropertyValue(wxPGPropArg id, wxULongLong_t value)
{
wxVariant v = wxULongLong(value);
SetPropVal(id, v);
}
#endif
// Sets value (wxULongLong) of a property.
void SetPropertyValue( wxPGPropArg id, wxULongLong value )
{
wxVariant v(value);
SetPropVal( id, v );
}
#endif
// Sets value (wxArrayInt&) of a property.
void SetPropertyValue( wxPGPropArg id, const wxArrayInt& value )
{
wxVariant v = WXVARIANT(value);
SetPropVal( id, v );
}
// Sets value (wxString) of a property.
// This method uses wxPGProperty::SetValueFromString, which all properties
// should implement. This means that there should not be a type error,
// and instead the string is converted to property's actual value type.
void SetPropertyValueString( wxPGPropArg id, const wxString& value );
// Sets value (wxVariant) of a property.
// Use wxPropertyGrid::ChangePropertyValue() instead if you need to run
// through validation process and send property change event.
void SetPropertyValue( wxPGPropArg id, wxVariant value )
{
SetPropVal( id, value );
}
// Sets value (wxVariant&) of a property. Same as SetPropertyValue,
// but accepts reference.
void SetPropVal( wxPGPropArg id, wxVariant& value );
// Adjusts how wxPropertyGrid behaves when invalid value is entered
// in a property.
// vfbFlags - See wxPG_VALIDATION_FAILURE_BEHAVIOR_FLAGS for possible values.
void SetValidationFailureBehavior( int vfbFlags );
// Sorts all properties recursively.
// 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.
// id - Name or pointer to a property.
// 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);
}
// GetPropertyByName() with nice assertion error message.
wxPGProperty* GetPropertyByNameA( const wxString& name ) const;
// Returns editor pointer of editor with given name.
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
{
if ( pageIndex <= 0 )
return m_pState;
return NULL;
}
virtual bool DoSelectPage( int WXUNUSED(index) ) { return true; }
// Default call's m_pState's BaseGetPropertyByName
virtual wxPGProperty* DoGetPropertyByName( const wxString& name ) const;
// Deriving classes must set this (it must be only or current page).
wxPropertyGridPageState* m_pState;
// Intermediate version needed due to wxVariant copying inefficiency
void DoSetPropertyAttribute( wxPGPropArg id,
const wxString& name,
wxVariant& value, long argFlags );
// Empty string object to return from member functions returning const
// wxString&.
wxString m_emptyString;
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
{
if ( !m_pState )
return NULL;
return m_pState->GetGrid();
}
friend class wxPropertyGrid;
friend class wxPropertyGridManager;
};
#endif // wxUSE_PROPGRID
#endif // __WX_PROPGRID_PROPGRIDIFACE_H__