bool wxDataViewRendererBase::StartEditing( const wxDataViewItem &item, wxRect labelRect )
{
+ wxDataViewCtrl* dv_ctrl = GetOwner()->GetOwner();
+
+ // Before doing anything we send an event asking if editing of this item is really wanted.
+ wxDataViewEvent start_event( wxEVT_COMMAND_DATAVIEW_ITEM_START_EDITING, dv_ctrl->GetId() );
+ start_event.SetDataViewColumn( GetOwner() );
+ start_event.SetModel( dv_ctrl->GetModel() );
+ start_event.SetItem( item );
+ start_event.SetEventObject( dv_ctrl );
+ dv_ctrl->GetEventHandler()->ProcessEvent( start_event );
+ if( !start_event.IsAllowed() )
+ return false;
+
m_item = item; // remember for later
unsigned int col = GetOwner()->GetModelColumn();
wxVariant value;
- GetOwner()->GetOwner()->GetModel()->GetValue( value, item, col );
+ dv_ctrl->GetModel()->GetValue( value, item, col );
+
+ m_editorCtrl = CreateEditorCtrl( dv_ctrl->GetMainWindow(), labelRect, value );
+
+ // there might be no editor control for the given item
+ if(!m_editorCtrl)
+ return false;
- m_editorCtrl = CreateEditorCtrl( GetOwner()->GetOwner()->GetMainWindow(), labelRect, value );
(void) new wxKillRef( m_editorCtrl.get() );
wxDataViewEditorCtrlEvtHandler *handler =
m_editorCtrl->PushEventHandler( handler );
- // there might be no editor control for the given item
- if (!m_editorCtrl)
- return false;
-
#if defined(__WXGTK20__) && !defined(wxUSE_GENERICDATAVIEWCTRL)
handler->SetFocusOnIdle();
#else
#endif
// Now we should send Editing Started event
- wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_STARTED, GetOwner()->GetOwner()->GetId() );
+ wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_STARTED, dv_ctrl->GetId() );
event.SetDataViewColumn( GetOwner() );
- event.SetModel( GetOwner()->GetOwner()->GetModel() );
+ event.SetModel( dv_ctrl->GetModel() );
event.SetItem( item );
- GetOwner()->GetOwner()->GetEventHandler()->ProcessEvent( event );
+ event.SetEventObject( dv_ctrl );
+ dv_ctrl->GetEventHandler()->ProcessEvent( event );
return true;
}
void wxDataViewRendererBase::CancelEditing()
{
- if (!m_editorCtrl) return;
+ if (!m_editorCtrl)
+ return;
GetOwner()->GetOwner()->GetMainWindow()->SetFocus();
bool wxDataViewRendererBase::FinishEditing()
{
- if (!m_editorCtrl) return true;
+ if (!m_editorCtrl)
+ return true;
wxVariant value;
GetValueFromEditorCtrl( m_editorCtrl, value );
- GetOwner()->GetOwner()->GetMainWindow()->SetFocus();
+ wxDataViewCtrl* dv_ctrl = GetOwner()->GetOwner();
+
+ dv_ctrl->GetMainWindow()->SetFocus();
m_editorCtrl->Hide();
wxPendingDelete.Append( m_editorCtrl );
return false;
unsigned int col = GetOwner()->GetModelColumn();
- GetOwner()->GetOwner()->GetModel()->SetValue( value, m_item, col );
- GetOwner()->GetOwner()->GetModel()->ValueChanged( m_item, col );
+ dv_ctrl->GetModel()->SetValue( value, m_item, col );
+ dv_ctrl->GetModel()->ValueChanged( m_item, col );
// Now we should send Editing Done event
- wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE, GetOwner()->GetOwner()->GetId() );
+ wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE, dv_ctrl->GetId() );
event.SetDataViewColumn( GetOwner() );
- event.SetModel( GetOwner()->GetOwner()->GetModel() );
+ event.SetModel( dv_ctrl->GetModel() );
event.SetItem( m_item );
- GetOwner()->GetOwner()->GetEventHandler()->ProcessEvent( event );
+ event.SetEventObject( dv_ctrl );
+ dv_ctrl->GetEventHandler()->ProcessEvent( event );
return true;
}
wxControl* wxDataViewTextRenderer::CreateEditorCtrl( wxWindow *parent,
wxRect labelRect, const wxVariant &value )
{
- return new wxTextCtrl( parent, wxID_ANY, value,
- wxPoint(labelRect.x,labelRect.y),
- wxSize(labelRect.width,labelRect.height) );
+ wxTextCtrl* ctrl = new wxTextCtrl( parent, wxID_ANY, value,
+ wxPoint(labelRect.x,labelRect.y),
+ wxSize(labelRect.width,labelRect.height) );
+
+ // select the text in the control an place the cursor at the end
+ ctrl->SetInsertionPointEnd();
+ ctrl->SelectAll();
+
+ return ctrl;
}
bool wxDataViewTextRenderer::GetValueFromEditorCtrl( wxControl *editor, wxVariant &value )
labelRect.width -= w;
}
- return new wxTextCtrl( parent, wxID_ANY, text,
- wxPoint(labelRect.x,labelRect.y),
- wxSize(labelRect.width,labelRect.height) );
+ wxTextCtrl* ctrl = new wxTextCtrl( parent, wxID_ANY, text,
+ wxPoint(labelRect.x,labelRect.y),
+ wxSize(labelRect.width,labelRect.height) );
+
+ // select the text in the control an place the cursor at the end
+ ctrl->SetInsertionPointEnd();
+ ctrl->SelectAll();
+
+ return ctrl;
}
bool wxDataViewIconTextRenderer::GetValueFromEditorCtrl( wxControl *editor, wxVariant& value )
wxSafeYield();
}
- int xpos = 0;
- unsigned int cols = GetOwner()->GetColumnCount();
- unsigned int i;
- for (i = 0; i < cols; i++)
- {
- wxDataViewColumn *c = GetOwner()->GetColumnAt( i );
- if (c->IsHidden())
- continue; // skip it!
-
- if (c == m_currentCol)
- break;
- xpos += c->GetWidth();
- }
-
- // we have to take an expander column into account and compute its indentation
- // to get the editor at the correct x position where the actual text is
- int indent = 0;
- if (!IsVirtualList() && GetOwner()->GetExpanderColumn() == m_currentCol)
- {
- wxDataViewTreeNode* node = GetTreeNodeByRow(m_currentRow);
- indent = GetOwner()->GetIndent() * node->GetIndentLevel();
- indent = indent + m_lineHeight;
-
- if(!node->HasChildren())
- delete node;
- }
-
- wxRect labelRect( xpos + indent,
- GetLineStart( m_currentRow ),
- m_currentCol->GetWidth() - indent,
- GetLineHeight( m_currentRow ) );
+ wxDataViewItem item = GetItemByRow( m_currentRow );
- GetOwner()->CalcScrolledPosition( labelRect.x, labelRect.y,
- &labelRect.x, &labelRect.y);
+ wxRect labelRect = GetItemRect(item, m_currentCol);
- wxDataViewItem item = GetItemByRow( m_currentRow );
m_currentCol->GetRenderer()->StartEditing( item, labelRect );
}
if (!node)
break;
- if (node->HasChildren())
+ if (node->HasChildren() && node->IsOpen())
{
Collapse(m_currentRow);
}
- else
+ else // if the node is already closed we move the selection to its parent
{
wxDataViewTreeNode *parent_node = node->GetParent();
- delete node;
+
+ if(!node->HasChildren())
+ delete node;
+
if (parent_node)
{
int parent = GetRowByItem( parent_node->GetItem() );
SelectRow( row, false);
SelectRow( parent, true );
ChangeCurrentRow( parent );
+ GetOwner()->EnsureVisible( parent, -1 );
SendSelectionChangedEvent( parent_node->GetItem() );
}
}
SelectRow( row, false );
SelectRow( row + 1, true );
ChangeCurrentRow( row + 1 );
+ GetOwner()->EnsureVisible( row + 1, -1 );
SendSelectionChangedEvent( GetItemByRow(row+1) );
}
break;
}
break;
+ case WXK_F2:
+ {
+ if(m_selection.size() == 1)
+ {
+ // TODO: we need to revise that when we have a concept for a 'current column'
+ GetOwner()->StartEditor(GetItemByRow(m_selection[0]), 0);
+ }
+ }
+ break;
+
default:
event.Skip();
}
SelectRow(m_currentRow,true);
SendSelectionChangedEvent(GetItemByRow( m_currentRow ) );
}
-
+ }
+ else if (event.RightUp())
+ {
wxVariant value;
model->GetValue( value, item, col->GetModelColumn() );
wxWindow *parent = GetParent();