if ( wxPGEditor_##EDITOR == (wxPGEditor*) NULL ) \
{ \
wxPGEditor_##EDITOR = wxPropertyGrid::RegisterEditorClass( \
- wxPGConstruct##EDITOR##EditorClass(), wxS(#EDITOR) ); \
+ wxPGConstruct##EDITOR##EditorClass() ); \
}
// Use this in RegisterDefaultEditors.
if ( wxPGEditor_##EDITOR == (wxPGEditor*) NULL ) \
{ \
wxPGEditor_##EDITOR = wxPropertyGrid::RegisterEditorClass( \
- wxPGConstruct##EDITOR##EditorClass(), wxS(#EDITOR), true ); \
+ wxPGConstruct##EDITOR##EditorClass(), true ); \
}
#define wxPG_INIT_REQUIRED_EDITOR(T) \
This class can be used to have multiple buttons in a property editor.
You will need to create a new property editor class, override
CreateControls, and have it return wxPGMultiButton instance in
- wxPGWindowList::SetSecondary(). For instance, here we add three buttons to
- a textctrl editor:
-
- @code
-
- #include <wx/propgrid/editors.h>
-
- class wxMultiButtonTextCtrlEditor : public wxPGTextCtrlEditor
- {
- WX_PG_DECLARE_EDITOR_CLASS(wxMultiButtonTextCtrlEditor)
- public:
- wxMultiButtonTextCtrlEditor() {}
- virtual ~wxMultiButtonTextCtrlEditor() {}
-
- wxPG_DECLARE_CREATECONTROLS
- virtual bool OnEvent( wxPropertyGrid* propGrid,
- wxPGProperty* property,
- wxWindow* ctrl,
- wxEvent& event ) const;
-
- };
-
- WX_PG_IMPLEMENT_EDITOR_CLASS(MultiButtonTextCtrlEditor,
- wxMultiButtonTextCtrlEditor,
- wxPGTextCtrlEditor)
-
- wxPGWindowList
- wxMultiButtonTextCtrlEditor::CreateControls( wxPropertyGrid* propGrid,
- wxPGProperty* property,
- const wxPoint& pos,
- const wxSize& sz ) const
- {
- // Create and populate buttons-subwindow
- wxPGMultiButton* buttons = new wxPGMultiButton( propGrid, sz );
-
- // Add two regular buttons
- buttons->Add( "..." );
- buttons->Add( "A" );
- // Add a bitmap button
- buttons->Add( wxArtProvider::GetBitmap(wxART_FOLDER) );
-
- // Create the 'primary' editor control (textctrl in this case)
- wxPGWindowList wndList = wxPGTextCtrlEditor::CreateControls(
- propGrid,
- property,
- pos,
- buttons->GetPrimarySize()
- );
-
- // Finally, move buttons-subwindow to correct position and make sure
- // returned wxPGWindowList contains our custom button list.
- buttons->FinalizePosition(pos);
-
- wndList.SetSecondary( buttons );
- return wndList;
- }
-
- bool wxMultiButtonTextCtrlEditor::OnEvent( wxPropertyGrid* propGrid,
- wxPGProperty* property,
- wxWindow* ctrl,
- wxEvent& event ) const
- {
- if ( event.GetEventType() == wxEVT_COMMAND_BUTTON_CLICKED )
- {
- wxPGMultiButton* buttons = (wxPGMultiButton*)
- propGrid->GetEditorControlSecondary();
-
- if ( event.GetId() == buttons->GetButtonId(0) )
- {
- // Do something when first button is pressed
- return true;
- }
- if ( event.GetId() == buttons->GetButtonId(1) )
- {
- // Do something when first button is pressed
- return true;
- }
- if ( event.GetId() == buttons->GetButtonId(2) )
- {
- // Do something when second button is pressed
- return true;
- }
- }
- return wxPGTextCtrlEditor::OnEvent(propGrid, property, ctrl, event);
- }
-
- @endcode
-
- Further to use this editor, code like this can be used:
-
- @code
-
- // Register editor class - needs only to be called once
- wxPGRegisterEditorClass( MultiButtonTextCtrlEditor );
-
- // Insert the property that will have multiple buttons
- propGrid->Append( new wxLongStringProperty("MultipleButtons",
- wxPG_LABEL) );
-
- // Change property to use editor created in the previous code segment
- propGrid->SetPropertyEditor( "MultipleButtons",
- wxPG_EDITOR(MultiButtonTextCtrlEditor) );
-
- @endcode
-
- @library{wxpropgrid}
- @category{propgrid}
+ wxPGWindowList::SetSecondary().
*/
class WXDLLIMPEXP_PROPGRID wxPGMultiButton : public wxWindow
{
return wxSize(m_fullEditorSize.x - m_buttonsWidth, m_fullEditorSize.y);
}
- void FinalizePosition( const wxPoint& pos )
- {
- Move( pos.x + m_fullEditorSize.x - m_buttonsWidth, pos.y );
- }
+ void Finalize( wxPropertyGrid* propGrid, const wxPoint& pos );
#ifndef DOXYGEN
protected:
// -----------------------------------------------------------------------
-/** @class wxPGEditor
+/**
+ @class wxPGEditor
Base class for custom wxPropertyGrid editors.
@remarks
- - Names of builtin property editors are: TextCtrl, Choice,
- ComboBox, CheckBox, TextCtrlAndButton, and ChoiceAndButton. Additional editors
- include SpinCtrl and DatePickerCtrl, but using them requires calling
- wxPropertyGrid::RegisterAdditionalEditors() prior use.
+ - Names of built-in property editors are: TextCtrl, Choice,
+ ComboBox, CheckBox, TextCtrlAndButton, and ChoiceAndButton. Additional
+ editors include SpinCtrl and DatePickerCtrl, but using them requires
+ calling wxPropertyGrid::RegisterAdditionalEditors() prior use.
- - Pointer to builtin editor is available as wxPGEditor_EditorName
+ - Pointer to built-in editor is available as wxPGEditor_EditorName
(eg. wxPGEditor_TextCtrl).
- - To add new editor you need to register it first using static function
+ - Before you start using new editor you just created, you need to register
+ it using static function
wxPropertyGrid::RegisterEditorClass(), with code like this:
@code
wxPGEditor* editorPointer = wxPropertyGrid::RegisterEditorClass(new MyEditorClass(), "MyEditor");
/** Destructor. */
virtual ~wxPGEditor();
- /** Returns pointer to the name of the editor. For example, wxPG_EDITOR(TextCtrl)
- has name "TextCtrl". This method is autogenerated for custom editors.
+ /**
+ Returns pointer to the name of the editor. For example,
+ wxPGEditor_TextCtrl has name "TextCtrl".
*/
virtual wxString GetName() const = 0;
- /** Instantiates editor controls.
+ /**
+ Instantiates editor controls.
+
@param propgrid
- wxPropertyGrid to which the property belongs (use as parent for control).
+ wxPropertyGrid to which the property belongs (use as parent for control).
+
@param property
- Property for which this method is called.
+ Property for which this method is called.
+
@param pos
- Position, inside wxPropertyGrid, to create control(s) to.
+ Position, inside wxPropertyGrid, to create control(s) to.
+
@param size
- Initial size for control(s).
+ Initial size for control(s).
@remarks
- Primary control shall use id wxPG_SUBID1, and secondary (button) control
OnCustomEditorEvent will then forward events, first to
wxPGEditor::OnEvent() and then to wxPGProperty::OnEvent().
*/
- virtual wxPGWindowList CreateControls( wxPropertyGrid* propgrid, wxPGProperty* property,
- const wxPoint& pos, const wxSize& size ) const = 0;
+ virtual wxPGWindowList CreateControls( wxPropertyGrid* propgrid,
+ wxPGProperty* property,
+ const wxPoint& pos,
+ const wxSize& size ) const = 0;
/** Loads value from property to the control. */
virtual void UpdateControl( wxPGProperty* property, wxWindow* ctrl ) const = 0;
- /** Draws value for given property.
+ /**
+ Draws value for given property.
*/
- virtual void DrawValue( wxDC& dc, const wxRect& rect, wxPGProperty* property, const wxString& text ) const;
+ virtual void DrawValue( wxDC& dc, const wxRect& rect,
+ wxPGProperty* property, const wxString& text ) const;
- /** Handles events. Returns true if value in control was modified
- (see wxPGProperty::OnEvent for more information).
+ /**
+ Handles events. Returns @true if value in control was modified
+ (see wxPGProperty::OnEvent() for more information).
*/
virtual bool OnEvent( wxPropertyGrid* propgrid, wxPGProperty* property,
wxWindow* wnd_primary, wxEvent& event ) const = 0;
- /** Returns value from control, via parameter 'variant'.
- Usually ends up calling property's StringToValue or IntToValue.
- Returns true if value was different.
+ /**
+ Returns value from control, via parameter 'variant'.
+ Usually ends up calling property's StringToValue() or IntToValue().
+ Returns @true if value was different.
*/
- virtual bool GetValueFromControl( wxVariant& variant, wxPGProperty* property, wxWindow* ctrl ) const;
+ virtual bool GetValueFromControl( wxVariant& variant, wxPGProperty* property,
+ wxWindow* ctrl ) const;
/** Sets value in control to unspecified. */
- virtual void SetValueToUnspecified( wxPGProperty* property, wxWindow* ctrl ) const = 0;
+ virtual void SetValueToUnspecified( wxPGProperty* property,
+ wxWindow* ctrl ) const = 0;
/** Sets control's value specifically from string. */
- virtual void SetControlStringValue( wxPGProperty* property, wxWindow* ctrl, const wxString& txt ) const;
+ virtual void SetControlStringValue( wxPGProperty* property,
+ wxWindow* ctrl, const wxString& txt ) const;
/** Sets control's value specifically from int (applies to choice etc.). */
- virtual void SetControlIntValue( wxPGProperty* property, wxWindow* ctrl, int value ) const;
+ virtual void SetControlIntValue( wxPGProperty* property,
+ wxWindow* ctrl, int value ) const;
- /** Inserts item to existing control. Index -1 means appending.
+ /**
+ Inserts item to existing control. Index -1 means end of list.
Default implementation does nothing. Returns index of item added.
*/
- virtual int InsertItem( wxWindow* ctrl, const wxString& label, int index ) const;
+ virtual int InsertItem( wxWindow* ctrl, const wxString& label,
+ int index ) const;
- /** Deletes item from existing control.
+ /**
+ Deletes item from existing control.
Default implementation does nothing.
*/
virtual void DeleteItem( wxWindow* ctrl, int index ) const;
- /** Extra processing when control gains focus. For example, wxTextCtrl
+ /**
+ Extra processing when control gains focus. For example, wxTextCtrl
based controls should select all text.
*/
virtual void OnFocus( wxPGProperty* property, wxWindow* wnd ) const;
- /** Returns true if control itself can contain the custom image. Default is
- to return false.
+ /**
+ Returns @true if control itself can contain the custom image. Default
+ implementation returns @false.
*/
virtual bool CanContainCustomImage() const;
-
- //
- // This member is public so scripting language bindings
- // wrapper code can access it freely.
- void* m_clientData;
};
// -----------------------------------------------------------------------
-/** @class wxPGMultiButton
+/**
+ @class wxPGMultiButton
This class can be used to have multiple buttons in a property editor.
You will need to create a new property editor class, override CreateControls,
and have it return wxPGMultiButton instance in wxPGWindowList::SetSecondary().
- For instance, here we add three buttons to a textctrl editor:
+
+ For instance, here we add three buttons to a TextCtrl editor:
@code
#include <wx/propgrid/editors.h>
- class wxMultiButtonTextCtrlEditor : public wxPGTextCtrlEditor
+ class wxSampleMultiButtonEditor : public wxPGTextCtrlEditor
{
- WX_PG_DECLARE_EDITOR_CLASS(wxMultiButtonTextCtrlEditor)
+ DECLARE_DYNAMIC_CLASS(wxSampleMultiButtonEditor)
public:
- wxMultiButtonTextCtrlEditor() {}
- virtual ~wxMultiButtonTextCtrlEditor() {}
+ wxSampleMultiButtonEditor() {}
+ virtual ~wxSampleMultiButtonEditor() {}
+
+ virtual wxString GetName() const { return "SampleMultiButtonEditor"; }
- wxPG_DECLARE_CREATECONTROLS
+ virtual wxPGWindowList CreateControls( wxPropertyGrid* propGrid,
+ wxPGProperty* property,
+ const wxPoint& pos,
+ const wxSize& sz ) const;
virtual bool OnEvent( wxPropertyGrid* propGrid,
wxPGProperty* property,
wxWindow* ctrl,
wxEvent& event ) const;
-
};
- WX_PG_IMPLEMENT_EDITOR_CLASS(MultiButtonTextCtrlEditor, wxMultiButtonTextCtrlEditor,
- wxPGTextCtrlEditor)
+ IMPLEMENT_DYNAMIC_CLASS(wxSampleMultiButtonEditor, wxPGTextCtrlEditor)
- wxPGWindowList wxMultiButtonTextCtrlEditor::CreateControls( wxPropertyGrid* propGrid,
- wxPGProperty* property,
- const wxPoint& pos,
- const wxSize& sz ) const
+ wxPGWindowList wxSampleMultiButtonEditor::CreateControls( wxPropertyGrid* propGrid,
+ wxPGProperty* property,
+ const wxPoint& pos,
+ const wxSize& sz ) const
{
// Create and populate buttons-subwindow
wxPGMultiButton* buttons = new wxPGMultiButton( propGrid, sz );
// Create the 'primary' editor control (textctrl in this case)
wxPGWindowList wndList = wxPGTextCtrlEditor::CreateControls
- ( propGrid, property, pos, buttons->GetPrimarySize() );
+ ( propGrid, property, pos,
+ buttons->GetPrimarySize() );
// Finally, move buttons-subwindow to correct position and make sure
// returned wxPGWindowList contains our custom button list.
- buttons->FinalizePosition(pos);
+ buttons->Finalize(propGrid, pos);
wndList.SetSecondary( buttons );
return wndList;
}
- bool wxMultiButtonTextCtrlEditor::OnEvent( wxPropertyGrid* propGrid,
- wxPGProperty* property,
- wxWindow* ctrl,
- wxEvent& event ) const
+ bool wxSampleMultiButtonEditor::OnEvent( wxPropertyGrid* propGrid,
+ wxPGProperty* property,
+ wxWindow* ctrl,
+ wxEvent& event ) const
{
if ( event.GetEventType() == wxEVT_COMMAND_BUTTON_CLICKED )
{
}
if ( event.GetId() == buttons->GetButtonId(1) )
{
- // Do something when first button is pressed
+ // Do something when second button is pressed
return true;
}
if ( event.GetId() == buttons->GetButtonId(2) )
{
- // Do something when second button is pressed
+ // Do something when third button is pressed
return true;
}
}
@code
// Register editor class - needs only to be called once
- wxPGRegisterEditorClass( MultiButtonTextCtrlEditor );
+ wxPGEditor* multiButtonEditor = new wxSampleMultiButtonEditor();
+ wxPropertyGrid::RegisterEditorClass( multiButtonEditor );
// Insert the property that will have multiple buttons
propGrid->Append( new wxLongStringProperty("MultipleButtons", wxPG_LABEL) );
// Change property to use editor created in the previous code segment
- propGrid->SetPropertyEditor( "MultipleButtons", wxPG_EDITOR(MultiButtonTextCtrlEditor) );
+ propGrid->SetPropertyEditor( "MultipleButtons", multiButtonEditor );
@endcode
{
public:
+ /**
+ Constructor.
+ */
wxPGMultiButton( wxPropertyGrid* pg, const wxSize& sz );
+ /**
+ Destructor.
+ */
virtual ~wxPGMultiButton() { }
- wxWindow* GetButton( unsigned int i ) { return (wxWindow*) m_buttons[i]; }
- const wxWindow* GetButton( unsigned int i ) const { return (const wxWindow*) m_buttons[i]; }
+ /**
+ Adds new button, with given label.
+ */
+ void Add( const wxString& label, int id = -2 );
- /** Utility function to be used in event handlers.
+ /**
+ Adds new bitmap button.
*/
- int GetButtonId( unsigned int i ) const { return GetButton(i)->GetId(); }
+ void Add( const wxBitmap& bitmap, int id = -2 );
+
+ /**
+ Call this in CreateControls() of your custom editor class
+ after all buttons have been added.
- /** Returns number of buttons.
+ @param propGrid
+ wxPropertyGrid given in CreateControls().
+
+ @param pos
+ wxPoint given in CreateControls().
*/
- int GetCount() const { return m_buttons.Count(); }
+ void Finalize( wxPropertyGrid* propGrid, const wxPoint& pos );
- void Add( const wxString& label, int id = -2 );
- void Add( const wxBitmap& bitmap, int id = -2 );
+ /**
+ Returns pointer to one of the buttons.
+ */
+ wxWindow* GetButton( unsigned int i );
- wxSize GetPrimarySize() const
- {
- return wxSize(m_fullEditorSize.x - m_buttonsWidth, m_fullEditorSize.y);
- }
+ /**
+ Returns Id of one of the buttons. This is utility function to be
+ used in event handlers.
+ */
+ int GetButtonId( unsigned int i ) const;
- void FinalizePosition( const wxPoint& pos )
- {
- Move( pos.x + m_fullEditorSize.x - m_buttonsWidth, pos.y );
- }
+ /**
+ Returns number of buttons.
+ */
+ int GetCount();
+
+ /**
+ Returns size of primary editor control, as appropriately
+ reduced by number of buttons present.
+ */
+ wxSize GetPrimarySize() const;
};
// -----------------------------------------------------------------------
-
-#endif // _WX_PROPGRID_EDITORS_H_
class wxSampleMultiButtonEditor : public wxPGTextCtrlEditor
{
- WX_PG_DECLARE_EDITOR_CLASS(wxSampleMultiButtonEditor)
+ DECLARE_DYNAMIC_CLASS(wxSampleMultiButtonEditor)
public:
wxSampleMultiButtonEditor() {}
virtual ~wxSampleMultiButtonEditor() {}
- wxPG_DECLARE_CREATECONTROLS
+ virtual wxString GetName() const { return "SampleMultiButtonEditor"; }
+
+ virtual wxPGWindowList CreateControls( wxPropertyGrid* propGrid,
+ wxPGProperty* property,
+ const wxPoint& pos,
+ const wxSize& sz ) const;
virtual bool OnEvent( wxPropertyGrid* propGrid,
wxPGProperty* property,
wxWindow* ctrl,
wxEvent& event ) const;
-
};
-WX_PG_IMPLEMENT_EDITOR_CLASS(SampleMultiButtonEditor,wxSampleMultiButtonEditor,
- wxPGTextCtrlEditor)
-
+IMPLEMENT_DYNAMIC_CLASS(wxSampleMultiButtonEditor, wxPGTextCtrlEditor)
wxPGWindowList wxSampleMultiButtonEditor::CreateControls( wxPropertyGrid* propGrid,
wxPGProperty* property,
// Create and populate buttons-subwindow
wxPGMultiButton* buttons = new wxPGMultiButton( propGrid, sz );
+ // Add two regular buttons
buttons->Add( "..." );
buttons->Add( "A" );
-#if wxUSE_BMPBUTTON
+ // Add a bitmap button
buttons->Add( wxArtProvider::GetBitmap(wxART_FOLDER) );
-#endif
// Create the 'primary' editor control (textctrl in this case)
wxPGWindowList wndList = wxPGTextCtrlEditor::CreateControls
- ( propGrid, property, pos, buttons->GetPrimarySize() );
+ ( propGrid, property, pos,
+ buttons->GetPrimarySize() );
// Finally, move buttons-subwindow to correct position and make sure
// returned wxPGWindowList contains our custom button list.
- buttons->FinalizePosition(pos);
+ buttons->Finalize(propGrid, pos);
wndList.SetSecondary( buttons );
return wndList;
{
wxPGMultiButton* buttons = (wxPGMultiButton*) propGrid->GetEditorControlSecondary();
+ if ( event.GetId() == buttons->GetButtonId(0) )
+ {
+ // Do something when first button is pressed
+ wxLogDebug("First button pressed");
+ return true;
+ }
if ( event.GetId() == buttons->GetButtonId(1) )
{
- wxMessageBox(wxT("Second button was pressed"));
+ // Do something when second button is pressed
+ wxLogDebug("Second button pressed");
return true;
}
if ( event.GetId() == buttons->GetButtonId(2) )
{
- wxMessageBox(wxT("Third button was pressed"));
+ // Do something when third button is pressed
+ wxLogDebug("Third button pressed");
return true;
}
}
//
// Test wxSampleMultiButtonEditor
- wxPGRegisterEditorClass( SampleMultiButtonEditor );
+ wxPGEditor* pSampleMultiButtonEditor = new wxSampleMultiButtonEditor();
+ wxPropertyGrid::RegisterEditorClass(pSampleMultiButtonEditor);
pg->Append( new wxLongStringProperty(wxT("MultipleButtons"), wxPG_LABEL) );
- pg->SetPropertyEditor(wxT("MultipleButtons"), wxPG_EDITOR(SampleMultiButtonEditor) );
+ pg->SetPropertyEditor(wxT("MultipleButtons"), pSampleMultiButtonEditor );
// Test SingleChoiceProperty
pg->Append( new SingleChoiceProperty(wxT("SingleChoiceProperty")) );