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 class WXDLLIMPEXP_PROPGRID wxPropertyGridHitTestResult
28 friend class wxPropertyGridPageState
;
30 wxPropertyGridHitTestResult()
35 m_splitterHitOffset
= 0;
38 ~wxPropertyGridHitTestResult()
43 Returns column hit. -1 for margin.
45 int GetColumn() const { return m_column
; }
48 Returns property hit. NULL if empty space below
49 properties was hit instead.
51 wxPGProperty
* GetProperty() const
57 Returns index of splitter hit, -1 for none.
59 int GetSplitter() const { return m_splitter
; }
62 If splitter hit, then this member function
63 returns offset to the exact splitter position.
65 int GetSplitterHitOffset() const { return m_splitterHitOffset
; }
68 /** Property. NULL if empty space below properties was hit */
69 wxPGProperty
* m_property
;
71 /** Column. -1 for margin. */
74 /** Index of splitter hit, -1 for none. */
77 /** If splitter hit, offset to that */
78 int m_splitterHitOffset
;
81 // -----------------------------------------------------------------------
83 #define wxPG_IT_CHILDREN(A) ((A)<<16)
85 /** @section propgrid_iterator_flags wxPropertyGridIterator Flags
88 NOTES: At lower 16-bits, there are flags to check if item will be included.
89 At higher 16-bits, there are same flags, but to instead check if children
93 enum wxPG_ITERATOR_FLAGS
97 Iterate through 'normal' property items (does not include children of
98 aggregate or hidden items by default).
100 wxPG_ITERATE_PROPERTIES
= wxPG_PROP_PROPERTY
|
101 wxPG_PROP_MISC_PARENT
|
102 wxPG_PROP_AGGREGATE
|
103 wxPG_PROP_COLLAPSED
|
104 wxPG_IT_CHILDREN(wxPG_PROP_MISC_PARENT
) |
105 wxPG_IT_CHILDREN(wxPG_PROP_CATEGORY
),
107 /** Iterate children of collapsed parents, and individual items that are hidden.
109 wxPG_ITERATE_HIDDEN
= wxPG_PROP_HIDDEN
|
110 wxPG_IT_CHILDREN(wxPG_PROP_COLLAPSED
),
113 Iterate children of parent that is an aggregate property (ie has fixed
116 wxPG_ITERATE_FIXED_CHILDREN
= wxPG_IT_CHILDREN(wxPG_PROP_AGGREGATE
) |
117 wxPG_ITERATE_PROPERTIES
,
119 /** Iterate categories.
120 Note that even without this flag, children of categories are still iterated
123 wxPG_ITERATE_CATEGORIES
= wxPG_PROP_CATEGORY
|
124 wxPG_IT_CHILDREN(wxPG_PROP_CATEGORY
) |
127 wxPG_ITERATE_ALL_PARENTS
= wxPG_PROP_MISC_PARENT
|
128 wxPG_PROP_AGGREGATE
|
131 wxPG_ITERATE_ALL_PARENTS_RECURSIVELY
= wxPG_ITERATE_ALL_PARENTS
|
133 wxPG_ITERATE_ALL_PARENTS
),
135 wxPG_ITERATOR_FLAGS_ALL
= wxPG_PROP_PROPERTY
|
136 wxPG_PROP_MISC_PARENT
|
137 wxPG_PROP_AGGREGATE
|
142 wxPG_ITERATOR_MASK_OP_ITEM
= wxPG_ITERATOR_FLAGS_ALL
,
144 // (wxPG_PROP_MISC_PARENT|wxPG_PROP_AGGREGATE|wxPG_PROP_CATEGORY)
145 wxPG_ITERATOR_MASK_OP_PARENT
= wxPG_ITERATOR_FLAGS_ALL
,
147 /** Combines all flags needed to iterate through visible properties
148 (ie hidden properties and children of collapsed parents are skipped).
150 wxPG_ITERATE_VISIBLE
= wxPG_ITERATE_PROPERTIES
|
152 wxPG_IT_CHILDREN(wxPG_PROP_AGGREGATE
),
154 /** Iterate all items.
156 wxPG_ITERATE_ALL
= wxPG_ITERATE_VISIBLE
|
159 /** Iterate through individual properties (ie categories and children of
160 aggregate properties are skipped).
162 wxPG_ITERATE_NORMAL
= wxPG_ITERATE_PROPERTIES
|
165 /** Default iterator flags.
167 wxPG_ITERATE_DEFAULT
= wxPG_ITERATE_NORMAL
175 #define wxPG_ITERATOR_CREATE_MASKS(FLAGS, A, B) \
176 A = (FLAGS ^ wxPG_ITERATOR_MASK_OP_ITEM) & \
177 wxPG_ITERATOR_MASK_OP_ITEM & 0xFFFF; \
178 B = ((FLAGS>>16) ^ wxPG_ITERATOR_MASK_OP_PARENT) & \
179 wxPG_ITERATOR_MASK_OP_PARENT & 0xFFFF;
182 // Macro to test if children of PWC should be iterated through
183 #define wxPG_ITERATOR_PARENTEXMASK_TEST(PWC, PARENTMASK) \
185 !(PWC->GetFlags() & PARENTMASK) && \
186 PWC->GetChildCount() \
190 // Base for wxPropertyGridIterator classes.
191 class WXDLLIMPEXP_PROPGRID wxPropertyGridIteratorBase
194 wxPropertyGridIteratorBase()
198 void Assign( const wxPropertyGridIteratorBase
& it
);
200 bool AtEnd() const { return m_property
== NULL
; }
202 /** Get current property.
204 wxPGProperty
* GetProperty() const { return m_property
; }
206 void Init( wxPropertyGridPageState
* state
,
208 wxPGProperty
* property
,
211 void Init( wxPropertyGridPageState
* state
,
213 int startPos
= wxTOP
,
216 /** Iterate to the next property.
218 void Next( bool iterateChildren
= true );
220 /** Iterate to the previous property.
225 Set base parent, ie a property when, in which iteration returns, it
228 Default base parent is the root of the used wxPropertyGridPageState.
230 void SetBaseParent( wxPGProperty
* baseParent
)
231 { m_baseParent
= baseParent
; }
235 wxPGProperty
* m_property
;
238 wxPropertyGridPageState
* m_state
;
239 wxPGProperty
* m_baseParent
;
241 // Masks are used to quickly exclude items
247 #define wxPG_IMPLEMENT_ITERATOR(CLASS, PROPERTY, STATE) \
248 CLASS( STATE* state, int flags = wxPG_ITERATE_DEFAULT, \
249 PROPERTY* property = NULL, int dir = 1 ) \
250 : wxPropertyGridIteratorBase() \
251 { Init( (wxPropertyGridPageState*)state, flags, \
252 (wxPGProperty*)property, dir ); } \
253 CLASS( STATE* state, int flags, int startPos, int dir = 0 ) \
254 : wxPropertyGridIteratorBase() \
255 { Init( (wxPropertyGridPageState*)state, flags, startPos, dir ); } \
257 : wxPropertyGridIteratorBase() \
261 CLASS( const CLASS& it ) \
262 : wxPropertyGridIteratorBase( ) \
269 const CLASS& operator=( const CLASS& it ) \
275 CLASS& operator++() { Next(); return *this; } \
276 CLASS operator++(int) { CLASS it=*this;Next();return it; } \
277 CLASS& operator--() { Prev(); return *this; } \
278 CLASS operator--(int) { CLASS it=*this;Prev();return it; } \
279 PROPERTY* operator *() const { return (PROPERTY*)m_property; } \
280 static PROPERTY* OneStep( STATE* state, \
281 int flags = wxPG_ITERATE_DEFAULT, \
282 PROPERTY* property = NULL, \
285 CLASS it( state, flags, property, dir ); \
288 if ( dir == 1 ) it.Next(); \
295 /** @class wxPropertyGridIterator
297 Preferable way to iterate through contents of wxPropertyGrid,
298 wxPropertyGridManager, and wxPropertyGridPage.
300 See wxPropertyGridInterface::GetIterator() for more information about usage.
305 class WXDLLIMPEXP_PROPGRID
306 wxPropertyGridIterator
: public wxPropertyGridIteratorBase
310 wxPG_IMPLEMENT_ITERATOR(wxPropertyGridIterator
,
312 wxPropertyGridPageState
)
318 // Const version of wxPropertyGridIterator.
319 class WXDLLIMPEXP_PROPGRID
320 wxPropertyGridConstIterator
: public wxPropertyGridIteratorBase
323 wxPG_IMPLEMENT_ITERATOR(wxPropertyGridConstIterator
,
325 const wxPropertyGridPageState
)
328 Additional copy constructor.
330 wxPropertyGridConstIterator( const wxPropertyGridIterator
& other
)
336 Additional assignment operator.
338 const wxPropertyGridConstIterator
& operator=( const wxPropertyGridIterator
& it
)
347 // -----------------------------------------------------------------------
349 /** Base class to derive new viterators.
351 class WXDLLIMPEXP_PROPGRID wxPGVIteratorBase
: public wxObjectRefData
353 friend class wxPGVIterator
;
355 wxPGVIteratorBase() { }
356 virtual void Next() = 0;
358 virtual ~wxPGVIteratorBase() { }
360 wxPropertyGridIterator m_it
;
363 /** @class wxPGVIterator
365 Abstract implementation of a simple iterator. Can only be used
366 to iterate in forward order, and only through the entire container.
367 Used to have functions dealing with all properties work with both
368 wxPropertyGrid and wxPropertyGridManager.
370 class WXDLLIMPEXP_PROPGRID wxPGVIterator
373 wxPGVIterator() { m_pIt
= NULL
; }
374 wxPGVIterator( wxPGVIteratorBase
* obj
) { m_pIt
= obj
; }
375 ~wxPGVIterator() { UnRef(); }
376 void UnRef() { if (m_pIt
) m_pIt
->DecRef(); }
377 wxPGVIterator( const wxPGVIterator
& it
)
382 const wxPGVIterator
& operator=( const wxPGVIterator
& it
)
392 void Next() { m_pIt
->Next(); }
393 bool AtEnd() const { return m_pIt
->m_it
.AtEnd(); }
394 wxPGProperty
* GetProperty() const { return m_pIt
->m_it
.GetProperty(); }
396 wxPGVIteratorBase
* m_pIt
;
399 // -----------------------------------------------------------------------
401 /** @class wxPropertyGridPageState
403 Contains low-level property page information (properties, column widths,
404 etc) of a single wxPropertyGrid or single wxPropertyGridPage. Generally you
405 should not use this class directly, but instead member functions in
406 wxPropertyGridInterface, wxPropertyGrid, wxPropertyGridPage, and
407 wxPropertyGridManager.
410 - In separate wxPropertyGrid component this class was known as
412 - Currently this class is not implemented in wxPython.
417 class WXDLLIMPEXP_PROPGRID wxPropertyGridPageState
419 friend class wxPGProperty
;
420 friend class wxPropertyGrid
;
421 friend class wxPGCanvas
;
422 friend class wxPropertyGridInterface
;
423 friend class wxPropertyGridPage
;
424 friend class wxPropertyGridManager
;
427 /** Default constructor. */
428 wxPropertyGridPageState();
431 virtual ~wxPropertyGridPageState();
433 /** Makes sure all columns have minimum width.
435 void CheckColumnWidths( int widthChange
= 0 );
438 Override this member function to add custom behavior on property
441 virtual void DoDelete( wxPGProperty
* item
, bool doDelete
= true );
443 wxSize
DoFitColumns( bool allowGridResize
= false );
445 wxPGProperty
* DoGetItemAtY( int y
) const;
448 Override this member function to add custom behavior on property
451 virtual wxPGProperty
* DoInsert( wxPGProperty
* parent
,
453 wxPGProperty
* property
);
456 This needs to be overridden in grid used the manager so that splitter
457 changes can be propagated to other pages.
459 virtual void DoSetSplitterPosition( int pos
,
460 int splitterColumn
= 0,
463 bool EnableCategories( bool enable
);
465 /** Make sure virtual height is up-to-date.
467 void EnsureVirtualHeight()
469 if ( m_vhCalcPending
)
471 RecalculateVirtualHeight();
476 /** Enables or disables given property and its subproperties. */
477 bool DoEnableProperty( wxPGProperty
* p
, bool enable
);
479 /** Returns (precalculated) height of contained visible properties.
481 unsigned int GetVirtualHeight() const
483 wxASSERT( !m_vhCalcPending
);
484 return m_virtualHeight
;
487 /** Returns (precalculated) height of contained visible properties.
489 unsigned int GetVirtualHeight()
491 EnsureVirtualHeight();
492 return m_virtualHeight
;
495 /** Returns actual height of contained visible properties.
497 Mostly used for internal diagnostic purposes.
499 inline unsigned int GetActualVirtualHeight() const;
501 unsigned int GetColumnCount() const
503 return (unsigned int) m_colWidths
.size();
506 int GetColumnMinWidth( int column
) const;
508 int GetColumnWidth( unsigned int column
) const
510 return m_colWidths
[column
];
513 wxPropertyGrid
* GetGrid() const { return m_pPropGrid
; }
515 /** Returns last item which could be iterated using given flags.
517 @link iteratorflags List of iterator flags@endlink
519 wxPGProperty
* GetLastItem( int flags
= wxPG_ITERATE_DEFAULT
);
521 const wxPGProperty
* GetLastItem( int flags
= wxPG_ITERATE_DEFAULT
) const
523 return ((wxPropertyGridPageState
*)this)->GetLastItem(flags
);
527 Returns currently selected property.
529 wxPGProperty
* GetSelection() const
531 if ( m_selection
.size() == 0 )
533 return m_selection
[0];
536 void DoSetSelection( wxPGProperty
* prop
)
540 m_selection
.push_back(prop
);
543 bool DoClearSelection()
545 return DoSelectProperty(NULL
);
548 void DoRemoveFromSelection( wxPGProperty
* prop
);
550 void DoSetColumnProportion( unsigned int column
, int proportion
);
552 int DoGetColumnProportion( unsigned int column
) const
554 return m_columnProportions
[column
];
557 void ResetColumnSizes( int setSplitterFlags
);
559 wxPropertyCategory
* GetPropertyCategory( const wxPGProperty
* p
) const;
561 wxPGProperty
* GetPropertyByLabel( const wxString
& name
,
562 wxPGProperty
* parent
= NULL
) const;
564 wxVariant
DoGetPropertyValues( const wxString
& listname
,
565 wxPGProperty
* baseparent
,
568 wxPGProperty
* DoGetRoot() const { return m_properties
; }
570 void DoSetPropertyName( wxPGProperty
* p
, const wxString
& newName
);
572 // Returns combined width of margin and all the columns
573 int GetVirtualWidth() const
579 Returns minimal width for given column so that all images and texts
582 Used by SetSplitterLeft() and DoFitColumns().
584 int GetColumnFitWidth(wxClientDC
& dc
,
587 bool subProps
) const;
590 Returns information about arbitrary position in the grid.
593 Logical coordinates in the virtual grid space. Use
594 wxScrolledWindow::CalcUnscrolledPosition() if you need to
595 translate a scrolled position into a logical one.
597 wxPropertyGridHitTestResult
HitTest( const wxPoint
& pt
) const;
599 /** Returns true if page is visibly displayed.
601 inline bool IsDisplayed() const;
603 bool IsInNonCatMode() const { return (bool)(m_properties
== m_abcArray
); }
605 void DoLimitPropertyEditing( wxPGProperty
* p
, bool limit
= true )
607 p
->SetFlagRecursively(wxPG_PROP_NOEDITOR
, limit
);
610 bool DoSelectProperty( wxPGProperty
* p
, unsigned int flags
= 0 );
612 /** widthChange is non-client.
614 void OnClientWidthChange( int newWidth
,
616 bool fromOnResize
= false );
618 /** Recalculates m_virtualHeight.
620 void RecalculateVirtualHeight()
622 m_virtualHeight
= GetActualVirtualHeight();
625 void SetColumnCount( int colCount
);
627 void PropagateColSizeDec( int column
, int decrease
, int dir
);
629 bool DoHideProperty( wxPGProperty
* p
, bool hide
, int flags
= wxPG_RECURSE
);
631 bool DoSetPropertyValueString( wxPGProperty
* p
, const wxString
& value
);
633 bool DoSetPropertyValue( wxPGProperty
* p
, wxVariant
& value
);
635 bool DoSetPropertyValueWxObjectPtr( wxPGProperty
* p
, wxObject
* value
);
636 void DoSetPropertyValues( const wxVariantList
& list
,
637 wxPGProperty
* default_category
);
639 void SetSplitterLeft( bool subProps
= false );
641 /** Set virtual width for this particular page. */
642 void SetVirtualWidth( int width
);
644 void DoSortChildren( wxPGProperty
* p
, int flags
= 0 );
645 void DoSort( int flags
= 0 );
647 bool PrepareAfterItemsAdded();
649 /** Called after virtual height needs to be recalculated.
651 void VirtualHeightChanged()
657 wxPGProperty
* DoAppend( wxPGProperty
* property
);
659 /** Returns property by its name. */
660 wxPGProperty
* BaseGetPropertyByName( const wxString
& name
) const;
662 /** Called in, for example, wxPropertyGrid::Clear. */
665 bool DoIsPropertySelected( wxPGProperty
* prop
) const;
667 bool DoCollapse( wxPGProperty
* p
);
669 bool DoExpand( wxPGProperty
* p
);
671 void CalculateFontAndBitmapStuff( int vspacing
);
675 // Utility to check if two properties are visibly next to each other
676 bool ArePropertiesAdjacent( wxPGProperty
* prop1
,
678 int iterFlags
= wxPG_ITERATE_VISIBLE
) const;
680 int DoGetSplitterPosition( int splitterIndex
= 0 ) const;
682 /** Returns column at x coordinate (in GetGrid()->GetPanel()).
684 Give pointer to int that receives index to splitter that is at x.
685 @param pSplitterHitOffset
686 Distance from said splitter.
688 int HitTestH( int x
, int* pSplitterHit
, int* pSplitterHitOffset
) const;
690 bool PrepareToAddItem( wxPGProperty
* property
,
691 wxPGProperty
* scheduledParent
);
693 /** If visible, then this is pointer to wxPropertyGrid.
694 This shall *never* be NULL to indicate that this state is not visible.
696 wxPropertyGrid
* m_pPropGrid
;
698 /** Pointer to currently used array. */
699 wxPGProperty
* m_properties
;
701 /** Array for categoric mode. */
702 wxPGRootProperty m_regularArray
;
704 /** Array for root of non-categoric mode. */
705 wxPGRootProperty
* m_abcArray
;
707 /** Dictionary for name-based access. */
708 wxPGHashMapS2P m_dictName
;
710 /** List of column widths (first column does not include margin). */
711 wxArrayInt m_colWidths
;
713 /** List of indices of columns the user can edit by clicking it. */
714 wxArrayInt m_editableColumns
;
716 /** Column proportions */
717 wxArrayInt m_columnProportions
;
721 /** Most recently added category. */
722 wxPropertyCategory
* m_currentCategory
;
724 /** Array of selected property. */
725 wxArrayPGProperty m_selection
;
727 /** Virtual width. */
730 /** Indicates total virtual height of visible properties. */
731 unsigned int m_virtualHeight
;
733 /** 1 if m_lastCaption is also the bottommost caption. */
734 unsigned char m_lastCaptionBottomnest
;
736 /** 1 items appended/inserted, so stuff needs to be done before drawing;
737 If m_virtualHeight == 0, then calcylatey's must be done.
740 unsigned char m_itemsAdded
;
742 /** 1 if any value is modified. */
743 unsigned char m_anyModified
;
745 unsigned char m_vhCalcPending
;
747 /** True if splitter has been pre-set by the application. */
748 bool m_isSplitterPreSet
;
750 /** Used to (temporarily) disable splitter centering. */
751 bool m_dontCenterSplitter
;
754 /** Only inits arrays, doesn't migrate things or such. */
755 void InitNonCatMode();
758 // -----------------------------------------------------------------------
760 #endif // wxUSE_PROPGRID
762 #endif // _WX_PROPGRID_PROPGRIDPAGESTATE_H_