1 /////////////////////////////////////////////////////////////////////////////
2 // Name: wx/propgrid/propgridpagestate.h
3 // Purpose: wxPropertyGridPageState class
4 // Author: Jaakko Salli
8 // Copyright: (c) Jaakko Salli
9 // Licence: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
12 #ifndef _WX_PROPGRID_PROPGRIDPAGESTATE_H_
13 #define _WX_PROPGRID_PROPGRIDPAGESTATE_H_
17 #include "wx/propgrid/property.h"
19 // -----------------------------------------------------------------------
21 /** @section propgrid_hittestresult wxPropertyGridHitTestResult
23 A return value from wxPropertyGrid::HitTest(),
24 contains all you need to know about an arbitrary location on the grid.
26 struct WXDLLIMPEXP_PROPGRID wxPropertyGridHitTestResult
28 friend class wxPropertyGridPageState
;
31 wxPGProperty
* GetProperty() const { return property
; }
33 /** Column. -1 for margin. */
36 /** Index of splitter hit, -1 for none. */
39 /** If splitter hit, offset to that */
40 int splitterHitOffset
;
43 /** Property. NULL if empty space below properties was hit */
44 wxPGProperty
* property
;
47 // -----------------------------------------------------------------------
49 #define wxPG_IT_CHILDREN(A) ((A)<<16)
51 /** @section propgrid_iterator_flags wxPropertyGridIterator Flags
54 NOTES: At lower 16-bits, there are flags to check if item will be included.
55 At higher 16-bits, there are same flags, but to instead check if children
59 enum wxPG_ITERATOR_FLAGS
63 Iterate through 'normal' property items (does not include children of
64 aggregate or hidden items by default).
66 wxPG_ITERATE_PROPERTIES
= wxPG_PROP_PROPERTY
|
67 wxPG_PROP_MISC_PARENT
|
70 wxPG_IT_CHILDREN(wxPG_PROP_MISC_PARENT
) |
71 wxPG_IT_CHILDREN(wxPG_PROP_CATEGORY
),
73 /** Iterate children of collapsed parents, and individual items that are hidden.
75 wxPG_ITERATE_HIDDEN
= wxPG_PROP_HIDDEN
|
76 wxPG_IT_CHILDREN(wxPG_PROP_COLLAPSED
),
79 Iterate children of parent that is an aggregate property (ie has fixed
82 wxPG_ITERATE_FIXED_CHILDREN
= wxPG_IT_CHILDREN(wxPG_PROP_AGGREGATE
) |
83 wxPG_ITERATE_PROPERTIES
,
85 /** Iterate categories.
86 Note that even without this flag, children of categories are still iterated
89 wxPG_ITERATE_CATEGORIES
= wxPG_PROP_CATEGORY
|
90 wxPG_IT_CHILDREN(wxPG_PROP_CATEGORY
) |
93 wxPG_ITERATE_ALL_PARENTS
= wxPG_PROP_MISC_PARENT
|
97 wxPG_ITERATE_ALL_PARENTS_RECURSIVELY
= wxPG_ITERATE_ALL_PARENTS
|
99 wxPG_ITERATE_ALL_PARENTS
),
101 wxPG_ITERATOR_FLAGS_ALL
= wxPG_PROP_PROPERTY
|
102 wxPG_PROP_MISC_PARENT
|
103 wxPG_PROP_AGGREGATE
|
108 wxPG_ITERATOR_MASK_OP_ITEM
= wxPG_ITERATOR_FLAGS_ALL
,
110 // (wxPG_PROP_MISC_PARENT|wxPG_PROP_AGGREGATE|wxPG_PROP_CATEGORY)
111 wxPG_ITERATOR_MASK_OP_PARENT
= wxPG_ITERATOR_FLAGS_ALL
,
113 /** Combines all flags needed to iterate through visible properties
114 (ie hidden properties and children of collapsed parents are skipped).
116 wxPG_ITERATE_VISIBLE
= wxPG_ITERATE_PROPERTIES
|
118 wxPG_IT_CHILDREN(wxPG_PROP_AGGREGATE
),
120 /** Iterate all items.
122 wxPG_ITERATE_ALL
= wxPG_ITERATE_VISIBLE
|
125 /** Iterate through individual properties (ie categories and children of
126 aggregate properties are skipped).
128 wxPG_ITERATE_NORMAL
= wxPG_ITERATE_PROPERTIES
|
131 /** Default iterator flags.
133 wxPG_ITERATE_DEFAULT
= wxPG_ITERATE_NORMAL
141 #define wxPG_ITERATOR_CREATE_MASKS(FLAGS, A, B) \
142 A = (FLAGS ^ wxPG_ITERATOR_MASK_OP_ITEM) & \
143 wxPG_ITERATOR_MASK_OP_ITEM & 0xFFFF; \
144 B = ((FLAGS>>16) ^ wxPG_ITERATOR_MASK_OP_PARENT) & \
145 wxPG_ITERATOR_MASK_OP_PARENT & 0xFFFF;
148 // Macro to test if children of PWC should be iterated through
149 #define wxPG_ITERATOR_PARENTEXMASK_TEST(PWC, PARENTMASK) \
151 !(PWC->GetFlags() & PARENTMASK) && \
152 PWC->GetChildCount() \
156 // Base for wxPropertyGridIterator classes.
157 class WXDLLIMPEXP_PROPGRID wxPropertyGridIteratorBase
160 wxPropertyGridIteratorBase()
164 void Assign( const wxPropertyGridIteratorBase
& it
);
166 bool AtEnd() const { return m_property
== NULL
; }
168 /** Get current property.
170 wxPGProperty
* GetProperty() const { return m_property
; }
172 void Init( wxPropertyGridPageState
* state
,
174 wxPGProperty
* property
,
177 void Init( wxPropertyGridPageState
* state
,
179 int startPos
= wxTOP
,
182 /** Iterate to the next property.
184 void Next( bool iterateChildren
= true );
186 /** Iterate to the previous property.
191 Set base parent, ie a property when, in which iteration returns, it
194 Default base parent is the root of the used wxPropertyGridPageState.
196 void SetBaseParent( wxPGProperty
* baseParent
)
197 { m_baseParent
= baseParent
; }
201 wxPGProperty
* m_property
;
204 wxPropertyGridPageState
* m_state
;
205 wxPGProperty
* m_baseParent
;
207 // Masks are used to quickly exclude items
213 #define wxPG_IMPLEMENT_ITERATOR(CLASS, PROPERTY, STATE) \
214 CLASS( STATE* state, int flags = wxPG_ITERATE_DEFAULT, \
215 PROPERTY* property = NULL, int dir = 1 ) \
216 : wxPropertyGridIteratorBase() \
217 { Init( (wxPropertyGridPageState*)state, flags, \
218 (wxPGProperty*)property, dir ); } \
219 CLASS( STATE* state, int flags, int startPos, int dir = 0 ) \
220 : wxPropertyGridIteratorBase() \
221 { Init( (wxPropertyGridPageState*)state, flags, startPos, dir ); } \
223 : wxPropertyGridIteratorBase() \
227 CLASS( const CLASS& it ) \
228 : wxPropertyGridIteratorBase( ) \
235 const CLASS& operator=( const CLASS& it ) \
240 CLASS& operator++() { Next(); return *this; } \
241 CLASS operator++(int) { CLASS it=*this;Next();return it; } \
242 CLASS& operator--() { Prev(); return *this; } \
243 CLASS operator--(int) { CLASS it=*this;Prev();return it; } \
244 PROPERTY* operator *() const { return (PROPERTY*)m_property; } \
245 static PROPERTY* OneStep( STATE* state, \
246 int flags = wxPG_ITERATE_DEFAULT, \
247 PROPERTY* property = NULL, \
250 CLASS it( state, flags, property, dir ); \
253 if ( dir == 1 ) it.Next(); \
260 /** @class wxPropertyGridIterator
262 Preferable way to iterate through contents of wxPropertyGrid,
263 wxPropertyGridManager, and wxPropertyGridPage.
265 See wxPropertyGridInterface::GetIterator() for more information about usage.
270 class WXDLLIMPEXP_PROPGRID
271 wxPropertyGridIterator
: public wxPropertyGridIteratorBase
275 wxPG_IMPLEMENT_ITERATOR(wxPropertyGridIterator
,
277 wxPropertyGridPageState
)
283 // Const version of wxPropertyGridIterator.
284 class WXDLLIMPEXP_PROPGRID
285 wxPropertyGridConstIterator
: public wxPropertyGridIteratorBase
288 wxPG_IMPLEMENT_ITERATOR(wxPropertyGridConstIterator
,
290 const wxPropertyGridPageState
)
293 Additional copy constructor.
295 wxPropertyGridConstIterator( const wxPropertyGridIterator
& other
)
301 Additional assignment operator.
303 const wxPropertyGridConstIterator
& operator=( const wxPropertyGridIterator
& it
)
312 // -----------------------------------------------------------------------
314 /** Base class to derive new viterators.
316 class WXDLLIMPEXP_PROPGRID wxPGVIteratorBase
318 friend class wxPGVIterator
;
320 wxPGVIteratorBase() { m_refCount
= 1; }
321 virtual void Next() = 0;
329 if ( m_refCount
<= 0 )
333 virtual ~wxPGVIteratorBase() { }
335 wxPropertyGridIterator m_it
;
340 /** @class wxPGVIterator
342 Abstract implementation of a simple iterator. Can only be used
343 to iterate in forward order, and only through the entire container.
344 Used to have functions dealing with all properties work with both
345 wxPropertyGrid and wxPropertyGridManager.
347 class WXDLLIMPEXP_PROPGRID wxPGVIterator
350 wxPGVIterator() { m_pIt
= NULL
; }
351 wxPGVIterator( wxPGVIteratorBase
* obj
) { m_pIt
= obj
; }
352 ~wxPGVIterator() { UnRef(); }
353 void UnRef() { if (m_pIt
) m_pIt
->DecRef(); }
354 wxPGVIterator( const wxPGVIterator
& it
)
360 const wxPGVIterator
& operator=( const wxPGVIterator
& it
)
368 void Next() { m_pIt
->Next(); }
369 bool AtEnd() const { return m_pIt
->m_it
.AtEnd(); }
370 wxPGProperty
* GetProperty() const { return m_pIt
->m_it
.GetProperty(); }
372 wxPGVIteratorBase
* m_pIt
;
375 // -----------------------------------------------------------------------
378 // We won't need this class from wxPython
380 /** @class wxPropertyGridPageState
382 Contains low-level property page information (properties, column widths,
383 etc) of a single wxPropertyGrid or single wxPropertyGridPage. Generally you
384 should not use this class directly, but instead member functions in
385 wxPropertyGridInterface, wxPropertyGrid, wxPropertyGridPage, and
386 wxPropertyGridManager.
389 - In separate wxPropertyGrid component this class was known as
391 - Currently this class is not implemented in wxPython.
396 class WXDLLIMPEXP_PROPGRID wxPropertyGridPageState
398 friend class wxPGProperty
;
399 friend class wxPropertyGrid
;
400 friend class wxPGCanvas
;
401 friend class wxPropertyGridInterface
;
402 friend class wxPropertyGridPage
;
403 friend class wxPropertyGridManager
;
406 /** Default constructor. */
407 wxPropertyGridPageState();
410 virtual ~wxPropertyGridPageState();
412 /** Makes sure all columns have minimum width.
414 void CheckColumnWidths( int widthChange
= 0 );
417 Override this member function to add custom behavior on property
420 virtual void DoDelete( wxPGProperty
* item
);
422 wxSize
DoFitColumns( bool allowGridResize
= false );
424 wxPGProperty
* DoGetItemAtY( int y
) const;
427 Override this member function to add custom behavior on property
430 virtual wxPGProperty
* DoInsert( wxPGProperty
* parent
,
432 wxPGProperty
* property
);
435 This needs to be overridden in grid used the manager so that splitter
436 changes can be propagated to other pages.
438 virtual void DoSetSplitterPosition( int pos
,
439 int splitterColumn
= 0,
440 bool allPages
= false,
441 bool fromAutoCenter
= false );
443 bool EnableCategories( bool enable
);
445 /** Make sure virtual height is up-to-date.
447 void EnsureVirtualHeight()
449 if ( m_vhCalcPending
)
451 RecalculateVirtualHeight();
456 /** Enables or disables given property and its subproperties. */
457 bool DoEnableProperty( wxPGProperty
* p
, bool enable
);
459 /** Returns (precalculated) height of contained visible properties.
461 unsigned int GetVirtualHeight() const
463 wxASSERT( !m_vhCalcPending
);
464 return m_virtualHeight
;
467 /** Returns (precalculated) height of contained visible properties.
469 unsigned int GetVirtualHeight()
471 EnsureVirtualHeight();
472 return m_virtualHeight
;
475 /** Returns actual height of contained visible properties.
477 Mostly used for internal diagnostic purposes.
479 inline unsigned int GetActualVirtualHeight() const;
481 unsigned int GetColumnCount() const
483 return (unsigned int) m_colWidths
.size();
486 wxPGProperty
* GetSelection() const
491 int GetColumnMinWidth( int column
) const;
493 int GetColumnWidth( unsigned int column
) const
495 return m_colWidths
[column
];
498 wxPropertyGrid
* GetGrid() const { return m_pPropGrid
; }
500 /** Returns last item which could be iterated using given flags.
502 @link iteratorflags List of iterator flags@endlink
504 wxPGProperty
* GetLastItem( int flags
= wxPG_ITERATE_DEFAULT
);
506 const wxPGProperty
* GetLastItem( int flags
= wxPG_ITERATE_DEFAULT
) const
508 return ((wxPropertyGridPageState
*)this)->GetLastItem(flags
);
511 wxPropertyCategory
* GetPropertyCategory( const wxPGProperty
* p
) const;
513 wxPGProperty
* GetPropertyByLabel( const wxString
& name
,
514 wxPGProperty
* parent
= NULL
) const;
516 wxVariant
DoGetPropertyValues( const wxString
& listname
,
517 wxPGProperty
* baseparent
,
520 wxPGProperty
* DoGetRoot() const { return m_properties
; }
522 void DoSetPropertyName( wxPGProperty
* p
, const wxString
& newName
);
524 // Returns combined width of margin and all the columns
525 int GetVirtualWidth() const
531 Returns minimal width for given column so that all images and texts
534 Used by SetSplitterLeft() and DoFitColumns().
536 int GetColumnFitWidth(wxClientDC
& dc
,
539 bool subProps
) const;
541 /** Returns information about arbitrary position in the grid.
543 wxPropertyGridHitTestResult definition:
545 struct wxPropertyGridHitTestResult
547 wxPGProperty* GetProperty() const;
549 // column. -1 for margin
552 // Index of splitter hit, -1 for none.
555 // If splitter hit, then offset to that.
556 int splitterHitOffset;
560 wxPropertyGridHitTestResult
HitTest( const wxPoint
& pt
) const;
562 /** Returns true if page is visibly displayed.
564 inline bool IsDisplayed() const;
566 bool IsInNonCatMode() const { return (bool)(m_properties
== m_abcArray
); }
568 /** Only inits arrays, doesn't migrate things or such. */
569 void InitNonCatMode ();
571 void DoLimitPropertyEditing( wxPGProperty
* p
, bool limit
= true )
573 p
->SetFlagRecursively(wxPG_PROP_NOEDITOR
, limit
);
576 bool DoSelectProperty( wxPGProperty
* p
, unsigned int flags
= 0 );
578 /** widthChange is non-client.
580 void OnClientWidthChange( int newWidth
,
582 bool fromOnResize
= false );
584 /** Recalculates m_virtualHeight.
586 void RecalculateVirtualHeight()
588 m_virtualHeight
= GetActualVirtualHeight();
591 void SetColumnCount( int colCount
);
593 void PropagateColSizeDec( int column
, int decrease
, int dir
);
595 bool DoHideProperty( wxPGProperty
* p
, bool hide
, int flags
= wxPG_RECURSE
);
597 bool DoSetPropertyValueString( wxPGProperty
* p
, const wxString
& value
);
599 bool DoSetPropertyValue( wxPGProperty
* p
, wxVariant
& value
);
601 bool DoSetPropertyValueWxObjectPtr( wxPGProperty
* p
, wxObject
* value
);
602 void DoSetPropertyValues( const wxVariantList
& list
,
603 wxPGProperty
* default_category
);
605 void DoSetPropertyValueUnspecified( wxPGProperty
* p
);
607 void SetSplitterLeft( bool subProps
= false );
609 /** Set virtual width for this particular page. */
610 void SetVirtualWidth( int width
);
612 void SortChildren( wxPGProperty
* p
);
615 void SetSelection( wxPGProperty
* p
) { m_selected
= p
; }
617 /** Called after virtual height needs to be recalculated.
619 void VirtualHeightChanged()
625 wxPGProperty
* DoAppend( wxPGProperty
* property
);
627 /** Returns property by its name. */
628 wxPGProperty
* BaseGetPropertyByName( const wxString
& name
) const;
630 void DoClearSelection()
635 /** Called in, for example, wxPropertyGrid::Clear. */
638 bool DoCollapse( wxPGProperty
* p
);
640 bool DoExpand( wxPGProperty
* p
);
642 void CalculateFontAndBitmapStuff( int vspacing
);
646 int DoGetSplitterPosition( int splitterIndex
= 0 ) const;
648 /** Returns column at x coordinate (in GetGrid()->GetPanel()).
650 Give pointer to int that receives index to splitter that is at x.
651 @param pSplitterHitOffset
652 Distance from said splitter.
654 int HitTestH( int x
, int* pSplitterHit
, int* pSplitterHitOffset
) const;
656 bool PrepareToAddItem( wxPGProperty
* property
,
657 wxPGProperty
* scheduledParent
);
659 /** If visible, then this is pointer to wxPropertyGrid.
660 This shall *never* be NULL to indicate that this state is not visible.
662 wxPropertyGrid
* m_pPropGrid
;
664 /** Pointer to currently used array. */
665 wxPGProperty
* m_properties
;
667 /** Array for categoric mode. */
668 wxPGRootProperty m_regularArray
;
670 /** Array for root of non-categoric mode. */
671 wxPGRootProperty
* m_abcArray
;
673 /** Dictionary for name-based access. */
674 wxPGHashMapS2P m_dictName
;
676 /** List of column widths (first column does not include margin). */
677 wxArrayInt m_colWidths
;
681 /** Most recently added category. */
682 wxPropertyCategory
* m_currentCategory
;
684 /** Pointer to selected property. */
685 wxPGProperty
* m_selected
;
687 /** Virtual width. */
690 /** Indicates total virtual height of visible properties. */
691 unsigned int m_virtualHeight
;
693 /** 1 if m_lastCaption is also the bottommost caption. */
694 unsigned char m_lastCaptionBottomnest
;
696 /** 1 items appended/inserted, so stuff needs to be done before drawing;
697 If m_virtualHeight == 0, then calcylatey's must be done.
700 unsigned char m_itemsAdded
;
702 /** 1 if any value is modified. */
703 unsigned char m_anyModified
;
705 unsigned char m_vhCalcPending
;
708 #endif // #ifndef SWIG
710 // -----------------------------------------------------------------------
712 #endif // wxUSE_PROPGRID
714 #endif // _WX_PROPGRID_PROPGRIDPAGESTATE_H_