+wxDataViewColumn*
+wxDataViewMainWindow::FindColumnForEditing(const wxDataViewItem& item, wxDataViewCellMode mode)
+{
+ // Edit the current column editable in 'mode'. If no column is focused
+ // (typically because the user has full row selected), try to find the
+ // first editable column (this would typically be a checkbox for
+ // wxDATAVIEW_CELL_ACTIVATABLE and we don't want to force the user to set
+ // focus on the checkbox column; or on the only editable text column).
+
+ wxDataViewColumn *candidate = m_currentCol;
+
+ if ( candidate &&
+ candidate->GetRenderer()->GetMode() != mode &&
+ !m_currentColSetByKeyboard )
+ {
+ // If current column was set by mouse to something not editable (in
+ // 'mode') and the user pressed Space/F2 to edit it, treat the
+ // situation as if there was whole-row focus, because that's what is
+ // visually indicated and the mouse click could very well be targeted
+ // on the row rather than on an individual cell.
+ //
+ // But if it was done by keyboard, respect that even if the column
+ // isn't editable, because focus is visually on that column and editing
+ // something else would be surprising.
+ candidate = NULL;
+ }
+
+ if ( !candidate )
+ {
+ 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() == mode )
+ {
+ candidate = c;
+ break;
+ }
+ }
+ }
+
+ // If on container item without columns, only the expander column
+ // may be directly editable:
+ if ( candidate &&
+ GetOwner()->GetExpanderColumn() != candidate &&
+ GetModel()->IsContainer(item) &&
+ !GetModel()->HasContainerColumns(item) )
+ {
+ candidate = GetOwner()->GetExpanderColumn();
+ }
+
+ if ( !candidate )
+ return NULL;
+
+ if ( candidate->GetRenderer()->GetMode() != mode )
+ return NULL;
+
+ return candidate;
+}
+