From 276227fcbb831ed5a83f0f3e40eeb9fac98dea32 Mon Sep 17 00:00:00 2001 From: =?utf8?q?V=C3=A1clav=20Slav=C3=ADk?= Date: Mon, 29 Aug 2011 17:25:25 +0000 Subject: [PATCH] Activate cells from keyboard too in generic wxDataViewCtrl. wxDataViewCtrl only called WXOnActivate() in reaction to double-click. When Enter/Spacebar was pressed, only wxEVT_COMMAND_DATAVIEW_ITEM_ACTIVATED was sent, without calling OnActivate() even if it was possible. Fixed to handle both kinds of input identically. Because there's currently no way to change current focus to a particular column (as GtkTreeView can do), call WXOnActivate() on the first activatable column. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@68952 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/generic/datavgen.cpp | 42 ++++++++++++++++++++++++++++++++++------ 1 file changed, 36 insertions(+), 6 deletions(-) diff --git a/src/generic/datavgen.cpp b/src/generic/datavgen.cpp index 13233aa7e8..e5cb0ce44d 100644 --- a/src/generic/datavgen.cpp +++ b/src/generic/datavgen.cpp @@ -3313,13 +3313,43 @@ void wxDataViewMainWindow::OnChar( wxKeyEvent &event ) case WXK_RETURN: case WXK_SPACE: { - wxDataViewEvent le(wxEVT_COMMAND_DATAVIEW_ITEM_ACTIVATED, - parent->GetId()); - le.SetItem( GetItemByRow(m_currentRow) ); - le.SetEventObject(parent); - le.SetModel(GetModel()); + const wxDataViewItem item = GetItemByRow(m_currentRow); - parent->GetEventHandler()->ProcessEvent(le); + // Activate the first activatable column if there is any: + wxDataViewColumn *activatableCol = NULL; + + const unsigned cols = GetOwner()->GetColumnCount(); + for ( unsigned i = 0; i < cols; i++ ) + { + wxDataViewColumn *c = GetOwner()->GetColumnAt(i); + if ( c->IsHidden() ) + continue; + if ( c->GetRenderer()->GetMode() == wxDATAVIEW_CELL_ACTIVATABLE ) + { + activatableCol = c; + break; + } + } + + if ( activatableCol ) + { + const unsigned colIdx = activatableCol->GetModelColumn(); + const wxRect cell_rect = GetOwner()->GetItemRect(item, activatableCol); + + wxDataViewRenderer *cell = activatableCol->GetRenderer(); + cell->PrepareForItem(GetModel(), item, colIdx); + cell->WXOnActivate(cell_rect, GetModel(), item, colIdx); + } + else + { + wxDataViewEvent le(wxEVT_COMMAND_DATAVIEW_ITEM_ACTIVATED, + parent->GetId()); + le.SetItem(item); + le.SetEventObject(parent); + le.SetModel(GetModel()); + + parent->GetEventHandler()->ProcessEvent(le); + } } break; -- 2.45.2