+ m_editorCtrl = NULL;
+ m_row = (unsigned int) -1;
+}
+
+const wxDataViewCtrl* wxDataViewRendererBase::GetView() const
+{
+ return wx_const_cast(wxDataViewRendererBase*, this)->GetOwner()->GetOwner();
+}
+
+bool wxDataViewRendererBase::StartEditing( unsigned int row, wxRect labelRect )
+{
+ m_row = row; // remember for later
+
+ unsigned int col = GetOwner()->GetModelColumn();
+ wxVariant value;
+ GetOwner()->GetOwner()->GetModel()->GetValue( value, col, row );
+
+ m_editorCtrl = CreateEditorCtrl( GetOwner()->GetOwner()->GetMainWindow(), labelRect, value );
+
+ 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;
+}
+
+void wxDataViewRendererBase::CancelEditing()
+{
+ wxPendingDelete.Append( m_editorCtrl );
+
+ GetOwner()->GetOwner()->GetMainWindow()->SetFocus();
+
+ // m_editorCtrl->PopEventHandler( true );
+}
+
+bool wxDataViewRendererBase::FinishEditing()
+{
+ wxVariant value;
+ GetValueFromEditorCtrl( m_editorCtrl, value );
+
+ wxPendingDelete.Append( m_editorCtrl );
+
+ GetOwner()->GetOwner()->GetMainWindow()->SetFocus();
+
+ if (!Validate(value))
+ return false;
+
+ unsigned int col = GetOwner()->GetModelColumn();
+ GetOwner()->GetOwner()->GetModel()->SetValue( value, col, m_row );
+ GetOwner()->GetOwner()->GetModel()->ValueChanged( col, m_row );
+
+ // m_editorCtrl->PopEventHandler( true );
+
+ return true;
+}
+
+//-----------------------------------------------------------------------------
+// wxDataViewEditorCtrlEvtHandler
+//-----------------------------------------------------------------------------
+
+BEGIN_EVENT_TABLE(wxDataViewEditorCtrlEvtHandler, wxEvtHandler)
+ EVT_CHAR (wxDataViewEditorCtrlEvtHandler::OnChar)
+ EVT_KILL_FOCUS (wxDataViewEditorCtrlEvtHandler::OnKillFocus)
+ EVT_IDLE (wxDataViewEditorCtrlEvtHandler::OnIdle)
+END_EVENT_TABLE()
+
+wxDataViewEditorCtrlEvtHandler::wxDataViewEditorCtrlEvtHandler(
+ wxControl *editorCtrl,
+ wxDataViewRenderer *owner )
+{
+ m_owner = owner;
+ m_editorCtrl = editorCtrl;
+
+ 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 )
+ {
+ case WXK_RETURN:
+ m_finished = true;
+ m_owner->FinishEditing();
+ break;
+
+ case WXK_ESCAPE:
+ m_finished = true;
+ m_owner->CancelEditing();
+ break;
+
+ default:
+ event.Skip();
+ }
+}
+
+void wxDataViewEditorCtrlEvtHandler::OnKillFocus( wxFocusEvent &event )
+{
+ if (!m_finished)
+ {
+ m_finished = true;
+ m_owner->FinishEditing();
+ }
+
+ event.Skip();