// Author: Jaakko Salli
// Modified by:
// Created: 2007-04-14
-// RCS-ID: $Id:
+// RCS-ID: $Id$
// Copyright: (c) Jaakko Salli
-// Licence: wxWindows license
+// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PROPGRID_EDITORS_H_
#define _WX_PROPGRID_EDITORS_H_
+#include "wx/defs.h"
+
#if wxUSE_PROPGRID
+class WXDLLIMPEXP_FWD_PROPGRID wxPGCell;
+class WXDLLIMPEXP_FWD_PROPGRID wxPGProperty;
+class WXDLLIMPEXP_FWD_PROPGRID wxPropertyGrid;
+
// -----------------------------------------------------------------------
// wxPGWindowList contains list of editor windows returned by CreateControls.
wxWindow* m_primary;
wxWindow* m_secondary;
-#ifndef SWIG
wxPGWindowList( wxWindow* a )
{
m_primary = a;
m_primary = a;
m_secondary = b;
};
-#endif
};
// -----------------------------------------------------------------------
*/
class WXDLLIMPEXP_PROPGRID wxPGEditor : public wxObject
{
-#ifndef SWIG
DECLARE_ABSTRACT_CLASS(wxPGEditor)
-#endif
public:
/** Constructor. */
/**
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.
@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,
/** 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. behaviour is same for any wxTextCtrl and
+ wxComboBox based editor).
*/
virtual bool OnEvent( wxPropertyGrid* propgrid, wxPGProperty* property,
wxWindow* wnd_primary, wxEvent& event ) const = 0;
-#if !defined(SWIG) || defined(CREATE_VCW)
/** 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;
-#endif
- /** Sets value in control to unspecified. */
+ /**
+ Sets new appearance for the control. Default implementation
+ sets foreground colour, background colour, font, plus text
+ for wxTextCtrl and wxComboCtrl.
+
+ @param appearance
+ New appearance to be applied.
+
+ @param oldAppearance
+ Previously applied appearance. Used to detect which
+ control attributes need to be changed (e.g. so we only
+ change background colour if really needed).
+
+ @param unspecified
+ @true if the new appearance represents an unspecified
+ property value.
+ */
+ virtual void SetControlAppearance( wxPropertyGrid* pg,
+ wxPGProperty* property,
+ wxWindow* ctrl,
+ const wxPGCell& appearance,
+ const wxPGCell& oldAppearance,
+ bool unspecified ) const;
+
+ /**
+ Sets value in control to unspecified.
+ */
virtual void SetValueToUnspecified( wxPGProperty* property,
- wxWindow* ctrl ) const = 0;
+ wxWindow* ctrl ) const;
/** Sets control's value specifically from string. */
virtual void SetControlStringValue( wxPGProperty* property,
};
-//
-// 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 = NULL;
//
class WXDLLIMPEXP_PROPGRID wxPGTextCtrlEditor : public wxPGEditor
{
-#ifndef SWIG
DECLARE_DYNAMIC_CLASS(wxPGTextCtrlEditor)
-#endif
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 wxString GetName() const;
//virtual wxPGCellRenderer* GetCellRenderer() const;
class WXDLLIMPEXP_PROPGRID wxPGChoiceEditor : public wxPGEditor
{
-#ifndef SWIG
DECLARE_DYNAMIC_CLASS(wxPGChoiceEditor)
-#endif
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,
class WXDLLIMPEXP_PROPGRID wxPGComboBoxEditor : public wxPGChoiceEditor
{
-#ifndef SWIG
DECLARE_DYNAMIC_CLASS(wxPGComboBoxEditor)
-#endif
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;
};
-// Exclude classes from being able to be derived from in wxPython bindings
-#ifndef SWIG
-
class WXDLLIMPEXP_PROPGRID wxPGChoiceAndButtonEditor : public wxPGChoiceEditor
{
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)
};
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)
};
-#endif // !SWIG
-
-#if wxPG_INCLUDE_CHECKBOX || defined(DOXYGEN)
+#if wxPG_INCLUDE_CHECKBOX
//
// Use custom check box code instead of native control
//
class WXDLLIMPEXP_PROPGRID wxPGCheckBoxEditor : public wxPGEditor
{
-#ifndef SWIG
DECLARE_DYNAMIC_CLASS(wxPGCheckBoxEditor)
-#endif
public:
wxPGCheckBoxEditor() {}
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,
// -----------------------------------------------------------------------
-// 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 ) \
+ if ( wxPGEditor_##EDITOR == 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
*/
class WXDLLIMPEXP_PROPGRID wxPGEditorDialogAdapter : public wxObject
{
-#ifndef SWIG
DECLARE_ABSTRACT_CLASS(wxPGEditorDialogAdapter)
-#endif
public:
wxPGEditorDialogAdapter()
: wxObject()
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
{
public:
wxPGMultiButton( wxPropertyGrid* pg, const wxSize& sz );
+ virtual ~wxPGMultiButton() {}
wxWindow* GetButton( unsigned int i ) { return (wxWindow*) m_buttons[i]; }
const wxWindow* GetButton( unsigned int i ) const
/** 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
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:
+ void DoAddButton( wxWindow* button, const wxSize& sz );
+
int GenId( int id ) const;
wxArrayPtrVoid m_buttons;
wxSize m_fullEditorSize;
int m_buttonsWidth;
-#endif // !DOXYGEN
};
// -----------------------------------------------------------------------