X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/de4bf0b30514fe9839098c7d5ba9f3dcf3cd3038..be8ddd37e3435dad37c5502a8d2894ea4cfb71f9:/src/generic/datavgen.cpp diff --git a/src/generic/datavgen.cpp b/src/generic/datavgen.cpp index 483a1400eb..afe948e080 100644 --- a/src/generic/datavgen.cpp +++ b/src/generic/datavgen.cpp @@ -69,9 +69,10 @@ static const int EXPANDER_OFFSET = 4; static const int EXPANDER_OFFSET = 1; #endif -//Below is the compare stuff -//For the generic implements, both the leaf nodes and the nodes are sorted for fast search when needed -static wxDataViewModel * g_model; +// Below is the compare stuff. +// 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; static bool g_asending = true; @@ -98,6 +99,7 @@ protected: return *(GetOwner()->GetColumn(idx)); } + // FIXME: currently unused virtual bool UpdateColumnWidthToFit(unsigned int idx, int widthTitle) { wxDataViewCtrl * const owner = GetOwner(); @@ -176,7 +178,7 @@ private: event.Skip(); } - void OnEndResize(wxHeaderCtrlEvent& event) + void OnResize(wxHeaderCtrlEvent& event) { wxDataViewCtrl * const owner = GetOwner(); @@ -200,7 +202,8 @@ BEGIN_EVENT_TABLE(wxDataViewHeaderWindow, wxHeaderCtrl) EVT_HEADER_CLICK(wxID_ANY, wxDataViewHeaderWindow::OnClick) EVT_HEADER_RIGHT_CLICK(wxID_ANY, wxDataViewHeaderWindow::OnRClick) - EVT_HEADER_END_RESIZE(wxID_ANY, wxDataViewHeaderWindow::OnEndResize) + EVT_HEADER_RESIZING(wxID_ANY, wxDataViewHeaderWindow::OnResize) + EVT_HEADER_END_RESIZE(wxID_ANY, wxDataViewHeaderWindow::OnResize) EVT_HEADER_END_REORDER(wxID_ANY, wxDataViewHeaderWindow::OnEndReorder) END_EVENT_TABLE() @@ -222,11 +225,13 @@ public: //----------------------------------------------------------------------------- // wxDataViewTreeNode //----------------------------------------------------------------------------- + class wxDataViewTreeNode; WX_DEFINE_ARRAY( wxDataViewTreeNode *, wxDataViewTreeNodes ); WX_DEFINE_ARRAY( void* , wxDataViewTreeLeaves); -int LINKAGEMODE wxGenericTreeModelNodeCmp( wxDataViewTreeNode ** node1, wxDataViewTreeNode ** node2); +int LINKAGEMODE wxGenericTreeModelNodeCmp( wxDataViewTreeNode ** node1, + wxDataViewTreeNode ** node2); int LINKAGEMODE wxGenericTreeModelItemCmp( void ** id1, void ** id2); class wxDataViewTreeNode @@ -346,7 +351,8 @@ private: int m_subTreeCount; }; -int LINKAGEMODE wxGenericTreeModelNodeCmp( wxDataViewTreeNode ** node1, wxDataViewTreeNode ** node2) +int LINKAGEMODE wxGenericTreeModelNodeCmp( wxDataViewTreeNode ** node1, + wxDataViewTreeNode ** node2) { return g_model->Compare( (*node1)->GetItem(), (*node2)->GetItem(), g_column, g_asending ); } @@ -357,7 +363,6 @@ int LINKAGEMODE wxGenericTreeModelItemCmp( void ** id1, void ** id2) } - //----------------------------------------------------------------------------- // wxDataViewMainWindow //----------------------------------------------------------------------------- @@ -445,13 +450,17 @@ public: int GetCountPerPage() const; 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 expanding/collapsing of the tree nodes + + // 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 ) { m_selection = sel; UpdateDisplay(); } + void SetSelections( const wxDataViewSelection & sel ) + { m_selection = sel; UpdateDisplay(); } void Select( const wxArrayInt& aSelections ); void SelectAllRows( bool on ); void SelectRow( unsigned int row, bool on ); @@ -476,19 +485,20 @@ public: int GetLineHeight( unsigned int row ) const; // m_lineHeight in fixed mode int GetLineAt( unsigned int y ) const; // y / m_lineHeight in fixed mode - //Some useful functions for row and item mapping + // Some useful functions for row and item mapping wxDataViewItem GetItemByRow( unsigned int row ) const; int GetRowByItem( const wxDataViewItem & item ) const; - //Methods for building the mapping tree + // Methods for building the mapping tree void BuildTree( wxDataViewModel * model ); void DestroyTree(); 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 ); @@ -503,14 +513,12 @@ public: private: wxDataViewTreeNode * GetTreeNodeByRow( unsigned int row ) const; - //We did not need this temporarily - //wxDataViewTreeNode * GetTreeNodeByItem( const wxDataViewItem & item ); + // We did not need this temporarily + // wxDataViewTreeNode * GetTreeNodeByItem( const wxDataViewItem & item ); int RecalculateCount(); wxDataViewEvent SendExpanderEvent( wxEventType type, const wxDataViewItem & item ); - void OnExpanding( unsigned int row ); - void OnCollapsing( unsigned int row ); wxDataViewTreeNode * FindNode( const wxDataViewItem & item ); @@ -552,11 +560,13 @@ private: // the pen used to draw the expander and the lines wxPen m_penExpander; - //This is the tree structure of the model + // This is the tree structure of the model wxDataViewTreeNode * m_root; int m_count; - //This is the tree node under the cursor + + // This is the tree node under the cursor wxDataViewTreeNode * m_underMouse; + private: DECLARE_DYNAMIC_CLASS(wxDataViewMainWindow) DECLARE_EVENT_TABLE() @@ -661,14 +671,17 @@ wxDataViewCustomRenderer::wxDataViewCustomRenderer( const wxString &varianttype, { } -void wxDataViewCustomRenderer::RenderText( const wxString &text, int xoffset, wxRect cell, wxDC *dc, int state ) +void wxDataViewCustomRenderer::RenderText( const wxString &text, int xoffset, + wxRect cell, wxDC *dc, int state ) { wxDataViewCtrl *view = GetOwner()->GetOwner(); wxColour col = (state & wxDATAVIEW_CELL_SELECTED) ? wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT) : view->GetForegroundColour(); dc->SetTextForeground(col); - dc->DrawText( text, cell.x + xoffset, cell.y + ((cell.height - dc->GetCharHeight()) / 2)); + dc->DrawText( text, + cell.x + xoffset, + cell.y + ((cell.height - dc->GetCharHeight()) / 2)); } // --------------------------------------------------------- @@ -695,7 +708,7 @@ bool wxDataViewTextRenderer::GetValue( wxVariant& WXUNUSED(value) ) const return false; } -bool wxDataViewTextRenderer::HasEditorCtrl() +bool wxDataViewTextRenderer::HasEditorCtrl() const { return true; } @@ -725,12 +738,8 @@ wxSize wxDataViewTextRenderer::GetSize() const { const wxDataViewCtrl *view = GetView(); if (!m_text.empty()) - { - int x,y; - view->GetTextExtent( m_text, &x, &y ); - return wxSize( x, y ); - } - return wxSize(80,20); + return view->wxWindowBase::GetTextExtent( m_text ); + return wxSize(wxDVC_DEFAULT_RENDERER_SIZE,wxDVC_DEFAULT_RENDERER_SIZE); } // --------------------------------------------------------- @@ -831,7 +840,7 @@ wxSize wxDataViewBitmapRenderer::GetSize() const else if (m_icon.Ok()) return wxSize( m_icon.GetWidth(), m_icon.GetHeight() ); - return wxSize(16,16); + return wxSize(wxDVC_DEFAULT_RENDERER_SIZE,wxDVC_DEFAULT_RENDERER_SIZE); } // --------------------------------------------------------- @@ -1121,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; } //----------------------------------------------------------------------------- @@ -1229,30 +1252,30 @@ public: } virtual wxDragResult OnDragOver( wxCoord x, wxCoord y, wxDragResult def ) - { + { wxDataFormat format = GetMatchingPair(); if (format == wxDF_INVALID) return wxDragNone; return m_win->OnDragOver( format, x, y, def); - } + } virtual bool OnDrop( wxCoord x, wxCoord y ) - { + { wxDataFormat format = GetMatchingPair(); if (format == wxDF_INVALID) return false; return m_win->OnDrop( format, x, y ); - } + } virtual wxDragResult OnData( wxCoord x, wxCoord y, wxDragResult def ) - { + { wxDataFormat format = GetMatchingPair(); if (format == wxDF_INVALID) return wxDragNone; if (!GetData()) return wxDragNone; return m_win->OnData( format, x, y, def ); - } + } virtual void OnLeave() { m_win->OnLeave(); } @@ -1280,8 +1303,9 @@ void wxDataViewRenameTimer::Notify() // wxDataViewMainWindow //----------------------------------------------------------------------------- -//The tree building helper, declared firstly -static void BuildTreeHelper( wxDataViewModel * model, wxDataViewItem & item, wxDataViewTreeNode * node); +// The tree building helper, declared firstly +static void BuildTreeHelper( wxDataViewModel * model, wxDataViewItem & item, + wxDataViewTreeNode * node); int LINKAGEMODE wxDataViewSelectionCmp( unsigned int row1, unsigned int row2 ) { @@ -1290,7 +1314,6 @@ int LINKAGEMODE wxDataViewSelectionCmp( unsigned int row1, unsigned int row2 ) return -1; } - IMPLEMENT_ABSTRACT_CLASS(wxDataViewMainWindow, wxWindow) BEGIN_EVENT_TABLE(wxDataViewMainWindow,wxWindow) @@ -1340,13 +1363,14 @@ wxDataViewMainWindow::wxDataViewMainWindow( wxDataViewCtrl *parent, wxWindowID i m_penRule = wxPen(GetRuleColour()); - //Here I compose a pen can draw black lines, maybe there are something system colour to use + // compose a pen whichcan draw black lines + // TODO: maybe there is something system colour to use m_penExpander = wxPen(wxColour(0,0,0)); - //Some new added code to deal with the tree structure + m_root = new wxDataViewTreeNode( NULL ); m_root->SetHasChildren(true); - //Make m_count = -1 will cause the class recaculate the real displaying number of rows. + // Make m_count = -1 will cause the class recaculate the real displaying number of rows. m_count = -1; m_underMouse = NULL; UpdateDisplay(); @@ -1389,7 +1413,8 @@ void wxDataViewMainWindow::RemoveDropHint() } } -wxDragResult wxDataViewMainWindow::OnDragOver( wxDataFormat format, wxCoord x, wxCoord y, wxDragResult def ) +wxDragResult wxDataViewMainWindow::OnDragOver( wxDataFormat format, wxCoord x, + wxCoord y, wxDragResult def ) { int xx = x; int yy = y; @@ -1463,7 +1488,8 @@ bool wxDataViewMainWindow::OnDrop( wxDataFormat format, wxCoord x, wxCoord y ) return true; } -wxDragResult wxDataViewMainWindow::OnData( wxDataFormat format, wxCoord x, wxCoord y, wxDragResult def ) +wxDragResult wxDataViewMainWindow::OnData( wxDataFormat format, wxCoord x, wxCoord y, + wxDragResult def ) { int xx = x; int yy = y; @@ -1519,7 +1545,8 @@ wxBitmap wxDataViewMainWindow::CreateItemBitmap( unsigned int row, int &indent ) { wxDataViewTreeNode *node = GetTreeNodeByRow(row); indent = GetOwner()->GetIndent() * node->GetIndentLevel(); - indent = indent + m_lineHeight; //try to use the m_lineHeight as the expander space + indent = indent + m_lineHeight; + // try to use the m_lineHeight as the expander space if(!node->HasChildren()) delete node; @@ -1584,7 +1611,7 @@ wxBitmap wxDataViewMainWindow::CreateItemBitmap( unsigned int row, int &indent ) item_rect.x = x + (width / 2) - (size.x / 2); else if (align & wxALIGN_RIGHT) item_rect.x = x + width - size.x; - //else: wxALIGN_LEFT is the default + // else: wxALIGN_LEFT is the default // vertical alignment: item_rect.y = 0; @@ -1592,15 +1619,15 @@ wxBitmap wxDataViewMainWindow::CreateItemBitmap( unsigned int row, int &indent ) item_rect.y = (height / 2) - (size.y / 2); else if (align & wxALIGN_BOTTOM) item_rect.y = height - size.y; - //else: wxALIGN_TOP is the default + // else: wxALIGN_TOP is the default // add padding item_rect.x += PADDING_RIGHTLEFT; item_rect.width = size.x - 2 * PADDING_RIGHTLEFT; - //dc.SetClippingRegion( item_rect ); + // dc.SetClippingRegion( item_rect ); cell->Render( item_rect, &dc, 0 ); - //dc.DestroyClippingRegion(); + // dc.DestroyClippingRegion(); x += width; } @@ -1753,7 +1780,6 @@ void wxDataViewMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) cell_rect.x = x_start; for (unsigned int i = col_start; i < col_last; i++) { - wxDataViewColumn *col = GetOwner()->GetColumnAt( i ); wxDataViewRenderer *cell = col->GetRenderer(); cell_rect.width = col->GetWidth(); @@ -1776,7 +1802,8 @@ void wxDataViewMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) dataitem = node->GetItem(); - if ((i > 0) && model->IsContainer(dataitem) && !model->HasContainerColumns(dataitem)) + if ((i > 0) && model->IsContainer(dataitem) && + !model->HasContainerColumns(dataitem)) continue; } else @@ -1798,22 +1825,27 @@ void wxDataViewMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) // update cell_rect cell_rect.y = GetLineStart( item ); - cell_rect.height = GetLineHeight( item ); // -1 is for the horizontal rules (?) + cell_rect.height = GetLineHeight( item ); - //Draw the expander here. + // Draw the expander here. int indent = 0; if ((!IsVirtualList()) && (col == expander)) { indent = node->GetIndentLevel(); - //Calculate the indent first + // Calculate the indent first indent = cell_rect.x + GetOwner()->GetIndent() * indent; int expander_width = m_lineHeight - 2*EXPANDER_MARGIN; + // 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) - (expander_width/2) - EXPANDER_OFFSET; - indent = indent + m_lineHeight; //try to use the m_lineHeight as the expander space + int expander_x = indent + EXPANDER_MARGIN; + int expander_y = cell_rect.y + EXPANDER_MARGIN + (GetLineHeight(item) / 2) + - (expander_width/2) - EXPANDER_OFFSET; + + indent = indent + m_lineHeight; + // try to use the m_lineHeight as the expander space + dc.SetPen( m_penExpander ); dc.SetBrush( wxNullBrush ); if( node->HasChildren() ) @@ -1825,11 +1857,13 @@ void wxDataViewMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) flag |= wxCONTROL_CURRENT; } if( node->IsOpen() ) - wxRendererNative::Get().DrawTreeItemButton( this, dc, rect, flag|wxCONTROL_EXPANDED ); + wxRendererNative::Get().DrawTreeItemButton( this, dc, rect, + flag|wxCONTROL_EXPANDED ); else wxRendererNative::Get().DrawTreeItemButton( this, dc, rect, flag); } - //force the expander column to left-center align + + // force the expander column to left-center align cell->SetAlignment( wxALIGN_CENTER_VERTICAL ); } if (node && !node->HasChildren()) @@ -1841,7 +1875,9 @@ 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 of the cell for drawing + + // 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 ); size.y = cell_rect.height; @@ -1855,7 +1891,7 @@ void wxDataViewMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) item_rect.x = cell_rect.x + (cell_rect.width / 2) - (size.x / 2); else if (align & wxALIGN_RIGHT) item_rect.x = cell_rect.x + cell_rect.width - size.x; - //else: wxALIGN_LEFT is the default + // else: wxALIGN_LEFT is the default // vertical alignment: item_rect.y = cell_rect.y; @@ -1863,13 +1899,13 @@ void wxDataViewMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) item_rect.y = cell_rect.y + (cell_rect.height / 2) - (size.y / 2); else if (align & wxALIGN_BOTTOM) item_rect.y = cell_rect.y + cell_rect.height - size.y; - //else: wxALIGN_TOP is the default + // else: wxALIGN_TOP is the default // add padding item_rect.x += PADDING_RIGHTLEFT; item_rect.width = size.x - 2 * PADDING_RIGHTLEFT; - //Here we add the tree indent + // Here we add the tree indent item_rect.x += indent; int state = 0; @@ -1942,16 +1978,16 @@ void wxDataViewMainWindow::OnRenameTimer() m_currentCol->GetRenderer()->StartEditing( item, labelRect ); } -//------------------------------------------------------------------ +//----------------------------------------------------------------------------- // Helper class for do operation on the tree node -//------------------------------------------------------------------ +//----------------------------------------------------------------------------- class DoJob { public: DoJob() { } virtual ~DoJob() { } - //The return value control how the tree-walker tranverse the tree + // The return value control how the tree-walker tranverse the tree // 0: Job done, stop tranverse and return // 1: Ignore the current node's subtree and continue // 2: Job not done, continue @@ -2068,11 +2104,12 @@ 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, false, "item not found" ); + wxCHECK_MSG( node->GetChildren().Index( item.GetID() ) != wxNOT_FOUND, + false, "item not found" ); int sub = -1; node->GetChildren().Remove( item.GetID() ); - //Manuplate selection + // Manipolate selection if( m_selection.GetCount() > 1 ) { m_selection.Empty(); @@ -2107,11 +2144,11 @@ bool wxDataViewMainWindow::ItemDeleted(const wxDataViewItem& parent, sub -= n->GetSubTreeCount(); ::DestroyTreeHelper(n); } - //Make the row number invalid and get a new valid one when user call GetRowCount + // Make the row number invalid and get a new valid one when user call GetRowCount m_count = -1; node->ChangeSubTreeCount(sub); - //Change the current row to the last row if the current exceed the max row number + // Change the current row to the last row if the current exceed the max row number if( m_currentRow > GetRowCount() ) m_currentRow = m_count - 1; @@ -2125,7 +2162,7 @@ bool wxDataViewMainWindow::ItemChanged(const wxDataViewItem & item) SortPrepare(); g_model->Resort(); - //Send event + // Send event wxWindow *parent = GetParent(); wxDataViewEvent le(wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED, parent->GetId()); le.SetEventObject(parent); @@ -2150,7 +2187,7 @@ bool wxDataViewMainWindow::ValueChanged( const wxDataViewItem & item, unsigned i SortPrepare(); g_model->Resort(); - //Send event + // Send event wxWindow *parent = GetParent(); wxDataViewEvent le(wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED, parent->GetId()); le.SetEventObject(parent); @@ -2290,7 +2327,7 @@ unsigned int wxDataViewMainWindow::GetLastVisibleRow() m_owner->CalcUnscrolledPosition( client_size.x, client_size.y, &client_size.x, &client_size.y ); - //we should deal with the pixel here + // we should deal with the pixel here unsigned int row = GetLineAt(client_size.y) - 1; return wxMin( GetRowCount()-1, row ); @@ -2563,18 +2600,20 @@ int wxDataViewMainWindow::GetLineStart( unsigned int row ) const if (column->IsHidden()) continue; // skip it! - if ((col != 0) && model->IsContainer(item) && !model->HasContainerColumns(item)) + if ((col != 0) && + model->IsContainer(item) && + !model->HasContainerColumns(item)) continue; // skip it! - const wxDataViewRenderer *renderer = column->GetRenderer(); wxVariant value; model->GetValue( value, item, column->GetModelColumn() ); - wxDataViewRenderer *renderer2 = const_cast(renderer); - renderer2->SetValue( value ); + + wxDataViewRenderer *renderer = + const_cast(column->GetRenderer()); + renderer->SetValue( value ); height = wxMax( height, renderer->GetSize().y ); } - start += height; } @@ -2599,14 +2638,14 @@ int wxDataViewMainWindow::GetLineAt( unsigned int y ) const unsigned int yy = 0; for (;;) { - const wxDataViewTreeNode* node = GetTreeNodeByRow(row); - if (!node) - { - // not really correct... - return row + ((y-yy) / m_lineHeight); - } + const wxDataViewTreeNode* node = GetTreeNodeByRow(row); + if (!node) + { + // not really correct... + return row + ((y-yy) / m_lineHeight); + } - wxDataViewItem item = node->GetItem(); + wxDataViewItem item = node->GetItem(); if (node && !node->HasChildren()) { @@ -2615,31 +2654,34 @@ int wxDataViewMainWindow::GetLineAt( unsigned int y ) const wxDELETE(node); } - unsigned int cols = GetOwner()->GetColumnCount(); - unsigned int col; - int height = m_lineHeight; - for (col = 0; col < cols; col++) - { + unsigned int cols = GetOwner()->GetColumnCount(); + unsigned int col; + int height = m_lineHeight; + for (col = 0; col < cols; col++) + { const wxDataViewColumn *column = GetOwner()->GetColumn(col); if (column->IsHidden()) continue; // skip it! - if ((col != 0) && model->IsContainer(item) && !model->HasContainerColumns(item)) + if ((col != 0) && + model->IsContainer(item) && + !model->HasContainerColumns(item)) continue; // skip it! - const wxDataViewRenderer *renderer = column->GetRenderer(); wxVariant value; model->GetValue( value, item, column->GetModelColumn() ); - wxDataViewRenderer *renderer2 = const_cast(renderer); - renderer2->SetValue( value ); + + wxDataViewRenderer *renderer = + const_cast(column->GetRenderer()); + renderer->SetValue( value ); height = wxMax( height, renderer->GetSize().y ); - } + } - yy += height; - if (y < yy) - return row; + yy += height; + if (y < yy) + return row; - row++; + row++; } } @@ -2674,14 +2716,17 @@ int wxDataViewMainWindow::GetLineHeight( unsigned int row ) const if (column->IsHidden()) continue; // skip it! - if ((col != 0) && model->IsContainer(item) && !model->HasContainerColumns(item)) + if ((col != 0) && + model->IsContainer(item) && + !model->HasContainerColumns(item)) continue; // skip it! - const wxDataViewRenderer *renderer = column->GetRenderer(); wxVariant value; model->GetValue( value, item, column->GetModelColumn() ); - wxDataViewRenderer *renderer2 = const_cast(renderer); - renderer2->SetValue( value ); + + wxDataViewRenderer *renderer = + const_cast(column->GetRenderer()); + renderer->SetValue( value ); height = wxMax( height, renderer->GetSize().y ); } @@ -2696,8 +2741,9 @@ int wxDataViewMainWindow::GetLineHeight( unsigned int row ) const class RowToItemJob: public DoJob { public: - RowToItemJob( unsigned int row , int current ) { this->row = row; this->current = current;} - virtual ~RowToItemJob() { } + RowToItemJob( unsigned int row , int current ) + { this->row = row; this->current = current; } + virtual ~RowToItemJob() {} virtual int operator() ( wxDataViewTreeNode * node ) { @@ -2715,8 +2761,10 @@ public: } else { - //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 when it comes to list view + // 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 + // when it comes to list view if( node->GetNodes().GetCount() == 0) { int index = static_cast(row) - current - 1; @@ -2737,7 +2785,10 @@ public: } return DoJob::CONT; } - wxDataViewItem GetResult(){ return ret; } + + wxDataViewItem GetResult() const + { return ret; } + private: unsigned int row; int current; @@ -2787,8 +2838,11 @@ public: else { parent = node; - //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 when it comes to list view + + // 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 + // effect for list views. if( node->GetNodes().GetCount() == 0) { int index = static_cast(row) - current - 1; @@ -2800,8 +2854,6 @@ public: } return DoJob::CONT; } - - } virtual int operator() ( void * n ) @@ -2817,7 +2869,10 @@ public: return DoJob::CONT; } - wxDataViewTreeNode * GetResult(){ return ret; } + + wxDataViewTreeNode * GetResult() const + { return ret; } + private: unsigned int row; int current; @@ -2825,7 +2880,6 @@ private: wxDataViewTreeNode * parent; }; - wxDataViewTreeNode * wxDataViewMainWindow::GetTreeNodeByRow(unsigned int row) const { wxASSERT( !IsVirtualList() ); @@ -2835,7 +2889,8 @@ wxDataViewTreeNode * wxDataViewMainWindow::GetTreeNodeByRow(unsigned int row) co return job.GetResult(); } -wxDataViewEvent wxDataViewMainWindow::SendExpanderEvent( wxEventType type, const wxDataViewItem & item ) +wxDataViewEvent wxDataViewMainWindow::SendExpanderEvent( wxEventType type, + const wxDataViewItem & item ) { wxWindow *parent = GetParent(); wxDataViewEvent le(type, parent->GetId()); @@ -2848,98 +2903,117 @@ wxDataViewEvent wxDataViewMainWindow::SendExpanderEvent( wxEventType type, const return le; } - bool wxDataViewMainWindow::IsExpanded( unsigned int row ) const { if (IsVirtualList()) - return false; + return false; wxDataViewTreeNode * node = GetTreeNodeByRow(row); if (!node) - return false; + return false; if (!node->HasChildren()) { - delete node; - return false; + delete node; + return false; } 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; + 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 = SendExpanderEvent(wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDING,node->GetItem()); - //Check if the user prevent expanding - if( e.GetSkipped() ) + wxDataViewEvent e = + SendExpanderEvent(wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDING, node->GetItem()); + + // Check if the user prevent expanding + if( e.GetSkipped() ) return; - node->ToggleOpen(); - //Here I build the children of current node - if( node->GetChildrenNumber() == 0 ) - { - SortPrepare(); - ::BuildTreeHelper(GetOwner()->GetModel(), node->GetItem(), node); - } + node->ToggleOpen(); - // By expanding the node all row indices that are currently in the selection list - // and are greater than our node have become invalid. So we have to correct that now. - const unsigned rowAdjustment = node->GetSubTreeCount(); - for(unsigned i=0; iGetChildrenNumber() == 0 ) + { + SortPrepare(); + ::BuildTreeHelper(GetOwner()->GetModel(), node->GetItem(), node); + } - m_selection[i] += rowAdjustment; - } + // By expanding the node all row indices that are currently in the selection list + // and are greater than our node have become invalid. So we have to correct that now. + const unsigned rowAdjustment = node->GetSubTreeCount(); + for(unsigned i=0; i row) - ChangeCurrentRow(m_currentRow + rowAdjustment); + m_selection[i] += rowAdjustment; + } - m_count = -1; - UpdateDisplay(); - //Send the expanded event - SendExpanderEvent(wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDED,node->GetItem()); - } - else - { - SelectRow( row, false ); - SelectRow( row + 1, true ); - ChangeCurrentRow( row + 1 ); - SendSelectionChangedEvent( GetItemByRow(row+1)); + if(m_currentRow > row) + ChangeCurrentRow(m_currentRow + rowAdjustment); + + m_count = -1; + UpdateDisplay(); + // Send the expanded event + SendExpanderEvent(wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDED,node->GetItem()); } - } - else - delete node; - } } -void wxDataViewMainWindow::OnCollapsing(unsigned int row) +void wxDataViewMainWindow::Collapse(unsigned int row) { if (IsVirtualList()) - return; + return; - wxDataViewTreeNode * node = GetTreeNodeByRow(row); - if( node != NULL ) + wxDataViewTreeNode *node = GetTreeNodeByRow(row); + if (!node) + return; + + if (!node->HasChildren()) { - wxDataViewTreeNode * nd = node; + delete node; + return; + } - if( node->HasChildren() && node->IsOpen() ) + if (node->IsOpen()) { - wxDataViewEvent e = SendExpanderEvent(wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSING,node->GetItem()); + wxDataViewEvent e = + SendExpanderEvent(wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSING,node->GetItem()); if( e.GetSkipped() ) return; @@ -2973,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()); + SendExpanderEvent(wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSED,node->GetItem()); } - 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() ); - } - } - } - if( !nd->HasChildren()) - delete nd; - } } wxDataViewTreeNode * wxDataViewMainWindow::FindNode( const wxDataViewItem & item ) @@ -3024,7 +3080,7 @@ wxDataViewTreeNode * wxDataViewMainWindow::FindNode( const wxDataViewItem & item if (!item.IsOk()) return m_root; - //Compose the a parent-chain of the finding item + // Compose the a parent-chain of the finding item ItemList list; list.DeleteContents( true ); wxDataViewItem it( item ); @@ -3035,8 +3091,8 @@ wxDataViewTreeNode * wxDataViewMainWindow::FindNode( const wxDataViewItem & item it = model->GetParent( it ); } - //Find the item along the parent-chain. - //This algorithm is designed to speed up the node-finding method + // Find the item along the parent-chain. + // This algorithm is designed to speed up the node-finding method wxDataViewTreeNode * node = m_root; for( ItemList::const_iterator iter = list.begin(); iter !=list.end(); iter++ ) { @@ -3073,7 +3129,8 @@ wxDataViewTreeNode * wxDataViewMainWindow::FindNode( const wxDataViewItem & item return NULL; } -void wxDataViewMainWindow::HitTest( const wxPoint & point, wxDataViewItem & item, wxDataViewColumn* &column ) +void wxDataViewMainWindow::HitTest( const wxPoint & point, wxDataViewItem & item, + wxDataViewColumn* &column ) { wxDataViewColumn *col = NULL; unsigned int cols = GetOwner()->GetColumnCount(); @@ -3097,30 +3154,75 @@ void wxDataViewMainWindow::HitTest( const wxPoint & point, wxDataViewItem & item item = GetItemByRow( GetLineAt( y ) ); } -wxRect wxDataViewMainWindow::GetItemRect( const wxDataViewItem & item, const wxDataViewColumn* column ) +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*) GetOwner()->GetModel(); + wxDataViewIndexListModel *list_model = + (wxDataViewIndexListModel*) GetOwner()->GetModel(); #ifndef __WXMAC__ return list_model->GetLastIndex() + 1; #else @@ -3143,7 +3245,7 @@ public: ret = -1; } - //Maybe binary search will help to speed up this process + // Maybe binary search will help to speed up this process virtual int operator() ( wxDataViewTreeNode * node) { ret ++; @@ -3172,8 +3274,10 @@ public: return DoJob::OK; return DoJob::CONT; } - //the row number is begin from zero - int GetResult() { return ret -1; } + + // the row number is begin from zero + int GetResult() const + { return ret -1; } private: ItemList::const_iterator m_iter; @@ -3197,7 +3301,7 @@ int wxDataViewMainWindow::GetRowByItem(const wxDataViewItem & item) const if( !item.IsOk() ) return -1; - //Compose the a parent-chain of the finding item + // Compose the a parent-chain of the finding item ItemList list; wxDataViewItem * pItem; list.DeleteContents( true ); @@ -3217,7 +3321,8 @@ int wxDataViewMainWindow::GetRowByItem(const wxDataViewItem & item) const } } -static void BuildTreeHelper( wxDataViewModel * model, wxDataViewItem & item, wxDataViewTreeNode * node) +static void BuildTreeHelper( wxDataViewModel * model, wxDataViewItem & item, + wxDataViewTreeNode * node) { if( !model->IsContainer( item ) ) return; @@ -3261,7 +3366,7 @@ void wxDataViewMainWindow::BuildTree(wxDataViewModel * model) m_root = new wxDataViewTreeNode( NULL ); m_root->SetHasChildren(true); - //First we define a invalid item to fetch the top-level elements + // First we define a invalid item to fetch the top-level elements wxDataViewItem item; SortPrepare(); BuildTreeHelper( model, item, m_root); @@ -3273,12 +3378,9 @@ static void DestroyTreeHelper( wxDataViewTreeNode * node ) if( node->GetNodeNumber() != 0 ) { int len = node->GetNodeNumber(); - int i = 0; wxDataViewTreeNodes& nodes = node->GetNodes(); - for(; i < len; i ++ ) - { + for (int i = 0; i < len; i++) DestroyTreeHelper(nodes[i]); - } } delete node; } @@ -3287,9 +3389,9 @@ void wxDataViewMainWindow::DestroyTree() { if (!IsVirtualList()) { - ::DestroyTreeHelper(m_root); - m_count = 0; - m_root = NULL; + ::DestroyTreeHelper(m_root); + m_count = 0; + m_root = NULL; } } @@ -3312,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()); @@ -3324,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 ); @@ -3334,18 +3435,59 @@ void wxDataViewMainWindow::OnChar( wxKeyEvent &event ) if ( m_currentRow < GetRowCount() - 1 ) OnArrowChar( m_currentRow + 1, event ); break; - //Add the process for tree expanding/collapsing + // 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 ); @@ -3420,7 +3562,7 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event ) return; } - //Test whether the mouse is hovered on the tree item button + // Test whether the mouse is hovered on the tree item button bool hoverOverExpander = false; if ((!IsVirtualList()) && (GetOwner()->GetExpanderColumn() == col)) { @@ -3437,16 +3579,16 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event ) m_lineHeight, m_lineHeight); if( rect.Contains(x, y) ) { - //So the mouse is over the expander + // So the mouse is over the expander hoverOverExpander = true; if (m_underMouse && m_underMouse != node) { - //wxLogMessage("Undo the row: %d", GetRowByItem(m_underMouse->GetItem())); + // wxLogMessage("Undo the row: %d", GetRowByItem(m_underMouse->GetItem())); RefreshRow(GetRowByItem(m_underMouse->GetItem())); } if (m_underMouse != node) { - //wxLogMessage("Do the row: %d", current); + // wxLogMessage("Do the row: %d", current); RefreshRow(current); } m_underMouse = node; @@ -3459,7 +3601,7 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event ) { if (m_underMouse != NULL) { - //wxLogMessage("Undo the row: %d", GetRowByItem(m_underMouse->GetItem())); + // wxLogMessage("Undo the row: %d", GetRowByItem(m_underMouse->GetItem())); RefreshRow(GetRowByItem(m_underMouse->GetItem())); m_underMouse = NULL; } @@ -3485,7 +3627,8 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event ) if (event.LeftIsDown()) { - m_owner->CalcUnscrolledPosition( m_dragStart.x, m_dragStart.y, &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 ); @@ -3548,7 +3691,6 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event ) wxRect cell_rect( xpos, GetLineStart( current ), col->GetWidth(), GetLineHeight( current ) ); cell->Activate( cell_rect, model, item, col->GetModelColumn() ); - } else { @@ -3580,7 +3722,8 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event ) SendSelectionChangedEvent( GetItemByRow(m_lineSelectSingleOnUp) ); } - //If the user click the expander, we do not do editing even if the column with expander are editable + // 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) { if ((col == m_currentCol) && (current == m_currentRow) && @@ -3634,12 +3777,14 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event ) if((event.LeftDown() || simulateClick) && hoverOverExpander) { wxDataViewTreeNode* node = GetTreeNodeByRow(current); - // hoverOverExpander being true tells us that our node must be valid and have children. + + // 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) { @@ -3717,8 +3862,9 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event ) model->GetValue( value, item, col->GetModelColumn() ); cell->SetValue( value ); wxRect cell_rect( xpos, GetLineStart( current ), - col->GetWidth(), GetLineHeight( current ) ); - /* ignore ret */ cell->LeftClick( event.GetPosition(), cell_rect, model, item, col->GetModelColumn()); + col->GetWidth(), GetLineHeight( current ) ); + /* ignore ret */ cell->LeftClick( event.GetPosition(), cell_rect, + model, item, col->GetModelColumn()); } } } @@ -3754,10 +3900,10 @@ wxDataViewItem wxDataViewMainWindow::GetSelection() const //----------------------------------------------------------------------------- // wxDataViewCtrl //----------------------------------------------------------------------------- + WX_DEFINE_LIST(wxDataViewColumnList) IMPLEMENT_DYNAMIC_CLASS(wxDataViewCtrl, wxDataViewCtrlBase) - BEGIN_EVENT_TABLE(wxDataViewCtrl, wxDataViewCtrlBase) EVT_SIZE(wxDataViewCtrl::OnSize) END_EVENT_TABLE() @@ -3782,8 +3928,8 @@ void wxDataViewCtrl::Init() } bool wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id, - const wxPoint& pos, const wxSize& size, - long style, const wxValidator& validator ) + const wxPoint& pos, const wxSize& size, + long style, const wxValidator& validator ) { // if ( (style & wxBORDER_MASK) == 0) // style |= wxBORDER_SUNKEN; @@ -3825,8 +3971,8 @@ wxBorder wxDataViewCtrl::GetDefaultBorder() const #ifdef __WXMSW__ WXLRESULT wxDataViewCtrl::MSWWindowProc(WXUINT nMsg, - WXWPARAM wParam, - WXLPARAM lParam) + WXWPARAM wParam, + WXLPARAM lParam) { WXLRESULT rc = wxDataViewCtrlBase::MSWWindowProc(nMsg, wParam, lParam); @@ -4045,7 +4191,7 @@ wxDataViewColumn *wxDataViewCtrl::GetSortingColumn() const : GetColumn(m_sortingColumnIdx); } -//Selection code with wxDataViewItem as parameters +// Selection code with wxDataViewItem as parameters wxDataViewItem wxDataViewCtrl::GetSelection() const { return m_clientArea->GetSelection(); @@ -4097,7 +4243,7 @@ void wxDataViewCtrl::Select( const wxDataViewItem & item ) int row = m_clientArea->GetRowByItem( item ); if( row >= 0 ) { - //Unselect all rows before select another in the single select mode + // Unselect all rows before select another in the single select mode if (m_clientArea->IsSingleSel()) m_clientArea->SelectAllRows(false); m_clientArea->SelectRow(row, true); @@ -4121,7 +4267,7 @@ bool wxDataViewCtrl::IsSelected( const wxDataViewItem & item ) const return false; } -//Selection code with row number as parameter +// Selection code with row number as parameter int wxDataViewCtrl::GetSelections( wxArrayInt & sel ) const { sel.Empty(); @@ -4232,12 +4378,14 @@ void wxDataViewCtrl::EnsureVisible( const wxDataViewItem & item, const wxDataVie } -void wxDataViewCtrl::HitTest( const wxPoint & point, wxDataViewItem & item, wxDataViewColumn* &column ) const +void wxDataViewCtrl::HitTest( const wxPoint & point, wxDataViewItem & item, + wxDataViewColumn* &column ) const { m_clientArea->HitTest(point, item, column); } -wxRect wxDataViewCtrl::GetItemRect( const wxDataViewItem & item, const wxDataViewColumn* column ) const +wxRect wxDataViewCtrl::GetItemRect( const wxDataViewItem & item, + const wxDataViewColumn* column ) const { return m_clientArea->GetItemRect(item, column); } @@ -4274,9 +4422,17 @@ bool wxDataViewCtrl::IsExpanded( const wxDataViewItem & item ) const return false; } +void wxDataViewCtrl::StartEditor( const wxDataViewItem & item, unsigned int column ) +{ + wxDataViewColumn* col = GetColumn( column ); + if (!col) + return; -#endif - // !wxUSE_GENERICDATAVIEWCTRL + wxRect itemRect = GetItemRect(item, col); + wxDataViewRenderer* renderer = col->GetRenderer(); + renderer->StartEditing(item, itemRect); +} -#endif - // wxUSE_DATAVIEWCTRL +#endif // !wxUSE_GENERICDATAVIEWCTRL + +#endif // wxUSE_DATAVIEWCTRL