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 ) \
241 CLASS& operator++() { Next(); return *this; } \
242 CLASS operator++(int) { CLASS it=*this;Next();return it; } \
243 CLASS& operator--() { Prev(); return *this; } \
244 CLASS operator--(int) { CLASS it=*this;Prev();return it; } \
245 PROPERTY* operator *() const { return (PROPERTY*)m_property; } \
246 static PROPERTY* OneStep( STATE* state, \
247 int flags = wxPG_ITERATE_DEFAULT, \
248 PROPERTY* property = NULL, \
251 CLASS it( state, flags, property, dir ); \
254 if ( dir == 1 ) it.Next(); \
261 /** @class wxPropertyGridIterator
263 Preferable way to iterate through contents of wxPropertyGrid,
264 wxPropertyGridManager, and wxPropertyGridPage.
266 See wxPropertyGridInterface::GetIterator() for more information about usage.
271 class WXDLLIMPEXP_PROPGRID
272 wxPropertyGridIterator
: public wxPropertyGridIteratorBase
276 wxPG_IMPLEMENT_ITERATOR(wxPropertyGridIterator
,
278 wxPropertyGridPageState
)
284 // Const version of wxPropertyGridIterator.
285 class WXDLLIMPEXP_PROPGRID
286 wxPropertyGridConstIterator
: public wxPropertyGridIteratorBase
289 wxPG_IMPLEMENT_ITERATOR(wxPropertyGridConstIterator
,
291 const wxPropertyGridPageState
)
294 Additional copy constructor.
296 wxPropertyGridConstIterator( const wxPropertyGridIterator
& other
)
302 Additional assignment operator.
304 const wxPropertyGridConstIterator
& operator=( const wxPropertyGridIterator
& it
)
313 // -----------------------------------------------------------------------
315 /** Base class to derive new viterators.
317 class WXDLLIMPEXP_PROPGRID wxPGVIteratorBase
: public wxObjectRefData
319 friend class wxPGVIterator
;
321 wxPGVIteratorBase() { }
322 virtual void Next() = 0;
324 virtual ~wxPGVIteratorBase() { }
326 wxPropertyGridIterator m_it
;
329 /** @class wxPGVIterator
331 Abstract implementation of a simple iterator. Can only be used
332 to iterate in forward order, and only through the entire container.
333 Used to have functions dealing with all properties work with both
334 wxPropertyGrid and wxPropertyGridManager.
336 class WXDLLIMPEXP_PROPGRID wxPGVIterator
339 wxPGVIterator() { m_pIt
= NULL
; }
340 wxPGVIterator( wxPGVIteratorBase
* obj
) { m_pIt
= obj
; }
341 ~wxPGVIterator() { UnRef(); }
342 void UnRef() { if (m_pIt
) m_pIt
->DecRef(); }
343 wxPGVIterator( const wxPGVIterator
& it
)
349 const wxPGVIterator
& operator=( const wxPGVIterator
& it
)
360 void Next() { m_pIt
->Next(); }
361 bool AtEnd() const { return m_pIt
->m_it
.AtEnd(); }
362 wxPGProperty
* GetProperty() const { return m_pIt
->m_it
.GetProperty(); }
364 wxPGVIteratorBase
* m_pIt
;
367 // -----------------------------------------------------------------------
370 // We won't need this class from wxPython
372 /** @class wxPropertyGridPageState
374 Contains low-level property page information (properties, column widths,
375 etc) of a single wxPropertyGrid or single wxPropertyGridPage. Generally you
376 should not use this class directly, but instead member functions in
377 wxPropertyGridInterface, wxPropertyGrid, wxPropertyGridPage, and
378 wxPropertyGridManager.
381 - In separate wxPropertyGrid component this class was known as
383 - Currently this class is not implemented in wxPython.
388 class WXDLLIMPEXP_PROPGRID wxPropertyGridPageState
390 friend class wxPGProperty
;
391 friend class wxPropertyGrid
;
392 friend class wxPGCanvas
;
393 friend class wxPropertyGridInterface
;
394 friend class wxPropertyGridPage
;
395 friend class wxPropertyGridManager
;
398 /** Default constructor. */
399 wxPropertyGridPageState();
402 virtual ~wxPropertyGridPageState();
404 /** Makes sure all columns have minimum width.
406 void CheckColumnWidths( int widthChange
= 0 );
409 Override this member function to add custom behavior on property
412 virtual void DoDelete( wxPGProperty
* item
, bool doDelete
= true );
414 wxSize
DoFitColumns( bool allowGridResize
= false );
416 wxPGProperty
* DoGetItemAtY( int y
) const;
419 Override this member function to add custom behavior on property
422 virtual wxPGProperty
* DoInsert( wxPGProperty
* parent
,
424 wxPGProperty
* property
);
427 This needs to be overridden in grid used the manager so that splitter
428 changes can be propagated to other pages.
430 virtual void DoSetSplitterPosition( int pos
,
431 int splitterColumn
= 0,
432 bool allPages
= false,
433 bool fromAutoCenter
= false );
435 bool EnableCategories( bool enable
);
437 /** Make sure virtual height is up-to-date.
439 void EnsureVirtualHeight()
441 if ( m_vhCalcPending
)
443 RecalculateVirtualHeight();
448 /** Enables or disables given property and its subproperties. */
449 bool DoEnableProperty( wxPGProperty
* p
, bool enable
);
451 /** Returns (precalculated) height of contained visible properties.
453 unsigned int GetVirtualHeight() const
455 wxASSERT( !m_vhCalcPending
);
456 return m_virtualHeight
;
459 /** Returns (precalculated) height of contained visible properties.
461 unsigned int GetVirtualHeight()
463 EnsureVirtualHeight();
464 return m_virtualHeight
;
467 /** Returns actual height of contained visible properties.
469 Mostly used for internal diagnostic purposes.
471 inline unsigned int GetActualVirtualHeight() const;
473 unsigned int GetColumnCount() const
475 return (unsigned int) m_colWidths
.size();
478 int GetColumnMinWidth( int column
) const;
480 int GetColumnWidth( unsigned int column
) const
482 return m_colWidths
[column
];
485 wxPropertyGrid
* GetGrid() const { return m_pPropGrid
; }
487 /** Returns last item which could be iterated using given flags.
489 @link iteratorflags List of iterator flags@endlink
491 wxPGProperty
* GetLastItem( int flags
= wxPG_ITERATE_DEFAULT
);
493 const wxPGProperty
* GetLastItem( int flags
= wxPG_ITERATE_DEFAULT
) const
495 return ((wxPropertyGridPageState
*)this)->GetLastItem(flags
);
499 Returns currently selected property.
501 wxPGProperty
* GetSelection() const
503 if ( m_selection
.size() == 0 )
505 return m_selection
[0];
508 void DoSetSelection( wxPGProperty
* prop
)
512 m_selection
.push_back(prop
);
515 bool DoClearSelection()
517 return DoSelectProperty(NULL
);
520 void DoRemoveFromSelection( wxPGProperty
* prop
);
522 wxPropertyCategory
* GetPropertyCategory( const wxPGProperty
* p
) const;
524 wxPGProperty
* GetPropertyByLabel( const wxString
& name
,
525 wxPGProperty
* parent
= NULL
) const;
527 wxVariant
DoGetPropertyValues( const wxString
& listname
,
528 wxPGProperty
* baseparent
,
531 wxPGProperty
* DoGetRoot() const { return m_properties
; }
533 void DoSetPropertyName( wxPGProperty
* p
, const wxString
& newName
);
535 // Returns combined width of margin and all the columns
536 int GetVirtualWidth() const
542 Returns minimal width for given column so that all images and texts
545 Used by SetSplitterLeft() and DoFitColumns().
547 int GetColumnFitWidth(wxClientDC
& dc
,
550 bool subProps
) const;
553 Returns information about arbitrary position in the grid.
556 Logical coordinates in the virtual grid space. Use
557 wxScrolledWindow::CalcUnscrolledPosition() if you need to
558 translate a scrolled position into a logical one.
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 void DoLimitPropertyEditing( wxPGProperty
* p
, bool limit
= true )
570 p
->SetFlagRecursively(wxPG_PROP_NOEDITOR
, limit
);
573 bool DoSelectProperty( wxPGProperty
* p
, unsigned int flags
= 0 );
575 /** widthChange is non-client.
577 void OnClientWidthChange( int newWidth
,
579 bool fromOnResize
= false );
581 /** Recalculates m_virtualHeight.
583 void RecalculateVirtualHeight()
585 m_virtualHeight
= GetActualVirtualHeight();
588 void SetColumnCount( int colCount
);
590 void PropagateColSizeDec( int column
, int decrease
, int dir
);
592 bool DoHideProperty( wxPGProperty
* p
, bool hide
, int flags
= wxPG_RECURSE
);
594 bool DoSetPropertyValueString( wxPGProperty
* p
, const wxString
& value
);
596 bool DoSetPropertyValue( wxPGProperty
* p
, wxVariant
& value
);
598 bool DoSetPropertyValueWxObjectPtr( wxPGProperty
* p
, wxObject
* value
);
599 void DoSetPropertyValues( const wxVariantList
& list
,
600 wxPGProperty
* default_category
);
602 void SetSplitterLeft( bool subProps
= false );
604 /** Set virtual width for this particular page. */
605 void SetVirtualWidth( int width
);
607 void DoSortChildren( wxPGProperty
* p
, int flags
= 0 );
608 void DoSort( int flags
= 0 );
610 bool PrepareAfterItemsAdded();
612 /** Called after virtual height needs to be recalculated.
614 void VirtualHeightChanged()
620 wxPGProperty
* DoAppend( wxPGProperty
* property
);
622 /** Returns property by its name. */
623 wxPGProperty
* BaseGetPropertyByName( const wxString
& name
) const;
625 /** Called in, for example, wxPropertyGrid::Clear. */
628 bool DoIsPropertySelected( wxPGProperty
* prop
) const;
630 bool DoCollapse( wxPGProperty
* p
);
632 bool DoExpand( wxPGProperty
* p
);
634 void CalculateFontAndBitmapStuff( int vspacing
);
638 int DoGetSplitterPosition( int splitterIndex
= 0 ) const;
640 /** Returns column at x coordinate (in GetGrid()->GetPanel()).
642 Give pointer to int that receives index to splitter that is at x.
643 @param pSplitterHitOffset
644 Distance from said splitter.
646 int HitTestH( int x
, int* pSplitterHit
, int* pSplitterHitOffset
) const;
648 bool PrepareToAddItem( wxPGProperty
* property
,
649 wxPGProperty
* scheduledParent
);
651 /** If visible, then this is pointer to wxPropertyGrid.
652 This shall *never* be NULL to indicate that this state is not visible.
654 wxPropertyGrid
* m_pPropGrid
;
656 /** Pointer to currently used array. */
657 wxPGProperty
* m_properties
;
659 /** Array for categoric mode. */
660 wxPGRootProperty m_regularArray
;
662 /** Array for root of non-categoric mode. */
663 wxPGRootProperty
* m_abcArray
;
665 /** Dictionary for name-based access. */
666 wxPGHashMapS2P m_dictName
;
668 /** List of column widths (first column does not include margin). */
669 wxArrayInt m_colWidths
;
671 /** List of indices of columns the user can edit by clicking it. */
672 wxArrayInt m_editableColumns
;
676 /** Most recently added category. */
677 wxPropertyCategory
* m_currentCategory
;
679 /** Array of selected property. */
680 wxArrayPGProperty m_selection
;
682 /** Virtual width. */
685 /** Indicates total virtual height of visible properties. */
686 unsigned int m_virtualHeight
;
688 /** 1 if m_lastCaption is also the bottommost caption. */
689 unsigned char m_lastCaptionBottomnest
;
691 /** 1 items appended/inserted, so stuff needs to be done before drawing;
692 If m_virtualHeight == 0, then calcylatey's must be done.
695 unsigned char m_itemsAdded
;
697 /** 1 if any value is modified. */
698 unsigned char m_anyModified
;
700 unsigned char m_vhCalcPending
;
703 /** Only inits arrays, doesn't migrate things or such. */
704 void InitNonCatMode();
707 #endif // #ifndef SWIG
709 // -----------------------------------------------------------------------
711 #endif // wxUSE_PROPGRID
713 #endif // _WX_PROPGRID_PROPGRIDPAGESTATE_H_