X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ce468dc28b8a4b8ee651afc7bcebc4232e622049..9b49405777342458dc1666001865eef7309b6c30:/src/generic/datavgen.cpp diff --git a/src/generic/datavgen.cpp b/src/generic/datavgen.cpp index 6e46661662..afe948e080 100644 --- a/src/generic/datavgen.cpp +++ b/src/generic/datavgen.cpp @@ -70,7 +70,7 @@ static const int EXPANDER_OFFSET = 1; #endif // Below is the compare stuff. -// For the generic implementation, both the leaf nodes and the nodes are sorted for +// For the generic implementation, both the leaf nodes and the nodes are sorted for // fast search when needed static wxDataViewModel* g_model; static int g_column = -2; @@ -230,7 +230,7 @@ class wxDataViewTreeNode; WX_DEFINE_ARRAY( wxDataViewTreeNode *, wxDataViewTreeNodes ); WX_DEFINE_ARRAY( void* , wxDataViewTreeLeaves); -int LINKAGEMODE wxGenericTreeModelNodeCmp( wxDataViewTreeNode ** node1, +int LINKAGEMODE wxGenericTreeModelNodeCmp( wxDataViewTreeNode ** node1, wxDataViewTreeNode ** node2); int LINKAGEMODE wxGenericTreeModelItemCmp( void ** id1, void ** id2); @@ -351,7 +351,7 @@ private: int m_subTreeCount; }; -int LINKAGEMODE wxGenericTreeModelNodeCmp( wxDataViewTreeNode ** node1, +int LINKAGEMODE wxGenericTreeModelNodeCmp( wxDataViewTreeNode ** node1, wxDataViewTreeNode ** node2) { return g_model->Compare( (*node1)->GetItem(), (*node2)->GetItem(), g_column, g_asending ); @@ -451,15 +451,15 @@ public: int GetEndOfLastCol() const; unsigned int GetFirstVisibleRow() const; - // I change this method to un const because in the tree view, - // the displaying number of the tree are changing along with the + // I change this method to un const because in the tree view, + // the displaying number of the tree are changing along with the // expanding/collapsing of the tree nodes unsigned int GetLastVisibleRow(); unsigned int GetRowCount(); wxDataViewItem GetSelection() const; wxDataViewSelection GetSelections(){ return m_selection; } - void SetSelections( const wxDataViewSelection & sel ) + void SetSelections( const wxDataViewSelection & sel ) { m_selection = sel; UpdateDisplay(); } void Select( const wxArrayInt& aSelections ); void SelectAllRows( bool on ); @@ -495,9 +495,10 @@ public: void HitTest( const wxPoint & point, wxDataViewItem & item, wxDataViewColumn* &column ); wxRect GetItemRect( const wxDataViewItem & item, const wxDataViewColumn* column ); - void Expand( unsigned int row ) { OnExpanding( row ); } - void Collapse( unsigned int row ) { OnCollapsing( row ); } + void Expand( unsigned int row ); + void Collapse( unsigned int row ); bool IsExpanded( unsigned int row ) const; + bool HasChildren( unsigned int row ) const; #if wxUSE_DRAG_AND_DROP bool EnableDragSource( const wxDataFormat &format ); @@ -518,8 +519,6 @@ private: int RecalculateCount(); wxDataViewEvent SendExpanderEvent( wxEventType type, const wxDataViewItem & item ); - void OnExpanding( unsigned int row ); - void OnCollapsing( unsigned int row ); wxDataViewTreeNode * FindNode( const wxDataViewItem & item ); @@ -672,7 +671,7 @@ wxDataViewCustomRenderer::wxDataViewCustomRenderer( const wxString &varianttype, { } -void wxDataViewCustomRenderer::RenderText( const wxString &text, int xoffset, +void wxDataViewCustomRenderer::RenderText( const wxString &text, int xoffset, wxRect cell, wxDC *dc, int state ) { wxDataViewCtrl *view = GetOwner()->GetOwner(); @@ -680,8 +679,8 @@ void wxDataViewCustomRenderer::RenderText( const wxString &text, int xoffset, wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT) : view->GetForegroundColour(); dc->SetTextForeground(col); - dc->DrawText( text, - cell.x + xoffset, + dc->DrawText( text, + cell.x + xoffset, cell.y + ((cell.height - dc->GetCharHeight()) / 2)); } @@ -1131,19 +1130,33 @@ wxSize wxDataViewIconTextRenderer::GetSize() const return wxSize(80,20); } -wxControl * -wxDataViewIconTextRenderer::CreateEditorCtrl(wxWindow * WXUNUSED(parent), - wxRect WXUNUSED(labelRect), - const wxVariant& WXUNUSED(value)) +wxControl* wxDataViewIconTextRenderer::CreateEditorCtrl(wxWindow *parent, wxRect labelRect, const wxVariant& value) { - return NULL; + wxDataViewIconText iconText; + iconText << value; + + wxString text = iconText.GetText(); + + // adjust the label rect to take the width of the icon into account + if (iconText.GetIcon().IsOk()) + { + int w = iconText.GetIcon().GetWidth() + 4; + labelRect.x += w; + labelRect.width -= w; + } + + return new wxTextCtrl( parent, wxID_ANY, text, + wxPoint(labelRect.x,labelRect.y), + wxSize(labelRect.width,labelRect.height) ); } -bool -wxDataViewIconTextRenderer::GetValueFromEditorCtrl(wxControl* WXUNUSED(editor), - wxVariant& WXUNUSED(value)) +bool wxDataViewIconTextRenderer::GetValueFromEditorCtrl( wxControl *editor, wxVariant& value ) { - return false; + wxTextCtrl *text = (wxTextCtrl*) editor; + + wxDataViewIconText iconText(text->GetValue(), m_value.GetIcon()); + value << iconText; + return true; } //----------------------------------------------------------------------------- @@ -1291,7 +1304,7 @@ void wxDataViewRenameTimer::Notify() //----------------------------------------------------------------------------- // The tree building helper, declared firstly -static void BuildTreeHelper( wxDataViewModel * model, wxDataViewItem & item, +static void BuildTreeHelper( wxDataViewModel * model, wxDataViewItem & item, wxDataViewTreeNode * node); int LINKAGEMODE wxDataViewSelectionCmp( unsigned int row1, unsigned int row2 ) @@ -1400,7 +1413,7 @@ void wxDataViewMainWindow::RemoveDropHint() } } -wxDragResult wxDataViewMainWindow::OnDragOver( wxDataFormat format, wxCoord x, +wxDragResult wxDataViewMainWindow::OnDragOver( wxDataFormat format, wxCoord x, wxCoord y, wxDragResult def ) { int xx = x; @@ -1475,7 +1488,7 @@ bool wxDataViewMainWindow::OnDrop( wxDataFormat format, wxCoord x, wxCoord y ) return true; } -wxDragResult wxDataViewMainWindow::OnData( wxDataFormat format, wxCoord x, wxCoord y, +wxDragResult wxDataViewMainWindow::OnData( wxDataFormat format, wxCoord x, wxCoord y, wxDragResult def ) { int xx = x; @@ -1532,7 +1545,7 @@ wxBitmap wxDataViewMainWindow::CreateItemBitmap( unsigned int row, int &indent ) { wxDataViewTreeNode *node = GetTreeNodeByRow(row); indent = GetOwner()->GetIndent() * node->GetIndentLevel(); - indent = indent + m_lineHeight; + indent = indent + m_lineHeight; // try to use the m_lineHeight as the expander space if(!node->HasChildren()) @@ -1789,7 +1802,7 @@ void wxDataViewMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) dataitem = node->GetItem(); - if ((i > 0) && model->IsContainer(dataitem) && + if ((i > 0) && model->IsContainer(dataitem) && !model->HasContainerColumns(dataitem)) continue; } @@ -1827,10 +1840,10 @@ void wxDataViewMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) // change the cell_rect.x to the appropriate pos int expander_x = indent + EXPANDER_MARGIN; - int expander_y = cell_rect.y + EXPANDER_MARGIN + (GetLineHeight(item) / 2) + int expander_y = cell_rect.y + EXPANDER_MARGIN + (GetLineHeight(item) / 2) - (expander_width/2) - EXPANDER_OFFSET; - indent = indent + m_lineHeight; + indent = indent + m_lineHeight; // try to use the m_lineHeight as the expander space dc.SetPen( m_penExpander ); @@ -1844,7 +1857,7 @@ void wxDataViewMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) flag |= wxCONTROL_CURRENT; } if( node->IsOpen() ) - wxRendererNative::Get().DrawTreeItemButton( this, dc, rect, + wxRendererNative::Get().DrawTreeItemButton( this, dc, rect, flag|wxCONTROL_EXPANDED ); else wxRendererNative::Get().DrawTreeItemButton( this, dc, rect, flag); @@ -1863,7 +1876,7 @@ void wxDataViewMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) // cannot be bigger than allocated space wxSize size = cell->GetSize(); - // Because of the tree structure indent, here we should minus the width + // Because of the tree structure indent, here we should minus the width // of the cell for drawing size.x = wxMin( size.x + 2*PADDING_RIGHTLEFT, cell_rect.width - indent ); // size.y = wxMin( size.y, cell_rect.height ); @@ -2091,7 +2104,7 @@ bool wxDataViewMainWindow::ItemDeleted(const wxDataViewItem& parent, wxDataViewTreeNode * node = FindNode(parent); wxCHECK_MSG( node != NULL, false, "item not found" ); - wxCHECK_MSG( node->GetChildren().Index( item.GetID() ) != wxNOT_FOUND, + wxCHECK_MSG( node->GetChildren().Index( item.GetID() ) != wxNOT_FOUND, false, "item not found" ); int sub = -1; @@ -2587,15 +2600,15 @@ int wxDataViewMainWindow::GetLineStart( unsigned int row ) const if (column->IsHidden()) continue; // skip it! - if ((col != 0) && - model->IsContainer(item) && + if ((col != 0) && + model->IsContainer(item) && !model->HasContainerColumns(item)) continue; // skip it! wxVariant value; model->GetValue( value, item, column->GetModelColumn() ); - wxDataViewRenderer *renderer = + wxDataViewRenderer *renderer = const_cast(column->GetRenderer()); renderer->SetValue( value ); height = wxMax( height, renderer->GetSize().y ); @@ -2650,15 +2663,15 @@ int wxDataViewMainWindow::GetLineAt( unsigned int y ) const if (column->IsHidden()) continue; // skip it! - if ((col != 0) && - model->IsContainer(item) && + if ((col != 0) && + model->IsContainer(item) && !model->HasContainerColumns(item)) continue; // skip it! wxVariant value; model->GetValue( value, item, column->GetModelColumn() ); - wxDataViewRenderer *renderer = + wxDataViewRenderer *renderer = const_cast(column->GetRenderer()); renderer->SetValue( value ); height = wxMax( height, renderer->GetSize().y ); @@ -2703,15 +2716,15 @@ int wxDataViewMainWindow::GetLineHeight( unsigned int row ) const if (column->IsHidden()) continue; // skip it! - if ((col != 0) && - model->IsContainer(item) && + if ((col != 0) && + model->IsContainer(item) && !model->HasContainerColumns(item)) continue; // skip it! wxVariant value; model->GetValue( value, item, column->GetModelColumn() ); - wxDataViewRenderer *renderer = + wxDataViewRenderer *renderer = const_cast(column->GetRenderer()); renderer->SetValue( value ); height = wxMax( height, renderer->GetSize().y ); @@ -2728,7 +2741,7 @@ int wxDataViewMainWindow::GetLineHeight( unsigned int row ) const class RowToItemJob: public DoJob { public: - RowToItemJob( unsigned int row , int current ) + RowToItemJob( unsigned int row , int current ) { this->row = row; this->current = current; } virtual ~RowToItemJob() {} @@ -2748,9 +2761,9 @@ public: } else { - // If the current has no child node, we can find the desired item of the row + // If the current has no child node, we can find the desired item of the row // number directly. - // This if can speed up finding in some case, and will has a very good effect + // This if can speed up finding in some case, and will has a very good effect // when it comes to list view if( node->GetNodes().GetCount() == 0) { @@ -2826,9 +2839,9 @@ public: { parent = node; - // If the current node has no children, we can find the desired item of the + // If the current node has no children, we can find the desired item of the // row number directly. - // This if can speed up finding in some case, and will have a very good + // This if can speed up finding in some case, and will have a very good // effect for list views. if( node->GetNodes().GetCount() == 0) { @@ -2876,7 +2889,7 @@ wxDataViewTreeNode * wxDataViewMainWindow::GetTreeNodeByRow(unsigned int row) co return job.GetResult(); } -wxDataViewEvent wxDataViewMainWindow::SendExpanderEvent( wxEventType type, +wxDataViewEvent wxDataViewMainWindow::SendExpanderEvent( wxEventType type, const wxDataViewItem & item ) { wxWindow *parent = GetParent(); @@ -2908,20 +2921,42 @@ bool wxDataViewMainWindow::IsExpanded( unsigned int row ) const return node->IsOpen(); } +bool wxDataViewMainWindow::HasChildren( unsigned int row ) const +{ + if (IsVirtualList()) + return false; + + wxDataViewTreeNode * node = GetTreeNodeByRow(row); + if (!node) + return false; + + if (!node->HasChildren()) + { + delete node; + return false; + } + + return true; +} -void wxDataViewMainWindow::OnExpanding( unsigned int row ) +void wxDataViewMainWindow::Expand( unsigned int row ) { if (IsVirtualList()) return; wxDataViewTreeNode * node = GetTreeNodeByRow(row); - if( node != NULL ) + if (!node) + return; + + if (!node->HasChildren()) { - if( node->HasChildren()) - { - if( !node->IsOpen()) + delete node; + return; + } + + if (!node->IsOpen()) { - wxDataViewEvent e = + wxDataViewEvent e = SendExpanderEvent(wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDING, node->GetItem()); // Check if the user prevent expanding @@ -2958,23 +2993,9 @@ void wxDataViewMainWindow::OnExpanding( unsigned int row ) // Send the expanded event SendExpanderEvent(wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDED,node->GetItem()); } - else - { -#if 0 - // Why should we select the next row here??? - SelectRow( row, false ); - SelectRow( row + 1, true ); - ChangeCurrentRow( row + 1 ); - SendSelectionChangedEvent( GetItemByRow(row+1)); -#endif - } - } - else - delete node; - } } -void wxDataViewMainWindow::OnCollapsing(unsigned int row) +void wxDataViewMainWindow::Collapse(unsigned int row) { if (IsVirtualList()) return; @@ -2982,16 +3003,16 @@ void wxDataViewMainWindow::OnCollapsing(unsigned int row) wxDataViewTreeNode *node = GetTreeNodeByRow(row); if (!node) return; - - if( !node->HasChildren()) + + if (!node->HasChildren()) { delete node; return; } - if( node->HasChildren() && node->IsOpen() ) + if (node->IsOpen()) { - wxDataViewEvent e = + wxDataViewEvent e = SendExpanderEvent(wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSING,node->GetItem()); if( e.GetSkipped() ) return; @@ -3026,7 +3047,7 @@ void wxDataViewMainWindow::OnCollapsing(unsigned int row) { // if there were no selected items below our node we still need to "fix" the // selection list to adjust for the changing of the row indices. - // We actually do the opposite of what we are doing in OnExpanding(). + // We actually do the opposite of what we are doing in Expand(). for(unsigned i=0; iGetItem()); } - else - { - node = node->GetParent(); - if( node != NULL ) - { - int parent = GetRowByItem( node->GetItem() ); - if( parent >= 0 ) - { - SelectRow( row, false); - SelectRow(parent , true ); - ChangeCurrentRow( parent ); - SendSelectionChangedEvent( node->GetItem() ); - } - } - } } wxDataViewTreeNode * wxDataViewMainWindow::FindNode( const wxDataViewItem & item ) @@ -3123,7 +3129,7 @@ wxDataViewTreeNode * wxDataViewMainWindow::FindNode( const wxDataViewItem & item return NULL; } -void wxDataViewMainWindow::HitTest( const wxPoint & point, wxDataViewItem & item, +void wxDataViewMainWindow::HitTest( const wxPoint & point, wxDataViewItem & item, wxDataViewColumn* &column ) { wxDataViewColumn *col = NULL; @@ -3148,31 +3154,74 @@ void wxDataViewMainWindow::HitTest( const wxPoint & point, wxDataViewItem & item item = GetItemByRow( GetLineAt( y ) ); } -wxRect wxDataViewMainWindow::GetItemRect( const wxDataViewItem & item, +wxRect wxDataViewMainWindow::GetItemRect( const wxDataViewItem & item, const wxDataViewColumn* column ) { + int xpos = 0; + int width = 0; + + unsigned int cols = GetOwner()->GetColumnCount(); + // If column is null the loop will compute the combined width of all columns. + // Otherwise, it will compute the x position of the column we are looking for. + for (unsigned int i = 0; i < cols; i++) + { + wxDataViewColumn* col = GetOwner()->GetColumnAt( i ); + + if (col == column) + break; + + if (col->IsHidden()) + continue; // skip it! + + xpos += col->GetWidth(); + width += col->GetWidth(); + } + + if(column != 0) + { + // If we have a column, we need can get its width directly. + if(column->IsHidden()) + width = 0; + else + width = column->GetWidth(); + + } + else + { + // If we have no column, we reset the x position back to zero. + xpos = 0; + } + + // we have to take an expander column into account and compute its indentation + // to get the correct x position where the actual text is + int indent = 0; int row = GetRowByItem(item); - int y = GetLineStart( row ); - int h = GetLineHeight( m_lineHeight ); - int x = 0; - wxDataViewColumn *col = NULL; - for( int i = 0, cols = GetOwner()->GetColumnCount(); i < cols; i ++ ) + if (!IsVirtualList() && (column == 0 || GetOwner()->GetExpanderColumn() == column) ) { - col = GetOwner()->GetColumnAt( i ); - x += col->GetWidth(); - if( GetOwner()->GetColumnAt(i+1) == column ) - break; + wxDataViewTreeNode* node = GetTreeNodeByRow(row); + indent = GetOwner()->GetIndent() * node->GetIndentLevel(); + indent = indent + m_lineHeight; // use m_lineHeight as the width of the expander + + if(!node->HasChildren()) + delete node; } - int w = col->GetWidth(); - m_owner->CalcScrolledPosition( x, y, &x, &y ); - return wxRect(x, y, w, h); + + wxRect itemRect( xpos + indent, + GetLineStart( row ), + width - indent, + GetLineHeight( row ) ); + + GetOwner()->CalcScrolledPosition( itemRect.x, itemRect.y, + &itemRect.x, &itemRect.y ); + + return itemRect; } int wxDataViewMainWindow::RecalculateCount() { if (!m_root) { - wxDataViewIndexListModel *list_model = + wxDataViewIndexListModel *list_model = (wxDataViewIndexListModel*) GetOwner()->GetModel(); #ifndef __WXMAC__ return list_model->GetLastIndex() + 1; @@ -3272,7 +3321,7 @@ int wxDataViewMainWindow::GetRowByItem(const wxDataViewItem & item) const } } -static void BuildTreeHelper( wxDataViewModel * model, wxDataViewItem & item, +static void BuildTreeHelper( wxDataViewModel * model, wxDataViewItem & item, wxDataViewTreeNode * node) { if( !model->IsContainer( item ) ) @@ -3365,11 +3414,10 @@ void wxDataViewMainWindow::OnChar( wxKeyEvent &event ) switch ( event.GetKeyCode() ) { case WXK_RETURN: - { - if (m_currentRow >= 0) { wxWindow *parent = GetParent(); - wxDataViewEvent le(wxEVT_COMMAND_DATAVIEW_ITEM_ACTIVATED, parent->GetId()); + wxDataViewEvent le(wxEVT_COMMAND_DATAVIEW_ITEM_ACTIVATED, + parent->GetId()); le.SetItem( GetItemByRow(m_currentRow) ); le.SetEventObject(parent); le.SetModel(GetOwner()->GetModel()); @@ -3377,7 +3425,7 @@ void wxDataViewMainWindow::OnChar( wxKeyEvent &event ) parent->GetEventHandler()->ProcessEvent(le); } break; - } + case WXK_UP: if ( m_currentRow > 0 ) OnArrowChar( m_currentRow - 1, event ); @@ -3389,16 +3437,57 @@ void wxDataViewMainWindow::OnChar( wxKeyEvent &event ) break; // Add the process for tree expanding/collapsing case WXK_LEFT: - OnCollapsing(m_currentRow); - break; - case WXK_RIGHT: - OnExpanding( m_currentRow); - break; + { + if (IsVirtualList()) + break; + + wxDataViewTreeNode* node = GetTreeNodeByRow(m_currentRow); + if (!node) + break; + + if (node->HasChildren()) + { + Collapse(m_currentRow); + } + else + { + wxDataViewTreeNode *parent_node = node->GetParent(); + delete node; + if (parent_node) + { + int parent = GetRowByItem( parent_node->GetItem() ); + if ( parent >= 0 ) + { + unsigned int row = m_currentRow; + SelectRow( row, false); + SelectRow( parent, true ); + ChangeCurrentRow( parent ); + SendSelectionChangedEvent( parent_node->GetItem() ); + } + } + } + break; + } + case WXK_RIGHT: + { + if (!IsExpanded( m_currentRow )) + Expand( m_currentRow ); + else + { + unsigned int row = m_currentRow; + SelectRow( row, false ); + SelectRow( row + 1, true ); + ChangeCurrentRow( row + 1 ); + SendSelectionChangedEvent( GetItemByRow(row+1) ); + } + break; + } case WXK_END: + { if (!IsEmpty()) OnArrowChar( GetRowCount() - 1, event ); break; - + } case WXK_HOME: if (!IsEmpty()) OnArrowChar( 0, event ); @@ -3538,7 +3627,7 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event ) if (event.LeftIsDown()) { - m_owner->CalcUnscrolledPosition( m_dragStart.x, m_dragStart.y, + m_owner->CalcUnscrolledPosition( m_dragStart.x, m_dragStart.y, &m_dragStart.x, &m_dragStart.y ); unsigned int drag_item_row = GetLineAt( m_dragStart.y ); wxDataViewItem item = GetItemByRow( drag_item_row ); @@ -3633,7 +3722,7 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event ) SendSelectionChangedEvent( GetItemByRow(m_lineSelectSingleOnUp) ); } - // If the user click the expander, we do not do editing even if the column + // If the user click the expander, we do not do editing even if the column // with expander are editable if (m_lastOnSame && !ignore_other_columns) { @@ -3689,13 +3778,13 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event ) { wxDataViewTreeNode* node = GetTreeNodeByRow(current); - // hoverOverExpander being true tells us that our node must be + // hoverOverExpander being true tells us that our node must be // valid and have children. // So we don't need any extra checks. if( node->IsOpen() ) - OnCollapsing(current); + Collapse(current); else - OnExpanding(current); + Expand(current); } else if ((event.LeftDown() || simulateClick) && !hoverOverExpander) { @@ -3774,7 +3863,7 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event ) cell->SetValue( value ); wxRect cell_rect( xpos, GetLineStart( current ), col->GetWidth(), GetLineHeight( current ) ); - /* ignore ret */ cell->LeftClick( event.GetPosition(), cell_rect, + /* ignore ret */ cell->LeftClick( event.GetPosition(), cell_rect, model, item, col->GetModelColumn()); } } @@ -4289,13 +4378,13 @@ void wxDataViewCtrl::EnsureVisible( const wxDataViewItem & item, const wxDataVie } -void wxDataViewCtrl::HitTest( const wxPoint & point, wxDataViewItem & item, +void wxDataViewCtrl::HitTest( const wxPoint & point, wxDataViewItem & item, wxDataViewColumn* &column ) const { m_clientArea->HitTest(point, item, column); } -wxRect wxDataViewCtrl::GetItemRect( const wxDataViewItem & item, +wxRect wxDataViewCtrl::GetItemRect( const wxDataViewItem & item, const wxDataViewColumn* column ) const { return m_clientArea->GetItemRect(item, column); @@ -4321,7 +4410,6 @@ void wxDataViewCtrl::Expand( const wxDataViewItem & item ) void wxDataViewCtrl::Collapse( const wxDataViewItem & item ) { int row = m_clientArea->GetRowByItem( item ); - wxPrintf( "row %d\n", row ); if (row != -1) m_clientArea->Collapse(row); } @@ -4334,8 +4422,17 @@ bool wxDataViewCtrl::IsExpanded( const wxDataViewItem & item ) const return false; } -#endif - // !wxUSE_GENERICDATAVIEWCTRL +void wxDataViewCtrl::StartEditor( const wxDataViewItem & item, unsigned int column ) +{ + wxDataViewColumn* col = GetColumn( column ); + if (!col) + return; -#endif - // wxUSE_DATAVIEWCTRL + wxRect itemRect = GetItemRect(item, col); + wxDataViewRenderer* renderer = col->GetRenderer(); + renderer->StartEditing(item, itemRect); +} + +#endif // !wxUSE_GENERICDATAVIEWCTRL + +#endif // wxUSE_DATAVIEWCTRL