X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/63ced01b228ba426db163b75667a9b57d092f8db..9ceed261f809dacf8f64c2287c5de9e45d22e5cb:/src/generic/datavgen.cpp?ds=sidebyside diff --git a/src/generic/datavgen.cpp b/src/generic/datavgen.cpp index dd7813621d..b80eeaf622 100644 --- a/src/generic/datavgen.cpp +++ b/src/generic/datavgen.cpp @@ -411,6 +411,7 @@ public: const wxString &name = wxT("wxdataviewctrlmainwindow") ); virtual ~wxDataViewMainWindow(); + bool IsList() const { return GetOwner()->GetModel()->IsListModel(); } bool IsVirtualList() const { return m_root == NULL; } // notifications from wxDataViewModel @@ -1377,7 +1378,7 @@ wxDragResult wxDataViewMainWindow::OnDragOver( wxDataFormat format, wxCoord x, m_owner->CalcUnscrolledPosition( xx, yy, &xx, &yy ); unsigned int row = GetLineAt( yy ); - if ((row >= GetRowCount()) || (yy > GetEndOfLastCol())) + if ((row >= GetRowCount()) || (xx > GetEndOfLastCol())) { RemoveDropHint(); return wxDragNone; @@ -1423,7 +1424,7 @@ bool wxDataViewMainWindow::OnDrop( wxDataFormat format, wxCoord x, wxCoord y ) m_owner->CalcUnscrolledPosition( xx, yy, &xx, &yy ); unsigned int row = GetLineAt( yy ); - if ((row >= GetRowCount()) || (yy > GetEndOfLastCol())) + if ((row >= GetRowCount()) || (xx > GetEndOfLastCol())) return false; wxDataViewItem item = GetItemByRow( row ); @@ -1452,7 +1453,7 @@ wxDragResult wxDataViewMainWindow::OnData( wxDataFormat format, wxCoord x, wxCoo m_owner->CalcUnscrolledPosition( xx, yy, &xx, &yy ); unsigned int row = GetLineAt( yy ); - if ((row >= GetRowCount()) || (yy > GetEndOfLastCol())) + if ((row >= GetRowCount()) || (xx > GetEndOfLastCol())) return wxDragNone; wxDataViewItem item = GetItemByRow( row ); @@ -1497,7 +1498,7 @@ wxBitmap wxDataViewMainWindow::CreateItemBitmap( unsigned int row, int &indent ) } indent = 0; - if (!IsVirtualList()) + if (!IsList()) { wxDataViewTreeNode *node = GetTreeNodeByRow(row); indent = GetOwner()->GetIndent() * node->GetIndentLevel(); @@ -1764,7 +1765,7 @@ void wxDataViewMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) // deal with the expander int indent = 0; - if ((!IsVirtualList()) && (col == expander)) + if ((!IsList()) && (col == expander)) { // Calculate the indent first indent = GetOwner()->GetIndent() * node->GetIndentLevel(); @@ -1989,9 +1990,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" ); + // Notice that it is possible that the item being deleted is not in the + // tree at all, for example we could be deleting a never shown (because + // collapsed) item in a tree model. So it's not an error if we don't know + // about this item, just return without doing anything then. + if ( !node || node->GetChildren().Index(item.GetID()) == wxNOT_FOUND ) + return false; int sub = -1; node->GetChildren().Remove( item.GetID() ); @@ -2792,7 +2796,7 @@ wxDataViewEvent wxDataViewMainWindow::SendExpanderEvent( wxEventType type, bool wxDataViewMainWindow::IsExpanded( unsigned int row ) const { - if (IsVirtualList()) + if (IsList()) return false; wxDataViewTreeNode * node = GetTreeNodeByRow(row); @@ -2810,7 +2814,7 @@ bool wxDataViewMainWindow::IsExpanded( unsigned int row ) const bool wxDataViewMainWindow::HasChildren( unsigned int row ) const { - if (IsVirtualList()) + if (IsList()) return false; wxDataViewTreeNode * node = GetTreeNodeByRow(row); @@ -2828,7 +2832,7 @@ bool wxDataViewMainWindow::HasChildren( unsigned int row ) const void wxDataViewMainWindow::Expand( unsigned int row ) { - if (IsVirtualList()) + if (IsList()) return; wxDataViewTreeNode * node = GetTreeNodeByRow(row); @@ -2884,7 +2888,7 @@ void wxDataViewMainWindow::Expand( unsigned int row ) void wxDataViewMainWindow::Collapse(unsigned int row) { - if (IsVirtualList()) + if (IsList()) return; wxDataViewTreeNode *node = GetTreeNodeByRow(row); @@ -3083,7 +3087,7 @@ wxRect wxDataViewMainWindow::GetItemRect( const wxDataViewItem & item, // to get the correct x position where the actual text is int indent = 0; int row = GetRowByItem(item); - if (!IsVirtualList() && (column == 0 || GetOwner()->GetExpanderColumn() == column) ) + if (!IsList() && (column == 0 || GetOwner()->GetExpanderColumn() == column) ) { wxDataViewTreeNode* node = GetTreeNodeByRow(row); indent = GetOwner()->GetIndent() * node->GetIndentLevel(); @@ -3329,7 +3333,7 @@ void wxDataViewMainWindow::OnChar( wxKeyEvent &event ) // Add the process for tree expanding/collapsing case WXK_LEFT: { - if (IsVirtualList()) + if (IsList()) break; wxDataViewTreeNode* node = GetTreeNodeByRow(m_currentRow); @@ -3470,7 +3474,7 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event ) // Test whether the mouse is hovered on the tree item button bool hoverOverExpander = false; - if ((!IsVirtualList()) && (GetOwner()->GetExpanderColumn() == col)) + if ((!IsList()) && (GetOwner()->GetExpanderColumn() == col)) { wxDataViewTreeNode * node = GetTreeNodeByRow(current); if( node!=NULL && node->HasChildren() ) @@ -3782,7 +3786,44 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event ) custom->SetValue( value ); wxRect cell_rect( xpos, GetLineStart( current ), col->GetWidth(), GetLineHeight( current ) ); - /* ignore ret */ custom->LeftClick( event.GetPosition(), cell_rect, + + // Report position relative to the cell's custom area, i.e. + // no the entire space as given by the control but the one + // used by the renderer after calculation of alignment etc. + + // adjust the rectangle ourselves to account for the alignment + wxRect rectItem = cell_rect; + const int align = custom->GetAlignment(); + if ( align != wxDVR_DEFAULT_ALIGNMENT ) + { + const wxSize size = custom->GetSize(); + + if ( size.x >= 0 && size.x < cell_rect.width ) + { + if ( align & wxALIGN_CENTER_HORIZONTAL ) + rectItem.x += (cell_rect.width - size.x)/2; + else if ( align & wxALIGN_RIGHT ) + rectItem.x += cell_rect.width - size.x; + // else: wxALIGN_LEFT is the default + } + + if ( size.y >= 0 && size.y < cell_rect.height ) + { + if ( align & wxALIGN_CENTER_VERTICAL ) + rectItem.y += (cell_rect.height - size.y)/2; + else if ( align & wxALIGN_BOTTOM ) + rectItem.y += cell_rect.height - size.y; + // else: wxALIGN_TOP is the default + } + } + + wxPoint pos( event.GetPosition() ); + pos.x -= rectItem.x; + pos.y -= rectItem.y; + + m_owner->CalcUnscrolledPosition( pos.x, pos.y, &pos.x, &pos.y ); + + /* ignore ret */ custom->LeftClick( pos, cell_rect, model, item, col->GetModelColumn()); } } @@ -3847,9 +3888,13 @@ void wxDataViewCtrl::Init() m_headerArea = NULL; } -bool wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id, - const wxPoint& pos, const wxSize& size, - long style, const wxValidator& validator ) +bool wxDataViewCtrl::Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style, + const wxValidator& validator, + const wxString& name) { // if ( (style & wxBORDER_MASK) == 0) // style |= wxBORDER_SUNKEN; @@ -3857,7 +3902,7 @@ bool wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id, Init(); if (!wxControl::Create( parent, id, pos, size, - style | wxScrolledWindowStyle, validator)) + style | wxScrolledWindowStyle, validator, name)) return false; SetInitialSize(size);