2008-09-12 20:57:41 +00:00
/////////////////////////////////////////////////////////////////////////////
// Name: samples/propgrid/propgrid.cpp
// Purpose: wxPropertyGrid sample
// Author: Jaakko Salli
// Modified by:
// Created: 2004-09-25
2008-10-05 18:03:43 +00:00
// RCS-ID: $Id$
2008-09-12 20:57:41 +00:00
// Copyright: (c) Jaakko Salli
// Licence: wxWindows license
/////////////////////////////////////////////////////////////////////////////
//
//
// NOTES
//
// * Examples of custom property classes are in sampleprops.cpp.
//
// * Additional ones can be found below.
//
// * Currently there is no example of a custom property editor. However,
// SpinCtrl editor sample is well-commented. It can be found in
2008-10-16 17:24:27 +00:00
// src/propgrid/advprops.cpp.
2008-09-12 20:57:41 +00:00
//
// * To find code that populates the grid with properties, search for
// string "::Populate".
//
// * To find code that handles property grid changes, search for string
// "::OnPropertyGridChange".
//
// For compilers that support precompilation, includes "wx/wx.h".
# include "wx/wxprec.h"
# ifdef __BORLANDC__
# pragma hdrstop
# endif
// for all others, include the necessary headers (this file is usually all you
// need because it includes almost all "standard" wxWidgets headers)
# ifndef WX_PRECOMP
# include "wx/wx.h"
# endif
2008-09-17 15:00:00 +00:00
# if !wxUSE_PROPGRID
# error "Please set wxUSE_PROPGRID to 1 and rebuild the library."
# endif
2008-09-12 20:57:41 +00:00
# include <wx/numdlg.h>
// -----------------------------------------------------------------------
// Main propertygrid header.
# include <wx/propgrid/propgrid.h>
// Extra property classes.
# include <wx/propgrid/advprops.h>
// This defines wxPropertyGridManager.
# include <wx/propgrid/manager.h>
# include "propgrid.h"
# include "sampleprops.h"
# if wxUSE_DATEPICKCTRL
# include <wx/datectrl.h>
# endif
# include <wx/artprov.h>
2009-02-08 01:01:00 +00:00
# ifndef __WXMSW__
# include "../sample.xpm"
# endif
2008-09-12 20:57:41 +00:00
// -----------------------------------------------------------------------
// wxSampleMultiButtonEditor
// A sample editor class that has multiple buttons.
// -----------------------------------------------------------------------
class wxSampleMultiButtonEditor : public wxPGTextCtrlEditor
{
2008-09-27 14:03:10 +00:00
DECLARE_DYNAMIC_CLASS ( wxSampleMultiButtonEditor )
2008-09-12 20:57:41 +00:00
public :
wxSampleMultiButtonEditor ( ) { }
virtual ~ wxSampleMultiButtonEditor ( ) { }
2008-09-27 14:03:10 +00:00
virtual wxPGWindowList CreateControls ( wxPropertyGrid * propGrid ,
wxPGProperty * property ,
const wxPoint & pos ,
const wxSize & sz ) const ;
2008-09-12 20:57:41 +00:00
virtual bool OnEvent ( wxPropertyGrid * propGrid ,
wxPGProperty * property ,
wxWindow * ctrl ,
wxEvent & event ) const ;
} ;
2008-09-27 14:03:10 +00:00
IMPLEMENT_DYNAMIC_CLASS ( wxSampleMultiButtonEditor , wxPGTextCtrlEditor )
2008-09-12 20:57:41 +00:00
wxPGWindowList wxSampleMultiButtonEditor : : CreateControls ( wxPropertyGrid * propGrid ,
wxPGProperty * property ,
const wxPoint & pos ,
const wxSize & sz ) const
{
// Create and populate buttons-subwindow
wxPGMultiButton * buttons = new wxPGMultiButton ( propGrid , sz ) ;
2008-09-27 14:03:10 +00:00
// Add two regular buttons
2008-09-12 20:57:41 +00:00
buttons - > Add ( " ... " ) ;
buttons - > Add ( " A " ) ;
2008-09-27 14:03:10 +00:00
// Add a bitmap button
2008-09-12 20:57:41 +00:00
buttons - > Add ( wxArtProvider : : GetBitmap ( wxART_FOLDER ) ) ;
// Create the 'primary' editor control (textctrl in this case)
wxPGWindowList wndList = wxPGTextCtrlEditor : : CreateControls
2008-09-27 14:03:10 +00:00
( propGrid , property , pos ,
buttons - > GetPrimarySize ( ) ) ;
2008-09-12 20:57:41 +00:00
// Finally, move buttons-subwindow to correct position and make sure
// returned wxPGWindowList contains our custom button list.
2008-09-27 14:03:10 +00:00
buttons - > Finalize ( propGrid , pos ) ;
2008-09-12 20:57:41 +00:00
wndList . SetSecondary ( buttons ) ;
return wndList ;
}
bool wxSampleMultiButtonEditor : : OnEvent ( wxPropertyGrid * propGrid ,
wxPGProperty * property ,
wxWindow * ctrl ,
wxEvent & event ) const
{
if ( event . GetEventType ( ) = = wxEVT_COMMAND_BUTTON_CLICKED )
{
wxPGMultiButton * buttons = ( wxPGMultiButton * ) propGrid - > GetEditorControlSecondary ( ) ;
2008-09-27 14:03:10 +00:00
if ( event . GetId ( ) = = buttons - > GetButtonId ( 0 ) )
{
2009-03-09 18:32:43 +00:00
// Do something when the first button is pressed
2008-09-27 14:03:10 +00:00
wxLogDebug ( " First button pressed " ) ;
2009-03-09 18:32:43 +00:00
return false ; // Return false since value did not change
2008-09-27 14:03:10 +00:00
}
2008-09-12 20:57:41 +00:00
if ( event . GetId ( ) = = buttons - > GetButtonId ( 1 ) )
{
2009-03-09 18:32:43 +00:00
// Do something when the second button is pressed
wxMessageBox ( " Second button pressed " ) ;
return false ; // Return false since value did not change
2008-09-12 20:57:41 +00:00
}
if ( event . GetId ( ) = = buttons - > GetButtonId ( 2 ) )
{
2009-03-09 18:32:43 +00:00
// Do something when the third button is pressed
wxMessageBox ( " Third button pressed " ) ;
return false ; // Return false since value did not change
2008-09-12 20:57:41 +00:00
}
}
return wxPGTextCtrlEditor : : OnEvent ( propGrid , property , ctrl , event ) ;
}
// -----------------------------------------------------------------------
// Validator for wxValidator use sample
// -----------------------------------------------------------------------
# if wxUSE_VALIDATORS
// wxValidator for testing
class wxInvalidWordValidator : public wxValidator
{
public :
wxInvalidWordValidator ( const wxString & invalidWord )
: wxValidator ( ) , m_invalidWord ( invalidWord )
{
}
virtual wxObject * Clone ( ) const
{
return new wxInvalidWordValidator ( m_invalidWord ) ;
}
virtual bool Validate ( wxWindow * WXUNUSED ( parent ) )
{
wxTextCtrl * tc = wxDynamicCast ( GetWindow ( ) , wxTextCtrl ) ;
wxCHECK_MSG ( tc , true , wxT ( " validator window must be wxTextCtrl " ) ) ;
wxString val = tc - > GetValue ( ) ;
if ( val . find ( m_invalidWord ) = = wxString : : npos )
return true ;
: : wxMessageBox ( wxString : : Format ( wxT ( " %s is not allowed word " ) , m_invalidWord . c_str ( ) ) ,
wxT ( " Validation Failure " ) ) ;
return false ;
}
private :
wxString m_invalidWord ;
} ;
# endif // wxUSE_VALIDATORS
// -----------------------------------------------------------------------
// AdvImageFile Property
// -----------------------------------------------------------------------
class wxMyImageInfo ;
WX_DECLARE_OBJARRAY ( wxMyImageInfo , wxArrayMyImageInfo ) ;
class wxMyImageInfo
{
public :
wxString m_path ;
wxBitmap * m_pThumbnail1 ; // smaller thumbnail
wxBitmap * m_pThumbnail2 ; // larger thumbnail
wxMyImageInfo ( const wxString & str )
{
m_path = str ;
m_pThumbnail1 = ( wxBitmap * ) NULL ;
m_pThumbnail2 = ( wxBitmap * ) NULL ;
}
virtual ~ wxMyImageInfo ( )
{
if ( m_pThumbnail1 )
delete m_pThumbnail1 ;
if ( m_pThumbnail2 )
delete m_pThumbnail2 ;
}
} ;
# include <wx/arrimpl.cpp>
WX_DEFINE_OBJARRAY ( wxArrayMyImageInfo ) ;
wxArrayMyImageInfo g_myImageArray ;
// Preferred thumbnail height.
# define PREF_THUMBNAIL_HEIGHT 64
wxPGChoices wxAdvImageFileProperty : : ms_choices ;
WX_PG_IMPLEMENT_PROPERTY_CLASS ( wxAdvImageFileProperty , wxFileProperty ,
wxString , const wxString & , ChoiceAndButton )
wxAdvImageFileProperty : : wxAdvImageFileProperty ( const wxString & label ,
const wxString & name ,
const wxString & value )
: wxFileProperty ( label , name , value )
{
m_wildcard = wxPGGetDefaultImageWildcard ( ) ;
m_index = - 1 ;
m_pImage = ( wxImage * ) NULL ;
// Only show names.
m_flags & = ~ ( wxPG_PROP_SHOW_FULL_FILENAME ) ;
}
wxAdvImageFileProperty : : ~ wxAdvImageFileProperty ( )
{
// Delete old image
if ( m_pImage )
{
delete m_pImage ;
m_pImage = ( wxImage * ) NULL ;
}
}
void wxAdvImageFileProperty : : OnSetValue ( )
{
wxFileProperty : : OnSetValue ( ) ;
// Delete old image
if ( m_pImage )
{
delete m_pImage ;
m_pImage = ( wxImage * ) NULL ;
}
wxString imagename = GetValueAsString ( 0 ) ;
if ( imagename . length ( ) )
{
2008-10-16 17:19:50 +00:00
wxFileName filename = GetFileName ( ) ;
2008-09-12 20:57:41 +00:00
size_t prevCount = g_myImageArray . GetCount ( ) ;
int index = ms_choices . Index ( imagename ) ;
// If not in table, add now.
if ( index = = wxNOT_FOUND )
{
ms_choices . Add ( imagename ) ;
2008-10-16 17:19:50 +00:00
g_myImageArray . Add ( new wxMyImageInfo ( filename . GetFullPath ( ) ) ) ;
2008-09-12 20:57:41 +00:00
index = g_myImageArray . GetCount ( ) - 1 ;
}
// If no thumbnail ready, then need to load image.
if ( ! g_myImageArray [ index ] . m_pThumbnail2 )
{
// Load if file exists.
2008-10-16 17:19:50 +00:00
if ( filename . FileExists ( ) )
m_pImage = new wxImage ( filename . GetFullPath ( ) ) ;
2008-09-12 20:57:41 +00:00
}
m_index = index ;
wxPropertyGrid * pg = GetGrid ( ) ;
wxWindow * control = pg - > GetEditorControl ( ) ;
if ( pg - > GetSelection ( ) = = this & & control )
{
wxString name = GetValueAsString ( 0 ) ;
if ( g_myImageArray . GetCount ( ) ! = prevCount )
{
wxASSERT ( g_myImageArray . GetCount ( ) = = ( prevCount + 1 ) ) ;
// Add to the control's array.
// (should be added to own array earlier)
if ( control )
GetEditorClass ( ) - > InsertItem ( control , name , - 1 ) ;
}
if ( control )
GetEditorClass ( ) - > UpdateControl ( this , control ) ;
}
}
else
m_index = - 1 ;
}
bool wxAdvImageFileProperty : : IntToValue ( wxVariant & variant , int number , int WXUNUSED ( argFlags ) ) const
{
wxASSERT ( number > = 0 ) ;
return StringToValue ( variant , ms_choices . GetLabel ( number ) , wxPG_FULL_VALUE ) ;
}
bool wxAdvImageFileProperty : : OnEvent ( wxPropertyGrid * propgrid , wxWindow * primary ,
wxEvent & event )
{
if ( propgrid - > IsMainButtonEvent ( event ) )
{
return wxFileProperty : : OnEvent ( propgrid , primary , event ) ;
}
return false ;
}
wxSize wxAdvImageFileProperty : : OnMeasureImage ( int item ) const
{
if ( item = = - 1 )
return wxPG_DEFAULT_IMAGE_SIZE ;
return wxSize ( PREF_THUMBNAIL_HEIGHT , PREF_THUMBNAIL_HEIGHT ) ;
}
void wxAdvImageFileProperty : : LoadThumbnails ( size_t index )
{
wxMyImageInfo & mii = g_myImageArray [ index ] ;
if ( ! mii . m_pThumbnail2 )
{
2008-10-16 17:19:50 +00:00
wxFileName filename = GetFileName ( ) ;
2008-09-12 20:57:41 +00:00
if ( ! m_pImage | | ! m_pImage - > Ok ( ) | |
2008-10-16 17:19:50 +00:00
filename ! = mii . m_path
2008-09-12 20:57:41 +00:00
)
{
if ( m_pImage )
delete m_pImage ;
m_pImage = new wxImage ( mii . m_path ) ;
}
if ( m_pImage & & m_pImage - > Ok ( ) )
{
int im_wid = m_pImage - > GetWidth ( ) ;
int im_hei = m_pImage - > GetHeight ( ) ;
if ( im_hei > PREF_THUMBNAIL_HEIGHT )
{
// TNW = (TNH*IW)/IH
im_wid = ( PREF_THUMBNAIL_HEIGHT * m_pImage - > GetWidth ( ) ) / m_pImage - > GetHeight ( ) ;
im_hei = PREF_THUMBNAIL_HEIGHT ;
}
m_pImage - > Rescale ( im_wid , im_hei ) ;
mii . m_pThumbnail2 = new wxBitmap ( * m_pImage ) ;
wxSize cis = GetParentState ( ) - > GetGrid ( ) - > GetImageSize ( ) ;
m_pImage - > Rescale ( cis . x , cis . y ) ;
mii . m_pThumbnail1 = new wxBitmap ( * m_pImage ) ;
}
if ( m_pImage )
{
delete m_pImage ;
m_pImage = ( wxImage * ) NULL ;
}
}
}
void wxAdvImageFileProperty : : OnCustomPaint ( wxDC & dc ,
const wxRect & rect ,
wxPGPaintData & pd )
{
int index = m_index ;
if ( pd . m_choiceItem > = 0 )
index = pd . m_choiceItem ;
//wxLogDebug(wxT("%i"),index);
if ( index > = 0 )
{
LoadThumbnails ( index ) ;
// Is this a measure item call?
if ( rect . x < 0 )
{
// Variable height
//pd.m_drawnHeight = PREF_THUMBNAIL_HEIGHT;
wxBitmap * pBitmap = ( wxBitmap * ) g_myImageArray [ index ] . m_pThumbnail2 ;
if ( pBitmap )
pd . m_drawnHeight = pBitmap - > GetHeight ( ) ;
else
pd . m_drawnHeight = 16 ;
return ;
}
// Draw the thumbnail
wxBitmap * pBitmap ;
if ( pd . m_choiceItem > = 0 )
pBitmap = ( wxBitmap * ) g_myImageArray [ index ] . m_pThumbnail2 ;
else
pBitmap = ( wxBitmap * ) g_myImageArray [ index ] . m_pThumbnail1 ;
if ( pBitmap )
{
dc . DrawBitmap ( * pBitmap , rect . x , rect . y , FALSE ) ;
// Tell the caller how wide we drew.
pd . m_drawnWidth = pBitmap - > GetWidth ( ) ;
return ;
}
}
// No valid file - just draw a white box.
dc . SetBrush ( * wxWHITE_BRUSH ) ;
dc . DrawRectangle ( rect ) ;
}
// -----------------------------------------------------------------------
// wxVectorProperty
// -----------------------------------------------------------------------
// See propgridsample.h for wxVector3f class
2008-09-16 15:55:53 +00:00
WX_PG_IMPLEMENT_VARIANT_DATA_DUMMY_EQ ( wxVector3f )
2008-09-12 20:57:41 +00:00
WX_PG_IMPLEMENT_PROPERTY_CLASS ( wxVectorProperty , wxPGProperty ,
wxVector3f , const wxVector3f & , TextCtrl )
wxVectorProperty : : wxVectorProperty ( const wxString & label ,
const wxString & name ,
const wxVector3f & value )
: wxPGProperty ( label , name )
{
2008-09-16 15:55:53 +00:00
SetValue ( WXVARIANT ( value ) ) ;
2009-03-12 18:17:55 +00:00
AddPrivateChild ( new wxFloatProperty ( wxT ( " X " ) , wxPG_LABEL , value . x ) ) ;
AddPrivateChild ( new wxFloatProperty ( wxT ( " Y " ) , wxPG_LABEL , value . y ) ) ;
AddPrivateChild ( new wxFloatProperty ( wxT ( " Z " ) , wxPG_LABEL , value . z ) ) ;
2008-09-12 20:57:41 +00:00
}
wxVectorProperty : : ~ wxVectorProperty ( ) { }
void wxVectorProperty : : RefreshChildren ( )
{
if ( ! GetChildCount ( ) ) return ;
2008-09-16 15:55:53 +00:00
const wxVector3f & vector = wxVector3fRefFromVariant ( m_value ) ;
2008-09-12 20:57:41 +00:00
Item ( 0 ) - > SetValue ( vector . x ) ;
Item ( 1 ) - > SetValue ( vector . y ) ;
Item ( 2 ) - > SetValue ( vector . z ) ;
}
2009-06-07 07:52:53 +00:00
wxVariant wxVectorProperty : : ChildChanged ( wxVariant & thisValue ,
int childIndex ,
wxVariant & childValue ) const
2008-09-12 20:57:41 +00:00
{
2008-09-16 15:55:53 +00:00
wxVector3f vector ;
vector < < thisValue ;
2008-09-12 20:57:41 +00:00
switch ( childIndex )
{
case 0 : vector . x = childValue . GetDouble ( ) ; break ;
case 1 : vector . y = childValue . GetDouble ( ) ; break ;
case 2 : vector . z = childValue . GetDouble ( ) ; break ;
}
2009-06-07 07:52:53 +00:00
wxVariant newVariant ;
newVariant < < vector ;
return newVariant ;
2008-09-12 20:57:41 +00:00
}
// -----------------------------------------------------------------------
// wxTriangleProperty
// -----------------------------------------------------------------------
// See propgridsample.h for wxTriangle class
2008-09-16 15:55:53 +00:00
WX_PG_IMPLEMENT_VARIANT_DATA_DUMMY_EQ ( wxTriangle )
2008-09-12 20:57:41 +00:00
WX_PG_IMPLEMENT_PROPERTY_CLASS ( wxTriangleProperty , wxPGProperty ,
wxTriangle , const wxTriangle & , TextCtrl )
wxTriangleProperty : : wxTriangleProperty ( const wxString & label ,
const wxString & name ,
const wxTriangle & value )
: wxPGProperty ( label , name )
{
2008-09-16 15:55:53 +00:00
SetValue ( WXVARIANT ( value ) ) ;
2009-03-12 18:17:55 +00:00
AddPrivateChild ( new wxVectorProperty ( wxT ( " A " ) , wxPG_LABEL , value . a ) ) ;
AddPrivateChild ( new wxVectorProperty ( wxT ( " B " ) , wxPG_LABEL , value . b ) ) ;
AddPrivateChild ( new wxVectorProperty ( wxT ( " C " ) , wxPG_LABEL , value . c ) ) ;
2008-09-12 20:57:41 +00:00
}
wxTriangleProperty : : ~ wxTriangleProperty ( ) { }
void wxTriangleProperty : : RefreshChildren ( )
{
if ( ! GetChildCount ( ) ) return ;
2008-09-16 15:55:53 +00:00
const wxTriangle & triangle = wxTriangleRefFromVariant ( m_value ) ;
Item ( 0 ) - > SetValue ( WXVARIANT ( triangle . a ) ) ;
Item ( 1 ) - > SetValue ( WXVARIANT ( triangle . b ) ) ;
Item ( 2 ) - > SetValue ( WXVARIANT ( triangle . c ) ) ;
2008-09-12 20:57:41 +00:00
}
2009-06-07 07:52:53 +00:00
wxVariant wxTriangleProperty : : ChildChanged ( wxVariant & thisValue ,
int childIndex ,
wxVariant & childValue ) const
2008-09-12 20:57:41 +00:00
{
2008-09-16 15:55:53 +00:00
wxTriangle triangle ;
triangle < < thisValue ;
const wxVector3f & vector = wxVector3fRefFromVariant ( childValue ) ;
2008-09-12 20:57:41 +00:00
switch ( childIndex )
{
case 0 : triangle . a = vector ; break ;
case 1 : triangle . b = vector ; break ;
case 2 : triangle . c = vector ; break ;
}
2009-06-07 07:52:53 +00:00
wxVariant newVariant ;
newVariant < < triangle ;
return newVariant ;
2008-09-12 20:57:41 +00:00
}
// -----------------------------------------------------------------------
// wxSingleChoiceDialogAdapter (wxPGEditorDialogAdapter sample)
// -----------------------------------------------------------------------
class wxSingleChoiceDialogAdapter : public wxPGEditorDialogAdapter
{
public :
wxSingleChoiceDialogAdapter ( const wxPGChoices & choices )
: wxPGEditorDialogAdapter ( ) , m_choices ( choices )
{
}
virtual bool DoShowDialog ( wxPropertyGrid * WXUNUSED ( propGrid ) ,
wxPGProperty * WXUNUSED ( property ) )
{
wxString s = : : wxGetSingleChoice ( wxT ( " Message " ) ,
wxT ( " Caption " ) ,
m_choices . GetLabels ( ) ) ;
if ( s . length ( ) )
{
SetValue ( s ) ;
return true ;
}
return false ;
}
protected :
const wxPGChoices & m_choices ;
} ;
class SingleChoiceProperty : public wxStringProperty
{
public :
SingleChoiceProperty ( const wxString & label ,
const wxString & name = wxPG_LABEL ,
const wxString & value = wxEmptyString )
: wxStringProperty ( label , name , value )
{
// Prepare choices
m_choices . Add ( wxT ( " Cat " ) ) ;
m_choices . Add ( wxT ( " Dog " ) ) ;
m_choices . Add ( wxT ( " Gibbon " ) ) ;
m_choices . Add ( wxT ( " Otter " ) ) ;
}
// Set editor to have button
virtual const wxPGEditor * DoGetEditorClass ( ) const
{
2008-10-05 14:23:28 +00:00
return wxPGEditor_TextCtrlAndButton ;
2008-09-12 20:57:41 +00:00
}
// Set what happens on button click
virtual wxPGEditorDialogAdapter * GetEditorDialog ( ) const
{
return new wxSingleChoiceDialogAdapter ( m_choices ) ;
}
protected :
wxPGChoices m_choices ;
} ;
// -----------------------------------------------------------------------
// Menu IDs
// -----------------------------------------------------------------------
enum
{
PGID = 1 ,
TCID ,
ID_ABOUT ,
ID_QUIT ,
ID_APPENDPROP ,
ID_APPENDCAT ,
ID_INSERTPROP ,
ID_INSERTCAT ,
ID_ENABLE ,
ID_HIDE ,
ID_DELETE ,
ID_DELETER ,
ID_DELETEALL ,
ID_UNSPECIFY ,
ID_ITERATE1 ,
ID_ITERATE2 ,
ID_ITERATE3 ,
ID_ITERATE4 ,
ID_CLEARMODIF ,
ID_FREEZE ,
ID_DUMPLIST ,
ID_COLOURSCHEME1 ,
ID_COLOURSCHEME2 ,
ID_COLOURSCHEME3 ,
ID_CATCOLOURS ,
2008-10-31 18:53:37 +00:00
ID_SETBGCOLOUR ,
ID_SETBGCOLOURRECUR ,
2008-09-12 20:57:41 +00:00
ID_STATICLAYOUT ,
ID_POPULATE1 ,
ID_POPULATE2 ,
ID_COLLAPSE ,
ID_COLLAPSEALL ,
ID_GETVALUES ,
ID_SETVALUES ,
ID_SETVALUES2 ,
ID_RUNTESTFULL ,
ID_RUNTESTPARTIAL ,
ID_FITCOLUMNS ,
ID_CHANGEFLAGSITEMS ,
ID_TESTINSERTCHOICE ,
ID_TESTDELETECHOICE ,
ID_INSERTPAGE ,
ID_REMOVEPAGE ,
ID_SETSPINCTRLEDITOR ,
ID_SETPROPERTYVALUE ,
ID_TESTREPLACE ,
ID_SETCOLUMNS ,
ID_TESTXRC ,
ID_ENABLECOMMONVALUES ,
ID_SELECTSTYLE ,
ID_SAVESTATE ,
ID_RESTORESTATE ,
ID_RUNMINIMAL
} ;
// -----------------------------------------------------------------------
// Event table
// -----------------------------------------------------------------------
BEGIN_EVENT_TABLE ( FormMain , wxFrame )
EVT_IDLE ( FormMain : : OnIdle )
EVT_MOVE ( FormMain : : OnMove )
EVT_SIZE ( FormMain : : OnResize )
// This occurs when a property is selected
EVT_PG_SELECTED ( PGID , FormMain : : OnPropertyGridSelect )
// This occurs when a property value changes
EVT_PG_CHANGED ( PGID , FormMain : : OnPropertyGridChange )
// This occurs just prior a property value is changed
EVT_PG_CHANGING ( PGID , FormMain : : OnPropertyGridChanging )
// This occurs when a mouse moves over another property
EVT_PG_HIGHLIGHTED ( PGID , FormMain : : OnPropertyGridHighlight )
// This occurs when mouse is right-clicked.
EVT_PG_RIGHT_CLICK ( PGID , FormMain : : OnPropertyGridItemRightClick )
// This occurs when mouse is double-clicked.
EVT_PG_DOUBLE_CLICK ( PGID , FormMain : : OnPropertyGridItemDoubleClick )
// This occurs when propgridmanager's page changes.
EVT_PG_PAGE_CHANGED ( PGID , FormMain : : OnPropertyGridPageChange )
// This occurs when property's editor button (if any) is clicked.
EVT_BUTTON ( PGID , FormMain : : OnPropertyGridButtonClick )
EVT_PG_ITEM_COLLAPSED ( PGID , FormMain : : OnPropertyGridItemCollapse )
EVT_PG_ITEM_EXPANDED ( PGID , FormMain : : OnPropertyGridItemExpand )
EVT_TEXT ( PGID , FormMain : : OnPropertyGridTextUpdate )
//
// Rest of the events are not property grid specific
EVT_KEY_DOWN ( FormMain : : OnPropertyGridKeyEvent )
EVT_KEY_UP ( FormMain : : OnPropertyGridKeyEvent )
EVT_MENU ( ID_APPENDPROP , FormMain : : OnAppendPropClick )
EVT_MENU ( ID_APPENDCAT , FormMain : : OnAppendCatClick )
EVT_MENU ( ID_INSERTPROP , FormMain : : OnInsertPropClick )
EVT_MENU ( ID_INSERTCAT , FormMain : : OnInsertCatClick )
EVT_MENU ( ID_DELETE , FormMain : : OnDelPropClick )
EVT_MENU ( ID_DELETER , FormMain : : OnDelPropRClick )
EVT_MENU ( ID_UNSPECIFY , FormMain : : OnMisc )
EVT_MENU ( ID_DELETEALL , FormMain : : OnClearClick )
EVT_MENU ( ID_ENABLE , FormMain : : OnEnableDisable )
EVT_MENU ( ID_HIDE , FormMain : : OnHideShow )
2008-10-31 18:53:37 +00:00
2008-09-12 20:57:41 +00:00
EVT_MENU ( ID_ITERATE1 , FormMain : : OnIterate1Click )
EVT_MENU ( ID_ITERATE2 , FormMain : : OnIterate2Click )
EVT_MENU ( ID_ITERATE3 , FormMain : : OnIterate3Click )
EVT_MENU ( ID_ITERATE4 , FormMain : : OnIterate4Click )
2008-10-31 18:53:37 +00:00
EVT_MENU ( ID_SETBGCOLOUR , FormMain : : OnSetBackgroundColour )
EVT_MENU ( ID_SETBGCOLOURRECUR , FormMain : : OnSetBackgroundColour )
2008-09-12 20:57:41 +00:00
EVT_MENU ( ID_CLEARMODIF , FormMain : : OnClearModifyStatusClick )
EVT_MENU ( ID_FREEZE , FormMain : : OnFreezeClick )
EVT_MENU ( ID_DUMPLIST , FormMain : : OnDumpList )
EVT_MENU ( ID_COLOURSCHEME1 , FormMain : : OnColourScheme )
EVT_MENU ( ID_COLOURSCHEME2 , FormMain : : OnColourScheme )
EVT_MENU ( ID_COLOURSCHEME3 , FormMain : : OnColourScheme )
EVT_MENU ( ID_COLOURSCHEME4 , FormMain : : OnColourScheme )
EVT_MENU ( ID_ABOUT , FormMain : : OnAbout )
EVT_MENU ( ID_QUIT , FormMain : : OnCloseClick )
EVT_MENU ( ID_CATCOLOURS , FormMain : : OnCatColours )
EVT_MENU ( ID_SETCOLUMNS , FormMain : : OnSetColumns )
EVT_MENU ( ID_TESTXRC , FormMain : : OnTestXRC )
EVT_MENU ( ID_ENABLECOMMONVALUES , FormMain : : OnEnableCommonValues )
EVT_MENU ( ID_SELECTSTYLE , FormMain : : OnSelectStyle )
EVT_MENU ( ID_STATICLAYOUT , FormMain : : OnMisc )
EVT_MENU ( ID_COLLAPSE , FormMain : : OnMisc )
EVT_MENU ( ID_COLLAPSEALL , FormMain : : OnMisc )
EVT_MENU ( ID_POPULATE1 , FormMain : : OnPopulateClick )
EVT_MENU ( ID_POPULATE2 , FormMain : : OnPopulateClick )
EVT_MENU ( ID_GETVALUES , FormMain : : OnMisc )
EVT_MENU ( ID_SETVALUES , FormMain : : OnMisc )
EVT_MENU ( ID_SETVALUES2 , FormMain : : OnMisc )
EVT_MENU ( ID_FITCOLUMNS , FormMain : : OnFitColumnsClick )
EVT_MENU ( ID_CHANGEFLAGSITEMS , FormMain : : OnChangeFlagsPropItemsClick )
EVT_MENU ( ID_RUNTESTFULL , FormMain : : OnMisc )
EVT_MENU ( ID_RUNTESTPARTIAL , FormMain : : OnMisc )
EVT_MENU ( ID_TESTINSERTCHOICE , FormMain : : OnInsertChoice )
EVT_MENU ( ID_TESTDELETECHOICE , FormMain : : OnDeleteChoice )
EVT_MENU ( ID_INSERTPAGE , FormMain : : OnInsertPage )
EVT_MENU ( ID_REMOVEPAGE , FormMain : : OnRemovePage )
EVT_MENU ( ID_SAVESTATE , FormMain : : OnSaveState )
EVT_MENU ( ID_RESTORESTATE , FormMain : : OnRestoreState )
EVT_MENU ( ID_SETSPINCTRLEDITOR , FormMain : : OnSetSpinCtrlEditorClick )
EVT_MENU ( ID_TESTREPLACE , FormMain : : OnTestReplaceClick )
EVT_MENU ( ID_SETPROPERTYVALUE , FormMain : : OnSetPropertyValue )
EVT_MENU ( ID_RUNMINIMAL , FormMain : : OnRunMinimalClick )
EVT_CONTEXT_MENU ( FormMain : : OnContextMenu )
END_EVENT_TABLE ( )
// -----------------------------------------------------------------------
void FormMain : : OnMove ( wxMoveEvent & event )
{
if ( ! m_pPropGridManager )
{
// this check is here so the frame layout can be tested
// without creating propertygrid
event . Skip ( ) ;
return ;
}
// Update position properties
int x , y ;
GetPosition ( & x , & y ) ;
wxPGProperty * id ;
// Must check if properties exist (as they may be deleted).
// Using m_pPropGridManager, we can scan all pages automatically.
id = m_pPropGridManager - > GetPropertyByName ( wxT ( " X " ) ) ;
if ( id )
m_pPropGridManager - > SetPropertyValue ( id , x ) ;
id = m_pPropGridManager - > GetPropertyByName ( wxT ( " Y " ) ) ;
if ( id )
m_pPropGridManager - > SetPropertyValue ( id , y ) ;
id = m_pPropGridManager - > GetPropertyByName ( wxT ( " Position " ) ) ;
if ( id )
2008-09-27 15:09:33 +00:00
m_pPropGridManager - > SetPropertyValue ( id , WXVARIANT ( wxPoint ( x , y ) ) ) ;
2008-09-12 20:57:41 +00:00
// Should always call event.Skip() in frame's MoveEvent handler
event . Skip ( ) ;
}
// -----------------------------------------------------------------------
void FormMain : : OnResize ( wxSizeEvent & event )
{
if ( ! m_pPropGridManager )
{
// this check is here so the frame layout can be tested
// without creating propertygrid
event . Skip ( ) ;
return ;
}
// Update size properties
int w , h ;
GetSize ( & w , & h ) ;
wxPGProperty * id ;
wxPGProperty * p ;
// Must check if properties exist (as they may be deleted).
// Using m_pPropGridManager, we can scan all pages automatically.
p = m_pPropGridManager - > GetPropertyByName ( wxT ( " Width " ) ) ;
if ( p & & ! p - > IsValueUnspecified ( ) )
m_pPropGridManager - > SetPropertyValue ( p , w ) ;
p = m_pPropGridManager - > GetPropertyByName ( wxT ( " Height " ) ) ;
if ( p & & ! p - > IsValueUnspecified ( ) )
m_pPropGridManager - > SetPropertyValue ( p , h ) ;
id = m_pPropGridManager - > GetPropertyByName ( wxT ( " Size " ) ) ;
if ( id )
2008-09-27 15:09:33 +00:00
m_pPropGridManager - > SetPropertyValue ( id , WXVARIANT ( wxSize ( w , h ) ) ) ;
2008-09-12 20:57:41 +00:00
// Should always call event.Skip() in frame's SizeEvent handler
event . Skip ( ) ;
}
// -----------------------------------------------------------------------
void FormMain : : OnPropertyGridChanging ( wxPropertyGridEvent & event )
{
wxPGProperty * p = event . GetProperty ( ) ;
if ( p - > GetName ( ) = = wxT ( " Font " ) )
{
int res =
wxMessageBox ( wxString : : Format ( wxT ( " '%s' is about to change (to variant of type '%s') \n \n Allow or deny? " ) ,
p - > GetName ( ) . c_str ( ) , event . GetValue ( ) . GetType ( ) . c_str ( ) ) ,
wxT ( " Testing wxEVT_PG_CHANGING " ) , wxYES_NO , m_pPropGridManager ) ;
if ( res = = wxNO )
{
wxASSERT ( event . CanVeto ( ) ) ;
event . Veto ( ) ;
// Since we ask a question, it is better if we omit any validation
// failure behavior.
event . SetValidationFailureBehavior ( 0 ) ;
}
}
}
//
// Note how we use three types of value getting in this method:
// A) event.GetPropertyValueAsXXX
// B) event.GetPropertValue, and then variant's GetXXX
// C) grid's GetPropertyValueAsXXX(id)
//
void FormMain : : OnPropertyGridChange ( wxPropertyGridEvent & event )
{
wxPGProperty * property = event . GetProperty ( ) ;
const wxString & name = property - > GetName ( ) ;
wxVariant value = property - > GetValue ( ) ;
// Don't handle 'unspecified' values
if ( value . IsNull ( ) )
return ;
// Some settings are disabled outside Windows platform
if ( name = = wxT ( " X " ) )
SetSize ( m_pPropGridManager - > GetPropertyValueAsInt ( property ) , - 1 , - 1 , - 1 , wxSIZE_USE_EXISTING ) ;
else if ( name = = wxT ( " Y " ) )
// wxPGVariantToInt is safe long int value getter
2009-06-15 22:43:27 +00:00
SetSize ( - 1 , value . GetLong ( ) , - 1 , - 1 , wxSIZE_USE_EXISTING ) ;
2008-09-12 20:57:41 +00:00
else if ( name = = wxT ( " Width " ) )
SetSize ( - 1 , - 1 , m_pPropGridManager - > GetPropertyValueAsInt ( property ) , - 1 , wxSIZE_USE_EXISTING ) ;
else if ( name = = wxT ( " Height " ) )
2009-06-15 22:43:27 +00:00
SetSize ( - 1 , - 1 , - 1 , value . GetLong ( ) , wxSIZE_USE_EXISTING ) ;
2008-09-12 20:57:41 +00:00
else if ( name = = wxT ( " Label " ) )
{
SetTitle ( m_pPropGridManager - > GetPropertyValueAsString ( property ) ) ;
}
else if ( name = = wxT ( " Password " ) )
{
static int pwdMode = 0 ;
//m_pPropGridManager->SetPropertyAttribute(property, wxPG_STRING_PASSWORD, (long)pwdMode);
pwdMode + + ;
pwdMode & = 1 ;
}
else
if ( name = = wxT ( " Font " ) )
{
2008-09-16 15:55:53 +00:00
wxFont font ;
font < < value ;
wxASSERT ( font . Ok ( ) ) ;
2008-09-12 20:57:41 +00:00
m_pPropGridManager - > SetFont ( font ) ;
}
else
if ( name = = wxT ( " Margin Colour " ) )
{
2008-09-16 15:55:53 +00:00
wxColourPropertyValue cpv ;
cpv < < value ;
m_pPropGridManager - > GetGrid ( ) - > SetMarginColour ( cpv . m_colour ) ;
2008-09-12 20:57:41 +00:00
}
else if ( name = = wxT ( " Cell Colour " ) )
{
2008-09-16 15:55:53 +00:00
wxColourPropertyValue cpv ;
cpv < < value ;
m_pPropGridManager - > GetGrid ( ) - > SetCellBackgroundColour ( cpv . m_colour ) ;
2008-09-12 20:57:41 +00:00
}
else if ( name = = wxT ( " Line Colour " ) )
{
2008-09-16 15:55:53 +00:00
wxColourPropertyValue cpv ;
cpv < < value ;
m_pPropGridManager - > GetGrid ( ) - > SetLineColour ( cpv . m_colour ) ;
2008-09-12 20:57:41 +00:00
}
else if ( name = = wxT ( " Cell Text Colour " ) )
{
2008-09-16 15:55:53 +00:00
wxColourPropertyValue cpv ;
cpv < < value ;
m_pPropGridManager - > GetGrid ( ) - > SetCellTextColour ( cpv . m_colour ) ;
2008-09-12 20:57:41 +00:00
}
}
// -----------------------------------------------------------------------
void FormMain : : OnPropertyGridSelect ( wxPropertyGridEvent & event )
{
wxPGProperty * property = event . GetProperty ( ) ;
if ( property )
{
m_itemEnable - > Enable ( TRUE ) ;
if ( property - > IsEnabled ( ) )
m_itemEnable - > SetItemLabel ( wxT ( " Disable " ) ) ;
else
m_itemEnable - > SetItemLabel ( wxT ( " Enable " ) ) ;
}
else
{
m_itemEnable - > Enable ( FALSE ) ;
}
# if wxUSE_STATUSBAR
wxPGProperty * prop = event . GetProperty ( ) ;
wxStatusBar * sb = GetStatusBar ( ) ;
if ( prop )
{
wxString text ( wxT ( " Selected: " ) ) ;
text + = m_pPropGridManager - > GetPropertyLabel ( prop ) ;
sb - > SetStatusText ( text ) ;
}
# endif
}
// -----------------------------------------------------------------------
void FormMain : : OnPropertyGridPageChange ( wxPropertyGridEvent & WXUNUSED ( event ) )
{
# if wxUSE_STATUSBAR
wxStatusBar * sb = GetStatusBar ( ) ;
wxString text ( wxT ( " Page Changed: " ) ) ;
text + = m_pPropGridManager - > GetPageName ( m_pPropGridManager - > GetSelectedPage ( ) ) ;
sb - > SetStatusText ( text ) ;
# endif
}
// -----------------------------------------------------------------------
void FormMain : : OnPropertyGridHighlight ( wxPropertyGridEvent & WXUNUSED ( event ) )
{
}
// -----------------------------------------------------------------------
void FormMain : : OnPropertyGridItemRightClick ( wxPropertyGridEvent & event )
{
# if wxUSE_STATUSBAR
wxPGProperty * prop = event . GetProperty ( ) ;
wxStatusBar * sb = GetStatusBar ( ) ;
if ( prop )
{
wxString text ( wxT ( " Right-clicked: " ) ) ;
text + = prop - > GetLabel ( ) ;
text + = wxT ( " , name= " ) ;
text + = m_pPropGridManager - > GetPropertyName ( prop ) ;
sb - > SetStatusText ( text ) ;
}
else
{
sb - > SetStatusText ( wxEmptyString ) ;
}
# endif
}
// -----------------------------------------------------------------------
void FormMain : : OnPropertyGridItemDoubleClick ( wxPropertyGridEvent & event )
{
# if wxUSE_STATUSBAR
wxPGProperty * prop = event . GetProperty ( ) ;
wxStatusBar * sb = GetStatusBar ( ) ;
if ( prop )
{
wxString text ( wxT ( " Double-clicked: " ) ) ;
text + = prop - > GetLabel ( ) ;
text + = wxT ( " , name= " ) ;
text + = m_pPropGridManager - > GetPropertyName ( prop ) ;
sb - > SetStatusText ( text ) ;
}
else
{
sb - > SetStatusText ( wxEmptyString ) ;
}
# endif
}
// -----------------------------------------------------------------------
void FormMain : : OnPropertyGridButtonClick ( wxCommandEvent & )
{
# if wxUSE_STATUSBAR
2008-09-25 17:11:02 +00:00
wxPGProperty * prop = m_pPropGridManager - > GetSelection ( ) ;
2008-09-12 20:57:41 +00:00
wxStatusBar * sb = GetStatusBar ( ) ;
if ( prop )
{
wxString text ( wxT ( " Button clicked: " ) ) ;
text + = m_pPropGridManager - > GetPropertyLabel ( prop ) ;
text + = wxT ( " , name= " ) ;
text + = m_pPropGridManager - > GetPropertyName ( prop ) ;
sb - > SetStatusText ( text ) ;
}
else
{
: : wxMessageBox ( wxT ( " SHOULD NOT HAPPEN!!! " ) ) ;
}
# endif
}
// -----------------------------------------------------------------------
void FormMain : : OnPropertyGridItemCollapse ( wxPropertyGridEvent & )
{
wxLogDebug ( wxT ( " Item was Collapsed " ) ) ;
}
// -----------------------------------------------------------------------
void FormMain : : OnPropertyGridItemExpand ( wxPropertyGridEvent & )
{
wxLogDebug ( wxT ( " Item was Expanded " ) ) ;
}
// -----------------------------------------------------------------------
// EVT_TEXT handling
void FormMain : : OnPropertyGridTextUpdate ( wxCommandEvent & event )
{
event . Skip ( ) ;
}
// -----------------------------------------------------------------------
void FormMain : : OnPropertyGridKeyEvent ( wxKeyEvent & WXUNUSED ( event ) )
{
// Occurs on wxGTK mostly, but not wxMSW.
}
// -----------------------------------------------------------------------
void FormMain : : OnLabelTextChange ( wxCommandEvent & WXUNUSED ( event ) )
{
// Uncomment following to allow property label modify in real-time
// wxPGProperty& p = m_pPropGridManager->GetGrid()->GetSelection();
// if ( !p.IsOk() ) return;
// m_pPropGridManager->SetPropertyLabel( p, m_tcPropLabel->DoGetValue() );
}
// -----------------------------------------------------------------------
static const wxChar * _fs_windowstyle_labels [ ] = {
wxT ( " wxSIMPLE_BORDER " ) ,
wxT ( " wxDOUBLE_BORDER " ) ,
wxT ( " wxSUNKEN_BORDER " ) ,
wxT ( " wxRAISED_BORDER " ) ,
wxT ( " wxNO_BORDER " ) ,
wxT ( " wxTRANSPARENT_WINDOW " ) ,
wxT ( " wxTAB_TRAVERSAL " ) ,
wxT ( " wxWANTS_CHARS " ) ,
# if wxNO_FULL_REPAINT_ON_RESIZE
wxT ( " wxNO_FULL_REPAINT_ON_RESIZE " ) ,
# endif
wxT ( " wxVSCROLL " ) ,
wxT ( " wxALWAYS_SHOW_SB " ) ,
wxT ( " wxCLIP_CHILDREN " ) ,
# if wxFULL_REPAINT_ON_RESIZE
wxT ( " wxFULL_REPAINT_ON_RESIZE " ) ,
# endif
( const wxChar * ) NULL // terminator is always needed
} ;
static const long _fs_windowstyle_values [ ] = {
wxSIMPLE_BORDER ,
wxDOUBLE_BORDER ,
wxSUNKEN_BORDER ,
wxRAISED_BORDER ,
wxNO_BORDER ,
wxTRANSPARENT_WINDOW ,
wxTAB_TRAVERSAL ,
wxWANTS_CHARS ,
# if wxNO_FULL_REPAINT_ON_RESIZE
wxNO_FULL_REPAINT_ON_RESIZE ,
# endif
wxVSCROLL ,
wxALWAYS_SHOW_SB ,
wxCLIP_CHILDREN ,
# if wxFULL_REPAINT_ON_RESIZE
wxFULL_REPAINT_ON_RESIZE
# endif
} ;
static const wxChar * _fs_framestyle_labels [ ] = {
wxT ( " wxCAPTION " ) ,
wxT ( " wxMINIMIZE " ) ,
wxT ( " wxMAXIMIZE " ) ,
wxT ( " wxCLOSE_BOX " ) ,
wxT ( " wxSTAY_ON_TOP " ) ,
wxT ( " wxSYSTEM_MENU " ) ,
wxT ( " wxRESIZE_BORDER " ) ,
wxT ( " wxFRAME_TOOL_WINDOW " ) ,
wxT ( " wxFRAME_NO_TASKBAR " ) ,
wxT ( " wxFRAME_FLOAT_ON_PARENT " ) ,
wxT ( " wxFRAME_SHAPED " ) ,
( const wxChar * ) NULL
} ;
static const long _fs_framestyle_values [ ] = {
wxCAPTION ,
wxMINIMIZE ,
wxMAXIMIZE ,
wxCLOSE_BOX ,
wxSTAY_ON_TOP ,
wxSYSTEM_MENU ,
wxRESIZE_BORDER ,
wxFRAME_TOOL_WINDOW ,
wxFRAME_NO_TASKBAR ,
wxFRAME_FLOAT_ON_PARENT ,
wxFRAME_SHAPED
} ;
// -----------------------------------------------------------------------
void FormMain : : OnTestXRC ( wxCommandEvent & WXUNUSED ( event ) )
{
wxMessageBox ( wxT ( " Sorrt, not yet implemented " ) ) ;
}
void FormMain : : OnEnableCommonValues ( wxCommandEvent & WXUNUSED ( event ) )
{
2008-09-25 17:11:02 +00:00
wxPGProperty * prop = m_pPropGridManager - > GetSelection ( ) ;
2008-09-12 20:57:41 +00:00
if ( prop )
prop - > EnableCommonValue ( ) ;
else
wxMessageBox ( wxT ( " First select a property " ) ) ;
}
void FormMain : : PopulateWithStandardItems ( )
{
wxPropertyGridManager * pgman = m_pPropGridManager ;
wxPropertyGridPage * pg = pgman - > GetPage ( wxT ( " Standard Items " ) ) ;
// Append is ideal way to add items to wxPropertyGrid.
pg - > Append ( new wxPropertyCategory ( wxT ( " Appearance " ) , wxPG_LABEL ) ) ;
pg - > Append ( new wxStringProperty ( wxT ( " Label " ) , wxPG_LABEL , GetTitle ( ) ) ) ;
pg - > Append ( new wxFontProperty ( wxT ( " Font " ) , wxPG_LABEL ) ) ;
pg - > SetPropertyHelpString ( wxT ( " Font " ) , wxT ( " Editing this will change font used in the property grid. " ) ) ;
pg - > Append ( new wxSystemColourProperty ( wxT ( " Margin Colour " ) , wxPG_LABEL ,
pg - > GetGrid ( ) - > GetMarginColour ( ) ) ) ;
pg - > Append ( new wxSystemColourProperty ( wxT ( " Cell Colour " ) , wxPG_LABEL ,
pg - > GetGrid ( ) - > GetCellBackgroundColour ( ) ) ) ;
pg - > Append ( new wxSystemColourProperty ( wxT ( " Cell Text Colour " ) , wxPG_LABEL ,
pg - > GetGrid ( ) - > GetCellTextColour ( ) ) ) ;
pg - > Append ( new wxSystemColourProperty ( wxT ( " Line Colour " ) , wxPG_LABEL ,
pg - > GetGrid ( ) - > GetLineColour ( ) ) ) ;
pg - > Append ( new wxFlagsProperty ( wxT ( " Window Styles " ) , wxPG_LABEL ,
m_combinedFlags , GetWindowStyle ( ) ) ) ;
//pg->SetPropertyAttribute(wxT("Window Styles"),wxPG_BOOL_USE_CHECKBOX,true,wxPG_RECURSE);
pg - > Append ( new wxCursorProperty ( wxT ( " Cursor " ) , wxPG_LABEL ) ) ;
pg - > Append ( new wxPropertyCategory ( wxT ( " Position " ) , wxT ( " PositionCategory " ) ) ) ;
pg - > SetPropertyHelpString ( wxT ( " PositionCategory " ) , wxT ( " Change in items in this category will cause respective changes in frame. " ) ) ;
// Let's demonstrate 'Units' attribute here
// Note that we use many attribute constants instead of strings here
// (for instance, wxPG_ATTR_MIN, instead of wxT("min")).
// Using constant may reduce binary size.
pg - > Append ( new wxIntProperty ( wxT ( " Height " ) , wxPG_LABEL , 480 ) ) ;
pg - > SetPropertyAttribute ( wxT ( " Height " ) , wxPG_ATTR_MIN , ( long ) 10 ) ;
pg - > SetPropertyAttribute ( wxT ( " Height " ) , wxPG_ATTR_MAX , ( long ) 2048 ) ;
pg - > SetPropertyAttribute ( wxT ( " Height " ) , wxPG_ATTR_UNITS , wxT ( " Pixels " ) ) ;
// Set value to unspecified so that InlineHelp attribute will be demonstrated
pg - > SetPropertyValueUnspecified ( wxT ( " Height " ) ) ;
pg - > SetPropertyAttribute ( wxT ( " Height " ) , wxPG_ATTR_INLINE_HELP , wxT ( " Enter new height for window " ) ) ;
pg - > SetPropertyHelpString ( wxT ( " Height " ) , wxT ( " This property uses attributes \" Units \" and \" InlineHelp \" . " ) ) ;
pg - > Append ( new wxIntProperty ( wxT ( " Width " ) , wxPG_LABEL , 640 ) ) ;
pg - > SetPropertyAttribute ( wxT ( " Width " ) , wxPG_ATTR_MIN , ( long ) 10 ) ;
pg - > SetPropertyAttribute ( wxT ( " Width " ) , wxPG_ATTR_MAX , ( long ) 2048 ) ;
pg - > SetPropertyAttribute ( wxT ( " Width " ) , wxPG_ATTR_UNITS , wxT ( " Pixels " ) ) ;
pg - > SetPropertyValueUnspecified ( wxT ( " Width " ) ) ;
pg - > SetPropertyAttribute ( wxT ( " Width " ) , wxPG_ATTR_INLINE_HELP , wxT ( " Enter new width for window " ) ) ;
pg - > SetPropertyHelpString ( wxT ( " Width " ) , wxT ( " This property uses attributes \" Units \" and \" InlineHelp \" . " ) ) ;
pg - > Append ( new wxIntProperty ( wxT ( " X " ) , wxPG_LABEL , 10 ) ) ;
pg - > SetPropertyAttribute ( wxT ( " X " ) , wxPG_ATTR_UNITS , wxT ( " Pixels " ) ) ;
pg - > SetPropertyHelpString ( wxT ( " X " ) , wxT ( " This property uses \" Units \" attribute. " ) ) ;
pg - > Append ( new wxIntProperty ( wxT ( " Y " ) , wxPG_LABEL , 10 ) ) ;
pg - > SetPropertyAttribute ( wxT ( " Y " ) , wxPG_ATTR_UNITS , wxT ( " Pixels " ) ) ;
pg - > SetPropertyHelpString ( wxT ( " Y " ) , wxT ( " This property uses \" Units \" attribute. " ) ) ;
const wxChar * disabledHelpString = wxT ( " This property is simply disabled. Inorder to have label disabled as well, " )
wxT ( " you need to set wxPG_EX_GREY_LABEL_WHEN_DISABLED using SetExtraStyle. " ) ;
pg - > Append ( new wxPropertyCategory ( wxT ( " Environment " ) , wxPG_LABEL ) ) ;
pg - > Append ( new wxStringProperty ( wxT ( " Operating System " ) , wxPG_LABEL , : : wxGetOsDescription ( ) ) ) ;
pg - > Append ( new wxStringProperty ( wxT ( " User Id " ) , wxPG_LABEL , : : wxGetUserId ( ) ) ) ;
pg - > Append ( new wxDirProperty ( wxT ( " User Home " ) , wxPG_LABEL , : : wxGetUserHome ( ) ) ) ;
pg - > Append ( new wxStringProperty ( wxT ( " User Name " ) , wxPG_LABEL , : : wxGetUserName ( ) ) ) ;
// Disable some of them
pg - > DisableProperty ( wxT ( " Operating System " ) ) ;
pg - > DisableProperty ( wxT ( " User Id " ) ) ;
pg - > DisableProperty ( wxT ( " User Name " ) ) ;
pg - > SetPropertyHelpString ( wxT ( " Operating System " ) , disabledHelpString ) ;
pg - > SetPropertyHelpString ( wxT ( " User Id " ) , disabledHelpString ) ;
pg - > SetPropertyHelpString ( wxT ( " User Name " ) , disabledHelpString ) ;
pg - > Append ( new wxPropertyCategory ( wxT ( " More Examples " ) , wxPG_LABEL ) ) ;
pg - > Append ( new wxFontDataProperty ( wxT ( " FontDataProperty " ) , wxPG_LABEL ) ) ;
pg - > SetPropertyHelpString ( wxT ( " FontDataProperty " ) ,
wxT ( " This demonstrates wxFontDataProperty class defined in this sample app. " )
wxT ( " It is exactly like wxFontProperty from the library, but also has colour sub-property. " )
) ;
pg - > Append ( new wxDirsProperty ( wxT ( " DirsProperty " ) , wxPG_LABEL ) ) ;
pg - > SetPropertyHelpString ( wxT ( " DirsProperty " ) ,
wxT ( " This demonstrates wxDirsProperty class defined in this sample app. " )
wxT ( " It is built with WX_PG_IMPLEMENT_ARRAYSTRING_PROPERTY_WITH_VALIDATOR macro, " )
wxT ( " with custom action (dir dialog popup) defined. " )
) ;
pg - > Append ( new wxAdvImageFileProperty ( wxT ( " AdvImageFileProperty " ) , wxPG_LABEL ) ) ;
pg - > SetPropertyHelpString ( wxT ( " AdvImageFileProperty " ) ,
wxT ( " This demonstrates wxAdvImageFileProperty class defined in this sample app. " )
wxT ( " Button can be used to add new images to the popup list. " )
) ;
wxArrayDouble arrdbl ;
arrdbl . Add ( - 1.0 ) ;
arrdbl . Add ( - 0.5 ) ;
arrdbl . Add ( 0.0 ) ;
arrdbl . Add ( 0.5 ) ;
arrdbl . Add ( 1.0 ) ;
pg - > Append ( new wxArrayDoubleProperty ( wxT ( " ArrayDoubleProperty " ) , wxPG_LABEL , arrdbl ) ) ;
//pg->SetPropertyAttribute(wxT("ArrayDoubleProperty"),wxPG_FLOAT_PRECISION,(long)2);
pg - > SetPropertyHelpString ( wxT ( " ArrayDoubleProperty " ) ,
wxT ( " This demonstrates wxArrayDoubleProperty class defined in this sample app. " )
wxT ( " It is an example of a custom list editor property. " )
) ;
pg - > Append ( new wxLongStringProperty ( wxT ( " Information " ) , wxPG_LABEL ,
wxT ( " Editing properties will have immediate effect on this window, " )
wxT ( " and vice versa (atleast in most cases, that is). " )
) ) ;
pg - > SetPropertyHelpString ( wxT ( " Information " ) ,
wxT ( " This property is read-only. " ) ) ;
pg - > SetPropertyReadOnly ( wxT ( " Information " ) , true ) ;
//
// Set test information for cells in columns 3 and 4
// (reserve column 2 for displaying units)
wxPropertyGridIterator it ;
wxBitmap bmp = wxArtProvider : : GetBitmap ( wxART_FOLDER ) ;
for ( it = pg - > GetGrid ( ) - > GetIterator ( ) ;
! it . AtEnd ( ) ;
it + + )
{
wxPGProperty * p = * it ;
if ( p - > IsCategory ( ) )
continue ;
pg - > SetPropertyCell ( p , 3 , wxT ( " Cell 3 " ) , bmp ) ;
pg - > SetPropertyCell ( p , 4 , wxT ( " Cell 4 " ) , wxNullBitmap , * wxWHITE , * wxBLACK ) ;
}
}
// -----------------------------------------------------------------------
void FormMain : : PopulateWithExamples ( )
{
wxPropertyGridManager * pgman = m_pPropGridManager ;
wxPropertyGridPage * pg = pgman - > GetPage ( wxT ( " Examples " ) ) ;
wxPGProperty * pid ;
2008-09-19 17:39:09 +00:00
wxPGProperty * prop ;
2008-09-12 20:57:41 +00:00
//pg->Append( new wxPropertyCategory(wxT("Examples (low priority)"),wxT("Examples")) );
//pg->SetPropertyHelpString ( wxT("Examples"), wxT("This category has example of (almost) every built-in property class.") );
# if wxUSE_SPINBTN
pg - > Append ( new wxIntProperty ( wxT ( " SpinCtrl " ) , wxPG_LABEL , 0 ) ) ;
2008-10-05 14:23:28 +00:00
pg - > SetPropertyEditor ( wxT ( " SpinCtrl " ) , wxPGEditor_SpinCtrl ) ;
2008-09-12 20:57:41 +00:00
pg - > SetPropertyAttribute ( wxT ( " SpinCtrl " ) , wxPG_ATTR_MIN , ( long ) - 10 ) ; // Use constants instead of string
2008-12-02 18:39:40 +00:00
pg - > SetPropertyAttribute ( wxT ( " SpinCtrl " ) , wxPG_ATTR_MAX , ( long ) 16384 ) ; // for reduced binary size.
2008-09-12 20:57:41 +00:00
pg - > SetPropertyAttribute ( wxT ( " SpinCtrl " ) , wxT ( " Step " ) , ( long ) 2 ) ;
2008-12-11 16:14:55 +00:00
pg - > SetPropertyAttribute ( wxT ( " SpinCtrl " ) , wxT ( " MotionSpin " ) , true ) ;
2008-09-12 20:57:41 +00:00
//pg->SetPropertyAttribute( wxT("SpinCtrl"), wxT("Wrap"), true );
pg - > SetPropertyHelpString ( wxT ( " SpinCtrl " ) ,
wxT ( " This is regular wxIntProperty, which editor has been " )
2008-10-05 14:23:28 +00:00
wxT ( " changed to wxPGEditor_SpinCtrl. Note however that " )
2008-09-12 20:57:41 +00:00
wxT ( " static wxPropertyGrid::RegisterAdditionalEditors() " )
wxT ( " needs to be called prior to using it. " ) ) ;
# endif
// Add bool property
pg - > Append ( new wxBoolProperty ( wxT ( " BoolProperty " ) , wxPG_LABEL , false ) ) ;
// Add bool property with check box
pg - > Append ( new wxBoolProperty ( wxT ( " BoolProperty with CheckBox " ) , wxPG_LABEL , false ) ) ;
pg - > SetPropertyAttribute ( wxT ( " BoolProperty with CheckBox " ) ,
wxPG_BOOL_USE_CHECKBOX ,
true ) ;
pg - > SetPropertyHelpString ( wxT ( " BoolProperty with CheckBox " ) ,
wxT ( " Property attribute wxPG_BOOL_USE_CHECKBOX has been set to true. " ) ) ;
pid = pg - > Append ( new wxFloatProperty ( wxT ( " FloatProperty " ) ,
wxPG_LABEL ,
1234500.23 ) ) ;
// A string property that can be edited in a separate editor dialog.
pg - > Append ( new wxLongStringProperty ( wxT ( " LongStringProperty " ) , wxT ( " LongStringProp " ) ,
wxT ( " This is much longer string than the first one. Edit it by clicking the button. " ) ) ) ;
// A property that edits a wxArrayString.
wxArrayString example_array ;
example_array . Add ( wxT ( " String 1 " ) ) ;
example_array . Add ( wxT ( " String 2 " ) ) ;
example_array . Add ( wxT ( " String 3 " ) ) ;
pg - > Append ( new wxArrayStringProperty ( wxT ( " ArrayStringProperty " ) , wxPG_LABEL ,
example_array ) ) ;
// Test adding same category multiple times ( should not actually create a new one )
//pg->Append( new wxPropertyCategory(wxT("Examples (low priority)"),wxT("Examples")) );
// A file selector property. Note that argument between name
// and initial value is wildcard (format same as in wxFileDialog).
2008-09-19 17:39:09 +00:00
prop = new wxFileProperty ( wxT ( " FileProperty " ) , wxT ( " TextFile " ) ) ;
2008-09-12 20:57:41 +00:00
pg - > Append ( prop ) ;
prop - > SetAttribute ( wxPG_FILE_WILDCARD , wxT ( " Text Files (*.txt)|*.txt " ) ) ;
prop - > SetAttribute ( wxPG_FILE_DIALOG_TITLE , wxT ( " Custom File Dialog Title " ) ) ;
prop - > SetAttribute ( wxPG_FILE_SHOW_FULL_PATH , false ) ;
# ifdef __WXMSW__
prop - > SetAttribute ( wxPG_FILE_SHOW_RELATIVE_PATH , wxT ( " C: \\ Windows " ) ) ;
pg - > SetPropertyValue ( prop , wxT ( " C: \\ Windows \\ System32 \\ msvcrt71.dll " ) ) ;
# endif
# if wxUSE_IMAGE
// An image file property. Arguments are just like for FileProperty, but
// wildcard is missing (it is autogenerated from supported image formats).
// If you really need to override it, create property separately, and call
// its SetWildcard method.
pg - > Append ( new wxImageFileProperty ( wxT ( " ImageFile " ) , wxPG_LABEL ) ) ;
# endif
pid = pg - > Append ( new wxColourProperty ( wxT ( " ColourProperty " ) , wxPG_LABEL , * wxRED ) ) ;
//pg->SetPropertyAttribute(pid,wxPG_COLOUR_ALLOW_CUSTOM,false);
2008-10-05 14:23:28 +00:00
pg - > SetPropertyEditor ( wxT ( " ColourProperty " ) , wxPGEditor_ComboBox ) ;
2008-09-12 20:57:41 +00:00
pg - > GetProperty ( wxT ( " ColourProperty " ) ) - > SetFlag ( wxPG_PROP_AUTO_UNSPECIFIED ) ;
pg - > SetPropertyHelpString ( wxT ( " ColourProperty " ) ,
wxT ( " wxPropertyGrid::SetPropertyEditor method has been used to change " )
2008-10-05 14:23:28 +00:00
wxT ( " editor of this property to wxPGEditor_ComboBox) " ) ) ;
2008-09-12 20:57:41 +00:00
//
// This demonstrates using alternative editor for colour property
// to trigger colour dialog directly from button.
pg - > Append ( new wxColourProperty ( wxT ( " ColourProperty2 " ) , wxPG_LABEL , * wxGREEN ) ) ;
//
// wxEnumProperty does not store strings or even list of strings
// ( so that's why they are static in function ).
static const wxChar * enum_prop_labels [ ] = { wxT ( " One Item " ) ,
wxT ( " Another Item " ) , wxT ( " One More " ) , wxT ( " This Is Last " ) , NULL } ;
// this value array would be optional if values matched string indexes
static long enum_prop_values [ ] = { 40 , 80 , 120 , 160 } ;
// note that the initial value (the last argument) is the actual value,
// not index or anything like that. Thus, our value selects "Another Item".
//
// 0 before value is number of items. If it is 0, like in our example,
// number of items is calculated, and this requires that the string pointer
// array is terminated with NULL.
pg - > Append ( new wxEnumProperty ( wxT ( " EnumProperty " ) , wxPG_LABEL ,
enum_prop_labels , enum_prop_values , 80 ) ) ;
wxPGChoices soc ;
// use basic table from our previous example
// can also set/add wxArrayStrings and wxArrayInts directly.
soc . Set ( enum_prop_labels , enum_prop_values ) ;
// add extra items
soc . Add ( wxT ( " Look, it continues " ) , 200 ) ;
soc . Add ( wxT ( " Even More " ) , 240 ) ;
soc . Add ( wxT ( " And More " ) , 280 ) ;
soc . Add ( wxT ( " True End of the List " ) , 320 ) ;
// Test custom colours ([] operator of wxPGChoices returns
// references to wxPGChoiceEntry).
soc [ 1 ] . SetFgCol ( * wxRED ) ;
soc [ 1 ] . SetBgCol ( * wxLIGHT_GREY ) ;
soc [ 2 ] . SetFgCol ( * wxGREEN ) ;
soc [ 2 ] . SetBgCol ( * wxLIGHT_GREY ) ;
soc [ 3 ] . SetFgCol ( * wxBLUE ) ;
soc [ 3 ] . SetBgCol ( * wxLIGHT_GREY ) ;
soc [ 4 ] . SetBitmap ( wxArtProvider : : GetBitmap ( wxART_FOLDER ) ) ;
pg - > Append ( new wxEnumProperty ( wxT ( " EnumProperty 2 " ) ,
wxPG_LABEL ,
soc ,
240 ) ) ;
2008-09-19 16:57:33 +00:00
pg - > GetProperty ( wxT ( " EnumProperty 2 " ) ) - > AddChoice ( wxT ( " Testing Extra " ) , 360 ) ;
2008-09-12 20:57:41 +00:00
2009-02-04 16:45:23 +00:00
// Here we only display the original 'soc' choices
pg - > Append ( new wxEnumProperty ( wxT ( " EnumProperty 3 " ) , wxPG_LABEL ,
2008-09-12 20:57:41 +00:00
soc , 240 ) ) ;
2009-02-04 16:45:23 +00:00
// 'soc' plus one exclusive extra choice "4th only"
pg - > Append ( new wxEnumProperty ( wxT ( " EnumProperty 4 " ) , wxPG_LABEL ,
2008-09-12 20:57:41 +00:00
soc , 240 ) ) ;
2009-02-04 16:45:23 +00:00
pg - > GetProperty ( wxT ( " EnumProperty 4 " ) ) - > AddChoice ( wxT ( " 4th only " ) , 360 ) ;
2008-09-19 16:57:33 +00:00
2009-02-04 16:45:23 +00:00
pg - > SetPropertyHelpString ( wxT ( " EnumProperty 4 " ) ,
wxT ( " Should have one extra item when compared to EnumProperty 3 " ) ) ;
2008-09-12 20:57:41 +00:00
// Password property example.
pg - > Append ( new wxStringProperty ( wxT ( " Password " ) , wxPG_LABEL , wxT ( " password " ) ) ) ;
pg - > SetPropertyAttribute ( wxT ( " Password " ) , wxPG_STRING_PASSWORD , true ) ;
pg - > SetPropertyHelpString ( wxT ( " Password " ) ,
wxT ( " Has attribute wxPG_STRING_PASSWORD set to true " ) ) ;
// String editor with dir selector button. Uses wxEmptyString as name, which
// is allowed (naturally, in this case property cannot be accessed by name).
pg - > Append ( new wxDirProperty ( wxT ( " DirProperty " ) , wxPG_LABEL , : : wxGetUserHome ( ) ) ) ;
pg - > SetPropertyAttribute ( wxT ( " DirProperty " ) ,
wxPG_DIR_DIALOG_MESSAGE ,
wxT ( " This is a custom dir dialog message " ) ) ;
// Add string property - first arg is label, second name, and third initial value
pg - > Append ( new wxStringProperty ( wxT ( " StringProperty " ) , wxPG_LABEL ) ) ;
pg - > SetPropertyMaxLength ( wxT ( " StringProperty " ) , 6 ) ;
pg - > SetPropertyHelpString ( wxT ( " StringProperty " ) ,
wxT ( " Max length of this text has been limited to 6, using wxPropertyGrid::SetPropertyMaxLength. " ) ) ;
// Set value after limiting so that it will be applied
pg - > SetPropertyValue ( wxT ( " StringProperty " ) , wxT ( " some text " ) ) ;
2009-03-08 11:34:01 +00:00
//
// Demonstrate "AutoComplete" attribute
pg - > Append ( new wxStringProperty ( " StringProperty AutoComplete " ,
wxPG_LABEL ) ) ;
wxArrayString autoCompleteStrings ;
autoCompleteStrings . Add ( " One choice " ) ;
autoCompleteStrings . Add ( " Another choice " ) ;
autoCompleteStrings . Add ( " Another choice, yeah " ) ;
autoCompleteStrings . Add ( " Yet another choice " ) ;
autoCompleteStrings . Add ( " Yet another choice, bear with me " ) ;
pg - > SetPropertyAttribute ( " StringProperty AutoComplete " ,
" AutoComplete " ,
autoCompleteStrings ) ;
pg - > SetPropertyHelpString ( " StringProperty AutoComplete " ,
" AutoComplete attribute has been set for this property "
" (try writing something beginning with 'a', 'o' or 'y'). " ) ;
2009-03-06 17:32:28 +00:00
// Add string property with arbitrarily wide bitmap in front of it. We
// intentionally lower-than-typical row height here so that the ugly
// scaling code wont't be run.
pg - > Append ( new wxStringProperty ( wxT ( " StringPropertyWithBitmap " ) ,
wxPG_LABEL ,
wxT ( " Test Text " ) ) ) ;
wxBitmap myTestBitmap ( 60 , 15 , 32 ) ;
wxMemoryDC mdc ;
mdc . SelectObject ( myTestBitmap ) ;
mdc . Clear ( ) ;
mdc . SetPen ( * wxBLACK ) ;
mdc . DrawLine ( 0 , 0 , 60 , 15 ) ;
mdc . SelectObject ( wxNullBitmap ) ;
pg - > SetPropertyImage ( wxT ( " StringPropertyWithBitmap " ) , myTestBitmap ) ;
2008-09-12 20:57:41 +00:00
// this value array would be optional if values matched string indexes
//long flags_prop_values[] = { wxICONIZE, wxCAPTION, wxMINIMIZE_BOX, wxMAXIMIZE_BOX };
//pg->Append( wxFlagsProperty(wxT("Example of FlagsProperty"),wxT("FlagsProp"),
// flags_prop_labels, flags_prop_values, 0, GetWindowStyle() ) );
// Multi choice dialog.
wxArrayString tchoices ;
tchoices . Add ( wxT ( " Cabbage " ) ) ;
tchoices . Add ( wxT ( " Carrot " ) ) ;
tchoices . Add ( wxT ( " Onion " ) ) ;
tchoices . Add ( wxT ( " Potato " ) ) ;
tchoices . Add ( wxT ( " Strawberry " ) ) ;
wxArrayString tchoicesValues ;
tchoicesValues . Add ( wxT ( " Carrot " ) ) ;
tchoicesValues . Add ( wxT ( " Potato " ) ) ;
pg - > Append ( new wxEnumProperty ( wxT ( " EnumProperty X " ) , wxPG_LABEL , tchoices ) ) ;
pg - > Append ( new wxMultiChoiceProperty ( wxT ( " MultiChoiceProperty " ) , wxPG_LABEL ,
tchoices , tchoicesValues ) ) ;
pg - > SetPropertyAttribute ( wxT ( " MultiChoiceProperty " ) , wxT ( " UserStringMode " ) , true ) ;
pg - > Append ( new wxSizeProperty ( wxT ( " SizeProperty " ) , wxT ( " Size " ) , GetSize ( ) ) ) ;
pg - > Append ( new wxPointProperty ( wxT ( " PointProperty " ) , wxT ( " Position " ) , GetPosition ( ) ) ) ;
// UInt samples
pg - > Append ( new wxUIntProperty ( wxT ( " UIntProperty " ) , wxPG_LABEL , wxULongLong ( wxULL ( 0xFEEEFEEEFEEE ) ) ) ) ;
pg - > SetPropertyAttribute ( wxT ( " UIntProperty " ) , wxPG_UINT_PREFIX , wxPG_PREFIX_NONE ) ;
pg - > SetPropertyAttribute ( wxT ( " UIntProperty " ) , wxPG_UINT_BASE , wxPG_BASE_HEX ) ;
//pg->SetPropertyAttribute( wxT("UIntProperty"), wxPG_UINT_PREFIX, wxPG_PREFIX_NONE );
//pg->SetPropertyAttribute( wxT("UIntProperty"), wxPG_UINT_BASE, wxPG_BASE_OCT );
//
// wxEditEnumProperty
wxPGChoices eech ;
eech . Add ( wxT ( " Choice 1 " ) ) ;
eech . Add ( wxT ( " Choice 2 " ) ) ;
eech . Add ( wxT ( " Choice 3 " ) ) ;
pg - > Append ( new wxEditEnumProperty ( wxT ( " EditEnumProperty " ) , wxPG_LABEL , eech ) ) ; // , wxT("Choice 2")
//wxString v_;
//wxTextValidator validator1(wxFILTER_NUMERIC,&v_);
//pg->SetPropertyValidator( wxT("EditEnumProperty"), validator1 );
# if wxUSE_DATETIME
//
// wxDateTimeProperty
pg - > Append ( new wxDateProperty ( wxT ( " DateProperty " ) , wxPG_LABEL , wxDateTime : : Now ( ) ) ) ;
# if wxUSE_DATEPICKCTRL
pg - > SetPropertyAttribute ( wxT ( " DateProperty " ) , wxPG_DATE_PICKER_STYLE ,
2009-01-12 17:05:37 +00:00
( long ) ( wxDP_DROPDOWN |
wxDP_SHOWCENTURY |
wxDP_ALLOWNONE ) ) ;
2008-09-12 20:57:41 +00:00
pg - > SetPropertyHelpString ( wxT ( " DateProperty " ) ,
2009-01-12 17:05:37 +00:00
wxT ( " Attribute wxPG_DATE_PICKER_STYLE has been set to (long) " )
wxT ( " (wxDP_DROPDOWN | wxDP_SHOWCENTURY | wxDP_ALLOWNONE). " ) ) ;
2008-09-12 20:57:41 +00:00
# endif
# endif
//
// Add Triangle properties as both wxTriangleProperty and
// a generic parent property (using wxStringProperty).
//
wxPGProperty * topId = pg - > Append ( new wxStringProperty ( wxT ( " 3D Object " ) , wxPG_LABEL , wxT ( " <composed> " ) ) ) ;
pid = pg - > AppendIn ( topId , new wxStringProperty ( wxT ( " Triangle 1 " ) , wxT ( " Triangle 1 " ) , wxT ( " <composed> " ) ) ) ;
2008-09-14 13:14:32 +00:00
pg - > AppendIn ( pid , new wxVectorProperty ( wxT ( " A " ) , wxPG_LABEL ) ) ;
pg - > AppendIn ( pid , new wxVectorProperty ( wxT ( " B " ) , wxPG_LABEL ) ) ;
pg - > AppendIn ( pid , new wxVectorProperty ( wxT ( " C " ) , wxPG_LABEL ) ) ;
2008-09-12 20:57:41 +00:00
pg - > AppendIn ( topId , new wxTriangleProperty ( wxT ( " Triangle 2 " ) , wxT ( " Triangle 2 " ) ) ) ;
pg - > SetPropertyHelpString ( wxT ( " 3D Object " ) ,
wxT ( " 3D Object is wxStringProperty with value \" <composed> \" . Two of its children are similar wxStringProperties with " )
wxT ( " three wxVectorProperty children, and other two are custom wxTriangleProperties. " ) ) ;
pid = pg - > AppendIn ( topId , new wxStringProperty ( wxT ( " Triangle 3 " ) , wxT ( " Triangle 3 " ) , wxT ( " <composed> " ) ) ) ;
2008-09-14 13:14:32 +00:00
pg - > AppendIn ( pid , new wxVectorProperty ( wxT ( " A " ) , wxPG_LABEL ) ) ;
pg - > AppendIn ( pid , new wxVectorProperty ( wxT ( " B " ) , wxPG_LABEL ) ) ;
pg - > AppendIn ( pid , new wxVectorProperty ( wxT ( " C " ) , wxPG_LABEL ) ) ;
2008-09-12 20:57:41 +00:00
pg - > AppendIn ( topId , new wxTriangleProperty ( wxT ( " Triangle 4 " ) , wxT ( " Triangle 4 " ) ) ) ;
//
// This snippet is a doc sample test
//
2008-09-21 14:13:32 +00:00
wxPGProperty * carProp = pg - > Append ( new wxStringProperty ( wxT ( " Car " ) ,
wxPG_LABEL ,
wxT ( " <composed> " ) ) ) ;
pg - > AppendIn ( carProp , new wxStringProperty ( wxT ( " Model " ) ,
wxPG_LABEL ,
wxT ( " Lamborghini Diablo SV " ) ) ) ;
2008-09-12 20:57:41 +00:00
2008-09-21 14:13:32 +00:00
pg - > AppendIn ( carProp , new wxIntProperty ( wxT ( " Engine Size (cc) " ) ,
2008-09-12 20:57:41 +00:00
wxPG_LABEL ,
2008-09-21 14:13:32 +00:00
5707 ) ) ;
2008-09-12 20:57:41 +00:00
2008-09-21 14:13:32 +00:00
wxPGProperty * speedsProp = pg - > AppendIn ( carProp ,
new wxStringProperty ( wxT ( " Speeds " ) ,
wxPG_LABEL ,
wxT ( " <composed> " ) ) ) ;
2008-09-12 20:57:41 +00:00
2008-09-21 14:13:32 +00:00
pg - > AppendIn ( speedsProp , new wxIntProperty ( wxT ( " Max. Speed (mph) " ) ,
wxPG_LABEL , 290 ) ) ;
pg - > AppendIn ( speedsProp , new wxFloatProperty ( wxT ( " 0-100 mph (sec) " ) ,
wxPG_LABEL , 3.9 ) ) ;
pg - > AppendIn ( speedsProp , new wxFloatProperty ( wxT ( " 1/4 mile (sec) " ) ,
wxPG_LABEL , 8.6 ) ) ;
2008-09-12 20:57:41 +00:00
2008-09-21 14:13:32 +00:00
// This is how child property can be referred to by name
2008-09-12 20:57:41 +00:00
pg - > SetPropertyValue ( wxT ( " Car.Speeds.Max. Speed (mph) " ) , 300 ) ;
2008-09-21 14:13:32 +00:00
pg - > AppendIn ( carProp , new wxIntProperty ( wxT ( " Price ($) " ) ,
wxPG_LABEL ,
300000 ) ) ;
2009-01-04 18:38:00 +00:00
pg - > AppendIn ( carProp , new wxBoolProperty ( wxT ( " Convertible " ) ,
wxPG_LABEL ,
false ) ) ;
2008-09-21 14:13:32 +00:00
// Displayed value of "Car" property is now very close to this:
// "Lamborghini Diablo SV; 5707 [300; 3.9; 8.6] 300000"
2008-09-12 20:57:41 +00:00
//
// Test wxSampleMultiButtonEditor
pg - > Append ( new wxLongStringProperty ( wxT ( " MultipleButtons " ) , wxPG_LABEL ) ) ;
2008-09-27 15:29:50 +00:00
pg - > SetPropertyEditor ( wxT ( " MultipleButtons " ) , m_pSampleMultiButtonEditor ) ;
2008-09-12 20:57:41 +00:00
// Test SingleChoiceProperty
pg - > Append ( new SingleChoiceProperty ( wxT ( " SingleChoiceProperty " ) ) ) ;
//
// Test adding variable height bitmaps in wxPGChoices
wxPGChoices bc ;
bc . Add ( wxT ( " Wee " ) , wxBitmap ( 16 , 16 ) ) ;
bc . Add ( wxT ( " Not so wee " ) , wxBitmap ( 32 , 32 ) ) ;
bc . Add ( wxT ( " Friggin' huge " ) , wxBitmap ( 64 , 64 ) ) ;
pg - > Append ( new wxEnumProperty ( wxT ( " Variable Height Bitmaps " ) ,
wxPG_LABEL ,
bc ,
0 ) ) ;
//
// Test how non-editable composite strings appear
2008-10-14 17:15:59 +00:00
pid = new wxStringProperty ( wxT ( " wxWidgets Traits " ) , wxPG_LABEL , wxT ( " <composed> " ) ) ;
2008-09-12 20:57:41 +00:00
pg - > SetPropertyReadOnly ( pid ) ;
2008-10-14 17:15:59 +00:00
//
// For testing purposes, combine two methods of adding children
//
2009-03-12 18:17:55 +00:00
pid - > AppendChild ( new wxStringProperty ( wxT ( " Latest Release " ) ,
wxPG_LABEL ,
wxT ( " 2.8.10 " ) ) ) ;
pid - > AppendChild ( new wxBoolProperty ( wxT ( " Win API " ) ,
wxPG_LABEL ,
true ) ) ;
2008-10-14 17:15:59 +00:00
pg - > Append ( pid ) ;
2008-09-12 20:57:41 +00:00
pg - > AppendIn ( pid , new wxBoolProperty ( wxT ( " QT " ) , wxPG_LABEL , false ) ) ;
pg - > AppendIn ( pid , new wxBoolProperty ( wxT ( " Cocoa " ) , wxPG_LABEL , true ) ) ;
pg - > AppendIn ( pid , new wxBoolProperty ( wxT ( " BeOS " ) , wxPG_LABEL , false ) ) ;
pg - > AppendIn ( pid , new wxStringProperty ( wxT ( " SVN Trunk Version " ) , wxPG_LABEL , wxT ( " 2.9.0 " ) ) ) ;
pg - > AppendIn ( pid , new wxBoolProperty ( wxT ( " GTK+ " ) , wxPG_LABEL , true ) ) ;
pg - > AppendIn ( pid , new wxBoolProperty ( wxT ( " Sky OS " ) , wxPG_LABEL , false ) ) ;
pg - > AppendIn ( pid , new wxBoolProperty ( wxT ( " QT " ) , wxPG_LABEL , false ) ) ;
AddTestProperties ( pg ) ;
}
// -----------------------------------------------------------------------
void FormMain : : PopulateWithLibraryConfig ( )
{
wxPropertyGridManager * pgman = m_pPropGridManager ;
wxPropertyGridPage * pg = pgman - > GetPage ( wxT ( " wxWidgets Library Config " ) ) ;
wxPGProperty * cat ;
wxBitmap bmp = wxArtProvider : : GetBitmap ( wxART_REPORT_VIEW ) ;
wxPGProperty * pid ;
# define ADD_WX_LIB_CONF_GROUP(A) \
cat = pg - > AppendIn ( pid , new wxPropertyCategory ( A ) ) ; \
pg - > SetPropertyCell ( cat , 0 , wxPG_LABEL , bmp ) ;
# define ADD_WX_LIB_CONF(A) pg->Append( new wxBoolProperty(wxT(#A),wxPG_LABEL,(bool)((A>0)?true:false)));
# define ADD_WX_LIB_CONF_NODEF(A) pg->Append( new wxBoolProperty(wxT(#A),wxPG_LABEL,(bool)false) ); \
pg - > DisableProperty ( wxT ( # A ) ) ;
pid = pg - > Append ( new wxPropertyCategory ( wxT ( " wxWidgets Library Configuration " ) ) ) ;
pg - > SetPropertyCell ( pid , 0 , wxPG_LABEL , bmp ) ;
ADD_WX_LIB_CONF_GROUP ( wxT ( " Global Settings " ) )
ADD_WX_LIB_CONF ( wxUSE_GUI )
ADD_WX_LIB_CONF_GROUP ( wxT ( " Compatibility Settings " ) )
# if defined(WXWIN_COMPATIBILITY_2_2)
ADD_WX_LIB_CONF ( WXWIN_COMPATIBILITY_2_2 )
# endif
# if defined(WXWIN_COMPATIBILITY_2_4)
ADD_WX_LIB_CONF ( WXWIN_COMPATIBILITY_2_4 )
# endif
# if defined(WXWIN_COMPATIBILITY_2_6)
ADD_WX_LIB_CONF ( WXWIN_COMPATIBILITY_2_6 )
# endif
# if defined(WXWIN_COMPATIBILITY_2_8)
ADD_WX_LIB_CONF ( WXWIN_COMPATIBILITY_2_8 )
# endif
# ifdef wxFONT_SIZE_COMPATIBILITY
ADD_WX_LIB_CONF ( wxFONT_SIZE_COMPATIBILITY )
# else
ADD_WX_LIB_CONF_NODEF ( wxFONT_SIZE_COMPATIBILITY )
# endif
# ifdef wxDIALOG_UNIT_COMPATIBILITY
ADD_WX_LIB_CONF ( wxDIALOG_UNIT_COMPATIBILITY )
# else
ADD_WX_LIB_CONF_NODEF ( wxDIALOG_UNIT_COMPATIBILITY )
# endif
ADD_WX_LIB_CONF_GROUP ( wxT ( " Debugging Settings " ) )
ADD_WX_LIB_CONF ( wxUSE_DEBUG_CONTEXT )
ADD_WX_LIB_CONF ( wxUSE_MEMORY_TRACING )
ADD_WX_LIB_CONF ( wxUSE_GLOBAL_MEMORY_OPERATORS )
ADD_WX_LIB_CONF ( wxUSE_DEBUG_NEW_ALWAYS )
ADD_WX_LIB_CONF ( wxUSE_ON_FATAL_EXCEPTION )
ADD_WX_LIB_CONF_GROUP ( wxT ( " Unicode Support " ) )
ADD_WX_LIB_CONF ( wxUSE_UNICODE )
ADD_WX_LIB_CONF ( wxUSE_UNICODE_MSLU )
ADD_WX_LIB_CONF ( wxUSE_WCHAR_T )
ADD_WX_LIB_CONF_GROUP ( wxT ( " Global Features " ) )
ADD_WX_LIB_CONF ( wxUSE_EXCEPTIONS )
ADD_WX_LIB_CONF ( wxUSE_EXTENDED_RTTI )
ADD_WX_LIB_CONF ( wxUSE_STL )
ADD_WX_LIB_CONF ( wxUSE_LOG )
ADD_WX_LIB_CONF ( wxUSE_LOGWINDOW )
ADD_WX_LIB_CONF ( wxUSE_LOGGUI )
ADD_WX_LIB_CONF ( wxUSE_LOG_DIALOG )
ADD_WX_LIB_CONF ( wxUSE_CMDLINE_PARSER )
ADD_WX_LIB_CONF ( wxUSE_THREADS )
ADD_WX_LIB_CONF ( wxUSE_STREAMS )
ADD_WX_LIB_CONF ( wxUSE_STD_IOSTREAM )
ADD_WX_LIB_CONF_GROUP ( wxT ( " Non-GUI Features " ) )
ADD_WX_LIB_CONF ( wxUSE_LONGLONG )
ADD_WX_LIB_CONF ( wxUSE_FILE )
ADD_WX_LIB_CONF ( wxUSE_FFILE )
ADD_WX_LIB_CONF ( wxUSE_FSVOLUME )
ADD_WX_LIB_CONF ( wxUSE_TEXTBUFFER )
ADD_WX_LIB_CONF ( wxUSE_TEXTFILE )
ADD_WX_LIB_CONF ( wxUSE_INTL )
ADD_WX_LIB_CONF ( wxUSE_DATETIME )
ADD_WX_LIB_CONF ( wxUSE_TIMER )
ADD_WX_LIB_CONF ( wxUSE_STOPWATCH )
ADD_WX_LIB_CONF ( wxUSE_CONFIG )
# ifdef wxUSE_CONFIG_NATIVE
ADD_WX_LIB_CONF ( wxUSE_CONFIG_NATIVE )
# else
ADD_WX_LIB_CONF_NODEF ( wxUSE_CONFIG_NATIVE )
# endif
ADD_WX_LIB_CONF ( wxUSE_DIALUP_MANAGER )
ADD_WX_LIB_CONF ( wxUSE_DYNLIB_CLASS )
ADD_WX_LIB_CONF ( wxUSE_DYNAMIC_LOADER )
ADD_WX_LIB_CONF ( wxUSE_SOCKETS )
ADD_WX_LIB_CONF ( wxUSE_FILESYSTEM )
ADD_WX_LIB_CONF ( wxUSE_FS_ZIP )
ADD_WX_LIB_CONF ( wxUSE_FS_INET )
ADD_WX_LIB_CONF ( wxUSE_ZIPSTREAM )
ADD_WX_LIB_CONF ( wxUSE_ZLIB )
ADD_WX_LIB_CONF ( wxUSE_APPLE_IEEE )
ADD_WX_LIB_CONF ( wxUSE_JOYSTICK )
ADD_WX_LIB_CONF ( wxUSE_FONTMAP )
ADD_WX_LIB_CONF ( wxUSE_MIMETYPE )
ADD_WX_LIB_CONF ( wxUSE_PROTOCOL )
ADD_WX_LIB_CONF ( wxUSE_PROTOCOL_FILE )
ADD_WX_LIB_CONF ( wxUSE_PROTOCOL_FTP )
ADD_WX_LIB_CONF ( wxUSE_PROTOCOL_HTTP )
ADD_WX_LIB_CONF ( wxUSE_URL )
# ifdef wxUSE_URL_NATIVE
ADD_WX_LIB_CONF ( wxUSE_URL_NATIVE )
# else
ADD_WX_LIB_CONF_NODEF ( wxUSE_URL_NATIVE )
# endif
ADD_WX_LIB_CONF ( wxUSE_REGEX )
ADD_WX_LIB_CONF ( wxUSE_SYSTEM_OPTIONS )
ADD_WX_LIB_CONF ( wxUSE_SOUND )
# ifdef wxUSE_XRC
ADD_WX_LIB_CONF ( wxUSE_XRC )
# else
ADD_WX_LIB_CONF_NODEF ( wxUSE_XRC )
# endif
ADD_WX_LIB_CONF ( wxUSE_XML )
// Set them to use check box.
pg - > SetPropertyAttribute ( pid , wxPG_BOOL_USE_CHECKBOX , true , wxPG_RECURSE ) ;
}
//
// Handle events of the third page here.
class wxMyPropertyGridPage : public wxPropertyGridPage
{
public :
// Return false here to indicate unhandled events should be
// propagated to manager's parent, as normal.
virtual bool IsHandlingAllEvents ( ) const { return false ; }
protected :
virtual wxPGProperty * DoInsert ( wxPGProperty * parent ,
int index ,
wxPGProperty * property )
{
return wxPropertyGridPage : : DoInsert ( parent , index , property ) ;
}
void OnPropertySelect ( wxPropertyGridEvent & event ) ;
void OnPropertyChanging ( wxPropertyGridEvent & event ) ;
void OnPropertyChange ( wxPropertyGridEvent & event ) ;
void OnPageChange ( wxPropertyGridEvent & event ) ;
private :
DECLARE_EVENT_TABLE ( )
} ;
BEGIN_EVENT_TABLE ( wxMyPropertyGridPage , wxPropertyGridPage )
EVT_PG_SELECTED ( wxID_ANY , wxMyPropertyGridPage : : OnPropertySelect )
EVT_PG_CHANGING ( wxID_ANY , wxMyPropertyGridPage : : OnPropertyChanging )
EVT_PG_CHANGED ( wxID_ANY , wxMyPropertyGridPage : : OnPropertyChange )
EVT_PG_PAGE_CHANGED ( wxID_ANY , wxMyPropertyGridPage : : OnPageChange )
END_EVENT_TABLE ( )
void wxMyPropertyGridPage : : OnPropertySelect ( wxPropertyGridEvent & WXUNUSED ( event ) )
{
wxLogDebug ( wxT ( " wxMyPropertyGridPage::OnPropertySelect() " ) ) ;
}
void wxMyPropertyGridPage : : OnPropertyChange ( wxPropertyGridEvent & event )
{
wxPGProperty * p = event . GetProperty ( ) ;
2009-07-03 12:48:44 +00:00
wxLogVerbose ( wxT ( " wxMyPropertyGridPage::OnPropertyChange('%s', to value '%s') " ) ,
2008-09-12 20:57:41 +00:00
p - > GetName ( ) . c_str ( ) ,
p - > GetDisplayedString ( ) . c_str ( ) ) ;
}
void wxMyPropertyGridPage : : OnPropertyChanging ( wxPropertyGridEvent & event )
{
wxPGProperty * p = event . GetProperty ( ) ;
2009-07-03 12:48:44 +00:00
wxLogVerbose ( wxT ( " wxMyPropertyGridPage::OnPropertyChanging('%s', to value '%s') " ) ,
2008-09-12 20:57:41 +00:00
p - > GetName ( ) . c_str ( ) ,
event . GetValue ( ) . GetString ( ) . c_str ( ) ) ;
}
void wxMyPropertyGridPage : : OnPageChange ( wxPropertyGridEvent & WXUNUSED ( event ) )
{
wxLogDebug ( wxT ( " wxMyPropertyGridPage::OnPageChange() " ) ) ;
}
class wxPGKeyHandler : public wxEvtHandler
{
public :
void OnKeyEvent ( wxKeyEvent & event )
{
wxMessageBox ( wxString : : Format ( wxT ( " %i " ) , event . GetKeyCode ( ) ) ) ;
event . Skip ( ) ;
}
private :
DECLARE_EVENT_TABLE ( )
} ;
BEGIN_EVENT_TABLE ( wxPGKeyHandler , wxEvtHandler )
EVT_KEY_DOWN ( wxPGKeyHandler : : OnKeyEvent )
END_EVENT_TABLE ( )
// -----------------------------------------------------------------------
void FormMain : : InitPanel ( )
{
if ( m_panel )
m_panel - > Destroy ( ) ;
2008-10-18 15:11:44 +00:00
wxWindow * panel = new wxPanel ( this , wxID_ANY ,
wxPoint ( 0 , 0 ) , wxSize ( 400 , 400 ) ,
wxTAB_TRAVERSAL ) ;
2008-09-12 20:57:41 +00:00
m_panel = panel ;
// Column
wxBoxSizer * topSizer = new wxBoxSizer ( wxVERTICAL ) ;
m_topSizer = topSizer ;
}
void FormMain : : FinalizePanel ( bool wasCreated )
{
2008-10-18 15:11:44 +00:00
// Button for tab traversal testing
m_topSizer - > Add ( new wxButton ( m_panel , wxID_ANY ,
wxS ( " Should be able to move here with Tab " ) ) ,
0 , wxEXPAND ) ;
2008-09-12 20:57:41 +00:00
m_panel - > SetSizer ( m_topSizer ) ;
m_topSizer - > SetSizeHints ( m_panel ) ;
wxBoxSizer * panelSizer = new wxBoxSizer ( wxHORIZONTAL ) ;
panelSizer - > Add ( m_panel , 1 , wxEXPAND | wxFIXED_MINSIZE ) ;
2008-10-18 15:11:44 +00:00
2008-09-12 20:57:41 +00:00
SetSizer ( panelSizer ) ;
panelSizer - > SetSizeHints ( this ) ;
if ( wasCreated )
2008-10-16 17:31:46 +00:00
FinalizeFramePosition ( ) ;
2008-09-12 20:57:41 +00:00
}
void FormMain : : PopulateGrid ( )
{
wxPropertyGridManager * pgman = m_pPropGridManager ;
pgman - > AddPage ( wxT ( " Standard Items " ) ) ;
PopulateWithStandardItems ( ) ;
pgman - > AddPage ( wxT ( " wxWidgets Library Config " ) ) ;
PopulateWithLibraryConfig ( ) ;
wxPropertyGridPage * myPage = new wxMyPropertyGridPage ( ) ;
myPage - > Append ( new wxIntProperty ( wxT ( " IntProperty " ) , wxPG_LABEL , 12345678 ) ) ;
// Use wxMyPropertyGridPage (see above) to test the
// custom wxPropertyGridPage feature.
pgman - > AddPage ( wxT ( " Examples " ) , wxNullBitmap , myPage ) ;
PopulateWithExamples ( ) ;
}
void FormMain : : CreateGrid ( int style , int extraStyle )
{
//
// This function (re)creates the property grid in our sample
//
if ( style = = - 1 )
style = // default style
wxPG_BOLD_MODIFIED |
wxPG_SPLITTER_AUTO_CENTER |
wxPG_AUTO_SORT |
//wxPG_HIDE_MARGIN|wxPG_STATIC_SPLITTER |
//wxPG_TOOLTIPS |
//wxPG_HIDE_CATEGORIES |
//wxPG_LIMITED_EDITING |
wxPG_TOOLBAR |
wxPG_DESCRIPTION ;
if ( extraStyle = = - 1 )
// default extra style
extraStyle = wxPG_EX_MODE_BUTTONS ;
//| wxPG_EX_AUTO_UNSPECIFIED_VALUES
//| wxPG_EX_GREY_LABEL_WHEN_DISABLED
//| wxPG_EX_NATIVE_DOUBLE_BUFFERING
//| wxPG_EX_HELP_AS_TOOLTIPS
bool wasCreated = m_panel ? false : true ;
InitPanel ( ) ;
//
// This shows how to combine two static choice descriptors
m_combinedFlags . Add ( _fs_windowstyle_labels , _fs_windowstyle_values ) ;
m_combinedFlags . Add ( _fs_framestyle_labels , _fs_framestyle_values ) ;
wxPropertyGridManager * pgman = m_pPropGridManager =
new wxPropertyGridManager ( m_panel ,
// Don't change this into wxID_ANY in the sample, or the
// event handling will obviously be broken.
PGID , /*wxID_ANY*/
wxDefaultPosition ,
wxDefaultSize ,
style ) ;
m_propGrid = pgman - > GetGrid ( ) ;
pgman - > SetExtraStyle ( extraStyle ) ;
m_pPropGridManager - > SetValidationFailureBehavior ( wxPG_VFB_BEEP | wxPG_VFB_MARK_CELL | wxPG_VFB_SHOW_MESSAGE ) ;
m_pPropGridManager - > GetGrid ( ) - > SetVerticalSpacing ( 2 ) ;
PopulateGrid ( ) ;
// Change some attributes in all properties
//pgman->SetPropertyAttributeAll(wxPG_BOOL_USE_DOUBLE_CLICK_CYCLING,true);
//pgman->SetPropertyAttributeAll(wxPG_BOOL_USE_CHECKBOX,true);
//m_pPropGridManager->SetSplitterLeft(true);
//m_pPropGridManager->SetSplitterPosition(137);
/*
// This would setup event handling without event table entries
Connect ( m_pPropGridManager - > GetId ( ) , wxEVT_PG_SELECTED ,
2008-09-27 15:17:21 +00:00
wxPropertyGridEventHandler ( FormMain : : OnPropertyGridSelect ) ) ;
2008-09-12 20:57:41 +00:00
Connect ( m_pPropGridManager - > GetId ( ) , wxEVT_PG_CHANGED ,
2008-09-27 15:17:21 +00:00
wxPropertyGridEventHandler ( FormMain : : OnPropertyGridChange ) ) ;
2008-09-12 20:57:41 +00:00
*/
m_topSizer - > Add ( m_pPropGridManager , 1 , wxEXPAND ) ;
FinalizePanel ( wasCreated ) ;
}
// -----------------------------------------------------------------------
FormMain : : FormMain ( const wxString & title , const wxPoint & pos , const wxSize & size ) :
wxFrame ( ( wxFrame * ) NULL , - 1 , title , pos , size ,
( wxMINIMIZE_BOX | wxMAXIMIZE_BOX | wxRESIZE_BORDER | wxSYSTEM_MENU | wxCAPTION |
wxTAB_TRAVERSAL | wxCLOSE_BOX | wxNO_FULL_REPAINT_ON_RESIZE ) )
{
2009-02-08 01:01:00 +00:00
SetIcon ( wxICON ( sample ) ) ;
2008-09-12 20:57:41 +00:00
m_propGrid = NULL ;
m_panel = NULL ;
# ifdef __WXMAC__
// we need this in order to allow the about menu relocation, since ABOUT is
// not the default id of the about menu
wxApp : : s_macAboutMenuItemId = ID_ABOUT ;
# endif
# if wxUSE_IMAGE
// This is here to really test the wxImageFileProperty.
wxInitAllImageHandlers ( ) ;
# endif
2008-09-29 16:50:03 +00:00
// Register all editors (SpinCtrl etc.)
m_pPropGridManager - > RegisterAdditionalEditors ( ) ;
// Register our sample custom editors
m_pSampleMultiButtonEditor =
wxPropertyGrid : : RegisterEditorClass ( new wxSampleMultiButtonEditor ( ) ) ;
2008-09-12 20:57:41 +00:00
CreateGrid ( // style
wxPG_BOLD_MODIFIED |
wxPG_SPLITTER_AUTO_CENTER |
wxPG_AUTO_SORT |
//wxPG_HIDE_MARGIN|wxPG_STATIC_SPLITTER |
//wxPG_TOOLTIPS |
//wxPG_HIDE_CATEGORIES |
//wxPG_LIMITED_EDITING |
wxPG_TOOLBAR |
wxPG_DESCRIPTION ,
// extra style
wxPG_EX_MODE_BUTTONS
//| wxPG_EX_AUTO_UNSPECIFIED_VALUES
//| wxPG_EX_GREY_LABEL_WHEN_DISABLED
//| wxPG_EX_NATIVE_DOUBLE_BUFFERING
//| wxPG_EX_HELP_AS_TOOLTIPS
) ;
//
// Create menubar
wxMenu * menuFile = new wxMenu ( wxEmptyString , wxMENU_TEAROFF ) ;
wxMenu * menuTry = new wxMenu ;
wxMenu * menuTools1 = new wxMenu ;
wxMenu * menuTools2 = new wxMenu ;
wxMenu * menuHelp = new wxMenu ;
menuHelp - > Append ( ID_ABOUT , wxT ( " &About... " ) , wxT ( " Show about dialog " ) ) ;
menuTools1 - > Append ( ID_APPENDPROP , wxT ( " Append New Property " ) ) ;
menuTools1 - > Append ( ID_APPENDCAT , wxT ( " Append New Category \t Ctrl-S " ) ) ;
menuTools1 - > AppendSeparator ( ) ;
menuTools1 - > Append ( ID_INSERTPROP , wxT ( " Insert New Property \t Ctrl-Q " ) ) ;
menuTools1 - > Append ( ID_INSERTCAT , wxT ( " Insert New Category \t Ctrl-W " ) ) ;
menuTools1 - > AppendSeparator ( ) ;
menuTools1 - > Append ( ID_DELETE , wxT ( " Delete Selected " ) ) ;
menuTools1 - > Append ( ID_DELETER , wxT ( " Delete Random " ) ) ;
menuTools1 - > Append ( ID_DELETEALL , wxT ( " Delete All " ) ) ;
menuTools1 - > AppendSeparator ( ) ;
2008-10-31 18:53:37 +00:00
menuTools1 - > Append ( ID_SETBGCOLOUR , wxT ( " Set Bg Colour " ) ) ;
menuTools1 - > Append ( ID_SETBGCOLOURRECUR , wxT ( " Set Bg Colour (Recursively) " ) ) ;
2008-09-12 20:57:41 +00:00
menuTools1 - > Append ( ID_UNSPECIFY , wxT ( " Set to Unspecified " ) ) ;
menuTools1 - > AppendSeparator ( ) ;
m_itemEnable = menuTools1 - > Append ( ID_ENABLE , wxT ( " Enable " ) ,
wxT ( " Toggles item's enabled state. " ) ) ;
m_itemEnable - > Enable ( FALSE ) ;
menuTools1 - > Append ( ID_HIDE , wxT ( " Hide " ) , wxT ( " Shows or hides a property " ) ) ;
menuTools2 - > Append ( ID_ITERATE1 , wxT ( " Iterate Over Properties " ) ) ;
menuTools2 - > Append ( ID_ITERATE2 , wxT ( " Iterate Over Visible Items " ) ) ;
menuTools2 - > Append ( ID_ITERATE3 , wxT ( " Reverse Iterate Over Properties " ) ) ;
menuTools2 - > Append ( ID_ITERATE4 , wxT ( " Iterate Over Categories " ) ) ;
menuTools2 - > AppendSeparator ( ) ;
menuTools2 - > Append ( ID_SETPROPERTYVALUE , wxT ( " Set Property Value " ) ) ;
menuTools2 - > Append ( ID_CLEARMODIF , wxT ( " Clear Modified Status " ) , wxT ( " Clears wxPG_MODIFIED flag from all properties. " ) ) ;
menuTools2 - > AppendSeparator ( ) ;
m_itemFreeze = menuTools2 - > AppendCheckItem ( ID_FREEZE , wxT ( " Freeze " ) ,
wxT ( " Disables painting, auto-sorting, etc. " ) ) ;
menuTools2 - > AppendSeparator ( ) ;
menuTools2 - > Append ( ID_DUMPLIST , wxT ( " Display Values as wxVariant List " ) , wxT ( " Tests GetAllValues method and wxVariant conversion. " ) ) ;
menuTools2 - > AppendSeparator ( ) ;
menuTools2 - > Append ( ID_GETVALUES , wxT ( " Get Property Values " ) , wxT ( " Stores all property values. " ) ) ;
menuTools2 - > Append ( ID_SETVALUES , wxT ( " Set Property Values " ) , wxT ( " Reverts property values to those last stored. " ) ) ;
menuTools2 - > Append ( ID_SETVALUES2 , wxT ( " Set Property Values 2 " ) , wxT ( " Adds property values that should not initially be as items (so new items are created). " ) ) ;
menuTools2 - > AppendSeparator ( ) ;
menuTools2 - > Append ( ID_SAVESTATE , wxT ( " Save Editable State " ) ) ;
menuTools2 - > Append ( ID_RESTORESTATE , wxT ( " Restore Editable State " ) ) ;
menuTools2 - > AppendSeparator ( ) ;
menuTools2 - > Append ( ID_ENABLECOMMONVALUES , wxT ( " Enable Common Value " ) ,
wxT ( " Enable values that are common to all properties, for selected property. " ) ) ;
menuTools2 - > AppendSeparator ( ) ;
menuTools2 - > Append ( ID_COLLAPSE , wxT ( " Collapse Selected " ) ) ;
menuTools2 - > Append ( ID_COLLAPSEALL , wxT ( " Collapse All " ) ) ;
menuTools2 - > AppendSeparator ( ) ;
menuTools2 - > Append ( ID_INSERTPAGE , wxT ( " Add Page " ) ) ;
menuTools2 - > Append ( ID_REMOVEPAGE , wxT ( " Remove Page " ) ) ;
menuTools2 - > AppendSeparator ( ) ;
menuTools2 - > Append ( ID_FITCOLUMNS , wxT ( " Fit Columns " ) ) ;
menuTools2 - > AppendSeparator ( ) ;
menuTools2 - > Append ( ID_CHANGEFLAGSITEMS , wxT ( " Change Children of FlagsProp " ) ) ;
menuTools2 - > AppendSeparator ( ) ;
menuTools2 - > Append ( ID_TESTINSERTCHOICE , wxT ( " Test InsertPropertyChoice " ) ) ;
menuTools2 - > Append ( ID_TESTDELETECHOICE , wxT ( " Test DeletePropertyChoice " ) ) ;
menuTools2 - > AppendSeparator ( ) ;
menuTools2 - > Append ( ID_SETSPINCTRLEDITOR , wxT ( " Use SpinCtrl Editor " ) ) ;
menuTools2 - > Append ( ID_TESTREPLACE , wxT ( " Test ReplaceProperty " ) ) ;
menuTry - > Append ( ID_SELECTSTYLE , wxT ( " Set Window Style " ) ,
wxT ( " Select window style flags used by the grid. " ) ) ;
menuTry - > AppendSeparator ( ) ;
menuTry - > AppendRadioItem ( ID_COLOURSCHEME1 , wxT ( " Standard Colour Scheme " ) ) ;
menuTry - > AppendRadioItem ( ID_COLOURSCHEME2 , wxT ( " White Colour Scheme " ) ) ;
menuTry - > AppendRadioItem ( ID_COLOURSCHEME3 , wxT ( " .NET Colour Scheme " ) ) ;
menuTry - > AppendRadioItem ( ID_COLOURSCHEME4 , wxT ( " Cream Colour Scheme " ) ) ;
menuTry - > AppendSeparator ( ) ;
m_itemCatColours = menuTry - > AppendCheckItem ( ID_CATCOLOURS , wxT ( " Category Specific Colours " ) ,
wxT ( " Switches between category-specific cell colours and default scheme (actually done using SetPropertyTextColour and SetPropertyBackgroundColour). " ) ) ;
menuTry - > AppendSeparator ( ) ;
menuTry - > AppendCheckItem ( ID_STATICLAYOUT , wxT ( " Static Layout " ) ,
wxT ( " Switches between user-modifiedable and static layouts. " ) ) ;
menuTry - > Append ( ID_SETCOLUMNS , wxT ( " Set Number of Columns " ) ) ;
menuTry - > AppendSeparator ( ) ;
menuTry - > Append ( ID_TESTXRC , wxT ( " Display XRC sample " ) ) ;
menuTry - > AppendSeparator ( ) ;
menuTry - > Append ( ID_RUNTESTFULL , wxT ( " Run Tests (full) " ) ) ;
menuTry - > Append ( ID_RUNTESTPARTIAL , wxT ( " Run Tests (fast) " ) ) ;
menuFile - > Append ( ID_RUNMINIMAL , wxT ( " Run Minimal Sample " ) ) ;
menuFile - > AppendSeparator ( ) ;
menuFile - > Append ( ID_QUIT , wxT ( " E&xit \t Alt-X " ) , wxT ( " Quit this program " ) ) ;
// Now append the freshly created menu to the menu bar...
wxMenuBar * menuBar = new wxMenuBar ( ) ;
menuBar - > Append ( menuFile , wxT ( " &File " ) ) ;
menuBar - > Append ( menuTry , wxT ( " &Try These! " ) ) ;
menuBar - > Append ( menuTools1 , wxT ( " &Basic " ) ) ;
menuBar - > Append ( menuTools2 , wxT ( " &Advanced " ) ) ;
menuBar - > Append ( menuHelp , wxT ( " &Help " ) ) ;
// ... and attach this menu bar to the frame
SetMenuBar ( menuBar ) ;
# if wxUSE_STATUSBAR
// create a status bar
CreateStatusBar ( 1 ) ;
SetStatusText ( wxEmptyString ) ;
# endif // wxUSE_STATUSBAR
2008-10-16 17:31:46 +00:00
FinalizeFramePosition ( ) ;
}
2008-09-12 20:57:41 +00:00
2008-10-16 17:31:46 +00:00
void FormMain : : FinalizeFramePosition ( )
{
wxSize frameSize ( ( wxSystemSettings : : GetMetric ( wxSYS_SCREEN_X ) / 10 ) * 4 ,
( wxSystemSettings : : GetMetric ( wxSYS_SCREEN_Y ) / 10 ) * 8 ) ;
if ( frameSize . x > 500 )
frameSize . x = 500 ;
SetSize ( frameSize ) ;
2008-09-12 20:57:41 +00:00
Centre ( ) ;
}
//
// Normally, wxPropertyGrid does not check whether item with identical
// label already exists. However, since in this sample we use labels for
// identifying properties, we have to be sure not to generate identical
// labels.
//
void GenerateUniquePropertyLabel ( wxPropertyGridManager * pg , wxString & baselabel )
{
int count = - 1 ;
wxString newlabel ;
if ( pg - > GetPropertyByLabel ( baselabel ) )
{
for ( ; ; )
{
count + + ;
newlabel . Printf ( wxT ( " %s%i " ) , baselabel . c_str ( ) , count ) ;
if ( ! pg - > GetPropertyByLabel ( newlabel ) ) break ;
}
}
if ( count > = 0 )
{
baselabel = newlabel ;
}
}
// -----------------------------------------------------------------------
void FormMain : : OnInsertPropClick ( wxCommandEvent & WXUNUSED ( event ) )
{
wxString propLabel ;
2008-09-25 17:23:54 +00:00
if ( ! m_pPropGridManager - > GetGrid ( ) - > GetRoot ( ) - > GetChildCount ( ) )
2008-09-12 20:57:41 +00:00
{
wxMessageBox ( wxT ( " No items to relate - first add some with Append. " ) ) ;
return ;
}
wxPGProperty * id = m_pPropGridManager - > GetGrid ( ) - > GetSelection ( ) ;
if ( ! id )
{
wxMessageBox ( wxT ( " First select a property - new one will be inserted right before that. " ) ) ;
return ;
}
if ( propLabel . Len ( ) < 1 ) propLabel = wxT ( " Property " ) ;
GenerateUniquePropertyLabel ( m_pPropGridManager , propLabel ) ;
m_pPropGridManager - > Insert ( m_pPropGridManager - > GetPropertyParent ( id ) ,
2008-09-27 15:09:33 +00:00
id - > GetIndexInParent ( ) ,
new wxStringProperty ( propLabel ) ) ;
2008-09-12 20:57:41 +00:00
}
// -----------------------------------------------------------------------
void FormMain : : OnAppendPropClick ( wxCommandEvent & WXUNUSED ( event ) )
{
wxString propLabel ;
if ( propLabel . Len ( ) < 1 ) propLabel = wxT ( " Property " ) ;
GenerateUniquePropertyLabel ( m_pPropGridManager , propLabel ) ;
m_pPropGridManager - > Append ( new wxStringProperty ( propLabel ) ) ;
m_pPropGridManager - > Refresh ( ) ;
}
// -----------------------------------------------------------------------
void FormMain : : OnClearClick ( wxCommandEvent & WXUNUSED ( event ) )
{
m_pPropGridManager - > GetGrid ( ) - > Clear ( ) ;
}
// -----------------------------------------------------------------------
void FormMain : : OnAppendCatClick ( wxCommandEvent & WXUNUSED ( event ) )
{
wxString propLabel ;
if ( propLabel . Len ( ) < 1 ) propLabel = wxT ( " Category " ) ;
GenerateUniquePropertyLabel ( m_pPropGridManager , propLabel ) ;
m_pPropGridManager - > Append ( new wxPropertyCategory ( propLabel ) ) ;
m_pPropGridManager - > Refresh ( ) ;
}
// -----------------------------------------------------------------------
void FormMain : : OnInsertCatClick ( wxCommandEvent & WXUNUSED ( event ) )
{
wxString propLabel ;
2008-09-25 17:23:54 +00:00
if ( ! m_pPropGridManager - > GetGrid ( ) - > GetRoot ( ) - > GetChildCount ( ) )
2008-09-12 20:57:41 +00:00
{
wxMessageBox ( wxT ( " No items to relate - first add some with Append. " ) ) ;
return ;
}
wxPGProperty * id = m_pPropGridManager - > GetGrid ( ) - > GetSelection ( ) ;
if ( ! id )
{
wxMessageBox ( wxT ( " First select a property - new one will be inserted right before that. " ) ) ;
return ;
}
if ( propLabel . Len ( ) < 1 ) propLabel = wxT ( " Category " ) ;
GenerateUniquePropertyLabel ( m_pPropGridManager , propLabel ) ;
m_pPropGridManager - > Insert ( m_pPropGridManager - > GetPropertyParent ( id ) ,
2008-09-27 15:09:33 +00:00
id - > GetIndexInParent ( ) ,
new wxPropertyCategory ( propLabel ) ) ;
2008-09-12 20:57:41 +00:00
}
// -----------------------------------------------------------------------
void FormMain : : OnDelPropClick ( wxCommandEvent & WXUNUSED ( event ) )
{
wxPGProperty * id = m_pPropGridManager - > GetGrid ( ) - > GetSelection ( ) ;
if ( ! id )
{
wxMessageBox ( wxT ( " First select a property. " ) ) ;
return ;
}
m_pPropGridManager - > DeleteProperty ( id ) ;
}
// -----------------------------------------------------------------------
void FormMain : : OnDelPropRClick ( wxCommandEvent & WXUNUSED ( event ) )
{
// Delete random property
wxPGProperty * p = m_pPropGridManager - > GetGrid ( ) - > GetRoot ( ) ;
for ( ; ; )
{
if ( ! p - > IsCategory ( ) )
{
m_pPropGridManager - > DeleteProperty ( p ) ;
break ;
}
if ( ! p - > GetChildCount ( ) )
break ;
int n = rand ( ) % ( ( int ) p - > GetChildCount ( ) ) ;
p = p - > Item ( n ) ;
}
}
// -----------------------------------------------------------------------
2009-07-03 12:48:44 +00:00
void FormMain : : OnContextMenu ( wxContextMenuEvent & WXUNUSED ( event ) )
2008-09-12 20:57:41 +00:00
{
wxLogDebug ( wxT ( " FormMain::OnContextMenu(%i,%i) " ) ,
event . GetPosition ( ) . x , event . GetPosition ( ) . y ) ;
//event.Skip();
}
// -----------------------------------------------------------------------
void FormMain : : OnCloseClick ( wxCommandEvent & WXUNUSED ( event ) )
{
/*#ifdef __WXDEBUG__
m_pPropGridManager - > GetGrid ( ) - > DumpAllocatedChoiceSets ( ) ;
wxLogDebug ( wxT ( " \\ -> Don't worry, this is perfectly normal in this sample. " ) ) ;
# endif* /
Close ( false ) ;
}
// -----------------------------------------------------------------------
int IterateMessage ( wxPGProperty * prop )
{
wxString s ;
s . Printf ( wxT ( " \" %s \" class = %s, valuetype = %s " ) , prop - > GetLabel ( ) . c_str ( ) ,
prop - > GetClassInfo ( ) - > GetClassName ( ) , prop - > GetValueType ( ) . c_str ( ) ) ;
return wxMessageBox ( s , wxT ( " Iterating... (press CANCEL to end) " ), wxOK|wxCANCEL ) ;
}
// -----------------------------------------------------------------------
void FormMain : : OnIterate1Click ( wxCommandEvent & WXUNUSED ( event ) )
{
wxPropertyGridIterator it ;
for ( it = m_pPropGridManager - > GetCurrentPage ( ) - >
GetIterator ( ) ;
! it . AtEnd ( ) ;
it + + )
{
wxPGProperty * p = * it ;
int res = IterateMessage ( p ) ;
if ( res = = wxCANCEL ) break ;
}
}
// -----------------------------------------------------------------------
void FormMain : : OnIterate2Click ( wxCommandEvent & WXUNUSED ( event ) )
{
wxPropertyGridIterator it ;
for ( it = m_pPropGridManager - > GetCurrentPage ( ) - >
GetIterator ( wxPG_ITERATE_VISIBLE ) ;
! it . AtEnd ( ) ;
it + + )
{
wxPGProperty * p = * it ;
int res = IterateMessage ( p ) ;
if ( res = = wxCANCEL ) break ;
}
}
// -----------------------------------------------------------------------
void FormMain : : OnIterate3Click ( wxCommandEvent & WXUNUSED ( event ) )
{
// iterate over items in reverse order
wxPropertyGridIterator it ;
for ( it = m_pPropGridManager - > GetCurrentPage ( ) - >
GetIterator ( wxPG_ITERATE_DEFAULT , wxBOTTOM ) ;
! it . AtEnd ( ) ;
it - - )
{
wxPGProperty * p = * it ;
int res = IterateMessage ( p ) ;
if ( res = = wxCANCEL ) break ;
}
}
// -----------------------------------------------------------------------
void FormMain : : OnIterate4Click ( wxCommandEvent & WXUNUSED ( event ) )
{
wxPropertyGridIterator it ;
for ( it = m_pPropGridManager - > GetCurrentPage ( ) - >
GetIterator ( wxPG_ITERATE_CATEGORIES ) ;
! it . AtEnd ( ) ;
it + + )
{
wxPGProperty * p = * it ;
int res = IterateMessage ( p ) ;
if ( res = = wxCANCEL ) break ;
}
}
// -----------------------------------------------------------------------
void FormMain : : OnFitColumnsClick ( wxCommandEvent & WXUNUSED ( event ) )
{
wxPropertyGridPage * page = m_pPropGridManager - > GetCurrentPage ( ) ;
// Remove auto-centering
m_pPropGridManager - > SetWindowStyle ( m_pPropGridManager - > GetWindowStyle ( ) & ~ wxPG_SPLITTER_AUTO_CENTER ) ;
// Grow manager size just prior fit - otherwise
// column information may be lost.
wxSize oldGridSize = m_pPropGridManager - > GetGrid ( ) - > GetClientSize ( ) ;
wxSize oldFullSize = GetSize ( ) ;
SetSize ( 1000 , oldFullSize . y ) ;
wxSize newSz = page - > FitColumns ( ) ;
int dx = oldFullSize . x - oldGridSize . x ;
int dy = oldFullSize . y - oldGridSize . y ;
newSz . x + = dx ;
newSz . y + = dy ;
SetSize ( newSz ) ;
}
// -----------------------------------------------------------------------
void FormMain : : OnChangeFlagsPropItemsClick ( wxCommandEvent & WXUNUSED ( event ) )
{
2008-09-19 16:57:33 +00:00
wxPGProperty * p = m_pPropGridManager - > GetPropertyByName ( wxT ( " Window Styles " ) ) ;
2008-09-12 20:57:41 +00:00
wxPGChoices newChoices ;
newChoices . Add ( wxT ( " Fast " ) , 0x1 ) ;
newChoices . Add ( wxT ( " Powerful " ) , 0x2 ) ;
newChoices . Add ( wxT ( " Safe " ) , 0x4 ) ;
newChoices . Add ( wxT ( " Sleek " ) , 0x8 ) ;
2008-09-19 16:57:33 +00:00
p - > SetChoices ( newChoices ) ;
2008-09-12 20:57:41 +00:00
}
// -----------------------------------------------------------------------
void FormMain : : OnEnableDisable ( wxCommandEvent & )
{
wxPGProperty * id = m_pPropGridManager - > GetGrid ( ) - > GetSelection ( ) ;
if ( ! id )
{
wxMessageBox ( wxT ( " First select a property. " ) ) ;
return ;
}
if ( m_pPropGridManager - > IsPropertyEnabled ( id ) )
{
m_pPropGridManager - > DisableProperty ( id ) ;
m_itemEnable - > SetItemLabel ( wxT ( " Enable " ) ) ;
}
else
{
m_pPropGridManager - > EnableProperty ( id ) ;
m_itemEnable - > SetItemLabel ( wxT ( " Disable " ) ) ;
}
}
// -----------------------------------------------------------------------
void FormMain : : OnHideShow ( wxCommandEvent & WXUNUSED ( event ) )
{
wxPGProperty * id = m_pPropGridManager - > GetGrid ( ) - > GetSelection ( ) ;
if ( ! id )
{
wxMessageBox ( wxT ( " First select a property. " ) ) ;
return ;
}
if ( m_pPropGridManager - > IsPropertyShown ( id ) )
{
m_pPropGridManager - > HideProperty ( id , true ) ;
m_itemEnable - > SetItemLabel ( wxT ( " Show " ) ) ;
}
else
{
m_pPropGridManager - > HideProperty ( id , false ) ;
m_itemEnable - > SetItemLabel ( wxT ( " Hide " ) ) ;
}
wxPropertyGridPage * curPage = m_pPropGridManager - > GetCurrentPage ( ) ;
// Check for bottomY precalculation validity
unsigned int byPre = curPage - > GetVirtualHeight ( ) ;
unsigned int byAct = curPage - > GetActualVirtualHeight ( ) ;
if ( byPre ! = byAct )
{
wxLogDebug ( wxT ( " VirtualHeight is %u, should be %u " ) , byPre , byAct ) ;
}
}
// -----------------------------------------------------------------------
2008-10-31 18:53:37 +00:00
# include "wx/colordlg.h"
void
FormMain : : OnSetBackgroundColour ( wxCommandEvent & event )
{
wxPropertyGrid * pg = m_pPropGridManager - > GetGrid ( ) ;
wxPGProperty * prop = pg - > GetSelection ( ) ;
if ( ! prop )
{
wxMessageBox ( wxT ( " First select a property. " ) ) ;
return ;
}
wxColour col = : : wxGetColourFromUser ( this , * wxWHITE , " Choose colour " ) ;
if ( col . IsOk ( ) )
{
bool recursively = ( event . GetId ( ) = = ID_SETBGCOLOURRECUR ) ? true : false ;
pg - > SetPropertyBackgroundColour ( prop , col , recursively ) ;
}
}
// -----------------------------------------------------------------------
2008-09-12 20:57:41 +00:00
void FormMain : : OnInsertPage ( wxCommandEvent & WXUNUSED ( event ) )
{
m_pPropGridManager - > AddPage ( wxT ( " New Page " ) ) ;
}
// -----------------------------------------------------------------------
void FormMain : : OnRemovePage ( wxCommandEvent & WXUNUSED ( event ) )
{
m_pPropGridManager - > RemovePage ( m_pPropGridManager - > GetSelectedPage ( ) ) ;
}
// -----------------------------------------------------------------------
void FormMain : : OnSaveState ( wxCommandEvent & WXUNUSED ( event ) )
{
m_savedState = m_pPropGridManager - > SaveEditableState ( ) ;
wxLogDebug ( wxT ( " Saved editable state string: \" %s \" " ) , m_savedState . c_str ( ) ) ;
}
// -----------------------------------------------------------------------
void FormMain : : OnRestoreState ( wxCommandEvent & WXUNUSED ( event ) )
{
m_pPropGridManager - > RestoreEditableState ( m_savedState ) ;
}
// -----------------------------------------------------------------------
void FormMain : : OnSetSpinCtrlEditorClick ( wxCommandEvent & WXUNUSED ( event ) )
{
# if wxUSE_SPINBTN
2008-09-25 17:11:02 +00:00
wxPGProperty * pgId = m_pPropGridManager - > GetSelection ( ) ;
2008-09-12 20:57:41 +00:00
if ( pgId )
2008-10-05 14:23:28 +00:00
m_pPropGridManager - > SetPropertyEditor ( pgId , wxPGEditor_SpinCtrl ) ;
2008-09-12 20:57:41 +00:00
else
wxMessageBox ( wxT ( " First select a property " ) ) ;
# endif
}
// -----------------------------------------------------------------------
void FormMain : : OnTestReplaceClick ( wxCommandEvent & WXUNUSED ( event ) )
{
2008-09-25 17:11:02 +00:00
wxPGProperty * pgId = m_pPropGridManager - > GetSelection ( ) ;
2008-09-12 20:57:41 +00:00
if ( pgId )
{
wxPGChoices choices ;
choices . Add ( wxT ( " Flag 0 " ) , 0x0001 ) ;
choices . Add ( wxT ( " Flag 1 " ) , 0x0002 ) ;
choices . Add ( wxT ( " Flag 2 " ) , 0x0004 ) ;
choices . Add ( wxT ( " Flag 3 " ) , 0x0008 ) ;
wxPGProperty * newId = m_pPropGridManager - > ReplaceProperty ( pgId ,
new wxFlagsProperty ( wxT ( " ReplaceFlagsProperty " ) , wxPG_LABEL , choices , 0x0003 ) ) ;
m_pPropGridManager - > SetPropertyAttribute ( newId ,
wxPG_BOOL_USE_CHECKBOX ,
true ,
wxPG_RECURSE ) ;
}
else
wxMessageBox ( wxT ( " First select a property " ) ) ;
}
// -----------------------------------------------------------------------
void FormMain : : OnClearModifyStatusClick ( wxCommandEvent & WXUNUSED ( event ) )
{
m_pPropGridManager - > ClearModifiedStatus ( ) ;
}
// -----------------------------------------------------------------------
// Freeze check-box checked?
void FormMain : : OnFreezeClick ( wxCommandEvent & event )
{
if ( ! m_pPropGridManager ) return ;
if ( event . IsChecked ( ) )
{
if ( ! m_pPropGridManager - > IsFrozen ( ) )
{
m_pPropGridManager - > Freeze ( ) ;
}
}
else
{
if ( m_pPropGridManager - > IsFrozen ( ) )
{
m_pPropGridManager - > Thaw ( ) ;
m_pPropGridManager - > Refresh ( ) ;
}
}
}
// -----------------------------------------------------------------------
void FormMain : : OnAbout ( wxCommandEvent & WXUNUSED ( event ) )
{
wxString msg ;
msg . Printf ( wxT ( " wxPropertyGrid Sample " )
# if wxUSE_UNICODE
# if defined(wxUSE_UNICODE_UTF8) && wxUSE_UNICODE_UTF8
wxT ( " <utf-8> " )
# else
wxT ( " <unicode> " )
# endif
# else
wxT ( " <ansi> " )
# endif
# ifdef __WXDEBUG__
wxT ( " <debug> " )
# else
wxT ( " <release> " )
# endif
wxT ( " \n \n " )
wxT ( " Programmed by %s \n \n " )
wxT ( " Using %s \n \n " ) ,
wxT ( " Jaakko Salli " ) , wxVERSION_STRING
) ;
wxMessageBox ( msg , _T ( " About " ) , wxOK | wxICON_INFORMATION , this ) ;
}
// -----------------------------------------------------------------------
void FormMain : : OnColourScheme ( wxCommandEvent & event )
{
int id = event . GetId ( ) ;
if ( id = = ID_COLOURSCHEME1 )
{
m_pPropGridManager - > GetGrid ( ) - > ResetColours ( ) ;
}
else if ( id = = ID_COLOURSCHEME2 )
{
// white
wxColour my_grey_1 ( 212 , 208 , 200 ) ;
wxColour my_grey_3 ( 113 , 111 , 100 ) ;
m_pPropGridManager - > Freeze ( ) ;
m_pPropGridManager - > GetGrid ( ) - > SetMarginColour ( * wxWHITE ) ;
m_pPropGridManager - > GetGrid ( ) - > SetCaptionBackgroundColour ( * wxWHITE ) ;
m_pPropGridManager - > GetGrid ( ) - > SetCellBackgroundColour ( * wxWHITE ) ;
m_pPropGridManager - > GetGrid ( ) - > SetCellTextColour ( my_grey_3 ) ;
m_pPropGridManager - > GetGrid ( ) - > SetLineColour ( my_grey_1 ) ; //wxColour(160,160,160)
m_pPropGridManager - > Thaw ( ) ;
}
else if ( id = = ID_COLOURSCHEME3 )
{
// .NET
wxColour my_grey_1 ( 212 , 208 , 200 ) ;
wxColour my_grey_2 ( 236 , 233 , 216 ) ;
m_pPropGridManager - > Freeze ( ) ;
m_pPropGridManager - > GetGrid ( ) - > SetMarginColour ( my_grey_1 ) ;
m_pPropGridManager - > GetGrid ( ) - > SetCaptionBackgroundColour ( my_grey_1 ) ;
m_pPropGridManager - > GetGrid ( ) - > SetLineColour ( my_grey_1 ) ;
m_pPropGridManager - > Thaw ( ) ;
}
else if ( id = = ID_COLOURSCHEME4 )
{
// cream
wxColour my_grey_1 ( 212 , 208 , 200 ) ;
wxColour my_grey_2 ( 241 , 239 , 226 ) ;
wxColour my_grey_3 ( 113 , 111 , 100 ) ;
m_pPropGridManager - > Freeze ( ) ;
m_pPropGridManager - > GetGrid ( ) - > SetMarginColour ( * wxWHITE ) ;
m_pPropGridManager - > GetGrid ( ) - > SetCaptionBackgroundColour ( * wxWHITE ) ;
m_pPropGridManager - > GetGrid ( ) - > SetCellBackgroundColour ( my_grey_2 ) ;
m_pPropGridManager - > GetGrid ( ) - > SetCellBackgroundColour ( my_grey_2 ) ;
m_pPropGridManager - > GetGrid ( ) - > SetCellTextColour ( my_grey_3 ) ;
m_pPropGridManager - > GetGrid ( ) - > SetLineColour ( my_grey_1 ) ;
m_pPropGridManager - > Thaw ( ) ;
}
}
// -----------------------------------------------------------------------
void FormMain : : OnCatColours ( wxCommandEvent & event )
{
wxPropertyGrid * pg = m_pPropGridManager - > GetGrid ( ) ;
m_pPropGridManager - > Freeze ( ) ;
if ( event . IsChecked ( ) )
{
// Set custom colours.
pg - > SetPropertyTextColour ( wxT ( " Appearance " ) , wxColour ( 255 , 0 , 0 ) , false ) ;
pg - > SetPropertyBackgroundColour ( wxT ( " Appearance " ) , wxColour ( 255 , 255 , 183 ) ) ;
pg - > SetPropertyTextColour ( wxT ( " Appearance " ) , wxColour ( 255 , 0 , 183 ) ) ;
pg - > SetPropertyTextColour ( wxT ( " PositionCategory " ) , wxColour ( 0 , 255 , 0 ) , false ) ;
pg - > SetPropertyBackgroundColour ( wxT ( " PositionCategory " ) , wxColour ( 255 , 226 , 190 ) ) ;
pg - > SetPropertyTextColour ( wxT ( " PositionCategory " ) , wxColour ( 255 , 0 , 190 ) ) ;
pg - > SetPropertyTextColour ( wxT ( " Environment " ) , wxColour ( 0 , 0 , 255 ) , false ) ;
pg - > SetPropertyBackgroundColour ( wxT ( " Environment " ) , wxColour ( 208 , 240 , 175 ) ) ;
pg - > SetPropertyTextColour ( wxT ( " Environment " ) , wxColour ( 255 , 255 , 255 ) ) ;
pg - > SetPropertyBackgroundColour ( wxT ( " More Examples " ) , wxColour ( 172 , 237 , 255 ) ) ;
pg - > SetPropertyTextColour ( wxT ( " More Examples " ) , wxColour ( 172 , 0 , 255 ) ) ;
}
else
{
// Revert to original.
pg - > SetPropertyColoursToDefault ( wxT ( " Appearance " ) ) ;
pg - > SetPropertyColoursToDefault ( wxT ( " PositionCategory " ) ) ;
pg - > SetPropertyColoursToDefault ( wxT ( " Environment " ) ) ;
pg - > SetPropertyColoursToDefault ( wxT ( " More Examples " ) ) ;
}
m_pPropGridManager - > Thaw ( ) ;
m_pPropGridManager - > Refresh ( ) ;
}
// -----------------------------------------------------------------------
# define ADD_FLAG(FLAG) \
chs . Add ( wxT ( # FLAG ) ) ; \
vls . Add ( FLAG ) ; \
if ( ( flags & FLAG ) = = FLAG ) sel . Add ( ind ) ; \
ind + + ;
void FormMain : : OnSelectStyle ( wxCommandEvent & WXUNUSED ( event ) )
{
int style ;
int extraStyle ;
{
wxArrayString chs ;
wxArrayInt vls ;
wxArrayInt sel ;
unsigned int ind = 0 ;
int flags = m_pPropGridManager - > GetWindowStyle ( ) ;
ADD_FLAG ( wxPG_HIDE_CATEGORIES )
ADD_FLAG ( wxPG_AUTO_SORT )
ADD_FLAG ( wxPG_BOLD_MODIFIED )
ADD_FLAG ( wxPG_SPLITTER_AUTO_CENTER )
ADD_FLAG ( wxPG_TOOLTIPS )
ADD_FLAG ( wxPG_STATIC_SPLITTER )
ADD_FLAG ( wxPG_HIDE_MARGIN )
ADD_FLAG ( wxPG_LIMITED_EDITING )
ADD_FLAG ( wxPG_TOOLBAR )
ADD_FLAG ( wxPG_DESCRIPTION )
wxMultiChoiceDialog dlg ( this , wxT ( " Select window styles to use " ) ,
wxT ( " wxPropertyGrid Window Style " ) , chs ) ;
dlg . SetSelections ( sel ) ;
if ( dlg . ShowModal ( ) = = wxID_CANCEL )
return ;
flags = 0 ;
sel = dlg . GetSelections ( ) ;
for ( ind = 0 ; ind < sel . size ( ) ; ind + + )
flags | = vls [ sel [ ind ] ] ;
style = flags ;
}
{
wxArrayString chs ;
wxArrayInt vls ;
wxArrayInt sel ;
unsigned int ind = 0 ;
int flags = m_pPropGridManager - > GetExtraStyle ( ) ;
ADD_FLAG ( wxPG_EX_INIT_NOCAT )
ADD_FLAG ( wxPG_EX_NO_FLAT_TOOLBAR )
ADD_FLAG ( wxPG_EX_MODE_BUTTONS )
ADD_FLAG ( wxPG_EX_HELP_AS_TOOLTIPS )
ADD_FLAG ( wxPG_EX_NATIVE_DOUBLE_BUFFERING )
ADD_FLAG ( wxPG_EX_AUTO_UNSPECIFIED_VALUES )
ADD_FLAG ( wxPG_EX_WRITEONLY_BUILTIN_ATTRIBUTES )
wxMultiChoiceDialog dlg ( this , wxT ( " Select extra window styles to use " ) ,
wxT ( " wxPropertyGrid Extra Style " ) , chs ) ;
dlg . SetSelections ( sel ) ;
if ( dlg . ShowModal ( ) = = wxID_CANCEL )
return ;
flags = 0 ;
sel = dlg . GetSelections ( ) ;
for ( ind = 0 ; ind < sel . size ( ) ; ind + + )
flags | = vls [ sel [ ind ] ] ;
extraStyle = flags ;
}
CreateGrid ( style , extraStyle ) ;
2008-10-16 17:31:46 +00:00
FinalizeFramePosition ( ) ;
2008-09-12 20:57:41 +00:00
}
// -----------------------------------------------------------------------
void FormMain : : OnSetColumns ( wxCommandEvent & WXUNUSED ( event ) )
{
long colCount = : : wxGetNumberFromUser ( wxT ( " Enter number of columns (2-20). " ) , wxT ( " Columns: " ) ,
wxT ( " Change Columns " ) , m_pPropGridManager - > GetColumnCount ( ) ,
2 , 20 ) ;
if ( colCount > = 2 )
{
m_pPropGridManager - > SetColumnCount ( colCount ) ;
}
}
// -----------------------------------------------------------------------
void FormMain : : OnSetPropertyValue ( wxCommandEvent & WXUNUSED ( event ) )
{
wxPropertyGrid * pg = m_pPropGridManager - > GetGrid ( ) ;
wxPGProperty * selected = pg - > GetSelection ( ) ;
if ( selected )
{
wxString value = : : wxGetTextFromUser ( wxT ( " Enter new value: " ) ) ;
pg - > SetPropertyValue ( selected , value ) ;
}
}
// -----------------------------------------------------------------------
void FormMain : : OnInsertChoice ( wxCommandEvent & WXUNUSED ( event ) )
{
wxPropertyGrid * pg = m_pPropGridManager - > GetGrid ( ) ;
wxPGProperty * selected = pg - > GetSelection ( ) ;
2008-09-19 16:57:33 +00:00
const wxPGChoices & choices = selected - > GetChoices ( ) ;
2008-09-12 20:57:41 +00:00
// Insert new choice to the center of list
if ( choices . IsOk ( ) )
{
int pos = choices . GetCount ( ) / 2 ;
2008-09-19 16:57:33 +00:00
selected - > InsertChoice ( wxT ( " New Choice " ) , pos ) ;
2008-09-12 20:57:41 +00:00
}
else
{
: : wxMessageBox ( wxT ( " First select a property with some choices. " ) ) ;
}
}
// -----------------------------------------------------------------------
void FormMain : : OnDeleteChoice ( wxCommandEvent & WXUNUSED ( event ) )
{
wxPropertyGrid * pg = m_pPropGridManager - > GetGrid ( ) ;
wxPGProperty * selected = pg - > GetSelection ( ) ;
2008-09-19 16:57:33 +00:00
const wxPGChoices & choices = selected - > GetChoices ( ) ;
2008-09-12 20:57:41 +00:00
// Deletes choice from the center of list
if ( choices . IsOk ( ) )
{
int pos = choices . GetCount ( ) / 2 ;
2008-09-19 16:57:33 +00:00
selected - > DeleteChoice ( pos ) ;
2008-09-12 20:57:41 +00:00
}
else
{
: : wxMessageBox ( wxT ( " First select a property with some choices. " ) ) ;
}
}
// -----------------------------------------------------------------------
# include <wx/colordlg.h>
void FormMain : : OnMisc ( wxCommandEvent & event )
{
int id = event . GetId ( ) ;
if ( id = = ID_STATICLAYOUT )
{
long wsf = m_pPropGridManager - > GetWindowStyleFlag ( ) ;
if ( event . IsChecked ( ) ) m_pPropGridManager - > SetWindowStyleFlag ( wsf | wxPG_STATIC_LAYOUT ) ;
else m_pPropGridManager - > SetWindowStyleFlag ( wsf & ~ ( wxPG_STATIC_LAYOUT ) ) ;
}
else if ( id = = ID_COLLAPSEALL )
{
wxPGVIterator it ;
wxPropertyGrid * pg = m_pPropGridManager - > GetGrid ( ) ;
for ( it = pg - > GetVIterator ( wxPG_ITERATE_ALL ) ; ! it . AtEnd ( ) ; it . Next ( ) )
it . GetProperty ( ) - > SetExpanded ( false ) ;
pg - > RefreshGrid ( ) ;
}
else if ( id = = ID_GETVALUES )
{
m_storedValues = m_pPropGridManager - > GetGrid ( ) - > GetPropertyValues ( wxT ( " Test " ) ,
m_pPropGridManager - > GetGrid ( ) - > GetRoot ( ) ,
wxPG_KEEP_STRUCTURE | wxPG_INC_ATTRIBUTES ) ;
}
else if ( id = = ID_SETVALUES )
{
if ( m_storedValues . GetType ( ) = = wxT ( " list " ) )
{
m_pPropGridManager - > GetGrid ( ) - > SetPropertyValues ( m_storedValues ) ;
}
else
wxMessageBox ( wxT ( " First use Get Property Values. " ) ) ;
}
else if ( id = = ID_SETVALUES2 )
{
wxVariant list ;
list . NullList ( ) ;
list . Append ( wxVariant ( ( long ) 1234 , wxT ( " VariantLong " ) ) ) ;
list . Append ( wxVariant ( ( bool ) TRUE , wxT ( " VariantBool " ) ) ) ;
list . Append ( wxVariant ( wxT ( " Test Text " ) , wxT ( " VariantString " ) ) ) ;
m_pPropGridManager - > GetGrid ( ) - > SetPropertyValues ( list ) ;
}
else if ( id = = ID_COLLAPSE )
{
// Collapses selected.
2008-09-25 17:11:02 +00:00
wxPGProperty * id = m_pPropGridManager - > GetSelection ( ) ;
2008-09-12 20:57:41 +00:00
if ( id )
{
m_pPropGridManager - > Collapse ( id ) ;
}
}
else if ( id = = ID_RUNTESTFULL )
{
// Runs a regression test.
RunTests ( true ) ;
}
else if ( id = = ID_RUNTESTPARTIAL )
{
// Runs a regression test.
RunTests ( false ) ;
}
else if ( id = = ID_UNSPECIFY )
{
2008-09-25 17:11:02 +00:00
wxPGProperty * prop = m_pPropGridManager - > GetSelection ( ) ;
2008-09-12 20:57:41 +00:00
if ( prop )
{
m_pPropGridManager - > SetPropertyValueUnspecified ( prop ) ;
2009-01-04 10:37:22 +00:00
prop - > RefreshEditor ( ) ;
2008-09-12 20:57:41 +00:00
}
}
}
// -----------------------------------------------------------------------
void FormMain : : OnPopulateClick ( wxCommandEvent & event )
{
int id = event . GetId ( ) ;
m_propGrid - > Clear ( ) ;
m_propGrid - > Freeze ( ) ;
if ( id = = ID_POPULATE1 )
{
PopulateWithStandardItems ( ) ;
}
else if ( id = = ID_POPULATE2 )
{
PopulateWithLibraryConfig ( ) ;
}
m_propGrid - > Thaw ( ) ;
}
// -----------------------------------------------------------------------
void DisplayMinimalFrame ( wxWindow * parent ) ; // in minimal.cpp
void FormMain : : OnRunMinimalClick ( wxCommandEvent & WXUNUSED ( event ) )
{
DisplayMinimalFrame ( this ) ;
}
// -----------------------------------------------------------------------
FormMain : : ~ FormMain ( )
{
}
// -----------------------------------------------------------------------
IMPLEMENT_APP ( cxApplication )
bool cxApplication : : OnInit ( )
{
//wxLocale Locale;
//Locale.Init(wxLANGUAGE_FINNISH);
FormMain * frame = Form1 = new FormMain ( wxT ( " wxPropertyGrid Sample " ) , wxPoint ( 0 , 0 ) , wxSize ( 300 , 500 ) ) ;
frame - > Show ( true ) ;
//
// Parse command-line
wxApp & app = wxGetApp ( ) ;
if ( app . argc > 1 )
{
wxString s = app . argv [ 1 ] ;
if ( s = = wxT ( " --run-tests " ) )
{
//
// Run tests
bool testResult = frame - > RunTests ( true ) ;
if ( testResult )
return false ;
}
}
return true ;
}
// -----------------------------------------------------------------------
void FormMain : : OnIdle ( wxIdleEvent & event )
{
/*
// This code is useful for debugging focus problems
static wxWindow * last_focus = ( wxWindow * ) NULL ;
wxWindow * cur_focus = : : wxWindow : : FindFocus ( ) ;
if ( cur_focus ! = last_focus )
{
const wxChar * class_name = wxT ( " <none> " ) ;
if ( cur_focus )
class_name = cur_focus - > GetClassInfo ( ) - > GetClassName ( ) ;
last_focus = cur_focus ;
wxLogDebug ( wxT ( " FOCUSED: %s %X " ) ,
class_name ,
( unsigned int ) cur_focus ) ;
}
*/
event . Skip ( ) ;
}
// -----------------------------------------------------------------------