X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4264606eedb18f626e864020082d8dde8d055eea..e5dbea4951e809331c76118c69026f6c44faf9c4:/src/generic/datavgen.cpp diff --git a/src/generic/datavgen.cpp b/src/generic/datavgen.cpp index adcf1b3582..8804aad3f5 100644 --- a/src/generic/datavgen.cpp +++ b/src/generic/datavgen.cpp @@ -425,8 +425,11 @@ public: bool Cleared(); void Resort() { - SortPrepare(); - m_root->Resort(); + if (m_root) + { + SortPrepare(); + m_root->Resort(); + } UpdateDisplay(); } @@ -2273,7 +2276,8 @@ void wxDataViewMainWindow::ScrollTo( int rows, int column ) void wxDataViewMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) { wxDataViewModel *model = GetOwner()->GetModel(); - wxAutoBufferedPaintDC dc( this ); + //wxAutoBufferedPaintDC dc( this ); + wxPaintDC dc(this); // prepare the DC dc.SetBackground(GetBackgroundColour()); @@ -2288,7 +2292,7 @@ void wxDataViewMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) unsigned int item_start = wxMax( 0, (update.y / m_lineHeight) ); unsigned int item_count = wxMin( (int)(((update.y + update.height) / m_lineHeight) - item_start + 1), - (int)(GetRowCount( )- item_start) ); + (int)(GetRowCount( ) - item_start)); unsigned int item_last = item_start + item_count; // compute which columns needs to be redrawn @@ -2408,14 +2412,24 @@ void wxDataViewMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) { // get the cell value and set it into the renderer wxVariant value; - wxDataViewTreeNode * node = GetTreeNodeByRow(item); - if( node == NULL ) - continue; + wxDataViewTreeNode *node = NULL; + wxDataViewItem dataitem; + + if (m_root) + { + node = GetTreeNodeByRow(item); + if( node == NULL ) + continue; - wxDataViewItem dataitem = node->GetItem(); + dataitem = node->GetItem(); - if ((i > 0) && model->IsContainer(dataitem) && !model->HasContainerColumns(dataitem)) - continue; + if ((i > 0) && model->IsContainer(dataitem) && !model->HasContainerColumns(dataitem)) + continue; + } + else + { + dataitem = wxDataViewItem( (void*) item ); + } model->GetValue( value, dataitem, col->GetModelColumn()); cell->SetValue( value ); @@ -2433,9 +2447,11 @@ void wxDataViewMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) cell_rect.y = item * m_lineHeight; //Draw the expander here. - int indent = node->GetIndentLevel(); - if( col == expander ) + int indent = 0; + if ((m_root) && (col == expander)) { + indent = node->GetIndentLevel(); + //Calculate the indent first indent = cell_rect.x + GetOwner()->GetIndent() * indent; @@ -2460,9 +2476,11 @@ void wxDataViewMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) } else { - // I am wandering whether we should draw dot lines between tree nodes - delete node; - //Yes, if the node does not have any child, it must be a leaf which mean that it is a temporarily created by GetTreeNodeByRow + // I am wondering whether we should draw dot lines between tree nodes + if (node) + delete node; + // Yes, if the node does not have any child, it must be a leaf which + // mean that it is a temporarily created by GetTreeNodeByRow } //force the expander column to left-center align @@ -2859,9 +2877,16 @@ private: wxDataViewItem wxDataViewMainWindow::GetItemByRow(unsigned int row) const { - RowToItemJob job( row, -2 ); - Walker( m_root , job ); - return job.GetResult(); + if (!m_root) + { + return wxDataViewItem( (void*) row ); + } + else + { + RowToItemJob job( row, -2 ); + Walker( m_root , job ); + return job.GetResult(); + } } class RowToTreeNodeJob: public DoJob @@ -2934,9 +2959,16 @@ private: wxDataViewTreeNode * wxDataViewMainWindow::GetTreeNodeByRow(unsigned int row) { - RowToTreeNodeJob job( row , -2, m_root ); - Walker( m_root , job ); - return job.GetResult(); + if (!m_root) + { + return NULL; + } + else + { + RowToTreeNodeJob job( row , -2, m_root ); + Walker( m_root , job ); + return job.GetResult(); + } } wxDataViewEvent wxDataViewMainWindow::SendExpanderEvent( wxEventType type, const wxDataViewItem & item ) @@ -3123,7 +3155,19 @@ wxRect wxDataViewMainWindow::GetItemRect( const wxDataViewItem & item, const wxD int wxDataViewMainWindow::RecalculateCount() { - return m_root->GetSubTreeCount(); + if (!m_root) + { + wxDataViewIndexListModel *list_model = (wxDataViewIndexListModel*) GetOwner()->GetModel(); +#ifndef __WXMAC__ + return list_model->GetLastIndex() + 1; +#else + return list_model->GetLastIndex() - 1; +#endif + } + else + { + return m_root->GetSubTreeCount(); + } } class ItemToRowJob : public DoJob @@ -3177,26 +3221,33 @@ int wxDataViewMainWindow::GetRowByItem(const wxDataViewItem & item) if( model == NULL ) return -1; - if( !item.IsOk() ) - return -1; - - //Compose the a parent-chain of the finding item - ItemList list; - wxDataViewItem * pItem = NULL; - list.DeleteContents( true ); - wxDataViewItem it( item ); - while( it.IsOk() ) + if (!m_root) { - pItem = new wxDataViewItem( it ); - list.Insert( pItem ); - it = model->GetParent( it ); + return wxPtrToUInt( item.GetID() ); } - pItem = new wxDataViewItem( ); - list.Insert( pItem ); + else + { + if( !item.IsOk() ) + return -1; + + //Compose the a parent-chain of the finding item + ItemList list; + wxDataViewItem * pItem = NULL; + list.DeleteContents( true ); + wxDataViewItem it( item ); + while( it.IsOk() ) + { + pItem = new wxDataViewItem( it ); + list.Insert( pItem ); + it = model->GetParent( it ); + } + pItem = new wxDataViewItem( ); + list.Insert( pItem ); - ItemToRowJob job( item, list.begin() ); - Walker(m_root , job ); - return job.GetResult(); + ItemToRowJob job( item, list.begin() ); + Walker(m_root , job ); + return job.GetResult(); + } } void BuildTreeHelper( wxDataViewModel * model, wxDataViewItem & item, wxDataViewTreeNode * node) @@ -3231,6 +3282,17 @@ void BuildTreeHelper( wxDataViewModel * model, wxDataViewItem & item, wxDataVie void wxDataViewMainWindow::BuildTree(wxDataViewModel * model) { + DestroyTree(); + + if (GetOwner()->GetModel()->IsIndexListModel()) + { + m_count = -1 ; + return; + } + + m_root = new wxDataViewTreeNode( NULL ); + m_root->SetHasChildren(true); + //First we define a invalid item to fetch the top-level elements wxDataViewItem item; SortPrepare(); @@ -3255,9 +3317,12 @@ void DestroyTreeHelper( wxDataViewTreeNode * node ) void wxDataViewMainWindow::DestroyTree() { - DestroyTreeHelper(m_root); - m_root->SetSubTreeCount(0); - m_count = 0 ; + if (m_root) + { + DestroyTreeHelper(m_root); + m_count = 0; + m_root = NULL; + } } void wxDataViewMainWindow::OnChar( wxKeyEvent &event ) @@ -3397,7 +3462,7 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event ) //Test whether the mouse is hovered on the tree item button bool hover = false; - if (GetOwner()->GetExpanderColumn() == col) + if ((m_root) && (GetOwner()->GetExpanderColumn() == col)) { wxDataViewTreeNode * node = GetTreeNodeByRow(current); if( node!=NULL && node->HasChildren() ) @@ -3522,7 +3587,7 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event ) //Process the event of user clicking the expander bool expander = false; - if (GetOwner()->GetExpanderColumn() == col) + if ((m_root) && (GetOwner()->GetExpanderColumn() == col)) { wxDataViewTreeNode * node = GetTreeNodeByRow(current); if( node!=NULL && node->HasChildren() ) @@ -3784,6 +3849,8 @@ bool wxDataViewCtrl::AssociateModel( wxDataViewModel *model ) model->AddNotifier( m_notifier ); + m_clientArea->DestroyTree(); + m_clientArea->BuildTree(model); m_clientArea->UpdateDisplay();