X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1c4293cb91327247ad69e6ec8d589bfaa299db28..339cfab649b54f6f3c8f5637ede885cf11f85501:/include/wx/propgrid/editors.h diff --git a/include/wx/propgrid/editors.h b/include/wx/propgrid/editors.h index 1fb6a096d7..96298e2cc5 100644 --- a/include/wx/propgrid/editors.h +++ b/include/wx/propgrid/editors.h @@ -4,7 +4,7 @@ // Author: Jaakko Salli // Modified by: // Created: 2007-04-14 -// RCS-ID: $Id: +// RCS-ID: $Id$ // Copyright: (c) Jaakko Salli // Licence: wxWindows license ///////////////////////////////////////////////////////////////////////////// @@ -12,6 +12,8 @@ #ifndef _WX_PROPGRID_EDITORS_H_ #define _WX_PROPGRID_EDITORS_H_ +#if wxUSE_PROPGRID + // ----------------------------------------------------------------------- // wxPGWindowList contains list of editor windows returned by CreateControls. @@ -90,10 +92,11 @@ public: /** Returns pointer to the name of the editor. For example, - wxPG_EDITOR(TextCtrl) has name "TextCtrl". This method is autogenerated - for custom editors. + wxPGEditor_TextCtrl has name "TextCtrl". If you dont' need to access + your custom editor by string name, then you do not need to implement + this function. */ - virtual wxString GetName() const = 0; + virtual wxString GetName() const; /** Instantiates editor controls. @@ -111,29 +114,15 @@ public: @remarks - Primary control shall use id wxPG_SUBID1, and secondary (button) control shall use wxPG_SUBID2. - - Implementation shoud use connect all necessary events to the - wxPropertyGrid::OnCustomEditorEvent. For Example: - @code - // Relays wxEVT_COMMAND_TEXT_UPDATED events of primary editor - // control to the OnEvent. - // NOTE: This event in particular is actually automatically - // conveyed, but it is just used as an example. - propgrid->Connect(wxPG_SUBID1, wxEVT_COMMAND_TEXT_UPDATED, - wxCommandEventHandler( - wxPropertyGrid::OnCustomEditorEvent)); - @endcode - OnCustomEditorEvent will then forward events, first to - wxPGEditor::OnEvent and then to wxPGProperty::OnEvent. - + - Unlike in previous version of wxPropertyGrid, it is no longer + necessary to call wxEvtHandler::Connect() for interesting editor + events. Instead, all events from control are now automatically + forwarded to wxPGEditor::OnEvent() and wxPGProperty::OnEvent(). */ virtual wxPGWindowList CreateControls(wxPropertyGrid* propgrid, wxPGProperty* property, const wxPoint& pos, const wxSize& size) const = 0; - #define wxPG_DECLARE_CREATECONTROLS \ - virtual wxPGWindowList \ - CreateControls( wxPropertyGrid* propgrid, wxPGProperty* property, \ - const wxPoint& pos, const wxSize& sz ) const; /** Loads value from property to the control. */ virtual void UpdateControl( wxPGProperty* property, @@ -156,6 +145,12 @@ public: /** Handles events. Returns true if value in control was modified (see wxPGProperty::OnEvent for more information). + + @remarks wxPropertyGrid will automatically unfocus the editor when + wxEVT_COMMAND_TEXT_ENTER is received and when it results in + property value being modified. This happens regardless of + editor type (ie. behavior is same for any wxTextCtrl and + wxComboBox based editor). */ virtual bool OnEvent( wxPropertyGrid* propgrid, wxPGProperty* property, wxWindow* wnd_primary, wxEvent& event ) const = 0; @@ -213,41 +208,13 @@ public: }; -// -// Note that we don't use this macro in this file because -// otherwise doxygen gets confused. -// -#define WX_PG_DECLARE_EDITOR_CLASS(CLASSNAME) \ - DECLARE_DYNAMIC_CLASS(CLASSNAME) \ -public: \ - virtual wxString GetName() const; \ -private: - - -#define WX_PG_IMPLEMENT_EDITOR_CLASS(EDITOR,CLASSNAME,BASECLASS) \ +#define WX_PG_IMPLEMENT_INTERNAL_EDITOR_CLASS(EDITOR,CLASSNAME,BASECLASS) \ IMPLEMENT_DYNAMIC_CLASS(CLASSNAME, BASECLASS) \ wxString CLASSNAME::GetName() const \ { \ return wxS(#EDITOR); \ } \ -wxPGEditor* wxPGEditor_##EDITOR = (wxPGEditor*) NULL; \ -wxPGEditor* wxPGConstruct##EDITOR##EditorClass() \ -{ \ - wxASSERT( !wxPGEditor_##EDITOR ); \ - return new CLASSNAME(); \ -} - - -#define WX_PG_IMPLEMENT_EDITOR_CLASS_STD_METHODS() \ -wxPG_DECLARE_CREATECONTROLS \ -virtual void UpdateControl( wxPGProperty* property, wxWindow* ctrl ) const; \ -virtual bool OnEvent( wxPropertyGrid* propgrid, wxPGProperty* property, \ - wxWindow* primary, wxEvent& event ) const; \ -virtual bool GetValueFromControl( wxVariant& variant, \ - wxPGProperty* property, \ - wxWindow* ctrl ) const; \ -virtual void SetValueToUnspecified( wxPGProperty* property, \ - wxWindow* ctrl ) const; +wxPGEditor* wxPGEditor_##EDITOR = (wxPGEditor*) NULL; // @@ -263,7 +230,22 @@ public: wxPGTextCtrlEditor() {} virtual ~wxPGTextCtrlEditor(); - WX_PG_IMPLEMENT_EDITOR_CLASS_STD_METHODS() + virtual wxPGWindowList CreateControls(wxPropertyGrid* propgrid, + wxPGProperty* property, + const wxPoint& pos, + const wxSize& size) const; + virtual void UpdateControl( wxPGProperty* property, + wxWindow* ctrl ) const; + virtual bool OnEvent( wxPropertyGrid* propgrid, + wxPGProperty* property, + wxWindow* primaryCtrl, + wxEvent& event ) const; + virtual bool GetValueFromControl( wxVariant& variant, + wxPGProperty* property, + wxWindow* ctrl ) const; + virtual void SetValueToUnspecified( wxPGProperty* property, + wxWindow* ctrl ) const; + virtual wxString GetName() const; //virtual wxPGCellRenderer* GetCellRenderer() const; @@ -295,7 +277,21 @@ public: wxPGChoiceEditor() {} virtual ~wxPGChoiceEditor(); - WX_PG_IMPLEMENT_EDITOR_CLASS_STD_METHODS() + virtual wxPGWindowList CreateControls(wxPropertyGrid* propgrid, + wxPGProperty* property, + const wxPoint& pos, + const wxSize& size) const; + virtual void UpdateControl( wxPGProperty* property, + wxWindow* ctrl ) const; + virtual bool OnEvent( wxPropertyGrid* propgrid, + wxPGProperty* property, + wxWindow* primaryCtrl, + wxEvent& event ) const; + virtual bool GetValueFromControl( wxVariant& variant, + wxPGProperty* property, + wxWindow* ctrl ) const; + virtual void SetValueToUnspecified( wxPGProperty* property, + wxWindow* ctrl ) const; virtual wxString GetName() const; virtual void SetControlIntValue( wxPGProperty* property, @@ -330,8 +326,10 @@ public: wxPGComboBoxEditor() {} virtual ~wxPGComboBoxEditor(); - // Macro is used for convenience due to different signature with wxPython - wxPG_DECLARE_CREATECONTROLS + virtual wxPGWindowList CreateControls(wxPropertyGrid* propgrid, + wxPGProperty* property, + const wxPoint& pos, + const wxSize& size) const; virtual wxString GetName() const; @@ -359,8 +357,10 @@ public: virtual ~wxPGChoiceAndButtonEditor(); virtual wxString GetName() const; - // Macro is used for convenience due to different signature with wxPython - wxPG_DECLARE_CREATECONTROLS + virtual wxPGWindowList CreateControls(wxPropertyGrid* propgrid, + wxPGProperty* property, + const wxPoint& pos, + const wxSize& size) const; DECLARE_DYNAMIC_CLASS(wxPGChoiceAndButtonEditor) }; @@ -372,7 +372,11 @@ public: wxPGTextCtrlAndButtonEditor() {} virtual ~wxPGTextCtrlAndButtonEditor(); virtual wxString GetName() const; - wxPG_DECLARE_CREATECONTROLS + + virtual wxPGWindowList CreateControls(wxPropertyGrid* propgrid, + wxPGProperty* property, + const wxPoint& pos, + const wxSize& size) const; DECLARE_DYNAMIC_CLASS(wxPGTextCtrlAndButtonEditor) }; @@ -380,7 +384,7 @@ public: #endif // !SWIG -#if wxPG_INCLUDE_CHECKBOX || defined(DOXYGEN) +#if wxPG_INCLUDE_CHECKBOX // // Use custom check box code instead of native control @@ -396,7 +400,21 @@ public: virtual ~wxPGCheckBoxEditor(); virtual wxString GetName() const; - WX_PG_IMPLEMENT_EDITOR_CLASS_STD_METHODS() + virtual wxPGWindowList CreateControls(wxPropertyGrid* propgrid, + wxPGProperty* property, + const wxPoint& pos, + const wxSize& size) const; + virtual void UpdateControl( wxPGProperty* property, + wxWindow* ctrl ) const; + virtual bool OnEvent( wxPropertyGrid* propgrid, + wxPGProperty* property, + wxWindow* primaryCtrl, + wxEvent& event ) const; + virtual bool GetValueFromControl( wxVariant& variant, + wxPGProperty* property, + wxWindow* ctrl ) const; + virtual void SetValueToUnspecified( wxPGProperty* property, + wxWindow* ctrl ) const; virtual void DrawValue( wxDC& dc, const wxRect& rect, @@ -413,27 +431,15 @@ public: // ----------------------------------------------------------------------- -// Editor class registeration macros +// Editor class registeration macro (mostly for internal use) #define wxPGRegisterEditorClass(EDITOR) \ if ( wxPGEditor_##EDITOR == (wxPGEditor*) NULL ) \ { \ wxPGEditor_##EDITOR = wxPropertyGrid::RegisterEditorClass( \ - wxPGConstruct##EDITOR##EditorClass(), wxS(#EDITOR) ); \ - } - -// Use this in RegisterDefaultEditors. -#define wxPGRegisterDefaultEditorClass(EDITOR) \ -if ( wxPGEditor_##EDITOR == (wxPGEditor*) NULL ) \ - { \ - wxPGEditor_##EDITOR = wxPropertyGrid::RegisterEditorClass( \ - wxPGConstruct##EDITOR##EditorClass(), wxS(#EDITOR), true ); \ + new wxPG##EDITOR##Editor ); \ } -#define wxPG_INIT_REQUIRED_EDITOR(T) \ - wxPGRegisterEditorClass(T) - - // ----------------------------------------------------------------------- /** @class wxPGEditorDialogAdapter @@ -495,113 +501,7 @@ private: 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 - - 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 { @@ -618,7 +518,7 @@ public: /** Returns number of buttons. */ - int GetCount() const { return m_buttons.Count(); } + unsigned int GetCount() const { return (unsigned int) m_buttons.size(); } void Add( const wxString& label, int id = -2 ); #if wxUSE_BMPBUTTON @@ -630,12 +530,8 @@ public: 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: int GenId( int id ) const; @@ -643,9 +539,10 @@ protected: wxArrayPtrVoid m_buttons; wxSize m_fullEditorSize; int m_buttonsWidth; -#endif // !DOXYGEN }; // ----------------------------------------------------------------------- +#endif // wxUSE_PROPGRID + #endif // _WX_PROPGRID_EDITORS_H_