]> git.saurik.com Git - wxWidgets.git/blob - include/wx/propgrid/propgridiface.h
Basic support for tooltips under OS X Cocoa.
[wxWidgets.git] / include / wx / propgrid / propgridiface.h
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: wx/propgeid/propgridiface.h
3 // Purpose: wxPropertyGridInterface class
4 // Author: Jaakko Salli
5 // Modified by:
6 // Created: 2008-08-24
7 // RCS-ID: $Id$
8 // Copyright: (c) Jaakko Salli
9 // Licence: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
11
12 #ifndef __WX_PROPGRID_PROPGRIDIFACE_H__
13 #define __WX_PROPGRID_PROPGRIDIFACE_H__
14
15 #if wxUSE_PROPGRID
16
17 #include "wx/propgrid/property.h"
18 #include "wx/propgrid/propgridpagestate.h"
19
20 // -----------------------------------------------------------------------
21
22 /** @section wxPGPropArgCls
23
24 Most property grid functions have this type as their argument, as it can
25 convey a property by either a pointer or name.
26 */
27 class WXDLLIMPEXP_PROPGRID wxPGPropArgCls
28 {
29 public:
30 wxPGPropArgCls() { }
31 wxPGPropArgCls( const wxPGProperty* property )
32 {
33 m_ptr.property = (wxPGProperty*) property;
34 m_flags = IsProperty;
35 }
36 wxPGPropArgCls( const wxString& str )
37 {
38 m_ptr.stringName = &str;
39 m_flags = IsWxString;
40 }
41 wxPGPropArgCls( const wxPGPropArgCls& id )
42 {
43 m_ptr = id.m_ptr;
44 m_flags = id.m_flags;
45 }
46 // This is only needed for wxPython bindings
47 wxPGPropArgCls( wxString* str, bool WXUNUSED(deallocPtr) )
48 {
49 m_ptr.stringName = str;
50 m_flags = IsWxString | OwnsWxString;
51 }
52 ~wxPGPropArgCls()
53 {
54 if ( m_flags & OwnsWxString )
55 delete m_ptr.stringName;
56 }
57 wxPGProperty* GetPtr() const
58 {
59 wxCHECK( m_flags == IsProperty, NULL );
60 return m_ptr.property;
61 }
62 wxPGPropArgCls( const char* str )
63 {
64 m_ptr.charName = str;
65 m_flags = IsCharPtr;
66 }
67 #if wxUSE_WCHAR_T
68 wxPGPropArgCls( const wchar_t* str )
69 {
70 m_ptr.wcharName = str;
71 m_flags = IsWCharPtr;
72 }
73 #endif
74 /** This constructor is required for NULL. */
75 wxPGPropArgCls( int )
76 {
77 m_ptr.property = NULL;
78 m_flags = IsProperty;
79 }
80 wxPGProperty* GetPtr( wxPropertyGridInterface* iface ) const;
81 wxPGProperty* GetPtr( const wxPropertyGridInterface* iface ) const
82 {
83 return GetPtr((wxPropertyGridInterface*)iface);
84 }
85 wxPGProperty* GetPtr0() const { return m_ptr.property; }
86 bool HasName() const { return (m_flags != IsProperty); }
87 const wxString& GetName() const { return *m_ptr.stringName; }
88 private:
89
90 enum
91 {
92 IsProperty = 0x00,
93 IsWxString = 0x01,
94 IsCharPtr = 0x02,
95 IsWCharPtr = 0x04,
96 OwnsWxString = 0x10
97 };
98
99 union
100 {
101 wxPGProperty* property;
102 const char* charName;
103 #if wxUSE_WCHAR_T
104 const wchar_t* wcharName;
105 #endif
106 const wxString* stringName;
107 } m_ptr;
108 unsigned char m_flags;
109 };
110
111 typedef const wxPGPropArgCls& wxPGPropArg;
112
113 // -----------------------------------------------------------------------
114
115 WXDLLIMPEXP_PROPGRID
116 void wxPGTypeOperationFailed( const wxPGProperty* p,
117 const wxString& typestr,
118 const wxString& op );
119 WXDLLIMPEXP_PROPGRID
120 void wxPGGetFailed( const wxPGProperty* p, const wxString& typestr );
121
122 // -----------------------------------------------------------------------
123
124 // Helper macro that does necessary preparations when calling
125 // some wxPGProperty's member function.
126 #define wxPG_PROP_ARG_CALL_PROLOG_0(PROPERTY) \
127 PROPERTY *p = (PROPERTY*)id.GetPtr(this); \
128 if ( !p ) return;
129
130 #define wxPG_PROP_ARG_CALL_PROLOG_RETVAL_0(PROPERTY, RETVAL) \
131 PROPERTY *p = (PROPERTY*)id.GetPtr(this); \
132 if ( !p ) return RETVAL;
133
134 #define wxPG_PROP_ARG_CALL_PROLOG() \
135 wxPG_PROP_ARG_CALL_PROLOG_0(wxPGProperty)
136
137 #define wxPG_PROP_ARG_CALL_PROLOG_RETVAL(RVAL) \
138 wxPG_PROP_ARG_CALL_PROLOG_RETVAL_0(wxPGProperty, RVAL)
139
140 #define wxPG_PROP_ID_CONST_CALL_PROLOG() \
141 wxPG_PROP_ARG_CALL_PROLOG_0(const wxPGProperty)
142
143 #define wxPG_PROP_ID_CONST_CALL_PROLOG_RETVAL(RVAL) \
144 wxPG_PROP_ARG_CALL_PROLOG_RETVAL_0(const wxPGProperty, RVAL)
145
146 // -----------------------------------------------------------------------
147
148
149 /** @class wxPropertyGridInterface
150
151 Most of the shared property manipulation interface shared by wxPropertyGrid,
152 wxPropertyGridPage, and wxPropertyGridManager is defined in this class.
153
154 @remarks
155 - In separate wxPropertyGrid component this class was known as
156 wxPropertyContainerMethods.
157
158 @library{wxpropgrid}
159 @category{propgrid}
160 */
161 class WXDLLIMPEXP_PROPGRID wxPropertyGridInterface
162 {
163 public:
164
165 /** Destructor */
166 virtual ~wxPropertyGridInterface() { }
167
168 /**
169 Appends property to the list.
170
171 wxPropertyGrid assumes ownership of the object.
172 Becomes child of most recently added category.
173 @remarks
174 - wxPropertyGrid takes the ownership of the property pointer.
175 - If appending a category with name identical to a category already in
176 the wxPropertyGrid, then newly created category is deleted, and most
177 recently added category (under which properties are appended) is set
178 to the one with same name. This allows easier adding of items to same
179 categories in multiple passes.
180 - Does not automatically redraw the control, so you may need to call
181 Refresh when calling this function after control has been shown for
182 the first time.
183 */
184 wxPGProperty* Append( wxPGProperty* property );
185
186 wxPGProperty* AppendIn( wxPGPropArg id, wxPGProperty* newproperty );
187
188 /**
189 In order to add new items into a property with fixed children (for
190 instance, wxFlagsProperty), you need to call this method. After
191 populating has been finished, you need to call EndAddChildren.
192 */
193 void BeginAddChildren( wxPGPropArg id );
194
195 /** Deletes all properties.
196 */
197 virtual void Clear() = 0;
198
199 /**
200 Clears current selection, if any.
201
202 @param validation
203 If set to @false, deselecting the property will always work,
204 even if its editor had invalid value in it.
205
206 @return Returns @true if successful or if there was no selection. May
207 fail if validation was enabled and active editor had invalid
208 value.
209
210 @remarks In wxPropertyGrid 1.4, this member function used to send
211 wxPG_EVT_SELECTED. In wxWidgets 2.9 and later, it no longer
212 does that.
213 */
214 bool ClearSelection( bool validation = false );
215
216 /** Resets modified status of all properties.
217 */
218 void ClearModifiedStatus();
219
220 /** Collapses given category or property with children.
221 Returns true if actually collapses.
222 */
223 bool Collapse( wxPGPropArg id );
224
225 /** Collapses all items that can be collapsed.
226
227 @return
228 Return false if failed (may fail if editor value cannot be validated).
229 */
230 bool CollapseAll() { return ExpandAll(false); }
231
232 /**
233 Changes value of a property, as if from an editor.
234 Use this instead of SetPropertyValue() if you need the value to run
235 through validation process, and also send the property change event.
236
237 @return
238 Returns true if value was successfully changed.
239 */
240 bool ChangePropertyValue( wxPGPropArg id, wxVariant newValue );
241
242 /**
243 Deletes a property by id. If category is deleted, all children are
244 automatically deleted as well.
245 */
246 void DeleteProperty( wxPGPropArg id );
247
248 /**
249 Removes and returns a property.
250
251 @param id
252 Pointer or name of a property.
253
254 @remarks Removed property cannot have any children.
255 */
256 wxPGProperty* RemoveProperty( wxPGPropArg id );
257
258 /** Disables property. */
259 bool DisableProperty( wxPGPropArg id ) { return EnableProperty(id,false); }
260
261 /**
262 Returns true if all property grid data changes have been committed.
263
264 Usually only returns false if value in active editor has been
265 invalidated by a wxValidator.
266 */
267 bool EditorValidate();
268
269 /**
270 Enables or disables property, depending on whether enable is true or
271 false.
272 */
273 bool EnableProperty( wxPGPropArg id, bool enable = true );
274
275 /** Called after population of property with fixed children has finished.
276 */
277 void EndAddChildren( wxPGPropArg id );
278
279 /** Expands given category or property with children.
280 Returns true if actually expands.
281 */
282 bool Expand( wxPGPropArg id );
283
284 /** Expands all items that can be expanded.
285 */
286 bool ExpandAll( bool expand = true );
287
288 /** Returns id of first child of given property.
289 @remarks
290 Does not return sub-properties!
291 */
292 wxPGProperty* GetFirstChild( wxPGPropArg id )
293 {
294 wxPG_PROP_ARG_CALL_PROLOG_RETVAL(wxNullProperty)
295
296 if ( !p->GetChildCount() || p->HasFlag(wxPG_PROP_AGGREGATE) )
297 return wxNullProperty;
298
299 return p->Item(0);
300 }
301
302 //@{
303 /** Returns iterator class instance.
304 @param flags
305 See @ref propgrid_iterator_flags. Value wxPG_ITERATE_DEFAULT causes
306 iteration over everything except private child properties.
307 @param firstProp
308 Property to start iteration from. If NULL, then first child of root
309 is used.
310 @param startPos
311 Either wxTOP or wxBOTTOM. wxTOP will indicate that iterations start
312 from the first property from the top, and wxBOTTOM means that the
313 iteration will instead begin from bottommost valid item.
314 */
315 wxPropertyGridIterator GetIterator( int flags = wxPG_ITERATE_DEFAULT,
316 wxPGProperty* firstProp = NULL )
317 {
318 return wxPropertyGridIterator( m_pState, flags, firstProp );
319 }
320
321 wxPropertyGridConstIterator
322 GetIterator( int flags = wxPG_ITERATE_DEFAULT,
323 wxPGProperty* firstProp = NULL ) const
324 {
325 return wxPropertyGridConstIterator( m_pState, flags, firstProp );
326 }
327
328 wxPropertyGridIterator GetIterator( int flags, int startPos )
329 {
330 return wxPropertyGridIterator( m_pState, flags, startPos );
331 }
332
333 wxPropertyGridConstIterator GetIterator( int flags, int startPos ) const
334 {
335 return wxPropertyGridConstIterator( m_pState, flags, startPos );
336 }
337 //@}
338
339 /** Returns id of first item, whether it is a category or property.
340 @param flags
341 @link iteratorflags List of iterator flags@endlink
342 */
343 wxPGProperty* GetFirst( int flags = wxPG_ITERATE_ALL )
344 {
345 wxPropertyGridIterator it( m_pState, flags, wxNullProperty, 1 );
346 return *it;
347 }
348
349 const wxPGProperty* GetFirst( int flags = wxPG_ITERATE_ALL ) const
350 {
351 return ((wxPropertyGridInterface*)this)->GetFirst(flags);
352 }
353
354 /**
355 Returns pointer to a property with given name (case-sensitive).
356 If there is no property with such name, @NULL pointer is returned.
357
358 @remarks Properties which have non-category, non-root parent
359 can not be accessed globally by their name. Instead, use
360 "<property>.<subproperty>" instead of "<subproperty>".
361 */
362 wxPGProperty* GetProperty( const wxString& name ) const
363 {
364 return GetPropertyByName(name);
365 }
366
367 /** Returns map-like storage of property's attributes.
368 @remarks
369 Note that if extra style wxPG_EX_WRITEONLY_BUILTIN_ATTRIBUTES is set,
370 then builtin-attributes are not included in the storage.
371 */
372 const wxPGAttributeStorage& GetPropertyAttributes( wxPGPropArg id ) const
373 {
374 // If 'id' refers to invalid property, then we will return dummy
375 // attributes (ie. root property's attributes, which contents should
376 // should always be empty and of no consequence).
377 wxPG_PROP_ARG_CALL_PROLOG_RETVAL(m_pState->DoGetRoot()->GetAttributes());
378 return p->GetAttributes();
379 }
380
381 /** Adds to 'targetArr' pointers to properties that have given
382 flags 'flags' set. However, if 'inverse' is set to true, then
383 only properties without given flags are stored.
384 @param flags
385 Property flags to use.
386 @param iterFlags
387 Iterator flags to use. Default is everything expect private children.
388 */
389 void GetPropertiesWithFlag( wxArrayPGProperty* targetArr,
390 wxPGProperty::FlagType flags,
391 bool inverse = false,
392 int iterFlags = wxPG_ITERATE_PROPERTIES |
393 wxPG_ITERATE_HIDDEN |
394 wxPG_ITERATE_CATEGORIES) const;
395
396 /** Returns value of given attribute. If none found, returns NULL-variant.
397 */
398 wxVariant GetPropertyAttribute( wxPGPropArg id,
399 const wxString& attrName ) const
400 {
401 wxPG_PROP_ARG_CALL_PROLOG_RETVAL(wxNullVariant)
402 return p->GetAttribute(attrName);
403 }
404
405 /** Returns pointer of property's nearest parent category. If no category
406 found, returns NULL.
407 */
408 wxPropertyCategory* GetPropertyCategory( wxPGPropArg id ) const
409 {
410 wxPG_PROP_ID_CONST_CALL_PROLOG_RETVAL(NULL)
411 return m_pState->GetPropertyCategory(p);
412 }
413
414 /** Returns client data (void*) of a property. */
415 void* GetPropertyClientData( wxPGPropArg id ) const
416 {
417 wxPG_PROP_ARG_CALL_PROLOG_RETVAL(NULL)
418 return p->GetClientData();
419 }
420
421 /**
422 Returns first property which label matches given string.
423
424 NULL if none found. Note that this operation is extremely slow when
425 compared to GetPropertyByName().
426 */
427 wxPGProperty* GetPropertyByLabel( const wxString& label ) const;
428
429 /** Returns property with given name. NULL if none found.
430 */
431 wxPGProperty* GetPropertyByName( const wxString& name ) const;
432
433 /** Returns child property 'subname' of property 'name'. Same as
434 calling GetPropertyByName("name.subname"), albeit slightly faster.
435 */
436 wxPGProperty* GetPropertyByName( const wxString& name,
437 const wxString& subname ) const;
438
439 /** Returns property's editor. */
440 const wxPGEditor* GetPropertyEditor( wxPGPropArg id ) const
441 {
442 wxPG_PROP_ARG_CALL_PROLOG_RETVAL(NULL)
443 return p->GetEditorClass();
444 }
445
446 /** Returns help string associated with a property. */
447 wxString GetPropertyHelpString( wxPGPropArg id ) const
448 {
449 wxPG_PROP_ARG_CALL_PROLOG_RETVAL(m_emptyString)
450 return p->GetHelpString();
451 }
452
453 /** Returns property's custom value image (NULL of none). */
454 wxBitmap* GetPropertyImage( wxPGPropArg id ) const
455 {
456 wxPG_PROP_ARG_CALL_PROLOG_RETVAL(NULL)
457 return p->GetValueImage();
458 }
459
460 /** Returns label of a property. */
461 const wxString& GetPropertyLabel( wxPGPropArg id )
462 {
463 wxPG_PROP_ARG_CALL_PROLOG_RETVAL(m_emptyString)
464 return p->GetLabel();
465 }
466
467 /** Returns name of a property, by which it is globally accessible. */
468 wxString GetPropertyName( wxPGProperty* property )
469 {
470 return property->GetName();
471 }
472
473 /** Returns parent item of a property. */
474 wxPGProperty* GetPropertyParent( wxPGPropArg id )
475 {
476 wxPG_PROP_ARG_CALL_PROLOG_RETVAL(wxNullProperty)
477 return p->GetParent();
478 }
479
480 #if wxUSE_VALIDATORS
481 /** Returns validator of a property as a reference, which you
482 can pass to any number of SetPropertyValidator.
483 */
484 wxValidator* GetPropertyValidator( wxPGPropArg id )
485 {
486 wxPG_PROP_ARG_CALL_PROLOG_RETVAL(NULL)
487 return p->GetValidator();
488 }
489 #endif
490
491 /** Returns value as wxVariant. To get wxObject pointer from it,
492 you will have to use WX_PG_VARIANT_TO_WXOBJECT(VARIANT,CLASSNAME) macro.
493
494 If property value is unspecified, Null variant is returned.
495 */
496 wxVariant GetPropertyValue( wxPGPropArg id )
497 {
498 wxPG_PROP_ARG_CALL_PROLOG_RETVAL(wxVariant())
499 return p->GetValue();
500 }
501
502 wxString GetPropertyValueAsString( wxPGPropArg id ) const;
503 long GetPropertyValueAsLong( wxPGPropArg id ) const;
504 unsigned long GetPropertyValueAsULong( wxPGPropArg id ) const
505 {
506 return (unsigned long) GetPropertyValueAsLong(id);
507 }
508 int GetPropertyValueAsInt( wxPGPropArg id ) const
509 { return (int)GetPropertyValueAsLong(id); }
510 bool GetPropertyValueAsBool( wxPGPropArg id ) const;
511 double GetPropertyValueAsDouble( wxPGPropArg id ) const;
512
513 #define wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL(TYPENAME, DEFVAL) \
514 wxPG_PROP_ARG_CALL_PROLOG_RETVAL(DEFVAL) \
515 wxString typeName(wxS(TYPENAME)); \
516 wxVariant value = p->GetValue(); \
517 if ( value.GetType() != typeName ) \
518 { \
519 wxPGGetFailed(p, typeName); \
520 return DEFVAL; \
521 }
522
523 #define wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL_WFALLBACK(TYPENAME, DEFVAL) \
524 wxPG_PROP_ARG_CALL_PROLOG_RETVAL(DEFVAL) \
525 wxVariant value = p->GetValue(); \
526 if ( value.GetType() != wxS(TYPENAME) ) \
527 return DEFVAL; \
528
529 wxArrayString GetPropertyValueAsArrayString( wxPGPropArg id ) const
530 {
531 wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL("arrstring",
532 wxArrayString())
533 return value.GetArrayString();
534 }
535
536 #ifdef wxLongLong_t
537 wxLongLong_t GetPropertyValueAsLongLong( wxPGPropArg id ) const
538 {
539 wxPG_PROP_ARG_CALL_PROLOG_RETVAL(0)
540 return p->GetValue().GetLongLong().GetValue();
541 }
542
543 wxULongLong_t GetPropertyValueAsULongLong( wxPGPropArg id ) const
544 {
545 wxPG_PROP_ARG_CALL_PROLOG_RETVAL(0)
546 return p->GetValue().GetULongLong().GetValue();
547 }
548 #endif
549
550 wxArrayInt GetPropertyValueAsArrayInt( wxPGPropArg id ) const
551 {
552 wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL("wxArrayInt",
553 wxArrayInt())
554 wxArrayInt arr;
555 arr << value;
556 return arr;
557 }
558
559 #if wxUSE_DATETIME
560 wxDateTime GetPropertyValueAsDateTime( wxPGPropArg id ) const
561 {
562 wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL("datetime",
563 wxDateTime())
564 return value.GetDateTime();
565 }
566 #endif
567
568 /** Returns a wxVariant list containing wxVariant versions of all
569 property values. Order is not guaranteed.
570 @param flags
571 Use wxPG_KEEP_STRUCTURE to retain category structure; each sub
572 category will be its own wxVariantList of wxVariant.
573 Use wxPG_INC_ATTRIBUTES to include property attributes as well.
574 Each attribute will be stored as list variant named
575 "@@<propname>@@attr."
576 @remarks
577 */
578 wxVariant GetPropertyValues( const wxString& listname = wxEmptyString,
579 wxPGProperty* baseparent = NULL, long flags = 0 ) const
580 {
581 return m_pState->DoGetPropertyValues(listname, baseparent, flags);
582 }
583
584 /**
585 Returns currently selected property. NULL if none.
586
587 @remarks When wxPG_EX_MULTIPLE_SELECTION extra style is used, this
588 member function returns the focused property, that is the
589 one which can have active editor.
590 */
591 wxPGProperty* GetSelection() const;
592
593 /**
594 Returns list of currently selected properties.
595
596 @remarks wxArrayPGProperty should be compatible with std::vector API.
597 */
598 const wxArrayPGProperty& GetSelectedProperties() const
599 {
600 return m_pState->m_selection;
601 }
602
603 wxPropertyGridPageState* GetState() const { return m_pState; }
604
605 /** Similar to GetIterator(), but instead returns wxPGVIterator instance,
606 which can be useful for forward-iterating through arbitrary property
607 containers.
608
609 @param flags
610 See @ref propgrid_iterator_flags.
611 */
612 virtual wxPGVIterator GetVIterator( int flags ) const;
613
614 /** Hides or reveals a property.
615 @param hide
616 If true, hides property, otherwise reveals it.
617 @param flags
618 By default changes are applied recursively. Set this paramter
619 wxPG_DONT_RECURSE to prevent this.
620 */
621 bool HideProperty( wxPGPropArg id,
622 bool hide = true,
623 int flags = wxPG_RECURSE );
624
625 #if wxPG_INCLUDE_ADVPROPS
626 /** Initializes *all* property types. Causes references to most object
627 files in the library, so calling this may cause significant increase
628 in executable size when linking with static library.
629 */
630 static void InitAllTypeHandlers();
631 #else
632 static void InitAllTypeHandlers() { }
633 #endif
634
635 //@{
636 /** Inserts property to the property container.
637
638 @param priorThis
639 New property is inserted just prior to this. Available only
640 in the first variant. There are two versions of this function
641 to allow this parameter to be either an id or name to
642 a property.
643
644 @param newproperty
645 Pointer to the inserted property. wxPropertyGrid will take
646 ownership of this object.
647
648 @param parent
649 New property is inserted under this category. Available only
650 in the second variant. There are two versions of this function
651 to allow this parameter to be either an id or name to
652 a property.
653
654 @param index
655 Index under category. Available only in the second variant.
656 If index is < 0, property is appended in category.
657
658 @return
659 Returns id for the property,
660
661 @remarks
662
663 - wxPropertyGrid takes the ownership of the property pointer.
664
665 - While Append may be faster way to add items, make note that when
666 both types of data storage (categoric and
667 non-categoric) are active, Insert becomes even more slow. This is
668 especially true if current mode is non-categoric.
669
670 Example of use:
671
672 @code
673
674 // append category
675 wxPGProperty* my_cat_id = propertygrid->Append(
676 new wxPropertyCategory("My Category") );
677
678 ...
679
680 // insert into category - using second variant
681 wxPGProperty* my_item_id_1 = propertygrid->Insert(
682 my_cat_id, 0, new wxStringProperty("My String 1") );
683
684 // insert before to first item - using first variant
685 wxPGProperty* my_item_id_2 = propertygrid->Insert(
686 my_item_id, new wxStringProperty("My String 2") );
687
688 @endcode
689
690 */
691 wxPGProperty* Insert( wxPGPropArg priorThis, wxPGProperty* newproperty );
692 wxPGProperty* Insert( wxPGPropArg parent,
693 int index,
694 wxPGProperty* newproperty );
695 //@}
696
697 /** Returns true if property is a category. */
698 bool IsPropertyCategory( wxPGPropArg id ) const
699 {
700 wxPG_PROP_ARG_CALL_PROLOG_RETVAL(false)
701 return p->IsCategory();
702 }
703
704 /** Returns true if property is enabled. */
705 bool IsPropertyEnabled( wxPGPropArg id ) const
706 {
707 wxPG_PROP_ARG_CALL_PROLOG_RETVAL(false)
708 return (!(p->GetFlags() & wxPG_PROP_DISABLED))?true:false;
709 }
710
711 /**
712 Returns true if given property is expanded.
713
714 Naturally, always returns false for properties that cannot be expanded.
715 */
716 bool IsPropertyExpanded( wxPGPropArg id ) const;
717
718 /**
719 Returns true if property has been modified after value set or modify
720 flag clear by software.
721 */
722 bool IsPropertyModified( wxPGPropArg id ) const
723 {
724 wxPG_PROP_ARG_CALL_PROLOG_RETVAL(false)
725 return ( (p->GetFlags() & wxPG_PROP_MODIFIED) ? true : false );
726 }
727
728 /**
729 Returns true if property is selected.
730 */
731 bool IsPropertySelected( wxPGPropArg id ) const
732 {
733 wxPG_PROP_ARG_CALL_PROLOG_RETVAL(false)
734 return m_pState->DoIsPropertySelected(p);
735 }
736
737 /**
738 Returns true if property is shown (ie hideproperty with true not
739 called for it).
740 */
741 bool IsPropertyShown( wxPGPropArg id ) const
742 {
743 wxPG_PROP_ARG_CALL_PROLOG_RETVAL(false)
744 return (!(p->GetFlags() & wxPG_PROP_HIDDEN))?true:false;
745 }
746
747 /** Returns true if property value is set to unspecified.
748 */
749 bool IsPropertyValueUnspecified( wxPGPropArg id ) const
750 {
751 wxPG_PROP_ARG_CALL_PROLOG_RETVAL(false)
752 return p->IsValueUnspecified();
753 }
754
755 /**
756 Disables (limit = true) or enables (limit = false) wxTextCtrl editor of
757 a property, if it is not the sole mean to edit the value.
758 */
759 void LimitPropertyEditing( wxPGPropArg id, bool limit = true );
760
761 /** If state is shown in it's grid, refresh it now.
762 */
763 virtual void RefreshGrid( wxPropertyGridPageState* state = NULL );
764
765 #if wxPG_INCLUDE_ADVPROPS
766 /**
767 Initializes additional property editors (SpinCtrl etc.). Causes
768 references to most object files in the library, so calling this may
769 cause significant increase in executable size when linking with static
770 library.
771 */
772 static void RegisterAdditionalEditors();
773 #else
774 static void RegisterAdditionalEditors() { }
775 #endif
776
777 /** Replaces property with id with newly created property. For example,
778 this code replaces existing property named "Flags" with one that
779 will have different set of items:
780 @code
781 pg->ReplaceProperty("Flags",
782 wxFlagsProperty("Flags", wxPG_LABEL, newItems))
783 @endcode
784 For more info, see wxPropertyGrid::Insert.
785 */
786 wxPGProperty* ReplaceProperty( wxPGPropArg id, wxPGProperty* property );
787
788 /** @anchor propgridinterface_editablestate_flags
789
790 Flags for wxPropertyGridInterface::SaveEditableState() and
791 wxPropertyGridInterface::RestoreEditableState().
792 */
793 enum EditableStateFlags
794 {
795 /** Include selected property. */
796 SelectionState = 0x01,
797 /** Include expanded/collapsed property information. */
798 ExpandedState = 0x02,
799 /** Include scrolled position. */
800 ScrollPosState = 0x04,
801 /** Include selected page information.
802 Only applies to wxPropertyGridManager. */
803 PageState = 0x08,
804 /** Include splitter position. Stored for each page. */
805 SplitterPosState = 0x10,
806 /** Include description box size.
807 Only applies to wxPropertyGridManager. */
808 DescBoxState = 0x20,
809
810 /**
811 Include all supported user editable state information.
812 This is usually the default value. */
813 AllStates = SelectionState |
814 ExpandedState |
815 ScrollPosState |
816 PageState |
817 SplitterPosState |
818 DescBoxState
819 };
820
821 /**
822 Restores user-editable state.
823
824 See also wxPropertyGridInterface::SaveEditableState().
825
826 @param src
827 String generated by SaveEditableState.
828
829 @param restoreStates
830 Which parts to restore from source string. See @ref
831 propgridinterface_editablestate_flags "list of editable state
832 flags".
833
834 @return
835 False if there was problem reading the string.
836
837 @remarks
838 If some parts of state (such as scrolled or splitter position) fail to
839 restore correctly, please make sure that you call this function after
840 wxPropertyGrid size has been set (this may sometimes be tricky when
841 sizers are used).
842 */
843 bool RestoreEditableState( const wxString& src,
844 int restoreStates = AllStates );
845
846 /**
847 Used to acquire user-editable state (selected property, expanded
848 properties, scrolled position, splitter positions).
849
850 @param includedStates
851 Which parts of state to include. See @ref
852 propgridinterface_editablestate_flags "list of editable state flags".
853 */
854 wxString SaveEditableState( int includedStates = AllStates ) const;
855
856 /**
857 Lets user to set the strings listed in the choice dropdown of a
858 wxBoolProperty. Defaults are "True" and "False", so changing them to,
859 say, "Yes" and "No" may be useful in some less technical applications.
860 */
861 static void SetBoolChoices( const wxString& trueChoice,
862 const wxString& falseChoice );
863
864 /** Sets an attribute for this property.
865 @param name
866 Text identifier of attribute. See @ref propgrid_property_attributes.
867 @param value
868 Value of attribute.
869 @param argFlags
870 Optional. Use wxPG_RECURSE to set the attribute to child properties
871 recursively.
872 */
873 void SetPropertyAttribute( wxPGPropArg id,
874 const wxString& attrName,
875 wxVariant value,
876 long argFlags = 0 )
877 {
878 DoSetPropertyAttribute(id,attrName,value,argFlags);
879 }
880
881 /** Sets property attribute for all applicapple properties.
882 Be sure to use this method only after all properties have been
883 added to the grid.
884 */
885 void SetPropertyAttributeAll( const wxString& attrName, wxVariant value );
886
887 /**
888 Sets background colour of a property.
889
890 @param id
891 Property name or pointer.
892
893 @param colour
894 New background colour.
895
896 @param flags
897 Default is wxPG_RECURSE which causes colour to be set recursively.
898 Omit this flag to only set colour for the property in question
899 and not any of its children.
900 */
901 void SetPropertyBackgroundColour( wxPGPropArg id,
902 const wxColour& colour,
903 int flags = wxPG_RECURSE );
904
905 /** Resets text and background colours of given property.
906 */
907 void SetPropertyColoursToDefault( wxPGPropArg id );
908
909 /**
910 Sets text colour of a property.
911
912 @param id
913 Property name or pointer.
914
915 @param colour
916 New background colour.
917
918 @param flags
919 Default is wxPG_RECURSE which causes colour to be set recursively.
920 Omit this flag to only set colour for the property in question
921 and not any of its children.
922 */
923 void SetPropertyTextColour( wxPGPropArg id,
924 const wxColour& col,
925 int flags = wxPG_RECURSE );
926
927 /**
928 Returns background colour of first cell of a property.
929 */
930 wxColour GetPropertyBackgroundColour( wxPGPropArg id ) const
931 {
932 wxPG_PROP_ARG_CALL_PROLOG_RETVAL(wxColour())
933 return p->GetCell(0).GetBgCol();
934 }
935
936 /**
937 Returns text colour of first cell of a property.
938 */
939 wxColour GetPropertyTextColour( wxPGPropArg id ) const
940 {
941 wxPG_PROP_ARG_CALL_PROLOG_RETVAL(wxColour())
942 return p->GetCell(0).GetFgCol();
943 }
944
945 /** Sets text, bitmap, and colours for given column's cell.
946
947 @remarks
948 - You can set label cell by setting column to 0.
949 - You can use wxPG_LABEL as text to use default text for column.
950 */
951 void SetPropertyCell( wxPGPropArg id,
952 int column,
953 const wxString& text = wxEmptyString,
954 const wxBitmap& bitmap = wxNullBitmap,
955 const wxColour& fgCol = wxNullColour,
956 const wxColour& bgCol = wxNullColour );
957
958 /** Sets client data (void*) of a property.
959 @remarks
960 This untyped client data has to be deleted manually.
961 */
962 void SetPropertyClientData( wxPGPropArg id, void* clientData )
963 {
964 wxPG_PROP_ARG_CALL_PROLOG()
965 p->SetClientData(clientData);
966 }
967
968 /** Sets editor for a property.
969
970 @param editor
971 For builtin editors, use wxPGEditor_X, where X is builtin editor's
972 name (TextCtrl, Choice, etc. see wxPGEditor documentation for full
973 list).
974
975 For custom editors, use pointer you received from
976 wxPropertyGrid::RegisterEditorClass().
977 */
978 void SetPropertyEditor( wxPGPropArg id, const wxPGEditor* editor )
979 {
980 wxPG_PROP_ARG_CALL_PROLOG()
981 wxCHECK_RET( editor, wxT("unknown/NULL editor") );
982 p->SetEditor(editor);
983 RefreshProperty(p);
984 }
985
986 /** Sets editor control of a property. As editor argument, use
987 editor name string, such as "TextCtrl" or "Choice".
988 */
989 void SetPropertyEditor( wxPGPropArg id, const wxString& editorName )
990 {
991 SetPropertyEditor(id,GetEditorByName(editorName));
992 }
993
994 /** Sets label of a property.
995 */
996 void SetPropertyLabel( wxPGPropArg id, const wxString& newproplabel );
997
998 /**
999 Sets name of a property.
1000
1001 @param id
1002 Name or pointer of property which name to change.
1003
1004 @param newName
1005 New name for property.
1006 */
1007 void SetPropertyName( wxPGPropArg id, const wxString& newName )
1008 {
1009 wxPG_PROP_ARG_CALL_PROLOG()
1010 m_pState->DoSetPropertyName( p, newName );
1011 }
1012
1013 /**
1014 Sets property (and, recursively, its children) to have read-only value.
1015 In other words, user cannot change the value in the editor, but they
1016 can still copy it.
1017 @remarks
1018 This is mainly for use with textctrl editor. Not all other editors fully
1019 support it.
1020 @param flags
1021 By default changes are applied recursively. Set this paramter
1022 wxPG_DONT_RECURSE to prevent this.
1023 */
1024 void SetPropertyReadOnly( wxPGPropArg id,
1025 bool set = true,
1026 int flags = wxPG_RECURSE )
1027 {
1028 wxPG_PROP_ARG_CALL_PROLOG()
1029 if ( flags & wxPG_RECURSE )
1030 p->SetFlagRecursively(wxPG_PROP_READONLY, set);
1031 else
1032 p->ChangeFlag(wxPG_PROP_READONLY, set);
1033 }
1034
1035 /** Sets property's value to unspecified.
1036 If it has children (it may be category), then the same thing is done to
1037 them.
1038 */
1039 void SetPropertyValueUnspecified( wxPGPropArg id )
1040 {
1041 wxPG_PROP_ARG_CALL_PROLOG()
1042 p->SetValueToUnspecified();
1043 }
1044
1045 /**
1046 Sets property values from a list of wxVariants.
1047 */
1048 void SetPropertyValues( const wxVariantList& list,
1049 wxPGPropArg defaultCategory = wxNullProperty )
1050 {
1051 wxPGProperty *p;
1052 if ( defaultCategory.HasName() ) p = defaultCategory.GetPtr(this);
1053 else p = defaultCategory.GetPtr0();
1054 m_pState->DoSetPropertyValues(list, p);
1055 }
1056
1057 /**
1058 Sets property values from a list of wxVariants.
1059 */
1060 void SetPropertyValues( const wxVariant& list,
1061 wxPGPropArg defaultCategory = wxNullProperty )
1062 {
1063 SetPropertyValues(list.GetList(),defaultCategory);
1064 }
1065
1066 /** Associates the help string with property.
1067 @remarks
1068 By default, text is shown either in the manager's "description"
1069 text box or in the status bar. If extra window style
1070 wxPG_EX_HELP_AS_TOOLTIPS is used, then the text will appear as a
1071 tooltip.
1072 */
1073 void SetPropertyHelpString( wxPGPropArg id, const wxString& helpString )
1074 {
1075 wxPG_PROP_ARG_CALL_PROLOG()
1076 p->SetHelpString(helpString);
1077 }
1078
1079 /** Set wxBitmap in front of the value.
1080 @remarks
1081 - Bitmap will be scaled to a size returned by
1082 wxPropertyGrid::GetImageSize();
1083 */
1084 void SetPropertyImage( wxPGPropArg id, wxBitmap& bmp )
1085 {
1086 wxPG_PROP_ARG_CALL_PROLOG()
1087 p->SetValueImage(bmp);
1088 RefreshProperty(p);
1089 }
1090
1091 /** Sets max length of property's text.
1092 */
1093 bool SetPropertyMaxLength( wxPGPropArg id, int maxLen );
1094
1095 #if wxUSE_VALIDATORS
1096 /** Sets validator of a property.
1097 */
1098 void SetPropertyValidator( wxPGPropArg id, const wxValidator& validator )
1099 {
1100 wxPG_PROP_ARG_CALL_PROLOG()
1101 p->SetValidator(validator);
1102 }
1103 #endif
1104
1105 /** Sets value (long integer) of a property.
1106 */
1107 void SetPropertyValue( wxPGPropArg id, long value )
1108 {
1109 wxVariant v(value);
1110 SetPropVal( id, v );
1111 }
1112
1113 /** Sets value (integer) of a property.
1114 */
1115 void SetPropertyValue( wxPGPropArg id, int value )
1116 {
1117 wxVariant v((long)value);
1118 SetPropVal( id, v );
1119 }
1120 /** Sets value (floating point) of a property.
1121 */
1122 void SetPropertyValue( wxPGPropArg id, double value )
1123 {
1124 wxVariant v(value);
1125 SetPropVal( id, v );
1126 }
1127 /** Sets value (bool) of a property.
1128 */
1129 void SetPropertyValue( wxPGPropArg id, bool value )
1130 {
1131 wxVariant v(value);
1132 SetPropVal( id, v );
1133 }
1134 #if wxUSE_WCHAR_T
1135 void SetPropertyValue( wxPGPropArg id, const wchar_t* value )
1136 {
1137 SetPropertyValueString( id, wxString(value) );
1138 }
1139 #endif
1140 void SetPropertyValue( wxPGPropArg id, const char* value )
1141 {
1142 SetPropertyValueString( id, wxString(value) );
1143 }
1144 void SetPropertyValue( wxPGPropArg id, const wxString& value )
1145 {
1146 SetPropertyValueString( id, value );
1147 }
1148
1149 /** Sets value (wxArrayString) of a property.
1150 */
1151 void SetPropertyValue( wxPGPropArg id, const wxArrayString& value )
1152 {
1153 wxVariant v(value);
1154 SetPropVal( id, v );
1155 }
1156
1157 #if wxUSE_DATETIME
1158 void SetPropertyValue( wxPGPropArg id, const wxDateTime& value )
1159 {
1160 wxVariant v(value);
1161 SetPropVal( id, v );
1162 }
1163 #endif
1164
1165 /** Sets value (wxObject*) of a property.
1166 */
1167 void SetPropertyValue( wxPGPropArg id, wxObject* value )
1168 {
1169 wxVariant v(value);
1170 SetPropVal( id, v );
1171 }
1172
1173 void SetPropertyValue( wxPGPropArg id, wxObject& value )
1174 {
1175 wxVariant v(&value);
1176 SetPropVal( id, v );
1177 }
1178
1179 #ifdef wxLongLong_t
1180 /** Sets value (wxLongLong&) of a property.
1181 */
1182 void SetPropertyValue( wxPGPropArg id, wxLongLong_t value )
1183 {
1184 wxVariant v = WXVARIANT(wxLongLong(value));
1185 SetPropVal( id, v );
1186 }
1187 /** Sets value (wxULongLong&) of a property.
1188 */
1189 void SetPropertyValue( wxPGPropArg id, wxULongLong_t value )
1190 {
1191 wxVariant v = WXVARIANT(wxULongLong(value));
1192 SetPropVal( id, v );
1193 }
1194 #endif
1195
1196 /** Sets value (wxArrayInt&) of a property.
1197 */
1198 void SetPropertyValue( wxPGPropArg id, const wxArrayInt& value )
1199 {
1200 wxVariant v = WXVARIANT(value);
1201 SetPropVal( id, v );
1202 }
1203
1204 /** Sets value (wxString) of a property.
1205
1206 @remarks
1207 This method uses wxPGProperty::SetValueFromString, which all properties
1208 should implement. This means that there should not be a type error,
1209 and instead the string is converted to property's actual value type.
1210 */
1211 void SetPropertyValueString( wxPGPropArg id, const wxString& value );
1212
1213 /** Sets value (wxVariant&) of a property.
1214
1215 @remarks
1216 Use wxPropertyGrid::ChangePropertyValue() instead if you need to run
1217 through validation process and send property change event.
1218 */
1219 void SetPropertyValue( wxPGPropArg id, wxVariant value )
1220 {
1221 SetPropVal( id, value );
1222 }
1223
1224 /** Sets value (wxVariant&) of a property. Same as SetPropertyValue, but
1225 accepts reference. */
1226 void SetPropVal( wxPGPropArg id, wxVariant& value );
1227
1228 /** Adjusts how wxPropertyGrid behaves when invalid value is entered
1229 in a property.
1230 @param vfbFlags
1231 See @link vfbflags list of valid flags values@endlink
1232 */
1233 void SetValidationFailureBehavior( int vfbFlags );
1234
1235 /**
1236 Sorts all properties recursively.
1237
1238 @param flags
1239 This can contain any of the following options:
1240 wxPG_SORT_TOP_LEVEL_ONLY: Only sort categories and their
1241 immediate children. Sorting done by wxPG_AUTO_SORT option
1242 uses this.
1243
1244 @see SortChildren, wxPropertyGrid::SetSortFunction
1245 */
1246 void Sort( int flags = 0 );
1247
1248 /**
1249 Sorts children of a property.
1250
1251 @param id
1252 Name or pointer to a property.
1253
1254 @param flags
1255 This can contain any of the following options:
1256 wxPG_RECURSE: Sorts recursively.
1257
1258 @see Sort, wxPropertyGrid::SetSortFunction
1259 */
1260 void SortChildren( wxPGPropArg id, int flags = 0 )
1261 {
1262 wxPG_PROP_ARG_CALL_PROLOG()
1263 m_pState->DoSortChildren(p, flags);
1264 }
1265
1266 // GetPropertyByName With nice assertion error message.
1267 wxPGProperty* GetPropertyByNameA( const wxString& name ) const;
1268
1269 static wxPGEditor* GetEditorByName( const wxString& editorName );
1270
1271 // NOTE: This function reselects the property and may cause
1272 // excess flicker, so to just call Refresh() on a rect
1273 // of single property, call DrawItem() instead.
1274 virtual void RefreshProperty( wxPGProperty* p ) = 0;
1275
1276 protected:
1277
1278 bool DoClearSelection( bool validation = false,
1279 int selFlags = 0 );
1280
1281 /**
1282 In derived class, implement to set editable state component with
1283 given name to given value.
1284 */
1285 virtual bool SetEditableStateItem( const wxString& name, wxVariant value )
1286 {
1287 wxUnusedVar(name);
1288 wxUnusedVar(value);
1289 return false;
1290 }
1291
1292 /**
1293 In derived class, implement to return editable state component with
1294 given name.
1295 */
1296 virtual wxVariant GetEditableStateItem( const wxString& name ) const
1297 {
1298 wxUnusedVar(name);
1299 return wxNullVariant;
1300 }
1301
1302 // Returns page state data for given (sub) page (-1 means current page).
1303 virtual wxPropertyGridPageState* GetPageState( int pageIndex ) const
1304 {
1305 if ( pageIndex <= 0 )
1306 return m_pState;
1307 return NULL;
1308 }
1309
1310 virtual bool DoSelectPage( int WXUNUSED(index) ) { return true; }
1311
1312 // Default call's m_pState's BaseGetPropertyByName
1313 virtual wxPGProperty* DoGetPropertyByName( const wxString& name ) const;
1314
1315 // Deriving classes must set this (it must be only or current page).
1316 wxPropertyGridPageState* m_pState;
1317
1318 // Intermediate version needed due to wxVariant copying inefficiency
1319 void DoSetPropertyAttribute( wxPGPropArg id,
1320 const wxString& name,
1321 wxVariant& value, long argFlags );
1322
1323 // Empty string object to return from member functions returning const
1324 // wxString&.
1325 wxString m_emptyString;
1326
1327 private:
1328 // Cannot be GetGrid() due to ambiguity issues.
1329 wxPropertyGrid* GetPropertyGrid()
1330 {
1331 if ( !m_pState )
1332 return NULL;
1333 return m_pState->GetGrid();
1334 }
1335
1336 // Cannot be GetGrid() due to ambiguity issues.
1337 const wxPropertyGrid* GetPropertyGrid() const
1338 {
1339 if ( !m_pState )
1340 return NULL;
1341 return static_cast<const wxPropertyGrid*>(m_pState->GetGrid());
1342 }
1343
1344 friend class wxPropertyGrid;
1345 friend class wxPropertyGridManager;
1346 };
1347
1348 #endif // wxUSE_PROPGRID
1349
1350 #endif // __WX_PROPGRID_PROPGRIDIFACE_H__