]> git.saurik.com Git - wxWidgets.git/blobdiff - src/propgrid/editors.cpp
Re-added GetSelectProperty() to wxPropertyGridManager
[wxWidgets.git] / src / propgrid / editors.cpp
index 8394e5caad9f07a110bf72209c1fc553b56ff30b..1eddd98fb4e38e87d6a4f4394b8291acd4127c3f 100644 (file)
@@ -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
 /////////////////////////////////////////////////////////////////////////////
@@ -16,6 +16,8 @@
     #pragma hdrstop
 #endif
 
+#if wxUSE_PROPGRID
+
 #ifndef WX_PRECOMP
     #include "wx/defs.h"
     #include "wx/object.h"
@@ -39,7 +41,6 @@
     #include "wx/stattext.h"
     #include "wx/scrolwin.h"
     #include "wx/dirdlg.h"
-    #include "wx/layout.h"
     #include "wx/sizer.h"
     #include "wx/textdlg.h"
     #include "wx/filedlg.h"
 // This define is necessary to prevent macro clearing
 #define __wxPG_SOURCE_FILE__
 
-#include <wx/propgrid/propgrid.h>
-#include <wx/propgrid/editors.h>
-#include <wx/propgrid/props.h>
+#include "wx/propgrid/propgrid.h"
+#include "wx/propgrid/editors.h"
+#include "wx/propgrid/props.h"
 
 #if wxPG_USE_RENDERER_NATIVE
-    #include <wx/renderer.h>
+    #include "wx/renderer.h"
 #endif
 
 // How many pixels between textctrl and button
 
 #define wxPG_BUTTON_SIZEDEC                         0
 
-#include <wx/odcombo.h>
+#include "wx/odcombo.h"
 
 #ifdef __WXMSW__
-    #include <wx/msw/private.h>
+    #include "wx/msw/private.h"
 #endif
 
 // -----------------------------------------------------------------------
 
 #if defined(__WXMSW__)
     // tested
-    #define wxPG_NAT_TEXTCTRL_BORDER_X          0 // Unremovable border of native textctrl.
-    #define wxPG_NAT_TEXTCTRL_BORDER_Y          0 // Unremovable border of native textctrl.
-
     #define wxPG_NAT_BUTTON_BORDER_ANY          1
     #define wxPG_NAT_BUTTON_BORDER_X            1
     #define wxPG_NAT_BUTTON_BORDER_Y            1
     #define wxPG_CHECKMARK_HADJ                 (-1)
     #define wxPG_CHECKMARK_DEFLATE              3
 
-    #define wxPG_NAT_TEXTCTRL_BORDER_X      3 // Unremovable border of native textctrl.
-    #define wxPG_NAT_TEXTCTRL_BORDER_Y      3 // Unremovable border of native textctrl.
-
     #define wxPG_NAT_BUTTON_BORDER_ANY      1
     #define wxPG_NAT_BUTTON_BORDER_X        1
     #define wxPG_NAT_BUTTON_BORDER_Y        1
     #define wxPG_CHECKMARK_HADJ                 0
     #define wxPG_CHECKMARK_DEFLATE              0
 
-    #define wxPG_NAT_TEXTCTRL_BORDER_X      0 // Unremovable border of native textctrl.
-    #define wxPG_NAT_TEXTCTRL_BORDER_Y      0 // Unremovable border of native textctrl.
-
     #define wxPG_NAT_BUTTON_BORDER_ANY      0
     #define wxPG_NAT_BUTTON_BORDER_X        0
     #define wxPG_NAT_BUTTON_BORDER_Y        0
     #define wxPG_CHECKMARK_HADJ                 0
     #define wxPG_CHECKMARK_DEFLATE              0
 
-    #define wxPG_NAT_TEXTCTRL_BORDER_X      0 // Unremovable border of native textctrl.
-    #define wxPG_NAT_TEXTCTRL_BORDER_Y      0 // Unremovable border of native textctrl.
-
     #define wxPG_NAT_BUTTON_BORDER_ANY      0
     #define wxPG_NAT_BUTTON_BORDER_X        0
     #define wxPG_NAT_BUTTON_BORDER_Y        0
 
 #endif
 
-#if (!wxPG_NAT_TEXTCTRL_BORDER_X && !wxPG_NAT_TEXTCTRL_BORDER_Y)
-    #define wxPG_ENABLE_CLIPPER_WINDOW      0
-#else
-    #define wxPG_ENABLE_CLIPPER_WINDOW      1
-#endif
-
-
 // for odcombo
 #define wxPG_CHOICEXADJUST           0
 #define wxPG_CHOICEYADJUST           0
@@ -180,6 +162,11 @@ wxPGEditor::~wxPGEditor()
 {
 }
 
+wxString wxPGEditor::GetName() const
+{
+    return GetClassInfo()->GetClassName();
+}
+
 void wxPGEditor::DrawValue( wxDC& dc, const wxRect& rect, wxPGProperty* property, const wxString& text ) const
 {
     if ( !property->IsValueUnspecified() )
@@ -223,200 +210,11 @@ bool wxPGEditor::CanContainCustomImage() const
     return false;
 }
 
-// -----------------------------------------------------------------------
-// wxPGClipperWindow
-// -----------------------------------------------------------------------
-
-
-#if wxPG_ENABLE_CLIPPER_WINDOW
-
-//
-// Clipper window is used to "remove" borders from controls
-// which otherwise insist on having them despite of supplied
-// wxNO_BORDER window style.
-//
-class wxPGClipperWindow : public wxWindow
-{
-    DECLARE_CLASS(wxPGClipperWindow)
-public:
-
-    wxPGClipperWindow()
-        : wxWindow()
-    {
-        wxPGClipperWindow::Init();
-    }
-
-    wxPGClipperWindow(wxWindow* parent,
-                      wxWindowID id,
-                      const wxPoint& pos = wxDefaultPosition,
-                      const wxSize& size = wxDefaultSize)
-    {
-        Init();
-        Create(parent,id,pos,size);
-    }
-
-    void Create(wxWindow* parent,
-                wxWindowID id,
-                const wxPoint& pos = wxDefaultPosition,
-                const wxSize& size = wxDefaultSize);
-
-    virtual ~wxPGClipperWindow();
-
-    virtual bool ProcessEvent(wxEvent& event);
-
-    inline wxWindow* GetControl() const { return m_ctrl; }
-
-    // This is called before wxControl is constructed.
-    void GetControlRect( int xadj, int yadj, wxPoint& pt, wxSize& sz );
-
-    // This is caleed after wxControl has been constructed.
-    void SetControl( wxWindow* ctrl );
-
-    virtual void Refresh( bool eraseBackground = true,
-                          const wxRect *rect = (const wxRect *) NULL );
-    virtual void SetFocus();
-
-    virtual bool SetFont(const wxFont& font);
-
-    inline int GetXClip() const { return m_xadj; }
-
-    inline int GetYClip() const { return m_yadj; }
-
-protected:
-    wxWindow*       m_ctrl;
-
-    int             m_xadj; // Horizontal border clip.
-
-    int             m_yadj; // Vertical border clip.
-
-private:
-    void Init ()
-    {
-        m_ctrl = (wxWindow*) NULL;
-    }
-};
-
-
-IMPLEMENT_CLASS(wxPGClipperWindow,wxWindow)
-
-
-// This is called before wxControl is constructed.
-void wxPGClipperWindow::GetControlRect( int xadj, int yadj, wxPoint& pt, wxSize& sz )
-{
-    m_xadj = xadj;
-    m_yadj = yadj;
-    pt.x = -xadj;
-    pt.y = -yadj;
-    wxSize own_size = GetSize();
-    sz.x = own_size.x+(xadj*2);
-    sz.y = own_size.y+(yadj*2);
-}
-
-
-// This is caleed after wxControl has been constructed.
-void wxPGClipperWindow::SetControl( wxWindow* ctrl )
-{
-    m_ctrl = ctrl;
-
-    // GTK requires this.
-    ctrl->SetSizeHints(3,3);
-
-    // Correct size of this window to match the child.
-    wxSize sz = GetSize();
-    wxSize chsz = ctrl->GetSize();
-
-    int hei_adj = chsz.y - (sz.y+(m_yadj*2));
-    if ( hei_adj )
-        SetSize(sz.x,chsz.y-(m_yadj*2));
-
-}
-
-
-void wxPGClipperWindow::Refresh( bool eraseBackground, const wxRect *rect )
-{
-    wxWindow::Refresh(false,rect);
-    if ( m_ctrl )
-        m_ctrl->Refresh(eraseBackground);
-}
-
-
-// Pass focus to control
-void wxPGClipperWindow::SetFocus()
-{
-    if ( m_ctrl )
-        m_ctrl->SetFocus();
-    else
-        wxWindow::SetFocus();
-}
-
-
-bool wxPGClipperWindow::SetFont(const wxFont& font)
-{
-    bool res = wxWindow::SetFont(font);
-    if ( m_ctrl )
-        return m_ctrl->SetFont(font);
-    return res;
-}
-
-
-void wxPGClipperWindow::Create(wxWindow* parent,
-                               wxWindowID id,
-                               const wxPoint& pos,
-                               const wxSize& size )
-{
-    wxWindow::Create(parent,id,pos,size);
-}
-
-
-wxPGClipperWindow::~wxPGClipperWindow()
-{
-}
-
-
-bool wxPGClipperWindow::ProcessEvent(wxEvent& event)
-{
-    if ( event.GetEventType() == wxEVT_SIZE )
-    {
-        if ( m_ctrl )
-        {
-            // Maintain correct size relationship.
-            wxSize sz = GetSize();
-            m_ctrl->SetSize(sz.x+(m_xadj*2),sz.y+(m_yadj*2));
-            event.Skip();
-            return false;
-        }
-    }
-    return wxWindow::ProcessEvent(event);
-}
-
-#endif // wxPG_ENABLE_CLIPPER_WINDOW
-
-/*wxWindow* wxPropertyGrid::GetActualEditorControl( wxWindow* ctrl )
-{
-#if wxPG_ENABLE_CLIPPER_WINDOW
-    // Pass real control instead of clipper window
-    if ( ctrl->IsKindOf(CLASSINFO(wxPGClipperWindow)) )
-    {
-        return ((wxPGClipperWindow*)ctrl)->GetControl();
-    }
-#else
-    return ctrl;
-#endif
-}*/
-
 // -----------------------------------------------------------------------
 // wxPGTextCtrlEditor
 // -----------------------------------------------------------------------
 
-// Clipper window support macro (depending on whether it is used
-// for this editor or not)
-#if wxPG_NAT_TEXTCTRL_BORDER_X || wxPG_NAT_TEXTCTRL_BORDER_Y
-    #define wxPG_NAT_TEXTCTRL_BORDER_ANY    1
-#else
-    #define wxPG_NAT_TEXTCTRL_BORDER_ANY    0
-#endif
-
-WX_PG_IMPLEMENT_EDITOR_CLASS(TextCtrl,wxPGTextCtrlEditor,wxPGEditor)
+WX_PG_IMPLEMENT_INTERNAL_EDITOR_CLASS(TextCtrl,wxPGTextCtrlEditor,wxPGEditor)
 
 
 wxPGWindowList wxPGTextCtrlEditor::CreateControls( wxPropertyGrid* propGrid,
@@ -593,7 +391,7 @@ wxPGTextCtrlEditor::~wxPGTextCtrlEditor() { }
 // -----------------------------------------------------------------------
 
 
-WX_PG_IMPLEMENT_EDITOR_CLASS(Choice,wxPGChoiceEditor,wxPGEditor)
+WX_PG_IMPLEMENT_INTERNAL_EDITOR_CLASS(Choice,wxPGChoiceEditor,wxPGEditor)
 
 
 // This is a special enhanced double-click processor class.
@@ -792,11 +590,15 @@ void wxPropertyGrid::OnComboItemPaint( wxPGCustomComboControl* pCc,
     wxPGProperty* p = m_selected;
     wxString text;
 
-    const wxPGChoices* pChoices = &p->GetChoices();
+    const wxPGChoices& choices = p->GetChoices();
     const wxPGCommonValue* comVal = NULL;
-    int choiceCount = p->GetChoiceCount();
     int comVals = p->GetDisplayedCommonValueCount();
     int comValIndex = -1;
+
+    int choiceCount = 0;
+    if ( choices.IsOk() )
+        choiceCount = choices.GetCount();
+
     if ( item >= choiceCount && comVals > 0 )
     {
         comValIndex = item - choiceCount;
@@ -824,8 +626,8 @@ void wxPropertyGrid::OnComboItemPaint( wxPGCustomComboControl* pCc,
 
     const wxBitmap* itemBitmap = NULL;
 
-    if ( item >= 0 && pChoices && pChoices->Item(item).GetBitmap().Ok() && comValIndex == -1 )
-        itemBitmap = &pChoices->Item(item).GetBitmap();
+    if ( item >= 0 && choices.IsOk() && choices.Item(item).GetBitmap().Ok() && comValIndex == -1 )
+        itemBitmap = &choices.Item(item).GetBitmap();
 
     //
     // Decide what custom image size to use
@@ -927,9 +729,9 @@ void wxPropertyGrid::OnComboItemPaint( wxPGCustomComboControl* pCc,
             if ( item < 0 && (flags & wxODCB_PAINTING_CONTROL) )
                 item = pCb->GetSelection();
 
-            if ( pChoices && item >= 0 && comValIndex < 0 )
+            if ( choices.IsOk() && item >= 0 && comValIndex < 0 )
             {
-                const wxPGChoiceEntry& cell = pChoices->Item(item);
+                const wxPGChoiceEntry& cell = choices.Item(item);
                 wxPGCellRenderer* renderer = wxPGGlobalVars->m_defaultRenderer;
                 int imageOffset = renderer->PreDrawCell( dc, rect, cell, renderFlags );
                 if ( imageOffset )
@@ -990,20 +792,15 @@ wxWindow* wxPGChoiceEditor::CreateControlsBase( wxPropertyGrid* propGrid,
                                                 const wxSize& sz,
                                                 long extraStyle ) const
 {
-    wxString        defString;
-
-    // Get choices.
-    int index = property->GetChoiceInfo( NULL );
+    const wxPGChoices& choices = property->GetChoices();
+    wxString defString;
+    int index = property->GetChoiceSelection();
 
     bool isUnspecified = property->IsValueUnspecified();
 
-    if ( isUnspecified )
-        index = -1;
-    else
+    if ( !isUnspecified )
         defString = property->GetDisplayedString();
 
-    const wxPGChoices& choices = property->GetChoices();
-
     wxArrayString labels = choices.GetLabels();
 
     wxPGComboBox* cb;
@@ -1017,7 +814,7 @@ wxWindow* wxPGChoiceEditor::CreateControlsBase( wxPropertyGrid* propGrid,
     si.x -= wxPG_CHOICEXADJUST;
     wxWindow* ctrlParent = propGrid->GetPanel();
 
-    int odcbFlags = extraStyle | wxNO_BORDER | wxTE_PROCESS_ENTER;
+    int odcbFlags = extraStyle | wxBORDER_NONE | wxTE_PROCESS_ENTER;
 
     //
     // If common value specified, use appropriate index
@@ -1050,20 +847,10 @@ wxWindow* wxPGChoiceEditor::CreateControlsBase( wxPropertyGrid* propGrid,
                labels,
                odcbFlags);
 
-    //int extRight = propGrid->GetClientSize().x - (po.x+si.x);
-    //int extRight =  - (po.x+si.x);
-
     cb->SetButtonPosition(si.y,0,wxRIGHT);
-    //cb->SetPopupExtents( 1, extRight );
     cb->SetTextIndent(wxPG_XBEFORETEXT-1);
 
     wxPGChoiceEditor_SetCustomPaintWidth( propGrid, cb, property->GetCommonValue() );
-    /*if ( property->GetFlags() & wxPG_PROP_CUSTOMIMAGE )
-    {
-        wxSize imageSize = propGrid->GetImageSize(property, index);
-        if ( imageSize.x ) imageSize.x += ODCB_CUST_PAINT_MARGIN;
-        cb->SetCustomPaintWidth( imageSize.x );
-    }*/
 
     if ( index >= 0 && index < (int)cb->GetCount() )
     {
@@ -1076,6 +863,15 @@ wxWindow* wxPGChoiceEditor::CreateControlsBase( wxPropertyGrid* propGrid,
     else
         cb->SetSelection( -1 );
 
+    // Connect event handling
+    wxWindowID id = cb->GetId();
+    propGrid->Connect(id, wxEVT_COMMAND_COMBOBOX_SELECTED,
+        wxCommandEventHandler(wxPropertyGrid::OnCustomEditorEvent));
+    propGrid->Connect(id, wxEVT_COMMAND_TEXT_UPDATED,
+        wxCommandEventHandler(wxPropertyGrid::OnCustomEditorEvent));
+    propGrid->Connect(id, wxEVT_COMMAND_TEXT_ENTER,
+        wxCommandEventHandler(wxPropertyGrid::OnCustomEditorEvent));
+
 #ifdef __WXMSW__
     cb->Show();
 #endif
@@ -1089,7 +885,7 @@ void wxPGChoiceEditor::UpdateControl( wxPGProperty* property, wxWindow* ctrl ) c
     wxASSERT( ctrl );
     wxOwnerDrawnComboBox* cb = (wxOwnerDrawnComboBox*)ctrl;
     wxASSERT( cb->IsKindOf(CLASSINFO(wxOwnerDrawnComboBox)));
-    int ind = property->GetChoiceInfo( (wxPGChoiceInfo*)NULL );
+    int ind = property->GetChoiceSelection();
     cb->SetSelection(ind);
 }
 
@@ -1162,7 +958,7 @@ bool wxPGChoiceEditor::GetValueFromControl( wxVariant& variant, wxPGProperty* pr
 
     int index = cb->GetSelection();
 
-    if ( index != property->GetChoiceInfo( (wxPGChoiceInfo*) NULL ) ||
+    if ( index != property->GetChoiceSelection() ||
         // Changing unspecified always causes event (returning
         // true here should be enough to trigger it).
          property->IsValueUnspecified()
@@ -1211,7 +1007,9 @@ wxPGChoiceEditor::~wxPGChoiceEditor() { }
 // -----------------------------------------------------------------------
 
 
-WX_PG_IMPLEMENT_EDITOR_CLASS(ComboBox,wxPGComboBoxEditor,wxPGChoiceEditor)
+WX_PG_IMPLEMENT_INTERNAL_EDITOR_CLASS(ComboBox,
+                                      wxPGComboBoxEditor,
+                                      wxPGChoiceEditor)
 
 
 void wxPGComboBoxEditor::UpdateControl( wxPGProperty* property, wxWindow* ctrl ) const
@@ -1290,8 +1088,9 @@ wxPGComboBoxEditor::~wxPGComboBoxEditor() { }
 // -----------------------------------------------------------------------
 
 
-// This simpler implement_editor macro doesn't define class body.
-WX_PG_IMPLEMENT_EDITOR_CLASS(ChoiceAndButton,wxPGChoiceAndButtonEditor,wxPGChoiceEditor)
+WX_PG_IMPLEMENT_INTERNAL_EDITOR_CLASS(ChoiceAndButton,
+                                      wxPGChoiceAndButtonEditor,
+                                      wxPGChoiceEditor)
 
 
 wxPGWindowList wxPGChoiceAndButtonEditor::CreateControls( wxPropertyGrid* propGrid,
@@ -1322,7 +1121,7 @@ wxPGWindowList wxPGChoiceAndButtonEditor::CreateControls( wxPropertyGrid* propGr
     ch_sz.x -= wxPG_TEXTCTRL_AND_BUTTON_SPACING;
 #endif
 
-    wxWindow* ch = wxPG_EDITOR(Choice)->CreateControls(propGrid,property,
+    wxWindow* ch = wxPGEditor_Choice->CreateControls(propGrid,property,
         pos,ch_sz).m_primary;
 
 #ifdef __WXMSW__
@@ -1340,9 +1139,9 @@ wxPGChoiceAndButtonEditor::~wxPGChoiceAndButtonEditor() { }
 // wxPGTextCtrlAndButtonEditor
 // -----------------------------------------------------------------------
 
-
-// This simpler implement_editor macro doesn't define class body.
-WX_PG_IMPLEMENT_EDITOR_CLASS(TextCtrlAndButton,wxPGTextCtrlAndButtonEditor,wxPGTextCtrlEditor)
+WX_PG_IMPLEMENT_INTERNAL_EDITOR_CLASS(TextCtrlAndButton,
+                                      wxPGTextCtrlAndButtonEditor,
+                                      wxPGTextCtrlEditor)
 
 
 wxPGWindowList wxPGTextCtrlAndButtonEditor::CreateControls( wxPropertyGrid* propGrid,
@@ -1367,7 +1166,9 @@ wxPGTextCtrlAndButtonEditor::~wxPGTextCtrlAndButtonEditor() { }
 
 #if wxPG_INCLUDE_CHECKBOX
 
-WX_PG_IMPLEMENT_EDITOR_CLASS(CheckBox,wxPGCheckBoxEditor,wxPGEditor)
+WX_PG_IMPLEMENT_INTERNAL_EDITOR_CLASS(CheckBox,
+                                      wxPGCheckBoxEditor,
+                                      wxPGEditor)
 
 
 // state argument: 0x01 = set if checked
@@ -1433,7 +1234,7 @@ public:
                       wxWindowID id,
                       const wxPoint& pos = wxDefaultPosition,
                       const wxSize& size = wxDefaultSize )
-        : wxControl(parent,id,pos,size,wxNO_BORDER|wxWANTS_CHARS)
+        : wxControl(parent,id,pos,size,wxBORDER_NONE|wxWANTS_CHARS)
     {
         // Due to SetOwnFont stuff necessary for GTK+ 1.2, we need to have this
         SetFont( parent->GetFont() );
@@ -1492,14 +1293,6 @@ bool wxSimpleCheckBox::ProcessEvent(wxEvent& event)
     wxPropertyGrid* propGrid = (wxPropertyGrid*) GetParent()->GetParent();
     wxASSERT( propGrid->IsKindOf(CLASSINFO(wxPropertyGrid)) );
 
-    if ( event.GetEventType() == wxEVT_NAVIGATION_KEY )
-    {
-        //wxLogDebug(wxT("wxEVT_NAVIGATION_KEY"));
-        //SetFocusFromKbd();
-        //event.Skip();
-        //return wxControl::ProcessEvent(event);
-    }
-    else
     if ( ( (event.GetEventType() == wxEVT_LEFT_DOWN || event.GetEventType() == wxEVT_LEFT_DCLICK)
           && ((wxMouseEvent&)event).m_x > (wxPG_XBEFORETEXT-2)
           && ((wxMouseEvent&)event).m_x <= (wxPG_XBEFORETEXT-2+m_boxHeight) )
@@ -1570,12 +1363,6 @@ bool wxSimpleCheckBox::ProcessEvent(wxEvent& event)
     {
         wxKeyEvent& keyEv = (wxKeyEvent&) event;
 
-        if ( keyEv.GetKeyCode() == WXK_TAB )
-        {
-            propGrid->SendNavigationKeyEvent( keyEv.ShiftDown()?0:1 );
-            return true;
-        }
-        else
         if ( keyEv.GetKeyCode() == WXK_SPACE )
         {
             SetValue(2);
@@ -1608,7 +1395,7 @@ wxPGWindowList wxPGCheckBoxEditor::CreateControls( wxPropertyGrid* propGrid,
             (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction)
             &wxPropertyGrid::OnCustomEditorEvent, NULL, propGrid );
 
-    if ( property->GetChoiceInfo((wxPGChoiceInfo*)NULL) &&
+    if ( property->GetChoiceSelection() > 0 &&
          !property->IsValueUnspecified() )
         cb->m_state = 1;
 
@@ -1667,7 +1454,7 @@ void wxPGCheckBoxEditor::DrawValue( wxDC& dc, const wxRect& rect, wxPGProperty*
     int state = 0;
     if ( !property->IsValueUnspecified() )
     {
-        state = property->GetChoiceInfo((wxPGChoiceInfo*)NULL);
+        state = property->GetChoiceSelection();
         if ( dc.GetFont().GetWeight() == wxBOLD ) state |= 2;
     }
     DrawSimpleCheckBox(dc,rect,dc.GetCharHeight(),state,dc.GetTextForeground());
@@ -1676,7 +1463,7 @@ void wxPGCheckBoxEditor::DrawValue( wxDC& dc, const wxRect& rect, wxPGProperty*
 void wxPGCheckBoxEditor::UpdateControl( wxPGProperty* property, wxWindow* ctrl ) const
 {
     wxASSERT( ctrl );
-    ((wxSimpleCheckBox*)ctrl)->m_state = property->GetChoiceInfo((wxPGChoiceInfo*)NULL);
+    ((wxSimpleCheckBox*)ctrl)->m_state = property->GetChoiceSelection();
     ctrl->Refresh();
 }
 
@@ -1698,7 +1485,7 @@ bool wxPGCheckBoxEditor::GetValueFromControl( wxVariant& variant, wxPGProperty*
 
     int index = cb->m_state;
 
-    if ( index != property->GetChoiceInfo( (wxPGChoiceInfo*) NULL ) ||
+    if ( index != property->GetChoiceSelection() ||
          // Changing unspecified always causes event (returning
          // true here should be enough to trigger it).
          property->IsValueUnspecified()
@@ -1739,14 +1526,6 @@ wxWindow* wxPropertyGrid::GetEditorControl() const
     if ( !ctrl )
         return ctrl;
 
-    // If it's clipper window, return its child instead
-#if wxPG_ENABLE_CLIPPER_WINDOW
-    if ( ctrl->IsKindOf(CLASSINFO(wxPGClipperWindow)) )
-    {
-        return ((wxPGClipperWindow*)ctrl)->GetControl();
-    }
-#endif
-
     return ctrl;
 }
 
@@ -1824,29 +1603,6 @@ void wxPropertyGrid::CorrectEditorWidgetPosY()
 
 // -----------------------------------------------------------------------
 
-bool wxPropertyGrid::AdjustPosForClipperWindow( wxWindow* topCtrlWnd, int* x, int* y )
-{
-#if wxPG_ENABLE_CLIPPER_WINDOW
-    // Take clipper window into account
-    if (topCtrlWnd->GetPosition().x < 1 &&
-        !topCtrlWnd->IsKindOf(CLASSINFO(wxPGClipperWindow)))
-    {
-        topCtrlWnd = topCtrlWnd->GetParent();
-        wxASSERT( topCtrlWnd->IsKindOf(CLASSINFO(wxPGClipperWindow)) );
-        *x -= ((wxPGClipperWindow*)topCtrlWnd)->GetXClip();
-        *y -= ((wxPGClipperWindow*)topCtrlWnd)->GetYClip();
-        return true;
-    }
-#else
-    wxUnusedVar(topCtrlWnd);
-    wxUnusedVar(x);
-    wxUnusedVar(y);
-#endif
-    return false;
-}
-
-// -----------------------------------------------------------------------
-
 // Fixes position of wxTextCtrl-like control (wxSpinCtrl usually
 // fits into that category as well).
 void wxPropertyGrid::FixPosForTextCtrl( wxWindow* ctrl, const wxPoint& offset )
@@ -1882,6 +1638,7 @@ wxWindow* wxPropertyGrid::GenerateEditorTextCtrl( const wxPoint& pos,
                                                   int extraStyle,
                                                   int maxLen )
 {
+    wxWindowID id = wxPG_SUBID1;
     wxPGProperty* selected = m_selected;
     wxASSERT(selected);
 
@@ -1911,46 +1668,20 @@ wxWindow* wxPropertyGrid::GenerateEditorTextCtrl( const wxPoint& pos,
     if ( (sz.y - m_lineHeight) > 5 )
         hasSpecialSize = true;
 
-#if wxPG_NAT_TEXTCTRL_BORDER_ANY
-
-    // Create clipper window
-    wxPGClipperWindow* wnd = new wxPGClipperWindow();
-#if defined(__WXMSW__)
-    wnd->Hide();
-#endif
-    wnd->Create(GetPanel(),wxPG_SUBID1,p,s);
-
-    // This generates rect of the control inside the clipper window
-    if ( !hasSpecialSize )
-        wnd->GetControlRect(wxPG_NAT_TEXTCTRL_BORDER_X, wxPG_NAT_TEXTCTRL_BORDER_Y, p, s);
-    else
-        wnd->GetControlRect(0, 0, p, s);
-
-    wxWindow* ctrlParent = wnd;
-
-#else
-
     wxWindow* ctrlParent = GetPanel();
 
     if ( !hasSpecialSize )
-        tcFlags |= wxNO_BORDER;
-
-#endif
+        tcFlags |= wxBORDER_NONE;
 
     wxTextCtrl* tc = new wxTextCtrl();
 
-#if defined(__WXMSW__) && !wxPG_NAT_TEXTCTRL_BORDER_ANY
+#if defined(__WXMSW__)
     tc->Hide();
 #endif
     SetupTextCtrlValue(value);
-    tc->Create(ctrlParent,wxPG_SUBID1,value, p, s,tcFlags);
+    tc->Create(ctrlParent,id,value, p, s,tcFlags);
 
-#if wxPG_NAT_TEXTCTRL_BORDER_ANY
-    wxWindow* ed = wnd;
-    wnd->SetControl(tc);
-#else
     wxWindow* ed = tc;
-#endif
 
     // Center the control vertically
     if ( !hasSpecialSize )
@@ -1966,6 +1697,13 @@ wxWindow* wxPropertyGrid::GenerateEditorTextCtrl( const wxPoint& pos,
     if ( maxLen > 0 )
         tc->SetMaxLength( maxLen );
 
+    // Connect event handling
+    id = ed->GetId();
+    this->Connect(id, wxEVT_COMMAND_TEXT_UPDATED,
+        wxCommandEventHandler(wxPropertyGrid::OnCustomEditorEvent));
+    this->Connect(id, wxEVT_COMMAND_TEXT_ENTER,
+        wxCommandEventHandler(wxPropertyGrid::OnCustomEditorEvent));
+
     return (wxWindow*) ed;
 }
 
@@ -1973,6 +1711,7 @@ wxWindow* wxPropertyGrid::GenerateEditorTextCtrl( const wxPoint& pos,
 
 wxWindow* wxPropertyGrid::GenerateEditorButton( const wxPoint& pos, const wxSize& sz )
 {
+    wxWindowID id = wxPG_SUBID2;
     wxPGProperty* selected = m_selected;
     wxASSERT(selected);
 
@@ -1985,7 +1724,7 @@ wxWindow* wxPropertyGrid::GenerateEditorButton( const wxPoint& pos, const wxSize
    wxSize s(25, -1);
 
    wxButton* but = new wxButton();
-   but->Create(GetPanel(),wxPG_SUBID2,wxS("..."),p,s,wxWANTS_CHARS);
+   but->Create(GetPanel(),id,wxS("..."),p,s,wxWANTS_CHARS);
 
    // Now that we know the size, move to the correct position
    p.x = pos.x + sz.x - but->GetSize().x - 2;
@@ -2012,7 +1751,7 @@ wxWindow* wxPropertyGrid::GenerateEditorButton( const wxPoint& pos, const wxSize
   #ifdef __WXMSW__
     but->Hide();
   #endif
-    but->Create(GetPanel(),wxPG_SUBID2,wxS("..."),p,s,wxWANTS_CHARS);
+    but->Create(GetPanel(),id,wxS("..."),p,s,wxWANTS_CHARS);
 
   #ifdef __WXGTK__
     wxFont font = GetFont();
@@ -2026,6 +1765,11 @@ wxWindow* wxPropertyGrid::GenerateEditorButton( const wxPoint& pos, const wxSize
     if ( selected->HasFlag(wxPG_PROP_READONLY) )
         but->Disable();
 
+    // Connect event handling
+    id = but->GetId();
+    this->Connect(id, wxEVT_COMMAND_BUTTON_CLICKED,
+        wxCommandEventHandler(wxPropertyGrid::OnCustomEditorEvent));
+
     return but;
 }
 
@@ -2123,6 +1867,19 @@ wxPGMultiButton::wxPGMultiButton( wxPropertyGrid* pg, const wxSize& sz )
     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
 {
     if ( id < -1 )
@@ -2160,3 +1917,5 @@ void wxPGMultiButton::Add( const wxString& label, int id )
 }
 
 // -----------------------------------------------------------------------
+
+#endif  // wxUSE_PROPGRID