Implemented the same simple API for creating customized

in-place editing controls for GTK+ and the generic
   version and demonstrate its use in the sample using
   a wxSpinCtrl.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@45518 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling
2007-04-17 12:08:10 +00:00
parent 29825f5fc4
commit 1e510b1e2d
7 changed files with 335 additions and 143 deletions

View File

@@ -706,6 +706,8 @@ wxDataViewRendererBase::wxDataViewRendererBase( const wxString &varianttype,
int WXUNUSED(align) )
{
m_variantType = varianttype;
m_editorCtrl = NULL;
m_row = (unsigned int) -1;
}
const wxDataViewCtrl* wxDataViewRendererBase::GetView() const
@@ -713,6 +715,104 @@ 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 );
m_editorCtrl->PushEventHandler(
new wxDataViewEditorCtrlEvtHandler( m_editorCtrl, (wxDataViewRenderer*) this ) );
m_editorCtrl->SetFocus();
return true;
}
void wxDataViewRendererBase::CancelEditing()
{
// m_editorCtrl->PopEventHandler( true );
delete m_editorCtrl;
GetOwner()->GetOwner()->GetMainWindow()->SetFocus();
}
bool wxDataViewRendererBase::FinishEditing()
{
// m_editorCtrl->PopEventHandler( true );
wxVariant value;
GetValueFromEditorCtrl( m_editorCtrl, value );
delete 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 );
return true;
}
//-----------------------------------------------------------------------------
// wxDataViewEditorCtrlEvtHandler
//-----------------------------------------------------------------------------
BEGIN_EVENT_TABLE(wxDataViewEditorCtrlEvtHandler, wxEvtHandler)
EVT_CHAR (wxDataViewEditorCtrlEvtHandler::OnChar)
EVT_KILL_FOCUS (wxDataViewEditorCtrlEvtHandler::OnKillFocus)
END_EVENT_TABLE()
wxDataViewEditorCtrlEvtHandler::wxDataViewEditorCtrlEvtHandler(
wxControl *editorCtrl,
wxDataViewRenderer *owner )
{
m_owner = owner;
m_editorCtrl = editorCtrl;
m_finished = false;
}
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();
}
// We must let the native text control handle focus
event.Skip();
}
// ---------------------------------------------------------
// wxDataViewColumnBase
// ---------------------------------------------------------