X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0bdfa38835fa13d142bbe56595123989c798bf31..74bf4e6430a42c20491d13e1bb9805e1ee614a95:/src/generic/datavgen.cpp diff --git a/src/generic/datavgen.cpp b/src/generic/datavgen.cpp index 4c04bb7fb1..e64b805d36 100644 --- a/src/generic/datavgen.cpp +++ b/src/generic/datavgen.cpp @@ -1464,7 +1464,7 @@ bool wxDataViewHeaderWindowMSW::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARA case HDN_BEGINDRAG: // user has started to reorder a column - if (!GetColumn(nmHDR->iItem)->IsReorderable()) + if ((nmHDR->iItem != -1) && (!GetColumn(nmHDR->iItem)->IsReorderable())) { // veto it! *result = TRUE; @@ -1921,7 +1921,7 @@ void wxDataViewRenameTimer::Notify() //----------------------------------------------------------------------------- //The tree building helper, declared firstly -void BuildTreeHelper( wxDataViewModel * model, wxDataViewItem & item, wxDataViewTreeNode * node); +static void BuildTreeHelper( wxDataViewModel * model, wxDataViewItem & item, wxDataViewTreeNode * node); int LINKAGEMODE wxDataViewSelectionCmp( unsigned int row1, unsigned int row2 ) { @@ -2196,19 +2196,15 @@ void wxDataViewMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) else wxRendererNative::Get().DrawTreeItemButton( this, dc, rect, flag); } - else - { - // 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 cell->SetAlignment( wxALIGN_CENTER_VERTICAL ); } - + if (node && !node->HasChildren()) + { + // Yes, if the node does not have any child, it must be a leaf which + // mean that it is a temporarily created by GetTreeNodeByRow + wxDELETE(node) + } // cannot be bigger than allocated space wxSize size = cell->GetSize(); @@ -2399,7 +2395,7 @@ bool wxDataViewMainWindow::ItemAdded(const wxDataViewItem & parent, const wxData return true; } -void DestroyTreeHelper( wxDataViewTreeNode * node); +static void DestroyTreeHelper( wxDataViewTreeNode * node); bool wxDataViewMainWindow::ItemDeleted(const wxDataViewItem& parent, const wxDataViewItem& item) @@ -2457,16 +2453,11 @@ bool wxDataViewMainWindow::ItemDeleted(const wxDataViewItem& parent, node->GetNodes().Remove( n ); sub -= n->GetSubTreeCount(); - DestroyTreeHelper(n); + ::DestroyTreeHelper(n); } //Make the row number invalid and get a new valid one when user call GetRowCount m_count = -1; node->ChangeSubTreeCount(sub); - if( node->GetChildrenNumber() == 0) - { - node->GetParent()->GetNodes().Remove( node ); - delete node; - } //Change the current row to the last row if the current exceed the max row number if( m_currentRow > GetRowCount() ) @@ -3073,7 +3064,7 @@ void wxDataViewMainWindow::OnExpanding( unsigned int row ) if( node->GetChildrenNumber() == 0 ) { SortPrepare(); - BuildTreeHelper(GetOwner()->GetModel(), node->GetItem(), node); + ::BuildTreeHelper(GetOwner()->GetModel(), node->GetItem(), node); } m_count = -1; UpdateDisplay(); @@ -3157,26 +3148,32 @@ wxDataViewTreeNode * wxDataViewMainWindow::FindNode( const wxDataViewItem & item if( node->GetChildrenNumber() == 0 ) { SortPrepare(); - BuildTreeHelper(model, node->GetItem(), node); + ::BuildTreeHelper(model, node->GetItem(), node); } wxDataViewTreeNodes nodes = node->GetNodes(); - unsigned int i = 0; - for (; i < nodes.GetCount(); i ++) + unsigned int i; + bool found = false; + + for (i = 0; i < nodes.GetCount(); i ++) { if (nodes[i]->GetItem() == (**iter)) { + if (nodes[i]->GetItem() == item) + return nodes[i]; + node = nodes[i]; + found = true; break; } } - if (i == nodes.GetCount()) + if (!found) return NULL; } else return NULL; } - return node; + return NULL; } void wxDataViewMainWindow::HitTest( const wxPoint & point, wxDataViewItem & item, wxDataViewColumn* &column ) @@ -3320,7 +3317,7 @@ int wxDataViewMainWindow::GetRowByItem(const wxDataViewItem & item) } } -void BuildTreeHelper( wxDataViewModel * model, wxDataViewItem & item, wxDataViewTreeNode * node) +static void BuildTreeHelper( wxDataViewModel * model, wxDataViewItem & item, wxDataViewTreeNode * node) { if( !model->IsContainer( item ) ) return ; @@ -3370,13 +3367,13 @@ void wxDataViewMainWindow::BuildTree(wxDataViewModel * model) m_count = -1 ; } -void DestroyTreeHelper( wxDataViewTreeNode * node ) +static void DestroyTreeHelper( wxDataViewTreeNode * node ) { if( node->GetNodeNumber() != 0 ) { int len = node->GetNodeNumber(); int i = 0 ; - wxDataViewTreeNodes nodes = node->GetNodes(); + wxDataViewTreeNodes& nodes = node->GetNodes(); for( ; i < len; i ++ ) { DestroyTreeHelper(nodes[i]); @@ -3389,7 +3386,7 @@ void wxDataViewMainWindow::DestroyTree() { if (m_root) { - DestroyTreeHelper(m_root); + ::DestroyTreeHelper(m_root); m_count = 0; m_root = NULL; } @@ -3666,6 +3663,8 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event ) OnExpanding( current ); } } + if (node && !node->HasChildren()) + delete node; } //If the user click the expander, we do not do editing even if the column with expander are editable if (m_lastOnSame && !expander && !ignore_other_columns) @@ -3842,6 +3841,12 @@ wxDataViewCtrl::~wxDataViewCtrl() { if (m_notifier) GetModel()->RemoveNotifier( m_notifier ); + + wxDataViewColumnList::const_iterator iter; + for (iter = m_cols.begin(); iter!=m_cols.end(); iter++) + { + delete *iter; + } } void wxDataViewCtrl::Init()