1
/////////////////////////////////////////////////////////////////////////////
2
// Name: wx/propgrid/manager.h
3
// Purpose: wxPropertyGridManager
4
// Author: Jaakko Salli
7
// RCS-ID: $Id: manager.h 70937 2012-03-18 20:35:01Z JS $
8
// Copyright: (c) Jaakko Salli
9
// Licence: wxWindows licence
10
/////////////////////////////////////////////////////////////////////////////
12
#ifndef _WX_PROPGRID_MANAGER_H_
13
#define _WX_PROPGRID_MANAGER_H_
19
#include "wx/propgrid/propgrid.h"
21
#include "wx/dcclient.h"
22
#include "wx/scrolwin.h"
23
#include "wx/toolbar.h"
24
#include "wx/stattext.h"
25
#include "wx/button.h"
26
#include "wx/textctrl.h"
27
#include "wx/dialog.h"
28
#include "wx/headerctrl.h"
30
// -----------------------------------------------------------------------
33
extern WXDLLIMPEXP_DATA_PROPGRID(const char) wxPropertyGridManagerNameStr[];
36
/** @class wxPropertyGridPage
38
Holder of property grid page information. You can subclass this and
39
give instance in wxPropertyGridManager::AddPage. It inherits from
40
wxEvtHandler and can be used to process events specific to this
41
page (id of events will still be same as manager's). If you don't
42
want to use it to process all events of the page, you need to
43
return false in the derived wxPropertyGridPage::IsHandlingAllEvents.
45
Please note that wxPropertyGridPage lacks many non-const property
46
manipulation functions found in wxPropertyGridManager. Please use
47
parent manager (m_manager member variable) when needed.
49
Please note that most member functions are inherited and as such not
50
documented on this page. This means you will probably also want to read
51
wxPropertyGridInterface class reference.
53
@section propgridpage_event_handling Event Handling
55
wxPropertyGridPage receives events emitted by its wxPropertyGridManager, but
56
only those events that are specific to that page. If
57
wxPropertyGridPage::IsHandlingAllEvents returns false, then unhandled
58
events are sent to the manager's parent, as usual.
60
See @ref propgrid_event_handling "wxPropertyGrid Event Handling"
66
class WXDLLIMPEXP_PROPGRID wxPropertyGridPage : public wxEvtHandler,
67
public wxPropertyGridInterface,
68
public wxPropertyGridPageState
70
friend class wxPropertyGridManager;
71
DECLARE_CLASS(wxPropertyGridPage)
75
virtual ~wxPropertyGridPage();
77
/** Deletes all properties on page.
82
Reduces column sizes to minimum possible that contents are still
83
visibly (naturally some margin space will be applied as well).
86
Minimum size for the page to still display everything.
89
This function only works properly if size of containing grid was
92
Note that you can also get calculated column widths by calling
93
GetColumnWidth() immediately after this function returns.
97
/** Returns page index in manager;
99
inline int GetIndex() const;
101
/** Returns x-coordinate position of splitter on a page.
103
int GetSplitterPosition( int col = 0 ) const
104
{ return GetStatePtr()->DoGetSplitterPosition(col); }
106
/** Returns "root property". It does not have name, etc. and it is not
107
visible. It is only useful for accessing its children.
109
wxPGProperty* GetRoot() const { return GetStatePtr()->DoGetRoot(); }
111
/** Return pointer to contained property grid state.
113
wxPropertyGridPageState* GetStatePtr()
118
/** Return pointer to contained property grid state.
120
const wxPropertyGridPageState* GetStatePtr() const
126
Returns id of the tool bar item that represents this page on
127
wxPropertyGridManager's wxToolBar.
129
int GetToolId() const
134
/** Do any member initialization in this method.
136
- Called every time the page is added into a manager.
137
- You can add properties to the page here.
139
virtual void Init() {}
141
/** Return false here to indicate unhandled events should be
142
propagated to manager's parent, as normal.
144
virtual bool IsHandlingAllEvents() const { return true; }
146
/** Called every time page is about to be shown.
147
Useful, for instance, creating properties just-in-time.
149
virtual void OnShow();
151
virtual void RefreshProperty( wxPGProperty* p );
153
/** Sets splitter position on page.
155
Splitter position cannot exceed grid size, and therefore setting it
156
during form creation may fail as initial grid size is often smaller
157
than desired splitter position, especially when sizers are being used.
159
void SetSplitterPosition( int splitterPos, int col = 0 );
163
/** Propagate to other pages.
165
virtual void DoSetSplitterPosition( int pos,
166
int splitterColumn = 0,
167
int flags = wxPG_SPLITTER_REFRESH );
169
/** Page label (may be referred as name in some parts of documentation).
170
Can be set in constructor, or passed in
171
wxPropertyGridManager::AddPage(), but *not* in both.
175
//virtual bool ProcessEvent( wxEvent& event );
177
wxPropertyGridManager* m_manager;
179
// Toolbar tool id. Note that this is only valid when the tool bar
184
bool m_isDefault; // is this base page object?
186
DECLARE_EVENT_TABLE()
189
// -----------------------------------------------------------------------
192
class wxPGHeaderCtrl;
196
/** @class wxPropertyGridManager
198
wxPropertyGridManager is an efficient multi-page version of wxPropertyGrid,
199
which can optionally have toolbar for mode and page selection, and help
201
Use window flags to select components to include.
203
@section propgridmanager_window_styles_ Window Styles
205
See @ref propgrid_window_styles.
207
@section propgridmanager_event_handling Event Handling
209
See @ref propgrid_event_handling "wxPropertyGrid Event Handling"
210
for more information.
215
class WXDLLIMPEXP_PROPGRID
216
wxPropertyGridManager : public wxPanel, public wxPropertyGridInterface
218
DECLARE_CLASS(wxPropertyGridManager)
219
friend class wxPropertyGridPage;
224
Two step constructor.
225
Call Create when this constructor is called to build up the
226
wxPropertyGridManager.
228
wxPropertyGridManager();
231
/** The default constructor. The styles to be used are styles valid for
233
@see @link wndflags Additional Window Styles@endlink
235
wxPropertyGridManager( wxWindow *parent, wxWindowID id = wxID_ANY,
236
const wxPoint& pos = wxDefaultPosition,
237
const wxSize& size = wxDefaultSize,
238
long style = wxPGMAN_DEFAULT_STYLE,
239
const wxString& name = wxPropertyGridManagerNameStr );
242
virtual ~wxPropertyGridManager();
244
/** Creates new property page. Note that the first page is not created
247
A label for the page. This may be shown as a toolbar tooltip etc.
249
Bitmap image for toolbar. If wxNullBitmap is used, then a built-in
250
default image is used.
252
wxPropertyGridPage instance. Manager will take ownership of this object.
253
NULL indicates that a default page instance should be created.
256
Returns pointer to created page.
259
If toolbar is used, it is highly recommended that the pages are
260
added when the toolbar is not turned off using window style flag
263
wxPropertyGridPage* AddPage( const wxString& label = wxEmptyString,
264
const wxBitmap& bmp = wxPG_NULL_BITMAP,
265
wxPropertyGridPage* pageObj = NULL )
267
return InsertPage(-1, label, bmp, pageObj);
270
/** Deletes all all properties and all pages.
272
virtual void Clear();
274
/** Deletes all properties on given page.
276
void ClearPage( int page );
278
/** Forces updating the value of property from the editor control.
279
Returns true if DoPropertyChanged was actually called.
281
bool CommitChangesFromEditor( wxUint32 flags = 0 )
283
return m_pPropGrid->CommitChangesFromEditor(flags);
288
Whenever the control is created without any parameters, use Create to
289
actually create it. Don't access the control's public methods before
291
@see @link wndflags Additional Window Styles@endlink
293
bool Create( wxWindow *parent, wxWindowID id = wxID_ANY,
294
const wxPoint& pos = wxDefaultPosition,
295
const wxSize& size = wxDefaultSize,
296
long style = wxPGMAN_DEFAULT_STYLE,
297
const wxString& name = wxPropertyGridManagerNameStr );
300
Enables or disables (shows/hides) categories according to parameter
303
WARNING: Not tested properly, use at your own risk.
305
bool EnableCategories( bool enable )
307
long fl = m_windowStyle | wxPG_HIDE_CATEGORIES;
308
if ( enable ) fl = m_windowStyle & ~(wxPG_HIDE_CATEGORIES);
309
SetWindowStyleFlag(fl);
313
/** Selects page, scrolls and/or expands items to ensure that the
314
given item is visible. Returns true if something was actually done.
316
bool EnsureVisible( wxPGPropArg id );
318
/** Returns number of columns on given page. By the default,
319
returns number of columns on current page. */
320
int GetColumnCount( int page = -1 ) const;
322
/** Returns height of the description text box. */
323
int GetDescBoxHeight() const;
325
/** Returns pointer to the contained wxPropertyGrid. This does not change
326
after wxPropertyGridManager has been created, so you can safely obtain
327
pointer once and use it for the entire lifetime of the instance.
329
wxPropertyGrid* GetGrid()
331
wxASSERT(m_pPropGrid);
335
const wxPropertyGrid* GetGrid() const
337
wxASSERT(m_pPropGrid);
338
return (const wxPropertyGrid*)m_pPropGrid;
341
/** Returns iterator class instance.
343
Calling this method in wxPropertyGridManager causes run-time assertion
344
failure. Please only iterate through individual pages or use
347
wxPropertyGridIterator GetIterator( int flags = wxPG_ITERATE_DEFAULT,
348
wxPGProperty* firstProp = NULL )
350
wxFAIL_MSG( "Please only iterate through individual pages "
351
"or use CreateVIterator()" );
352
return wxPropertyGridInterface::GetIterator( flags, firstProp );
355
wxPropertyGridConstIterator
356
GetIterator(int flags = wxPG_ITERATE_DEFAULT,
357
wxPGProperty* firstProp = NULL) const
359
wxFAIL_MSG( "Please only iterate through individual pages "
360
" or use CreateVIterator()" );
361
return wxPropertyGridInterface::GetIterator( flags, firstProp );
364
/** Returns iterator class instance.
366
Calling this method in wxPropertyGridManager causes run-time assertion
367
failure. Please only iterate through individual pages or use
370
wxPropertyGridIterator GetIterator( int flags, int startPos )
372
wxFAIL_MSG( "Please only iterate through individual pages "
373
"or use CreateVIterator()" );
375
return wxPropertyGridInterface::GetIterator( flags, startPos );
378
wxPropertyGridConstIterator GetIterator( int flags, int startPos ) const
380
wxFAIL_MSG( "Please only iterate through individual pages "
381
"or use CreateVIterator()" );
382
return wxPropertyGridInterface::GetIterator( flags, startPos );
385
/** Similar to GetIterator, but instead returns wxPGVIterator instance,
386
which can be useful for forward-iterating through arbitrary property
389
virtual wxPGVIterator GetVIterator( int flags ) const;
391
/** Returns currently selected page.
393
wxPropertyGridPage* GetCurrentPage() const
395
return GetPage(m_selPage);
398
/** Returns page object for given page index.
400
wxPropertyGridPage* GetPage( unsigned int ind ) const
402
return m_arrPages[ind];
405
/** Returns page object for given page name.
407
wxPropertyGridPage* GetPage( const wxString& name ) const
409
return GetPage(GetPageByName(name));
413
Returns index for a page name.
415
If no match is found, wxNOT_FOUND is returned.
417
int GetPageByName( const wxString& name ) const;
419
/** Returns index for a relevant propertygrid state.
421
If no match is found, wxNOT_FOUND is returned.
423
int GetPageByState( const wxPropertyGridPageState* pstate ) const;
426
/** Returns wxPropertyGridPageState of given page, current page's for -1.
428
virtual wxPropertyGridPageState* GetPageState( int page ) const;
431
/** Returns number of managed pages. */
432
size_t GetPageCount() const;
434
/** Returns name of given page. */
435
const wxString& GetPageName( int index ) const;
437
/** Returns "root property" of the given page. It does not have name, etc.
438
and it is not visible. It is only useful for accessing its children.
440
wxPGProperty* GetPageRoot( int index ) const;
442
/** Returns index to currently selected page. */
443
int GetSelectedPage() const { return m_selPage; }
445
/** Alias for GetSelection(). */
446
wxPGProperty* GetSelectedProperty() const
448
return GetSelection();
451
/** Shortcut for GetGrid()->GetSelection(). */
452
wxPGProperty* GetSelection() const
454
return m_pPropGrid->GetSelection();
457
/** Returns a pointer to the toolbar currently associated with the
458
wxPropertyGridManager (if any). */
459
wxToolBar* GetToolBar() const { return m_pToolbar; }
461
/** Creates new property page. Note that the first page is not created
464
Add to this position. -1 will add as the last item.
466
A label for the page. This may be shown as a toolbar tooltip etc.
468
Bitmap image for toolbar. If wxNullBitmap is used, then a built-in
469
default image is used.
471
wxPropertyGridPage instance. Manager will take ownership of this object.
472
If NULL, default page object is constructed.
475
Returns pointer to created page.
477
virtual wxPropertyGridPage* InsertPage( int index,
478
const wxString& label,
479
const wxBitmap& bmp = wxNullBitmap,
480
wxPropertyGridPage* pageObj = NULL );
483
Returns true if any property on any page has been modified by the user.
485
bool IsAnyModified() const;
488
Returns true if updating is frozen (ie Freeze() called but not yet
491
bool IsFrozen() const { return m_pPropGrid->m_frozen > 0; }
494
Returns true if any property on given page has been modified by the
497
bool IsPageModified( size_t index ) const;
500
Returns true if property is selected. Since selection is page
501
based, this function checks every page in the manager.
503
virtual bool IsPropertySelected( wxPGPropArg id ) const;
505
virtual void Refresh( bool eraseBackground = true,
506
const wxRect* rect = (const wxRect*) NULL );
510
Returns false if it was not possible to remove page in question.
512
virtual bool RemovePage( int page );
514
/** Select and displays a given page.
517
Index of page being seleced. Can be -1 to select nothing.
519
void SelectPage( int index );
521
/** Select and displays a given page (by label). */
522
void SelectPage( const wxString& label )
524
int index = GetPageByName(label);
525
wxCHECK_RET( index >= 0, wxT("No page with such name") );
529
/** Select and displays a given page. */
530
void SelectPage( wxPropertyGridPage* ptr )
532
SelectPage( GetPageByState(ptr) );
535
/** Select a property. */
536
bool SelectProperty( wxPGPropArg id, bool focus = false )
538
wxPG_PROP_ARG_CALL_PROLOG_RETVAL(false)
539
return p->GetParentState()->DoSelectProperty(p, focus);
543
Sets a column title. Default title for column 0 is "Property",
544
and "Value" for column 1.
546
@remarks If header is not shown yet, then calling this
547
member function will make it visible.
549
void SetColumnTitle( int idx, const wxString& title );
552
Sets number of columns on given page (default is current page).
554
@remarks If you use header, then you should always use this
555
member function to set the column count, instead of
556
ones present in wxPropertyGrid or wxPropertyGridPage.
558
void SetColumnCount( int colCount, int page = -1 );
560
/** Sets label and text in description box.
562
void SetDescription( const wxString& label, const wxString& content );
564
/** Sets y coordinate of the description box splitter. */
565
void SetDescBoxHeight( int ht, bool refresh = true );
567
/** Moves splitter as left as possible, while still allowing all
568
labels to be shown in full.
570
If false, will still allow sub-properties (ie. properties which
571
parent is not root or category) to be cropped.
573
If true, takes labels on all pages into account.
575
void SetSplitterLeft( bool subProps = false, bool allPages = true );
577
/** Moves splitter as left as possible on an individual page, while still allowing all
578
labels to be shown in full.
580
void SetPageSplitterLeft(int page, bool subProps = false);
583
Sets splitter position on individual page.
585
@remarks If you use header, then you should always use this
586
member function to set the splitter position, instead of
587
ones present in wxPropertyGrid or wxPropertyGridPage.
589
void SetPageSplitterPosition( int page, int pos, int column = 0 );
592
Sets splitter position for all pages.
594
@remarks Splitter position cannot exceed grid size, and therefore
595
setting it during form creation may fail as initial grid
596
size is often smaller than desired splitter position,
597
especially when sizers are being used.
599
If you use header, then you should always use this
600
member function to set the splitter position, instead of
601
ones present in wxPropertyGrid or wxPropertyGridPage.
603
void SetSplitterPosition( int pos, int column = 0 );
607
Show or hide the property grid header control. It is hidden
610
@remarks Grid may look better if you use wxPG_NO_INTERNAL_BORDER
611
window style when showing a header.
613
void ShowHeader(bool show = true);
619
// Subclassing helpers
623
Creates property grid for the manager. Reimplement in derived class to
624
use subclassed wxPropertyGrid. However, if you do this then you
625
must also use the two-step construction (ie. default constructor and
626
Create() instead of constructor with arguments) when creating the
629
virtual wxPropertyGrid* CreatePropertyGrid() const;
632
virtual void RefreshProperty( wxPGProperty* p );
635
// Overridden functions - no documentation required.
638
void SetId( wxWindowID winid );
640
virtual void Freeze();
642
virtual void SetExtraStyle ( long exStyle );
643
virtual bool SetFont ( const wxFont& font );
644
virtual void SetWindowStyleFlag ( long style );
645
virtual bool Reparent( wxWindowBase *newParent );
648
virtual wxSize DoGetBestSize() const;
653
void OnMouseMove( wxMouseEvent &event );
654
void OnMouseClick( wxMouseEvent &event );
655
void OnMouseUp( wxMouseEvent &event );
656
void OnMouseEntry( wxMouseEvent &event );
658
void OnPaint( wxPaintEvent &event );
660
void OnToolbarClick( wxCommandEvent &event );
661
void OnResize( wxSizeEvent& event );
662
void OnPropertyGridSelect( wxPropertyGridEvent& event );
663
void OnPGColDrag( wxPropertyGridEvent& event );
666
wxPropertyGrid* m_pPropGrid;
668
wxVector<wxPropertyGridPage*> m_arrPages;
671
wxToolBar* m_pToolbar;
674
wxPGHeaderCtrl* m_pHeaderCtrl;
676
wxStaticText* m_pTxtHelpCaption;
677
wxStaticText* m_pTxtHelpContent;
679
wxPropertyGridPage* m_emptyPage;
681
wxArrayString m_columnLabels;
685
// Selected page index.
696
int m_splitterHeight;
700
wxCursor m_cursorSizeNS;
702
int m_nextDescBoxSize;
704
// Toolbar tool ids for categorized and alphabetic mode selectors.
705
int m_categorizedModeToolId;
706
int m_alphabeticModeToolId;
708
unsigned char m_dragStatus;
710
unsigned char m_onSplitter;
714
virtual wxPGProperty* DoGetPropertyByName( const wxString& name ) const;
716
/** Select and displays a given page. */
717
virtual bool DoSelectPage( int index );
719
// Sets some members to defaults.
722
// Initializes some members.
723
void Init2( int style );
726
virtual WXDWORD MSWGetStyle(long flags, WXDWORD *exstyle) const;
729
virtual bool ProcessEvent( wxEvent& event );
731
/** Recalculates new positions for components, according to the
734
void RecalculatePositions( int width, int height );
736
/** (Re)creates/destroys controls, according to the window style bits. */
737
void RecreateControls();
739
void UpdateDescriptionBox( int new_splittery, int new_width, int new_height );
741
void RepaintDescBoxDecorations( wxDC& dc,
746
void SetDescribedProperty( wxPGProperty* p );
748
// Reimplement these to handle "descboxheight" state item
749
virtual bool SetEditableStateItem( const wxString& name, wxVariant value );
750
virtual wxVariant GetEditableStateItem( const wxString& name ) const;
753
DECLARE_EVENT_TABLE()
756
// -----------------------------------------------------------------------
758
inline int wxPropertyGridPage::GetIndex() const
762
return m_manager->GetPageByState(this);
765
// -----------------------------------------------------------------------
767
#endif // wxUSE_PROPGRID
769
#endif // _WX_PROPGRID_MANAGER_H_