const wxString &name = wxT("wxdataviewctrlmainwindow") );
virtual ~wxDataViewMainWindow();
+ bool IsList() const { return GetOwner()->GetModel()->IsListModel(); }
bool IsVirtualList() const { return m_root == NULL; }
// notifications from wxDataViewModel
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;
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 );
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 );
}
indent = 0;
- if (!IsVirtualList())
+ if (!IsList())
{
wxDataViewTreeNode *node = GetTreeNodeByRow(row);
indent = GetOwner()->GetIndent() * node->GetIndentLevel();
// deal with the expander
int indent = 0;
- if ((!IsVirtualList()) && (col == expander))
+ if ((!IsList()) && (col == expander))
{
// Calculate the indent first
indent = GetOwner()->GetIndent() * node->GetIndentLevel();
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() );
bool wxDataViewMainWindow::IsExpanded( unsigned int row ) const
{
- if (IsVirtualList())
+ if (IsList())
return false;
wxDataViewTreeNode * node = GetTreeNodeByRow(row);
bool wxDataViewMainWindow::HasChildren( unsigned int row ) const
{
- if (IsVirtualList())
+ if (IsList())
return false;
wxDataViewTreeNode * node = GetTreeNodeByRow(row);
void wxDataViewMainWindow::Expand( unsigned int row )
{
- if (IsVirtualList())
+ if (IsList())
return;
wxDataViewTreeNode * node = GetTreeNodeByRow(row);
void wxDataViewMainWindow::Collapse(unsigned int row)
{
- if (IsVirtualList())
+ if (IsList())
return;
wxDataViewTreeNode *node = GetTreeNodeByRow(row);
// 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();
// Add the process for tree expanding/collapsing
case WXK_LEFT:
{
- if (IsVirtualList())
+ if (IsList())
break;
wxDataViewTreeNode* node = GetTreeNodeByRow(m_currentRow);
// 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() )
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());
}
}
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;
Init();
if (!wxControl::Create( parent, id, pos, size,
- style | wxScrolledWindowStyle, validator))
+ style | wxScrolledWindowStyle, validator, name))
return false;
SetInitialSize(size);