// Author: Jaakko Salli
// Modified by:
// Created: 2008-08-24
-// RCS-ID: $Id:
+// RCS-ID: $Id$
// Copyright: (c) Jaakko Salli
// Licence: wxWindows license
/////////////////////////////////////////////////////////////////////////////
#ifndef __WX_PROPGRID_PROPGRIDIFACE_H__
#define __WX_PROPGRID_PROPGRIDIFACE_H__
+#if wxUSE_PROPGRID
+
#include "wx/propgrid/property.h"
#include "wx/propgrid/propgridpagestate.h"
wxPGPropArgCls( const wxPGProperty* property )
{
m_ptr.property = (wxPGProperty*) property;
- m_isName = false;
+ m_flags = IsProperty;
}
wxPGPropArgCls( const wxString& str )
{
- m_ptr.name = &str;
- m_isName = 1;
+ m_ptr.stringName = &str;
+ m_flags = IsWxString;
}
wxPGPropArgCls( const wxPGPropArgCls& id )
{
m_ptr = id.m_ptr;
- m_isName = id.m_isName;
+ m_flags = id.m_flags;
}
// This is only needed for wxPython bindings
wxPGPropArgCls( wxString* str, bool WXUNUSED(deallocPtr) )
{
- m_ptr.name = str;
- m_isName = 3; // Like 1, but causes ptr to be deallocated in dtor
+ m_ptr.stringName = str;
+ m_flags = IsWxString | OwnsWxString;
}
~wxPGPropArgCls()
{
- if ( m_isName == 3 )
- delete m_ptr.name;
+ if ( m_flags & OwnsWxString )
+ delete m_ptr.stringName;
}
wxPGProperty* GetPtr() const
{
- wxCHECK( !m_isName, NULL );
+ wxCHECK( m_flags == IsProperty, NULL );
return m_ptr.property;
}
- wxPGPropArgCls( const wxChar* str )
+ wxPGPropArgCls( const char* str )
+ {
+ m_ptr.charName = str;
+ m_flags = IsCharPtr;
+ }
+#if wxUSE_WCHAR_T
+ wxPGPropArgCls( const wchar_t* str )
{
- m_ptr.rawname = str;
- m_isName = 2;
+ m_ptr.wcharName = str;
+ m_flags = IsWCharPtr;
}
+#endif
/** This constructor is required for NULL. */
wxPGPropArgCls( int )
{
m_ptr.property = (wxPGProperty*) NULL;
- m_isName = false;
+ m_flags = IsProperty;
}
- wxPGProperty* GetPtr( wxPropertyGridInterface* methods ) const;
- wxPGProperty* GetPtr( const wxPropertyGridInterface* methods ) const
+ wxPGProperty* GetPtr( wxPropertyGridInterface* iface ) const;
+ wxPGProperty* GetPtr( const wxPropertyGridInterface* iface ) const
{
- return GetPtr((wxPropertyGridInterface*)methods);
+ return GetPtr((wxPropertyGridInterface*)iface);
}
wxPGProperty* GetPtr0() const { return m_ptr.property; }
- unsigned char HasName() const { return m_isName; }
- const wxString& GetName() const { return *m_ptr.name; }
+ bool HasName() const { return (m_flags != IsProperty); }
+ const wxString& GetName() const { return *m_ptr.stringName; }
private:
+
+ enum
+ {
+ IsProperty = 0x00,
+ IsWxString = 0x01,
+ IsCharPtr = 0x02,
+ IsWCharPtr = 0x04,
+ OwnsWxString = 0x10,
+ };
+
union
{
wxPGProperty* property;
- const wxChar* rawname;
- const wxString* name;
+ const char* charName;
+#if wxUSE_WCHAR_T
+ const wchar_t* wcharName;
+#endif
+ const wxString* stringName;
} m_ptr;
- unsigned char m_isName;
+ unsigned char m_flags;
};
#endif
WXDLLIMPEXP_PROPGRID
void wxPGTypeOperationFailed( const wxPGProperty* p,
- const wxChar* typestr,
- const wxChar* op );
+ const wxString& typestr,
+ const wxString& op );
WXDLLIMPEXP_PROPGRID
-void wxPGGetFailed( const wxPGProperty* p, const wxChar* typestr );
+void wxPGGetFailed( const wxPGProperty* p, const wxString& typestr );
// -----------------------------------------------------------------------
/** Destructor */
virtual ~wxPropertyGridInterface() { }
- /** Adds choice to a property that can accept one.
- @remarks
- - If you need to make sure that you modify only the set of choices of
- a single property (and not also choices of other properties with
- initially identical set), call
- wxPropertyGrid::SetPropertyChoicesPrivate.
- - This usually only works for wxEnumProperty and derivatives
- (wxFlagsProperty can get accept new items but its items may not get
- updated).
- */
- void AddPropertyChoice( wxPGPropArg id,
- const wxString& label,
- int value = wxPG_INVALID_VALUE );
-
/**
Appends property to the list.
*/
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 );
- /** Deletes choice from a property.
-
- If selected item is deleted, then the value is set to unspecified.
-
- See AddPropertyChoice for more details.
- */
- void DeletePropertyChoice( wxPGPropArg id, int index );
-
/** 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!
*/
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();
}
wxPGProperty* GetPropertyByName( const wxString& name,
const wxString& subname ) const;
- /** Returns writable reference to property's list of choices (and relevant
- values). If property does not have any choices, will return reference
- to an invalid set of choices that will return false on IsOk call.
- */
- wxPGChoices& GetPropertyChoices( wxPGPropArg id );
-
/** Returns property's editor. */
const wxPGEditor* GetPropertyEditor( wxPGPropArg id ) const
{
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;
- wxObject* GetPropertyValueAsWxObjectPtr( wxPGPropArg id ) const;
- void* GetPropertyValueAsVoidPtr( wxPGPropArg id ) const;
#define wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL(TYPENAME, DEFVAL) \
wxPG_PROP_ARG_CALL_PROLOG_RETVAL(DEFVAL) \
- if ( p->m_value.GetType() != TYPENAME ) \
+ wxString typeName(wxS(TYPENAME)); \
+ wxVariant value = p->GetValue(); \
+ if ( value.GetType() != typeName ) \
{ \
- wxPGGetFailed(p, TYPENAME); \
+ wxPGGetFailed(p, typeName); \
return DEFVAL; \
}
#define wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL_WFALLBACK(TYPENAME, DEFVAL) \
wxPG_PROP_ARG_CALL_PROLOG_RETVAL(DEFVAL) \
- if ( p->m_value.GetType() != TYPENAME ) \
+ wxVariant value = p->GetValue(); \
+ if ( value.GetType() != wxS(TYPENAME) ) \
return DEFVAL; \
wxArrayString GetPropertyValueAsArrayString( wxPGPropArg id ) const
{
- wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL(wxT("arrstring"),
+ wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL("arrstring",
wxArrayString())
- return p->m_value.GetArrayString();
- }
-
- wxPoint GetPropertyValueAsPoint( wxPGPropArg id ) const
- {
- wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL(wxT("wxPoint"), wxPoint())
- return WX_PG_VARIANT_GETVALUEREF(p->GetValue(), wxPoint);
- }
-
- wxSize GetPropertyValueAsSize( wxPGPropArg id ) const
- {
- wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL(wxT("wxSize"), wxSize())
- return WX_PG_VARIANT_GETVALUEREF(p->GetValue(), wxSize);
+ return value.GetArrayString();
}
+#if wxUSE_LONGLONG_NATIVE
wxLongLong_t GetPropertyValueAsLongLong( wxPGPropArg id ) const
{
- wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL_WFALLBACK(wxT("wxLongLong"),
+ wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL_WFALLBACK("wxLongLong",
(long) GetPropertyValueAsLong(id))
- return WX_PG_VARIANT_GETVALUEREF(p->GetValue(), wxLongLong).GetValue();
+ wxLongLong ll;
+ ll << value;
+ return ll.GetValue();
}
wxULongLong_t GetPropertyValueAsULongLong( wxPGPropArg id ) const
{
- wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL_WFALLBACK(wxT("wxULongLong"),
+ wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL_WFALLBACK("wxULongLong",
(unsigned long) GetPropertyValueAsULong(id))
- return WX_PG_VARIANT_GETVALUEREF(p->GetValue(), wxULongLong).GetValue();
+ wxULongLong ull;
+ ull << value;
+ return ull.GetValue();
}
+#endif
wxArrayInt GetPropertyValueAsArrayInt( wxPGPropArg id ) const
{
- wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL(wxT("wxArrayInt"),
+ wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL("wxArrayInt",
wxArrayInt())
- wxArrayInt arr = WX_PG_VARIANT_GETVALUEREF(p->GetValue(), wxArrayInt);
+ wxArrayInt arr;
+ arr << value;
return arr;
}
#if wxUSE_DATETIME
wxDateTime GetPropertyValueAsDateTime( wxPGPropArg id ) const
{
- wxPG_PROP_ARG_CALL_PROLOG_RETVAL(wxDateTime())
-
- if ( wxStrcmp(p->m_value.GetType(), wxT("datetime")) != 0 )
- {
- wxPGGetFailed(p, wxT("datetime"));
- return wxDateTime();
- }
- return p->m_value.GetDateTime();
+ wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL("datetime",
+ wxDateTime())
+ return value.GetDateTime();
}
#endif
}
#endif
- wxString GetPropertyValueType( wxPGPropArg id )
- {
- wxPG_PROP_ARG_CALL_PROLOG_RETVAL(m_emptyString)
- return p->GetValueType();
- }
-
/** Returns currently selected property. */
wxPGProperty* GetSelection() const
{
return p->IsCategory();
}
- /** Inserts choice to a property that can accept one.
-
- See AddPropertyChoice for more details.
- */
- void InsertPropertyChoice( wxPGPropArg id,
- const wxString& label,
- int index,
- int value = wxPG_INVALID_VALUE );
-
/** Returns true if property is enabled. */
bool IsPropertyEnabled( wxPGPropArg id ) const
{
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.
DoSetPropertyAttribute(id,attrName,value,argFlags);
}
- /** Sets attributes from a wxPGAttributeStorage.
+ /** Sets property attribute for all applicapple properties.
+ Be sure to use this method only after all properties have been
+ added to the grid.
+ */
+ void SetPropertyAttributeAll( const wxString& attrName, wxVariant value );
+
+ /**
+ Sets background colour of a property.
+
+ @param id
+ Property name or pointer.
+
+ @param colour
+ New background colour.
+
+ @param recursively
+ If True, child properties are affected recursively. Property
+ categories are skipped if this flag is used.
+ */
+ void SetPropertyBackgroundColour( wxPGPropArg id,
+ const wxColour& colour,
+ bool recursively = true );
+
+ /** Resets text and background colours of given property.
+ */
+ void SetPropertyColoursToDefault( wxPGPropArg id );
+
+ /**
+ Sets text colour of a property.
+
+ @param id
+ Property name or pointer.
+
+ @param colour
+ New background colour.
+
+ @param recursively
+ If True, child properties are affected recursively. Property
+ categories are skipped if this flag is used.
+ */
+ void SetPropertyTextColour( wxPGPropArg id,
+ const wxColour& col,
+ bool recursively = true );
+
+ /**
+ Returns background colour of first cell of a property.
+ */
+ wxColour GetPropertyBackgroundColour( wxPGPropArg id ) const
+ {
+ wxPG_PROP_ARG_CALL_PROLOG_RETVAL(wxColour())
+ return p->GetCell(0).GetBgCol();
+ }
+
+ /**
+ Returns text colour of first cell of a property.
*/
- void SetPropertyAttributes( wxPGPropArg id,
- const wxPGAttributeStorage& attributes )
+ wxColour GetPropertyTextColour( wxPGPropArg id ) const
{
- wxPG_PROP_ARG_CALL_PROLOG()
- p->SetAttributes(attributes);
+ 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) );
- }
-
- /** Set choices of a property to specified set of labels and values.
-
- @remarks
- This operation clears the property value.
- */
- void SetPropertyChoices( wxPGPropArg id, wxPGChoices& choices)
- {
- wxPG_PROP_ARG_CALL_PROLOG()
- p->SetChoices(choices);
- }
-
-
- /**
- If property's set of choices is shared, then calling this method
- converts it to private.
- */
- void SetPropertyChoicesExclusive( wxPGPropArg id )
- {
- wxPG_PROP_ARG_CALL_PROLOG()
- p->SetChoicesExclusive();
- }
+ const wxColour& bgCol = wxNullColour );
#ifndef SWIG
/** Sets client data (void*) of a property.
}
/** Sets label of a property.
- @remarks
- This is the only way to set property's name. There is not
- wxPGProperty::SetLabel() method.
*/
void SetPropertyLabel( wxPGPropArg id, const wxString& newproplabel );
- /** Set modified status of a property and all its children.
+ /**
+ Sets name of a property.
+
+ @param id
+ Name or pointer of property which name to change.
+
+ @param newName
+ New name for property.
*/
- void SetPropertyModifiedStatus( wxPGPropArg id, bool modified )
+ void SetPropertyName( wxPGPropArg id, const wxString& newName )
{
wxPG_PROP_ARG_CALL_PROLOG()
- p->SetModifiedStatus(modified);
+ m_pState->DoSetPropertyName( p, newName );
}
/**
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 );
- }
+#if wxUSE_LONGLONG_NATIVE
/** 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 )
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
{
friend class wxPropertyGridManager;
};
+#endif // wxUSE_PROPGRID
+
#endif // __WX_PROPGRID_PROPGRIDIFACE_H__