1 ///////////////////////////////////////////////////////////////////////////// 
   3 // Purpose:     interface of wxPropertyGrid editors 
   4 // Author:      wxWidgets team 
   6 // Licence:     wxWindows license 
   7 ///////////////////////////////////////////////////////////////////////////// 
  13     Base class for custom wxPropertyGrid editors. 
  16     - Names of built-in property editors are: TextCtrl, Choice, 
  17       ComboBox, CheckBox, TextCtrlAndButton, and ChoiceAndButton. Additional 
  18       editors include SpinCtrl and DatePickerCtrl, but using them requires 
  19       calling wxPropertyGrid::RegisterAdditionalEditors() prior use. 
  21     - Pointer to built-in editor is available as wxPGEditor_EditorName 
  22       (eg. wxPGEditor_TextCtrl). 
  24     - Before you start using new editor you just created, you need to register 
  25       it using static function 
  26       wxPropertyGrid::RegisterEditorClass(), with code like this: 
  28             wxPGEditor* editorPointer = wxPropertyGrid::RegisterEditorClass(new MyEditorClass(), "MyEditor"); 
  30       After that, wxPropertyGrid will take ownership of the given object, but 
  31       you should still store editorPointer somewhere, so you can pass it to 
  32       wxPGProperty::SetEditor(), or return it from wxPGEditor::DoGetEditorClass(). 
  37 class wxPGEditor 
: public wxObject
 
  45     virtual ~wxPGEditor(); 
  48         Returns pointer to the name of the editor. For example, 
  49         wxPGEditor_TextCtrl has name "TextCtrl". If you dont' need to access 
  50         your custom editor by string name, then you do not need to implement 
  53     virtual wxString 
GetName() const; 
  56         Instantiates editor controls. 
  59             wxPropertyGrid to which the property belongs (use as parent for control). 
  62             Property for which this method is called. 
  65             Position, inside wxPropertyGrid, to create control(s) to. 
  68             Initial size for control(s). 
  71         - Primary control shall use id wxPG_SUBID1, and secondary (button) control 
  72           shall use wxPG_SUBID2. 
  73         - Unlike in previous version of wxPropertyGrid, it is no longer 
  74           necessary to call wxEvtHandler::Connect() for interesting editor 
  75           events. Instead, all events from control are now automatically 
  76           forwarded to wxPGEditor::OnEvent() and wxPGProperty::OnEvent(). 
  78     virtual wxPGWindowList 
CreateControls( wxPropertyGrid
* propgrid
, 
  79                                            wxPGProperty
* property
, 
  81                                            const wxSize
& size 
) const = 0; 
  83     /** Loads value from property to the control. */ 
  84     virtual void UpdateControl( wxPGProperty
* property
, wxWindow
* ctrl 
) const = 0; 
  87         Draws value for given property. 
  89     virtual void DrawValue( wxDC
& dc
, const wxRect
& rect
, 
  90                             wxPGProperty
* property
, const wxString
& text 
) const; 
  93         Handles events. Returns @true if value in control was modified 
  94         (see wxPGProperty::OnEvent() for more information). 
  96         @remarks wxPropertyGrid will automatically unfocus the editor when 
  97                  wxEVT_COMMAND_TEXT_ENTER is received and when it results in 
  98                  property value being modified. This happens regardless of 
  99                  editor type (ie. behavior is same for any wxTextCtrl and 
 100                  wxComboBox based editor). 
 102     virtual bool OnEvent( wxPropertyGrid
* propgrid
, wxPGProperty
* property
, 
 103         wxWindow
* wnd_primary
, wxEvent
& event 
) const = 0; 
 106         Returns value from control, via parameter 'variant'. 
 107         Usually ends up calling property's StringToValue() or IntToValue(). 
 108         Returns @true if value was different. 
 110     virtual bool GetValueFromControl( wxVariant
& variant
, wxPGProperty
* property
, 
 111                                       wxWindow
* ctrl 
) const; 
 113     /** Sets value in control to unspecified. */ 
 114     virtual void SetValueToUnspecified( wxPGProperty
* property
, 
 115                                         wxWindow
* ctrl 
) const = 0; 
 117     /** Sets control's value specifically from string. */ 
 118     virtual void SetControlStringValue( wxPGProperty
* property
, 
 119                                         wxWindow
* ctrl
, const wxString
& txt 
) const; 
 121     /** Sets control's value specifically from int (applies to choice etc.). */ 
 122     virtual void SetControlIntValue( wxPGProperty
* property
, 
 123                                      wxWindow
* ctrl
, int value 
) const; 
 126         Inserts item to existing control. Index -1 means end of list. 
 127         Default implementation does nothing. Returns index of item added. 
 129     virtual int InsertItem( wxWindow
* ctrl
, const wxString
& label
, int index 
) const; 
 132         Deletes item from existing control. 
 133         Default implementation does nothing. 
 135     virtual void DeleteItem( wxWindow
* ctrl
, int index 
) const; 
 138         Extra processing when control gains focus. 
 139         For example, wxTextCtrl based controls should select all text. 
 141     virtual void OnFocus( wxPGProperty
* property
, wxWindow
* wnd 
) const; 
 144         Returns @true if control itself can contain the custom image. 
 145         Default implementation returns @false. 
 147     virtual bool CanContainCustomImage() const; 
 153     @class wxPGMultiButton 
 155     This class can be used to have multiple buttons in a property editor. 
 156     You will need to create a new property editor class, override CreateControls, 
 157     and have it return wxPGMultiButton instance in wxPGWindowList::SetSecondary(). 
 159     For instance, here we add three buttons to a TextCtrl editor: 
 162     #include <wx/propgrid/editors.h> 
 164     class wxSampleMultiButtonEditor : public wxPGTextCtrlEditor 
 166         DECLARE_DYNAMIC_CLASS(wxSampleMultiButtonEditor) 
 168         wxSampleMultiButtonEditor() {} 
 169         virtual ~wxSampleMultiButtonEditor() {} 
 171         virtual wxString GetName() const { return "SampleMultiButtonEditor"; } 
 173         virtual wxPGWindowList CreateControls( wxPropertyGrid* propGrid, 
 174                                                wxPGProperty* property, 
 176                                                const wxSize& sz ) const; 
 177         virtual bool OnEvent( wxPropertyGrid* propGrid, 
 178                               wxPGProperty* property, 
 180                               wxEvent& event ) const; 
 183     IMPLEMENT_DYNAMIC_CLASS(wxSampleMultiButtonEditor, wxPGTextCtrlEditor) 
 185     wxPGWindowList wxSampleMultiButtonEditor::CreateControls( wxPropertyGrid* propGrid, 
 186                                                               wxPGProperty* property, 
 188                                                               const wxSize& sz ) const 
 190         // Create and populate buttons-subwindow 
 191         wxPGMultiButton* buttons = new wxPGMultiButton( propGrid, sz ); 
 193         // Add two regular buttons 
 194         buttons->Add( "..." ); 
 196         // Add a bitmap button 
 197         buttons->Add( wxArtProvider::GetBitmap(wxART_FOLDER) ); 
 199         // Create the 'primary' editor control (textctrl in this case) 
 200         wxPGWindowList wndList = wxPGTextCtrlEditor::CreateControls 
 201                                  ( propGrid, property, pos, 
 202                                    buttons->GetPrimarySize() ); 
 204         // Finally, move buttons-subwindow to correct position and make sure 
 205         // returned wxPGWindowList contains our custom button list. 
 206         buttons->Finalize(propGrid, pos); 
 208         wndList.SetSecondary( buttons ); 
 212     bool wxSampleMultiButtonEditor::OnEvent( wxPropertyGrid* propGrid, 
 213                                              wxPGProperty* property, 
 215                                              wxEvent& event ) const 
 217         if ( event.GetEventType() == wxEVT_COMMAND_BUTTON_CLICKED ) 
 219             wxPGMultiButton* buttons = (wxPGMultiButton*) propGrid->GetEditorControlSecondary(); 
 221             if ( event.GetId() == buttons->GetButtonId(0) ) 
 223                 // Do something when the first button is pressed 
 224                 // Return true if the action modified the value in editor. 
 227             if ( event.GetId() == buttons->GetButtonId(1) ) 
 229                 // Do something when the second button is pressed 
 232             if ( event.GetId() == buttons->GetButtonId(2) ) 
 234                 // Do something when the third button is pressed 
 238         return wxPGTextCtrlEditor::OnEvent(propGrid, property, ctrl, event); 
 242     Further to use this editor, code like this can be used: 
 245         // Register editor class - needs only to be called once 
 246         wxPGEditor* multiButtonEditor = new wxSampleMultiButtonEditor(); 
 247         wxPropertyGrid::RegisterEditorClass( multiButtonEditor ); 
 249         // Insert the property that will have multiple buttons 
 250         propGrid->Append( new wxLongStringProperty("MultipleButtons", wxPG_LABEL) ); 
 252         // Change property to use editor created in the previous code segment 
 253         propGrid->SetPropertyEditor( "MultipleButtons", multiButtonEditor ); 
 259 class WXDLLIMPEXP_PROPGRID wxPGMultiButton 
: public wxWindow
 
 265     wxPGMultiButton( wxPropertyGrid
* pg
, const wxSize
& sz 
); 
 270     virtual ~wxPGMultiButton() { } 
 273         Adds new button, with given label. 
 275     void Add( const wxString
& label
, int id 
= -2 ); 
 278         Adds new bitmap button. 
 280     void Add( const wxBitmap
& bitmap
, int id 
= -2 ); 
 283         Call this in CreateControls() of your custom editor class 
 284         after all buttons have been added. 
 287             wxPropertyGrid given in CreateControls(). 
 290             wxPoint given in CreateControls(). 
 292     void Finalize( wxPropertyGrid
* propGrid
, const wxPoint
& pos 
); 
 295         Returns pointer to one of the buttons. 
 297     wxWindow
* GetButton( unsigned int i 
); 
 300         Returns Id of one of the buttons. 
 301         This is utility function to be used in event handlers. 
 303     int GetButtonId( unsigned int i 
) const; 
 306         Returns number of buttons. 
 308     unsigned int GetCount(); 
 311         Returns size of primary editor control, as appropriately 
 312         reduced by number of buttons present. 
 314     wxSize 
GetPrimarySize() const;