Fixed wxPGMultiButton (event handling, FinalizePosition() -> Finalize(), no longer using PG specific class macros in its sample), other editors.h interface fixes

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@55915 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Jaakko Salli
2008-09-27 14:03:10 +00:00
parent 7ce66351b7
commit 7a344f1be4
6 changed files with 179 additions and 215 deletions

View File

@@ -417,7 +417,7 @@ public:
if ( wxPGEditor_##EDITOR == (wxPGEditor*) NULL ) \ if ( wxPGEditor_##EDITOR == (wxPGEditor*) NULL ) \
{ \ { \
wxPGEditor_##EDITOR = wxPropertyGrid::RegisterEditorClass( \ wxPGEditor_##EDITOR = wxPropertyGrid::RegisterEditorClass( \
wxPGConstruct##EDITOR##EditorClass(), wxS(#EDITOR) ); \ wxPGConstruct##EDITOR##EditorClass() ); \
} }
// Use this in RegisterDefaultEditors. // Use this in RegisterDefaultEditors.
@@ -425,7 +425,7 @@ public:
if ( wxPGEditor_##EDITOR == (wxPGEditor*) NULL ) \ if ( wxPGEditor_##EDITOR == (wxPGEditor*) NULL ) \
{ \ { \
wxPGEditor_##EDITOR = wxPropertyGrid::RegisterEditorClass( \ wxPGEditor_##EDITOR = wxPropertyGrid::RegisterEditorClass( \
wxPGConstruct##EDITOR##EditorClass(), wxS(#EDITOR), true ); \ wxPGConstruct##EDITOR##EditorClass(), true ); \
} }
#define wxPG_INIT_REQUIRED_EDITOR(T) \ #define wxPG_INIT_REQUIRED_EDITOR(T) \
@@ -493,113 +493,7 @@ private:
This class can be used to have multiple buttons in a property editor. This class can be used to have multiple buttons in a property editor.
You will need to create a new property editor class, override You will need to create a new property editor class, override
CreateControls, and have it return wxPGMultiButton instance in CreateControls, and have it return wxPGMultiButton instance in
wxPGWindowList::SetSecondary(). For instance, here we add three buttons to wxPGWindowList::SetSecondary().
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}
*/ */
class WXDLLIMPEXP_PROPGRID wxPGMultiButton : public wxWindow class WXDLLIMPEXP_PROPGRID wxPGMultiButton : public wxWindow
{ {
@@ -628,10 +522,7 @@ public:
return wxSize(m_fullEditorSize.x - m_buttonsWidth, m_fullEditorSize.y); return wxSize(m_fullEditorSize.x - m_buttonsWidth, m_fullEditorSize.y);
} }
void FinalizePosition( const wxPoint& pos ) void Finalize( wxPropertyGrid* propGrid, const wxPoint& pos );
{
Move( pos.x + m_fullEditorSize.x - m_buttonsWidth, pos.y );
}
#ifndef DOXYGEN #ifndef DOXYGEN
protected: protected:

View File

@@ -883,7 +883,6 @@ public:
Pointer to the editor class instance that should be used. Pointer to the editor class instance that should be used.
*/ */
static wxPGEditor* RegisterEditorClass( wxPGEditor* editor, static wxPGEditor* RegisterEditorClass( wxPGEditor* editor,
const wxString& name,
bool noDefCheck = false ); bool noDefCheck = false );
#endif #endif

View File

@@ -8,20 +8,22 @@
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
/** @class wxPGEditor /**
@class wxPGEditor
Base class for custom wxPropertyGrid editors. Base class for custom wxPropertyGrid editors.
@remarks @remarks
- Names of builtin property editors are: TextCtrl, Choice, - Names of built-in property editors are: TextCtrl, Choice,
ComboBox, CheckBox, TextCtrlAndButton, and ChoiceAndButton. Additional editors ComboBox, CheckBox, TextCtrlAndButton, and ChoiceAndButton. Additional
include SpinCtrl and DatePickerCtrl, but using them requires calling editors include SpinCtrl and DatePickerCtrl, but using them requires
wxPropertyGrid::RegisterAdditionalEditors() prior use. 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). (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: wxPropertyGrid::RegisterEditorClass(), with code like this:
@code @code
wxPGEditor* editorPointer = wxPropertyGrid::RegisterEditorClass(new MyEditorClass(), "MyEditor"); wxPGEditor* editorPointer = wxPropertyGrid::RegisterEditorClass(new MyEditorClass(), "MyEditor");
@@ -47,20 +49,26 @@ public:
/** Destructor. */ /** Destructor. */
virtual ~wxPGEditor(); 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; virtual wxString GetName() const = 0;
/** Instantiates editor controls. /**
Instantiates editor controls.
@param propgrid @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 @param property
Property for which this method is called. Property for which this method is called.
@param pos @param pos
Position, inside wxPropertyGrid, to create control(s) to. Position, inside wxPropertyGrid, to create control(s) to.
@param size @param size
Initial size for control(s). Initial size for control(s).
@remarks @remarks
- Primary control shall use id wxPG_SUBID1, and secondary (button) control - Primary control shall use id wxPG_SUBID1, and secondary (button) control
@@ -76,98 +84,113 @@ public:
OnCustomEditorEvent will then forward events, first to OnCustomEditorEvent will then forward events, first to
wxPGEditor::OnEvent() and then to wxPGProperty::OnEvent(). wxPGEditor::OnEvent() and then to wxPGProperty::OnEvent().
*/ */
virtual wxPGWindowList CreateControls( wxPropertyGrid* propgrid, wxPGProperty* property, virtual wxPGWindowList CreateControls( wxPropertyGrid* propgrid,
const wxPoint& pos, const wxSize& size ) const = 0; wxPGProperty* property,
const wxPoint& pos,
const wxSize& size ) const = 0;
/** Loads value from property to the control. */ /** Loads value from property to the control. */
virtual void UpdateControl( wxPGProperty* property, wxWindow* ctrl ) const = 0; 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, virtual bool OnEvent( wxPropertyGrid* propgrid, wxPGProperty* property,
wxWindow* wnd_primary, wxEvent& event ) const = 0; wxWindow* wnd_primary, wxEvent& event ) const = 0;
/** Returns value from control, via parameter 'variant'. /**
Usually ends up calling property's StringToValue or IntToValue. Returns value from control, via parameter 'variant'.
Returns true if value was different. 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. */ /** 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. */ /** 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.). */ /** 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. 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. Default implementation does nothing.
*/ */
virtual void DeleteItem( wxWindow* ctrl, int index ) const; 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. based controls should select all text.
*/ */
virtual void OnFocus( wxPGProperty* property, wxWindow* wnd ) const; 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; 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. 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, You will need to create a new property editor class, override CreateControls,
and have it return wxPGMultiButton instance in wxPGWindowList::SetSecondary(). 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 @code
#include <wx/propgrid/editors.h> #include <wx/propgrid/editors.h>
class wxMultiButtonTextCtrlEditor : public wxPGTextCtrlEditor class wxSampleMultiButtonEditor : public wxPGTextCtrlEditor
{ {
WX_PG_DECLARE_EDITOR_CLASS(wxMultiButtonTextCtrlEditor) DECLARE_DYNAMIC_CLASS(wxSampleMultiButtonEditor)
public: public:
wxMultiButtonTextCtrlEditor() {} wxSampleMultiButtonEditor() {}
virtual ~wxMultiButtonTextCtrlEditor() {} 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, virtual bool OnEvent( wxPropertyGrid* propGrid,
wxPGProperty* property, wxPGProperty* property,
wxWindow* ctrl, wxWindow* ctrl,
wxEvent& event ) const; wxEvent& event ) const;
}; };
WX_PG_IMPLEMENT_EDITOR_CLASS(MultiButtonTextCtrlEditor, wxMultiButtonTextCtrlEditor, IMPLEMENT_DYNAMIC_CLASS(wxSampleMultiButtonEditor, wxPGTextCtrlEditor)
wxPGTextCtrlEditor)
wxPGWindowList wxMultiButtonTextCtrlEditor::CreateControls( wxPropertyGrid* propGrid, wxPGWindowList wxSampleMultiButtonEditor::CreateControls( wxPropertyGrid* propGrid,
wxPGProperty* property, wxPGProperty* property,
const wxPoint& pos, const wxPoint& pos,
const wxSize& sz ) const const wxSize& sz ) const
{ {
// Create and populate buttons-subwindow // Create and populate buttons-subwindow
wxPGMultiButton* buttons = new wxPGMultiButton( propGrid, sz ); wxPGMultiButton* buttons = new wxPGMultiButton( propGrid, sz );
@@ -180,20 +203,21 @@ public:
// Create the 'primary' editor control (textctrl in this case) // Create the 'primary' editor control (textctrl in this case)
wxPGWindowList wndList = wxPGTextCtrlEditor::CreateControls wxPGWindowList wndList = wxPGTextCtrlEditor::CreateControls
( propGrid, property, pos, buttons->GetPrimarySize() ); ( propGrid, property, pos,
buttons->GetPrimarySize() );
// Finally, move buttons-subwindow to correct position and make sure // Finally, move buttons-subwindow to correct position and make sure
// returned wxPGWindowList contains our custom button list. // returned wxPGWindowList contains our custom button list.
buttons->FinalizePosition(pos); buttons->Finalize(propGrid, pos);
wndList.SetSecondary( buttons ); wndList.SetSecondary( buttons );
return wndList; return wndList;
} }
bool wxMultiButtonTextCtrlEditor::OnEvent( wxPropertyGrid* propGrid, bool wxSampleMultiButtonEditor::OnEvent( wxPropertyGrid* propGrid,
wxPGProperty* property, wxPGProperty* property,
wxWindow* ctrl, wxWindow* ctrl,
wxEvent& event ) const wxEvent& event ) const
{ {
if ( event.GetEventType() == wxEVT_COMMAND_BUTTON_CLICKED ) if ( event.GetEventType() == wxEVT_COMMAND_BUTTON_CLICKED )
{ {
@@ -206,12 +230,12 @@ public:
} }
if ( event.GetId() == buttons->GetButtonId(1) ) if ( event.GetId() == buttons->GetButtonId(1) )
{ {
// Do something when first button is pressed // Do something when second button is pressed
return true; return true;
} }
if ( event.GetId() == buttons->GetButtonId(2) ) if ( event.GetId() == buttons->GetButtonId(2) )
{ {
// Do something when second button is pressed // Do something when third button is pressed
return true; return true;
} }
} }
@@ -225,13 +249,14 @@ public:
@code @code
// Register editor class - needs only to be called once // 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 // Insert the property that will have multiple buttons
propGrid->Append( new wxLongStringProperty("MultipleButtons", wxPG_LABEL) ); propGrid->Append( new wxLongStringProperty("MultipleButtons", wxPG_LABEL) );
// Change property to use editor created in the previous code segment // Change property to use editor created in the previous code segment
propGrid->SetPropertyEditor( "MultipleButtons", wxPG_EDITOR(MultiButtonTextCtrlEditor) ); propGrid->SetPropertyEditor( "MultipleButtons", multiButtonEditor );
@endcode @endcode
@@ -242,35 +267,59 @@ class WXDLLIMPEXP_PROPGRID wxPGMultiButton : public wxWindow
{ {
public: public:
/**
Constructor.
*/
wxPGMultiButton( wxPropertyGrid* pg, const wxSize& sz ); wxPGMultiButton( wxPropertyGrid* pg, const wxSize& sz );
/**
Destructor.
*/
virtual ~wxPGMultiButton() { } 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.
/** Utility function to be used in event handlers.
*/ */
int GetButtonId( unsigned int i ) const { return GetButton(i)->GetId(); }
/** Returns number of buttons.
*/
int GetCount() const { return m_buttons.Count(); }
void Add( const wxString& label, int id = -2 ); void Add( const wxString& label, int id = -2 );
/**
Adds new bitmap button.
*/
void Add( const wxBitmap& bitmap, int id = -2 ); void Add( const wxBitmap& bitmap, int id = -2 );
wxSize GetPrimarySize() const /**
{ Call this in CreateControls() of your custom editor class
return wxSize(m_fullEditorSize.x - m_buttonsWidth, m_fullEditorSize.y); after all buttons have been added.
}
void FinalizePosition( const wxPoint& pos ) @param propGrid
{ wxPropertyGrid given in CreateControls().
Move( pos.x + m_fullEditorSize.x - m_buttonsWidth, pos.y );
} @param pos
wxPoint given in CreateControls().
*/
void Finalize( wxPropertyGrid* propGrid, const wxPoint& pos );
/**
Returns pointer to one of the buttons.
*/
wxWindow* GetButton( unsigned int i );
/**
Returns Id of one of the buttons. This is utility function to be
used in event handlers.
*/
int GetButtonId( unsigned int i ) const;
/**
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_

View File

@@ -80,22 +80,24 @@
class wxSampleMultiButtonEditor : public wxPGTextCtrlEditor class wxSampleMultiButtonEditor : public wxPGTextCtrlEditor
{ {
WX_PG_DECLARE_EDITOR_CLASS(wxSampleMultiButtonEditor) DECLARE_DYNAMIC_CLASS(wxSampleMultiButtonEditor)
public: public:
wxSampleMultiButtonEditor() {} wxSampleMultiButtonEditor() {}
virtual ~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, virtual bool OnEvent( wxPropertyGrid* propGrid,
wxPGProperty* property, wxPGProperty* property,
wxWindow* ctrl, wxWindow* ctrl,
wxEvent& event ) const; wxEvent& event ) const;
}; };
WX_PG_IMPLEMENT_EDITOR_CLASS(SampleMultiButtonEditor,wxSampleMultiButtonEditor, IMPLEMENT_DYNAMIC_CLASS(wxSampleMultiButtonEditor, wxPGTextCtrlEditor)
wxPGTextCtrlEditor)
wxPGWindowList wxSampleMultiButtonEditor::CreateControls( wxPropertyGrid* propGrid, wxPGWindowList wxSampleMultiButtonEditor::CreateControls( wxPropertyGrid* propGrid,
wxPGProperty* property, wxPGProperty* property,
@@ -105,19 +107,20 @@ wxPGWindowList wxSampleMultiButtonEditor::CreateControls( wxPropertyGrid* propGr
// Create and populate buttons-subwindow // Create and populate buttons-subwindow
wxPGMultiButton* buttons = new wxPGMultiButton( propGrid, sz ); wxPGMultiButton* buttons = new wxPGMultiButton( propGrid, sz );
// Add two regular buttons
buttons->Add( "..." ); buttons->Add( "..." );
buttons->Add( "A" ); buttons->Add( "A" );
#if wxUSE_BMPBUTTON // Add a bitmap button
buttons->Add( wxArtProvider::GetBitmap(wxART_FOLDER) ); buttons->Add( wxArtProvider::GetBitmap(wxART_FOLDER) );
#endif
// Create the 'primary' editor control (textctrl in this case) // Create the 'primary' editor control (textctrl in this case)
wxPGWindowList wndList = wxPGTextCtrlEditor::CreateControls wxPGWindowList wndList = wxPGTextCtrlEditor::CreateControls
( propGrid, property, pos, buttons->GetPrimarySize() ); ( propGrid, property, pos,
buttons->GetPrimarySize() );
// Finally, move buttons-subwindow to correct position and make sure // Finally, move buttons-subwindow to correct position and make sure
// returned wxPGWindowList contains our custom button list. // returned wxPGWindowList contains our custom button list.
buttons->FinalizePosition(pos); buttons->Finalize(propGrid, pos);
wndList.SetSecondary( buttons ); wndList.SetSecondary( buttons );
return wndList; return wndList;
@@ -132,14 +135,22 @@ bool wxSampleMultiButtonEditor::OnEvent( wxPropertyGrid* propGrid,
{ {
wxPGMultiButton* buttons = (wxPGMultiButton*) propGrid->GetEditorControlSecondary(); 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) ) 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; return true;
} }
if ( event.GetId() == buttons->GetButtonId(2) ) 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; return true;
} }
} }
@@ -1655,9 +1666,10 @@ void FormMain::PopulateWithExamples ()
// //
// Test wxSampleMultiButtonEditor // Test wxSampleMultiButtonEditor
wxPGRegisterEditorClass( SampleMultiButtonEditor ); wxPGEditor* pSampleMultiButtonEditor = new wxSampleMultiButtonEditor();
wxPropertyGrid::RegisterEditorClass(pSampleMultiButtonEditor);
pg->Append( new wxLongStringProperty(wxT("MultipleButtons"), wxPG_LABEL) ); pg->Append( new wxLongStringProperty(wxT("MultipleButtons"), wxPG_LABEL) );
pg->SetPropertyEditor(wxT("MultipleButtons"), wxPG_EDITOR(SampleMultiButtonEditor) ); pg->SetPropertyEditor(wxT("MultipleButtons"), pSampleMultiButtonEditor );
// Test SingleChoiceProperty // Test SingleChoiceProperty
pg->Append( new SingleChoiceProperty(wxT("SingleChoiceProperty")) ); pg->Append( new SingleChoiceProperty(wxT("SingleChoiceProperty")) );

View File

@@ -2136,6 +2136,19 @@ wxPGMultiButton::wxPGMultiButton( wxPropertyGrid* pg, const wxSize& sz )
SetBackgroundColour(pg->GetCellBackgroundColour()); SetBackgroundColour(pg->GetCellBackgroundColour());
} }
void wxPGMultiButton::Finalize( wxPropertyGrid* propGrid, const wxPoint& pos )
{
Move( pos.x + m_fullEditorSize.x - m_buttonsWidth, pos.y );
// Connect event handling
for ( int i=0; i<GetCount(); i++ )
{
wxWindowID id = GetButtonId(i);
propGrid->Connect(id, wxEVT_COMMAND_BUTTON_CLICKED,
wxCommandEventHandler(wxPropertyGrid::OnCustomEditorEvent));
}
}
int wxPGMultiButton::GenId( int id ) const int wxPGMultiButton::GenId( int id ) const
{ {
if ( id < -1 ) if ( id < -1 )

View File

@@ -5528,18 +5528,18 @@ void wxPropertyGrid::OnCaptureChange( wxMouseCaptureChangedEvent& WXUNUSED(event
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
// noDefCheck = true prevents infinite recursion. // noDefCheck = true prevents infinite recursion.
wxPGEditor* wxPropertyGrid::RegisterEditorClass( wxPGEditor* editorclass, wxPGEditor* wxPropertyGrid::RegisterEditorClass( wxPGEditor* editorClass,
const wxString& name,
bool noDefCheck ) bool noDefCheck )
{ {
wxASSERT( editorclass ); wxASSERT( editorClass );
if ( !noDefCheck && wxPGGlobalVars->m_mapEditorClasses.empty() ) if ( !noDefCheck && wxPGGlobalVars->m_mapEditorClasses.empty() )
RegisterDefaultEditors(); RegisterDefaultEditors();
wxPGGlobalVars->m_mapEditorClasses[name] = (void*)editorclass; wxString name = editorClass->GetName();
wxPGGlobalVars->m_mapEditorClasses[name] = (void*)editorClass;
return editorclass; return editorClass;
} }
// Registers all default editor classes // Registers all default editor classes