]> git.saurik.com Git - wxWidgets.git/blob - samples/propgrid/propgrid.cpp
5dd2dac49df8d33f3de103726ee54b0ecadb36be
[wxWidgets.git] / samples / propgrid / propgrid.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: samples/propgrid/propgrid.cpp
3 // Purpose: wxPropertyGrid sample
4 // Author: Jaakko Salli
5 // Modified by:
6 // Created: 2004-09-25
7 // RCS-ID: $Id:
8 // Copyright: (c) Jaakko Salli
9 // Licence: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
11
12 //
13 //
14 // NOTES
15 //
16 // * Examples of custom property classes are in sampleprops.cpp.
17 //
18 // * Additional ones can be found below.
19 //
20 // * Currently there is no example of a custom property editor. However,
21 // SpinCtrl editor sample is well-commented. It can be found in
22 // contrib/src/propgrid/advprops.cpp.
23 //
24 // * To find code that populates the grid with properties, search for
25 // string "::Populate".
26 //
27 // * To find code that handles property grid changes, search for string
28 // "::OnPropertyGridChange".
29 //
30 // * At the end of file there is example code for using the owner-drawn combo
31 // box independently outside the wxPropertyGrid.
32 //
33 //
34
35 // For compilers that support precompilation, includes "wx/wx.h".
36 #include "wx/wxprec.h"
37
38 #ifdef __BORLANDC__
39 #pragma hdrstop
40 #endif
41
42 // for all others, include the necessary headers (this file is usually all you
43 // need because it includes almost all "standard" wxWidgets headers)
44 #ifndef WX_PRECOMP
45 #include "wx/wx.h"
46 #endif
47
48 #include <wx/numdlg.h>
49
50 // -----------------------------------------------------------------------
51
52
53 // Main propertygrid header.
54 #include <wx/propgrid/propgrid.h>
55
56 // Extra property classes.
57 #include <wx/propgrid/advprops.h>
58
59 // This defines wxPropertyGridManager.
60 #include <wx/propgrid/manager.h>
61
62 #include "propgrid.h"
63 #include "sampleprops.h"
64
65 #if wxUSE_DATEPICKCTRL
66 #include <wx/datectrl.h>
67 #endif
68
69 #include <wx/artprov.h>
70
71
72 // -----------------------------------------------------------------------
73 // wxSampleMultiButtonEditor
74 // A sample editor class that has multiple buttons.
75 // -----------------------------------------------------------------------
76
77 class wxSampleMultiButtonEditor : public wxPGTextCtrlEditor
78 {
79 WX_PG_DECLARE_EDITOR_CLASS(wxSampleMultiButtonEditor)
80 public:
81 wxSampleMultiButtonEditor() {}
82 virtual ~wxSampleMultiButtonEditor() {}
83
84 wxPG_DECLARE_CREATECONTROLS
85 virtual bool OnEvent( wxPropertyGrid* propGrid,
86 wxPGProperty* property,
87 wxWindow* ctrl,
88 wxEvent& event ) const;
89
90 };
91
92 WX_PG_IMPLEMENT_EDITOR_CLASS(SampleMultiButtonEditor,wxSampleMultiButtonEditor,
93 wxPGTextCtrlEditor)
94
95
96 wxPGWindowList wxSampleMultiButtonEditor::CreateControls( wxPropertyGrid* propGrid,
97 wxPGProperty* property,
98 const wxPoint& pos,
99 const wxSize& sz ) const
100 {
101 // Create and populate buttons-subwindow
102 wxPGMultiButton* buttons = new wxPGMultiButton( propGrid, sz );
103
104 buttons->Add( "..." );
105 buttons->Add( "A" );
106 #if wxUSE_BMPBUTTON
107 buttons->Add( wxArtProvider::GetBitmap(wxART_FOLDER) );
108 #endif
109
110 // Create the 'primary' editor control (textctrl in this case)
111 wxPGWindowList wndList = wxPGTextCtrlEditor::CreateControls
112 ( propGrid, property, pos, buttons->GetPrimarySize() );
113
114 // Finally, move buttons-subwindow to correct position and make sure
115 // returned wxPGWindowList contains our custom button list.
116 buttons->FinalizePosition(pos);
117
118 wndList.SetSecondary( buttons );
119 return wndList;
120 }
121
122 bool wxSampleMultiButtonEditor::OnEvent( wxPropertyGrid* propGrid,
123 wxPGProperty* property,
124 wxWindow* ctrl,
125 wxEvent& event ) const
126 {
127 if ( event.GetEventType() == wxEVT_COMMAND_BUTTON_CLICKED )
128 {
129 wxPGMultiButton* buttons = (wxPGMultiButton*) propGrid->GetEditorControlSecondary();
130
131 if ( event.GetId() == buttons->GetButtonId(1) )
132 {
133 wxMessageBox(wxT("Second button was pressed"));
134 return true;
135 }
136 if ( event.GetId() == buttons->GetButtonId(2) )
137 {
138 wxMessageBox(wxT("Third button was pressed"));
139 return true;
140 }
141 }
142 return wxPGTextCtrlEditor::OnEvent(propGrid, property, ctrl, event);
143 }
144
145 // -----------------------------------------------------------------------
146 // Validator for wxValidator use sample
147 // -----------------------------------------------------------------------
148
149 #if wxUSE_VALIDATORS
150
151 // wxValidator for testing
152
153 class wxInvalidWordValidator : public wxValidator
154 {
155 public:
156
157 wxInvalidWordValidator( const wxString& invalidWord )
158 : wxValidator(), m_invalidWord(invalidWord)
159 {
160 }
161
162 virtual wxObject* Clone() const
163 {
164 return new wxInvalidWordValidator(m_invalidWord);
165 }
166
167 virtual bool Validate(wxWindow* WXUNUSED(parent))
168 {
169 wxTextCtrl* tc = wxDynamicCast(GetWindow(), wxTextCtrl);
170 wxCHECK_MSG(tc, true, wxT("validator window must be wxTextCtrl"));
171
172 wxString val = tc->GetValue();
173
174 if ( val.find(m_invalidWord) == wxString::npos )
175 return true;
176
177 ::wxMessageBox(wxString::Format(wxT("%s is not allowed word"),m_invalidWord.c_str()),
178 wxT("Validation Failure"));
179
180 return false;
181 }
182
183 private:
184 wxString m_invalidWord;
185 };
186
187 #endif // wxUSE_VALIDATORS
188
189 // -----------------------------------------------------------------------
190 // AdvImageFile Property
191 // -----------------------------------------------------------------------
192
193 class wxMyImageInfo;
194
195 WX_DECLARE_OBJARRAY(wxMyImageInfo, wxArrayMyImageInfo);
196
197 class wxMyImageInfo
198 {
199 public:
200 wxString m_path;
201 wxBitmap* m_pThumbnail1; // smaller thumbnail
202 wxBitmap* m_pThumbnail2; // larger thumbnail
203
204 wxMyImageInfo ( const wxString& str )
205 {
206 m_path = str;
207 m_pThumbnail1 = (wxBitmap*) NULL;
208 m_pThumbnail2 = (wxBitmap*) NULL;
209 }
210 virtual ~wxMyImageInfo()
211 {
212 if ( m_pThumbnail1 )
213 delete m_pThumbnail1;
214 if ( m_pThumbnail2 )
215 delete m_pThumbnail2;
216 }
217
218 };
219
220
221 #include <wx/arrimpl.cpp>
222 WX_DEFINE_OBJARRAY(wxArrayMyImageInfo);
223
224 wxArrayMyImageInfo g_myImageArray;
225
226
227 // Preferred thumbnail height.
228 #define PREF_THUMBNAIL_HEIGHT 64
229
230
231 wxPGChoices wxAdvImageFileProperty::ms_choices;
232
233 WX_PG_IMPLEMENT_PROPERTY_CLASS(wxAdvImageFileProperty,wxFileProperty,
234 wxString,const wxString&,ChoiceAndButton)
235
236
237 wxAdvImageFileProperty::wxAdvImageFileProperty( const wxString& label,
238 const wxString& name,
239 const wxString& value)
240 : wxFileProperty(label,name,value)
241 {
242 m_wildcard = wxPGGetDefaultImageWildcard();
243
244 m_index = -1;
245
246 m_pImage = (wxImage*) NULL;
247
248 // Only show names.
249 m_flags &= ~(wxPG_PROP_SHOW_FULL_FILENAME);
250 }
251
252 wxAdvImageFileProperty::~wxAdvImageFileProperty ()
253 {
254 // Delete old image
255 if ( m_pImage )
256 {
257 delete m_pImage;
258 m_pImage = (wxImage*) NULL;
259 }
260 }
261
262 void wxAdvImageFileProperty::OnSetValue()
263 {
264 wxFileProperty::OnSetValue();
265
266 // Delete old image
267 if ( m_pImage )
268 {
269 delete m_pImage;
270 m_pImage = (wxImage*) NULL;
271 }
272
273 wxString imagename = GetValueAsString(0);
274
275 if ( imagename.length() )
276 {
277 size_t prevCount = g_myImageArray.GetCount();
278 int index = ms_choices.Index(imagename);
279
280 // If not in table, add now.
281 if ( index == wxNOT_FOUND )
282 {
283 ms_choices.Add( imagename );
284 g_myImageArray.Add( new wxMyImageInfo( m_filename.GetFullPath() ) );
285
286 index = g_myImageArray.GetCount() - 1;
287 }
288
289 // If no thumbnail ready, then need to load image.
290 if ( !g_myImageArray[index].m_pThumbnail2 )
291 {
292 // Load if file exists.
293 if ( m_filename.FileExists() )
294 m_pImage = new wxImage( m_filename.GetFullPath() );
295 }
296
297 m_index = index;
298
299 wxPropertyGrid* pg = GetGrid();
300 wxWindow* control = pg->GetEditorControl();
301
302 if ( pg->GetSelection() == this && control )
303 {
304 wxString name = GetValueAsString(0);
305
306 if ( g_myImageArray.GetCount() != prevCount )
307 {
308 wxASSERT( g_myImageArray.GetCount() == (prevCount+1) );
309
310 // Add to the control's array.
311 // (should be added to own array earlier)
312
313 if ( control )
314 GetEditorClass()->InsertItem(control, name, -1);
315 }
316
317 if ( control )
318 GetEditorClass()->UpdateControl(this, control);
319 }
320 }
321 else
322 m_index = -1;
323 }
324
325 int wxAdvImageFileProperty::GetChoiceInfo( wxPGChoiceInfo* choiceinfo )
326 {
327 if ( choiceinfo )
328 choiceinfo->m_choices = &ms_choices;
329
330 return m_index;
331 }
332
333 bool wxAdvImageFileProperty::IntToValue( wxVariant& variant, int number, int WXUNUSED(argFlags) ) const
334 {
335 wxASSERT( number >= 0 );
336 return StringToValue( variant, ms_choices.GetLabel(number), wxPG_FULL_VALUE );
337 }
338
339 bool wxAdvImageFileProperty::OnEvent( wxPropertyGrid* propgrid, wxWindow* primary,
340 wxEvent& event )
341 {
342 if ( propgrid->IsMainButtonEvent(event) )
343 {
344 return wxFileProperty::OnEvent(propgrid,primary,event);
345 }
346 return false;
347 }
348
349 wxSize wxAdvImageFileProperty::OnMeasureImage( int item ) const
350 {
351 if ( item == -1 )
352 return wxPG_DEFAULT_IMAGE_SIZE;
353
354 return wxSize(PREF_THUMBNAIL_HEIGHT,PREF_THUMBNAIL_HEIGHT);
355 }
356
357 void wxAdvImageFileProperty::LoadThumbnails( size_t index )
358 {
359 wxMyImageInfo& mii = g_myImageArray[index];
360
361 if ( !mii.m_pThumbnail2 )
362 {
363
364 if ( !m_pImage || !m_pImage->Ok() ||
365 m_filename != mii.m_path
366 )
367 {
368 if ( m_pImage )
369 delete m_pImage;
370 m_pImage = new wxImage( mii.m_path );
371 }
372
373 if ( m_pImage && m_pImage->Ok() )
374 {
375 int im_wid = m_pImage->GetWidth();
376 int im_hei = m_pImage->GetHeight();
377 if ( im_hei > PREF_THUMBNAIL_HEIGHT )
378 {
379 // TNW = (TNH*IW)/IH
380 im_wid = (PREF_THUMBNAIL_HEIGHT*m_pImage->GetWidth())/m_pImage->GetHeight();
381 im_hei = PREF_THUMBNAIL_HEIGHT;
382 }
383
384 m_pImage->Rescale( im_wid, im_hei );
385
386 mii.m_pThumbnail2 = new wxBitmap( *m_pImage );
387
388 wxSize cis = GetParentState()->GetGrid()->GetImageSize();
389 m_pImage->Rescale ( cis.x, cis.y );
390
391 mii.m_pThumbnail1 = new wxBitmap( *m_pImage );
392
393 }
394
395 if ( m_pImage )
396 {
397 delete m_pImage;
398 m_pImage = (wxImage*) NULL;
399 }
400 }
401 }
402
403 void wxAdvImageFileProperty::OnCustomPaint( wxDC& dc,
404 const wxRect& rect,
405 wxPGPaintData& pd )
406 {
407 int index = m_index;
408 if ( pd.m_choiceItem >= 0 )
409 index = pd.m_choiceItem;
410
411 //wxLogDebug(wxT("%i"),index);
412
413 if ( index >= 0 )
414 {
415 LoadThumbnails(index);
416
417 // Is this a measure item call?
418 if ( rect.x < 0 )
419 {
420 // Variable height
421 //pd.m_drawnHeight = PREF_THUMBNAIL_HEIGHT;
422 wxBitmap* pBitmap = (wxBitmap*)g_myImageArray[index].m_pThumbnail2;
423 if ( pBitmap )
424 pd.m_drawnHeight = pBitmap->GetHeight();
425 else
426 pd.m_drawnHeight = 16;
427 return;
428 }
429
430 // Draw the thumbnail
431
432 wxBitmap* pBitmap;
433
434 if ( pd.m_choiceItem >= 0 )
435 pBitmap = (wxBitmap*)g_myImageArray[index].m_pThumbnail2;
436 else
437 pBitmap = (wxBitmap*)g_myImageArray[index].m_pThumbnail1;
438
439 if ( pBitmap )
440 {
441 dc.DrawBitmap ( *pBitmap, rect.x, rect.y, FALSE );
442
443 // Tell the caller how wide we drew.
444 pd.m_drawnWidth = pBitmap->GetWidth();
445
446 return;
447 }
448 }
449
450 // No valid file - just draw a white box.
451 dc.SetBrush ( *wxWHITE_BRUSH );
452 dc.DrawRectangle ( rect );
453 }
454
455
456 // -----------------------------------------------------------------------
457 // wxVectorProperty
458 // -----------------------------------------------------------------------
459
460 // See propgridsample.h for wxVector3f class
461
462 WX_PG_IMPLEMENT_VARIANT_DATA_DUMMY_EQ(wxVector3f)
463
464 WX_PG_IMPLEMENT_PROPERTY_CLASS(wxVectorProperty,wxPGProperty,
465 wxVector3f,const wxVector3f&,TextCtrl)
466
467
468 wxVectorProperty::wxVectorProperty( const wxString& label,
469 const wxString& name,
470 const wxVector3f& value )
471 : wxPGProperty(label,name)
472 {
473 SetValue( WXVARIANT(value) );
474 AddChild( new wxFloatProperty(wxT("X"),wxPG_LABEL,value.x) );
475 AddChild( new wxFloatProperty(wxT("Y"),wxPG_LABEL,value.y) );
476 AddChild( new wxFloatProperty(wxT("Z"),wxPG_LABEL,value.z) );
477 }
478
479 wxVectorProperty::~wxVectorProperty() { }
480
481 void wxVectorProperty::RefreshChildren()
482 {
483 if ( !GetChildCount() ) return;
484 const wxVector3f& vector = wxVector3fRefFromVariant(m_value);
485 Item(0)->SetValue( vector.x );
486 Item(1)->SetValue( vector.y );
487 Item(2)->SetValue( vector.z );
488 }
489
490 void wxVectorProperty::ChildChanged( wxVariant& thisValue, int childIndex, wxVariant& childValue ) const
491 {
492 wxVector3f vector;
493 vector << thisValue;
494 switch ( childIndex )
495 {
496 case 0: vector.x = childValue.GetDouble(); break;
497 case 1: vector.y = childValue.GetDouble(); break;
498 case 2: vector.z = childValue.GetDouble(); break;
499 }
500 thisValue << vector;
501 }
502
503
504 // -----------------------------------------------------------------------
505 // wxTriangleProperty
506 // -----------------------------------------------------------------------
507
508 // See propgridsample.h for wxTriangle class
509
510 WX_PG_IMPLEMENT_VARIANT_DATA_DUMMY_EQ(wxTriangle)
511
512 WX_PG_IMPLEMENT_PROPERTY_CLASS(wxTriangleProperty,wxPGProperty,
513 wxTriangle,const wxTriangle&,TextCtrl)
514
515
516 wxTriangleProperty::wxTriangleProperty( const wxString& label,
517 const wxString& name,
518 const wxTriangle& value)
519 : wxPGProperty(label,name)
520 {
521 SetValue( WXVARIANT(value) );
522 AddChild( new wxVectorProperty(wxT("A"),wxPG_LABEL,value.a) );
523 AddChild( new wxVectorProperty(wxT("B"),wxPG_LABEL,value.b) );
524 AddChild( new wxVectorProperty(wxT("C"),wxPG_LABEL,value.c) );
525 }
526
527 wxTriangleProperty::~wxTriangleProperty() { }
528
529 void wxTriangleProperty::RefreshChildren()
530 {
531 if ( !GetChildCount() ) return;
532 const wxTriangle& triangle = wxTriangleRefFromVariant(m_value);
533 Item(0)->SetValue( WXVARIANT(triangle.a) );
534 Item(1)->SetValue( WXVARIANT(triangle.b) );
535 Item(2)->SetValue( WXVARIANT(triangle.c) );
536 }
537
538 void wxTriangleProperty::ChildChanged( wxVariant& thisValue, int childIndex, wxVariant& childValue ) const
539 {
540 wxTriangle triangle;
541 triangle << thisValue;
542 const wxVector3f& vector = wxVector3fRefFromVariant(childValue);
543 switch ( childIndex )
544 {
545 case 0: triangle.a = vector; break;
546 case 1: triangle.b = vector; break;
547 case 2: triangle.c = vector; break;
548 }
549 thisValue << triangle;
550 }
551
552
553 // -----------------------------------------------------------------------
554 // wxSingleChoiceDialogAdapter (wxPGEditorDialogAdapter sample)
555 // -----------------------------------------------------------------------
556
557 class wxSingleChoiceDialogAdapter : public wxPGEditorDialogAdapter
558 {
559 public:
560
561 wxSingleChoiceDialogAdapter( const wxPGChoices& choices )
562 : wxPGEditorDialogAdapter(), m_choices(choices)
563 {
564 }
565
566 virtual bool DoShowDialog( wxPropertyGrid* WXUNUSED(propGrid),
567 wxPGProperty* WXUNUSED(property) )
568 {
569 wxString s = ::wxGetSingleChoice(wxT("Message"),
570 wxT("Caption"),
571 m_choices.GetLabels());
572 if ( s.length() )
573 {
574 SetValue(s);
575 return true;
576 }
577
578 return false;
579 }
580
581 protected:
582 const wxPGChoices& m_choices;
583 };
584
585
586 class SingleChoiceProperty : public wxStringProperty
587 {
588 public:
589
590 SingleChoiceProperty( const wxString& label,
591 const wxString& name = wxPG_LABEL,
592 const wxString& value = wxEmptyString )
593 : wxStringProperty(label, name, value)
594 {
595 // Prepare choices
596 m_choices.Add(wxT("Cat"));
597 m_choices.Add(wxT("Dog"));
598 m_choices.Add(wxT("Gibbon"));
599 m_choices.Add(wxT("Otter"));
600 }
601
602 // Set editor to have button
603 virtual const wxPGEditor* DoGetEditorClass() const
604 {
605 return wxPG_EDITOR(TextCtrlAndButton);
606 }
607
608 // Set what happens on button click
609 virtual wxPGEditorDialogAdapter* GetEditorDialog() const
610 {
611 return new wxSingleChoiceDialogAdapter(m_choices);
612 }
613
614 protected:
615 wxPGChoices m_choices;
616 };
617
618 // -----------------------------------------------------------------------
619 // Menu IDs
620 // -----------------------------------------------------------------------
621
622 enum
623 {
624 PGID = 1,
625 TCID,
626 ID_ABOUT,
627 ID_QUIT,
628 ID_APPENDPROP,
629 ID_APPENDCAT,
630 ID_INSERTPROP,
631 ID_INSERTCAT,
632 ID_ENABLE,
633 ID_HIDE,
634 ID_DELETE,
635 ID_DELETER,
636 ID_DELETEALL,
637 ID_UNSPECIFY,
638 ID_ITERATE1,
639 ID_ITERATE2,
640 ID_ITERATE3,
641 ID_ITERATE4,
642 ID_CLEARMODIF,
643 ID_FREEZE,
644 ID_DUMPLIST,
645 ID_COLOURSCHEME1,
646 ID_COLOURSCHEME2,
647 ID_COLOURSCHEME3,
648 ID_CATCOLOURS,
649 ID_SETCOLOUR,
650 ID_STATICLAYOUT,
651 ID_CLEAR,
652 ID_POPULATE1,
653 ID_POPULATE2,
654 ID_COLLAPSE,
655 ID_COLLAPSEALL,
656 ID_GETVALUES,
657 ID_SETVALUES,
658 ID_SETVALUES2,
659 ID_RUNTESTFULL,
660 ID_RUNTESTPARTIAL,
661 ID_FITCOLUMNS,
662 ID_CHANGEFLAGSITEMS,
663 ID_TESTINSERTCHOICE,
664 ID_TESTDELETECHOICE,
665 ID_INSERTPAGE,
666 ID_REMOVEPAGE,
667 ID_SETSPINCTRLEDITOR,
668 ID_SETPROPERTYVALUE,
669 ID_TESTREPLACE,
670 ID_SETCOLUMNS,
671 ID_TESTXRC,
672 ID_ENABLECOMMONVALUES,
673 ID_SELECTSTYLE,
674 ID_SAVESTATE,
675 ID_RESTORESTATE,
676 ID_RUNMINIMAL
677 };
678
679 // -----------------------------------------------------------------------
680 // Event table
681 // -----------------------------------------------------------------------
682
683 BEGIN_EVENT_TABLE(FormMain, wxFrame)
684 EVT_IDLE(FormMain::OnIdle)
685 EVT_MOVE(FormMain::OnMove)
686 EVT_SIZE(FormMain::OnResize)
687
688 // This occurs when a property is selected
689 EVT_PG_SELECTED( PGID, FormMain::OnPropertyGridSelect )
690 // This occurs when a property value changes
691 EVT_PG_CHANGED( PGID, FormMain::OnPropertyGridChange )
692 // This occurs just prior a property value is changed
693 EVT_PG_CHANGING( PGID, FormMain::OnPropertyGridChanging )
694 // This occurs when a mouse moves over another property
695 EVT_PG_HIGHLIGHTED( PGID, FormMain::OnPropertyGridHighlight )
696 // This occurs when mouse is right-clicked.
697 EVT_PG_RIGHT_CLICK( PGID, FormMain::OnPropertyGridItemRightClick )
698 // This occurs when mouse is double-clicked.
699 EVT_PG_DOUBLE_CLICK( PGID, FormMain::OnPropertyGridItemDoubleClick )
700 // This occurs when propgridmanager's page changes.
701 EVT_PG_PAGE_CHANGED( PGID, FormMain::OnPropertyGridPageChange )
702 // This occurs when property's editor button (if any) is clicked.
703 EVT_BUTTON( PGID, FormMain::OnPropertyGridButtonClick )
704
705 EVT_PG_ITEM_COLLAPSED( PGID, FormMain::OnPropertyGridItemCollapse )
706 EVT_PG_ITEM_EXPANDED( PGID, FormMain::OnPropertyGridItemExpand )
707
708 EVT_TEXT( PGID, FormMain::OnPropertyGridTextUpdate )
709
710 //
711 // Rest of the events are not property grid specific
712 EVT_KEY_DOWN( FormMain::OnPropertyGridKeyEvent )
713 EVT_KEY_UP( FormMain::OnPropertyGridKeyEvent )
714
715 EVT_MENU( ID_APPENDPROP, FormMain::OnAppendPropClick )
716 EVT_MENU( ID_APPENDCAT, FormMain::OnAppendCatClick )
717 EVT_MENU( ID_INSERTPROP, FormMain::OnInsertPropClick )
718 EVT_MENU( ID_INSERTCAT, FormMain::OnInsertCatClick )
719 EVT_MENU( ID_DELETE, FormMain::OnDelPropClick )
720 EVT_MENU( ID_DELETER, FormMain::OnDelPropRClick )
721 EVT_MENU( ID_UNSPECIFY, FormMain::OnMisc )
722 EVT_MENU( ID_DELETEALL, FormMain::OnClearClick )
723 EVT_MENU( ID_ENABLE, FormMain::OnEnableDisable )
724 EVT_MENU( ID_HIDE, FormMain::OnHideShow )
725 EVT_MENU( ID_ITERATE1, FormMain::OnIterate1Click )
726 EVT_MENU( ID_ITERATE2, FormMain::OnIterate2Click )
727 EVT_MENU( ID_ITERATE3, FormMain::OnIterate3Click )
728 EVT_MENU( ID_ITERATE4, FormMain::OnIterate4Click )
729 EVT_MENU( ID_SETCOLOUR, FormMain::OnMisc )
730 EVT_MENU( ID_CLEARMODIF, FormMain::OnClearModifyStatusClick )
731 EVT_MENU( ID_FREEZE, FormMain::OnFreezeClick )
732 EVT_MENU( ID_DUMPLIST, FormMain::OnDumpList )
733
734 EVT_MENU( ID_COLOURSCHEME1, FormMain::OnColourScheme )
735 EVT_MENU( ID_COLOURSCHEME2, FormMain::OnColourScheme )
736 EVT_MENU( ID_COLOURSCHEME3, FormMain::OnColourScheme )
737 EVT_MENU( ID_COLOURSCHEME4, FormMain::OnColourScheme )
738
739 EVT_MENU( ID_ABOUT, FormMain::OnAbout )
740 EVT_MENU( ID_QUIT, FormMain::OnCloseClick )
741
742 EVT_MENU( ID_CATCOLOURS, FormMain::OnCatColours )
743 EVT_MENU( ID_SETCOLUMNS, FormMain::OnSetColumns )
744 EVT_MENU( ID_TESTXRC, FormMain::OnTestXRC )
745 EVT_MENU( ID_ENABLECOMMONVALUES, FormMain::OnEnableCommonValues )
746 EVT_MENU( ID_SELECTSTYLE, FormMain::OnSelectStyle )
747
748 EVT_MENU( ID_STATICLAYOUT, FormMain::OnMisc )
749 EVT_MENU( ID_CLEAR, FormMain::OnMisc )
750 EVT_MENU( ID_COLLAPSE, FormMain::OnMisc )
751 EVT_MENU( ID_COLLAPSEALL, FormMain::OnMisc )
752
753 EVT_MENU( ID_POPULATE1, FormMain::OnPopulateClick )
754 EVT_MENU( ID_POPULATE2, FormMain::OnPopulateClick )
755
756 EVT_MENU( ID_GETVALUES, FormMain::OnMisc )
757 EVT_MENU( ID_SETVALUES, FormMain::OnMisc )
758 EVT_MENU( ID_SETVALUES2, FormMain::OnMisc )
759
760 EVT_MENU( ID_FITCOLUMNS, FormMain::OnFitColumnsClick )
761
762 EVT_MENU( ID_CHANGEFLAGSITEMS, FormMain::OnChangeFlagsPropItemsClick )
763
764 EVT_MENU( ID_RUNTESTFULL, FormMain::OnMisc )
765 EVT_MENU( ID_RUNTESTPARTIAL, FormMain::OnMisc )
766
767 EVT_MENU( ID_TESTINSERTCHOICE, FormMain::OnInsertChoice )
768 EVT_MENU( ID_TESTDELETECHOICE, FormMain::OnDeleteChoice )
769
770 EVT_MENU( ID_INSERTPAGE, FormMain::OnInsertPage )
771 EVT_MENU( ID_REMOVEPAGE, FormMain::OnRemovePage )
772
773 EVT_MENU( ID_SAVESTATE, FormMain::OnSaveState )
774 EVT_MENU( ID_RESTORESTATE, FormMain::OnRestoreState )
775
776 EVT_MENU( ID_SETSPINCTRLEDITOR, FormMain::OnSetSpinCtrlEditorClick )
777 EVT_MENU( ID_TESTREPLACE, FormMain::OnTestReplaceClick )
778 EVT_MENU( ID_SETPROPERTYVALUE, FormMain::OnSetPropertyValue )
779
780 EVT_MENU( ID_RUNMINIMAL, FormMain::OnRunMinimalClick )
781
782 EVT_CONTEXT_MENU( FormMain::OnContextMenu )
783 END_EVENT_TABLE()
784
785 // -----------------------------------------------------------------------
786
787 void FormMain::OnMove( wxMoveEvent& event )
788 {
789 if ( !m_pPropGridManager )
790 {
791 // this check is here so the frame layout can be tested
792 // without creating propertygrid
793 event.Skip();
794 return;
795 }
796
797 // Update position properties
798 int x, y;
799 GetPosition(&x,&y);
800
801 wxPGProperty* id;
802
803 // Must check if properties exist (as they may be deleted).
804
805 // Using m_pPropGridManager, we can scan all pages automatically.
806 id = m_pPropGridManager->GetPropertyByName( wxT("X") );
807 if ( id )
808 m_pPropGridManager->SetPropertyValue( id, x );
809
810 id = m_pPropGridManager->GetPropertyByName( wxT("Y") );
811 if ( id )
812 m_pPropGridManager->SetPropertyValue( id, y );
813
814 id = m_pPropGridManager->GetPropertyByName( wxT("Position") );
815 if ( id )
816 m_pPropGridManager->SetPropertyValue( id, wxPoint(x,y) );
817
818 // Should always call event.Skip() in frame's MoveEvent handler
819 event.Skip();
820 }
821
822 // -----------------------------------------------------------------------
823
824 void FormMain::OnResize( wxSizeEvent& event )
825 {
826 if ( !m_pPropGridManager )
827 {
828 // this check is here so the frame layout can be tested
829 // without creating propertygrid
830 event.Skip();
831 return;
832 }
833
834 // Update size properties
835 int w, h;
836 GetSize(&w,&h);
837
838 wxPGProperty* id;
839 wxPGProperty* p;
840
841 // Must check if properties exist (as they may be deleted).
842
843 // Using m_pPropGridManager, we can scan all pages automatically.
844 p = m_pPropGridManager->GetPropertyByName( wxT("Width") );
845 if ( p && !p->IsValueUnspecified() )
846 m_pPropGridManager->SetPropertyValue( p, w );
847
848 p = m_pPropGridManager->GetPropertyByName( wxT("Height") );
849 if ( p && !p->IsValueUnspecified() )
850 m_pPropGridManager->SetPropertyValue( p, h );
851
852 id = m_pPropGridManager->GetPropertyByName ( wxT("Size") );
853 if ( id )
854 m_pPropGridManager->SetPropertyValue( id, wxSize(w,h) );
855
856 // Should always call event.Skip() in frame's SizeEvent handler
857 event.Skip();
858 }
859
860 // -----------------------------------------------------------------------
861
862 void FormMain::OnPropertyGridChanging( wxPropertyGridEvent& event )
863 {
864 wxPGProperty* p = event.GetProperty();
865
866 if ( p->GetName() == wxT("Font") )
867 {
868 int res =
869 wxMessageBox(wxString::Format(wxT("'%s' is about to change (to variant of type '%s')\n\nAllow or deny?"),
870 p->GetName().c_str(),event.GetValue().GetType().c_str()),
871 wxT("Testing wxEVT_PG_CHANGING"), wxYES_NO, m_pPropGridManager);
872
873 if ( res == wxNO )
874 {
875 wxASSERT(event.CanVeto());
876
877 event.Veto();
878
879 // Since we ask a question, it is better if we omit any validation
880 // failure behavior.
881 event.SetValidationFailureBehavior(0);
882 }
883 }
884 }
885
886 //
887 // Note how we use three types of value getting in this method:
888 // A) event.GetPropertyValueAsXXX
889 // B) event.GetPropertValue, and then variant's GetXXX
890 // C) grid's GetPropertyValueAsXXX(id)
891 //
892 void FormMain::OnPropertyGridChange( wxPropertyGridEvent& event )
893 {
894 wxPGProperty* property = event.GetProperty();
895
896 const wxString& name = property->GetName();
897 wxVariant value = property->GetValue();
898
899 // Don't handle 'unspecified' values
900 if ( value.IsNull() )
901 return;
902
903 // Some settings are disabled outside Windows platform
904 if ( name == wxT("X") )
905 SetSize ( m_pPropGridManager->GetPropertyValueAsInt(property), -1, -1, -1, wxSIZE_USE_EXISTING );
906 else if ( name == wxT("Y") )
907 // wxPGVariantToInt is safe long int value getter
908 SetSize ( -1, wxPGVariantToInt(value), -1, -1, wxSIZE_USE_EXISTING );
909 else if ( name == wxT("Width") )
910 SetSize ( -1, -1, m_pPropGridManager->GetPropertyValueAsInt(property), -1, wxSIZE_USE_EXISTING );
911 else if ( name == wxT("Height") )
912 SetSize ( -1, -1, -1, wxPGVariantToInt(value), wxSIZE_USE_EXISTING );
913 else if ( name == wxT("Label") )
914 {
915 SetTitle ( m_pPropGridManager->GetPropertyValueAsString(property) );
916 }
917 else if ( name == wxT("Password") )
918 {
919 static int pwdMode = 0;
920
921 //m_pPropGridManager->SetPropertyAttribute(property, wxPG_STRING_PASSWORD, (long)pwdMode);
922
923 pwdMode++;
924 pwdMode &= 1;
925 }
926 else
927 if ( name == wxT("Font") )
928 {
929 wxFont font;
930 font << value;
931 wxASSERT( font.Ok() );
932
933 m_pPropGridManager->SetFont( font );
934 }
935 else
936 if ( name == wxT("Margin Colour") )
937 {
938 wxColourPropertyValue cpv;
939 cpv << value;
940 m_pPropGridManager->GetGrid()->SetMarginColour( cpv.m_colour );
941 }
942 else if ( name == wxT("Cell Colour") )
943 {
944 wxColourPropertyValue cpv;
945 cpv << value;
946 m_pPropGridManager->GetGrid()->SetCellBackgroundColour( cpv.m_colour );
947 }
948 else if ( name == wxT("Line Colour") )
949 {
950 wxColourPropertyValue cpv;
951 cpv << value;
952 m_pPropGridManager->GetGrid()->SetLineColour( cpv.m_colour );
953 }
954 else if ( name == wxT("Cell Text Colour") )
955 {
956 wxColourPropertyValue cpv;
957 cpv << value;
958 m_pPropGridManager->GetGrid()->SetCellTextColour( cpv.m_colour );
959 }
960 }
961
962 // -----------------------------------------------------------------------
963
964 void FormMain::OnPropertyGridSelect( wxPropertyGridEvent& event )
965 {
966 wxPGProperty* property = event.GetProperty();
967 if ( property )
968 {
969 m_itemEnable->Enable( TRUE );
970 if ( property->IsEnabled() )
971 m_itemEnable->SetItemLabel( wxT("Disable") );
972 else
973 m_itemEnable->SetItemLabel( wxT("Enable") );
974 }
975 else
976 {
977 m_itemEnable->Enable( FALSE );
978 }
979
980 #if wxUSE_STATUSBAR
981 wxPGProperty* prop = event.GetProperty();
982 wxStatusBar* sb = GetStatusBar();
983 if ( prop )
984 {
985 wxString text(wxT("Selected: "));
986 text += m_pPropGridManager->GetPropertyLabel( prop );
987 sb->SetStatusText ( text );
988 }
989 #endif
990 }
991
992 // -----------------------------------------------------------------------
993
994 void FormMain::OnPropertyGridPageChange( wxPropertyGridEvent& WXUNUSED(event) )
995 {
996 #if wxUSE_STATUSBAR
997 wxStatusBar* sb = GetStatusBar();
998 wxString text(wxT("Page Changed: "));
999 text += m_pPropGridManager->GetPageName(m_pPropGridManager->GetSelectedPage());
1000 sb->SetStatusText( text );
1001 #endif
1002 }
1003
1004 // -----------------------------------------------------------------------
1005
1006 void FormMain::OnPropertyGridHighlight( wxPropertyGridEvent& WXUNUSED(event) )
1007 {
1008 }
1009
1010 // -----------------------------------------------------------------------
1011
1012 void FormMain::OnPropertyGridItemRightClick( wxPropertyGridEvent& event )
1013 {
1014 #if wxUSE_STATUSBAR
1015 wxPGProperty* prop = event.GetProperty();
1016 wxStatusBar* sb = GetStatusBar();
1017 if ( prop )
1018 {
1019 wxString text(wxT("Right-clicked: "));
1020 text += prop->GetLabel();
1021 text += wxT(", name=");
1022 text += m_pPropGridManager->GetPropertyName(prop);
1023 sb->SetStatusText( text );
1024 }
1025 else
1026 {
1027 sb->SetStatusText( wxEmptyString );
1028 }
1029 #endif
1030 }
1031
1032 // -----------------------------------------------------------------------
1033
1034 void FormMain::OnPropertyGridItemDoubleClick( wxPropertyGridEvent& event )
1035 {
1036 #if wxUSE_STATUSBAR
1037 wxPGProperty* prop = event.GetProperty();
1038 wxStatusBar* sb = GetStatusBar();
1039 if ( prop )
1040 {
1041 wxString text(wxT("Double-clicked: "));
1042 text += prop->GetLabel();
1043 text += wxT(", name=");
1044 text += m_pPropGridManager->GetPropertyName(prop);
1045 sb->SetStatusText ( text );
1046 }
1047 else
1048 {
1049 sb->SetStatusText ( wxEmptyString );
1050 }
1051 #endif
1052 }
1053
1054 // -----------------------------------------------------------------------
1055
1056 void FormMain::OnPropertyGridButtonClick ( wxCommandEvent& )
1057 {
1058 #if wxUSE_STATUSBAR
1059 wxPGProperty* prop = m_pPropGridManager->GetSelectedProperty();
1060 wxStatusBar* sb = GetStatusBar();
1061 if ( prop )
1062 {
1063 wxString text(wxT("Button clicked: "));
1064 text += m_pPropGridManager->GetPropertyLabel(prop);
1065 text += wxT(", name=");
1066 text += m_pPropGridManager->GetPropertyName(prop);
1067 sb->SetStatusText( text );
1068 }
1069 else
1070 {
1071 ::wxMessageBox(wxT("SHOULD NOT HAPPEN!!!"));
1072 }
1073 #endif
1074 }
1075
1076 // -----------------------------------------------------------------------
1077
1078 void FormMain::OnPropertyGridItemCollapse( wxPropertyGridEvent& )
1079 {
1080 wxLogDebug(wxT("Item was Collapsed"));
1081 }
1082
1083 // -----------------------------------------------------------------------
1084
1085 void FormMain::OnPropertyGridItemExpand( wxPropertyGridEvent& )
1086 {
1087 wxLogDebug(wxT("Item was Expanded"));
1088 }
1089
1090 // -----------------------------------------------------------------------
1091
1092 // EVT_TEXT handling
1093 void FormMain::OnPropertyGridTextUpdate( wxCommandEvent& event )
1094 {
1095 event.Skip();
1096 }
1097
1098 // -----------------------------------------------------------------------
1099
1100 void FormMain::OnPropertyGridKeyEvent( wxKeyEvent& WXUNUSED(event) )
1101 {
1102 // Occurs on wxGTK mostly, but not wxMSW.
1103 }
1104
1105 // -----------------------------------------------------------------------
1106
1107 void FormMain::OnLabelTextChange( wxCommandEvent& WXUNUSED(event) )
1108 {
1109 // Uncomment following to allow property label modify in real-time
1110 // wxPGProperty& p = m_pPropGridManager->GetGrid()->GetSelection();
1111 // if ( !p.IsOk() ) return;
1112 // m_pPropGridManager->SetPropertyLabel( p, m_tcPropLabel->DoGetValue() );
1113 }
1114
1115 // -----------------------------------------------------------------------
1116
1117 static const wxChar* _fs_windowstyle_labels[] = {
1118 wxT("wxSIMPLE_BORDER"),
1119 wxT("wxDOUBLE_BORDER"),
1120 wxT("wxSUNKEN_BORDER"),
1121 wxT("wxRAISED_BORDER"),
1122 wxT("wxNO_BORDER"),
1123 wxT("wxTRANSPARENT_WINDOW"),
1124 wxT("wxTAB_TRAVERSAL"),
1125 wxT("wxWANTS_CHARS"),
1126 #if wxNO_FULL_REPAINT_ON_RESIZE
1127 wxT("wxNO_FULL_REPAINT_ON_RESIZE"),
1128 #endif
1129 wxT("wxVSCROLL"),
1130 wxT("wxALWAYS_SHOW_SB"),
1131 wxT("wxCLIP_CHILDREN"),
1132 #if wxFULL_REPAINT_ON_RESIZE
1133 wxT("wxFULL_REPAINT_ON_RESIZE"),
1134 #endif
1135 (const wxChar*) NULL // terminator is always needed
1136 };
1137
1138 static const long _fs_windowstyle_values[] = {
1139 wxSIMPLE_BORDER,
1140 wxDOUBLE_BORDER,
1141 wxSUNKEN_BORDER,
1142 wxRAISED_BORDER,
1143 wxNO_BORDER,
1144 wxTRANSPARENT_WINDOW,
1145 wxTAB_TRAVERSAL,
1146 wxWANTS_CHARS,
1147 #if wxNO_FULL_REPAINT_ON_RESIZE
1148 wxNO_FULL_REPAINT_ON_RESIZE,
1149 #endif
1150 wxVSCROLL,
1151 wxALWAYS_SHOW_SB,
1152 wxCLIP_CHILDREN,
1153 #if wxFULL_REPAINT_ON_RESIZE
1154 wxFULL_REPAINT_ON_RESIZE
1155 #endif
1156 };
1157
1158 static const wxChar* _fs_framestyle_labels[] = {
1159 wxT("wxCAPTION"),
1160 wxT("wxMINIMIZE"),
1161 wxT("wxMAXIMIZE"),
1162 wxT("wxCLOSE_BOX"),
1163 wxT("wxSTAY_ON_TOP"),
1164 wxT("wxSYSTEM_MENU"),
1165 wxT("wxRESIZE_BORDER"),
1166 wxT("wxFRAME_TOOL_WINDOW"),
1167 wxT("wxFRAME_NO_TASKBAR"),
1168 wxT("wxFRAME_FLOAT_ON_PARENT"),
1169 wxT("wxFRAME_SHAPED"),
1170 (const wxChar*) NULL
1171 };
1172
1173 static const long _fs_framestyle_values[] = {
1174 wxCAPTION,
1175 wxMINIMIZE,
1176 wxMAXIMIZE,
1177 wxCLOSE_BOX,
1178 wxSTAY_ON_TOP,
1179 wxSYSTEM_MENU,
1180 wxRESIZE_BORDER,
1181 wxFRAME_TOOL_WINDOW,
1182 wxFRAME_NO_TASKBAR,
1183 wxFRAME_FLOAT_ON_PARENT,
1184 wxFRAME_SHAPED
1185 };
1186
1187 // -----------------------------------------------------------------------
1188
1189 void FormMain::OnTestXRC(wxCommandEvent& WXUNUSED(event))
1190 {
1191 wxMessageBox(wxT("Sorrt, not yet implemented"));
1192 }
1193
1194 void FormMain::OnEnableCommonValues(wxCommandEvent& WXUNUSED(event))
1195 {
1196 wxPGProperty* prop = m_pPropGridManager->GetSelectedProperty();
1197 if ( prop )
1198 prop->EnableCommonValue();
1199 else
1200 wxMessageBox(wxT("First select a property"));
1201 }
1202
1203 void FormMain::PopulateWithStandardItems ()
1204 {
1205 wxPropertyGridManager* pgman = m_pPropGridManager;
1206 wxPropertyGridPage* pg = pgman->GetPage(wxT("Standard Items"));
1207
1208 // Append is ideal way to add items to wxPropertyGrid.
1209 pg->Append( new wxPropertyCategory(wxT("Appearance"),wxPG_LABEL) );
1210
1211 pg->Append( new wxStringProperty(wxT("Label"),wxPG_LABEL,GetTitle()) );
1212 pg->Append( new wxFontProperty(wxT("Font"),wxPG_LABEL) );
1213 pg->SetPropertyHelpString ( wxT("Font"), wxT("Editing this will change font used in the property grid.") );
1214
1215 pg->Append( new wxSystemColourProperty(wxT("Margin Colour"),wxPG_LABEL,
1216 pg->GetGrid()->GetMarginColour()) );
1217
1218 pg->Append( new wxSystemColourProperty(wxT("Cell Colour"),wxPG_LABEL,
1219 pg->GetGrid()->GetCellBackgroundColour()) );
1220 pg->Append( new wxSystemColourProperty(wxT("Cell Text Colour"),wxPG_LABEL,
1221 pg->GetGrid()->GetCellTextColour()) );
1222 pg->Append( new wxSystemColourProperty(wxT("Line Colour"),wxPG_LABEL,
1223 pg->GetGrid()->GetLineColour()) );
1224 pg->Append( new wxFlagsProperty(wxT("Window Styles"),wxPG_LABEL,
1225 m_combinedFlags, GetWindowStyle()) );
1226
1227 //pg->SetPropertyAttribute(wxT("Window Styles"),wxPG_BOOL_USE_CHECKBOX,true,wxPG_RECURSE);
1228
1229 pg->Append( new wxCursorProperty(wxT("Cursor"),wxPG_LABEL) );
1230
1231 pg->Append( new wxPropertyCategory(wxT("Position"),wxT("PositionCategory")) );
1232 pg->SetPropertyHelpString( wxT("PositionCategory"), wxT("Change in items in this category will cause respective changes in frame.") );
1233
1234 // Let's demonstrate 'Units' attribute here
1235
1236 // Note that we use many attribute constants instead of strings here
1237 // (for instance, wxPG_ATTR_MIN, instead of wxT("min")).
1238 // Using constant may reduce binary size.
1239
1240 pg->Append( new wxIntProperty(wxT("Height"),wxPG_LABEL,480) );
1241 pg->SetPropertyAttribute(wxT("Height"), wxPG_ATTR_MIN, (long)10 );
1242 pg->SetPropertyAttribute(wxT("Height"), wxPG_ATTR_MAX, (long)2048 );
1243 pg->SetPropertyAttribute(wxT("Height"), wxPG_ATTR_UNITS, wxT("Pixels") );
1244
1245 // Set value to unspecified so that InlineHelp attribute will be demonstrated
1246 pg->SetPropertyValueUnspecified(wxT("Height"));
1247 pg->SetPropertyAttribute(wxT("Height"), wxPG_ATTR_INLINE_HELP, wxT("Enter new height for window") );
1248 pg->SetPropertyHelpString(wxT("Height"), wxT("This property uses attributes \"Units\" and \"InlineHelp\".") );
1249
1250 pg->Append( new wxIntProperty(wxT("Width"),wxPG_LABEL,640) );
1251 pg->SetPropertyAttribute(wxT("Width"), wxPG_ATTR_MIN, (long)10 );
1252 pg->SetPropertyAttribute(wxT("Width"), wxPG_ATTR_MAX, (long)2048 );
1253 pg->SetPropertyAttribute(wxT("Width"), wxPG_ATTR_UNITS, wxT("Pixels") );
1254
1255 pg->SetPropertyValueUnspecified(wxT("Width"));
1256 pg->SetPropertyAttribute(wxT("Width"), wxPG_ATTR_INLINE_HELP, wxT("Enter new width for window") );
1257 pg->SetPropertyHelpString(wxT("Width"), wxT("This property uses attributes \"Units\" and \"InlineHelp\".") );
1258
1259 pg->Append( new wxIntProperty(wxT("X"),wxPG_LABEL,10) );
1260 pg->SetPropertyAttribute(wxT("X"), wxPG_ATTR_UNITS, wxT("Pixels") );
1261 pg->SetPropertyHelpString(wxT("X"), wxT("This property uses \"Units\" attribute.") );
1262
1263 pg->Append( new wxIntProperty(wxT("Y"),wxPG_LABEL,10) );
1264 pg->SetPropertyAttribute(wxT("Y"), wxPG_ATTR_UNITS, wxT("Pixels") );
1265 pg->SetPropertyHelpString(wxT("Y"), wxT("This property uses \"Units\" attribute.") );
1266
1267 const wxChar* disabledHelpString = wxT("This property is simply disabled. Inorder to have label disabled as well, ")
1268 wxT("you need to set wxPG_EX_GREY_LABEL_WHEN_DISABLED using SetExtraStyle.");
1269
1270 pg->Append( new wxPropertyCategory(wxT("Environment"),wxPG_LABEL) );
1271 pg->Append( new wxStringProperty(wxT("Operating System"),wxPG_LABEL,::wxGetOsDescription()) );
1272
1273 pg->Append( new wxStringProperty(wxT("User Id"),wxPG_LABEL,::wxGetUserId()) );
1274 pg->Append( new wxDirProperty(wxT("User Home"),wxPG_LABEL,::wxGetUserHome()) );
1275 pg->Append( new wxStringProperty(wxT("User Name"),wxPG_LABEL,::wxGetUserName()) );
1276
1277 // Disable some of them
1278 pg->DisableProperty( wxT("Operating System") );
1279 pg->DisableProperty( wxT("User Id") );
1280 pg->DisableProperty( wxT("User Name") );
1281
1282 pg->SetPropertyHelpString( wxT("Operating System"), disabledHelpString );
1283 pg->SetPropertyHelpString( wxT("User Id"), disabledHelpString );
1284 pg->SetPropertyHelpString( wxT("User Name"), disabledHelpString );
1285
1286 pg->Append( new wxPropertyCategory(wxT("More Examples"),wxPG_LABEL) );
1287
1288 pg->Append( new wxFontDataProperty( wxT("FontDataProperty"), wxPG_LABEL) );
1289 pg->SetPropertyHelpString( wxT("FontDataProperty"),
1290 wxT("This demonstrates wxFontDataProperty class defined in this sample app. ")
1291 wxT("It is exactly like wxFontProperty from the library, but also has colour sub-property.")
1292 );
1293
1294 pg->Append( new wxDirsProperty(wxT("DirsProperty"),wxPG_LABEL) );
1295 pg->SetPropertyHelpString( wxT("DirsProperty"),
1296 wxT("This demonstrates wxDirsProperty class defined in this sample app. ")
1297 wxT("It is built with WX_PG_IMPLEMENT_ARRAYSTRING_PROPERTY_WITH_VALIDATOR macro, ")
1298 wxT("with custom action (dir dialog popup) defined.")
1299 );
1300
1301 pg->Append( new wxAdvImageFileProperty(wxT("AdvImageFileProperty"),wxPG_LABEL) );
1302 pg->SetPropertyHelpString( wxT("AdvImageFileProperty"),
1303 wxT("This demonstrates wxAdvImageFileProperty class defined in this sample app. ")
1304 wxT("Button can be used to add new images to the popup list.")
1305 );
1306
1307 wxArrayDouble arrdbl;
1308 arrdbl.Add(-1.0);
1309 arrdbl.Add(-0.5);
1310 arrdbl.Add(0.0);
1311 arrdbl.Add(0.5);
1312 arrdbl.Add(1.0);
1313
1314 pg->Append( new wxArrayDoubleProperty(wxT("ArrayDoubleProperty"),wxPG_LABEL,arrdbl) );
1315 //pg->SetPropertyAttribute(wxT("ArrayDoubleProperty"),wxPG_FLOAT_PRECISION,(long)2);
1316 pg->SetPropertyHelpString( wxT("ArrayDoubleProperty"),
1317 wxT("This demonstrates wxArrayDoubleProperty class defined in this sample app. ")
1318 wxT("It is an example of a custom list editor property.")
1319 );
1320
1321 pg->Append( new wxLongStringProperty(wxT("Information"),wxPG_LABEL,
1322 wxT("Editing properties will have immediate effect on this window, ")
1323 wxT("and vice versa (atleast in most cases, that is).")
1324 ) );
1325 pg->SetPropertyHelpString( wxT("Information"),
1326 wxT("This property is read-only.") );
1327
1328 pg->SetPropertyReadOnly( wxT("Information"), true );
1329
1330 //
1331 // Set test information for cells in columns 3 and 4
1332 // (reserve column 2 for displaying units)
1333 wxPropertyGridIterator it;
1334 wxBitmap bmp = wxArtProvider::GetBitmap(wxART_FOLDER);
1335
1336 for ( it = pg->GetGrid()->GetIterator();
1337 !it.AtEnd();
1338 it++ )
1339 {
1340 wxPGProperty* p = *it;
1341 if ( p->IsCategory() )
1342 continue;
1343
1344 pg->SetPropertyCell( p, 3, wxT("Cell 3"), bmp );
1345 pg->SetPropertyCell( p, 4, wxT("Cell 4"), wxNullBitmap, *wxWHITE, *wxBLACK );
1346 }
1347 }
1348
1349 // -----------------------------------------------------------------------
1350
1351 void FormMain::PopulateWithExamples ()
1352 {
1353 wxPropertyGridManager* pgman = m_pPropGridManager;
1354 wxPropertyGridPage* pg = pgman->GetPage(wxT("Examples"));
1355 wxPGProperty* pid;
1356
1357 //pg->Append( new wxPropertyCategory(wxT("Examples (low priority)"),wxT("Examples")) );
1358 //pg->SetPropertyHelpString ( wxT("Examples"), wxT("This category has example of (almost) every built-in property class.") );
1359
1360 #if wxUSE_SPINBTN
1361 pg->Append( new wxIntProperty ( wxT("SpinCtrl"), wxPG_LABEL, 0 ) );
1362
1363 pg->SetPropertyEditor( wxT("SpinCtrl"), wxPG_EDITOR(SpinCtrl) );
1364 pg->SetPropertyAttribute( wxT("SpinCtrl"), wxPG_ATTR_MIN, (long)-10 ); // Use constants instead of string
1365 pg->SetPropertyAttribute( wxT("SpinCtrl"), wxPG_ATTR_MAX, (long)10 ); // for reduced binary size.
1366 pg->SetPropertyAttribute( wxT("SpinCtrl"), wxT("Step"), (long)2 );
1367 //pg->SetPropertyAttribute( wxT("SpinCtrl"), wxT("Wrap"), true );
1368
1369 pg->SetPropertyHelpString( wxT("SpinCtrl"),
1370 wxT("This is regular wxIntProperty, which editor has been ")
1371 wxT("changed to wxPG_EDITOR(SpinCtrl). Note however that ")
1372 wxT("static wxPropertyGrid::RegisterAdditionalEditors() ")
1373 wxT("needs to be called prior to using it."));
1374
1375 #endif
1376
1377 // Add bool property
1378 pg->Append( new wxBoolProperty( wxT("BoolProperty"), wxPG_LABEL, false ) );
1379
1380 // Add bool property with check box
1381 pg->Append( new wxBoolProperty( wxT("BoolProperty with CheckBox"), wxPG_LABEL, false ) );
1382 pg->SetPropertyAttribute( wxT("BoolProperty with CheckBox"),
1383 wxPG_BOOL_USE_CHECKBOX,
1384 true );
1385
1386 pg->SetPropertyHelpString( wxT("BoolProperty with CheckBox"),
1387 wxT("Property attribute wxPG_BOOL_USE_CHECKBOX has been set to true.") );
1388
1389
1390 wxPGProperty* lineThickProp;
1391 wxPGProperty* lineThickUnitProp;
1392 lineThickProp = new wxFloatProperty(wxT("Line Thickness"));
1393 lineThickProp->SetEditor(wxPG_EDITOR(SpinCtrl));
1394 lineThickProp->SetAttribute(wxT("Min"), wxVariant(0.01));
1395
1396 wxPGChoices choices;
1397 choices.Add(wxT("millimetres"), 1);
1398 choices.Add(wxT("inches"), 2);
1399 lineThickUnitProp = new wxEnumProperty(
1400 wxT("Unit"), wxPG_LABEL, choices,
1401 static_cast<int>(1));
1402
1403 pg->Append(lineThickProp);
1404 pg->AppendIn(lineThickProp, lineThickUnitProp);
1405
1406 lineThickProp->SetValue(wxVariant());
1407 /*if (!pg->HideProperty(lineThickUnitProp, true))
1408 {
1409 return;
1410 }*/
1411
1412 pid = pg->Append( new wxFloatProperty( wxT("FloatProperty"),
1413 wxPG_LABEL,
1414 1234500.23 ) );
1415
1416 // A string property that can be edited in a separate editor dialog.
1417 pg->Append( new wxLongStringProperty( wxT("LongStringProperty"), wxT("LongStringProp"),
1418 wxT("This is much longer string than the first one. Edit it by clicking the button.") ) );
1419
1420 // A property that edits a wxArrayString.
1421 wxArrayString example_array;
1422 example_array.Add( wxT("String 1"));
1423 example_array.Add( wxT("String 2"));
1424 example_array.Add( wxT("String 3"));
1425 pg->Append( new wxArrayStringProperty( wxT("ArrayStringProperty"), wxPG_LABEL,
1426 example_array) );
1427
1428 // Test adding same category multiple times ( should not actually create a new one )
1429 //pg->Append( new wxPropertyCategory(wxT("Examples (low priority)"),wxT("Examples")) );
1430
1431 // A file selector property. Note that argument between name
1432 // and initial value is wildcard (format same as in wxFileDialog).
1433 wxPGProperty* prop = new wxFileProperty( wxT("FileProperty"), wxT("TextFile") );
1434 pg->Append( prop );
1435
1436 prop->SetAttribute(wxPG_FILE_WILDCARD,wxT("Text Files (*.txt)|*.txt"));
1437 prop->SetAttribute(wxPG_FILE_DIALOG_TITLE,wxT("Custom File Dialog Title"));
1438 prop->SetAttribute(wxPG_FILE_SHOW_FULL_PATH,false);
1439
1440 #ifdef __WXMSW__
1441 prop->SetAttribute(wxPG_FILE_SHOW_RELATIVE_PATH,wxT("C:\\Windows"));
1442 pg->SetPropertyValue(prop,wxT("C:\\Windows\\System32\\msvcrt71.dll"));
1443 #endif
1444
1445 #if wxUSE_IMAGE
1446 // An image file property. Arguments are just like for FileProperty, but
1447 // wildcard is missing (it is autogenerated from supported image formats).
1448 // If you really need to override it, create property separately, and call
1449 // its SetWildcard method.
1450 pg->Append( new wxImageFileProperty( wxT("ImageFile"), wxPG_LABEL ) );
1451 #endif
1452
1453 pid = pg->Append( new wxColourProperty(wxT("ColourProperty"),wxPG_LABEL,*wxRED) );
1454 //pg->SetPropertyAttribute(pid,wxPG_COLOUR_ALLOW_CUSTOM,false);
1455 pg->SetPropertyEditor( wxT("ColourProperty"), wxPG_EDITOR(ComboBox) );
1456 pg->GetProperty(wxT("ColourProperty"))->SetFlag(wxPG_PROP_AUTO_UNSPECIFIED);
1457 pg->SetPropertyHelpString( wxT("ColourProperty"),
1458 wxT("wxPropertyGrid::SetPropertyEditor method has been used to change ")
1459 wxT("editor of this property to wxPG_EDITOR(ComboBox)"));
1460
1461 //
1462 // This demonstrates using alternative editor for colour property
1463 // to trigger colour dialog directly from button.
1464 pg->Append( new wxColourProperty(wxT("ColourProperty2"),wxPG_LABEL,*wxGREEN) );
1465
1466 //
1467 // wxEnumProperty does not store strings or even list of strings
1468 // ( so that's why they are static in function ).
1469 static const wxChar* enum_prop_labels[] = { wxT("One Item"),
1470 wxT("Another Item"), wxT("One More"), wxT("This Is Last"), NULL };
1471
1472 // this value array would be optional if values matched string indexes
1473 static long enum_prop_values[] = { 40, 80, 120, 160 };
1474
1475 // note that the initial value (the last argument) is the actual value,
1476 // not index or anything like that. Thus, our value selects "Another Item".
1477 //
1478 // 0 before value is number of items. If it is 0, like in our example,
1479 // number of items is calculated, and this requires that the string pointer
1480 // array is terminated with NULL.
1481 pg->Append( new wxEnumProperty(wxT("EnumProperty"),wxPG_LABEL,
1482 enum_prop_labels, enum_prop_values, 80 ) );
1483
1484 wxPGChoices soc;
1485
1486 // use basic table from our previous example
1487 // can also set/add wxArrayStrings and wxArrayInts directly.
1488 soc.Set( enum_prop_labels, enum_prop_values );
1489
1490 // add extra items
1491 soc.Add( wxT("Look, it continues"), 200 );
1492 soc.Add( wxT("Even More"), 240 );
1493 soc.Add( wxT("And More"), 280 );
1494 soc.Add( wxT("True End of the List"), 320 );
1495
1496 // Test custom colours ([] operator of wxPGChoices returns
1497 // references to wxPGChoiceEntry).
1498 soc[1].SetFgCol(*wxRED);
1499 soc[1].SetBgCol(*wxLIGHT_GREY);
1500 soc[2].SetFgCol(*wxGREEN);
1501 soc[2].SetBgCol(*wxLIGHT_GREY);
1502 soc[3].SetFgCol(*wxBLUE);
1503 soc[3].SetBgCol(*wxLIGHT_GREY);
1504 soc[4].SetBitmap(wxArtProvider::GetBitmap(wxART_FOLDER));
1505
1506 pg->Append( new wxEnumProperty(wxT("EnumProperty 2"),
1507 wxPG_LABEL,
1508 soc,
1509 240) );
1510 pg->AddPropertyChoice(wxT("EnumProperty 2"),wxT("Testing Extra"),360);
1511
1512 // Add a second time to test that the caching works
1513 pg->Append( new wxEnumProperty(wxT("EnumProperty 3"),wxPG_LABEL,
1514 soc, 360 ) );
1515 pg->SetPropertyHelpString(wxT("EnumProperty 3"),
1516 wxT("Should have same choices as EnumProperty 2"));
1517
1518 pg->Append( new wxEnumProperty(wxT("EnumProperty 4"),wxPG_LABEL,
1519 soc, 240 ) );
1520 pg->SetPropertyHelpString(wxT("EnumProperty 4"),
1521 wxT("Should have same choices as EnumProperty 2"));
1522
1523 pg->Append( new wxEnumProperty(wxT("EnumProperty 5"),wxPG_LABEL,
1524 soc, 240 ) );
1525 pg->SetPropertyChoicesExclusive(wxT("EnumProperty 5"));
1526 pg->AddPropertyChoice(wxT("EnumProperty 5"),wxT("5th only"),360);
1527 pg->SetPropertyHelpString(wxT("EnumProperty 5"),
1528 wxT("Should have one extra item when compared to EnumProperty 4"));
1529
1530 // Password property example.
1531 pg->Append( new wxStringProperty(wxT("Password"),wxPG_LABEL, wxT("password")) );
1532 pg->SetPropertyAttribute( wxT("Password"), wxPG_STRING_PASSWORD, true );
1533 pg->SetPropertyHelpString( wxT("Password"),
1534 wxT("Has attribute wxPG_STRING_PASSWORD set to true") );
1535
1536 // String editor with dir selector button. Uses wxEmptyString as name, which
1537 // is allowed (naturally, in this case property cannot be accessed by name).
1538 pg->Append( new wxDirProperty( wxT("DirProperty"), wxPG_LABEL, ::wxGetUserHome()) );
1539 pg->SetPropertyAttribute( wxT("DirProperty"),
1540 wxPG_DIR_DIALOG_MESSAGE,
1541 wxT("This is a custom dir dialog message") );
1542
1543 // Add string property - first arg is label, second name, and third initial value
1544 pg->Append( new wxStringProperty ( wxT("StringProperty"), wxPG_LABEL ) );
1545 pg->SetPropertyMaxLength( wxT("StringProperty"), 6 );
1546 pg->SetPropertyHelpString( wxT("StringProperty"),
1547 wxT("Max length of this text has been limited to 6, using wxPropertyGrid::SetPropertyMaxLength.") );
1548
1549 // Set value after limiting so that it will be applied
1550 pg->SetPropertyValue( wxT("StringProperty"), wxT("some text") );
1551
1552
1553 // this value array would be optional if values matched string indexes
1554 //long flags_prop_values[] = { wxICONIZE, wxCAPTION, wxMINIMIZE_BOX, wxMAXIMIZE_BOX };
1555
1556 //pg->Append( wxFlagsProperty(wxT("Example of FlagsProperty"),wxT("FlagsProp"),
1557 // flags_prop_labels, flags_prop_values, 0, GetWindowStyle() ) );
1558
1559
1560 // Multi choice dialog.
1561 wxArrayString tchoices;
1562 tchoices.Add(wxT("Cabbage"));
1563 tchoices.Add(wxT("Carrot"));
1564 tchoices.Add(wxT("Onion"));
1565 tchoices.Add(wxT("Potato"));
1566 tchoices.Add(wxT("Strawberry"));
1567
1568 wxArrayString tchoicesValues;
1569 tchoicesValues.Add(wxT("Carrot"));
1570 tchoicesValues.Add(wxT("Potato"));
1571
1572 pg->Append( new wxEnumProperty(wxT("EnumProperty X"),wxPG_LABEL, tchoices ) );
1573
1574 pg->Append( new wxMultiChoiceProperty( wxT("MultiChoiceProperty"), wxPG_LABEL,
1575 tchoices, tchoicesValues ) );
1576 pg->SetPropertyAttribute( wxT("MultiChoiceProperty"), wxT("UserStringMode"), true );
1577
1578 pg->Append( new wxSizeProperty( wxT("SizeProperty"), wxT("Size"), GetSize() ) );
1579 pg->Append( new wxPointProperty( wxT("PointProperty"), wxT("Position"), GetPosition() ) );
1580
1581
1582 // UInt samples
1583 pg->Append( new wxUIntProperty( wxT("UIntProperty"), wxPG_LABEL, wxULongLong(wxULL(0xFEEEFEEEFEEE))));
1584 pg->SetPropertyAttribute( wxT("UIntProperty"), wxPG_UINT_PREFIX, wxPG_PREFIX_NONE );
1585 pg->SetPropertyAttribute( wxT("UIntProperty"), wxPG_UINT_BASE, wxPG_BASE_HEX );
1586 //pg->SetPropertyAttribute( wxT("UIntProperty"), wxPG_UINT_PREFIX, wxPG_PREFIX_NONE );
1587 //pg->SetPropertyAttribute( wxT("UIntProperty"), wxPG_UINT_BASE, wxPG_BASE_OCT );
1588
1589 //
1590 // wxEditEnumProperty
1591 wxPGChoices eech;
1592 eech.Add(wxT("Choice 1"));
1593 eech.Add(wxT("Choice 2"));
1594 eech.Add(wxT("Choice 3"));
1595 pg->Append( new wxEditEnumProperty(wxT("EditEnumProperty"), wxPG_LABEL, eech) ); // , wxT("Choice 2")
1596
1597 //wxString v_;
1598 //wxTextValidator validator1(wxFILTER_NUMERIC,&v_);
1599 //pg->SetPropertyValidator( wxT("EditEnumProperty"), validator1 );
1600
1601 #if wxUSE_DATETIME
1602 //
1603 // wxDateTimeProperty
1604 pg->Append( new wxDateProperty(wxT("DateProperty"), wxPG_LABEL, wxDateTime::Now() ) );
1605
1606 #if wxUSE_DATEPICKCTRL
1607 pg->SetPropertyAttribute( wxT("DateProperty"), wxPG_DATE_PICKER_STYLE,
1608 (long)(wxDP_DROPDOWN | wxDP_SHOWCENTURY) );
1609
1610 pg->SetPropertyHelpString( wxT("DateProperty"),
1611 wxT("Attribute wxPG_DATE_PICKER_STYLE has been set to (long)(wxDP_DROPDOWN | wxDP_SHOWCENTURY).")
1612 wxT("Also note that wxPG_ALLOW_WXADV needs to be defined inorder to use wxDatePickerCtrl.") );
1613 #endif
1614
1615 #endif
1616
1617 //
1618 // Add Triangle properties as both wxTriangleProperty and
1619 // a generic parent property (using wxStringProperty).
1620 //
1621 wxPGProperty* topId = pg->Append( new wxStringProperty(wxT("3D Object"), wxPG_LABEL, wxT("<composed>")) );
1622
1623 pid = pg->AppendIn( topId, new wxStringProperty(wxT("Triangle 1"), wxT("Triangle 1"), wxT("<composed>")) );
1624 pg->AppendIn( pid, new wxVectorProperty( wxT("A"), wxPG_LABEL ) );
1625 pg->AppendIn( pid, new wxVectorProperty( wxT("B"), wxPG_LABEL ) );
1626 pg->AppendIn( pid, new wxVectorProperty( wxT("C"), wxPG_LABEL ) );
1627
1628 pg->AppendIn( topId, new wxTriangleProperty( wxT("Triangle 2"), wxT("Triangle 2") ) );
1629
1630 pg->SetPropertyHelpString( wxT("3D Object"),
1631 wxT("3D Object is wxStringProperty with value \"<composed>\". Two of its children are similar wxStringProperties with ")
1632 wxT("three wxVectorProperty children, and other two are custom wxTriangleProperties.") );
1633
1634 pid = pg->AppendIn( topId, new wxStringProperty(wxT("Triangle 3"), wxT("Triangle 3"), wxT("<composed>")) );
1635 pg->AppendIn( pid, new wxVectorProperty( wxT("A"), wxPG_LABEL ) );
1636 pg->AppendIn( pid, new wxVectorProperty( wxT("B"), wxPG_LABEL ) );
1637 pg->AppendIn( pid, new wxVectorProperty( wxT("C"), wxPG_LABEL ) );
1638
1639 pg->AppendIn( topId, new wxTriangleProperty( wxT("Triangle 4"), wxT("Triangle 4") ) );
1640
1641 //
1642 // This snippet is a doc sample test
1643 //
1644 pid = pg->Append( new wxStringProperty(wxT("Car"),wxPG_LABEL,wxT("<composed>")) );
1645
1646 pg->AppendIn( pid, new wxStringProperty(wxT("Model"),
1647 wxPG_LABEL,
1648 wxT("Lamborghini Diablo SV")) );
1649
1650 pg->AppendIn( pid, new wxIntProperty(wxT("Engine Size (cc)"),
1651 wxPG_LABEL,
1652 5707) );
1653
1654 wxPGProperty* speedId = pg->AppendIn( pid, new wxStringProperty(wxT("Speeds"),wxPG_LABEL,wxT("<composed>")) );
1655 pg->AppendIn( speedId, new wxIntProperty(wxT("Max. Speed (mph)"),wxPG_LABEL,290) );
1656 pg->AppendIn( speedId, new wxFloatProperty(wxT("0-100 mph (sec)"),wxPG_LABEL,3.9) );
1657 pg->AppendIn( speedId, new wxFloatProperty(wxT("1/4 mile (sec)"),wxPG_LABEL,8.6) );
1658
1659 pg->AppendIn( pid, new wxIntProperty(wxT("Price ($)"),
1660 wxPG_LABEL,
1661 300000) );
1662
1663 // Make sure the child properties can be accessed correctly
1664 pg->SetPropertyValue( wxT("Car.Speeds.Max. Speed (mph)"), 300 );
1665
1666 // Displayed value of "Car" property is now:
1667 // "Lamborghini Diablo SV; [300; 3.9; 8.6]; 300000"
1668
1669 //
1670 // Test wxSampleMultiButtonEditor
1671 wxPGRegisterEditorClass( SampleMultiButtonEditor );
1672 pg->Append( new wxLongStringProperty(wxT("MultipleButtons"), wxPG_LABEL) );
1673 pg->SetPropertyEditor(wxT("MultipleButtons"), wxPG_EDITOR(SampleMultiButtonEditor) );
1674
1675 // Test SingleChoiceProperty
1676 pg->Append( new SingleChoiceProperty(wxT("SingleChoiceProperty")) );
1677
1678
1679 //
1680 // Test adding variable height bitmaps in wxPGChoices
1681 wxPGChoices bc;
1682
1683 bc.Add(wxT("Wee"), wxBitmap(16, 16));
1684 bc.Add(wxT("Not so wee"), wxBitmap(32, 32));
1685 bc.Add(wxT("Friggin' huge"), wxBitmap(64, 64));
1686
1687 pg->Append( new wxEnumProperty(wxT("Variable Height Bitmaps"),
1688 wxPG_LABEL,
1689 bc,
1690 0) );
1691
1692 //
1693 // Test how non-editable composite strings appear
1694 pid = pg->Append( new wxStringProperty(wxT("wxWidgets Traits"), wxPG_LABEL, wxT("<composed>")) );
1695 pg->SetPropertyReadOnly(pid);
1696
1697 pg->AppendIn(pid, new wxStringProperty(wxT("Latest Release"), wxPG_LABEL, wxT("2.8.8")) );
1698 pg->AppendIn(pid, new wxBoolProperty(wxT("Win API"), wxPG_LABEL, true) );
1699 pg->AppendIn(pid, new wxBoolProperty(wxT("QT"), wxPG_LABEL, false) );
1700 pg->AppendIn(pid, new wxBoolProperty(wxT("Cocoa"), wxPG_LABEL, true) );
1701 pg->AppendIn(pid, new wxBoolProperty(wxT("BeOS"), wxPG_LABEL, false) );
1702 pg->AppendIn(pid, new wxStringProperty(wxT("SVN Trunk Version"), wxPG_LABEL, wxT("2.9.0")) );
1703 pg->AppendIn(pid, new wxBoolProperty(wxT("GTK+"), wxPG_LABEL, true) );
1704 pg->AppendIn(pid, new wxBoolProperty(wxT("Sky OS"), wxPG_LABEL, false) );
1705 pg->AppendIn(pid, new wxBoolProperty(wxT("QT"), wxPG_LABEL, false) );
1706
1707 AddTestProperties(pg);
1708 }
1709
1710 // -----------------------------------------------------------------------
1711
1712 void FormMain::PopulateWithLibraryConfig ()
1713 {
1714 wxPropertyGridManager* pgman = m_pPropGridManager;
1715 wxPropertyGridPage* pg = pgman->GetPage(wxT("wxWidgets Library Config"));
1716
1717 wxPGProperty* cat;
1718
1719 wxBitmap bmp = wxArtProvider::GetBitmap(wxART_REPORT_VIEW);
1720
1721 wxPGProperty* pid;
1722
1723 #define ADD_WX_LIB_CONF_GROUP(A) \
1724 cat = pg->AppendIn( pid, new wxPropertyCategory(A) ); \
1725 pg->SetPropertyCell( cat, 0, wxPG_LABEL, bmp );
1726
1727 #define ADD_WX_LIB_CONF(A) pg->Append( new wxBoolProperty(wxT(#A),wxPG_LABEL,(bool)((A>0)?true:false)));
1728 #define ADD_WX_LIB_CONF_NODEF(A) pg->Append( new wxBoolProperty(wxT(#A),wxPG_LABEL,(bool)false) ); \
1729 pg->DisableProperty(wxT(#A));
1730
1731 pid = pg->Append( new wxPropertyCategory( wxT("wxWidgets Library Configuration") ) );
1732 pg->SetPropertyCell( pid, 0, wxPG_LABEL, bmp );
1733
1734 ADD_WX_LIB_CONF_GROUP(wxT("Global Settings"))
1735 ADD_WX_LIB_CONF( wxUSE_GUI )
1736
1737 ADD_WX_LIB_CONF_GROUP(wxT("Compatibility Settings"))
1738 #if defined(WXWIN_COMPATIBILITY_2_2)
1739 ADD_WX_LIB_CONF( WXWIN_COMPATIBILITY_2_2 )
1740 #endif
1741 #if defined(WXWIN_COMPATIBILITY_2_4)
1742 ADD_WX_LIB_CONF( WXWIN_COMPATIBILITY_2_4 )
1743 #endif
1744 #if defined(WXWIN_COMPATIBILITY_2_6)
1745 ADD_WX_LIB_CONF( WXWIN_COMPATIBILITY_2_6 )
1746 #endif
1747 #if defined(WXWIN_COMPATIBILITY_2_8)
1748 ADD_WX_LIB_CONF( WXWIN_COMPATIBILITY_2_8 )
1749 #endif
1750 #ifdef wxFONT_SIZE_COMPATIBILITY
1751 ADD_WX_LIB_CONF( wxFONT_SIZE_COMPATIBILITY )
1752 #else
1753 ADD_WX_LIB_CONF_NODEF ( wxFONT_SIZE_COMPATIBILITY )
1754 #endif
1755 #ifdef wxDIALOG_UNIT_COMPATIBILITY
1756 ADD_WX_LIB_CONF( wxDIALOG_UNIT_COMPATIBILITY )
1757 #else
1758 ADD_WX_LIB_CONF_NODEF ( wxDIALOG_UNIT_COMPATIBILITY )
1759 #endif
1760
1761 ADD_WX_LIB_CONF_GROUP(wxT("Debugging Settings"))
1762 ADD_WX_LIB_CONF( wxUSE_DEBUG_CONTEXT )
1763 ADD_WX_LIB_CONF( wxUSE_MEMORY_TRACING )
1764 ADD_WX_LIB_CONF( wxUSE_GLOBAL_MEMORY_OPERATORS )
1765 ADD_WX_LIB_CONF( wxUSE_DEBUG_NEW_ALWAYS )
1766 ADD_WX_LIB_CONF( wxUSE_ON_FATAL_EXCEPTION )
1767
1768 ADD_WX_LIB_CONF_GROUP(wxT("Unicode Support"))
1769 ADD_WX_LIB_CONF( wxUSE_UNICODE )
1770 ADD_WX_LIB_CONF( wxUSE_UNICODE_MSLU )
1771 ADD_WX_LIB_CONF( wxUSE_WCHAR_T )
1772
1773 ADD_WX_LIB_CONF_GROUP(wxT("Global Features"))
1774 ADD_WX_LIB_CONF( wxUSE_EXCEPTIONS )
1775 ADD_WX_LIB_CONF( wxUSE_EXTENDED_RTTI )
1776 ADD_WX_LIB_CONF( wxUSE_STL )
1777 ADD_WX_LIB_CONF( wxUSE_LOG )
1778 ADD_WX_LIB_CONF( wxUSE_LOGWINDOW )
1779 ADD_WX_LIB_CONF( wxUSE_LOGGUI )
1780 ADD_WX_LIB_CONF( wxUSE_LOG_DIALOG )
1781 ADD_WX_LIB_CONF( wxUSE_CMDLINE_PARSER )
1782 ADD_WX_LIB_CONF( wxUSE_THREADS )
1783 ADD_WX_LIB_CONF( wxUSE_STREAMS )
1784 ADD_WX_LIB_CONF( wxUSE_STD_IOSTREAM )
1785
1786 ADD_WX_LIB_CONF_GROUP(wxT("Non-GUI Features"))
1787 ADD_WX_LIB_CONF( wxUSE_LONGLONG )
1788 ADD_WX_LIB_CONF( wxUSE_FILE )
1789 ADD_WX_LIB_CONF( wxUSE_FFILE )
1790 ADD_WX_LIB_CONF( wxUSE_FSVOLUME )
1791 ADD_WX_LIB_CONF( wxUSE_TEXTBUFFER )
1792 ADD_WX_LIB_CONF( wxUSE_TEXTFILE )
1793 ADD_WX_LIB_CONF( wxUSE_INTL )
1794 ADD_WX_LIB_CONF( wxUSE_DATETIME )
1795 ADD_WX_LIB_CONF( wxUSE_TIMER )
1796 ADD_WX_LIB_CONF( wxUSE_STOPWATCH )
1797 ADD_WX_LIB_CONF( wxUSE_CONFIG )
1798 #ifdef wxUSE_CONFIG_NATIVE
1799 ADD_WX_LIB_CONF( wxUSE_CONFIG_NATIVE )
1800 #else
1801 ADD_WX_LIB_CONF_NODEF ( wxUSE_CONFIG_NATIVE )
1802 #endif
1803 ADD_WX_LIB_CONF( wxUSE_DIALUP_MANAGER )
1804 ADD_WX_LIB_CONF( wxUSE_DYNLIB_CLASS )
1805 ADD_WX_LIB_CONF( wxUSE_DYNAMIC_LOADER )
1806 ADD_WX_LIB_CONF( wxUSE_SOCKETS )
1807 ADD_WX_LIB_CONF( wxUSE_FILESYSTEM )
1808 ADD_WX_LIB_CONF( wxUSE_FS_ZIP )
1809 ADD_WX_LIB_CONF( wxUSE_FS_INET )
1810 ADD_WX_LIB_CONF( wxUSE_ZIPSTREAM )
1811 ADD_WX_LIB_CONF( wxUSE_ZLIB )
1812 ADD_WX_LIB_CONF( wxUSE_APPLE_IEEE )
1813 ADD_WX_LIB_CONF( wxUSE_JOYSTICK )
1814 ADD_WX_LIB_CONF( wxUSE_FONTMAP )
1815 ADD_WX_LIB_CONF( wxUSE_MIMETYPE )
1816 ADD_WX_LIB_CONF( wxUSE_PROTOCOL )
1817 ADD_WX_LIB_CONF( wxUSE_PROTOCOL_FILE )
1818 ADD_WX_LIB_CONF( wxUSE_PROTOCOL_FTP )
1819 ADD_WX_LIB_CONF( wxUSE_PROTOCOL_HTTP )
1820 ADD_WX_LIB_CONF( wxUSE_URL )
1821 #ifdef wxUSE_URL_NATIVE
1822 ADD_WX_LIB_CONF( wxUSE_URL_NATIVE )
1823 #else
1824 ADD_WX_LIB_CONF_NODEF ( wxUSE_URL_NATIVE )
1825 #endif
1826 ADD_WX_LIB_CONF( wxUSE_REGEX )
1827 ADD_WX_LIB_CONF( wxUSE_SYSTEM_OPTIONS )
1828 ADD_WX_LIB_CONF( wxUSE_SOUND )
1829 #ifdef wxUSE_XRC
1830 ADD_WX_LIB_CONF( wxUSE_XRC )
1831 #else
1832 ADD_WX_LIB_CONF_NODEF ( wxUSE_XRC )
1833 #endif
1834 ADD_WX_LIB_CONF( wxUSE_XML )
1835
1836 // Set them to use check box.
1837 pg->SetPropertyAttribute(pid,wxPG_BOOL_USE_CHECKBOX,true,wxPG_RECURSE);
1838 }
1839
1840
1841 //
1842 // Handle events of the third page here.
1843 class wxMyPropertyGridPage : public wxPropertyGridPage
1844 {
1845 public:
1846
1847 // Return false here to indicate unhandled events should be
1848 // propagated to manager's parent, as normal.
1849 virtual bool IsHandlingAllEvents() const { return false; }
1850
1851 protected:
1852
1853 virtual wxPGProperty* DoInsert( wxPGProperty* parent,
1854 int index,
1855 wxPGProperty* property )
1856 {
1857 return wxPropertyGridPage::DoInsert(parent,index,property);
1858 }
1859
1860 void OnPropertySelect( wxPropertyGridEvent& event );
1861 void OnPropertyChanging( wxPropertyGridEvent& event );
1862 void OnPropertyChange( wxPropertyGridEvent& event );
1863 void OnPageChange( wxPropertyGridEvent& event );
1864
1865 private:
1866 DECLARE_EVENT_TABLE()
1867 };
1868
1869
1870 BEGIN_EVENT_TABLE(wxMyPropertyGridPage, wxPropertyGridPage)
1871 EVT_PG_SELECTED( wxID_ANY, wxMyPropertyGridPage::OnPropertySelect )
1872 EVT_PG_CHANGING( wxID_ANY, wxMyPropertyGridPage::OnPropertyChanging )
1873 EVT_PG_CHANGED( wxID_ANY, wxMyPropertyGridPage::OnPropertyChange )
1874 EVT_PG_PAGE_CHANGED( wxID_ANY, wxMyPropertyGridPage::OnPageChange )
1875 END_EVENT_TABLE()
1876
1877
1878 void wxMyPropertyGridPage::OnPropertySelect( wxPropertyGridEvent& WXUNUSED(event) )
1879 {
1880 wxLogDebug(wxT("wxMyPropertyGridPage::OnPropertySelect()"));
1881 }
1882
1883 void wxMyPropertyGridPage::OnPropertyChange( wxPropertyGridEvent& event )
1884 {
1885 wxPGProperty* p = event.GetProperty();
1886 wxLogDebug(wxT("wxMyPropertyGridPage::OnPropertyChange('%s', to value '%s')"),
1887 p->GetName().c_str(),
1888 p->GetDisplayedString().c_str());
1889 }
1890
1891 void wxMyPropertyGridPage::OnPropertyChanging( wxPropertyGridEvent& event )
1892 {
1893 wxPGProperty* p = event.GetProperty();
1894 wxLogDebug(wxT("wxMyPropertyGridPage::OnPropertyChanging('%s', to value '%s')"),
1895 p->GetName().c_str(),
1896 event.GetValue().GetString().c_str());
1897 }
1898
1899 void wxMyPropertyGridPage::OnPageChange( wxPropertyGridEvent& WXUNUSED(event) )
1900 {
1901 wxLogDebug(wxT("wxMyPropertyGridPage::OnPageChange()"));
1902 }
1903
1904
1905 class wxPGKeyHandler : public wxEvtHandler
1906 {
1907 public:
1908
1909 void OnKeyEvent( wxKeyEvent& event )
1910 {
1911 wxMessageBox(wxString::Format(wxT("%i"),event.GetKeyCode()));
1912 event.Skip();
1913 }
1914 private:
1915 DECLARE_EVENT_TABLE()
1916 };
1917
1918 BEGIN_EVENT_TABLE(wxPGKeyHandler,wxEvtHandler)
1919 EVT_KEY_DOWN( wxPGKeyHandler::OnKeyEvent )
1920 END_EVENT_TABLE()
1921
1922
1923 // -----------------------------------------------------------------------
1924
1925 void FormMain::InitPanel()
1926 {
1927 if ( m_panel )
1928 m_panel->Destroy();
1929
1930 wxWindow* panel = new wxPanel(this,-1,wxPoint(0,0),wxSize(400,400));
1931 m_panel = panel;
1932
1933 // Column
1934 wxBoxSizer* topSizer = new wxBoxSizer ( wxVERTICAL );
1935
1936 m_topSizer = topSizer;
1937 }
1938
1939 void FormMain::FinalizePanel( bool wasCreated )
1940 {
1941 m_panel->SetSizer( m_topSizer );
1942 m_topSizer->SetSizeHints( m_panel );
1943
1944 wxBoxSizer* panelSizer = new wxBoxSizer( wxHORIZONTAL );
1945 panelSizer->Add( m_panel, 1, wxEXPAND|wxFIXED_MINSIZE );
1946 SetSizer( panelSizer );
1947 panelSizer->SetSizeHints( this );
1948
1949 if ( wasCreated )
1950 {
1951 SetSize(
1952 (wxSystemSettings::GetMetric(wxSYS_SCREEN_X)/10)*4,
1953 (wxSystemSettings::GetMetric(wxSYS_SCREEN_Y)/10)*8
1954 );
1955 Centre();
1956 }
1957 }
1958
1959 void FormMain::PopulateGrid()
1960 {
1961 wxPropertyGridManager* pgman = m_pPropGridManager;
1962 pgman->AddPage(wxT("Standard Items"));
1963
1964 PopulateWithStandardItems();
1965
1966 pgman->AddPage(wxT("wxWidgets Library Config"));
1967
1968 PopulateWithLibraryConfig();
1969
1970 wxPropertyGridPage* myPage = new wxMyPropertyGridPage();
1971 myPage->Append( new wxIntProperty ( wxT("IntProperty"), wxPG_LABEL, 12345678 ) );
1972
1973 // Use wxMyPropertyGridPage (see above) to test the
1974 // custom wxPropertyGridPage feature.
1975 pgman->AddPage(wxT("Examples"),wxNullBitmap,myPage);
1976
1977 PopulateWithExamples();
1978 }
1979
1980 void FormMain::CreateGrid( int style, int extraStyle )
1981 {
1982 //
1983 // This function (re)creates the property grid in our sample
1984 //
1985
1986 if ( style == -1 )
1987 style = // default style
1988 wxPG_BOLD_MODIFIED |
1989 wxPG_SPLITTER_AUTO_CENTER |
1990 wxPG_AUTO_SORT |
1991 //wxPG_HIDE_MARGIN|wxPG_STATIC_SPLITTER |
1992 //wxPG_TOOLTIPS |
1993 //wxPG_HIDE_CATEGORIES |
1994 //wxPG_LIMITED_EDITING |
1995 wxTAB_TRAVERSAL |
1996 wxPG_TOOLBAR |
1997 wxPG_DESCRIPTION;
1998
1999 if ( extraStyle == -1 )
2000 // default extra style
2001 extraStyle = wxPG_EX_MODE_BUTTONS;
2002 //| wxPG_EX_AUTO_UNSPECIFIED_VALUES
2003 //| wxPG_EX_GREY_LABEL_WHEN_DISABLED
2004 //| wxPG_EX_NATIVE_DOUBLE_BUFFERING
2005 //| wxPG_EX_HELP_AS_TOOLTIPS
2006
2007 bool wasCreated = m_panel ? false : true;
2008
2009 InitPanel();
2010
2011 //
2012 // This shows how to combine two static choice descriptors
2013 m_combinedFlags.Add( _fs_windowstyle_labels, _fs_windowstyle_values );
2014 m_combinedFlags.Add( _fs_framestyle_labels, _fs_framestyle_values );
2015
2016 wxPropertyGridManager* pgman = m_pPropGridManager =
2017 new wxPropertyGridManager(m_panel,
2018 // Don't change this into wxID_ANY in the sample, or the
2019 // event handling will obviously be broken.
2020 PGID, /*wxID_ANY*/
2021 wxDefaultPosition,
2022 wxDefaultSize,
2023 style );
2024
2025 m_propGrid = pgman->GetGrid();
2026
2027 pgman->SetExtraStyle(extraStyle);
2028
2029 m_pPropGridManager->SetValidationFailureBehavior( wxPG_VFB_BEEP | wxPG_VFB_MARK_CELL | wxPG_VFB_SHOW_MESSAGE );
2030
2031 m_pPropGridManager->GetGrid()->SetVerticalSpacing( 2 );
2032
2033 PopulateGrid();
2034
2035 // Change some attributes in all properties
2036 //pgman->SetPropertyAttributeAll(wxPG_BOOL_USE_DOUBLE_CLICK_CYCLING,true);
2037 //pgman->SetPropertyAttributeAll(wxPG_BOOL_USE_CHECKBOX,true);
2038
2039 //m_pPropGridManager->SetSplitterLeft(true);
2040 //m_pPropGridManager->SetSplitterPosition(137);
2041
2042 /*
2043 // This would setup event handling without event table entries
2044 Connect(m_pPropGridManager->GetId(), wxEVT_PG_SELECTED,
2045 (wxObjectEventFunction) (wxEventFunction) (wxPropertyGridEventFunction)
2046 &FormMain::OnPropertyGridSelect );
2047 Connect(m_pPropGridManager->GetId(), wxEVT_PG_CHANGED,
2048 (wxObjectEventFunction) (wxEventFunction) (wxPropertyGridEventFunction)
2049 &FormMain::OnPropertyGridChange );
2050 */
2051
2052 m_topSizer->Add( m_pPropGridManager, 1, wxEXPAND );
2053
2054 FinalizePanel(wasCreated);
2055 }
2056
2057 // -----------------------------------------------------------------------
2058
2059 FormMain::FormMain(const wxString& title, const wxPoint& pos, const wxSize& size) :
2060 wxFrame((wxFrame *)NULL, -1, title, pos, size,
2061 (wxMINIMIZE_BOX|wxMAXIMIZE_BOX|wxRESIZE_BORDER|wxSYSTEM_MENU|wxCAPTION|
2062 wxTAB_TRAVERSAL|wxCLOSE_BOX|wxNO_FULL_REPAINT_ON_RESIZE) )
2063 {
2064 m_propGrid = NULL;
2065 m_panel = NULL;
2066
2067 #ifdef __WXMAC__
2068 // we need this in order to allow the about menu relocation, since ABOUT is
2069 // not the default id of the about menu
2070 wxApp::s_macAboutMenuItemId = ID_ABOUT;
2071 #endif
2072
2073 #if wxUSE_IMAGE
2074 // This is here to really test the wxImageFileProperty.
2075 wxInitAllImageHandlers();
2076 #endif
2077
2078 CreateGrid( // style
2079 wxPG_BOLD_MODIFIED |
2080 wxPG_SPLITTER_AUTO_CENTER |
2081 wxPG_AUTO_SORT |
2082 //wxPG_HIDE_MARGIN|wxPG_STATIC_SPLITTER |
2083 //wxPG_TOOLTIPS |
2084 //wxPG_HIDE_CATEGORIES |
2085 //wxPG_LIMITED_EDITING |
2086 wxTAB_TRAVERSAL |
2087 wxPG_TOOLBAR |
2088 wxPG_DESCRIPTION,
2089 // extra style
2090 wxPG_EX_MODE_BUTTONS
2091 //| wxPG_EX_AUTO_UNSPECIFIED_VALUES
2092 //| wxPG_EX_GREY_LABEL_WHEN_DISABLED
2093 //| wxPG_EX_NATIVE_DOUBLE_BUFFERING
2094 //| wxPG_EX_HELP_AS_TOOLTIPS
2095 );
2096
2097 // Register all editors (SpinCtrl etc.)
2098 m_pPropGridManager->RegisterAdditionalEditors();
2099
2100 //
2101 // Create menubar
2102 wxMenu *menuFile = new wxMenu(wxEmptyString, wxMENU_TEAROFF);
2103 wxMenu *menuTry = new wxMenu;
2104 wxMenu *menuTools1 = new wxMenu;
2105 wxMenu *menuTools2 = new wxMenu;
2106 wxMenu *menuHelp = new wxMenu;
2107
2108 menuHelp->Append(ID_ABOUT, wxT("&About..."), wxT("Show about dialog") );
2109
2110 menuTools1->Append(ID_APPENDPROP, wxT("Append New Property") );
2111 menuTools1->Append(ID_APPENDCAT, wxT("Append New Category\tCtrl-S") );
2112 menuTools1->AppendSeparator();
2113 menuTools1->Append(ID_INSERTPROP, wxT("Insert New Property\tCtrl-Q") );
2114 menuTools1->Append(ID_INSERTCAT, wxT("Insert New Category\tCtrl-W") );
2115 menuTools1->AppendSeparator();
2116 menuTools1->Append(ID_DELETE, wxT("Delete Selected") );
2117 menuTools1->Append(ID_DELETER, wxT("Delete Random") );
2118 menuTools1->Append(ID_DELETEALL, wxT("Delete All") );
2119 menuTools1->AppendSeparator();
2120 menuTools1->Append(ID_SETCOLOUR, wxT("Set Bg Colour") );
2121 menuTools1->Append(ID_UNSPECIFY, wxT("Set to Unspecified") );
2122 menuTools1->Append(ID_CLEAR, wxT("Set Value to Default") );
2123 menuTools1->AppendSeparator();
2124 m_itemEnable = menuTools1->Append(ID_ENABLE, wxT("Enable"),
2125 wxT("Toggles item's enabled state.") );
2126 m_itemEnable->Enable( FALSE );
2127 menuTools1->Append(ID_HIDE, wxT("Hide"), wxT("Shows or hides a property") );
2128
2129 menuTools2->Append(ID_ITERATE1, wxT("Iterate Over Properties") );
2130 menuTools2->Append(ID_ITERATE2, wxT("Iterate Over Visible Items") );
2131 menuTools2->Append(ID_ITERATE3, wxT("Reverse Iterate Over Properties") );
2132 menuTools2->Append(ID_ITERATE4, wxT("Iterate Over Categories") );
2133 menuTools2->AppendSeparator();
2134 menuTools2->Append(ID_SETPROPERTYVALUE, wxT("Set Property Value") );
2135 menuTools2->Append(ID_CLEARMODIF, wxT("Clear Modified Status"), wxT("Clears wxPG_MODIFIED flag from all properties.") );
2136 menuTools2->AppendSeparator();
2137 m_itemFreeze = menuTools2->AppendCheckItem(ID_FREEZE, wxT("Freeze"),
2138 wxT("Disables painting, auto-sorting, etc.") );
2139 menuTools2->AppendSeparator();
2140 menuTools2->Append(ID_DUMPLIST, wxT("Display Values as wxVariant List"), wxT("Tests GetAllValues method and wxVariant conversion.") );
2141 menuTools2->AppendSeparator();
2142 menuTools2->Append(ID_GETVALUES, wxT("Get Property Values"), wxT("Stores all property values.") );
2143 menuTools2->Append(ID_SETVALUES, wxT("Set Property Values"), wxT("Reverts property values to those last stored.") );
2144 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).") );
2145 menuTools2->AppendSeparator();
2146 menuTools2->Append(ID_SAVESTATE, wxT("Save Editable State") );
2147 menuTools2->Append(ID_RESTORESTATE, wxT("Restore Editable State") );
2148 menuTools2->AppendSeparator();
2149 menuTools2->Append(ID_ENABLECOMMONVALUES, wxT("Enable Common Value"),
2150 wxT("Enable values that are common to all properties, for selected property."));
2151 menuTools2->AppendSeparator();
2152 menuTools2->Append(ID_COLLAPSE, wxT("Collapse Selected") );
2153 menuTools2->Append(ID_COLLAPSEALL, wxT("Collapse All") );
2154 menuTools2->AppendSeparator();
2155 menuTools2->Append(ID_INSERTPAGE, wxT("Add Page") );
2156 menuTools2->Append(ID_REMOVEPAGE, wxT("Remove Page") );
2157 menuTools2->AppendSeparator();
2158 menuTools2->Append(ID_FITCOLUMNS, wxT("Fit Columns") );
2159 menuTools2->AppendSeparator();
2160 menuTools2->Append(ID_CHANGEFLAGSITEMS, wxT("Change Children of FlagsProp") );
2161 menuTools2->AppendSeparator();
2162 menuTools2->Append(ID_TESTINSERTCHOICE, wxT("Test InsertPropertyChoice") );
2163 menuTools2->Append(ID_TESTDELETECHOICE, wxT("Test DeletePropertyChoice") );
2164 menuTools2->AppendSeparator();
2165 menuTools2->Append(ID_SETSPINCTRLEDITOR, wxT("Use SpinCtrl Editor") );
2166 menuTools2->Append(ID_TESTREPLACE, wxT("Test ReplaceProperty") );
2167
2168 menuTry->Append(ID_SELECTSTYLE, wxT("Set Window Style"),
2169 wxT("Select window style flags used by the grid."));
2170 menuTry->AppendSeparator();
2171 menuTry->AppendRadioItem( ID_COLOURSCHEME1, wxT("Standard Colour Scheme") );
2172 menuTry->AppendRadioItem( ID_COLOURSCHEME2, wxT("White Colour Scheme") );
2173 menuTry->AppendRadioItem( ID_COLOURSCHEME3, wxT(".NET Colour Scheme") );
2174 menuTry->AppendRadioItem( ID_COLOURSCHEME4, wxT("Cream Colour Scheme") );
2175 menuTry->AppendSeparator();
2176 m_itemCatColours = menuTry->AppendCheckItem(ID_CATCOLOURS, wxT("Category Specific Colours"),
2177 wxT("Switches between category-specific cell colours and default scheme (actually done using SetPropertyTextColour and SetPropertyBackgroundColour).") );
2178 menuTry->AppendSeparator();
2179 menuTry->AppendCheckItem(ID_STATICLAYOUT, wxT("Static Layout"),
2180 wxT("Switches between user-modifiedable and static layouts.") );
2181 menuTry->Append(ID_SETCOLUMNS, wxT("Set Number of Columns") );
2182 menuTry->AppendSeparator();
2183 menuTry->Append(ID_TESTXRC, wxT("Display XRC sample") );
2184 menuTry->AppendSeparator();
2185 menuTry->Append(ID_RUNTESTFULL, wxT("Run Tests (full)") );
2186 menuTry->Append(ID_RUNTESTPARTIAL, wxT("Run Tests (fast)") );
2187
2188 menuFile->Append(ID_RUNMINIMAL, wxT("Run Minimal Sample") );
2189 menuFile->AppendSeparator();
2190 menuFile->Append(ID_QUIT, wxT("E&xit\tAlt-X"), wxT("Quit this program") );
2191
2192 // Now append the freshly created menu to the menu bar...
2193 wxMenuBar *menuBar = new wxMenuBar();
2194 menuBar->Append(menuFile, wxT("&File") );
2195 menuBar->Append(menuTry, wxT("&Try These!") );
2196 menuBar->Append(menuTools1, wxT("&Basic") );
2197 menuBar->Append(menuTools2, wxT("&Advanced") );
2198 menuBar->Append(menuHelp, wxT("&Help") );
2199
2200 // ... and attach this menu bar to the frame
2201 SetMenuBar(menuBar);
2202
2203 #if wxUSE_STATUSBAR
2204 // create a status bar
2205 CreateStatusBar(1);
2206 SetStatusText(wxEmptyString);
2207 #endif // wxUSE_STATUSBAR
2208
2209
2210 //
2211 // Finalize
2212 //
2213
2214 SetSize(
2215 (wxSystemSettings::GetMetric(wxSYS_SCREEN_X)/10)*4,
2216 (wxSystemSettings::GetMetric(wxSYS_SCREEN_Y)/10)*8
2217 );
2218 Centre();
2219 }
2220
2221 //
2222 // Normally, wxPropertyGrid does not check whether item with identical
2223 // label already exists. However, since in this sample we use labels for
2224 // identifying properties, we have to be sure not to generate identical
2225 // labels.
2226 //
2227 void GenerateUniquePropertyLabel( wxPropertyGridManager* pg, wxString& baselabel )
2228 {
2229 int count = -1;
2230 wxString newlabel;
2231
2232 if ( pg->GetPropertyByLabel( baselabel ) )
2233 {
2234 for (;;)
2235 {
2236 count++;
2237 newlabel.Printf(wxT("%s%i"),baselabel.c_str(),count);
2238 if ( !pg->GetPropertyByLabel( newlabel ) ) break;
2239 }
2240 }
2241
2242 if ( count >= 0 )
2243 {
2244 baselabel = newlabel;
2245 }
2246 }
2247
2248 // -----------------------------------------------------------------------
2249
2250 void FormMain::OnInsertPropClick( wxCommandEvent& WXUNUSED(event) )
2251 {
2252 wxString propLabel;
2253
2254 if ( !m_pPropGridManager->GetChildrenCount() )
2255 {
2256 wxMessageBox(wxT("No items to relate - first add some with Append."));
2257 return;
2258 }
2259
2260 wxPGProperty* id = m_pPropGridManager->GetGrid()->GetSelection();
2261 if ( !id )
2262 {
2263 wxMessageBox(wxT("First select a property - new one will be inserted right before that."));
2264 return;
2265 }
2266 if ( propLabel.Len() < 1 ) propLabel = wxT("Property");
2267
2268 GenerateUniquePropertyLabel( m_pPropGridManager, propLabel );
2269
2270 m_pPropGridManager->Insert( m_pPropGridManager->GetPropertyParent(id),
2271 m_pPropGridManager->GetPropertyIndex(id),
2272 new wxStringProperty(propLabel) );
2273
2274 }
2275
2276 // -----------------------------------------------------------------------
2277
2278 void FormMain::OnAppendPropClick( wxCommandEvent& WXUNUSED(event) )
2279 {
2280 wxString propLabel;
2281
2282 if ( propLabel.Len() < 1 ) propLabel = wxT("Property");
2283
2284 GenerateUniquePropertyLabel( m_pPropGridManager, propLabel );
2285
2286 m_pPropGridManager->Append( new wxStringProperty(propLabel) );
2287
2288 m_pPropGridManager->Refresh();
2289 }
2290
2291 // -----------------------------------------------------------------------
2292
2293 void FormMain::OnClearClick( wxCommandEvent& WXUNUSED(event) )
2294 {
2295 m_pPropGridManager->GetGrid()->Clear();
2296 }
2297
2298 // -----------------------------------------------------------------------
2299
2300 void FormMain::OnAppendCatClick( wxCommandEvent& WXUNUSED(event) )
2301 {
2302 wxString propLabel;
2303
2304 if ( propLabel.Len() < 1 ) propLabel = wxT("Category");
2305
2306 GenerateUniquePropertyLabel( m_pPropGridManager, propLabel );
2307
2308 m_pPropGridManager->Append( new wxPropertyCategory (propLabel) );
2309
2310 m_pPropGridManager->Refresh();
2311
2312 }
2313
2314 // -----------------------------------------------------------------------
2315
2316 void FormMain::OnInsertCatClick( wxCommandEvent& WXUNUSED(event) )
2317 {
2318 wxString propLabel;
2319
2320 if ( !m_pPropGridManager->GetChildrenCount() )
2321 {
2322 wxMessageBox(wxT("No items to relate - first add some with Append."));
2323 return;
2324 }
2325
2326 wxPGProperty* id = m_pPropGridManager->GetGrid()->GetSelection();
2327 if ( !id )
2328 {
2329 wxMessageBox(wxT("First select a property - new one will be inserted right before that."));
2330 return;
2331 }
2332
2333 if ( propLabel.Len() < 1 ) propLabel = wxT("Category");
2334
2335 GenerateUniquePropertyLabel( m_pPropGridManager, propLabel );
2336
2337 m_pPropGridManager->Insert( m_pPropGridManager->GetPropertyParent(id),
2338 m_pPropGridManager->GetPropertyIndex(id),
2339 new wxPropertyCategory (propLabel) );
2340
2341 }
2342
2343 // -----------------------------------------------------------------------
2344
2345 void FormMain::OnDelPropClick( wxCommandEvent& WXUNUSED(event) )
2346 {
2347 wxPGProperty* id = m_pPropGridManager->GetGrid()->GetSelection();
2348 if ( !id )
2349 {
2350 wxMessageBox(wxT("First select a property."));
2351 return;
2352 }
2353
2354 m_pPropGridManager->DeleteProperty( id );
2355 }
2356
2357 // -----------------------------------------------------------------------
2358
2359 void FormMain::OnDelPropRClick( wxCommandEvent& WXUNUSED(event) )
2360 {
2361 // Delete random property
2362 wxPGProperty* p = m_pPropGridManager->GetGrid()->GetRoot();
2363
2364 for (;;)
2365 {
2366 if ( !p->IsCategory() )
2367 {
2368 m_pPropGridManager->DeleteProperty( p );
2369 break;
2370 }
2371
2372 if ( !p->GetChildCount() )
2373 break;
2374
2375 int n = rand() % ((int)p->GetChildCount());
2376
2377 p = p->Item(n);
2378 }
2379 }
2380
2381 // -----------------------------------------------------------------------
2382
2383 void FormMain::OnContextMenu( wxContextMenuEvent& event )
2384 {
2385 wxLogDebug(wxT("FormMain::OnContextMenu(%i,%i)"),
2386 event.GetPosition().x,event.GetPosition().y);
2387
2388 //event.Skip();
2389 }
2390
2391 // -----------------------------------------------------------------------
2392
2393 void FormMain::OnCloseClick( wxCommandEvent& WXUNUSED(event) )
2394 {
2395 /*#ifdef __WXDEBUG__
2396 m_pPropGridManager->GetGrid()->DumpAllocatedChoiceSets();
2397 wxLogDebug(wxT("\\-> Don't worry, this is perfectly normal in this sample."));
2398 #endif*/
2399
2400 Close(false);
2401 }
2402
2403 // -----------------------------------------------------------------------
2404
2405 int IterateMessage( wxPGProperty* prop )
2406 {
2407 wxString s;
2408
2409 s.Printf( wxT("\"%s\" class = %s, valuetype = %s"), prop->GetLabel().c_str(),
2410 prop->GetClassInfo()->GetClassName(), prop->GetValueType().c_str() );
2411
2412 return wxMessageBox( s, wxT("Iterating... (press CANCEL to end)"), wxOK|wxCANCEL );
2413 }
2414
2415 // -----------------------------------------------------------------------
2416
2417 void FormMain::OnIterate1Click( wxCommandEvent& WXUNUSED(event) )
2418 {
2419 wxPropertyGridIterator it;
2420
2421 for ( it = m_pPropGridManager->GetCurrentPage()->
2422 GetIterator();
2423 !it.AtEnd();
2424 it++ )
2425 {
2426 wxPGProperty* p = *it;
2427 int res = IterateMessage( p );
2428 if ( res == wxCANCEL ) break;
2429 }
2430 }
2431
2432 // -----------------------------------------------------------------------
2433
2434 void FormMain::OnIterate2Click( wxCommandEvent& WXUNUSED(event) )
2435 {
2436 wxPropertyGridIterator it;
2437
2438 for ( it = m_pPropGridManager->GetCurrentPage()->
2439 GetIterator( wxPG_ITERATE_VISIBLE );
2440 !it.AtEnd();
2441 it++ )
2442 {
2443 wxPGProperty* p = *it;
2444
2445 int res = IterateMessage( p );
2446 if ( res == wxCANCEL ) break;
2447 }
2448 }
2449
2450 // -----------------------------------------------------------------------
2451
2452 void FormMain::OnIterate3Click( wxCommandEvent& WXUNUSED(event) )
2453 {
2454 // iterate over items in reverse order
2455 wxPropertyGridIterator it;
2456
2457 for ( it = m_pPropGridManager->GetCurrentPage()->
2458 GetIterator( wxPG_ITERATE_DEFAULT, wxBOTTOM );
2459 !it.AtEnd();
2460 it-- )
2461 {
2462 wxPGProperty* p = *it;
2463
2464 int res = IterateMessage( p );
2465 if ( res == wxCANCEL ) break;
2466 }
2467 }
2468
2469 // -----------------------------------------------------------------------
2470
2471 void FormMain::OnIterate4Click( wxCommandEvent& WXUNUSED(event) )
2472 {
2473 wxPropertyGridIterator it;
2474
2475 for ( it = m_pPropGridManager->GetCurrentPage()->
2476 GetIterator( wxPG_ITERATE_CATEGORIES );
2477 !it.AtEnd();
2478 it++ )
2479 {
2480 wxPGProperty* p = *it;
2481
2482 int res = IterateMessage( p );
2483 if ( res == wxCANCEL ) break;
2484 }
2485 }
2486
2487 // -----------------------------------------------------------------------
2488
2489 void FormMain::OnFitColumnsClick( wxCommandEvent& WXUNUSED(event) )
2490 {
2491 wxPropertyGridPage* page = m_pPropGridManager->GetCurrentPage();
2492
2493 // Remove auto-centering
2494 m_pPropGridManager->SetWindowStyle( m_pPropGridManager->GetWindowStyle() & ~wxPG_SPLITTER_AUTO_CENTER);
2495
2496 // Grow manager size just prior fit - otherwise
2497 // column information may be lost.
2498 wxSize oldGridSize = m_pPropGridManager->GetGrid()->GetClientSize();
2499 wxSize oldFullSize = GetSize();
2500 SetSize(1000, oldFullSize.y);
2501
2502 wxSize newSz = page->FitColumns();
2503
2504 int dx = oldFullSize.x - oldGridSize.x;
2505 int dy = oldFullSize.y - oldGridSize.y;
2506
2507 newSz.x += dx;
2508 newSz.y += dy;
2509
2510 SetSize(newSz);
2511 }
2512
2513 // -----------------------------------------------------------------------
2514
2515 void FormMain::OnChangeFlagsPropItemsClick( wxCommandEvent& WXUNUSED(event) )
2516 {
2517
2518 wxPGProperty* id = m_pPropGridManager->GetPropertyByName(wxT("Window Styles"));
2519
2520 wxPGChoices newChoices;
2521
2522 newChoices.Add(wxT("Fast"),0x1);
2523 newChoices.Add(wxT("Powerful"),0x2);
2524 newChoices.Add(wxT("Safe"),0x4);
2525 newChoices.Add(wxT("Sleek"),0x8);
2526
2527 m_pPropGridManager->SetPropertyChoices(id,newChoices);
2528 //m_pPropGridManager->ReplaceProperty(wxT("Window Styles"),
2529 // wxFlagsProperty(wxT("Window Styles"),wxPG_LABEL,newChoices));
2530 }
2531
2532 // -----------------------------------------------------------------------
2533
2534 void FormMain::OnEnableDisable( wxCommandEvent& )
2535 {
2536 wxPGProperty* id = m_pPropGridManager->GetGrid()->GetSelection();
2537 if ( !id )
2538 {
2539 wxMessageBox(wxT("First select a property."));
2540 return;
2541 }
2542
2543 if ( m_pPropGridManager->IsPropertyEnabled( id ) )
2544 {
2545 m_pPropGridManager->DisableProperty ( id );
2546 m_itemEnable->SetItemLabel( wxT("Enable") );
2547 }
2548 else
2549 {
2550 m_pPropGridManager->EnableProperty ( id );
2551 m_itemEnable->SetItemLabel( wxT("Disable") );
2552 }
2553 }
2554
2555 // -----------------------------------------------------------------------
2556
2557 void FormMain::OnHideShow( wxCommandEvent& WXUNUSED(event) )
2558 {
2559 wxPGProperty* id = m_pPropGridManager->GetGrid()->GetSelection();
2560 if ( !id )
2561 {
2562 wxMessageBox(wxT("First select a property."));
2563 return;
2564 }
2565
2566 if ( m_pPropGridManager->IsPropertyShown( id ) )
2567 {
2568 m_pPropGridManager->HideProperty( id, true );
2569 m_itemEnable->SetItemLabel( wxT("Show") );
2570 }
2571 else
2572 {
2573 m_pPropGridManager->HideProperty( id, false );
2574 m_itemEnable->SetItemLabel( wxT("Hide") );
2575 }
2576
2577 wxPropertyGridPage* curPage = m_pPropGridManager->GetCurrentPage();
2578
2579 // Check for bottomY precalculation validity
2580 unsigned int byPre = curPage->GetVirtualHeight();
2581 unsigned int byAct = curPage->GetActualVirtualHeight();
2582
2583 if ( byPre != byAct )
2584 {
2585 wxLogDebug(wxT("VirtualHeight is %u, should be %u"), byPre, byAct);
2586 }
2587 }
2588
2589 // -----------------------------------------------------------------------
2590
2591 void FormMain::OnInsertPage( wxCommandEvent& WXUNUSED(event) )
2592 {
2593 m_pPropGridManager->AddPage(wxT("New Page"));
2594 }
2595
2596 // -----------------------------------------------------------------------
2597
2598 void FormMain::OnRemovePage( wxCommandEvent& WXUNUSED(event) )
2599 {
2600 m_pPropGridManager->RemovePage(m_pPropGridManager->GetSelectedPage());
2601 }
2602
2603 // -----------------------------------------------------------------------
2604
2605 void FormMain::OnSaveState( wxCommandEvent& WXUNUSED(event) )
2606 {
2607 m_savedState = m_pPropGridManager->SaveEditableState();
2608 wxLogDebug(wxT("Saved editable state string: \"%s\""), m_savedState.c_str());
2609 }
2610
2611 // -----------------------------------------------------------------------
2612
2613 void FormMain::OnRestoreState( wxCommandEvent& WXUNUSED(event) )
2614 {
2615 m_pPropGridManager->RestoreEditableState(m_savedState);
2616 }
2617
2618 // -----------------------------------------------------------------------
2619
2620 void FormMain::OnSetSpinCtrlEditorClick( wxCommandEvent& WXUNUSED(event) )
2621 {
2622 #if wxUSE_SPINBTN
2623 wxPGProperty* pgId = m_pPropGridManager->GetSelectedProperty();
2624 if ( pgId )
2625 m_pPropGridManager->SetPropertyEditor( pgId, wxPG_EDITOR(SpinCtrl) );
2626 else
2627 wxMessageBox(wxT("First select a property"));
2628 #endif
2629 }
2630
2631 // -----------------------------------------------------------------------
2632
2633 void FormMain::OnTestReplaceClick( wxCommandEvent& WXUNUSED(event) )
2634 {
2635 wxPGProperty* pgId = m_pPropGridManager->GetSelectedProperty();
2636 if ( pgId )
2637 {
2638 wxPGChoices choices;
2639 choices.Add(wxT("Flag 0"),0x0001);
2640 choices.Add(wxT("Flag 1"),0x0002);
2641 choices.Add(wxT("Flag 2"),0x0004);
2642 choices.Add(wxT("Flag 3"),0x0008);
2643 wxPGProperty* newId = m_pPropGridManager->ReplaceProperty( pgId,
2644 new wxFlagsProperty(wxT("ReplaceFlagsProperty"), wxPG_LABEL, choices, 0x0003) );
2645 m_pPropGridManager->SetPropertyAttribute( newId,
2646 wxPG_BOOL_USE_CHECKBOX,
2647 true,
2648 wxPG_RECURSE );
2649 }
2650 else
2651 wxMessageBox(wxT("First select a property"));
2652 }
2653
2654 // -----------------------------------------------------------------------
2655
2656 void FormMain::OnClearModifyStatusClick( wxCommandEvent& WXUNUSED(event) )
2657 {
2658 m_pPropGridManager->ClearModifiedStatus();
2659 }
2660
2661 // -----------------------------------------------------------------------
2662
2663 // Freeze check-box checked?
2664 void FormMain::OnFreezeClick( wxCommandEvent& event )
2665 {
2666 if ( !m_pPropGridManager ) return;
2667
2668 if ( event.IsChecked() )
2669 {
2670 if ( !m_pPropGridManager->IsFrozen() )
2671 {
2672 m_pPropGridManager->Freeze();
2673 }
2674 }
2675 else
2676 {
2677 if ( m_pPropGridManager->IsFrozen() )
2678 {
2679 m_pPropGridManager->Thaw();
2680 m_pPropGridManager->Refresh();
2681 }
2682 }
2683 }
2684
2685 // -----------------------------------------------------------------------
2686
2687 void FormMain::OnAbout(wxCommandEvent& WXUNUSED(event))
2688 {
2689 wxString msg;
2690 msg.Printf( wxT("wxPropertyGrid Sample")
2691 #if wxUSE_UNICODE
2692 #if defined(wxUSE_UNICODE_UTF8) && wxUSE_UNICODE_UTF8
2693 wxT(" <utf-8>")
2694 #else
2695 wxT(" <unicode>")
2696 #endif
2697 #else
2698 wxT(" <ansi>")
2699 #endif
2700 #ifdef __WXDEBUG__
2701 wxT(" <debug>")
2702 #else
2703 wxT(" <release>")
2704 #endif
2705 wxT("\n\n")
2706 wxT("Programmed by %s\n\n")
2707 wxT("Using %s\n\n"),
2708 wxT("Jaakko Salli"), wxVERSION_STRING
2709 );
2710
2711 wxMessageBox(msg, _T("About"), wxOK | wxICON_INFORMATION, this);
2712 }
2713
2714 // -----------------------------------------------------------------------
2715
2716 void FormMain::OnColourScheme( wxCommandEvent& event )
2717 {
2718 int id = event.GetId();
2719 if ( id == ID_COLOURSCHEME1 )
2720 {
2721 m_pPropGridManager->GetGrid()->ResetColours();
2722 }
2723 else if ( id == ID_COLOURSCHEME2 )
2724 {
2725 // white
2726 wxColour my_grey_1(212,208,200);
2727 wxColour my_grey_3(113,111,100);
2728 m_pPropGridManager->Freeze();
2729 m_pPropGridManager->GetGrid()->SetMarginColour( *wxWHITE );
2730 m_pPropGridManager->GetGrid()->SetCaptionBackgroundColour( *wxWHITE );
2731 m_pPropGridManager->GetGrid()->SetCellBackgroundColour( *wxWHITE );
2732 m_pPropGridManager->GetGrid()->SetCellTextColour( my_grey_3 );
2733 m_pPropGridManager->GetGrid()->SetLineColour( my_grey_1 ); //wxColour(160,160,160)
2734 m_pPropGridManager->Thaw();
2735 }
2736 else if ( id == ID_COLOURSCHEME3 )
2737 {
2738 // .NET
2739 wxColour my_grey_1(212,208,200);
2740 wxColour my_grey_2(236,233,216);
2741 m_pPropGridManager->Freeze();
2742 m_pPropGridManager->GetGrid()->SetMarginColour( my_grey_1 );
2743 m_pPropGridManager->GetGrid()->SetCaptionBackgroundColour( my_grey_1 );
2744 m_pPropGridManager->GetGrid()->SetLineColour( my_grey_1 );
2745 m_pPropGridManager->Thaw();
2746 }
2747 else if ( id == ID_COLOURSCHEME4 )
2748 {
2749 // cream
2750
2751 wxColour my_grey_1(212,208,200);
2752 wxColour my_grey_2(241,239,226);
2753 wxColour my_grey_3(113,111,100);
2754 m_pPropGridManager->Freeze();
2755 m_pPropGridManager->GetGrid()->SetMarginColour( *wxWHITE );
2756 m_pPropGridManager->GetGrid()->SetCaptionBackgroundColour( *wxWHITE );
2757 m_pPropGridManager->GetGrid()->SetCellBackgroundColour( my_grey_2 );
2758 m_pPropGridManager->GetGrid()->SetCellBackgroundColour( my_grey_2 );
2759 m_pPropGridManager->GetGrid()->SetCellTextColour( my_grey_3 );
2760 m_pPropGridManager->GetGrid()->SetLineColour( my_grey_1 );
2761 m_pPropGridManager->Thaw();
2762 }
2763 }
2764
2765 // -----------------------------------------------------------------------
2766
2767 void FormMain::OnCatColours( wxCommandEvent& event )
2768 {
2769 wxPropertyGrid* pg = m_pPropGridManager->GetGrid();
2770 m_pPropGridManager->Freeze();
2771
2772 if ( event.IsChecked() )
2773 {
2774 // Set custom colours.
2775 pg->SetPropertyTextColour( wxT("Appearance"), wxColour(255,0,0), false );
2776 pg->SetPropertyBackgroundColour( wxT("Appearance"), wxColour(255,255,183) );
2777 pg->SetPropertyTextColour( wxT("Appearance"), wxColour(255,0,183) );
2778 pg->SetPropertyTextColour( wxT("PositionCategory"), wxColour(0,255,0), false );
2779 pg->SetPropertyBackgroundColour( wxT("PositionCategory"), wxColour(255,226,190) );
2780 pg->SetPropertyTextColour( wxT("PositionCategory"), wxColour(255,0,190) );
2781 pg->SetPropertyTextColour( wxT("Environment"), wxColour(0,0,255), false );
2782 pg->SetPropertyBackgroundColour( wxT("Environment"), wxColour(208,240,175) );
2783 pg->SetPropertyTextColour( wxT("Environment"), wxColour(255,255,255) );
2784 pg->SetPropertyBackgroundColour( wxT("More Examples"), wxColour(172,237,255) );
2785 pg->SetPropertyTextColour( wxT("More Examples"), wxColour(172,0,255) );
2786 }
2787 else
2788 {
2789 // Revert to original.
2790 pg->SetPropertyColoursToDefault( wxT("Appearance") );
2791 pg->SetPropertyColoursToDefault( wxT("PositionCategory") );
2792 pg->SetPropertyColoursToDefault( wxT("Environment") );
2793 pg->SetPropertyColoursToDefault( wxT("More Examples") );
2794 }
2795 m_pPropGridManager->Thaw();
2796 m_pPropGridManager->Refresh();
2797 }
2798
2799 // -----------------------------------------------------------------------
2800
2801 #define ADD_FLAG(FLAG) \
2802 chs.Add(wxT(#FLAG)); \
2803 vls.Add(FLAG); \
2804 if ( (flags & FLAG) == FLAG ) sel.Add(ind); \
2805 ind++;
2806
2807 void FormMain::OnSelectStyle( wxCommandEvent& WXUNUSED(event) )
2808 {
2809 int style;
2810 int extraStyle;
2811
2812 {
2813 wxArrayString chs;
2814 wxArrayInt vls;
2815 wxArrayInt sel;
2816 unsigned int ind = 0;
2817 int flags = m_pPropGridManager->GetWindowStyle();
2818 ADD_FLAG(wxPG_HIDE_CATEGORIES)
2819 ADD_FLAG(wxPG_AUTO_SORT)
2820 ADD_FLAG(wxPG_BOLD_MODIFIED)
2821 ADD_FLAG(wxPG_SPLITTER_AUTO_CENTER)
2822 ADD_FLAG(wxPG_TOOLTIPS)
2823 ADD_FLAG(wxPG_STATIC_SPLITTER)
2824 ADD_FLAG(wxPG_HIDE_MARGIN)
2825 ADD_FLAG(wxPG_LIMITED_EDITING)
2826 ADD_FLAG(wxPG_TOOLBAR)
2827 ADD_FLAG(wxPG_DESCRIPTION)
2828 wxMultiChoiceDialog dlg( this, wxT("Select window styles to use"),
2829 wxT("wxPropertyGrid Window Style"), chs );
2830 dlg.SetSelections(sel);
2831 if ( dlg.ShowModal() == wxID_CANCEL )
2832 return;
2833
2834 flags = 0;
2835 sel = dlg.GetSelections();
2836 for ( ind = 0; ind < sel.size(); ind++ )
2837 flags |= vls[sel[ind]];
2838
2839 style = flags;
2840 }
2841
2842 {
2843 wxArrayString chs;
2844 wxArrayInt vls;
2845 wxArrayInt sel;
2846 unsigned int ind = 0;
2847 int flags = m_pPropGridManager->GetExtraStyle();
2848 ADD_FLAG(wxPG_EX_INIT_NOCAT)
2849 ADD_FLAG(wxPG_EX_NO_FLAT_TOOLBAR)
2850 ADD_FLAG(wxPG_EX_MODE_BUTTONS)
2851 ADD_FLAG(wxPG_EX_HELP_AS_TOOLTIPS)
2852 ADD_FLAG(wxPG_EX_NATIVE_DOUBLE_BUFFERING)
2853 ADD_FLAG(wxPG_EX_AUTO_UNSPECIFIED_VALUES)
2854 ADD_FLAG(wxPG_EX_WRITEONLY_BUILTIN_ATTRIBUTES)
2855 ADD_FLAG(wxPG_EX_LEGACY_VALIDATORS)
2856 wxMultiChoiceDialog dlg( this, wxT("Select extra window styles to use"),
2857 wxT("wxPropertyGrid Extra Style"), chs );
2858 dlg.SetSelections(sel);
2859 if ( dlg.ShowModal() == wxID_CANCEL )
2860 return;
2861
2862 flags = 0;
2863 sel = dlg.GetSelections();
2864 for ( ind = 0; ind < sel.size(); ind++ )
2865 flags |= vls[sel[ind]];
2866
2867 extraStyle = flags;
2868 }
2869
2870 CreateGrid( style, extraStyle );
2871
2872 SetSize(
2873 (wxSystemSettings::GetMetric(wxSYS_SCREEN_X)/10)*4,
2874 (wxSystemSettings::GetMetric(wxSYS_SCREEN_Y)/10)*8
2875 );
2876 Centre();
2877 }
2878
2879 // -----------------------------------------------------------------------
2880
2881 void FormMain::OnSetColumns( wxCommandEvent& WXUNUSED(event) )
2882 {
2883 long colCount = ::wxGetNumberFromUser(wxT("Enter number of columns (2-20)."),wxT("Columns:"),
2884 wxT("Change Columns"),m_pPropGridManager->GetColumnCount(),
2885 2,20);
2886
2887 if ( colCount >= 2 )
2888 {
2889 m_pPropGridManager->SetColumnCount(colCount);
2890 }
2891 }
2892
2893 // -----------------------------------------------------------------------
2894
2895 void FormMain::OnSetPropertyValue( wxCommandEvent& WXUNUSED(event) )
2896 {
2897 wxPropertyGrid* pg = m_pPropGridManager->GetGrid();
2898 wxPGProperty* selected = pg->GetSelection();
2899
2900 if ( selected )
2901 {
2902 wxString value = ::wxGetTextFromUser( wxT("Enter new value:") );
2903 pg->SetPropertyValue( selected, value );
2904 }
2905 }
2906
2907 // -----------------------------------------------------------------------
2908
2909 void FormMain::OnInsertChoice( wxCommandEvent& WXUNUSED(event) )
2910 {
2911 wxPropertyGrid* pg = m_pPropGridManager->GetGrid();
2912
2913 wxPGProperty* selected = pg->GetSelection();
2914 wxPGChoices& choices = pg->GetPropertyChoices(selected);
2915
2916 // Insert new choice to the center of list
2917
2918 if ( choices.IsOk() )
2919 {
2920 int pos = choices.GetCount() / 2;
2921 pg->InsertPropertyChoice(selected,wxT("New Choice"),pos);
2922 }
2923 else
2924 {
2925 ::wxMessageBox(wxT("First select a property with some choices."));
2926 }
2927 }
2928
2929 // -----------------------------------------------------------------------
2930
2931 void FormMain::OnDeleteChoice( wxCommandEvent& WXUNUSED(event) )
2932 {
2933 wxPropertyGrid* pg = m_pPropGridManager->GetGrid();
2934
2935 wxPGProperty* selected = pg->GetSelection();
2936 wxPGChoices& choices = pg->GetPropertyChoices(selected);
2937
2938 // Deletes choice from the center of list
2939
2940 if ( choices.IsOk() )
2941 {
2942 int pos = choices.GetCount() / 2;
2943 pg->DeletePropertyChoice(selected,pos);
2944 }
2945 else
2946 {
2947 ::wxMessageBox(wxT("First select a property with some choices."));
2948 }
2949 }
2950
2951 // -----------------------------------------------------------------------
2952
2953 #include <wx/colordlg.h>
2954
2955 void FormMain::OnMisc ( wxCommandEvent& event )
2956 {
2957 int id = event.GetId();
2958 if ( id == ID_STATICLAYOUT )
2959 {
2960 long wsf = m_pPropGridManager->GetWindowStyleFlag();
2961 if ( event.IsChecked() ) m_pPropGridManager->SetWindowStyleFlag( wsf|wxPG_STATIC_LAYOUT );
2962 else m_pPropGridManager->SetWindowStyleFlag( wsf&~(wxPG_STATIC_LAYOUT) );
2963 }
2964 else if ( id == ID_CLEAR )
2965 {
2966 m_pPropGridManager->ClearPropertyValue(m_pPropGridManager->GetGrid()->GetSelection());
2967 }
2968 else if ( id == ID_COLLAPSEALL )
2969 {
2970 wxPGVIterator it;
2971 wxPropertyGrid* pg = m_pPropGridManager->GetGrid();
2972
2973 for ( it = pg->GetVIterator( wxPG_ITERATE_ALL ); !it.AtEnd(); it.Next() )
2974 it.GetProperty()->SetExpanded( false );
2975
2976 pg->RefreshGrid();
2977 }
2978 else if ( id == ID_GETVALUES )
2979 {
2980 m_storedValues = m_pPropGridManager->GetGrid()->GetPropertyValues(wxT("Test"),
2981 m_pPropGridManager->GetGrid()->GetRoot(),
2982 wxPG_KEEP_STRUCTURE|wxPG_INC_ATTRIBUTES);
2983 }
2984 else if ( id == ID_SETVALUES )
2985 {
2986 if ( m_storedValues.GetType() == wxT("list") )
2987 {
2988 m_pPropGridManager->GetGrid()->SetPropertyValues(m_storedValues);
2989 }
2990 else
2991 wxMessageBox(wxT("First use Get Property Values."));
2992 }
2993 else if ( id == ID_SETVALUES2 )
2994 {
2995 wxVariant list;
2996 list.NullList();
2997 list.Append( wxVariant((long)1234,wxT("VariantLong")) );
2998 list.Append( wxVariant((bool)TRUE,wxT("VariantBool")) );
2999 list.Append( wxVariant(wxT("Test Text"),wxT("VariantString")) );
3000 m_pPropGridManager->GetGrid()->SetPropertyValues(list);
3001 }
3002 else if ( id == ID_COLLAPSE )
3003 {
3004 // Collapses selected.
3005 wxPGProperty* id = m_pPropGridManager->GetSelectedProperty();
3006 if ( id )
3007 {
3008 m_pPropGridManager->Collapse(id);
3009 }
3010 }
3011 else if ( id == ID_RUNTESTFULL )
3012 {
3013 // Runs a regression test.
3014 RunTests(true);
3015 }
3016 else if ( id == ID_RUNTESTPARTIAL )
3017 {
3018 // Runs a regression test.
3019 RunTests(false);
3020 }
3021 else if ( id == ID_UNSPECIFY )
3022 {
3023 wxPGProperty* prop = m_pPropGridManager->GetSelectedProperty();
3024 if ( prop )
3025 {
3026 m_pPropGridManager->SetPropertyValueUnspecified(prop);
3027 }
3028 }
3029 else if ( id == ID_SETCOLOUR )
3030 {
3031 wxPGProperty* prop = m_pPropGridManager->GetSelectedProperty();
3032 if ( prop )
3033 {
3034 wxColourData data;
3035 data.SetChooseFull(true);
3036 int i;
3037 for ( i = 0; i < 16; i++)
3038 {
3039 wxColour colour(i*16, i*16, i*16);
3040 data.SetCustomColour(i, colour);
3041 }
3042
3043 wxColourDialog dialog(this, &data);
3044 if ( dialog.ShowModal() == wxID_OK )
3045 {
3046 wxColourData retData = dialog.GetColourData();
3047 m_pPropGridManager->GetGrid()->SetPropertyBackgroundColour(prop,retData.GetColour());
3048 }
3049 }
3050 }
3051 }
3052
3053 // -----------------------------------------------------------------------
3054
3055 void FormMain::OnPopulateClick( wxCommandEvent& event )
3056 {
3057 int id = event.GetId();
3058 m_propGrid->Clear();
3059 m_propGrid->Freeze();
3060 if ( id == ID_POPULATE1 )
3061 {
3062 PopulateWithStandardItems();
3063 }
3064 else if ( id == ID_POPULATE2 )
3065 {
3066 PopulateWithLibraryConfig();
3067 }
3068 m_propGrid->Thaw();
3069 }
3070
3071 // -----------------------------------------------------------------------
3072
3073 void DisplayMinimalFrame(wxWindow* parent); // in minimal.cpp
3074
3075 void FormMain::OnRunMinimalClick( wxCommandEvent& WXUNUSED(event) )
3076 {
3077 DisplayMinimalFrame(this);
3078 }
3079
3080 // -----------------------------------------------------------------------
3081
3082 FormMain::~FormMain()
3083 {
3084 }
3085
3086 // -----------------------------------------------------------------------
3087
3088 IMPLEMENT_APP(cxApplication)
3089
3090 bool cxApplication::OnInit()
3091 {
3092 //wxLocale Locale;
3093 //Locale.Init(wxLANGUAGE_FINNISH);
3094
3095 FormMain* frame = Form1 = new FormMain( wxT("wxPropertyGrid Sample"), wxPoint(0,0), wxSize(300,500) );
3096 frame->Show(true);
3097
3098 //
3099 // Parse command-line
3100 wxApp& app = wxGetApp();
3101 if ( app.argc > 1 )
3102 {
3103 wxString s = app.argv[1];
3104 if ( s == wxT("--run-tests") )
3105 {
3106 //
3107 // Run tests
3108 bool testResult = frame->RunTests(true);
3109
3110 if ( testResult )
3111 return false;
3112 }
3113 }
3114
3115 return true;
3116 }
3117
3118 // -----------------------------------------------------------------------
3119
3120 void FormMain::OnIdle( wxIdleEvent& event )
3121 {
3122 /*
3123 // This code is useful for debugging focus problems
3124 static wxWindow* last_focus = (wxWindow*) NULL;
3125
3126 wxWindow* cur_focus = ::wxWindow::FindFocus();
3127
3128 if ( cur_focus != last_focus )
3129 {
3130 const wxChar* class_name = wxT("<none>");
3131 if ( cur_focus )
3132 class_name = cur_focus->GetClassInfo()->GetClassName();
3133 last_focus = cur_focus;
3134 wxLogDebug( wxT("FOCUSED: %s %X"),
3135 class_name,
3136 (unsigned int)cur_focus);
3137 }
3138 */
3139
3140 event.Skip();
3141 }
3142
3143 // -----------------------------------------------------------------------