1 /////////////////////////////////////////////////////////////////////////////
2 // Name: wx/propgeid/propgridiface.h
3 // Purpose: wxPropertyGridInterface class
4 // Author: Jaakko Salli
8 // Copyright: (c) Jaakko Salli
9 // Licence: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
12 #ifndef __WX_PROPGRID_PROPGRIDIFACE_H__
13 #define __WX_PROPGRID_PROPGRIDIFACE_H__
17 #include "wx/propgrid/property.h"
18 #include "wx/propgrid/propgridpagestate.h"
20 // -----------------------------------------------------------------------
24 /** @section wxPGPropArgCls
26 Most property grid functions have this type as their argument, as it can
27 convey a property by either a pointer or name.
29 class WXDLLIMPEXP_PROPGRID wxPGPropArgCls
33 wxPGPropArgCls( const wxPGProperty
* property
)
35 m_ptr
.property
= (wxPGProperty
*) property
;
38 wxPGPropArgCls( const wxString
& str
)
40 m_ptr
.stringName
= &str
;
43 wxPGPropArgCls( const wxPGPropArgCls
& id
)
48 // This is only needed for wxPython bindings
49 wxPGPropArgCls( wxString
* str
, bool WXUNUSED(deallocPtr
) )
51 m_ptr
.stringName
= str
;
52 m_flags
= IsWxString
| OwnsWxString
;
56 if ( m_flags
& OwnsWxString
)
57 delete m_ptr
.stringName
;
59 wxPGProperty
* GetPtr() const
61 wxCHECK( m_flags
== IsProperty
, NULL
);
62 return m_ptr
.property
;
64 wxPGPropArgCls( const char* str
)
70 wxPGPropArgCls( const wchar_t* str
)
72 m_ptr
.wcharName
= str
;
76 /** This constructor is required for NULL. */
79 m_ptr
.property
= (wxPGProperty
*) NULL
;
82 wxPGProperty
* GetPtr( wxPropertyGridInterface
* iface
) const;
83 wxPGProperty
* GetPtr( const wxPropertyGridInterface
* iface
) const
85 return GetPtr((wxPropertyGridInterface
*)iface
);
87 wxPGProperty
* GetPtr0() const { return m_ptr
.property
; }
88 bool HasName() const { return (m_flags
!= IsProperty
); }
89 const wxString
& GetName() const { return *m_ptr
.stringName
; }
103 wxPGProperty
* property
;
104 const char* charName
;
106 const wchar_t* wcharName
;
108 const wxString
* stringName
;
110 unsigned char m_flags
;
115 typedef const wxPGPropArgCls
& wxPGPropArg
;
117 // -----------------------------------------------------------------------
120 void wxPGTypeOperationFailed( const wxPGProperty
* p
,
121 const wxString
& typestr
,
122 const wxString
& op
);
124 void wxPGGetFailed( const wxPGProperty
* p
, const wxString
& typestr
);
126 // -----------------------------------------------------------------------
128 // Helper macro that does necessary preparations when calling
129 // some wxPGProperty's member function.
130 #define wxPG_PROP_ARG_CALL_PROLOG_0(PROPERTY) \
131 PROPERTY *p = (PROPERTY*)id.GetPtr(this); \
134 #define wxPG_PROP_ARG_CALL_PROLOG_RETVAL_0(PROPERTY, RETVAL) \
135 PROPERTY *p = (PROPERTY*)id.GetPtr(this); \
136 if ( !p ) return RETVAL;
138 #define wxPG_PROP_ARG_CALL_PROLOG() \
139 wxPG_PROP_ARG_CALL_PROLOG_0(wxPGProperty)
141 #define wxPG_PROP_ARG_CALL_PROLOG_RETVAL(RVAL) \
142 wxPG_PROP_ARG_CALL_PROLOG_RETVAL_0(wxPGProperty, RVAL)
144 #define wxPG_PROP_ID_CONST_CALL_PROLOG() \
145 wxPG_PROP_ARG_CALL_PROLOG_0(const wxPGProperty)
147 #define wxPG_PROP_ID_CONST_CALL_PROLOG_RETVAL(RVAL) \
148 wxPG_PROP_ARG_CALL_PROLOG_RETVAL_0(const wxPGProperty, RVAL)
150 // -----------------------------------------------------------------------
153 /** @class wxPropertyGridInterface
155 Most of the shared property manipulation interface shared by wxPropertyGrid,
156 wxPropertyGridPage, and wxPropertyGridManager is defined in this class.
159 - In separate wxPropertyGrid component this class was known as
160 wxPropertyContainerMethods.
165 class WXDLLIMPEXP_PROPGRID wxPropertyGridInterface
170 virtual ~wxPropertyGridInterface() { }
173 Appends property to the list.
175 wxPropertyGrid assumes ownership of the object.
176 Becomes child of most recently added category.
178 - wxPropertyGrid takes the ownership of the property pointer.
179 - If appending a category with name identical to a category already in
180 the wxPropertyGrid, then newly created category is deleted, and most
181 recently added category (under which properties are appended) is set
182 to the one with same name. This allows easier adding of items to same
183 categories in multiple passes.
184 - Does not automatically redraw the control, so you may need to call
185 Refresh when calling this function after control has been shown for
188 wxPGProperty
* Append( wxPGProperty
* property
);
190 wxPGProperty
* AppendIn( wxPGPropArg id
, wxPGProperty
* newproperty
);
193 In order to add new items into a property with fixed children (for
194 instance, wxFlagsProperty), you need to call this method. After
195 populating has been finished, you need to call EndAddChildren.
197 void BeginAddChildren( wxPGPropArg id
);
199 /** Deletes all properties.
201 virtual void Clear() = 0;
203 /** Deselect current selection, if any. Returns true if success
204 (ie. validator did not intercept). */
205 bool ClearSelection();
207 /** Resets modified status of all properties.
209 void ClearModifiedStatus();
211 /** Collapses given category or property with children.
212 Returns true if actually collapses.
214 bool Collapse( wxPGPropArg id
);
216 /** Collapses all items that can be collapsed.
219 Return false if failed (may fail if editor value cannot be validated).
221 bool CollapseAll() { return ExpandAll(false); }
224 Changes value of a property, as if from an editor.
225 Use this instead of SetPropertyValue() if you need the value to run
226 through validation process, and also send the property change event.
229 Returns true if value was successfully changed.
231 bool ChangePropertyValue( wxPGPropArg id
, wxVariant newValue
);
234 Deletes a property by id. If category is deleted, all children are
235 automatically deleted as well.
237 void DeleteProperty( wxPGPropArg id
);
239 /** Disables property. */
240 bool DisableProperty( wxPGPropArg id
) { return EnableProperty(id
,false); }
243 Returns true if all property grid data changes have been committed.
245 Usually only returns false if value in active editor has been
246 invalidated by a wxValidator.
248 bool EditorValidate();
251 Enables or disables property, depending on whether enable is true or
254 bool EnableProperty( wxPGPropArg id
, bool enable
= true );
256 /** Called after population of property with fixed children has finished.
258 void EndAddChildren( wxPGPropArg id
);
260 /** Expands given category or property with children.
261 Returns true if actually expands.
263 bool Expand( wxPGPropArg id
);
265 /** Expands all items that can be expanded.
267 bool ExpandAll( bool expand
= true );
269 /** Returns list of expanded properties.
271 wxArrayPGProperty
GetExpandedProperties() const
273 wxArrayPGProperty array
;
274 GetPropertiesWithFlag(&array
, wxPG_PROP_COLLAPSED
, true,
275 wxPG_ITERATE_ALL_PARENTS_RECURSIVELY
|wxPG_ITERATE_HIDDEN
);
279 /** Returns id of first child of given property.
281 Does not return sub-properties!
283 wxPGProperty
* GetFirstChild( wxPGPropArg id
)
285 wxPG_PROP_ARG_CALL_PROLOG_RETVAL(wxNullProperty
)
287 if ( !p
->GetChildCount() || p
->HasFlag(wxPG_PROP_AGGREGATE
) )
288 return wxNullProperty
;
294 /** Returns iterator class instance.
296 See @ref propgrid_iterator_flags. Value wxPG_ITERATE_DEFAULT causes
297 iteration over everything except private child properties.
299 Property to start iteration from. If NULL, then first child of root
302 Either wxTOP or wxBOTTOM. wxTOP will indicate that iterations start
303 from the first property from the top, and wxBOTTOM means that the
304 iteration will instead begin from bottommost valid item.
306 wxPropertyGridIterator
GetIterator( int flags
= wxPG_ITERATE_DEFAULT
,
307 wxPGProperty
* firstProp
= NULL
)
309 return wxPropertyGridIterator( m_pState
, flags
, firstProp
);
312 wxPropertyGridConstIterator
313 GetIterator( int flags
= wxPG_ITERATE_DEFAULT
,
314 wxPGProperty
* firstProp
= NULL
) const
316 return wxPropertyGridConstIterator( m_pState
, flags
, firstProp
);
319 wxPropertyGridIterator
GetIterator( int flags
, int startPos
)
321 return wxPropertyGridIterator( m_pState
, flags
, startPos
);
324 wxPropertyGridConstIterator
GetIterator( int flags
, int startPos
) const
326 return wxPropertyGridConstIterator( m_pState
, flags
, startPos
);
330 /** Returns id of first item, whether it is a category or property.
332 @link iteratorflags List of iterator flags@endlink
334 wxPGProperty
* GetFirst( int flags
= wxPG_ITERATE_ALL
)
336 wxPropertyGridIterator
it( m_pState
, flags
, wxNullProperty
, 1 );
340 const wxPGProperty
* GetFirst( int flags
= wxPG_ITERATE_ALL
) const
342 return ((wxPropertyGridInterface
*)this)->GetFirst(flags
);
346 Returns id of property with given name (case-sensitive).
348 If there is no property with such name, returned property id is invalid
349 ( i.e. it will return false with IsOk method).
351 - Sub-properties (i.e. properties which have parent that is not
352 category or root) can not be accessed globally by their name.
353 Instead, use "<property>.<subproperty>" in place of "<subproperty>".
355 wxPGProperty
* GetProperty( const wxString
& name
) const
357 return GetPropertyByName(name
);
360 /** Returns map-like storage of property's attributes.
362 Note that if extra style wxPG_EX_WRITEONLY_BUILTIN_ATTRIBUTES is set,
363 then builtin-attributes are not included in the storage.
365 const wxPGAttributeStorage
& GetPropertyAttributes( wxPGPropArg id
) const
367 wxPG_PROP_ARG_CALL_PROLOG_RETVAL(*((const wxPGAttributeStorage
*)NULL
));
368 return p
->GetAttributes();
371 /** Adds to 'targetArr' pointers to properties that have given
372 flags 'flags' set. However, if 'inverse' is set to true, then
373 only properties without given flags are stored.
375 Property flags to use.
377 Iterator flags to use. Default is everything expect private children.
379 void GetPropertiesWithFlag( wxArrayPGProperty
* targetArr
,
380 wxPGProperty::FlagType flags
,
381 bool inverse
= false,
382 int iterFlags
= wxPG_ITERATE_PROPERTIES
|
383 wxPG_ITERATE_HIDDEN
|
384 wxPG_ITERATE_CATEGORIES
) const;
386 /** Returns value of given attribute. If none found, returns NULL-variant.
388 wxVariant
GetPropertyAttribute( wxPGPropArg id
,
389 const wxString
& attrName
) const
391 wxPG_PROP_ARG_CALL_PROLOG_RETVAL(wxNullVariant
)
392 return p
->GetAttribute(attrName
);
395 /** Returns pointer of property's nearest parent category. If no category
398 wxPropertyCategory
* GetPropertyCategory( wxPGPropArg id
) const
400 wxPG_PROP_ID_CONST_CALL_PROLOG_RETVAL(NULL
)
401 return m_pState
->GetPropertyCategory(p
);
405 /** Returns client data (void*) of a property. */
406 void* GetPropertyClientData( wxPGPropArg id
) const
408 wxPG_PROP_ARG_CALL_PROLOG_RETVAL(NULL
)
409 return p
->GetClientData();
414 Returns first property which label matches given string.
416 NULL if none found. Note that this operation is extremely slow when
417 compared to GetPropertyByName().
419 wxPGProperty
* GetPropertyByLabel( const wxString
& label
) const;
421 /** Returns property with given name. NULL if none found.
423 wxPGProperty
* GetPropertyByName( const wxString
& name
) const;
425 /** Returns child property 'subname' of property 'name'. Same as
426 calling GetPropertyByName("name.subname"), albeit slightly faster.
428 wxPGProperty
* GetPropertyByName( const wxString
& name
,
429 const wxString
& subname
) const;
431 /** Returns property's editor. */
432 const wxPGEditor
* GetPropertyEditor( wxPGPropArg id
) const
434 wxPG_PROP_ARG_CALL_PROLOG_RETVAL(NULL
)
435 return p
->GetEditorClass();
438 /** Returns help string associated with a property. */
439 wxString
GetPropertyHelpString( wxPGPropArg id
) const
441 wxPG_PROP_ARG_CALL_PROLOG_RETVAL(m_emptyString
)
442 return p
->GetHelpString();
445 /** Returns property's custom value image (NULL of none). */
446 wxBitmap
* GetPropertyImage( wxPGPropArg id
) const
448 wxPG_PROP_ARG_CALL_PROLOG_RETVAL(NULL
)
449 return p
->GetValueImage();
452 /** Returns label of a property. */
453 const wxString
& GetPropertyLabel( wxPGPropArg id
)
455 wxPG_PROP_ARG_CALL_PROLOG_RETVAL(m_emptyString
)
456 return p
->GetLabel();
459 /** Returns name of a property, by which it is globally accessible. */
460 wxString
GetPropertyName( wxPGProperty
* property
)
462 return property
->GetName();
465 /** Returns parent item of a property. */
466 wxPGProperty
* GetPropertyParent( wxPGPropArg id
)
468 wxPG_PROP_ARG_CALL_PROLOG_RETVAL(wxNullProperty
)
469 return p
->GetParent();
473 /** Returns validator of a property as a reference, which you
474 can pass to any number of SetPropertyValidator.
476 wxValidator
* GetPropertyValidator( wxPGPropArg id
)
478 wxPG_PROP_ARG_CALL_PROLOG_RETVAL(NULL
)
479 return p
->GetValidator();
483 /** Returns value as wxVariant. To get wxObject pointer from it,
484 you will have to use WX_PG_VARIANT_TO_WXOBJECT(VARIANT,CLASSNAME) macro.
486 If property value is unspecified, Null variant is returned.
488 wxVariant
GetPropertyValue( wxPGPropArg id
)
490 wxPG_PROP_ARG_CALL_PROLOG_RETVAL(wxVariant())
491 return p
->GetValue();
494 wxString
GetPropertyValueAsString( wxPGPropArg id
) const;
495 long GetPropertyValueAsLong( wxPGPropArg id
) const;
496 unsigned long GetPropertyValueAsULong( wxPGPropArg id
) const
498 return (unsigned long) GetPropertyValueAsLong(id
);
501 int GetPropertyValueAsInt( wxPGPropArg id
) const
502 { return (int)GetPropertyValueAsLong(id
); }
504 bool GetPropertyValueAsBool( wxPGPropArg id
) const;
505 double GetPropertyValueAsDouble( wxPGPropArg id
) const;
507 #define wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL(TYPENAME, DEFVAL) \
508 wxPG_PROP_ARG_CALL_PROLOG_RETVAL(DEFVAL) \
509 wxString typeName(wxS(TYPENAME)); \
510 wxVariant value = p->GetValue(); \
511 if ( value.GetType() != typeName ) \
513 wxPGGetFailed(p, typeName); \
517 #define wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL_WFALLBACK(TYPENAME, DEFVAL) \
518 wxPG_PROP_ARG_CALL_PROLOG_RETVAL(DEFVAL) \
519 wxVariant value = p->GetValue(); \
520 if ( value.GetType() != wxS(TYPENAME) ) \
523 wxArrayString GetPropertyValueAsArrayString( wxPGPropArg id ) const
525 wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL("arrstring",
527 return value
.GetArrayString();
530 #if wxUSE_LONGLONG_NATIVE
531 wxLongLong_t
GetPropertyValueAsLongLong( wxPGPropArg id
) const
533 wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL_WFALLBACK("wxLongLong",
534 (long) GetPropertyValueAsLong(id
))
537 return ll
.GetValue();
540 wxULongLong_t
GetPropertyValueAsULongLong( wxPGPropArg id
) const
542 wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL_WFALLBACK("wxULongLong",
543 (unsigned long) GetPropertyValueAsULong(id
))
546 return ull
.GetValue();
550 wxArrayInt
GetPropertyValueAsArrayInt( wxPGPropArg id
) const
552 wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL("wxArrayInt",
560 wxDateTime
GetPropertyValueAsDateTime( wxPGPropArg id
) const
562 wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL("datetime",
564 return value
.GetDateTime();
569 /** Returns a wxVariant list containing wxVariant versions of all
570 property values. Order is not guaranteed.
572 Use wxPG_KEEP_STRUCTURE to retain category structure; each sub
573 category will be its own wxVariantList of wxVariant.
574 Use wxPG_INC_ATTRIBUTES to include property attributes as well.
575 Each attribute will be stored as list variant named
576 "@@<propname>@@attr."
579 wxVariant
GetPropertyValues( const wxString
& listname
= wxEmptyString
,
580 wxPGProperty
* baseparent
= NULL
, long flags
= 0 ) const
582 return m_pState
->DoGetPropertyValues(listname
, baseparent
, flags
);
586 /** Returns currently selected property. */
587 wxPGProperty
* GetSelection() const
589 return m_pState
->GetSelection();
593 wxPropertyGridPageState
* GetState() const { return m_pState
; }
596 /** Similar to GetIterator(), but instead returns wxPGVIterator instance,
597 which can be useful for forward-iterating through arbitrary property
601 See @ref propgrid_iterator_flags.
603 virtual wxPGVIterator
GetVIterator( int flags
) const;
605 /** Hides or reveals a property.
607 If true, hides property, otherwise reveals it.
609 By default changes are applied recursively. Set this paramter
610 wxPG_DONT_RECURSE to prevent this.
612 bool HideProperty( wxPGPropArg id
,
614 int flags
= wxPG_RECURSE
);
616 #if wxPG_INCLUDE_ADVPROPS
617 /** Initializes *all* property types. Causes references to most object
618 files in the library, so calling this may cause significant increase
619 in executable size when linking with static library.
621 static void InitAllTypeHandlers();
623 static void InitAllTypeHandlers() { }
627 /** Inserts property to the property container.
630 New property is inserted just prior to this. Available only
631 in the first variant. There are two versions of this function
632 to allow this parameter to be either an id or name to
636 Pointer to the inserted property. wxPropertyGrid will take
637 ownership of this object.
640 New property is inserted under this category. Available only
641 in the second variant. There are two versions of this function
642 to allow this parameter to be either an id or name to
646 Index under category. Available only in the second variant.
647 If index is < 0, property is appended in category.
650 Returns id for the property,
654 - wxPropertyGrid takes the ownership of the property pointer.
656 - While Append may be faster way to add items, make note that when
657 both types of data storage (categoric and
658 non-categoric) are active, Insert becomes even more slow. This is
659 especially true if current mode is non-categoric.
666 wxPGProperty* my_cat_id = propertygrid->Append(
667 new wxPropertyCategory("My Category") );
671 // insert into category - using second variant
672 wxPGProperty* my_item_id_1 = propertygrid->Insert(
673 my_cat_id, 0, new wxStringProperty("My String 1") );
675 // insert before to first item - using first variant
676 wxPGProperty* my_item_id_2 = propertygrid->Insert(
677 my_item_id, new wxStringProperty("My String 2") );
682 wxPGProperty
* Insert( wxPGPropArg priorThis
, wxPGProperty
* newproperty
);
683 wxPGProperty
* Insert( wxPGPropArg parent
,
685 wxPGProperty
* newproperty
);
688 /** Returns true if property is a category. */
689 bool IsPropertyCategory( wxPGPropArg id
) const
691 wxPG_PROP_ARG_CALL_PROLOG_RETVAL(false)
692 return p
->IsCategory();
695 /** Returns true if property is enabled. */
696 bool IsPropertyEnabled( wxPGPropArg id
) const
698 wxPG_PROP_ARG_CALL_PROLOG_RETVAL(false)
699 return (!(p
->GetFlags() & wxPG_PROP_DISABLED
))?true:false;
703 Returns true if given property is expanded.
705 Naturally, always returns false for properties that cannot be expanded.
707 bool IsPropertyExpanded( wxPGPropArg id
) const;
710 Returns true if property has been modified after value set or modify
711 flag clear by software.
713 bool IsPropertyModified( wxPGPropArg id
) const
715 wxPG_PROP_ARG_CALL_PROLOG_RETVAL(false)
716 return ( (p
->GetFlags() & wxPG_PROP_MODIFIED
) ? true : false );
720 Returns true if property is shown (ie hideproperty with true not
723 bool IsPropertyShown( wxPGPropArg id
) const
725 wxPG_PROP_ARG_CALL_PROLOG_RETVAL(false)
726 return (!(p
->GetFlags() & wxPG_PROP_HIDDEN
))?true:false;
729 /** Returns true if property value is set to unspecified.
731 bool IsPropertyValueUnspecified( wxPGPropArg id
) const
733 wxPG_PROP_ARG_CALL_PROLOG_RETVAL(false)
734 return p
->IsValueUnspecified();
738 Disables (limit = true) or enables (limit = false) wxTextCtrl editor of
739 a property, if it is not the sole mean to edit the value.
741 void LimitPropertyEditing( wxPGPropArg id
, bool limit
= true );
743 /** If state is shown in it's grid, refresh it now.
745 virtual void RefreshGrid( wxPropertyGridPageState
* state
= NULL
);
747 #if wxPG_INCLUDE_ADVPROPS
749 Initializes additional property editors (SpinCtrl etc.). Causes
750 references to most object files in the library, so calling this may
751 cause significant increase in executable size when linking with static
754 static void RegisterAdditionalEditors();
756 static void RegisterAdditionalEditors() { }
759 /** Replaces property with id with newly created property. For example,
760 this code replaces existing property named "Flags" with one that
761 will have different set of items:
763 pg->ReplaceProperty("Flags",
764 wxFlagsProperty("Flags", wxPG_LABEL, newItems))
766 For more info, see wxPropertyGrid::Insert.
768 wxPGProperty
* ReplaceProperty( wxPGPropArg id
, wxPGProperty
* property
);
770 /** @anchor propgridinterface_editablestate_flags
772 Flags for wxPropertyGridInterface::SaveEditableState() and
773 wxPropertyGridInterface::RestoreEditableState().
775 enum EditableStateFlags
777 /** Include selected property. */
778 SelectionState
= 0x01,
779 /** Include expanded/collapsed property information. */
780 ExpandedState
= 0x02,
781 /** Include scrolled position. */
782 ScrollPosState
= 0x04,
783 /** Include selected page information.
784 Only applies to wxPropertyGridManager. */
786 /** Include splitter position. Stored for each page. */
787 SplitterPosState
= 0x10,
788 /** Include description box size.
789 Only applies to wxPropertyGridManager. */
793 Include all supported user editable state information.
794 This is usually the default value. */
795 AllStates
= SelectionState
|
804 Restores user-editable state.
806 See also wxPropertyGridInterface::SaveEditableState().
809 String generated by SaveEditableState.
812 Which parts to restore from source string. See @ref
813 propgridinterface_editablestate_flags "list of editable state
817 False if there was problem reading the string.
820 If some parts of state (such as scrolled or splitter position) fail to
821 restore correctly, please make sure that you call this function after
822 wxPropertyGrid size has been set (this may sometimes be tricky when
825 bool RestoreEditableState( const wxString
& src
,
826 int restoreStates
= AllStates
);
829 Used to acquire user-editable state (selected property, expanded
830 properties, scrolled position, splitter positions).
832 @param includedStates
833 Which parts of state to include. See @ref
834 propgridinterface_editablestate_flags "list of editable state flags".
836 wxString
SaveEditableState( int includedStates
= AllStates
) const;
839 Lets user to set the strings listed in the choice dropdown of a
840 wxBoolProperty. Defaults are "True" and "False", so changing them to,
841 say, "Yes" and "No" may be useful in some less technical applications.
843 static void SetBoolChoices( const wxString
& trueChoice
,
844 const wxString
& falseChoice
);
846 /** Sets or clears flag(s) of all properties in given array.
848 Property flags to set or clear.
850 Set to true if you want to clear flag instead of setting them.
852 void SetPropertiesFlag( const wxArrayPGProperty
& srcArr
,
853 wxPGProperty::FlagType flags
,
854 bool inverse
= false );
856 /** Sets an attribute for this property.
858 Text identifier of attribute. See @ref propgrid_property_attributes.
862 Optional. Use wxPG_RECURSE to set the attribute to child properties
865 void SetPropertyAttribute( wxPGPropArg id
,
866 const wxString
& attrName
,
870 DoSetPropertyAttribute(id
,attrName
,value
,argFlags
);
873 /** Sets property attribute for all applicapple properties.
874 Be sure to use this method only after all properties have been
877 void SetPropertyAttributeAll( const wxString
& attrName
, wxVariant value
);
879 /** Sets attributes from a wxPGAttributeStorage.
881 void SetPropertyAttributes( wxPGPropArg id
,
882 const wxPGAttributeStorage
& attributes
)
884 wxPG_PROP_ARG_CALL_PROLOG()
885 p
->SetAttributes(attributes
);
888 /** Sets text, bitmap, and colours for given column's cell.
891 - You can set label cell by setting column to 0.
892 - You can use wxPG_LABEL as text to use default text for column.
894 void SetPropertyCell( wxPGPropArg id
,
896 const wxString
& text
= wxEmptyString
,
897 const wxBitmap
& bitmap
= wxNullBitmap
,
898 const wxColour
& fgCol
= wxNullColour
,
899 const wxColour
& bgCol
= wxNullColour
)
901 wxPG_PROP_ARG_CALL_PROLOG()
902 p
->SetCell( column
, new wxPGCell(text
, bitmap
, fgCol
, bgCol
) );
906 /** Sets client data (void*) of a property.
908 This untyped client data has to be deleted manually.
910 void SetPropertyClientData( wxPGPropArg id
, void* clientData
)
912 wxPG_PROP_ARG_CALL_PROLOG()
913 p
->SetClientData(clientData
);
916 /** Sets editor for a property.
919 For builtin editors, use wxPGEditor_X, where X is builtin editor's
920 name (TextCtrl, Choice, etc. see wxPGEditor documentation for full
923 For custom editors, use pointer you received from
924 wxPropertyGrid::RegisterEditorClass().
926 void SetPropertyEditor( wxPGPropArg id
, const wxPGEditor
* editor
)
928 wxPG_PROP_ARG_CALL_PROLOG()
929 wxCHECK_RET( editor
, wxT("unknown/NULL editor") );
930 p
->SetEditor(editor
);
935 /** Sets editor control of a property. As editor argument, use
936 editor name string, such as "TextCtrl" or "Choice".
938 void SetPropertyEditor( wxPGPropArg id
, const wxString
& editorName
)
940 SetPropertyEditor(id
,GetEditorByName(editorName
));
943 /** Sets label of a property.
945 void SetPropertyLabel( wxPGPropArg id
, const wxString
& newproplabel
);
948 Sets name of a property.
951 Name or pointer of property which name to change.
954 New name for property.
956 void SetPropertyName( wxPGPropArg id
, const wxString
& newName
)
958 wxPG_PROP_ARG_CALL_PROLOG()
959 m_pState
->DoSetPropertyName( p
, newName
);
963 Sets property (and, recursively, its children) to have read-only value.
964 In other words, user cannot change the value in the editor, but they
967 This is mainly for use with textctrl editor. Not all other editors fully
970 By default changes are applied recursively. Set this paramter
971 wxPG_DONT_RECURSE to prevent this.
973 void SetPropertyReadOnly( wxPGPropArg id
,
975 int flags
= wxPG_RECURSE
)
977 wxPG_PROP_ARG_CALL_PROLOG()
978 if ( flags
& wxPG_RECURSE
)
979 p
->SetFlagRecursively(wxPG_PROP_READONLY
, set
);
981 p
->SetFlag(wxPG_PROP_READONLY
);
984 /** Sets property's value to unspecified.
985 If it has children (it may be category), then the same thing is done to
988 void SetPropertyValueUnspecified( wxPGPropArg id
);
991 /** Sets various property values from a list of wxVariants. If property with
992 name is missing from the grid, new property is created under given
993 default category (or root if omitted).
995 void SetPropertyValues( const wxVariantList
& list
,
996 wxPGPropArg defaultCategory
= wxNullProperty
)
999 if ( defaultCategory
.HasName() ) p
= defaultCategory
.GetPtr(this);
1000 else p
= defaultCategory
.GetPtr0();
1001 m_pState
->DoSetPropertyValues(list
, p
);
1004 void SetPropertyValues( const wxVariant
& list
,
1005 wxPGPropArg defaultCategory
= wxNullProperty
)
1007 SetPropertyValues(list
.GetList(),defaultCategory
);
1011 /** Associates the help string with property.
1013 By default, text is shown either in the manager's "description"
1014 text box or in the status bar. If extra window style
1015 wxPG_EX_HELP_AS_TOOLTIPS is used, then the text will appear as a
1018 void SetPropertyHelpString( wxPGPropArg id
, const wxString
& helpString
)
1020 wxPG_PROP_ARG_CALL_PROLOG()
1021 p
->SetHelpString(helpString
);
1024 /** Set wxBitmap in front of the value.
1026 - Bitmap will be scaled to a size returned by
1027 wxPropertyGrid::GetImageSize();
1029 void SetPropertyImage( wxPGPropArg id
, wxBitmap
& bmp
)
1031 wxPG_PROP_ARG_CALL_PROLOG()
1032 p
->SetValueImage(bmp
);
1036 /** Sets max length of property's text.
1038 bool SetPropertyMaxLength( wxPGPropArg id
, int maxLen
);
1040 #if wxUSE_VALIDATORS
1041 /** Sets validator of a property.
1043 void SetPropertyValidator( wxPGPropArg id
, const wxValidator
& validator
)
1045 wxPG_PROP_ARG_CALL_PROLOG()
1046 p
->SetValidator(validator
);
1051 /** Sets value (long integer) of a property.
1053 void SetPropertyValue( wxPGPropArg id
, long value
)
1056 SetPropVal( id
, v
);
1059 /** Sets value (integer) of a property.
1061 void SetPropertyValue( wxPGPropArg id
, int value
)
1063 wxVariant
v((long)value
);
1064 SetPropVal( id
, v
);
1066 /** Sets value (floating point) of a property.
1068 void SetPropertyValue( wxPGPropArg id
, double value
)
1071 SetPropVal( id
, v
);
1073 /** Sets value (bool) of a property.
1075 void SetPropertyValue( wxPGPropArg id
, bool value
)
1078 SetPropVal( id
, v
);
1081 void SetPropertyValue( wxPGPropArg id
, const wchar_t* value
)
1083 SetPropertyValueString( id
, wxString(value
) );
1086 void SetPropertyValue( wxPGPropArg id
, const char* value
)
1088 SetPropertyValueString( id
, wxString(value
) );
1090 void SetPropertyValue( wxPGPropArg id
, const wxString
& value
)
1092 SetPropertyValueString( id
, value
);
1095 /** Sets value (wxArrayString) of a property.
1097 void SetPropertyValue( wxPGPropArg id
, const wxArrayString
& value
)
1100 SetPropVal( id
, v
);
1104 void SetPropertyValue( wxPGPropArg id
, const wxDateTime
& value
)
1107 SetPropVal( id
, v
);
1111 /** Sets value (wxObject*) of a property.
1113 void SetPropertyValue( wxPGPropArg id
, wxObject
* value
)
1116 SetPropVal( id
, v
);
1119 void SetPropertyValue( wxPGPropArg id
, wxObject
& value
)
1121 wxVariant
v(&value
);
1122 SetPropVal( id
, v
);
1125 #if wxUSE_LONGLONG_NATIVE
1126 /** Sets value (wxLongLong&) of a property.
1128 void SetPropertyValue( wxPGPropArg id
, wxLongLong_t value
)
1130 wxVariant v
= WXVARIANT(wxLongLong(value
));
1131 SetPropVal( id
, v
);
1133 /** Sets value (wxULongLong&) of a property.
1135 void SetPropertyValue( wxPGPropArg id
, wxULongLong_t value
)
1137 wxVariant v
= WXVARIANT(wxULongLong(value
));
1138 SetPropVal( id
, v
);
1142 /** Sets value (wxArrayInt&) of a property.
1144 void SetPropertyValue( wxPGPropArg id
, const wxArrayInt
& value
)
1146 wxVariant v
= WXVARIANT(value
);
1147 SetPropVal( id
, v
);
1151 /** Sets value (wxString) of a property.
1154 This method uses wxPGProperty::SetValueFromString, which all properties
1155 should implement. This means that there should not be a type error,
1156 and instead the string is converted to property's actual value type.
1158 void SetPropertyValueString( wxPGPropArg id
, const wxString
& value
);
1160 /** Sets value (wxVariant&) of a property.
1163 Use wxPropertyGrid::ChangePropertyValue() instead if you need to run
1164 through validation process and send property change event.
1166 void SetPropertyValue( wxPGPropArg id
, wxVariant value
)
1168 SetPropVal( id
, value
);
1172 /** Sets value (wxVariant&) of a property. Same as SetPropertyValue, but
1173 accepts reference. */
1174 void SetPropVal( wxPGPropArg id
, wxVariant
& value
);
1177 /** Adjusts how wxPropertyGrid behaves when invalid value is entered
1180 See @link vfbflags list of valid flags values@endlink
1182 void SetValidationFailureBehavior( int vfbFlags
);
1186 def
MapType(class_
,factory
):
1187 "Registers Python type/class to property mapping.\n\nfactory: Property builder function/class."
1188 global _type2property
1190 mappings
= _type2property
1192 raise
AssertionError("call only after a propertygrid or manager instance constructed")
1194 mappings
[class_
] = factory
1197 def
DoDefaultTypeMappings(self
):
1198 "Map built-in properties."
1199 global _type2property
1201 mappings
= _type2property
1206 _type2property
= mappings
1208 mappings
[str
] = StringProperty
1209 mappings
[unicode
] = StringProperty
1210 mappings
[int] = IntProperty
1211 mappings
[float] = FloatProperty
1212 mappings
[bool] = BoolProperty
1213 mappings
[list
] = ArrayStringProperty
1214 mappings
[tuple
] = ArrayStringProperty
1215 mappings
[wx
.Font
] = FontProperty
1216 mappings
[wx
.Colour
] = ColourProperty
1217 "mappings[wx.Size] = SizeProperty"
1218 "mappings[wx.Point] = PointProperty"
1219 "mappings[wx.FontData] = FontDataProperty"
1221 def
DoDefaultValueTypeMappings(self
):
1222 "Map pg value type ids to getter methods."
1225 vt2getter
= _vt2getter
1230 _vt2getter
= vt2getter
1232 def
GetPropertyValues(self
,dict_
=None
, as_strings
=False
, inc_attributes
=False
):
1233 "Returns values in the grid."
1235 "dict_: if not given, then a new one is created. dict_ can be"
1236 " object as well, in which case it's __dict__ is used."
1237 "as_strings: if True, then string representations of values"
1238 " are fetched instead of native types. Useful for config and such."
1239 "inc_attributes: if True, then property attributes are added"
1240 " as @<propname>@<attr>."
1242 "Return value: dictionary with values. It is always a dictionary,"
1243 "so if dict_ was object with __dict__ attribute, then that attribute"
1248 elif
hasattr(dict_
,'__dict__'):
1249 dict_
= dict_
.__dict__
1252 getter
= self
.GetPropertyValue
1254 getter
= self
.GetPropertyValueAsString
1256 it
= self
.GetVIterator(PG_ITERATE_PROPERTIES
)
1257 while not it
.AtEnd():
1258 p
= it
.GetProperty()
1261 dict_
[name
] = getter(p
)
1264 attrs
= p
.GetAttributes()
1265 if attrs
and len(attrs
):
1266 dict_
['@%s@attr'%name
] = attrs
1272 GetValues
= GetPropertyValues
1275 def
SetPropertyValues(self
,dict_
):
1276 "Sets property values from dict_, which can be either\ndictionary or an object with __dict__ attribute."
1278 "autofill: If true, keys with not relevant properties"
1279 " are auto-created. For more info, see AutoFill."
1282 " * Keys starting with underscore are ignored."
1283 " * Attributes can be set with entries named @<propname>@<attr>."
1290 elif
hasattr(dict_
,'__dict__'):
1291 dict_
= dict_
.__dict__
1295 def
set_sub_obj(k0
,dict_
):
1296 for k
,v in dict_
.iteritems():
1298 if k
.endswith('@attr'):
1299 attr_dicts
.append((k
[1:-5],v
))
1302 self
.SetPropertyValue(k
,v
)
1306 self
._AutoFillOne(k0
,k
,v
)
1309 if isinstance(v
,dict
):
1311 elif
hasattr(v
,'__dict__'):
1312 set_sub_obj(k
,v
.__dict__
)
1315 for k
,v in attr_dicts
:
1316 p
= GetPropertyByName(k
)
1318 raise
AssertionError("No such property: '%s'"%k
)
1319 for an
,av in v
.iteritems():
1320 p
.SetAttribute(an
, av
)
1324 is_manager
= isinstance(self
,PropertyGridManager
)
1327 set_sub_obj(self
.GetGrid().GetRoot(),dict_
)
1330 traceback
.print_exc()
1334 SetValues
= SetPropertyValues
1336 def
_AutoFillMany(self
,cat
,dict_
):
1337 for k
,v in dict_
.iteritems():
1338 self
._AutoFillOne(cat
,k
,v
)
1341 def
_AutoFillOne(self
,cat
,k
,v
):
1342 global _type2property
1344 factory
= _type2property
.get(v
.__class__
,None
)
1347 self
.AppendIn( cat
, factory(k
,k
,v
) )
1348 elif
hasattr(v
,'__dict__'):
1349 cat2
= self
.AppendIn( cat
, PropertyCategory(k
) )
1350 self
._AutoFillMany(cat2
,v
.__dict__
)
1351 elif
isinstance(v
,dict
):
1352 cat2
= self
.AppendIn( cat
, PropertyCategory(k
) )
1353 self
._AutoFillMany(cat2
,v
)
1354 elif
not k
.startswith('_'):
1355 raise
AssertionError("member '%s' is of unregisted type/class '%s'"%(k
,v
.__class__
))
1358 def
AutoFill(self
,obj
,parent
=None
):
1359 "Clears properties and re-fills to match members and\nvalues of given object or dictionary obj."
1361 self
.edited_objects
[parent
] = obj
1364 is_manager
= isinstance(self
,PropertyGridManager
)
1368 page
= self
.GetCurrentPage()
1370 parent
= page
.GetRoot()
1373 parent
= self
.GetGrid().GetRoot()
1375 it
= self
.GetIterator(PG_ITERATE_PROPERTIES
, parent
)
1376 it
.Next() # Skip the parent
1377 while not it
.AtEnd():
1378 p
= it
.GetProperty()
1379 if not p
.IsSomeParent(parent
):
1382 self
.DeleteProperty(p
)
1387 if not is_manager
or page
== self
.GetCurrentPage():
1392 self
._AutoFillMany(parent
,obj
.__dict__
)
1395 traceback
.print_exc()
1400 def
RegisterEditor(self
, editor
, editorName
=None
):
1401 "Transform class into instance, if necessary."
1402 if not isinstance(editor
, PGEditor
):
1405 editorName
= editor
.__class__
.__name__
1407 self
._editor_instances
.append(editor
)
1409 self
._editor_instances
= [editor
]
1410 RegisterEditor(editor
, editorName
)
1412 def
GetPropertyClientData(self
, p
):
1413 if isinstance(p
, basestring
):
1414 p
= self
.GetPropertyByName(p
)
1415 return p
.GetClientData()
1417 def
SetPropertyClientData(self
, p
, data
):
1418 if isinstance(p
, basestring
):
1419 p
= self
.GetPropertyByName(p
)
1420 return p
.SetClientData(data
)
1424 // GetPropertyByName With nice assertion error message.
1425 wxPGProperty
* GetPropertyByNameA( const wxString
& name
) const;
1427 static wxPGEditor
* GetEditorByName( const wxString
& editorName
);
1429 virtual void RefreshProperty( wxPGProperty
* p
) = 0;
1434 In derived class, implement to set editable state component with
1435 given name to given value.
1437 virtual bool SetEditableStateItem( const wxString
& name
, wxVariant value
)
1445 In derived class, implement to return editable state component with
1448 virtual wxVariant
GetEditableStateItem( const wxString
& name
) const
1451 return wxNullVariant
;
1454 // Returns page state data for given (sub) page (-1 means current page).
1455 virtual wxPropertyGridPageState
* GetPageState( int pageIndex
) const
1457 if ( pageIndex
<= 0 )
1462 virtual bool DoSelectPage( int WXUNUSED(index
) ) { return true; }
1464 // Default call's m_pState's BaseGetPropertyByName
1465 virtual wxPGProperty
* DoGetPropertyByName( const wxString
& name
) const;
1469 // Deriving classes must set this (it must be only or current page).
1470 wxPropertyGridPageState
* m_pState
;
1472 // Intermediate version needed due to wxVariant copying inefficiency
1473 void DoSetPropertyAttribute( wxPGPropArg id
,
1474 const wxString
& name
,
1475 wxVariant
& value
, long argFlags
);
1477 // Empty string object to return from member functions returning const
1479 wxString m_emptyString
;
1482 // Cannot be GetGrid() due to ambiguity issues.
1483 wxPropertyGrid
* GetPropertyGrid()
1485 return m_pState
->GetGrid();
1488 // Cannot be GetGrid() due to ambiguity issues.
1489 const wxPropertyGrid
* GetPropertyGrid() const
1491 return (const wxPropertyGrid
*) m_pState
->GetGrid();
1493 #endif // #ifndef SWIG
1495 friend class wxPropertyGrid
;
1496 friend class wxPropertyGridManager
;
1499 #endif // wxUSE_PROPGRID
1501 #endif // __WX_PROPGRID_PROPGRIDIFACE_H__