]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/propgrid/editors.h
A better fix for wxHash{Map,Set} with g++ 4.7.
[wxWidgets.git] / include / wx / propgrid / editors.h
index 7a6a1e3e2b45bbf9655717fdef9ea4d2299b8b1e..d9ab664eba4072377aad25b7f1914c3ce9b4d714 100644 (file)
@@ -4,16 +4,22 @@
 // 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.
 
@@ -30,7 +36,6 @@ public:
     wxWindow*   m_primary;
     wxWindow*   m_secondary;
 
-#ifndef SWIG
     wxPGWindowList( wxWindow* a )
     {
         m_primary = a;
@@ -41,7 +46,6 @@ public:
         m_primary = a;
         m_secondary = b;
     };
-#endif
 };
 
 // -----------------------------------------------------------------------
@@ -75,9 +79,7 @@ public:
 */
 class WXDLLIMPEXP_PROPGRID wxPGEditor : public wxObject
 {
-#ifndef SWIG
     DECLARE_ABSTRACT_CLASS(wxPGEditor)
-#endif
 public:
 
     /** Constructor. */
@@ -92,10 +94,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.
@@ -113,25 +116,15 @@ public:
         @remarks
         - Primary control shall use id wxPG_SUBID1, and secondary (button)
           control shall use wxPG_SUBID2.
-        - Implementation shoud connect all necessary events to the
-          wxPropertyGrid::OnCustomEditorEvent. For Example:
-            @code
-                // Relays wxEVT_COMMAND_TEXT_UPDATED events of primary editor
-                // control to the OnEvent.
-                propgrid->Connect(control->GetId(), 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,
@@ -154,11 +147,16 @@ 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. 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.
@@ -166,11 +164,36 @@ public:
     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,
@@ -211,41 +234,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 = NULL;
 
 
 //
@@ -254,14 +249,25 @@ virtual void SetValueToUnspecified( wxPGProperty* property, \
 
 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;
@@ -286,14 +292,26 @@ public:
 
 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,
@@ -321,15 +339,15 @@ public:
 
 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;
 
@@ -347,9 +365,6 @@ public:
 };
 
 
-// Exclude classes from being able to be derived from in wxPython bindings
-#ifndef SWIG
-
 class WXDLLIMPEXP_PROPGRID wxPGChoiceAndButtonEditor : public wxPGChoiceEditor
 {
 public:
@@ -357,8 +372,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)
 };
@@ -370,15 +387,17 @@ 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)
 };
 
-#endif  // !SWIG
-
 
-#if wxPG_INCLUDE_CHECKBOX || defined(DOXYGEN)
+#if wxPG_INCLUDE_CHECKBOX
 
 //
 // Use custom check box code instead of native control
@@ -386,15 +405,27 @@ public:
 //
 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,
@@ -411,27 +442,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 ) \
+    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
@@ -448,9 +467,7 @@ if ( wxPGEditor_##EDITOR == (wxPGEditor*) NULL ) \
 */
 class WXDLLIMPEXP_PROPGRID wxPGEditorDialogAdapter : public wxObject
 {
-#ifndef SWIG
     DECLARE_ABSTRACT_CLASS(wxPGEditorDialogAdapter)
-#endif
 public:
     wxPGEditorDialogAdapter()
         : wxObject()
@@ -493,118 +510,13 @@ 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 <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
@@ -616,7 +528,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
@@ -628,20 +540,17 @@ 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:
 
+    void DoAddButton( wxWindow* button, const wxSize& sz );
+
     int GenId( int id ) const;
 
     wxArrayPtrVoid  m_buttons;
     wxSize          m_fullEditorSize;
     int             m_buttonsWidth;
-#endif // !DOXYGEN
 };
 
 // -----------------------------------------------------------------------