]> git.saurik.com Git - wxWidgets.git/commitdiff
Fix inplace editing of custom controls for
authorRobert Roebling <robert@roebling.de>
Thu, 19 Apr 2007 12:47:47 +0000 (12:47 +0000)
committerRobert Roebling <robert@roebling.de>
Thu, 19 Apr 2007 12:47:47 +0000 (12:47 +0000)
    GTK+ variant of wxDataViewCtrl.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@45536 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/dataview.h
src/common/datavcmn.cpp
src/gtk/dataview.cpp

index c1c3a2387a12b5cc3ffcb1fd04b63391b60153b8..1d9e87ed980260dd8254785cd28f912e9724ab82 100644 (file)
@@ -24,7 +24,7 @@
 
 #if defined(__WXGTK20__)
     // for testing
-    #define wxUSE_GENERICDATAVIEWCTRL 1
+    // #define wxUSE_GENERICDATAVIEWCTRL 1
 #elif defined(__WXMAC__)
     #define wxUSE_GENERICDATAVIEWCTRL 1
 #else
@@ -243,15 +243,18 @@ public:
     wxDataViewEditorCtrlEvtHandler( wxControl *editor, wxDataViewRenderer *owner );
                          
     void AcceptChangesAndFinish();
+    void SetFocusOnIdle( bool focus = true ) { m_focusOnIdle = focus; }
 
 protected:
     void OnChar( wxKeyEvent &event );
     void OnKillFocus( wxFocusEvent &event );
+    void OnIdle( wxIdleEvent &event );
 
 private:
     wxDataViewRenderer     *m_owner;
     wxControl              *m_editorCtrl;
     bool                    m_finished;
+    bool                    m_focusOnIdle;
 
 private:
     DECLARE_EVENT_TABLE()
@@ -487,7 +490,7 @@ public:
 private:
     wxDataViewListModel    *m_model;
     wxList                  m_cols;
-
+    
 protected:
     DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewCtrlBase)
 };
index 5e5e4e8fd035a22ff76e8d0ffed73b7034da171e..7bc203d4b403ecdb91bc553990069cfda0cc2695 100644 (file)
@@ -728,11 +728,17 @@ bool wxDataViewRendererBase::StartEditing( unsigned int row, wxRect labelRect )
     
     m_editorCtrl = CreateEditorCtrl( GetOwner()->GetOwner()->GetMainWindow(), labelRect, value );
     
-    m_editorCtrl->PushEventHandler( 
-        new wxDataViewEditorCtrlEvtHandler( m_editorCtrl, (wxDataViewRenderer*) this ) );
+    wxDataViewEditorCtrlEvtHandler *handler = 
+        new wxDataViewEditorCtrlEvtHandler( m_editorCtrl, (wxDataViewRenderer*) this );
+        
+    m_editorCtrl->PushEventHandler( handler );
     
+#if defined(__WXGTK20__) && !defined(wxUSE_GENERICDATAVIEWCTRL)
+    handler->SetFocusOnIdle();
+#else
     m_editorCtrl->SetFocus();
-    
+#endif
+
     return true;
 }
 
@@ -773,6 +779,7 @@ bool wxDataViewRendererBase::FinishEditing()
 BEGIN_EVENT_TABLE(wxDataViewEditorCtrlEvtHandler, wxEvtHandler)
     EVT_CHAR           (wxDataViewEditorCtrlEvtHandler::OnChar)
     EVT_KILL_FOCUS     (wxDataViewEditorCtrlEvtHandler::OnKillFocus)
+    EVT_IDLE           (wxDataViewEditorCtrlEvtHandler::OnIdle)
 END_EVENT_TABLE()
 
 wxDataViewEditorCtrlEvtHandler::wxDataViewEditorCtrlEvtHandler(
@@ -785,6 +792,18 @@ wxDataViewEditorCtrlEvtHandler::wxDataViewEditorCtrlEvtHandler(
     m_finished = false;
 }
 
+void wxDataViewEditorCtrlEvtHandler::OnIdle( wxIdleEvent &event )
+{
+    if (m_focusOnIdle)
+    {
+        m_focusOnIdle = false;
+        if (wxWindow::FindFocus() != m_editorCtrl)
+            m_editorCtrl->SetFocus();
+    }
+    
+    event.Skip();
+}
+
 void wxDataViewEditorCtrlEvtHandler::OnChar( wxKeyEvent &event )
 {
     switch ( event.m_keyCode )
index 792d56f9051d43c599546fc5e15f7630809c8fd2..b784bad68e1ced5dc62d05897c5fda7b92fa261f 100644 (file)
@@ -595,7 +595,7 @@ static GtkCellEditable *gtk_wx_cell_renderer_start_editing(
     gtk_tree_path_free( treepath );
 
     cell->StartEditing( model_row, renderrect );
-    
+
     return NULL;
 }