X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/344ed1f3861d5acdbc0e6486456136cbc47fc013..c4825ef73a5f190b8f39c59df098c3f39fa4464b:/src/generic/datavgen.cpp diff --git a/src/generic/datavgen.cpp b/src/generic/datavgen.cpp index 38c3281ec5..fb301b760d 100644 --- a/src/generic/datavgen.cpp +++ b/src/generic/datavgen.cpp @@ -168,6 +168,7 @@ protected: int m_scrollOffsetX; int m_buttonHeight; + bool m_vetoColumnDrag; bool m_delayedUpdate; wxImageList *m_imageList; @@ -332,7 +333,7 @@ public: unsigned int GetNodeNumber() const { return m_nodes.GetCount(); } int GetIndentLevel() const { - int ret = 0 ; + int ret = 0; const wxDataViewTreeNode * node = this; while( node->GetParent()->GetParent() != NULL ) { @@ -344,14 +345,14 @@ public: bool IsOpen() const { - return m_open ; + return m_open; } void ToggleOpen() { int len = m_nodes.GetCount(); int sum = 0; - for ( int i = 0 ;i < len ; i ++) + for ( int i = 0;i < len; i ++) sum += m_nodes[i]->GetSubTreeCount(); sum += m_leaves.GetCount(); @@ -374,7 +375,7 @@ public: void ChangeSubTreeCount( int num ) { if( !m_open ) - return ; + return; m_subTreeCount += num; if( m_parent ) m_parent->ChangeSubTreeCount(num); @@ -432,7 +433,7 @@ public: const wxSize &size = wxDefaultSize, const wxString &name = wxT("wxdataviewctrlmainwindow") ); virtual ~wxDataViewMainWindow(); - + bool IsVirtualList() const { return m_root == NULL; } // notifications from wxDataViewModel @@ -500,7 +501,7 @@ public: 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 unsigned int GetLastVisibleRow(); - unsigned int GetRowCount() ; + unsigned int GetRowCount(); wxDataViewItem GetSelection() const; wxDataViewSelection GetSelections(){ return m_selection; } @@ -524,7 +525,7 @@ public: } wxRect GetLineRect( unsigned int row ) const; - + int GetLineStart( unsigned int row ) const; // row * m_lineHeight in fixed mode int GetLineHeight( unsigned int row ) const; // m_lineHeight in fixed mode int GetLineAt( unsigned int y ) const; // y / m_lineHeight in fixed mode @@ -532,7 +533,7 @@ public: //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 void BuildTree( wxDataViewModel * model ); void DestroyTree(); @@ -546,7 +547,7 @@ private: //We did not need this temporarily //wxDataViewTreeNode * GetTreeNodeByItem( const wxDataViewItem & item ); - int RecalculateCount() ; + int RecalculateCount(); wxDataViewEvent SendExpanderEvent( wxEventType type, const wxDataViewItem & item ); void OnExpanding( unsigned int row ); @@ -657,7 +658,7 @@ wxDC *wxDataViewRenderer::GetDC() } void wxDataViewRenderer::SetAlignment( int align ) -{ +{ m_align=align; } @@ -667,15 +668,15 @@ int wxDataViewRenderer::GetAlignment() const } int wxDataViewRenderer::CalculateAlignment() const -{ +{ if (m_align == wxDVR_DEFAULT_ALIGNMENT) { if (GetOwner() == NULL) return wxALIGN_LEFT | wxALIGN_CENTRE_VERTICAL; - + return GetOwner()->GetAlignment() | wxALIGN_CENTRE_VERTICAL; } - + return m_align; } @@ -1327,6 +1328,7 @@ bool wxDataViewHeaderWindowMSW::Create( wxDataViewCtrl *parent, wxWindowID id, m_scrollOffsetX = 0; m_delayedUpdate = false; + m_vetoColumnDrag = false; m_buttonHeight = wxRendererNative::Get().GetHeaderButtonHeight( this ); int x = pos.x == wxDefaultCoord ? 0 : pos.x, @@ -1362,7 +1364,7 @@ bool wxDataViewHeaderWindowMSW::Create( wxDataViewCtrl *parent, wxWindowID id, } m_imageList = new wxImageList( 16, 16 ); - Header_SetImageList( (HWND) m_hWnd, m_imageList->GetHIMAGELIST() ); + (void)Header_SetImageList((HWND) m_hWnd, m_imageList->GetHIMAGELIST()); // we need to subclass the m_hWnd to force wxWindow::HandleNotify // to call wxDataViewHeaderWindow::MSWOnNotify @@ -1400,7 +1402,7 @@ void wxDataViewHeaderWindowMSW::UpdateDisplay() // remove old columns for (int j=0, max=Header_GetItemCount((HWND)m_hWnd); j < max; j++) Header_DeleteItem((HWND)m_hWnd, 0); - + m_imageList->RemoveAll(); // add the updated array of columns to the header control @@ -1412,6 +1414,7 @@ void wxDataViewHeaderWindowMSW::UpdateDisplay() if (col->IsHidden()) continue; // don't add it! + wxString title( col->GetTitle() ); HDITEM hdi; hdi.mask = HDI_TEXT | HDI_FORMAT | HDI_WIDTH; if (col->GetBitmap().IsOk()) @@ -1420,13 +1423,13 @@ void wxDataViewHeaderWindowMSW::UpdateDisplay() hdi.mask |= HDI_IMAGE; hdi.iImage = m_imageList->GetImageCount()-1; } - hdi.pszText = (wxChar *) col->GetTitle().wx_str(); + hdi.pszText = (wxChar *) title.wx_str(); hdi.cxy = col->GetWidth(); hdi.cchTextMax = sizeof(hdi.pszText)/sizeof(hdi.pszText[0]); hdi.fmt = HDF_LEFT | HDF_STRING; if (col->GetBitmap().IsOk()) hdi.fmt |= HDF_IMAGE; - + //hdi.fmt &= ~(HDF_SORTDOWN|HDF_SORTUP); if (col->IsSortable() && GetOwner()->GetSortingColumn() == col) @@ -1505,6 +1508,13 @@ bool wxDataViewHeaderWindowMSW::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARA NMHEADER *nmHDR = (NMHEADER *)nmhdr; switch ( nmhdr->code ) { + case NM_RELEASEDCAPTURE: + { + // user has released the mouse + m_vetoColumnDrag = false; + } + break; + case HDN_BEGINTRACK: // user has started to resize a column: // do we need to veto it? @@ -1516,11 +1526,21 @@ bool wxDataViewHeaderWindowMSW::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARA break; case HDN_BEGINDRAG: - // user has started to reorder a column - if ((nmHDR->iItem != -1) && (!GetColumn(nmHDR->iItem)->IsReorderable())) + // valid column + if (nmHDR->iItem != -1) + { + // user has started to reorder a valid column + if ((m_vetoColumnDrag == true) || (!GetColumn(nmHDR->iItem)->IsReorderable())) + { + // veto it! + *result = TRUE; + m_vetoColumnDrag = true; + } + } + else { // veto it! - *result = TRUE; + m_vetoColumnDrag = true; } break; @@ -2032,7 +2052,7 @@ wxDataViewMainWindow::wxDataViewMainWindow( wxDataViewCtrl *parent, wxWindowID i m_root->SetHasChildren(true); //Make m_count = -1 will cause the class recaculate the real displaying number of rows. - m_count = -1 ; + m_count = -1; m_underMouse = NULL; UpdateDisplay(); } @@ -2174,8 +2194,7 @@ void wxDataViewMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) cell_rect.x = x_start; for (unsigned int i = col_start; i < col_last; i++) { - cell_rect.height = GetLineHeight( i ); // -1 is for the horizontal rules (?) - + wxDataViewColumn *col = GetOwner()->GetColumn( i ); wxDataViewRenderer *cell = col->GetRenderer(); cell_rect.width = col->GetWidth(); @@ -2203,7 +2222,7 @@ void wxDataViewMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) } else { - dataitem = wxDataViewItem( (void*) item ); + dataitem = wxDataViewItem( wxUIntToPtr(item) ); } model->GetValue( value, dataitem, col->GetModelColumn()); @@ -2218,8 +2237,9 @@ void wxDataViewMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) cell->SetHasAttr( ret ); } - // update the y offset + // update cell_rect cell_rect.y = GetLineStart( item ); + cell_rect.height = GetLineHeight( item ); // -1 is for the horizontal rules (?) //Draw the expander here. int indent = 0; @@ -2234,7 +2254,7 @@ 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) - (expander_width/2) - EXPANDER_OFFSET; - 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 dc.SetPen( m_penExpander ); dc.SetBrush( wxNullBrush ); if( node->HasChildren() ) @@ -2257,7 +2277,7 @@ void wxDataViewMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) { // 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) + wxDELETE(node); } // cannot be bigger than allocated space @@ -2333,9 +2353,9 @@ void wxDataViewMainWindow::OnRenameTimer() break; xpos += c->GetWidth(); } - wxRect labelRect( xpos, + wxRect labelRect( xpos, GetLineStart( m_currentRow ), - m_currentCol->GetWidth(), + m_currentCol->GetWidth(), GetLineHeight( m_currentRow ) ); GetOwner()->CalcScrolledPosition( labelRect.x, labelRect.y, @@ -2352,15 +2372,15 @@ void wxDataViewMainWindow::OnRenameTimer() class DoJob { public: - DoJob(){}; - virtual ~DoJob(){}; + DoJob() { } + virtual ~DoJob() { } //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 enum { OK = 0 , IGR = 1, CONT = 2 }; - virtual int operator() ( wxDataViewTreeNode * node ) = 0 ; + virtual int operator() ( wxDataViewTreeNode * node ) = 0; virtual int operator() ( void * n ) = 0; }; @@ -2372,12 +2392,12 @@ bool Walker( wxDataViewTreeNode * node, DoJob & func ) switch( func( node ) ) { case DoJob::OK : - return true ; + return true; case DoJob::IGR: return false; case DoJob::CONT: - default: - ; + default: + ; } wxDataViewTreeNodes nodes = node->GetNodes(); @@ -2387,7 +2407,7 @@ bool Walker( wxDataViewTreeNode * node, DoJob & func ) int len = leaves.GetCount(); int i = 0, nodes_i = 0; - for( ; i < len ; i ++ ) + for(; i < len; i ++ ) { void * n = leaves[i]; if( nodes_i < len_nodes && n == nodes[nodes_i]->GetItem().GetID() ) @@ -2403,12 +2423,12 @@ bool Walker( wxDataViewTreeNode * node, DoJob & func ) switch( func( n ) ) { case DoJob::OK : - return true ; + return true; case DoJob::IGR: continue; case DoJob::CONT: default: - ; + ; } } return false; @@ -2496,7 +2516,7 @@ bool wxDataViewMainWindow::ItemDeleted(const wxDataViewItem& parent, wxDataViewTreeNode * n = NULL; wxDataViewTreeNodes nodes = node->GetNodes(); int len = nodes.GetCount(); - for( int i = 0 ; i < len; i ++) + for( int i = 0; i < len; i ++) { if( nodes[i]->GetItem() == item ) { @@ -2866,7 +2886,7 @@ void wxDataViewMainWindow::RefreshRowsAfter( unsigned int firstRow ) if (start > client_size.y) return; wxRect rect( 0, start, client_size.x, client_size.y - start ); - + Refresh( true, &rect ); } @@ -2935,34 +2955,53 @@ wxRect wxDataViewMainWindow::GetLineRect( unsigned int row ) const int wxDataViewMainWindow::GetLineStart( unsigned int row ) const { + const wxDataViewModel *model = GetOwner()->GetModel(); + if (GetOwner()->GetWindowStyle() & wxDV_VARIABLE_LINE_HEIGHT) { // TODO make more efficient - + int start = 0; - + unsigned int r; for (r = 0; r < row; r++) { - const wxDataViewTreeNode* node = GetTreeNodeByRow(r); - if (!node) return start; - - unsigned int cols = GetOwner()->GetColumnCount(); - unsigned int col; - int height = 0; - for (col = 0; col < cols; col++) - { + const wxDataViewTreeNode* node = GetTreeNodeByRow(r); + if (!node) return start; + + wxDataViewItem item = node->GetItem(); + + 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); + } + + 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)) + continue; // skip it! + const wxDataViewRenderer *renderer = column->GetRenderer(); + wxVariant value; + model->GetValue( value, item, column->GetModelColumn() ); + wxDataViewRenderer *renderer2 = const_cast(renderer); + renderer2->SetValue( value ); height = wxMax( height, renderer->GetSize().y ); - } - - start += height; + } + + + start += height; } - + return start; } else @@ -2973,63 +3012,84 @@ int wxDataViewMainWindow::GetLineStart( unsigned int row ) const int wxDataViewMainWindow::GetLineAt( unsigned int y ) const { - if (GetOwner()->GetWindowStyle() & wxDV_VARIABLE_LINE_HEIGHT) + const wxDataViewModel *model = GetOwner()->GetModel(); + + // check for the easy case first + if ( !GetOwner()->HasFlag(wxDV_VARIABLE_LINE_HEIGHT) ) + return y / m_lineHeight; + + // TODO make more efficient + unsigned int row = 0; + unsigned int yy = 0; + for (;;) { - // TODO make more efficient - - unsigned int row = 0; - unsigned int yy = 0; - for (;;) + const wxDataViewTreeNode* node = GetTreeNodeByRow(row); + if (!node) + { + // not really correct... + return row + ((y-yy) / m_lineHeight); + } + + wxDataViewItem item = node->GetItem(); + + if (node && !node->HasChildren()) { - const wxDataViewTreeNode* node = GetTreeNodeByRow(row); - if (!node) - { - // not really correct... - return row + ((y-yy) / m_lineHeight); - } - - unsigned int cols = GetOwner()->GetColumnCount(); - unsigned int col; - int height = 0; - for (col = 0; col < cols; col++) - { - const wxDataViewColumn *column = GetOwner()->GetColumn(col); - if (column->IsHidden()) - continue; // skip it! - - const wxDataViewRenderer *renderer = column->GetRenderer(); - height = wxMax( height, renderer->GetSize().y ); - } - - yy += height; - if (y < yy) - return row; - - row++; + // 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); } - - return -1; - } - else - { - return y / m_lineHeight; + + 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)) + continue; // skip it! + + const wxDataViewRenderer *renderer = column->GetRenderer(); + wxVariant value; + model->GetValue( value, item, column->GetModelColumn() ); + wxDataViewRenderer *renderer2 = const_cast(renderer); + renderer2->SetValue( value ); + height = wxMax( height, renderer->GetSize().y ); + } + + yy += height; + if (y < yy) + return row; + + row++; } } int wxDataViewMainWindow::GetLineHeight( unsigned int row ) const { + const wxDataViewModel *model = GetOwner()->GetModel(); + if (GetOwner()->GetWindowStyle() & wxDV_VARIABLE_LINE_HEIGHT) { wxASSERT( !IsVirtualList() ); - + const wxDataViewTreeNode* node = GetTreeNodeByRow(row); // wxASSERT( node ); if (!node) return m_lineHeight; - wxDataViewItem item( node->GetItem() ); - - int height = 0; - + wxDataViewItem item = node->GetItem(); + + 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); + } + + int height = m_lineHeight; + unsigned int cols = GetOwner()->GetColumnCount(); unsigned int col; for (col = 0; col < cols; col++) @@ -3037,8 +3097,15 @@ int wxDataViewMainWindow::GetLineHeight( unsigned int row ) const const wxDataViewColumn *column = GetOwner()->GetColumn(col); if (column->IsHidden()) continue; // skip it! - + + 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 ); height = wxMax( height, renderer->GetSize().y ); } @@ -3053,15 +3120,15 @@ 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 ) { current ++; if( current == static_cast(row)) { - ret = node->GetItem() ; + ret = node->GetItem(); return DoJob::OK; } @@ -3089,7 +3156,7 @@ public: current ++; if( current == static_cast(row)) { - ret = wxDataViewItem( n ) ; + ret = wxDataViewItem( n ); return DoJob::OK; } return DoJob::CONT; @@ -3097,7 +3164,7 @@ public: wxDataViewItem GetResult(){ return ret; } private: unsigned int row; - int current ; + int current; wxDataViewItem ret; }; @@ -3105,7 +3172,7 @@ wxDataViewItem wxDataViewMainWindow::GetItemByRow(unsigned int row) const { if (!m_root) { - return wxDataViewItem( (void*) row ); + return wxDataViewItem( wxUIntToPtr(row) ); } else { @@ -3121,18 +3188,18 @@ public: RowToTreeNodeJob( unsigned int row , int current, wxDataViewTreeNode * node ) { this->row = row; - this->current = current ; - ret = NULL ; + this->current = current; + ret = NULL; parent = node; } - virtual ~RowToTreeNodeJob(){}; + virtual ~RowToTreeNodeJob(){ } virtual int operator() ( wxDataViewTreeNode * node ) { current ++; if( current == static_cast(row)) { - ret = node ; + ret = node; return DoJob::OK; } @@ -3150,7 +3217,7 @@ public: { int index = static_cast(row) - current - 1; void * n = node->GetChildren().Item( index ); - ret = new wxDataViewTreeNode( parent ) ; + ret = new wxDataViewTreeNode( parent ); ret->SetItem( wxDataViewItem( n )); ret->SetHasChildren(false); return DoJob::OK; @@ -3166,7 +3233,7 @@ public: current ++; if( current == static_cast(row)) { - ret = new wxDataViewTreeNode( parent ) ; + ret = new wxDataViewTreeNode( parent ); ret->SetItem( wxDataViewItem( n )); ret->SetHasChildren(false); return DoJob::OK; @@ -3177,16 +3244,16 @@ public: wxDataViewTreeNode * GetResult(){ return ret; } private: unsigned int row; - int current ; + int current; wxDataViewTreeNode * ret; - wxDataViewTreeNode * parent ; + wxDataViewTreeNode * parent; }; wxDataViewTreeNode * wxDataViewMainWindow::GetTreeNodeByRow(unsigned int row) const { wxASSERT( !IsVirtualList() ); - + RowToTreeNodeJob job( row , -2, m_root ); Walker( m_root , job ); return job.GetResult(); @@ -3207,6 +3274,9 @@ wxDataViewEvent wxDataViewMainWindow::SendExpanderEvent( wxEventType type, const void wxDataViewMainWindow::OnExpanding( unsigned int row ) { + if (IsVirtualList()) + return; + wxDataViewTreeNode * node = GetTreeNodeByRow(row); if( node != NULL ) { @@ -3246,6 +3316,9 @@ void wxDataViewMainWindow::OnExpanding( unsigned int row ) void wxDataViewMainWindow::OnCollapsing(unsigned int row) { + if (IsVirtualList()) + return; + wxDataViewTreeNode * node = GetTreeNodeByRow(row); if( node != NULL ) { @@ -3266,7 +3339,7 @@ void wxDataViewMainWindow::OnCollapsing(unsigned int row) node = node->GetParent(); if( node != NULL ) { - int parent = GetRowByItem( node->GetItem() ) ; + int parent = GetRowByItem( node->GetItem() ); if( parent >= 0 ) { SelectRow( row, false); @@ -3301,7 +3374,7 @@ wxDataViewTreeNode * wxDataViewMainWindow::FindNode( const wxDataViewItem & item //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++ ) + for( ItemList::const_iterator iter = list.begin(); iter !=list.end(); iter++ ) { if( node->HasChildren() ) { @@ -3314,14 +3387,14 @@ wxDataViewTreeNode * wxDataViewMainWindow::FindNode( const wxDataViewItem & item wxDataViewTreeNodes nodes = node->GetNodes(); 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; @@ -3400,9 +3473,12 @@ int wxDataViewMainWindow::RecalculateCount() class ItemToRowJob : public DoJob { public: - ItemToRowJob(const wxDataViewItem & item, ItemList::const_iterator iter ) - { this->item = item ; ret = -1 ; m_iter = iter ; } - virtual ~ItemToRowJob(){}; + ItemToRowJob(const wxDataViewItem& item_, ItemList::const_iterator iter) + : m_iter(iter), + item(item_) + { + ret = -1; + } //Maybe binary search will help to speed up this process virtual int operator() ( wxDataViewTreeNode * node) @@ -3415,7 +3491,7 @@ public: if( node->GetItem() == **m_iter ) { - m_iter++ ; + m_iter++; return DoJob::CONT; } else @@ -3434,7 +3510,8 @@ public: return DoJob::CONT; } //the row number is begin from zero - int GetResult(){ return ret -1 ; } + int GetResult() { return ret -1; } + private: ItemList::const_iterator m_iter; wxDataViewItem item; @@ -3480,7 +3557,7 @@ int wxDataViewMainWindow::GetRowByItem(const wxDataViewItem & item) const static void BuildTreeHelper( wxDataViewModel * model, wxDataViewItem & item, wxDataViewTreeNode * node) { if( !model->IsContainer( item ) ) - return ; + return; wxDataViewItemArray children; unsigned int num = model->GetChildren( item, children); @@ -3491,7 +3568,7 @@ static void BuildTreeHelper( wxDataViewModel * model, wxDataViewItem & item, wx { wxDataViewTreeNode * n = new wxDataViewTreeNode( node ); n->SetItem(children[index]); - n->SetHasChildren( true ) ; + n->SetHasChildren( true ); node->AddNode( n ); } else @@ -3513,7 +3590,7 @@ void wxDataViewMainWindow::BuildTree(wxDataViewModel * model) if (GetOwner()->GetModel()->IsVirtualListModel()) { - m_count = -1 ; + m_count = -1; return; } @@ -3524,7 +3601,7 @@ void wxDataViewMainWindow::BuildTree(wxDataViewModel * model) wxDataViewItem item; SortPrepare(); BuildTreeHelper( model, item, m_root); - m_count = -1 ; + m_count = -1; } static void DestroyTreeHelper( wxDataViewTreeNode * node ) @@ -3532,9 +3609,9 @@ static void DestroyTreeHelper( wxDataViewTreeNode * node ) if( node->GetNodeNumber() != 0 ) { int len = node->GetNodeNumber(); - int i = 0 ; + int i = 0; wxDataViewTreeNodes& nodes = node->GetNodes(); - for( ; i < len; i ++ ) + for(; i < len; i ++ ) { DestroyTreeHelper(nodes[i]); } @@ -3688,10 +3765,10 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event ) { int indent = node->GetIndentLevel(); indent = GetOwner()->GetIndent()*indent; - wxRect rect( xpos + indent + EXPANDER_MARGIN, + wxRect rect( xpos + indent + EXPANDER_MARGIN, GetLineStart( current ) + EXPANDER_MARGIN + (GetLineHeight(current)/2) - (m_lineHeight/2) - EXPANDER_OFFSET, m_lineHeight-2*EXPANDER_MARGIN, - m_lineHeight-2*EXPANDER_MARGIN); + m_lineHeight-2*EXPANDER_MARGIN + EXPANDER_OFFSET); if( rect.Contains( x, y) ) { //So the mouse is over the expander @@ -3816,11 +3893,11 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event ) { int indent = node->GetIndentLevel(); indent = GetOwner()->GetIndent()*indent; - wxRect rect( xpos + indent + EXPANDER_MARGIN, + wxRect rect( xpos + indent + EXPANDER_MARGIN, GetLineStart( current ) + EXPANDER_MARGIN + (GetLineHeight(current)/2) - (m_lineHeight/2) - EXPANDER_OFFSET, m_lineHeight-2*EXPANDER_MARGIN, - m_lineHeight-2*EXPANDER_MARGIN); - + m_lineHeight-2*EXPANDER_MARGIN + EXPANDER_OFFSET); + if( rect.Contains( x, y) ) { expander = true; @@ -3939,7 +4016,7 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event ) wxFAIL_MSG( _T("how did we get here?") ); } } - + if (m_currentRow != oldCurrentRow) RefreshRow( oldCurrentRow ); @@ -4009,16 +4086,17 @@ 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; - } + m_cols.Clear(); } void wxDataViewCtrl::Init() { + m_cols.DeleteContents(true); m_notifier = NULL; + + // No sorting column at start + m_sortingColumn = NULL; + m_headerArea = NULL; } bool wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id, @@ -4027,17 +4105,17 @@ bool wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id, { if ( (style & wxBORDER_MASK) == 0) style |= wxBORDER_SUNKEN; - + + Init(); + if (!wxControl::Create( parent, id, pos, size, style | wxScrolledWindowStyle, validator)) return false; SetInitialSize(size); - Init(); - #ifdef __WXMAC__ - MacSetClipChildren( true ) ; + MacSetClipChildren( true ); #endif m_clientArea = new wxDataViewMainWindow( this, wxID_ANY ); @@ -4077,6 +4155,15 @@ WXLRESULT wxDataViewCtrl::MSWWindowProc(WXUINT nMsg, } #endif +wxSize wxDataViewCtrl::GetSizeAvailableForScrollTarget(const wxSize& size) +{ + wxSize newsize = size; + if (!HasFlag(wxDV_NO_HEADER) && (m_headerArea)) + newsize.y -= m_headerArea->GetSize().y; + + return newsize; +} + void wxDataViewCtrl::OnSize( wxSizeEvent &WXUNUSED(event) ) { // We need to override OnSize so that our scrolled @@ -4129,6 +4216,16 @@ bool wxDataViewCtrl::PrependColumn( wxDataViewColumn *col ) return true; } +bool wxDataViewCtrl::InsertColumn( unsigned int pos, wxDataViewColumn *col ) +{ + if (!wxDataViewCtrlBase::InsertColumn(pos,col)) + return false; + + m_cols.Insert( pos, col ); + OnColumnChange(); + return true; +} + void wxDataViewCtrl::OnColumnChange() { if (m_headerArea) @@ -4171,20 +4268,23 @@ wxDataViewColumn* wxDataViewCtrl::GetColumn( unsigned int pos ) const void wxDataViewCtrl::ColumnMoved( wxDataViewColumn* col, unsigned int new_pos ) { if (new_pos > m_cols.GetCount()) return; + + // Exchange position + m_cols.DeleteContents(false); m_cols.DeleteObject( col ); m_cols.Insert( new_pos, col ); + m_cols.DeleteContents(true); m_clientArea->UpdateDisplay(); } bool wxDataViewCtrl::DeleteColumn( wxDataViewColumn *column ) { - wxDataViewColumnList::compatibility_iterator ret = m_cols.Find( column ); + wxDataViewColumnList::compatibility_iterator ret = m_cols.Find( column ); if (!ret) return false; m_cols.Erase(ret); - delete column; OnColumnChange(); return true; @@ -4192,7 +4292,7 @@ bool wxDataViewCtrl::DeleteColumn( wxDataViewColumn *column ) bool wxDataViewCtrl::ClearColumns() { - m_cols.clear(); + m_cols.Clear(); OnColumnChange(); return true; } @@ -4242,7 +4342,7 @@ int wxDataViewCtrl::GetSelections( wxDataViewItemArray & sel ) const void wxDataViewCtrl::SetSelections( const wxDataViewItemArray & sel ) { - wxDataViewSelection selection(wxDataViewSelectionCmp) ; + wxDataViewSelection selection(wxDataViewSelectionCmp); int len = sel.GetCount(); for( int i = 0; i < len; i ++ ) { @@ -4298,7 +4398,7 @@ int wxDataViewCtrl::GetSelections( wxArrayInt & sel ) const void wxDataViewCtrl::SetSelections( const wxArrayInt & sel ) { - wxDataViewSelection selection(wxDataViewSelectionCmp) ; + wxDataViewSelection selection(wxDataViewSelectionCmp); int len = sel.GetCount(); for( int i = 0; i < len; i ++ ) {