]> git.saurik.com Git - wxWidgets.git/blob - include/wx/propgrid/property.h
Fixed various NULL reference issues. Also cleaned up wxPGComboBox code overall a...
[wxWidgets.git] / include / wx / propgrid / property.h
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: wx/propgrid/property.h
3 // Purpose: wxPGProperty and related support classes
4 // Author: Jaakko Salli
5 // Modified by:
6 // Created: 2008-08-23
7 // RCS-ID: $Id$
8 // Copyright: (c) Jaakko Salli
9 // Licence: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
11
12 #ifndef _WX_PROPGRID_PROPERTY_H_
13 #define _WX_PROPGRID_PROPERTY_H_
14
15 #if wxUSE_PROPGRID
16
17 #include "wx/propgrid/propgriddefs.h"
18
19 // -----------------------------------------------------------------------
20
21 #define wxNullProperty ((wxPGProperty*)NULL)
22
23
24 /** @class wxPGPaintData
25
26 Contains information relayed to property's OnCustomPaint.
27 */
28 struct wxPGPaintData
29 {
30 /** wxPropertyGrid. */
31 const wxPropertyGrid* m_parent;
32
33 /**
34 Normally -1, otherwise index to drop-down list item that has to be
35 drawn.
36 */
37 int m_choiceItem;
38
39 /** Set to drawn width in OnCustomPaint (optional). */
40 int m_drawnWidth;
41
42 /**
43 In a measure item call, set this to the height of item at m_choiceItem
44 index.
45 */
46 int m_drawnHeight;
47 };
48
49
50 #ifndef SWIG
51
52
53 // space between vertical sides of a custom image
54 #define wxPG_CUSTOM_IMAGE_SPACINGY 1
55
56 // space between caption and selection rectangle,
57 #define wxPG_CAPRECTXMARGIN 2
58
59 // horizontally and vertically
60 #define wxPG_CAPRECTYMARGIN 1
61
62
63 /** @class wxPGCellRenderer
64
65 Base class for wxPropertyGrid cell renderers.
66 */
67 class WXDLLIMPEXP_PROPGRID wxPGCellRenderer
68 {
69 public:
70
71 wxPGCellRenderer( unsigned int refCount = 1 )
72 : m_refCount(refCount) { }
73 virtual ~wxPGCellRenderer() { }
74
75 // Render flags
76 enum
77 {
78 // We are painting selected item
79 Selected = 0x00010000,
80
81 // We are painting item in choice popup
82 ChoicePopup = 0x00020000,
83
84 // We are rendering wxOwnerDrawnComboBox control
85 // (or other owner drawn control, but that is only
86 // officially supported one ATM).
87 Control = 0x00040000,
88
89 // We are painting a disable property
90 Disabled = 0x00080000,
91
92 // We are painting selected, disabled, or similar
93 // item that dictates fore- and background colours,
94 // overriding any cell values.
95 DontUseCellFgCol = 0x00100000,
96 DontUseCellBgCol = 0x00200000,
97 DontUseCellColours = DontUseCellFgCol |
98 DontUseCellBgCol
99 };
100
101 virtual void Render( wxDC& dc,
102 const wxRect& rect,
103 const wxPropertyGrid* propertyGrid,
104 wxPGProperty* property,
105 int column,
106 int item,
107 int flags ) const = 0;
108
109 /** Returns size of the image in front of the editable area.
110 @remarks
111 If property is NULL, then this call is for a custom value. In that case
112 the item is index to wxPropertyGrid's custom values.
113 */
114 virtual wxSize GetImageSize( const wxPGProperty* property,
115 int column,
116 int item ) const;
117
118 /** Paints property category selection rectangle.
119 */
120 virtual void DrawCaptionSelectionRect( wxDC& dc,
121 int x, int y,
122 int w, int h ) const;
123
124 /** Utility to draw vertically centered text.
125 */
126 void DrawText( wxDC& dc,
127 const wxRect& rect,
128 int imageWidth,
129 const wxString& text ) const;
130
131 /**
132 Utility to draw editor's value, or vertically aligned text if editor is
133 NULL.
134 */
135 void DrawEditorValue( wxDC& dc, const wxRect& rect,
136 int xOffset, const wxString& text,
137 wxPGProperty* property,
138 const wxPGEditor* editor ) const;
139
140 /** Utility to render cell bitmap and set text colour plus bg brush colour.
141
142 Returns image width that, for instance, can be passed to DrawText.
143 */
144 int PreDrawCell( wxDC& dc,
145 const wxRect& rect,
146 const wxPGCell& cell,
147 int flags ) const;
148
149 void IncRef()
150 {
151 m_refCount++;
152 }
153
154 void DecRef()
155 {
156 m_refCount--;
157 if ( !m_refCount )
158 delete this;
159 }
160 protected:
161
162 private:
163 unsigned int m_refCount;
164 };
165
166
167 class WXDLLIMPEXP_PROPGRID wxPGCellData : public wxObjectRefData
168 {
169 friend class wxPGCell;
170 public:
171 wxPGCellData();
172
173 void SetText( const wxString& text )
174 {
175 m_text = text;
176 m_hasValidText = true;
177 }
178 void SetBitmap( const wxBitmap& bitmap ) { m_bitmap = bitmap; }
179 void SetFgCol( const wxColour& col ) { m_fgCol = col; }
180 void SetBgCol( const wxColour& col ) { m_bgCol = col; }
181
182 protected:
183 virtual ~wxPGCellData() { }
184
185 wxString m_text;
186 wxBitmap m_bitmap;
187 wxColour m_fgCol;
188 wxColour m_bgCol;
189
190 // True if m_text is valid and specified
191 bool m_hasValidText;
192 };
193
194 /** @class wxPGCell
195
196 Base class for simple wxPropertyGrid cell information.
197 */
198 class WXDLLIMPEXP_PROPGRID wxPGCell : public wxObject
199 {
200 public:
201 wxPGCell();
202 wxPGCell(const wxPGCell& other)
203 : wxObject(other)
204 {
205 }
206
207 wxPGCell( const wxString& text,
208 const wxBitmap& bitmap = wxNullBitmap,
209 const wxColour& fgCol = wxNullColour,
210 const wxColour& bgCol = wxNullColour );
211
212 virtual ~wxPGCell() { }
213
214 wxPGCellData* GetData()
215 {
216 return (wxPGCellData*) m_refData;
217 }
218
219 const wxPGCellData* GetData() const
220 {
221 return (const wxPGCellData*) m_refData;
222 }
223
224 bool HasText() const
225 {
226 return (m_refData && GetData()->m_hasValidText);
227 }
228
229 /**
230 Merges valid data from srcCell into this.
231 */
232 void MergeFrom( const wxPGCell& srcCell );
233
234 void SetText( const wxString& text );
235 void SetBitmap( const wxBitmap& bitmap );
236 void SetFgCol( const wxColour& col );
237 void SetBgCol( const wxColour& col );
238
239 const wxString& GetText() const { return GetData()->m_text; }
240 const wxBitmap& GetBitmap() const { return GetData()->m_bitmap; }
241 const wxColour& GetFgCol() const { return GetData()->m_fgCol; }
242 const wxColour& GetBgCol() const { return GetData()->m_bgCol; }
243
244 wxPGCell& operator=( const wxPGCell& other )
245 {
246 if ( this != &other )
247 {
248 Ref(other);
249 }
250 return *this;
251 }
252
253 protected:
254 virtual wxObjectRefData *CreateRefData() const
255 { return new wxPGCellData(); }
256
257 virtual wxObjectRefData *CloneRefData(const wxObjectRefData *data) const;
258 };
259
260
261 /** @class wxPGDefaultRenderer
262
263 Default cell renderer, that can handles the common
264 scenarios.
265 */
266 class WXDLLIMPEXP_PROPGRID wxPGDefaultRenderer : public wxPGCellRenderer
267 {
268 public:
269 virtual void Render( wxDC& dc,
270 const wxRect& rect,
271 const wxPropertyGrid* propertyGrid,
272 wxPGProperty* property,
273 int column,
274 int item,
275 int flags ) const;
276
277 virtual wxSize GetImageSize( const wxPGProperty* property,
278 int column,
279 int item ) const;
280
281 protected:
282 };
283
284 // -----------------------------------------------------------------------
285
286 /** @class wxPGAttributeStorage
287
288 wxPGAttributeStorage is somewhat optimized storage for
289 key=variant pairs (ie. a map).
290 */
291 class WXDLLIMPEXP_PROPGRID wxPGAttributeStorage
292 {
293 public:
294 wxPGAttributeStorage();
295 ~wxPGAttributeStorage();
296
297 void Set( const wxString& name, const wxVariant& value );
298 unsigned int GetCount() const { return (unsigned int) m_map.size(); }
299 wxVariant FindValue( const wxString& name ) const
300 {
301 wxPGHashMapS2P::const_iterator it = m_map.find(name);
302 if ( it != m_map.end() )
303 {
304 wxVariantData* data = (wxVariantData*) it->second;
305 data->IncRef();
306 return wxVariant(data, it->first);
307 }
308 return wxVariant();
309 }
310
311 typedef wxPGHashMapS2P::const_iterator const_iterator;
312 const_iterator StartIteration() const
313 {
314 return m_map.begin();
315 }
316 bool GetNext( const_iterator& it, wxVariant& variant ) const
317 {
318 if ( it == m_map.end() )
319 return false;
320
321 wxVariantData* data = (wxVariantData*) it->second;
322 data->IncRef();
323 variant.SetData(data);
324 variant.SetName(it->first);
325 it++;
326 return true;
327 }
328
329 protected:
330 wxPGHashMapS2P m_map;
331 };
332
333 #endif // !SWIG
334
335 // -----------------------------------------------------------------------
336
337 /** @section propgrid_propflags wxPGProperty Flags
338 @{
339 */
340
341 enum wxPG_PROPERTY_FLAGS
342 {
343
344 /** Indicates bold font.
345 */
346 wxPG_PROP_MODIFIED = 0x0001,
347
348 /** Disables ('greyed' text and editor does not activate) property.
349 */
350 wxPG_PROP_DISABLED = 0x0002,
351
352 /** Hider button will hide this property.
353 */
354 wxPG_PROP_HIDDEN = 0x0004,
355
356 /** This property has custom paint image just in front of its value.
357 If property only draws custom images into a popup list, then this
358 flag should not be set.
359 */
360 wxPG_PROP_CUSTOMIMAGE = 0x0008,
361
362 /** Do not create text based editor for this property (but button-triggered
363 dialog and choice are ok).
364 */
365 wxPG_PROP_NOEDITOR = 0x0010,
366
367 /** Property is collapsed, ie. it's children are hidden.
368 */
369 wxPG_PROP_COLLAPSED = 0x0020,
370
371 /**
372 If property is selected, then indicates that validation failed for pending
373 value.
374
375 If property is not selected, then indicates that the the actual property
376 value has failed validation (NB: this behavior is not currently supported,
377 but may be used in future).
378 */
379 wxPG_PROP_INVALID_VALUE = 0x0040,
380
381 // 0x0080,
382
383 /** Switched via SetWasModified(). Temporary flag - only used when
384 setting/changing property value.
385 */
386 wxPG_PROP_WAS_MODIFIED = 0x0200,
387
388 /**
389 If set, then child properties (if any) are private, and should be
390 "invisible" to the application.
391 */
392 wxPG_PROP_AGGREGATE = 0x0400,
393
394 /** If set, then child properties (if any) are copies and should not
395 be deleted in dtor.
396 */
397 wxPG_PROP_CHILDREN_ARE_COPIES = 0x0800,
398
399 /**
400 Classifies this item as a non-category.
401
402 Used for faster item type identification.
403 */
404 wxPG_PROP_PROPERTY = 0x1000,
405
406 /**
407 Classifies this item as a category.
408
409 Used for faster item type identification.
410 */
411 wxPG_PROP_CATEGORY = 0x2000,
412
413 /** Classifies this item as a property that has children, but is not aggregate
414 (ie children are not private).
415 */
416 wxPG_PROP_MISC_PARENT = 0x4000,
417
418 /** Property is read-only. Editor is still created.
419 */
420 wxPG_PROP_READONLY = 0x8000,
421
422 //
423 // NB: FLAGS ABOVE 0x8000 CANNOT BE USED WITH PROPERTY ITERATORS
424 //
425
426 /** Property's value is composed from values of child properties.
427 @remarks
428 This flag cannot be used with property iterators.
429 */
430 wxPG_PROP_COMPOSED_VALUE = 0x00010000,
431
432 /** Common value of property is selectable in editor.
433 @remarks
434 This flag cannot be used with property iterators.
435 */
436 wxPG_PROP_USES_COMMON_VALUE = 0x00020000,
437
438 /** Property can be set to unspecified value via editor.
439 Currently, this applies to following properties:
440 - wxIntProperty, wxUIntProperty, wxFloatProperty, wxEditEnumProperty:
441 Clear the text field
442
443 @remarks
444 This flag cannot be used with property iterators.
445 */
446 wxPG_PROP_AUTO_UNSPECIFIED = 0x00040000,
447
448 /** Indicates the bit useable by derived properties.
449 */
450 wxPG_PROP_CLASS_SPECIFIC_1 = 0x00080000,
451
452 /** Indicates the bit useable by derived properties.
453 */
454 wxPG_PROP_CLASS_SPECIFIC_2 = 0x00100000
455
456 };
457
458 /** Topmost flag.
459 */
460 #define wxPG_PROP_MAX wxPG_PROP_AUTO_UNSPECIFIED
461
462 /** Property with children must have one of these set, otherwise iterators
463 will not work correctly.
464 Code should automatically take care of this, however.
465 */
466 #define wxPG_PROP_PARENTAL_FLAGS \
467 (wxPG_PROP_AGGREGATE|wxPG_PROP_CATEGORY|wxPG_PROP_MISC_PARENT)
468
469 /** @}
470 */
471
472 // Combination of flags that can be stored by GetFlagsAsString
473 #define wxPG_STRING_STORED_FLAGS \
474 (wxPG_PROP_DISABLED|wxPG_PROP_HIDDEN|wxPG_PROP_NOEDITOR|wxPG_PROP_COLLAPSED)
475
476 // -----------------------------------------------------------------------
477
478 #ifndef SWIG
479
480 /**
481 @section propgrid_property_attributes wxPropertyGrid Property Attribute
482 Identifiers.
483
484 wxPGProperty::SetAttribute() and
485 wxPropertyGridInterface::SetPropertyAttribute() accept one of these as
486 attribute name argument.
487
488 You can use strings instead of constants. However, some of these
489 constants are redefined to use cached strings which may reduce
490 your binary size by some amount.
491
492 @{
493 */
494
495 /** Set default value for property.
496 */
497 #define wxPG_ATTR_DEFAULT_VALUE wxS("DefaultValue")
498
499 /** Universal, int or double. Minimum value for numeric properties.
500 */
501 #define wxPG_ATTR_MIN wxS("Min")
502
503 /** Universal, int or double. Maximum value for numeric properties.
504 */
505 #define wxPG_ATTR_MAX wxS("Max")
506
507 /** Universal, string. When set, will be shown as text after the displayed
508 text value. Alternatively, if third column is enabled, text will be shown
509 there (for any type of property).
510 */
511 #define wxPG_ATTR_UNITS wxS("Units")
512
513 /** Universal, string. When set, will be shown in property's value cell
514 when displayed value string is empty, or value is unspecified.
515 */
516 #define wxPG_ATTR_INLINE_HELP wxS("InlineHelp")
517
518 /** wxBoolProperty specific, int, default 0. When 1 sets bool property to
519 use checkbox instead of choice.
520 */
521 #define wxPG_BOOL_USE_CHECKBOX wxS("UseCheckbox")
522
523 /** wxBoolProperty specific, int, default 0. When 1 sets bool property value
524 to cycle on double click (instead of showing the popup listbox).
525 */
526 #define wxPG_BOOL_USE_DOUBLE_CLICK_CYCLING wxS("UseDClickCycling")
527
528 /**
529 wxFloatProperty (and similar) specific, int, default -1.
530
531 Sets the (max) precision used when floating point value is rendered as
532 text. The default -1 means infinite precision.
533 */
534 #define wxPG_FLOAT_PRECISION wxS("Precision")
535
536 /**
537 The text will be echoed as asterisks (wxTE_PASSWORD will be passed to
538 textctrl etc).
539 */
540 #define wxPG_STRING_PASSWORD wxS("Password")
541
542 /** Define base used by a wxUIntProperty. Valid constants are
543 wxPG_BASE_OCT, wxPG_BASE_DEC, wxPG_BASE_HEX and wxPG_BASE_HEXL
544 (lowercase characters).
545 */
546 #define wxPG_UINT_BASE wxS("Base")
547
548 /** Define prefix rendered to wxUIntProperty. Accepted constants
549 wxPG_PREFIX_NONE, wxPG_PREFIX_0x, and wxPG_PREFIX_DOLLAR_SIGN.
550 <b>Note:</b> Only wxPG_PREFIX_NONE works with Decimal and Octal
551 numbers.
552 */
553 #define wxPG_UINT_PREFIX wxS("Prefix")
554
555 /**
556 wxFileProperty/wxImageFileProperty specific, wxChar*, default is
557 detected/varies.
558 Sets the wildcard used in the triggered wxFileDialog. Format is the same.
559 */
560 #define wxPG_FILE_WILDCARD wxS("Wildcard")
561
562 /** wxFileProperty/wxImageFileProperty specific, int, default 1.
563 When 0, only the file name is shown (i.e. drive and directory are hidden).
564 */
565 #define wxPG_FILE_SHOW_FULL_PATH wxS("ShowFullPath")
566
567 /** Specific to wxFileProperty and derived properties, wxString, default empty.
568 If set, then the filename is shown relative to the given path string.
569 */
570 #define wxPG_FILE_SHOW_RELATIVE_PATH wxS("ShowRelativePath")
571
572 /**
573 Specific to wxFileProperty and derived properties, wxString, default is
574 empty.
575
576 Sets the initial path of where to look for files.
577 */
578 #define wxPG_FILE_INITIAL_PATH wxS("InitialPath")
579
580 /** Specific to wxFileProperty and derivatives, wxString, default is empty.
581 Sets a specific title for the dir dialog.
582 */
583 #define wxPG_FILE_DIALOG_TITLE wxS("DialogTitle")
584
585 /** Specific to wxDirProperty, wxString, default is empty.
586 Sets a specific message for the dir dialog.
587 */
588 #define wxPG_DIR_DIALOG_MESSAGE wxS("DialogMessage")
589
590 /** Sets displayed date format for wxDateProperty.
591 */
592 #define wxPG_DATE_FORMAT wxS("DateFormat")
593
594 /** Sets wxDatePickerCtrl window style used with wxDateProperty. Default
595 is wxDP_DEFAULT | wxDP_SHOWCENTURY.
596 */
597 #define wxPG_DATE_PICKER_STYLE wxS("PickerStyle")
598
599 /** SpinCtrl editor, int or double. How much number changes when button is
600 pressed (or up/down on keybard).
601 */
602 #define wxPG_ATTR_SPINCTRL_STEP wxS("Step")
603
604 /** SpinCtrl editor, bool. If true, value wraps at Min/Max.
605 */
606 #define wxPG_ATTR_SPINCTRL_WRAP wxS("Wrap")
607
608 /**
609 wxMultiChoiceProperty, int.
610 If 0, no user strings allowed. If 1, user strings appear before list
611 strings. If 2, user strings appear after list string.
612 */
613 #define wxPG_ATTR_MULTICHOICE_USERSTRINGMODE wxS("UserStringMode")
614
615 /**
616 wxColourProperty and its kind, int, default 1.
617
618 Setting this attribute to 0 hides custom colour from property's list of
619 choices.
620 */
621 #define wxPG_COLOUR_ALLOW_CUSTOM wxS("AllowCustom")
622
623 /** @}
624 */
625
626 // Redefine attribute macros to use cached strings
627 #undef wxPG_ATTR_MIN
628 #define wxPG_ATTR_MIN wxPGGlobalVars->m_strMin
629 #undef wxPG_ATTR_MAX
630 #define wxPG_ATTR_MAX wxPGGlobalVars->m_strMax
631 #undef wxPG_ATTR_UNITS
632 #define wxPG_ATTR_UNITS wxPGGlobalVars->m_strUnits
633 #undef wxPG_ATTR_INLINE_HELP
634 #define wxPG_ATTR_INLINE_HELP wxPGGlobalVars->m_strInlineHelp
635
636 #endif // !SWIG
637
638 // -----------------------------------------------------------------------
639
640 #ifndef SWIG
641
642 /** @class wxPGChoiceEntry
643 Data of a single wxPGChoices choice.
644 */
645 class WXDLLIMPEXP_PROPGRID wxPGChoiceEntry : public wxPGCell
646 {
647 public:
648 wxPGChoiceEntry();
649 wxPGChoiceEntry(const wxPGChoiceEntry& other)
650 : wxPGCell(other)
651 {
652 m_value = other.m_value;
653 }
654 wxPGChoiceEntry( const wxString& label,
655 int value = wxPG_INVALID_VALUE )
656 : wxPGCell(), m_value(value)
657 {
658 SetText(label);
659 }
660
661 virtual ~wxPGChoiceEntry() { }
662
663 void SetValue( int value ) { m_value = value; }
664 int GetValue() const { return m_value; }
665
666 wxPGChoiceEntry& operator=( const wxPGChoiceEntry& other )
667 {
668 if ( this != &other )
669 {
670 Ref(other);
671 }
672 m_value = other.m_value;
673 return *this;
674 }
675
676 protected:
677 int m_value;
678 };
679
680
681 typedef void* wxPGChoicesId;
682
683 class WXDLLIMPEXP_PROPGRID wxPGChoicesData
684 {
685 friend class wxPGChoices;
686 public:
687 // Constructor sets m_refCount to 1.
688 wxPGChoicesData();
689
690 void CopyDataFrom( wxPGChoicesData* data );
691
692 wxPGChoiceEntry& Insert( int index, const wxPGChoiceEntry& item );
693
694 // Delete all entries
695 void Clear();
696
697 unsigned int GetCount() const
698 {
699 return (unsigned int) m_items.size();
700 }
701
702 const wxPGChoiceEntry& Item( unsigned int i ) const
703 {
704 wxASSERT_MSG( i < GetCount(), "invalid index" );
705 return m_items[i];
706 }
707
708 wxPGChoiceEntry& Item( unsigned int i )
709 {
710 wxASSERT_MSG( i < GetCount(), "invalid index" );
711 return m_items[i];
712 }
713
714 void DecRef()
715 {
716 m_refCount--;
717 wxASSERT( m_refCount >= 0 );
718 if ( m_refCount == 0 )
719 delete this;
720 }
721
722 private:
723 wxVector<wxPGChoiceEntry> m_items;
724
725 // So that multiple properties can use the same set
726 int m_refCount;
727
728 virtual ~wxPGChoicesData();
729 };
730
731 #define wxPGChoicesEmptyData ((wxPGChoicesData*)NULL)
732
733 #endif // SWIG
734
735 /** @class wxPGChoices
736
737 Helper class for managing choices of wxPropertyGrid properties.
738 Each entry can have label, value, bitmap, text colour, and background
739 colour.
740
741 @remarks If you do not specify value for entry, index is used.
742
743 @library{wxpropgrid}
744 @category{propgrid}
745 */
746 class WXDLLIMPEXP_PROPGRID wxPGChoices
747 {
748 public:
749 typedef long ValArrItem;
750
751 /** Default constructor. */
752 wxPGChoices()
753 {
754 Init();
755 }
756
757 /** Copy constructor. */
758 wxPGChoices( const wxPGChoices& a )
759 {
760 if ( a.m_data != wxPGChoicesEmptyData )
761 {
762 m_data = a.m_data;
763 m_data->m_refCount++;
764 }
765 }
766
767 /**
768 Constructor.
769
770 @param labels
771 Labels for choices
772
773 @param values
774 Values for choices. If NULL, indexes are used.
775 */
776 wxPGChoices( const wxChar** labels, const long* values = NULL )
777 {
778 Init();
779 Set(labels,values);
780 }
781
782 /**
783 Constructor.
784
785 @param labels
786 Labels for choices
787
788 @param values
789 Values for choices. If empty, indexes are used.
790 */
791 wxPGChoices( const wxArrayString& labels,
792 const wxArrayInt& values = wxArrayInt() )
793 {
794 Init();
795 Set(labels,values);
796 }
797
798 /** Simple interface constructor. */
799 wxPGChoices( wxPGChoicesData* data )
800 {
801 wxASSERT(data);
802 m_data = data;
803 data->m_refCount++;
804 }
805
806 /** Destructor. */
807 ~wxPGChoices()
808 {
809 Free();
810 }
811
812 /**
813 Adds to current.
814
815 If did not have own copies, creates them now. If was empty, identical
816 to set except that creates copies.
817
818 @param labels
819 Labels for added choices.
820
821 @param values
822 Values for added choices. If empty, relevant entry indexes are used.
823 */
824 void Add( const wxChar** labels, const ValArrItem* values = NULL );
825
826 /** Version that works with wxArrayString and wxArrayInt. */
827 void Add( const wxArrayString& arr, const wxArrayInt& arrint = wxArrayInt() );
828
829 /**
830 Adds a single choice.
831
832 @param label
833 Label for added choice.
834
835 @param value
836 Value for added choice. If unspecified, index is used.
837 */
838 wxPGChoiceEntry& Add( const wxString& label,
839 int value = wxPG_INVALID_VALUE );
840
841 /** Adds a single item, with bitmap. */
842 wxPGChoiceEntry& Add( const wxString& label,
843 const wxBitmap& bitmap,
844 int value = wxPG_INVALID_VALUE );
845
846 /** Adds a single item with full entry information. */
847 wxPGChoiceEntry& Add( const wxPGChoiceEntry& entry )
848 {
849 return Insert(entry, -1);
850 }
851
852 /** Adds single item. */
853 wxPGChoiceEntry& AddAsSorted( const wxString& label,
854 int value = wxPG_INVALID_VALUE );
855
856 void Assign( const wxPGChoices& a )
857 {
858 AssignData(a.m_data);
859 }
860
861 void AssignData( wxPGChoicesData* data );
862
863 /** Delete all choices. */
864 void Clear()
865 {
866 if ( m_data != wxPGChoicesEmptyData )
867 m_data->Clear();
868 }
869
870 void EnsureData()
871 {
872 if ( m_data == wxPGChoicesEmptyData )
873 m_data = new wxPGChoicesData();
874 }
875
876 /** Gets a unsigned number identifying this list. */
877 wxPGChoicesId GetId() const { return (wxPGChoicesId) m_data; };
878
879 const wxString& GetLabel( unsigned int ind ) const
880 {
881 return Item(ind).GetText();
882 }
883
884 unsigned int GetCount () const
885 {
886 if ( !m_data )
887 return 0;
888
889 return m_data->GetCount();
890 }
891
892 int GetValue( unsigned int ind ) const { return Item(ind).GetValue(); }
893
894 /** Returns array of values matching the given strings. Unmatching strings
895 result in wxPG_INVALID_VALUE entry in array.
896 */
897 wxArrayInt GetValuesForStrings( const wxArrayString& strings ) const;
898
899 /** Returns array of indices matching given strings. Unmatching strings
900 are added to 'unmatched', if not NULL.
901 */
902 wxArrayInt GetIndicesForStrings( const wxArrayString& strings,
903 wxArrayString* unmatched = NULL ) const;
904
905 int Index( const wxString& str ) const;
906 int Index( int val ) const;
907
908 /** Inserts single item. */
909 wxPGChoiceEntry& Insert( const wxString& label,
910 int index,
911 int value = wxPG_INVALID_VALUE );
912
913 /** Inserts a single item with full entry information. */
914 wxPGChoiceEntry& Insert( const wxPGChoiceEntry& entry, int index );
915
916 /** Returns false if this is a constant empty set of choices,
917 which should not be modified.
918 */
919 bool IsOk() const
920 {
921 return ( m_data != wxPGChoicesEmptyData );
922 }
923
924 const wxPGChoiceEntry& Item( unsigned int i ) const
925 {
926 wxASSERT( IsOk() );
927 return m_data->Item(i);
928 }
929
930 wxPGChoiceEntry& Item( unsigned int i )
931 {
932 wxASSERT( IsOk() );
933 return m_data->Item(i);
934 }
935
936 /** Removes count items starting at position nIndex. */
937 void RemoveAt(size_t nIndex, size_t count = 1);
938
939 #ifndef SWIG
940 /** Does not create copies for itself. */
941 void Set( const wxChar** labels, const long* values = NULL )
942 {
943 Free();
944 Add(labels,values);
945 }
946 #endif // SWIG
947
948 /** Version that works with wxArrayString and wxArrayInt. */
949 void Set( const wxArrayString& labels,
950 const wxArrayInt& values = wxArrayInt() )
951 {
952 Free();
953 if ( &values )
954 Add(labels,values);
955 else
956 Add(labels);
957 }
958
959 // Creates exclusive copy of current choices
960 void SetExclusive()
961 {
962 if ( m_data->m_refCount != 1 )
963 {
964 wxPGChoicesData* data = new wxPGChoicesData();
965 data->CopyDataFrom(m_data);
966 Free();
967 m_data = data;
968 }
969 }
970
971 // Returns data, increases refcount.
972 wxPGChoicesData* GetData()
973 {
974 wxASSERT( m_data->m_refCount != 0xFFFFFFF );
975 m_data->m_refCount++;
976 return m_data;
977 }
978
979 // Returns plain data ptr - no refcounting stuff is done.
980 wxPGChoicesData* GetDataPtr() const { return m_data; }
981
982 // Changes ownership of data to you.
983 wxPGChoicesData* ExtractData()
984 {
985 wxPGChoicesData* data = m_data;
986 m_data = wxPGChoicesEmptyData;
987 return data;
988 }
989
990 wxArrayString GetLabels() const;
991
992 #ifndef SWIG
993 void operator= (const wxPGChoices& a)
994 {
995 AssignData(a.m_data);
996 }
997
998 wxPGChoiceEntry& operator[](unsigned int i)
999 {
1000 return Item(i);
1001 }
1002
1003 const wxPGChoiceEntry& operator[](unsigned int i) const
1004 {
1005 return Item(i);
1006 }
1007
1008 protected:
1009 wxPGChoicesData* m_data;
1010
1011 void Init();
1012 void Free();
1013 #endif // !SWIG
1014 };
1015
1016 // -----------------------------------------------------------------------
1017
1018 /** @class wxPGProperty
1019
1020 wxPGProperty is base class for all wxPropertyGrid properties.
1021
1022 NB: Full class overview is now only present in
1023 interface/wx/propgrid/property.h.
1024
1025 @library{wxpropgrid}
1026 @category{propgrid}
1027 */
1028 class WXDLLIMPEXP_PROPGRID wxPGProperty : public wxObject
1029 {
1030 friend class wxPropertyGrid;
1031 friend class wxPropertyGridInterface;
1032 friend class wxPropertyGridPageState;
1033 friend class wxPropertyGridPopulator;
1034 friend class wxStringProperty; // Proper "<composed>" support requires this
1035 #ifndef SWIG
1036 DECLARE_ABSTRACT_CLASS(wxPGProperty)
1037 #endif
1038 public:
1039 typedef wxUint32 FlagType;
1040
1041 /** Basic constructor.
1042 */
1043 wxPGProperty();
1044
1045 /** Constructor.
1046 Non-abstract property classes should have constructor of this style:
1047
1048 @code
1049
1050 // If T is a class, then it should be a constant reference
1051 // (e.g. const T& ) instead.
1052 MyProperty( const wxString& label, const wxString& name, T value )
1053 : wxPGProperty()
1054 {
1055 // Generally recommended way to set the initial value
1056 // (as it should work in pretty much 100% of cases).
1057 wxVariant variant;
1058 variant << value;
1059 SetValue(variant);
1060
1061 // If has private child properties then create them here. Also
1062 // set flag that indicates presence of private children. E.g.:
1063 //
1064 // SetParentalType(wxPG_PROP_AGGREGATE);
1065 //
1066 // AddChild( new wxStringProperty( "Subprop 1",
1067 // wxPG_LABEL,
1068 // value.GetSubProp1() ) );
1069 }
1070
1071 @endcode
1072 */
1073 wxPGProperty( const wxString& label, const wxString& name );
1074
1075 /**
1076 Virtual destructor.
1077 It is customary for derived properties to implement this.
1078 */
1079 virtual ~wxPGProperty();
1080
1081 /** This virtual function is called after m_value has been set.
1082
1083 @remarks
1084 - If m_value was set to Null variant (ie. unspecified value),
1085 OnSetValue() will not be called.
1086 - m_value may be of any variant type. Typically properties internally
1087 support only one variant type, and as such OnSetValue() provides a
1088 good opportunity to convert
1089 supported values into internal type.
1090 - Default implementation does nothing.
1091 */
1092 virtual void OnSetValue();
1093
1094 /** Override this to return something else than m_value as the value.
1095 */
1096 virtual wxVariant DoGetValue() const { return m_value; }
1097
1098 #if !defined(SWIG) || defined(CREATE_VCW)
1099 /** Implement this function in derived class to check the value.
1100 Return true if it is ok. Returning false prevents property change events
1101 from occurring.
1102
1103 @remarks
1104 - Default implementation always returns true.
1105 */
1106 virtual bool ValidateValue( wxVariant& value,
1107 wxPGValidationInfo& validationInfo ) const;
1108
1109 /**
1110 Converts text into wxVariant value appropriate for this property.
1111
1112 @param variant
1113 On function entry this is the old value (should not be wxNullVariant
1114 in normal cases). Translated value must be assigned back to it.
1115
1116 @param text
1117 Text to be translated into variant.
1118
1119 @param argFlags
1120 If wxPG_FULL_VALUE is set, returns complete, storable value instead
1121 of displayable one (they may be different).
1122 If wxPG_COMPOSITE_FRAGMENT is set, text is interpreted as a part of
1123 composite property string value (as generated by ValueToString()
1124 called with this same flag).
1125
1126 @return Returns @true if resulting wxVariant value was different.
1127
1128 @remarks Default implementation converts semicolon delimited tokens into
1129 child values. Only works for properties with children.
1130
1131 You might want to take into account that m_value is Null variant
1132 if property value is unspecified (which is usually only case if
1133 you explicitly enabled that sort behavior).
1134 */
1135 virtual bool StringToValue( wxVariant& variant,
1136 const wxString& text,
1137 int argFlags = 0 ) const;
1138
1139 /**
1140 Converts integer (possibly a choice selection) into wxVariant value
1141 appropriate for this property.
1142
1143 @param variant
1144 On function entry this is the old value (should not be wxNullVariant
1145 in normal cases). Translated value must be assigned back to it.
1146
1147 @param number
1148 Integer to be translated into variant.
1149
1150 @param argFlags
1151 If wxPG_FULL_VALUE is set, returns complete, storable value instead
1152 of displayable one.
1153
1154 @return Returns @true if resulting wxVariant value was different.
1155
1156 @remarks
1157 - If property is not supposed to use choice or spinctrl or other editor
1158 with int-based value, it is not necessary to implement this method.
1159 - Default implementation simply assign given int to m_value.
1160 - If property uses choice control, and displays a dialog on some choice
1161 items, then it is preferred to display that dialog in IntToValue
1162 instead of OnEvent.
1163 - You might want to take into account that m_value is Null variant if
1164 property value is unspecified (which is usually only case if you
1165 explicitly enabled that sort behavior).
1166 */
1167 virtual bool IntToValue( wxVariant& value,
1168 int number,
1169 int argFlags = 0 ) const;
1170 #endif // !defined(SWIG) || defined(CREATE_VCW)
1171 /**
1172 Converts property value into a text representation.
1173
1174 @param value
1175 Value to be converted.
1176
1177 @param argFlags
1178 If 0 (default value), then displayed string is returned.
1179 If wxPG_FULL_VALUE is set, returns complete, storable string value
1180 instead of displayable. If wxPG_EDITABLE_VALUE is set, returns
1181 string value that must be editable in textctrl. If
1182 wxPG_COMPOSITE_FRAGMENT is set, returns text that is appropriate to
1183 display as a part of string property's composite text
1184 representation.
1185
1186 @remarks Default implementation calls GenerateComposedValue().
1187 */
1188 virtual wxString ValueToString( wxVariant& value, int argFlags = 0 ) const;
1189
1190 /** Converts string to a value, and if successful, calls SetValue() on it.
1191 Default behavior is to do nothing.
1192 @param text
1193 String to get the value from.
1194 @return
1195 true if value was changed.
1196 */
1197 bool SetValueFromString( const wxString& text, int flags = wxPG_PROGRAMMATIC_VALUE );
1198
1199 /** Converts integer to a value, and if succesful, calls SetValue() on it.
1200 Default behavior is to do nothing.
1201 @param value
1202 Int to get the value from.
1203 @param flags
1204 If has wxPG_FULL_VALUE, then the value given is a actual value and
1205 not an index.
1206 @return
1207 True if value was changed.
1208 */
1209 bool SetValueFromInt( long value, int flags = 0 );
1210
1211 /**
1212 Returns size of the custom painted image in front of property.
1213
1214 This method must be overridden to return non-default value if
1215 OnCustomPaint is to be called.
1216 @param item
1217 Normally -1, but can be an index to the property's list of items.
1218 @remarks
1219 - Default behavior is to return wxSize(0,0), which means no image.
1220 - Default image width or height is indicated with dimension -1.
1221 - You can also return wxPG_DEFAULT_IMAGE_SIZE, i.e. wxSize(-1, -1).
1222 */
1223 virtual wxSize OnMeasureImage( int item = -1 ) const;
1224
1225 /**
1226 Events received by editor widgets are processed here.
1227
1228 Note that editor class usually processes most events. Some, such as
1229 button press events of TextCtrlAndButton class, can be handled here.
1230 Also, if custom handling for regular events is desired, then that can
1231 also be done (for example, wxSystemColourProperty custom handles
1232 wxEVT_COMMAND_CHOICE_SELECTED to display colour picker dialog when
1233 'custom' selection is made).
1234
1235 If the event causes value to be changed, SetValueInEvent()
1236 should be called to set the new value.
1237
1238 @param event
1239 Associated wxEvent.
1240 @return
1241 Should return true if any changes in value should be reported.
1242 @remarks
1243 If property uses choice control, and displays a dialog on some choice
1244 items, then it is preferred to display that dialog in IntToValue
1245 instead of OnEvent.
1246 */
1247 virtual bool OnEvent( wxPropertyGrid* propgrid,
1248 wxWindow* wnd_primary,
1249 wxEvent& event );
1250
1251 /**
1252 Called after value of a child property has been altered.
1253
1254 Note that this function is usually called at the time that value of
1255 this property, or given child property, is still pending for change.
1256
1257 Sample pseudo-code implementation:
1258
1259 @code
1260 void MyProperty::ChildChanged( wxVariant& thisValue,
1261 int childIndex,
1262 wxVariant& childValue ) const
1263 {
1264 // Acquire reference to actual type of data stored in variant
1265 // (TFromVariant only exists if wxPropertyGrid's wxVariant-macros
1266 // were used to create the variant class).
1267 T& data = TFromVariant(thisValue);
1268
1269 // Copy childValue into data.
1270 switch ( childIndex )
1271 {
1272 case 0:
1273 data.SetSubProp1( childvalue.GetLong() );
1274 break;
1275 case 1:
1276 data.SetSubProp2( childvalue.GetString() );
1277 break;
1278 ...
1279 }
1280 }
1281 @endcode
1282
1283 @param thisValue
1284 Value of this property, that should be altered.
1285 @param childIndex
1286 Index of child changed (you can use Item(childIndex) to get).
1287 @param childValue
1288 Value of the child property.
1289 */
1290 virtual void ChildChanged( wxVariant& thisValue,
1291 int childIndex,
1292 wxVariant& childValue ) const;
1293
1294 /** Returns pointer to an instance of used editor.
1295 */
1296 virtual const wxPGEditor* DoGetEditorClass() const;
1297
1298 /** Returns pointer to the wxValidator that should be used
1299 with the editor of this property (NULL for no validator).
1300 Setting validator explicitly via SetPropertyValidator
1301 will override this.
1302
1303 In most situations, code like this should work well
1304 (macros are used to maintain one actual validator instance,
1305 so on the second call the function exits within the first
1306 macro):
1307
1308 @code
1309
1310 wxValidator* wxMyPropertyClass::DoGetValidator () const
1311 {
1312 WX_PG_DOGETVALIDATOR_ENTRY()
1313
1314 wxMyValidator* validator = new wxMyValidator(...);
1315
1316 ... prepare validator...
1317
1318 WX_PG_DOGETVALIDATOR_EXIT(validator)
1319 }
1320
1321 @endcode
1322
1323 @remarks
1324 You can get common filename validator by returning
1325 wxFileProperty::GetClassValidator(). wxDirProperty,
1326 for example, uses it.
1327 */
1328 virtual wxValidator* DoGetValidator () const;
1329
1330 /**
1331 Override to paint an image in front of the property value text or
1332 drop-down list item (but only if wxPGProperty::OnMeasureImage is
1333 overridden as well).
1334
1335 If property's OnMeasureImage() returns size that has height != 0 but
1336 less than row height ( < 0 has special meanings), wxPropertyGrid calls
1337 this method to draw a custom image in a limited area in front of the
1338 editor control or value text/graphics, and if control has drop-down
1339 list, then the image is drawn there as well (even in the case
1340 OnMeasureImage() returned higher height than row height).
1341
1342 NOTE: Following applies when OnMeasureImage() returns a "flexible"
1343 height ( using wxPG_FLEXIBLE_SIZE(W,H) macro), which implies variable
1344 height items: If rect.x is < 0, then this is a measure item call, which
1345 means that dc is invalid and only thing that should be done is to set
1346 paintdata.m_drawnHeight to the height of the image of item at index
1347 paintdata.m_choiceItem. This call may be done even as often as once
1348 every drop-down popup show.
1349
1350 @param dc
1351 wxDC to paint on.
1352 @param rect
1353 Box reserved for custom graphics. Includes surrounding rectangle,
1354 if any. If x is < 0, then this is a measure item call (see above).
1355 @param paintdata
1356 wxPGPaintData structure with much useful data.
1357
1358 @remarks
1359 - You can actually exceed rect width, but if you do so then
1360 paintdata.m_drawnWidth must be set to the full width drawn in
1361 pixels.
1362 - Due to technical reasons, rect's height will be default even if
1363 custom height was reported during measure call.
1364 - Brush is guaranteed to be default background colour. It has been
1365 already used to clear the background of area being painted. It
1366 can be modified.
1367 - Pen is guaranteed to be 1-wide 'black' (or whatever is the proper
1368 colour) pen for drawing framing rectangle. It can be changed as
1369 well.
1370
1371 @see ValueToString()
1372 */
1373 virtual void OnCustomPaint( wxDC& dc,
1374 const wxRect& rect,
1375 wxPGPaintData& paintdata );
1376
1377 /**
1378 Returns used wxPGCellRenderer instance for given property column
1379 (label=0, value=1).
1380
1381 Default implementation returns editor's renderer for all columns.
1382 */
1383 virtual wxPGCellRenderer* GetCellRenderer( int column ) const;
1384
1385 /** Returns which choice is currently selected. Only applies to properties
1386 which have choices.
1387
1388 Needs to reimplemented in derived class if property value does not
1389 map directly to a choice. Integer as index, bool, and string usually do.
1390 */
1391 virtual int GetChoiceSelection() const;
1392
1393 /**
1394 Refresh values of child properties.
1395
1396 Automatically called after value is set.
1397 */
1398 virtual void RefreshChildren();
1399
1400 /** Special handling for attributes of this property.
1401
1402 If returns false, then the attribute will be automatically stored in
1403 m_attributes.
1404
1405 Default implementation simply returns false.
1406 */
1407 virtual bool DoSetAttribute( const wxString& name, wxVariant& value );
1408
1409 /** Returns value of an attribute.
1410
1411 Override if custom handling of attributes is needed.
1412
1413 Default implementation simply return NULL variant.
1414 */
1415 virtual wxVariant DoGetAttribute( const wxString& name ) const;
1416
1417 /** Returns instance of a new wxPGEditorDialogAdapter instance, which is
1418 used when user presses the (optional) button next to the editor control;
1419
1420 Default implementation returns NULL (ie. no action is generated when
1421 button is pressed).
1422 */
1423 virtual wxPGEditorDialogAdapter* GetEditorDialog() const;
1424
1425 /** Append a new choice to property's list of choices.
1426 */
1427 int AddChoice( const wxString& label, int value = wxPG_INVALID_VALUE )
1428 {
1429 return InsertChoice(label, wxNOT_FOUND, value);
1430 }
1431
1432 /**
1433 Returns true if children of this property are component values (for
1434 instance, points size, face name, and is_underlined are component
1435 values of a font).
1436 */
1437 bool AreChildrenComponents() const
1438 {
1439 if ( m_flags & (wxPG_PROP_COMPOSED_VALUE|wxPG_PROP_AGGREGATE) )
1440 return true;
1441
1442 return false;
1443 }
1444
1445 /**
1446 Removes entry from property's wxPGChoices and editor control (if it is
1447 active).
1448
1449 If selected item is deleted, then the value is set to unspecified.
1450 */
1451 void DeleteChoice( int index );
1452
1453 /**
1454 Call to enable or disable usage of common value (integer value that can
1455 be selected for properties instead of their normal values) for this
1456 property.
1457
1458 Common values are disabled by the default for all properties.
1459 */
1460 void EnableCommonValue( bool enable = true )
1461 {
1462 if ( enable ) SetFlag( wxPG_PROP_USES_COMMON_VALUE );
1463 else ClearFlag( wxPG_PROP_USES_COMMON_VALUE );
1464 }
1465
1466 /**
1467 Composes text from values of child properties.
1468 */
1469 wxString GenerateComposedValue() const
1470 {
1471 wxString s;
1472 DoGenerateComposedValue(s);
1473 return s;
1474 }
1475
1476 /** Returns property's label. */
1477 const wxString& GetLabel() const { return m_label; }
1478
1479 /** Returns property's name with all (non-category, non-root) parents. */
1480 wxString GetName() const;
1481
1482 /**
1483 Returns property's base name (ie parent's name is not added in any
1484 case)
1485 */
1486 const wxString& GetBaseName() const { return m_name; }
1487
1488 /** Returns read-only reference to property's list of choices.
1489 */
1490 const wxPGChoices& GetChoices() const
1491 {
1492 return m_choices;
1493 }
1494
1495 /** Returns coordinate to the top y of the property. Note that the
1496 position of scrollbars is not taken into account.
1497 */
1498 int GetY() const;
1499
1500 wxVariant GetValue() const
1501 {
1502 return DoGetValue();
1503 }
1504
1505 #ifndef SWIG
1506 /** Returns reference to the internal stored value. GetValue is preferred
1507 way to get the actual value, since GetValueRef ignores DoGetValue,
1508 which may override stored value.
1509 */
1510 wxVariant& GetValueRef()
1511 {
1512 return m_value;
1513 }
1514
1515 const wxVariant& GetValueRef() const
1516 {
1517 return m_value;
1518 }
1519 #endif
1520
1521 /** Returns text representation of property's value.
1522
1523 @param argFlags
1524 If 0 (default value), then displayed string is returned.
1525 If wxPG_FULL_VALUE is set, returns complete, storable string value
1526 instead of displayable. If wxPG_EDITABLE_VALUE is set, returns
1527 string value that must be editable in textctrl. If
1528 wxPG_COMPOSITE_FRAGMENT is set, returns text that is appropriate to
1529 display as a part of string property's composite text
1530 representation.
1531
1532 @remarks In older versions, this function used to be overridden to convert
1533 property's value into a string representation. This function is
1534 now handled by ValueToString(), and overriding this function now
1535 will result in run-time assertion failure.
1536 */
1537 virtual wxString GetValueAsString( int argFlags = 0 ) const;
1538
1539 /** Synonymous to GetValueAsString().
1540
1541 @deprecated Use GetValueAsString() instead.
1542
1543 @see GetValueAsString()
1544 */
1545 wxDEPRECATED( wxString GetValueString( int argFlags = 0 ) const );
1546
1547 void UpdateControl( wxWindow* primary );
1548
1549 /**
1550 Returns wxPGCell of given column.
1551 */
1552 const wxPGCell& GetCell( unsigned int column ) const;
1553
1554 wxPGCell& GetCell( unsigned int column );
1555
1556 /** Return number of displayed common values for this property.
1557 */
1558 int GetDisplayedCommonValueCount() const;
1559
1560 wxString GetDisplayedString() const
1561 {
1562 return GetValueAsString(0);
1563 }
1564
1565 /** Returns property grid where property lies. */
1566 wxPropertyGrid* GetGrid() const;
1567
1568 /** Returns owner wxPropertyGrid, but only if one is currently on a page
1569 displaying this property. */
1570 wxPropertyGrid* GetGridIfDisplayed() const;
1571
1572 /** Returns highest level non-category, non-root parent. Useful when you
1573 have nested wxCustomProperties/wxParentProperties.
1574 @remarks
1575 Thus, if immediate parent is root or category, this will return the
1576 property itself.
1577 */
1578 wxPGProperty* GetMainParent() const;
1579
1580 /** Return parent of property */
1581 wxPGProperty* GetParent() const { return m_parent; }
1582
1583 /** Returns true if property has editable wxTextCtrl when selected.
1584
1585 @remarks
1586 Altough disabled properties do not displayed editor, they still
1587 return True here as being disabled is considered a temporary
1588 condition (unlike being read-only or having limited editing enabled).
1589 */
1590 bool IsTextEditable() const;
1591
1592 bool IsValueUnspecified() const
1593 {
1594 return m_value.IsNull();
1595 }
1596
1597 FlagType HasFlag( FlagType flag ) const
1598 {
1599 return ( m_flags & flag );
1600 }
1601
1602 /** Returns comma-delimited string of property attributes.
1603 */
1604 const wxPGAttributeStorage& GetAttributes() const
1605 {
1606 return m_attributes;
1607 }
1608
1609 /** Returns m_attributes as list wxVariant.
1610 */
1611 wxVariant GetAttributesAsList() const;
1612
1613 FlagType GetFlags() const
1614 {
1615 return m_flags;
1616 }
1617
1618 const wxPGEditor* GetEditorClass() const;
1619
1620 wxString GetValueType() const
1621 {
1622 return m_value.GetType();
1623 }
1624
1625 /** Returns editor used for given column. NULL for no editor.
1626 */
1627 const wxPGEditor* GetColumnEditor( int column ) const
1628 {
1629 if ( column == 1 )
1630 return GetEditorClass();
1631
1632 return NULL;
1633 }
1634
1635 /** Returns common value selected for this property. -1 for none.
1636 */
1637 int GetCommonValue() const
1638 {
1639 return m_commonValue;
1640 }
1641
1642 /** Returns true if property has even one visible child.
1643 */
1644 bool HasVisibleChildren() const;
1645
1646 /** Inserts a new choice to property's list of choices.
1647 */
1648 int InsertChoice( const wxString& label, int index, int value = wxPG_INVALID_VALUE );
1649
1650 /**
1651 Returns true if this property is actually a wxPropertyCategory.
1652 */
1653 bool IsCategory() const { return HasFlag(wxPG_PROP_CATEGORY)?true:false; }
1654
1655 /** Returns true if this property is actually a wxRootProperty.
1656 */
1657 bool IsRoot() const { return (m_parent == NULL); }
1658
1659 /** Returns true if this is a sub-property. */
1660 bool IsSubProperty() const
1661 {
1662 wxPGProperty* parent = (wxPGProperty*)m_parent;
1663 if ( parent && !parent->IsCategory() )
1664 return true;
1665 return false;
1666 }
1667
1668 /** Returns last visible sub-property, recursively.
1669 */
1670 const wxPGProperty* GetLastVisibleSubItem() const;
1671
1672 wxVariant GetDefaultValue() const;
1673
1674 int GetMaxLength() const
1675 {
1676 return (int) m_maxLen;
1677 }
1678
1679 /**
1680 Determines, recursively, if all children are not unspecified.
1681
1682 @param pendingList
1683 Assumes members in this wxVariant list as pending
1684 replacement values.
1685 */
1686 bool AreAllChildrenSpecified( wxVariant* pendingList = NULL ) const;
1687
1688 /** Updates composed values of parent non-category properties, recursively.
1689 Returns topmost property updated.
1690
1691 @remarks
1692 - Must not call SetValue() (as can be called in it).
1693 */
1694 wxPGProperty* UpdateParentValues();
1695
1696 /** Returns true if containing grid uses wxPG_EX_AUTO_UNSPECIFIED_VALUES.
1697 */
1698 bool UsesAutoUnspecified() const
1699 {
1700 return HasFlag(wxPG_PROP_AUTO_UNSPECIFIED)?true:false;
1701 }
1702
1703 wxBitmap* GetValueImage() const
1704 {
1705 return m_valueBitmap;
1706 }
1707
1708 wxVariant GetAttribute( const wxString& name ) const;
1709
1710 /**
1711 Returns named attribute, as string, if found.
1712
1713 Otherwise defVal is returned.
1714 */
1715 wxString GetAttribute( const wxString& name, const wxString& defVal ) const;
1716
1717 /**
1718 Returns named attribute, as long, if found.
1719
1720 Otherwise defVal is returned.
1721 */
1722 long GetAttributeAsLong( const wxString& name, long defVal ) const;
1723
1724 /**
1725 Returns named attribute, as double, if found.
1726
1727 Otherwise defVal is returned.
1728 */
1729 double GetAttributeAsDouble( const wxString& name, double defVal ) const;
1730
1731 unsigned int GetDepth() const { return (unsigned int)m_depth; }
1732
1733 /** Gets flags as a'|' delimited string. Note that flag names are not
1734 prepended with 'wxPG_PROP_'.
1735 @param flagsMask
1736 String will only be made to include flags combined by this parameter.
1737 */
1738 wxString GetFlagsAsString( FlagType flagsMask ) const;
1739
1740 /** Returns position in parent's array. */
1741 unsigned int GetIndexInParent() const
1742 {
1743 return (unsigned int)m_arrIndex;
1744 }
1745
1746 /** Hides or reveals the property.
1747 @param hide
1748 true for hide, false for reveal.
1749 @param flags
1750 By default changes are applied recursively. Set this paramter
1751 wxPG_DONT_RECURSE to prevent this.
1752 */
1753 inline bool Hide( bool hide, int flags = wxPG_RECURSE );
1754
1755 bool IsExpanded() const
1756 { return (!(m_flags & wxPG_PROP_COLLAPSED) && GetChildCount()); }
1757
1758 /** Returns true if all parents expanded.
1759 */
1760 bool IsVisible() const;
1761
1762 bool IsEnabled() const { return !(m_flags & wxPG_PROP_DISABLED); }
1763
1764 /** If property's editor is created this forces its recreation.
1765 Useful in SetAttribute etc. Returns true if actually did anything.
1766 */
1767 bool RecreateEditor();
1768
1769 /** If property's editor is active, then update it's value.
1770 */
1771 void RefreshEditor();
1772
1773 /** Sets an attribute for this property.
1774 @param name
1775 Text identifier of attribute. See @ref propgrid_property_attributes.
1776 @param value
1777 Value of attribute.
1778 */
1779 void SetAttribute( const wxString& name, wxVariant value );
1780
1781 void SetAttributes( const wxPGAttributeStorage& attributes );
1782
1783 /**
1784 Sets property's background colour.
1785
1786 @param colour
1787 Background colour to use.
1788
1789 @param recursively
1790 If @true, children are affected recursively, and any categories
1791 are not.
1792 */
1793 void SetBackgroundColour( const wxColour& colour,
1794 bool recursively = false );
1795
1796 /**
1797 Sets property's text colour.
1798
1799 @param colour
1800 Text colour to use.
1801
1802 @param recursively
1803 If @true, children are affected recursively, and any categories
1804 are not.
1805 */
1806 void SetTextColour( const wxColour& colour,
1807 bool recursively = false );
1808
1809 #ifndef SWIG
1810 /** Sets editor for a property.
1811
1812 @param editor
1813 For builtin editors, use wxPGEditor_X, where X is builtin editor's
1814 name (TextCtrl, Choice, etc. see wxPGEditor documentation for full
1815 list).
1816
1817 For custom editors, use pointer you received from
1818 wxPropertyGrid::RegisterEditorClass().
1819 */
1820 void SetEditor( const wxPGEditor* editor )
1821 {
1822 m_customEditor = editor;
1823 }
1824 #endif
1825
1826 /** Sets editor for a property.
1827 */
1828 inline void SetEditor( const wxString& editorName );
1829
1830 /**
1831 Sets cell information for given column.
1832 */
1833 void SetCell( int column, const wxPGCell& cell );
1834
1835 /** Sets common value selected for this property. -1 for none.
1836 */
1837 void SetCommonValue( int commonValue )
1838 {
1839 m_commonValue = commonValue;
1840 }
1841
1842 /** Sets flags from a '|' delimited string. Note that flag names are not
1843 prepended with 'wxPG_PROP_'.
1844 */
1845 void SetFlagsFromString( const wxString& str );
1846
1847 /** Sets property's "is it modified?" flag. Affects children recursively.
1848 */
1849 void SetModifiedStatus( bool modified )
1850 {
1851 SetFlagRecursively(wxPG_PROP_MODIFIED, modified);
1852 }
1853
1854 /** Call in OnEvent(), OnButtonClick() etc. to change the property value
1855 based on user input.
1856
1857 @remarks
1858 This method is const since it doesn't actually modify value, but posts
1859 given variant as pending value, stored in wxPropertyGrid.
1860 */
1861 void SetValueInEvent( wxVariant value ) const;
1862
1863 /**
1864 Call this to set value of the property.
1865
1866 Unlike methods in wxPropertyGrid, this does not automatically update
1867 the display.
1868
1869 @remarks
1870 Use wxPropertyGrid::ChangePropertyValue() instead if you need to run
1871 through validation process and send property change event.
1872
1873 If you need to change property value in event, based on user input, use
1874 SetValueInEvent() instead.
1875
1876 @param pList
1877 Pointer to list variant that contains child values. Used to indicate
1878 which children should be marked as modified.
1879 @param flags
1880 Various flags (for instance, wxPG_SETVAL_REFRESH_EDITOR).
1881 */
1882 void SetValue( wxVariant value, wxVariant* pList = NULL, int flags = 0 );
1883
1884 /** Set wxBitmap in front of the value. This bitmap may be ignored
1885 by custom cell renderers.
1886 */
1887 void SetValueImage( wxBitmap& bmp );
1888
1889 /** If property has choices and they are not yet exclusive, new such copy
1890 of them will be created.
1891 */
1892 void SetChoicesExclusive()
1893 {
1894 m_choices.SetExclusive();
1895 }
1896
1897 /** Sets selected choice and changes property value.
1898
1899 Tries to retain value type, although currently if it is not string,
1900 then it is forced to integer.
1901 */
1902 void SetChoiceSelection( int newValue );
1903
1904 void SetExpanded( bool expanded )
1905 {
1906 if ( !expanded ) m_flags |= wxPG_PROP_COLLAPSED;
1907 else m_flags &= ~wxPG_PROP_COLLAPSED;
1908 }
1909
1910 void SetFlag( FlagType flag ) { m_flags |= flag; }
1911
1912 void SetFlagRecursively( FlagType flag, bool set );
1913
1914 void SetHelpString( const wxString& helpString )
1915 {
1916 m_helpString = helpString;
1917 }
1918
1919 void SetLabel( const wxString& label ) { m_label = label; }
1920
1921 inline void SetName( const wxString& newName );
1922
1923 /**
1924 Changes what sort of parent this property is for its children.
1925
1926 @param flag
1927 Use one of the following values: wxPG_PROP_MISC_PARENT (for generic
1928 parents), wxPG_PROP_CATEGORY (for categories), or
1929 wxPG_PROP_AGGREGATE (for derived property classes with private
1930 children).
1931
1932 @remarks You only need to call this if you use AddChild() to add
1933 child properties. Adding properties with
1934 wxPropertyGridInterface::Insert() or
1935 wxPropertyGridInterface::AppendIn() will automatically set
1936 property to use wxPG_PROP_MISC_PARENT style.
1937 */
1938 void SetParentalType( int flag )
1939 {
1940 m_flags &= ~(wxPG_PROP_PROPERTY|wxPG_PROP_PARENTAL_FLAGS);
1941 m_flags |= flag;
1942 }
1943
1944 void SetValueToUnspecified()
1945 {
1946 wxVariant val; // Create NULL variant
1947 SetValue(val);
1948 }
1949
1950 #if wxUSE_VALIDATORS
1951 /** Sets wxValidator for a property*/
1952 void SetValidator( const wxValidator& validator )
1953 {
1954 m_validator = wxDynamicCast(validator.Clone(),wxValidator);
1955 }
1956
1957 /** Gets assignable version of property's validator. */
1958 wxValidator* GetValidator() const
1959 {
1960 if ( m_validator )
1961 return m_validator;
1962 return DoGetValidator();
1963 }
1964 #endif // #if wxUSE_VALIDATORS
1965
1966 #ifndef SWIG
1967 /** Returns client data (void*) of a property.
1968 */
1969 void* GetClientData() const
1970 {
1971 return m_clientData;
1972 }
1973
1974 /** Sets client data (void*) of a property.
1975 @remarks
1976 This untyped client data has to be deleted manually.
1977 */
1978 void SetClientData( void* clientData )
1979 {
1980 m_clientData = clientData;
1981 }
1982
1983 /** Returns client object of a property.
1984 */
1985 void SetClientObject(wxClientData* clientObject)
1986 {
1987 delete m_clientObject;
1988 m_clientObject = clientObject;
1989 }
1990
1991 /** Sets managed client object of a property.
1992 */
1993 wxClientData *GetClientObject() const { return m_clientObject; }
1994 #endif
1995
1996 /** Sets new set of choices for property.
1997
1998 @remarks
1999 This operation clears the property value.
2000 */
2001 bool SetChoices( wxPGChoices& choices );
2002
2003 /** Set max length of text in text editor.
2004 */
2005 inline bool SetMaxLength( int maxLen );
2006
2007 /** Call with 'false' in OnSetValue to cancel value changes after all
2008 (ie. cancel 'true' returned by StringToValue() or IntToValue()).
2009 */
2010 void SetWasModified( bool set = true )
2011 {
2012 if ( set ) m_flags |= wxPG_PROP_WAS_MODIFIED;
2013 else m_flags &= ~wxPG_PROP_WAS_MODIFIED;
2014 }
2015
2016 const wxString& GetHelpString() const
2017 {
2018 return m_helpString;
2019 }
2020
2021 void ClearFlag( FlagType flag ) { m_flags &= ~(flag); }
2022
2023 // Use, for example, to detect if item is inside collapsed section.
2024 bool IsSomeParent( wxPGProperty* candidate_parent ) const;
2025
2026 /**
2027 Adapts list variant into proper value using consecutive
2028 ChildChanged-calls.
2029 */
2030 void AdaptListToValue( wxVariant& list, wxVariant* value ) const;
2031
2032 /**
2033 Adds a child property. If you use this instead of
2034 wxPropertyGridInterface::Insert() or
2035 wxPropertyGridInterface::AppendIn(), then you must set up
2036 property's parental type before making the call. To do this,
2037 call property's SetParentalType() function with either
2038 wxPG_PROP_MISC_PARENT (normal, public children) or with
2039 wxPG_PROP_AGGREGATE (private children for subclassed property).
2040 For instance:
2041
2042 @code
2043 wxPGProperty* prop = new wxStringProperty(wxS("Property"));
2044 prop->SetParentalType(wxPG_PROP_MISC_PARENT);
2045 wxPGProperty* prop2 = new wxStringProperty(wxS("Property2"));
2046 prop->AddChild(prop2);
2047 @endcode
2048 */
2049 void AddChild( wxPGProperty* prop );
2050
2051 /** Returns height of children, recursively, and
2052 by taking expanded/collapsed status into account.
2053
2054 iMax is used when finding property y-positions.
2055 */
2056 int GetChildrenHeight( int lh, int iMax = -1 ) const;
2057
2058 /** Returns number of child properties */
2059 unsigned int GetChildCount() const
2060 {
2061 return (unsigned int) m_children.size();
2062 }
2063
2064 /** Returns sub-property at index i. */
2065 wxPGProperty* Item( unsigned int i ) const
2066 { return m_children[i]; }
2067
2068 /** Returns last sub-property.
2069 */
2070 wxPGProperty* Last() const { return m_children.back(); }
2071
2072 /** Returns index of given child property. */
2073 int Index( const wxPGProperty* p ) const;
2074
2075 /** Deletes all sub-properties. */
2076 void Empty();
2077
2078 // Puts correct indexes to children
2079 void FixIndicesOfChildren( unsigned int starthere = 0 );
2080
2081 #ifndef SWIG
2082 // Returns wxPropertyGridPageState in which this property resides.
2083 wxPropertyGridPageState* GetParentState() const { return m_parentState; }
2084 #endif
2085
2086 wxPGProperty* GetItemAtY( unsigned int y,
2087 unsigned int lh,
2088 unsigned int* nextItemY ) const;
2089
2090 /** Returns (direct) child property with given name (or NULL if not found).
2091 */
2092 wxPGProperty* GetPropertyByName( const wxString& name ) const;
2093
2094 #ifdef SWIG
2095 %extend {
2096 DocStr(GetClientData,
2097 "Returns the client data object for a property", "");
2098 PyObject* GetClientData() {
2099 wxPyClientData* data = (wxPyClientData*)self->GetClientObject();
2100 if (data) {
2101 Py_INCREF(data->m_obj);
2102 return data->m_obj;
2103 } else {
2104 Py_INCREF(Py_None);
2105 return Py_None;
2106 }
2107 }
2108
2109 DocStr(SetClientData,
2110 "Associate the given client data.", "");
2111 void SetClientData(PyObject* clientData) {
2112 wxPyClientData* data = new wxPyClientData(clientData);
2113 self->SetClientObject(data);
2114 }
2115 }
2116 %pythoncode {
2117 GetClientObject = GetClientData
2118 SetClientObject = SetClientData
2119 }
2120 #endif
2121
2122 #ifndef SWIG
2123
2124 // Returns various display-related information for given column
2125 void GetDisplayInfo( unsigned int column,
2126 int choiceIndex,
2127 int flags,
2128 wxString* pString,
2129 const wxPGCell** pCell );
2130
2131 static wxString* sm_wxPG_LABEL;
2132
2133 /** This member is public so scripting language bindings
2134 wrapper code can access it freely.
2135 */
2136 void* m_clientData;
2137
2138 protected:
2139
2140 /**
2141 Sets property cell in fashion that reduces number of exclusive
2142 copies of cell data. Used when setting, for instance, same
2143 background colour for a number of properties.
2144
2145 @param firstCol
2146 First column to affect.
2147
2148 @param lastCol
2149 Last column to affect.
2150
2151 @param preparedCell
2152 Pre-prepared cell that is used for those which cell data
2153 before this matched unmodCellData.
2154
2155 @param srcData
2156 If unmodCellData did not match, valid cell data from this
2157 is merged into cell (usually generating new exclusive copy
2158 of cell's data).
2159
2160 @param unmodCellData
2161 If cell's cell data matches this, its cell is now set to
2162 preparedCell.
2163
2164 @param ignoreWithFlags
2165 Properties with any one of these flags are skipped.
2166
2167 @param recursively
2168 If @true, apply this operation recursively in child properties.
2169 */
2170 void AdaptiveSetCell( unsigned int firstCol,
2171 unsigned int lastCol,
2172 const wxPGCell& preparedCell,
2173 const wxPGCell& srcData,
2174 wxPGCellData* unmodCellData,
2175 FlagType ignoreWithFlags,
2176 bool recursively );
2177
2178 /**
2179 Makes sure m_cells has size of column+1 (or more).
2180 */
2181 void EnsureCells( unsigned int column );
2182
2183 /** Returns (direct) child property with given name (or NULL if not found),
2184 with hint index.
2185
2186 @param hintIndex
2187 Start looking for the child at this index.
2188
2189 @remarks
2190 Does not support scope (ie. Parent.Child notation).
2191 */
2192 wxPGProperty* GetPropertyByNameWH( const wxString& name,
2193 unsigned int hintIndex ) const;
2194
2195 /** This is used by Insert etc. */
2196 void AddChild2( wxPGProperty* prop,
2197 int index = -1,
2198 bool correct_mode = true );
2199
2200 void DoGenerateComposedValue( wxString& text,
2201 int argFlags = wxPG_VALUE_IS_CURRENT,
2202 const wxVariantList* valueOverrides = NULL,
2203 wxPGHashMapS2S* childResults = NULL ) const;
2204
2205 void DoSetName(const wxString& str) { m_name = str; }
2206
2207 void InitAfterAdded( wxPropertyGridPageState* pageState,
2208 wxPropertyGrid* propgrid );
2209
2210 // Removes child property with given pointer. Does not delete it.
2211 void RemoveChild( wxPGProperty* p );
2212
2213 void SetParentState( wxPropertyGridPageState* pstate )
2214 { m_parentState = pstate; }
2215
2216 // Call after fixed sub-properties added/removed after creation.
2217 // if oldSelInd >= 0 and < new max items, then selection is
2218 // moved to it.
2219 void SubPropsChanged( int oldSelInd = -1 );
2220
2221 int GetY2( int lh ) const;
2222
2223 wxString m_label;
2224 wxString m_name;
2225 wxPGProperty* m_parent;
2226 wxPropertyGridPageState* m_parentState;
2227
2228 wxClientData* m_clientObject;
2229
2230 // Overrides editor returned by property class
2231 const wxPGEditor* m_customEditor;
2232 #if wxUSE_VALIDATORS
2233 // Editor is going to get this validator
2234 wxValidator* m_validator;
2235 #endif
2236 // Show this in front of the value
2237 //
2238 // TODO: Can bitmap be implemented with wxPGCell?
2239 wxBitmap* m_valueBitmap;
2240
2241 wxVariant m_value;
2242 wxPGAttributeStorage m_attributes;
2243 wxArrayPGProperty m_children;
2244
2245 // Extended cell information
2246 wxVector<wxPGCell> m_cells;
2247
2248 // Choices shown in drop-down list of editor control.
2249 wxPGChoices m_choices;
2250
2251 // Help shown in statusbar or help box.
2252 wxString m_helpString;
2253
2254 // Index in parent's property array.
2255 unsigned int m_arrIndex;
2256
2257 // If not -1, then overrides m_value
2258 int m_commonValue;
2259
2260 FlagType m_flags;
2261
2262 // Maximum length (mainly for string properties). Could be in some sort of
2263 // wxBaseStringProperty, but currently, for maximum flexibility and
2264 // compatibility, we'll stick it here. Anyway, we had 3 excess bytes to use
2265 // so short int will fit in just fine.
2266 short m_maxLen;
2267
2268 // Root has 0, categories etc. at that level 1, etc.
2269 unsigned char m_depth;
2270
2271 // m_depthBgCol indicates width of background colour between margin and item
2272 // (essentially this is category's depth, if none then equals m_depth).
2273 unsigned char m_depthBgCol;
2274
2275 private:
2276 // Called in constructors.
2277 void Init();
2278 void Init( const wxString& label, const wxString& name );
2279 #endif // #ifndef SWIG
2280 };
2281
2282 // -----------------------------------------------------------------------
2283
2284 //
2285 // Property class declaration helper macros
2286 // (wxPGRootPropertyClass and wxPropertyCategory require this).
2287 //
2288
2289 #define WX_PG_DECLARE_DOGETEDITORCLASS \
2290 virtual const wxPGEditor* DoGetEditorClass() const;
2291
2292 #ifndef SWIG
2293 #define WX_PG_DECLARE_PROPERTY_CLASS(CLASSNAME) \
2294 public: \
2295 DECLARE_DYNAMIC_CLASS(CLASSNAME) \
2296 WX_PG_DECLARE_DOGETEDITORCLASS \
2297 private:
2298 #else
2299 #define WX_PG_DECLARE_PROPERTY_CLASS(CLASSNAME)
2300 #endif
2301
2302 // Implements sans constructor function. Also, first arg is class name, not
2303 // property name.
2304 #define WX_PG_IMPLEMENT_PROPERTY_CLASS_PLAIN(PROPNAME,T,EDITOR) \
2305 const wxPGEditor* PROPNAME::DoGetEditorClass() const \
2306 { \
2307 return wxPGEditor_##EDITOR; \
2308 }
2309
2310 // -----------------------------------------------------------------------
2311
2312 #ifndef SWIG
2313
2314 /** @class wxPGRootProperty
2315 @ingroup classes
2316 Root parent property.
2317 */
2318 class WXDLLIMPEXP_PROPGRID wxPGRootProperty : public wxPGProperty
2319 {
2320 public:
2321 WX_PG_DECLARE_PROPERTY_CLASS(wxPGRootProperty)
2322 public:
2323
2324 /** Constructor. */
2325 wxPGRootProperty();
2326 virtual ~wxPGRootProperty();
2327
2328 virtual bool StringToValue( wxVariant&, const wxString&, int ) const
2329 {
2330 return false;
2331 }
2332
2333 protected:
2334 };
2335
2336 // -----------------------------------------------------------------------
2337
2338 /** @class wxPropertyCategory
2339 @ingroup classes
2340 Category (caption) property.
2341 */
2342 class WXDLLIMPEXP_PROPGRID wxPropertyCategory : public wxPGProperty
2343 {
2344 friend class wxPropertyGrid;
2345 friend class wxPropertyGridPageState;
2346 WX_PG_DECLARE_PROPERTY_CLASS(wxPropertyCategory)
2347 public:
2348
2349 /** Default constructor is only used in special cases. */
2350 wxPropertyCategory();
2351
2352 wxPropertyCategory( const wxString& label,
2353 const wxString& name = wxPG_LABEL );
2354 ~wxPropertyCategory();
2355
2356 int GetTextExtent( const wxWindow* wnd, const wxFont& font ) const;
2357
2358 protected:
2359 virtual wxString ValueToString( wxVariant& value, int argFlags ) const;
2360
2361 void SetTextColIndex( unsigned int colInd )
2362 { m_capFgColIndex = (wxByte) colInd; }
2363 unsigned int GetTextColIndex() const
2364 { return (unsigned int) m_capFgColIndex; }
2365
2366 void CalculateTextExtent( wxWindow* wnd, const wxFont& font );
2367
2368 int m_textExtent; // pre-calculated length of text
2369 wxByte m_capFgColIndex; // caption text colour index
2370
2371 private:
2372 void Init();
2373 };
2374
2375 #endif // !SWIG
2376
2377 // -----------------------------------------------------------------------
2378
2379 #endif // wxUSE_PROPGRID
2380
2381 #endif // _WX_PROPGRID_PROPERTY_H_