// Author: Jaakko Salli
// Modified by:
// Created: 2008-08-23
-// RCS-ID: $Id:
+// RCS-ID: $Id$
// Copyright: (c) Jaakko Salli
// Licence: wxWindows license
/////////////////////////////////////////////////////////////////////////////
};
-// Structure for relaying choice/list info.
-struct wxPGChoiceInfo
-{
- wxPGChoices* m_choices;
-};
-
-
#ifndef SWIG
~wxPGAttributeStorage();
void Set( const wxString& name, const wxVariant& value );
- size_t GetCount() const { return m_map.size(); }
+ unsigned int GetCount() const { return (unsigned int) m_map.size(); }
wxVariant FindValue( const wxString& name ) const
{
wxPGHashMapS2P::const_iterator it = m_map.find(name);
Identifiers.
wxPGProperty::SetAttribute() and
- wxPropertyGridInterfaces::SetPropertyAttribute() accept one of these as
+ wxPropertyGridInterface::SetPropertyAttribute() accept one of these as
attribute name argument.
You can use strings instead of constants. However, some of these
// -----------------------------------------------------------------------
-/** @class wxPGProperty
+#ifndef SWIG
- wxPGProperty is base class for all wxPropertyGrid properties. In
- sections below we cover few related topics.
+/** @class wxPGChoiceEntry
+ Data of a single wxPGChoices choice.
+*/
+class WXDLLIMPEXP_PROPGRID wxPGChoiceEntry : public wxPGCell
+{
+public:
+ wxPGChoiceEntry();
+ wxPGChoiceEntry( const wxPGChoiceEntry& entry );
+ wxPGChoiceEntry( const wxString& label,
+ int value = wxPG_INVALID_VALUE )
+ : wxPGCell(), m_value(value)
+ {
+ m_text = label;
+ }
- @li @ref pgproperty_properties
- @li @ref pgproperty_creating
+ wxPGChoiceEntry( const wxString& label,
+ int value,
+ const wxBitmap& bitmap,
+ const wxColour& fgCol = wxNullColour,
+ const wxColour& bgCol = wxNullColour )
+ : wxPGCell(label, bitmap, fgCol, bgCol), m_value(value)
+ {
+ }
- @section pgproperty_properties Supplied Ready-to-use Property Classes
+ virtual ~wxPGChoiceEntry()
+ {
+ }
- Here is a list and short description of supplied fully-functional
- property classes. They are located in either props.h or advprops.h.
+ void SetValue( int value ) { m_value = value; }
- @li @ref wxArrayStringProperty
- @li @ref wxBoolProperty
- @li @ref wxColourProperty
- @li @ref wxCursorProperty
- @li @ref wxDateProperty
- @li @ref wxDirProperty
- @li @ref wxEditEnumProperty
- @li @ref wxEnumProperty
- @li @ref wxFileProperty
- @li @ref wxFlagsProperty
- @li @ref wxFloatProperty
- @li @ref wxFontProperty
- @li @ref wxImageFileProperty
- @li @ref wxIntProperty
- @li @ref wxLongStringProperty
- @li @ref wxMultiChoiceProperty
- @li @ref wxPropertyCategory
- @li @ref wxStringProperty
- @li @ref wxSystemColourProperty
- @li @ref wxUIntProperty
+ int GetValue() const { return m_value; }
- @subsection wxPropertyCategory
+ bool HasValue() const { return (m_value != wxPG_INVALID_VALUE); }
- Not an actual property per se, but a header for a group of properties.
- Regardless inherits from wxPGProperty.
+protected:
+ int m_value;
+};
- @subsection wxStringProperty
- Simple string property. wxPG_STRING_PASSWORD attribute may be used
- to echo value as asterisks and use wxTE_PASSWORD for wxTextCtrl.
+typedef void* wxPGChoicesId;
- @remarks
- * wxStringProperty has a special trait: if it has value of "<composed>",
- and also has child properties, then its displayed value becomes
- composition of child property values, similar as with wxFontProperty,
- for instance.
+class WXDLLIMPEXP_PROPGRID wxPGChoicesData
+{
+ friend class wxPGChoices;
+public:
+ // Constructor sets m_refCount to 1.
+ wxPGChoicesData();
- @subsection wxIntProperty
+ void CopyDataFrom( wxPGChoicesData* data );
- Like wxStringProperty, but converts text to a signed long integer.
- wxIntProperty seamlessly supports 64-bit integers (ie. wxLongLong).
+ // Takes ownership of 'item'
+ void Insert( int index, wxPGChoiceEntry* item )
+ {
+ wxVector<wxPGChoiceEntry*>::iterator it;
+ if ( index == -1 )
+ {
+ it = m_items.end();
+ index = (int) m_items.size();
+ }
+ else
+ {
+ it = m_items.begin() + index;
+ }
- @subsection wxUIntProperty
+ // Need to fix value?
+ if ( item->GetValue() == wxPG_INVALID_VALUE )
+ item->SetValue(index);
- Like wxIntProperty, but displays value as unsigned int. To set
- the prefix used globally, manipulate wxPG_UINT_PREFIX string attribute.
- To set the globally used base, manipulate wxPG_UINT_BASE int
- attribute. Regardless of current prefix, understands (hex) values starting
- with both "0x" and "$".
- wxUIntProperty seamlessly supports 64-bit unsigned integers (ie.
- wxULongLong).
+ m_items.insert(it, item);
+ }
- @subsection wxFloatProperty
+ // Delete all entries
+ void Clear();
- Like wxStringProperty, but converts text to a double-precision floating
- point. Default float-to-text precision is 6 decimals, but this can be
- changed by modifying wxPG_FLOAT_PRECISION attribute.
+ unsigned int GetCount() const
+ {
+ return (unsigned int) m_items.size();
+ }
- @subsection wxBoolProperty
+ wxPGChoiceEntry* Item( unsigned int i ) const
+ {
+ wxCHECK_MSG( i < GetCount(), NULL, "invalid index" );
- Represents a boolean value. wxChoice is used as editor control, by the
- default. wxPG_BOOL_USE_CHECKBOX attribute can be set to true inorder to use
- check box instead.
+ return m_items[i];
+ }
- @subsection wxLongStringProperty
+ void DecRef()
+ {
+ m_refCount--;
+ wxASSERT( m_refCount >= 0 );
+ if ( m_refCount == 0 )
+ delete this;
+ }
- Like wxStringProperty, but has a button that triggers a small text editor
- dialog. Note that in long string values, tabs are represented by "\t" and
- line break by "\n".
+private:
+ wxVector<wxPGChoiceEntry*> m_items;
- @subsection wxDirProperty
+ // So that multiple properties can use the same set
+ int m_refCount;
- Like wxLongStringProperty, but the button triggers dir selector instead.
- Supported properties (all with string value): wxPG_DIR_DIALOG_MESSAGE.
+ virtual ~wxPGChoicesData();
+};
- @subsection wxFileProperty
+#define wxPGChoicesEmptyData ((wxPGChoicesData*)NULL)
- Like wxLongStringProperty, but the button triggers file selector instead.
- Default wildcard is "All files..." but this can be changed by setting
- wxPG_FILE_WILDCARD attribute (see wxFileDialog for format details).
- Attribute wxPG_FILE_SHOW_FULL_PATH can be set to false inorder to show
- only the filename, not the entire path.
+#endif // SWIG
- @subsection wxEnumProperty
+/** @class wxPGChoices
- Represents a single selection from a list of choices -
- wxOwnerDrawnComboBox is used to edit the value.
+ Helper class for managing choices of wxPropertyGrid properties.
+ Each entry can have label, value, bitmap, text colour, and background
+ colour.
- @subsection wxFlagsProperty
+ @library{wxpropgrid}
+ @category{propgrid}
+*/
+class WXDLLIMPEXP_PROPGRID wxPGChoices
+{
+public:
+ typedef long ValArrItem;
- Represents a bit set that fits in a long integer. wxBoolProperty
- sub-properties are created for editing individual bits. Textctrl is created
- to manually edit the flags as a text; a continous sequence of spaces,
- commas and semicolons is considered as a flag id separator.
- <b>Note: </b> When changing "choices" (ie. flag labels) of wxFlagsProperty,
- you will need to use SetPropertyChoices - otherwise they will not get
- updated properly.
+ /** Default constructor. */
+ wxPGChoices()
+ {
+ Init();
+ }
- @subsection wxArrayStringProperty
+ /** Copy constructor. */
+ wxPGChoices( const wxPGChoices& a )
+ {
+ if ( a.m_data != wxPGChoicesEmptyData )
+ {
+ m_data = a.m_data;
+ m_data->m_refCount++;
+ }
+ }
- Allows editing of a list of strings in wxTextCtrl and in a separate dialog.
+ /** Constructor. */
+ wxPGChoices( const wxChar** labels, const long* values = NULL )
+ {
+ Init();
+ Set(labels,values);
+ }
- @subsection wxDateProperty
+ /** Constructor. */
+ wxPGChoices( const wxArrayString& labels,
+ const wxArrayInt& values = wxArrayInt() )
+ {
+ Init();
+ Set(labels,values);
+ }
- wxDateTime property. Default editor is DatePickerCtrl, altough TextCtrl
- should work as well. wxPG_DATE_FORMAT attribute can be used to change
- string wxDateTime::Format uses (altough default is recommended as it is
- locale-dependant), and wxPG_DATE_PICKER_STYLE allows changing window
- style given to DatePickerCtrl (default is wxDP_DEFAULT|wxDP_SHOWCENTURY).
+ /** Simple interface constructor. */
+ wxPGChoices( wxPGChoicesData* data )
+ {
+ wxASSERT(data);
+ m_data = data;
+ data->m_refCount++;
+ }
- @subsection wxEditEnumProperty
+ /** Destructor. */
+ ~wxPGChoices()
+ {
+ Free();
+ }
- Represents a string that can be freely edited or selected from list of
- choices - custom combobox control is used to edit the value.
+ /**
+ Adds to current.
- @subsection wxMultiChoiceProperty
+ If did not have own copies, creates them now. If was empty, identical
+ to set except that creates copies.
+ */
+ void Add( const wxChar** labels, const ValArrItem* values = NULL );
- Allows editing a multiple selection from a list of strings. This is
- property is pretty much built around concept of wxMultiChoiceDialog.
- It uses wxArrayString value.
+ /** Version that works with wxArrayString. */
+ void Add( const wxArrayString& arr, const ValArrItem* values = NULL );
- @subsection wxImageFileProperty
+ /** Version that works with wxArrayString and wxArrayInt. */
+ void Add( const wxArrayString& arr, const wxArrayInt& arrint );
- Like wxFileProperty, but has thumbnail of the image in front of
- the filename and autogenerates wildcard from available image handlers.
+ /** Adds single item. */
+ wxPGChoiceEntry& Add( const wxString& label,
+ int value = wxPG_INVALID_VALUE );
- @subsection wxColourProperty
+ /** Adds a single item, with bitmap. */
+ wxPGChoiceEntry& Add( const wxString& label,
+ const wxBitmap& bitmap,
+ int value = wxPG_INVALID_VALUE );
- <b>Useful alternate editor:</b> Choice.
+ /** Adds a single item with full entry information. */
+ wxPGChoiceEntry& Add( const wxPGChoiceEntry& entry )
+ {
+ return Insert(entry, -1);
+ }
- Represents wxColour. wxButton is used to trigger a colour picker dialog.
+ /** Adds single item. */
+ wxPGChoiceEntry& AddAsSorted( const wxString& label,
+ int value = wxPG_INVALID_VALUE );
- @subsection wxFontProperty
+ void Assign( const wxPGChoices& a )
+ {
+ AssignData(a.m_data);
+ }
- Represents wxFont. Various sub-properties are used to edit individual
- subvalues.
+ void AssignData( wxPGChoicesData* data );
- @subsection wxSystemColourProperty
+ /** Delete all choices. */
+ void Clear()
+ {
+ if ( m_data != wxPGChoicesEmptyData )
+ m_data->Clear();
+ }
- Represents wxColour and a system colour index. wxChoice is used to edit
- the value. Drop-down list has color images. Note that value type
- is wxColourPropertyValue instead of wxColour.
- @code
- class wxColourPropertyValue : public wxObject
- {
- public:
- // An integer value relating to the colour, and which exact
- // meaning depends on the property with which it is used.
- //
- // For wxSystemColourProperty:
- // Any of wxSYS_COLOUR_XXX, or any web-colour (use
- // wxPG_TO_WEB_COLOUR macro - (currently unsupported) ),
- // or wxPG_COLOUR_CUSTOM.
- wxUint32 m_type;
+ void EnsureData()
+ {
+ if ( m_data == wxPGChoicesEmptyData )
+ m_data = new wxPGChoicesData();
+ }
- // Resulting colour. Should be correct regardless of type.
- wxColour m_colour;
- };
- @endcode
+ /** Gets a unsigned number identifying this list. */
+ wxPGChoicesId GetId() const { return (wxPGChoicesId) m_data; };
- @subsection wxCursorProperty
+ const wxString& GetLabel( unsigned int ind ) const
+ {
+ return Item(ind).GetText();
+ }
- Represents a wxCursor. wxChoice is used to edit the value.
- Drop-down list has cursor images under some (wxMSW) platforms.
+ unsigned int GetCount () const
+ {
+ if ( !m_data )
+ return 0;
+ return m_data->GetCount();
+ }
- @section pgproperty_creating Creating Custom Properties
+ int GetValue( unsigned int ind ) const { return Item(ind).GetValue(); }
- New properties can be created by subclassing wxPGProperty or one
- of the provided property classes, and (re)implementing necessary
- member functions. Below, each virtual member function has ample
- documentation about its purpose and any odd details which to keep
- in mind.
+ /** Returns array of values matching the given strings. Unmatching strings
+ result in wxPG_INVALID_VALUE entry in array.
+ */
+ wxArrayInt GetValuesForStrings( const wxArrayString& strings ) const;
- Here is a very simple 'template' code:
+ /** Returns array of indices matching given strings. Unmatching strings
+ are added to 'unmatched', if not NULL.
+ */
+ wxArrayInt GetIndicesForStrings( const wxArrayString& strings,
+ wxArrayString* unmatched = NULL ) const;
- @code
- class MyProperty : public wxPGProperty
- {
- public:
- // All arguments of ctor must have a default value -
- // use wxPG_LABEL for label and name
- MyProperty( const wxString& label = wxPG_LABEL,
- const wxString& name = wxPG_LABEL,
- const wxString& value = wxEmptyString )
- {
- // m_value is wxVariant
- m_value = value;
- }
+ /** Returns true if choices in general are likely to have values
+ (depens on that all entries have values or none has)
+ */
+ bool HasValues() const;
- virtual ~MyProperty() { }
+ bool HasValue( unsigned int i ) const
+ { return (i < m_data->GetCount()) && m_data->Item(i)->HasValue(); }
- const wxPGEditor* DoGetEditorClass() const
- {
- // Determines editor used by property.
- // You can replace 'TextCtrl' below with any of these
- // builtin-in property editor identifiers: Choice, ComboBox,
- // TextCtrlAndButton, ChoiceAndButton, CheckBox, SpinCtrl,
- // DatePickerCtrl.
- return wxPGEditor_TextCtrl;
- }
+ int Index( const wxString& str ) const;
+ int Index( int val ) const;
- virtual wxString GetValueAsString( int argFlags ) const
- {
- // TODO: Return property value in string format
- }
+ /** Inserts single item. */
+ wxPGChoiceEntry& Insert( const wxString& label,
+ int index,
+ int value = wxPG_INVALID_VALUE );
- virtual bool StringToValue( wxVariant& variant,
- const wxString& text,
- int argFlags )
- {
- // TODO: Adapt string to property value.
- }
+ /** Inserts a single item with full entry information. */
+ wxPGChoiceEntry& Insert( const wxPGChoiceEntry& entry, int index );
- protected:
- };
- @endcode
+ /** Returns false if this is a constant empty set of choices,
+ which should not be modified.
+ */
+ bool IsOk() const
+ {
+ return ( m_data != wxPGChoicesEmptyData );
+ }
- Since wxPGProperty derives from wxObject, you can use standard
- DECLARE_DYNAMIC_CLASS and IMPLEMENT_DYNAMIC_CLASS macros. From the
- above example they were omitted for sake of simplicity, and besides,
- they are only really needed if you need to use wxRTTI with your
- property class.
+ const wxPGChoiceEntry& Item( unsigned int i ) const
+ {
+ wxASSERT( IsOk() );
+ return *m_data->Item(i);
+ }
- You can change the 'value type' of a property by simply assigning different
- type of variant with SetValue. <b>It is mandatory to implement
- wxVariantData class for all data types used as property values.</b>
- You can use macros declared in wxPropertyGrid headers. For instance:
+ wxPGChoiceEntry& Item( unsigned int i )
+ {
+ wxASSERT( IsOk() );
+ return *m_data->Item(i);
+ }
- @code
- // In header file:
- // (If you need to have export declaration, use version of macros
- // with _EXPORTED postfix)
- WX_PG_DECLARE_VARIANT_DATA(MyDataClass)
+ /** Removes count items starting at position nIndex. */
+ void RemoveAt(size_t nIndex, size_t count = 1);
- // In sources file:
- WX_PG_IMPLEMENT_VARIANT_DATA(MyDataClass)
+#ifndef SWIG
+ /** Does not create copies for itself. */
+ void Set( const wxChar** labels, const long* values = NULL )
+ {
+ Free();
+ Add(labels,values);
+ }
+#endif // SWIG
- // Or, if you don't have valid == operator:
- WX_PG_IMPLEMENT_VARIANT_DATA_DUMMY_EQ(MyDataClass)
- @endcode
+ /** Version that works with wxArrayString and wxArrayInt. */
+ void Set( const wxArrayString& labels,
+ const wxArrayInt& values = wxArrayInt() )
+ {
+ Free();
+ if ( &values )
+ Add(labels,values);
+ else
+ Add(labels);
+ }
- @library{wxpropgrid}
- @category{propgrid}
+ // Creates exclusive copy of current choices
+ void SetExclusive()
+ {
+ if ( m_data->m_refCount != 1 )
+ {
+ wxPGChoicesData* data = new wxPGChoicesData();
+ data->CopyDataFrom(m_data);
+ Free();
+ m_data = data;
+ }
+ }
+
+ // Returns data, increases refcount.
+ wxPGChoicesData* GetData()
+ {
+ wxASSERT( m_data->m_refCount != 0xFFFFFFF );
+ m_data->m_refCount++;
+ return m_data;
+ }
+
+ // Returns plain data ptr - no refcounting stuff is done.
+ wxPGChoicesData* GetDataPtr() const { return m_data; }
+
+ // Changes ownership of data to you.
+ wxPGChoicesData* ExtractData()
+ {
+ wxPGChoicesData* data = m_data;
+ m_data = wxPGChoicesEmptyData;
+ return data;
+ }
+
+ wxArrayString GetLabels() const;
+
+#ifndef SWIG
+ void operator= (const wxPGChoices& a)
+ {
+ AssignData(a.m_data);
+ }
+
+ wxPGChoiceEntry& operator[](unsigned int i)
+ {
+ return Item(i);
+ }
+
+ const wxPGChoiceEntry& operator[](unsigned int i) const
+ {
+ return Item(i);
+ }
+
+protected:
+ wxPGChoicesData* m_data;
+
+ void Init();
+ void Free();
+#endif // !SWIG
+};
+
+// -----------------------------------------------------------------------
+
+/** @class wxPGProperty
+
+ wxPGProperty is base class for all wxPropertyGrid properties.
+
+ NB: Full class overview is now only present in
+ interface/wx/propgrid/property.h.
+
+ @library{wxpropgrid}
+ @category{propgrid}
*/
class WXDLLIMPEXP_PROPGRID wxPGProperty : public wxObject
{
variant << value;
SetValue(variant);
- // If has private child properties then create them here, e.g.:
+ // If has private child properties then create them here. Also
+ // set flag that indicates presence of private children. E.g.:
+ //
+ // SetParentalType(wxPG_PROP_AGGREGATE);
+ //
// AddChild( new wxStringProperty( "Subprop 1",
// wxPG_LABEL,
// value.GetSubProp1() ) );
wxPGValidationInfo& validationInfo ) const;
/**
- Converts 'text' into proper value 'variant'.
- Returns true if new (different than m_value) value could be interpreted
- from the text.
+ Converts text into wxVariant value appropriate for this property.
+
+ @param variant
+ On function entry this is the old value (should not be wxNullVariant
+ in normal cases). Translated value must be assigned back to it.
+
+ @param text
+ Text to be translated into variant.
+
@param argFlags
If wxPG_FULL_VALUE is set, returns complete, storable value instead
of displayable one (they may be different).
composite property string value (as generated by GetValueAsString()
called with this same flag).
- @remarks
- Default implementation converts semicolon delimited tokens into child
- values. Only works for properties with children.
+ @return Returns @true if resulting wxVariant value was different.
+
+ @remarks Default implementation converts semicolon delimited tokens into
+ child values. Only works for properties with children.
+
+ You might want to take into account that m_value is Null variant
+ if property value is unspecified (which is usually only case if
+ you explicitly enabled that sort behavior).
*/
virtual bool StringToValue( wxVariant& variant,
const wxString& text,
int argFlags = 0 ) const;
/**
- Converts 'number' (including choice selection) into proper value
- 'variant'.
+ Converts integer (possibly a choice selection) into wxVariant value
+ appropriate for this property.
- Returns true if new (different than m_value) value could be interpreted
- from the integer.
+ @param variant
+ On function entry this is the old value (should not be wxNullVariant
+ in normal cases). Translated value must be assigned back to it.
+
+ @param number
+ Integer to be translated into variant.
@param argFlags
If wxPG_FULL_VALUE is set, returns complete, storable value instead
of displayable one.
+ @return Returns @true if resulting wxVariant value was different.
+
@remarks
- If property is not supposed to use choice or spinctrl or other editor
with int-based value, it is not necessary to implement this method.
- If property uses choice control, and displays a dialog on some choice
items, then it is preferred to display that dialog in IntToValue
instead of OnEvent.
+ - You might want to take into account that m_value is Null variant if
+ property value is unspecified (which is usually only case if you
+ explicitly enabled that sort behavior).
*/
virtual bool IntToValue( wxVariant& value,
int number,
*/
virtual wxValidator* DoGetValidator () const;
- /**
- Returns current value's index to the choice control.
-
- May also return, through pointer arguments, strings that should be
- inserted to that control. Irrelevant to classes which do not employ
- wxPGEditor_Choice or similar.
-
- @remarks
- - If returns NULL in choiceinfo.m_choices, then this class must be
- derived from wxBaseEnumProperty.
- - Must be able to cope situation where property's set of choices is
- uninitialized.
- */
- virtual int GetChoiceInfo( wxPGChoiceInfo* choiceinfo );
-
/**
Override to paint an image in front of the property value text or
drop-down list item (but only if wxPGProperty::OnMeasureImage is
*/
virtual wxPGCellRenderer* GetCellRenderer( int column ) const;
+ /** Returns which choice is currently selected. Only applies to properties
+ which have choices.
+
+ Needs to reimplemented in derived class if property value does not
+ map directly to a choice. Integer as index, bool, and string usually do.
+ */
+ virtual int GetChoiceSelection() const;
+
/**
Refresh values of child properties.
*/
virtual wxPGEditorDialogAdapter* GetEditorDialog() const;
- /**
- Adds entry to property's wxPGChoices and editor control (if it is
- active).
-
- Returns index of item added.
- */
- int AppendChoice( const wxString& label, int value = wxPG_INVALID_VALUE )
- {
- return InsertChoice(label,-1,value);
- }
-
/** Returns wxPGCell of given column, NULL if none. If valid
object is returned, caller will gain its ownership.
*/
return cell;
}
+ /** Append a new choice to property's list of choices.
+ */
+ int AddChoice( const wxString& label, int value = wxPG_INVALID_VALUE )
+ {
+ return InsertChoice(label, wxNOT_FOUND, value);
+ }
+
/**
Returns true if children of this property are component values (for
instance, points size, face name, and is_underlined are component
*/
const wxString& GetBaseName() const { return m_name; }
- wxPGChoices& GetChoices();
-
- const wxPGChoices& GetChoices() const;
-
- const wxPGChoiceEntry* GetCurrentChoice() const;
+ /** Returns read-only reference to property's list of choices.
+ */
+ const wxPGChoices& GetChoices() const
+ {
+ return m_choices;
+ }
/** Returns coordinate to the top y of the property. Note that the
position of scrollbars is not taken into account.
}
#endif
- /** Same as GetValueAsString, except takes common value into account.
+ /** To acquire property's value as string, you should use this
+ function (instead of GetValueAsString()), as it may produce
+ more accurate value in future versions.
*/
wxString GetValueString( int argFlags = 0 ) const;
return (wxPGCell*) m_cells[column];
}
- unsigned int GetChoiceCount() const;
-
- wxString GetChoiceString( unsigned int index );
-
/** Return number of displayed common values for this property.
*/
int GetDisplayedCommonValueCount() const;
*/
bool HasVisibleChildren() const;
- /**
- Adds entry to property's wxPGChoices and editor control (if it is
- active).
-
- Returns index of item added.
+ /** Inserts a new choice to property's list of choices.
*/
- int InsertChoice( const wxString& label,
- int index,
- int value = wxPG_INVALID_VALUE );
+ int InsertChoice( const wxString& label, int index, int value = wxPG_INVALID_VALUE );
/**
Returns true if this property is actually a wxPropertyCategory.
/**
Determines, recursively, if all children are not unspecified.
- Takes values in given list into account.
+ @param pendingList
+ Assumes members in this wxVariant list as pending
+ replacement values.
*/
bool AreAllChildrenSpecified( wxVariant* pendingList = NULL ) const;
/** Returns true if containing grid uses wxPG_EX_AUTO_UNSPECIFIED_VALUES.
*/
- FlagType UsesAutoUnspecified() const
+ bool UsesAutoUnspecified() const
{
- return HasFlag(wxPG_PROP_AUTO_UNSPECIFIED);
+ return HasFlag(wxPG_PROP_AUTO_UNSPECIFIED)?true:false;
}
wxBitmap* GetValueImage() const
*/
double GetAttributeAsDouble( const wxString& name, double defVal ) const;
- unsigned int GetArrIndex() const { return m_arrIndex; }
-
unsigned int GetDepth() const { return (unsigned int)m_depth; }
/** Gets flags as a'|' delimited string. Note that flag names are not
*/
void SetCell( int column, wxPGCell* cellObj );
- /** Changes value of a property with choices, but only
- works if the value type is long or string. */
- void SetChoiceSelection( int newValue, const wxPGChoiceInfo& choiceInfo );
-
/** Sets common value selected for this property. -1 for none.
*/
void SetCommonValue( int commonValue )
/** If property has choices and they are not yet exclusive, new such copy
of them will be created.
*/
- void SetChoicesExclusive();
+ void SetChoicesExclusive()
+ {
+ m_choices.SetExclusive();
+ }
+
+ /** Sets selected choice and changes property value.
+
+ Tries to retain value type, although currently if it is not string,
+ then it is forced to integer.
+ */
+ void SetChoiceSelection( int newValue );
void SetExpanded( bool expanded )
{
inline void SetName( const wxString& newName );
+ /**
+ Changes what sort of parent this property is for its children.
+
+ @param flag
+ Use one of the following values: wxPG_PROP_MISC_PARENT (for generic
+ parents), wxPG_PROP_CATEGORY (for categories), or
+ wxPG_PROP_AGGREGATE (for derived property classes with private
+ children).
+
+ @remarks You only need to call this if you use AddChild() to add
+ child properties. Adding properties with
+ wxPropertyGridInterface::Insert() or
+ wxPropertyGridInterface::AppendIn() will automatically set
+ property to use wxPG_PROP_MISC_PARENT style.
+ */
+ void SetParentalType( int flag )
+ {
+ m_flags &= ~(wxPG_PROP_PROPERTY|wxPG_PROP_PARENTAL_FLAGS);
+ m_flags |= flag;
+ }
+
void SetValueToUnspecified()
{
wxVariant val; // Create NULL variant
}
#endif // #if wxUSE_VALIDATORS
- /** Updates property value in case there were last minute
- changes. If value was unspecified, it will be set to default.
- Use only for properties that have TextCtrl-based editor.
- @remarks
- If you have code similar to
- @code
- // Update the value in case of last minute changes
- if ( primary && propgrid->IsEditorsValueModified() )
- GetEditorClass()->CopyValueFromControl( this, primary );
- @endcode
- in wxPGProperty::OnEvent wxEVT_COMMAND_BUTTON_CLICKED handler,
- then replace it with call to this method.
- @return
- True if value changed.
- */
- bool PrepareValueForDialogEditing( wxPropertyGrid* propgrid );
-
#ifndef SWIG
/** Returns client data (void*) of a property.
*/
*/
bool SetChoices( wxPGChoices& choices );
- /** Sets new set of choices for property.
- */
- inline bool SetChoices( const wxArrayString& labels,
- const wxArrayInt& values = wxArrayInt() );
-
/** Set max length of text in text editor.
*/
inline bool SetMaxLength( int maxLen );
*/
void AdaptListToValue( wxVariant& list, wxVariant* value ) const;
- /** This is used by properties that have fixed sub-properties. */
+ /**
+ Adds a child property. If you use this instead of
+ wxPropertyGridInterface::Insert() or
+ wxPropertyGridInterface::AppendIn(), then you must set up
+ property's parental type before making the call. To do this,
+ call property's SetParentalType() function with either
+ wxPG_PROP_MISC_PARENT (normal, public children) or with
+ wxPG_PROP_AGGREGATE (private children for subclassed property).
+ For instance:
+
+ @code
+ wxPGProperty* prop = new wxStringProperty(wxS("Property"));
+ prop->SetParentalType(wxPG_PROP_MISC_PARENT);
+ wxPGProperty* prop2 = new wxStringProperty(wxS("Property2"));
+ prop->AddChild(prop2);
+ @endcode
+ */
void AddChild( wxPGProperty* prop );
/** Returns height of children, recursively, and
int GetChildrenHeight( int lh, int iMax = -1 ) const;
/** Returns number of child properties */
- unsigned int GetChildCount() const { return m_children.GetCount(); }
+ unsigned int GetChildCount() const
+ {
+ return (unsigned int) m_children.size();
+ }
/** Returns sub-property at index i. */
- wxPGProperty* Item( size_t i ) const
- { return (wxPGProperty*)m_children.Item(i); }
+ wxPGProperty* Item( unsigned int i ) const
+ { return m_children[i]; }
/** Returns last sub-property.
*/
- wxPGProperty* Last() const { return (wxPGProperty*)m_children.Last(); }
+ wxPGProperty* Last() const { return m_children.back(); }
- /** Returns index of given sub-property. */
- int Index( const wxPGProperty* p ) const
- { return m_children.Index((wxPGProperty*)p); }
+ /** Returns index of given child property. */
+ int Index( const wxPGProperty* p ) const;
/** Deletes all sub-properties. */
void Empty();
// Puts correct indexes to children
- void FixIndexesOfChildren( size_t starthere = 0 );
+ void FixIndicesOfChildren( unsigned int starthere = 0 );
#ifndef SWIG
// Returns wxPropertyGridPageState in which this property resides.
void DoSetName(const wxString& str) { m_name = str; }
- // Call for after sub-properties added with AddChild
- void PrepareSubProperties();
+ void InitAfterAdded( wxPropertyGridPageState* pageState,
+ wxPropertyGrid* propgrid );
- void SetParentalType( int flag )
- {
- m_flags &= ~(wxPG_PROP_PROPERTY|wxPG_PROP_PARENTAL_FLAGS);
- m_flags |= flag;
- }
+ // Removes child property with given pointer. Does not delete it.
+ void RemoveChild( wxPGProperty* p );
void SetParentState( wxPropertyGridPageState* pstate )
{ m_parentState = pstate; }
wxVariant m_value;
wxPGAttributeStorage m_attributes;
- wxArrayPtrVoid m_children;
+ wxArrayPGProperty m_children;
// Extended cell information
wxArrayPtrVoid m_cells;
+ // Choices shown in drop-down list of editor control.
+ wxPGChoices m_choices;
+
// Help shown in statusbar or help box.
wxString m_helpString;
// -----------------------------------------------------------------------
-#ifndef SWIG
-
-/** @class wxPGChoiceEntry
- Data of a single wxPGChoices choice.
-*/
-class WXDLLIMPEXP_PROPGRID wxPGChoiceEntry : public wxPGCell
-{
-public:
- wxPGChoiceEntry();
- wxPGChoiceEntry( const wxPGChoiceEntry& entry );
- wxPGChoiceEntry( const wxString& label,
- int value = wxPG_INVALID_VALUE )
- : wxPGCell(), m_value(value)
- {
- m_text = label;
- }
-
- wxPGChoiceEntry( const wxString& label,
- int value,
- const wxBitmap& bitmap,
- const wxColour& fgCol = wxNullColour,
- const wxColour& bgCol = wxNullColour )
- : wxPGCell(label, bitmap, fgCol, bgCol), m_value(value)
- {
- }
-
- virtual ~wxPGChoiceEntry()
- {
- }
-
- void SetValue( int value ) { m_value = value; }
-
- int GetValue() const { return m_value; }
-
- bool HasValue() const { return (m_value != wxPG_INVALID_VALUE); }
-
-protected:
- int m_value;
-};
-
-
-typedef void* wxPGChoicesId;
-
-class WXDLLIMPEXP_PROPGRID wxPGChoicesData
-{
- friend class wxPGChoices;
-public:
- // Constructor sets m_refCount to 1.
- wxPGChoicesData();
-
- void CopyDataFrom( wxPGChoicesData* data );
-
- // Takes ownership of 'item'
- void Insert( int index, wxPGChoiceEntry* item )
- {
- wxArrayPtrVoid::iterator it;
- if ( index == -1 )
- {
- it = m_items.end();
- index = m_items.size();
- }
- else
- {
- it = m_items.begin() + index;
- }
-
- // Need to fix value?
- if ( item->GetValue() == wxPG_INVALID_VALUE )
- item->SetValue(index);
-
- m_items.insert(it, item);
- }
-
- // Delete all entries
- void Clear();
-
- size_t GetCount() const { return m_items.size(); }
-
- wxPGChoiceEntry* Item( unsigned int i ) const
- {
- wxCHECK_MSG( i < GetCount(), NULL, "invalid index" );
-
- return (wxPGChoiceEntry*) m_items[i];
- }
-
- void DecRef()
- {
- m_refCount--;
- wxASSERT( m_refCount >= 0 );
- if ( m_refCount == 0 )
- delete this;
- }
-
-private:
- wxArrayPtrVoid m_items;
-
- // So that multiple properties can use the same set
- int m_refCount;
-
- virtual ~wxPGChoicesData();
-};
-
-#define wxPGChoicesEmptyData ((wxPGChoicesData*)NULL)
-
-#endif // SWIG
-
-
-/** @class wxPGChoices
-
- Helper class for managing choices of wxPropertyGrid properties.
- Each entry can have label, value, bitmap, text colour, and background
- colour.
-
- @library{wxpropgrid}
- @category{propgrid}
-*/
-class WXDLLIMPEXP_PROPGRID wxPGChoices
-{
-public:
- typedef long ValArrItem;
-
- /** Default constructor. */
- wxPGChoices()
- {
- Init();
- }
-
- /** Copy constructor. */
- wxPGChoices( const wxPGChoices& a )
- {
- if ( a.m_data != wxPGChoicesEmptyData )
- {
- m_data = a.m_data;
- m_data->m_refCount++;
- }
- }
-
- /** Constructor. */
- wxPGChoices( const wxChar** labels, const long* values = NULL )
- {
- Init();
- Set(labels,values);
- }
-
- /** Constructor. */
- wxPGChoices( const wxArrayString& labels,
- const wxArrayInt& values = wxArrayInt() )
- {
- Init();
- Set(labels,values);
- }
-
- /** Simple interface constructor. */
- wxPGChoices( wxPGChoicesData* data )
- {
- wxASSERT(data);
- m_data = data;
- data->m_refCount++;
- }
-
- /** Destructor. */
- ~wxPGChoices()
- {
- Free();
- }
-
- /**
- Adds to current.
-
- If did not have own copies, creates them now. If was empty, identical
- to set except that creates copies.
- */
- void Add( const wxChar** labels, const ValArrItem* values = NULL );
-
- /** Version that works with wxArrayString. */
- void Add( const wxArrayString& arr, const ValArrItem* values = NULL );
-
- /** Version that works with wxArrayString and wxArrayInt. */
- void Add( const wxArrayString& arr, const wxArrayInt& arrint );
-
- /** Adds single item. */
- wxPGChoiceEntry& Add( const wxString& label,
- int value = wxPG_INVALID_VALUE );
-
- /** Adds a single item, with bitmap. */
- wxPGChoiceEntry& Add( const wxString& label,
- const wxBitmap& bitmap,
- int value = wxPG_INVALID_VALUE );
-
- /** Adds a single item with full entry information. */
- wxPGChoiceEntry& Add( const wxPGChoiceEntry& entry )
- {
- return Insert(entry, -1);
- }
-
- /** Adds single item. */
- wxPGChoiceEntry& AddAsSorted( const wxString& label,
- int value = wxPG_INVALID_VALUE );
-
- void Assign( const wxPGChoices& a )
- {
- AssignData(a.m_data);
- }
-
- void AssignData( wxPGChoicesData* data );
-
- /** Delete all choices. */
- void Clear()
- {
- if ( m_data != wxPGChoicesEmptyData )
- m_data->Clear();
- }
-
- void EnsureData()
- {
- if ( m_data == wxPGChoicesEmptyData )
- m_data = new wxPGChoicesData();
- }
-
- /** Gets a unsigned number identifying this list. */
- wxPGChoicesId GetId() const { return (wxPGChoicesId) m_data; };
-
- const wxString& GetLabel( size_t ind ) const
- {
- return Item(ind).GetText();
- }
-
- size_t GetCount () const
- {
- wxASSERT_MSG( m_data, "When checking if wxPGChoices is valid, "
- "use IsOk() instead of GetCount()" );
- return m_data->GetCount();
- }
-
- int GetValue( size_t ind ) const { return Item(ind).GetValue(); }
-
- /** Returns array of values matching the given strings. Unmatching strings
- result in wxPG_INVALID_VALUE entry in array.
- */
- wxArrayInt GetValuesForStrings( const wxArrayString& strings ) const;
-
- /** Returns array of indices matching given strings. Unmatching strings
- are added to 'unmatched', if not NULL.
- */
- wxArrayInt GetIndicesForStrings( const wxArrayString& strings,
- wxArrayString* unmatched = NULL ) const;
-
- /** Returns true if choices in general are likely to have values
- (depens on that all entries have values or none has)
- */
- bool HasValues() const;
-
- bool HasValue( unsigned int i ) const
- { return (i < m_data->GetCount()) && m_data->Item(i)->HasValue(); }
-
- int Index( const wxString& str ) const;
- int Index( int val ) const;
-
- /** Inserts single item. */
- wxPGChoiceEntry& Insert( const wxString& label,
- int index,
- int value = wxPG_INVALID_VALUE );
-
- /** Inserts a single item with full entry information. */
- wxPGChoiceEntry& Insert( const wxPGChoiceEntry& entry, int index );
-
- /** Returns false if this is a constant empty set of choices,
- which should not be modified.
- */
- bool IsOk() const
- {
- return ( m_data != wxPGChoicesEmptyData );
- }
-
- const wxPGChoiceEntry& Item( unsigned int i ) const
- {
- wxASSERT( IsOk() );
- return *m_data->Item(i);
- }
-
- wxPGChoiceEntry& Item( unsigned int i )
- {
- wxASSERT( IsOk() );
- return *m_data->Item(i);
- }
-
- /** Removes count items starting at position nIndex. */
- void RemoveAt(size_t nIndex, size_t count = 1);
-
-#ifndef SWIG
- /** Does not create copies for itself. */
- void Set( const wxChar** labels, const long* values = NULL )
- {
- Free();
- Add(labels,values);
- }
-
- /** Version that works with wxArrayString.
- TODO: Deprecate this.
- */
- void Set( wxArrayString& arr, const long* values = (const long*) NULL )
- {
- Free();
- Add(arr,values);
- }
-#endif // SWIG
-
- /** Version that works with wxArrayString and wxArrayInt. */
- void Set( const wxArrayString& labels,
- const wxArrayInt& values = wxArrayInt() )
- {
- Free();
- if ( &values )
- Add(labels,values);
- else
- Add(labels);
- }
-
- // Creates exclusive copy of current choices
- void SetExclusive()
- {
- if ( m_data->m_refCount != 1 )
- {
- wxPGChoicesData* data = new wxPGChoicesData();
- data->CopyDataFrom(m_data);
- Free();
- m_data = data;
- }
- }
-
- // Returns data, increases refcount.
- wxPGChoicesData* GetData()
- {
- wxASSERT( m_data->m_refCount != 0xFFFFFFF );
- m_data->m_refCount++;
- return m_data;
- }
-
- // Returns plain data ptr - no refcounting stuff is done.
- wxPGChoicesData* GetDataPtr() const { return m_data; }
-
- // Changes ownership of data to you.
- wxPGChoicesData* ExtractData()
- {
- wxPGChoicesData* data = m_data;
- m_data = wxPGChoicesEmptyData;
- return data;
- }
-
- wxArrayString GetLabels() const;
-
-#ifndef SWIG
- void operator= (const wxPGChoices& a)
- {
- AssignData(a.m_data);
- }
-
- wxPGChoiceEntry& operator[](unsigned int i)
- {
- return Item(i);
- }
-
- const wxPGChoiceEntry& operator[](unsigned int i) const
- {
- return Item(i);
- }
-
-protected:
- wxPGChoicesData* m_data;
-
- void Init();
- void Free();
-#endif // !SWIG
-};
-
-inline bool wxPGProperty::SetChoices( const wxArrayString& labels,
- const wxArrayInt& values )
-{
- wxPGChoices chs(labels, values);
- return SetChoices(chs);
-}
-
-// -----------------------------------------------------------------------
-
#endif // wxUSE_PROPGRID
#endif // _WX_PROPGRID_PROPERTY_H_