From: Robert Roebling Date: Thu, 19 Apr 2007 12:47:47 +0000 (+0000) Subject: Fix inplace editing of custom controls for X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/30715fa19575aca89b9fee91cdd3d7f0d295548e?ds=inline Fix inplace editing of custom controls for GTK+ variant of wxDataViewCtrl. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@45536 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/dataview.h b/include/wx/dataview.h index c1c3a2387a..1d9e87ed98 100644 --- a/include/wx/dataview.h +++ b/include/wx/dataview.h @@ -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) }; diff --git a/src/common/datavcmn.cpp b/src/common/datavcmn.cpp index 5e5e4e8fd0..7bc203d4b4 100644 --- a/src/common/datavcmn.cpp +++ b/src/common/datavcmn.cpp @@ -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 ) diff --git a/src/gtk/dataview.cpp b/src/gtk/dataview.cpp index 792d56f905..b784bad68e 100644 --- a/src/gtk/dataview.cpp +++ b/src/gtk/dataview.cpp @@ -595,7 +595,7 @@ static GtkCellEditable *gtk_wx_cell_renderer_start_editing( gtk_tree_path_free( treepath ); cell->StartEditing( model_row, renderrect ); - + return NULL; }