X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/453091c26978d6da004ab46c78c719d7f9444ae3..5e60a12a069e1e7e8213d41c8d3243e7d3b0913e:/src/generic/datavgen.cpp diff --git a/src/generic/datavgen.cpp b/src/generic/datavgen.cpp index 9f4c496bde..6d28209443 100644 --- a/src/generic/datavgen.cpp +++ b/src/generic/datavgen.cpp @@ -270,14 +270,14 @@ class wxDataViewTreeNode { public: wxDataViewTreeNode( wxDataViewTreeNode * parent = NULL ) - { this->parent = parent; + { this->parent = parent; if( parent == NULL ) open = true; - else - open = false; + else + open = false; hasChildren = false; subTreeCount = 0; - } + } //I don't know what I need to do in the destructure ~wxDataViewTreeNode() { @@ -298,11 +298,11 @@ public: if (g_column >= -1) nodes.Sort( &wxGenericTreeModelNodeCmp ); } - void AddLeaf( void * leaf ) - { - leaves.Add( leaf ); + void AddLeaf( void * leaf ) + { + leaves.Add( leaf ); if (g_column >= -1) - leaves.Sort( &wxGenericTreeModelItemCmp ); + leaves.Sort( &wxGenericTreeModelItemCmp ); } wxDataViewItem & GetItem() { return item; } @@ -313,13 +313,13 @@ public: int GetIndentLevel() { int ret = 0 ; - wxDataViewTreeNode * node = this; - while( node->GetParent()->GetParent() != NULL ) - { - node = node->GetParent(); - ret ++; - } - return ret; + wxDataViewTreeNode * node = this; + while( node->GetParent()->GetParent() != NULL ) + { + node = node->GetParent(); + ret ++; + } + return ret; } bool IsOpen() @@ -364,7 +364,7 @@ public: { if (g_column >= -1) { - nodes.Sort( &wxGenericTreeModelNodeCmp ); + nodes.Sort( &wxGenericTreeModelNodeCmp ); int len = nodes.GetCount(); for (int i = 0; i < len; i ++) { @@ -423,15 +423,15 @@ public: bool ValueChanged( const wxDataViewItem &item, unsigned int col ); bool Cleared(); void Resort() - { + { SortPrepare(); - m_root->Resort(); - UpdateDisplay(); + m_root->Resort(); + UpdateDisplay(); } void SortPrepare() { - g_model = GetOwner()->GetModel(); + g_model = GetOwner()->GetModel(); wxDataViewColumn* col = GetOwner()->GetSortingColumn(); if( !col ) { @@ -444,9 +444,9 @@ public: return; } g_column = col->GetModelColumn(); - g_asending = col->IsSortOrderAscending(); + g_asending = col->IsSortOrderAscending(); } - + void SetOwner( wxDataViewCtrl* owner ) { m_owner = owner; } wxDataViewCtrl *GetOwner() { return m_owner; } const wxDataViewCtrl *GetOwner() const { return m_owner; } @@ -489,6 +489,7 @@ public: void SelectRows( unsigned int from, unsigned int to, bool on ); void ReverseRowSelection( unsigned int row ); bool IsRowSelected( unsigned int row ); + void SendSelectionChangedEvent( const wxDataViewItem& item); void RefreshRow( unsigned int row ); void RefreshRows( unsigned int from, unsigned int to ); @@ -587,7 +588,7 @@ public: virtual bool Cleared() { return m_mainWindow->Cleared(); } virtual void Resort() - { m_mainWindow->Resort(); } + { m_mainWindow->Resort(); } wxDataViewMainWindow *m_mainWindow; }; @@ -992,13 +993,13 @@ bool wxDataViewDateRenderer::Activate( wxRect WXUNUSED(cell), wxDataViewModel *m return true; } -// --------------------------------------------------------- +// --------------------------------------------------------- // wxDataViewIconTextRenderer -// --------------------------------------------------------- +// --------------------------------------------------------- IMPLEMENT_CLASS(wxDataViewIconTextRenderer, wxDataViewCustomRenderer) -wxDataViewIconTextRenderer::wxDataViewIconTextRenderer( +wxDataViewIconTextRenderer::wxDataViewIconTextRenderer( const wxString &varianttype, wxDataViewCellMode mode, int align ) : wxDataViewCustomRenderer( varianttype, mode, align ) { @@ -1009,7 +1010,7 @@ wxDataViewIconTextRenderer::wxDataViewIconTextRenderer( wxDataViewIconTextRenderer::~wxDataViewIconTextRenderer() { } - + bool wxDataViewIconTextRenderer::SetValue( const wxVariant &value ) { m_value << value; @@ -1020,18 +1021,18 @@ bool wxDataViewIconTextRenderer::GetValue( wxVariant &value ) const { return false; } - + bool wxDataViewIconTextRenderer::Render( wxRect cell, wxDC *dc, int state ) { dc->SetFont( GetOwner()->GetOwner()->GetFont() ); - + const wxIcon &icon = m_value.GetIcon(); if (icon.IsOk()) { dc->DrawIcon( icon, cell.x, cell.y ); // TODO centre cell.x += icon.GetWidth()+4; } - + dc->DrawText( m_value.GetText(), cell.x, cell.y ); return true; @@ -1672,7 +1673,7 @@ void wxGenericDataViewHeaderWindow::OnMouse( wxMouseEvent &event ) } m_currentX = wxMax(m_minX + 7, x); - if (m_currentX < w) + if (m_currentX < w) { GetColumn(m_column)->SetWidth(m_currentX - m_minX); Refresh(); @@ -2061,7 +2062,7 @@ bool wxDataViewMainWindow::ItemDeleted(const wxDataViewItem& parent, const wxDataViewItem& item) { 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" ); @@ -2074,8 +2075,8 @@ bool wxDataViewMainWindow::ItemDeleted(const wxDataViewItem& parent, } bool isContainer = false; wxDataViewTreeNodes nds = node->GetNodes(); - for (int i = 0; i < nds.GetCount(); i ++) - { + for (size_t i = 0; i < nds.GetCount(); i ++) + { if (nds[i]->GetItem() == item) { isContainer = true; @@ -2116,7 +2117,7 @@ bool wxDataViewMainWindow::ItemDeleted(const wxDataViewItem& parent, m_currentRow = m_count - 1; UpdateDisplay(); - + SendModelEvent(wxEVT_COMMAND_DATAVIEW_MODEL_ITEM_DELETED, item); return true; @@ -2248,7 +2249,7 @@ void wxDataViewMainWindow::ScrollTo( int rows, int column ) } if( x_start < xx ) { - sx = x_start/x; + sx = x_start/x; } } m_owner->Scroll( sx, sy ); @@ -2373,7 +2374,7 @@ void wxDataViewMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) expander = GetOwner()->GetColumn( 0 ); GetOwner()->SetExpanderColumn(expander); } - + // redraw all cells for all rows which must be repainted and for all columns wxRect cell_rect; cell_rect.x = x_start; @@ -2387,16 +2388,16 @@ void wxDataViewMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) if (col->IsHidden()) continue; // skipt it! - + for (unsigned int item = item_start; item < item_last; item++) { // get the cell value and set it into the renderer wxVariant value; - wxDataViewTreeNode * node = GetTreeNodeByRow(item); - if( node == NULL ) - { - continue; - } + wxDataViewTreeNode * node = GetTreeNodeByRow(item); + if( node == NULL ) + { + continue; + } wxDataViewItem dataitem = node->GetItem(); model->GetValue( value, dataitem, col->GetModelColumn()); @@ -2533,11 +2534,11 @@ 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 = (client_size.y)/m_lineHeight; if( client_size.y % m_lineHeight < m_lineHeight/2 ) row -= 1; - + return wxMin( GetRowCount()-1, row ); } @@ -2660,6 +2661,18 @@ bool wxDataViewMainWindow::IsRowSelected( unsigned int row ) return (m_selection.Index( row ) != wxNOT_FOUND); } +void wxDataViewMainWindow::SendSelectionChangedEvent( const wxDataViewItem& item) +{ + wxWindow *parent = GetParent(); + wxDataViewEvent le(wxEVT_COMMAND_DATAVIEW_SELECTION_CHANGED, parent->GetId()); + + le.SetEventObject(parent); + le.SetModel(GetOwner()->GetModel()); + le.SetItem( item ); + + parent->GetEventHandler()->ProcessEvent(le); +} + void wxDataViewMainWindow::RefreshRow( unsigned int row ) { wxRect rect( 0, row*m_lineHeight, GetEndOfLastCol(), m_lineHeight ); @@ -2734,6 +2747,8 @@ void wxDataViewMainWindow::OnArrowChar(unsigned int newCurrent, const wxKeyEvent } SelectRows( oldCurrent, newCurrent, true ); + if (oldCurrent!=newCurrent) + SendSelectionChangedEvent(GetItemByRow(m_selection[0])); } else // !shift { @@ -2746,7 +2761,10 @@ void wxDataViewMainWindow::OnArrowChar(unsigned int newCurrent, const wxKeyEvent ChangeCurrentRow( newCurrent ); if ( !event.ControlDown() ) + { SelectRow( m_currentRow, true ); + SendSelectionChangedEvent(GetItemByRow(m_currentRow)); + } else RefreshRow( m_currentRow ); } @@ -2775,7 +2793,7 @@ public: { current ++; if( current == static_cast(row)) - { + { ret = node->GetItem() ; return DoJob::OK; } @@ -2803,7 +2821,7 @@ public: { current ++; if( current == static_cast(row)) - { + { ret = wxDataViewItem( n ) ; return DoJob::OK; } @@ -2839,7 +2857,7 @@ public: { current ++; if( current == static_cast(row)) - { + { ret = node ; return DoJob::OK; } @@ -2873,7 +2891,7 @@ public: { current ++; if( current == static_cast(row)) - { + { ret = new wxDataViewTreeNode( parent ) ; ret->SetItem( wxDataViewItem( n )); ret->SetHasChildren(false); @@ -2924,7 +2942,7 @@ void wxDataViewMainWindow::OnExpanding( unsigned int row ) //Check if the user prevent expanding if( e.GetSkipped() ) return; - + node->ToggleOpen(); //Here I build the children of current node if( node->GetChildrenNumber() == 0 ) @@ -2942,6 +2960,7 @@ void wxDataViewMainWindow::OnExpanding( unsigned int row ) SelectRow( row, false ); SelectRow( row + 1, true ); ChangeCurrentRow( row + 1 ); + SendSelectionChangedEvent( GetItemByRow(row+1)); } } else @@ -2977,6 +2996,7 @@ void wxDataViewMainWindow::OnCollapsing(unsigned int row) SelectRow( row, false); SelectRow(parent , true ); ChangeCurrentRow( parent ); + SendSelectionChangedEvent( node->GetItem() ); } } } @@ -3020,7 +3040,7 @@ wxDataViewTreeNode * wxDataViewMainWindow::FindNode( const wxDataViewItem & item for (; i < nodes.GetCount(); i ++) { if (nodes[i]->GetItem() == (**iter)) - { + { node = nodes[i]; break; } @@ -3254,11 +3274,11 @@ 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; + OnCollapsing(m_currentRow); + break; + case WXK_RIGHT: + OnExpanding( m_currentRow); + break; case WXK_END: if (!IsEmpty()) OnArrowChar( GetRowCount() - 1, event ); @@ -3310,7 +3330,7 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event ) int y = event.GetY(); m_owner->CalcUnscrolledPosition( x, y, &x, &y ); wxDataViewColumn *col = NULL; - + int xpos = 0; unsigned int cols = GetOwner()->GetColumnCount(); unsigned int i; @@ -3365,14 +3385,14 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event ) m_underMouse = node; } } - if (node!=NULL && !node->HasChildren()) + if (node!=NULL && !node->HasChildren()) delete node; } if (!hover) { if (m_underMouse != NULL) { - wxLogMessage("Undo the row: %d", GetRowByItem(m_underMouse->GetItem())); + //wxLogMessage("Undo the row: %d", GetRowByItem(m_underMouse->GetItem())); Refresh(GetRowByItem(m_underMouse->GetItem())); m_underMouse = NULL; } @@ -3461,21 +3481,21 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event ) bool expander = false; if (GetOwner()->GetExpanderColumn() == col) { - wxDataViewTreeNode * node = GetTreeNodeByRow(current); - if( node!=NULL && node->HasChildren() ) - { - int indent = node->GetIndentLevel(); - indent = GetOwner()->GetIndent()*indent; - wxRect rect( xpos + indent + EXPANDER_MARGIN, current * m_lineHeight + EXPANDER_MARGIN, m_lineHeight-2*EXPANDER_MARGIN,m_lineHeight-2*EXPANDER_MARGIN); - if( rect.Contains( x, y) ) - { - expander = true; - if( node->IsOpen() ) - OnCollapsing(current); - else - OnExpanding( current ); - } - } + wxDataViewTreeNode * node = GetTreeNodeByRow(current); + if( node!=NULL && node->HasChildren() ) + { + int indent = node->GetIndentLevel(); + indent = GetOwner()->GetIndent()*indent; + wxRect rect( xpos + indent + EXPANDER_MARGIN, current * m_lineHeight + EXPANDER_MARGIN, m_lineHeight-2*EXPANDER_MARGIN,m_lineHeight-2*EXPANDER_MARGIN); + if( rect.Contains( x, y) ) + { + expander = true; + if( node->IsOpen() ) + OnCollapsing(current); + else + OnExpanding( current ); + } + } } //If the user click the expander, we do not do editing even if the column with expander are editable if (m_lastOnSame && !expander ) @@ -3511,6 +3531,7 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event ) SelectAllRows(false); ChangeCurrentRow(current); SelectRow(m_currentRow,true); + SendSelectionChangedEvent(GetItemByRow( m_currentRow ) ); } // notify cell about right click @@ -3540,10 +3561,9 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event ) if ( IsSingleSel() || !IsRowSelected(current) ) { SelectAllRows( false ); - ChangeCurrentRow(current); - SelectRow(m_currentRow,true); + SendSelectionChangedEvent(GetItemByRow( m_currentRow ) ); } else // multi sel & current is highlighted & no mod keys { @@ -3556,8 +3576,8 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event ) if (cmdModifierDown) { ChangeCurrentRow(current); - ReverseRowSelection(m_currentRow); + SendSelectionChangedEvent(GetItemByRow(m_selection[0]) ); } else if (event.ShiftDown()) { @@ -3573,6 +3593,7 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event ) } SelectRows(lineFrom, lineTo, true); + SendSelectionChangedEvent(GetItemByRow(m_selection[0]) ); } else // !ctrl, !shift { @@ -3780,7 +3801,7 @@ bool wxDataViewCtrl::DeleteColumn( wxDataViewColumn *column ) if (ret == NULL) return false; - m_cols.Erase(ret); + m_cols.Erase(ret); delete column; OnColumnChange(); @@ -3796,7 +3817,21 @@ bool wxDataViewCtrl::ClearColumns() int wxDataViewCtrl::GetColumnPosition( const wxDataViewColumn *column ) const { - return -1; + int ret = 0, dead = 0; + int len = GetColumnCount(); + for (int i=0; iIsHidden()) + continue; + ret += col->GetWidth(); + if (column==col) + { + CalcScrolledPosition( ret, dead, &ret, &dead ); + break; + } + } + return ret; } wxDataViewColumn *wxDataViewCtrl::GetSortingColumn() const @@ -3917,7 +3952,7 @@ bool wxDataViewCtrl::IsSelected( int row ) const void wxDataViewCtrl::SelectRange( int from, int to ) { - wxArrayInt sel; + wxArrayInt sel; for( int i = from; i < to; i ++ ) sel.Add( i ); m_clientArea->Select(sel); @@ -3965,9 +4000,9 @@ void wxDataViewCtrl::EnsureVisible( const wxDataViewItem & item, const wxDataVie if( row >= 0 ) { if( column == NULL ) - return EnsureVisible(row, -1); + EnsureVisible(row, -1); else - { + { int col = 0; int len = GetColumnCount(); for( int i = 0; i < len; i ++ ) @@ -3979,7 +4014,7 @@ void wxDataViewCtrl::EnsureVisible( const wxDataViewItem & item, const wxDataVie EnsureVisible( row, col ); } } - + } void wxDataViewCtrl::HitTest( const wxPoint & point, wxDataViewItem & item, wxDataViewColumn* &column ) const @@ -4013,7 +4048,7 @@ void wxDataViewCtrl::Collapse( const wxDataViewItem & item ) { int row = m_clientArea->GetRowByItem( item ); if (row != -1) - m_clientArea->Collapse(row); + m_clientArea->Collapse(row); } #endif