return *(GetOwner()->GetColumn(idx));
}
+ // FIXME: currently unused
virtual bool UpdateColumnWidthToFit(unsigned int idx, int widthTitle)
{
wxDataViewCtrl * const owner = GetOwner();
void HitTest( const wxPoint & point, wxDataViewItem & item, wxDataViewColumn* &column );
wxRect GetItemRect( const wxDataViewItem & item, const wxDataViewColumn* column );
- void Expand( unsigned int row ) { OnExpanding( row ); }
- void Collapse( unsigned int row ) { OnCollapsing( row ); }
+ void Expand( unsigned int row );
+ void Collapse( unsigned int row );
bool IsExpanded( unsigned int row ) const;
+ bool HasChildren( unsigned int row ) const;
#if wxUSE_DRAG_AND_DROP
bool EnableDragSource( const wxDataFormat &format );
int RecalculateCount();
wxDataViewEvent SendExpanderEvent( wxEventType type, const wxDataViewItem & item );
- void OnExpanding( unsigned int row );
- void OnCollapsing( unsigned int row );
wxDataViewTreeNode * FindNode( const wxDataViewItem & item );
{
const wxDataViewCtrl *view = GetView();
if (!m_text.empty())
- {
- int x,y;
- view->GetTextExtent( m_text, &x, &y );
- return wxSize( x, y );
- }
- return wxSize(80,20);
+ return view->wxWindowBase::GetTextExtent( m_text );
+ return wxSize(wxDVC_DEFAULT_RENDERER_SIZE,wxDVC_DEFAULT_RENDERER_SIZE);
}
// ---------------------------------------------------------
else if (m_icon.Ok())
return wxSize( m_icon.GetWidth(), m_icon.GetHeight() );
- return wxSize(16,16);
+ return wxSize(wxDVC_DEFAULT_RENDERER_SIZE,wxDVC_DEFAULT_RENDERER_SIZE);
}
// ---------------------------------------------------------
return wxSize(80,20);
}
-wxControl *
-wxDataViewIconTextRenderer::CreateEditorCtrl(wxWindow * WXUNUSED(parent),
- wxRect WXUNUSED(labelRect),
- const wxVariant& WXUNUSED(value))
+wxControl* wxDataViewIconTextRenderer::CreateEditorCtrl(wxWindow *parent, wxRect labelRect, const wxVariant& value)
{
- return NULL;
+ wxDataViewIconText iconText;
+ iconText << value;
+
+ wxString text = iconText.GetText();
+
+ // adjust the label rect to take the width of the icon into account
+ if (iconText.GetIcon().IsOk())
+ {
+ int w = iconText.GetIcon().GetWidth() + 4;
+ labelRect.x += w;
+ labelRect.width -= w;
+ }
+
+ return new wxTextCtrl( parent, wxID_ANY, text,
+ wxPoint(labelRect.x,labelRect.y),
+ wxSize(labelRect.width,labelRect.height) );
}
-bool
-wxDataViewIconTextRenderer::GetValueFromEditorCtrl(wxControl* WXUNUSED(editor),
- wxVariant& WXUNUSED(value))
+bool wxDataViewIconTextRenderer::GetValueFromEditorCtrl( wxControl *editor, wxVariant& value )
{
- return false;
+ wxTextCtrl *text = (wxTextCtrl*) editor;
+
+ wxDataViewIconText iconText(text->GetValue(), m_value.GetIcon());
+ value << iconText;
+ return true;
}
//-----------------------------------------------------------------------------
}
virtual wxDragResult OnDragOver( wxCoord x, wxCoord y, wxDragResult def )
- {
+ {
wxDataFormat format = GetMatchingPair();
if (format == wxDF_INVALID)
return wxDragNone;
return m_win->OnDragOver( format, x, y, def);
- }
+ }
virtual bool OnDrop( wxCoord x, wxCoord y )
- {
+ {
wxDataFormat format = GetMatchingPair();
if (format == wxDF_INVALID)
return false;
return m_win->OnDrop( format, x, y );
- }
+ }
virtual wxDragResult OnData( wxCoord x, wxCoord y, wxDragResult def )
- {
+ {
wxDataFormat format = GetMatchingPair();
if (format == wxDF_INVALID)
return wxDragNone;
if (!GetData())
return wxDragNone;
return m_win->OnData( format, x, y, def );
- }
+ }
virtual void OnLeave()
{ m_win->OnLeave(); }
return -1;
}
-
IMPLEMENT_ABSTRACT_CLASS(wxDataViewMainWindow, wxWindow)
BEGIN_EVENT_TABLE(wxDataViewMainWindow,wxWindow)
cell_rect.x = x_start;
for (unsigned int i = col_start; i < col_last; i++)
{
-
wxDataViewColumn *col = GetOwner()->GetColumnAt( i );
wxDataViewRenderer *cell = col->GetRenderer();
cell_rect.width = col->GetWidth();
if (column->IsHidden())
continue; // skip it!
- if ((col != 0) && model->IsContainer(item) && !model->HasContainerColumns(item))
+ 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<wxDataViewRenderer*>(renderer);
- renderer2->SetValue( value );
+
+ wxDataViewRenderer *renderer =
+ const_cast<wxDataViewRenderer*>(column->GetRenderer());
+ renderer->SetValue( value );
height = wxMax( height, renderer->GetSize().y );
}
-
start += height;
}
unsigned int yy = 0;
for (;;)
{
- const wxDataViewTreeNode* node = GetTreeNodeByRow(row);
- if (!node)
- {
- // not really correct...
- return row + ((y-yy) / m_lineHeight);
- }
+ const wxDataViewTreeNode* node = GetTreeNodeByRow(row);
+ if (!node)
+ {
+ // not really correct...
+ return row + ((y-yy) / m_lineHeight);
+ }
- wxDataViewItem item = node->GetItem();
+ wxDataViewItem item = node->GetItem();
if (node && !node->HasChildren())
{
wxDELETE(node);
}
- unsigned int cols = GetOwner()->GetColumnCount();
- unsigned int col;
- int height = m_lineHeight;
- for (col = 0; col < cols; col++)
- {
+ 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))
+ 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<wxDataViewRenderer*>(renderer);
- renderer2->SetValue( value );
+
+ wxDataViewRenderer *renderer =
+ const_cast<wxDataViewRenderer*>(column->GetRenderer());
+ renderer->SetValue( value );
height = wxMax( height, renderer->GetSize().y );
- }
+ }
- yy += height;
- if (y < yy)
- return row;
+ yy += height;
+ if (y < yy)
+ return row;
- row++;
+ row++;
}
}
if (column->IsHidden())
continue; // skip it!
- if ((col != 0) && model->IsContainer(item) && !model->HasContainerColumns(item))
+ 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<wxDataViewRenderer*>(renderer);
- renderer2->SetValue( value );
+
+ wxDataViewRenderer *renderer =
+ const_cast<wxDataViewRenderer*>(column->GetRenderer());
+ renderer->SetValue( value );
height = wxMax( height, renderer->GetSize().y );
}
return node->IsOpen();
}
+bool wxDataViewMainWindow::HasChildren( unsigned int row ) const
+{
+ if (IsVirtualList())
+ return false;
+
+ wxDataViewTreeNode * node = GetTreeNodeByRow(row);
+ if (!node)
+ return false;
-void wxDataViewMainWindow::OnExpanding( unsigned int row )
+ if (!node->HasChildren())
+ {
+ delete node;
+ return false;
+ }
+
+ return true;
+}
+
+void wxDataViewMainWindow::Expand( unsigned int row )
{
if (IsVirtualList())
return;
wxDataViewTreeNode * node = GetTreeNodeByRow(row);
- if( node != NULL )
+ if (!node)
+ return;
+
+ if (!node->HasChildren())
{
- if( node->HasChildren())
- {
- if( !node->IsOpen())
+ delete node;
+ return;
+ }
+
+ if (!node->IsOpen())
{
wxDataViewEvent e =
SendExpanderEvent(wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDING, node->GetItem());
// Send the expanded event
SendExpanderEvent(wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDED,node->GetItem());
}
- else
- {
- SelectRow( row, false );
- SelectRow( row + 1, true );
- ChangeCurrentRow( row + 1 );
- SendSelectionChangedEvent( GetItemByRow(row+1));
- }
- }
- else
- delete node;
- }
}
-void wxDataViewMainWindow::OnCollapsing(unsigned int row)
+void wxDataViewMainWindow::Collapse(unsigned int row)
{
if (IsVirtualList())
return;
- wxDataViewTreeNode * node = GetTreeNodeByRow(row);
- if( node != NULL )
+ wxDataViewTreeNode *node = GetTreeNodeByRow(row);
+ if (!node)
+ return;
+
+ if (!node->HasChildren())
{
- wxDataViewTreeNode * nd = node;
+ delete node;
+ return;
+ }
- if( node->HasChildren() && node->IsOpen() )
+ if (node->IsOpen())
{
wxDataViewEvent e =
SendExpanderEvent(wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSING,node->GetItem());
{
// if there were no selected items below our node we still need to "fix" the
// selection list to adjust for the changing of the row indices.
- // We actually do the opposite of what we are doing in OnExpanding().
+ // We actually do the opposite of what we are doing in Expand().
for(unsigned i=0; i<m_selection.size(); ++i)
{
const unsigned testRow = m_selection[i];
m_count = -1;
UpdateDisplay();
- SendExpanderEvent(wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSED,nd->GetItem());
+ SendExpanderEvent(wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSED,node->GetItem());
}
- else
- {
- node = node->GetParent();
- if( node != NULL )
- {
- int parent = GetRowByItem( node->GetItem() );
- if( parent >= 0 )
- {
- SelectRow( row, false);
- SelectRow(parent , true );
- ChangeCurrentRow( parent );
- SendSelectionChangedEvent( node->GetItem() );
- }
- }
- }
- if( !nd->HasChildren())
- delete nd;
- }
}
wxDataViewTreeNode * wxDataViewMainWindow::FindNode( const wxDataViewItem & item )
wxRect wxDataViewMainWindow::GetItemRect( const wxDataViewItem & item,
const wxDataViewColumn* column )
{
+ int xpos = 0;
+ int width = 0;
+
+ unsigned int cols = GetOwner()->GetColumnCount();
+ // If column is null the loop will compute the combined width of all columns.
+ // Otherwise, it will compute the x position of the column we are looking for.
+ for (unsigned int i = 0; i < cols; i++)
+ {
+ wxDataViewColumn* col = GetOwner()->GetColumnAt( i );
+
+ if (col == column)
+ break;
+
+ if (col->IsHidden())
+ continue; // skip it!
+
+ xpos += col->GetWidth();
+ width += col->GetWidth();
+ }
+
+ if(column != 0)
+ {
+ // If we have a column, we need can get its width directly.
+ if(column->IsHidden())
+ width = 0;
+ else
+ width = column->GetWidth();
+
+ }
+ else
+ {
+ // If we have no column, we reset the x position back to zero.
+ xpos = 0;
+ }
+
+ // we have to take an expander column into account and compute its indentation
+ // to get the correct x position where the actual text is
+ int indent = 0;
int row = GetRowByItem(item);
- int y = GetLineStart( row );
- int h = GetLineHeight( m_lineHeight );
- int x = 0;
- wxDataViewColumn *col = NULL;
- for( int i = 0, cols = GetOwner()->GetColumnCount(); i < cols; i ++ )
+ if (!IsVirtualList() && (column == 0 || GetOwner()->GetExpanderColumn() == column) )
{
- col = GetOwner()->GetColumnAt( i );
- x += col->GetWidth();
- if( GetOwner()->GetColumnAt(i+1) == column )
- break;
+ wxDataViewTreeNode* node = GetTreeNodeByRow(row);
+ indent = GetOwner()->GetIndent() * node->GetIndentLevel();
+ indent = indent + m_lineHeight; // use m_lineHeight as the width of the expander
+
+ if(!node->HasChildren())
+ delete node;
}
- int w = col->GetWidth();
- m_owner->CalcScrolledPosition( x, y, &x, &y );
- return wxRect(x, y, w, h);
+
+ wxRect itemRect( xpos + indent,
+ GetLineStart( row ),
+ width - indent,
+ GetLineHeight( row ) );
+
+ GetOwner()->CalcScrolledPosition( itemRect.x, itemRect.y,
+ &itemRect.x, &itemRect.y );
+
+ return itemRect;
}
int wxDataViewMainWindow::RecalculateCount()
break;
// Add the process for tree expanding/collapsing
case WXK_LEFT:
- OnCollapsing(m_currentRow);
- break;
- case WXK_RIGHT:
- OnExpanding( m_currentRow);
- break;
+ {
+ if (IsVirtualList())
+ break;
+
+ wxDataViewTreeNode* node = GetTreeNodeByRow(m_currentRow);
+ if (!node)
+ break;
+
+ if (node->HasChildren())
+ {
+ Collapse(m_currentRow);
+ }
+ else
+ {
+ wxDataViewTreeNode *parent_node = node->GetParent();
+ delete node;
+ if (parent_node)
+ {
+ int parent = GetRowByItem( parent_node->GetItem() );
+ if ( parent >= 0 )
+ {
+ unsigned int row = m_currentRow;
+ SelectRow( row, false);
+ SelectRow( parent, true );
+ ChangeCurrentRow( parent );
+ SendSelectionChangedEvent( parent_node->GetItem() );
+ }
+ }
+ }
+ break;
+ }
+ case WXK_RIGHT:
+ {
+ if (!IsExpanded( m_currentRow ))
+ Expand( m_currentRow );
+ else
+ {
+ unsigned int row = m_currentRow;
+ SelectRow( row, false );
+ SelectRow( row + 1, true );
+ ChangeCurrentRow( row + 1 );
+ SendSelectionChangedEvent( GetItemByRow(row+1) );
+ }
+ break;
+ }
case WXK_END:
+ {
if (!IsEmpty())
OnArrowChar( GetRowCount() - 1, event );
break;
-
+ }
case WXK_HOME:
if (!IsEmpty())
OnArrowChar( 0, event );
// valid and have children.
// So we don't need any extra checks.
if( node->IsOpen() )
- OnCollapsing(current);
+ Collapse(current);
else
- OnExpanding(current);
+ Expand(current);
}
else if ((event.LeftDown() || simulateClick) && !hoverOverExpander)
{
void wxDataViewCtrl::Collapse( const wxDataViewItem & item )
{
int row = m_clientArea->GetRowByItem( item );
+ wxPrintf( "row %d\n", row );
if (row != -1)
m_clientArea->Collapse(row);
}
return false;
}
+void wxDataViewCtrl::StartEditor( const wxDataViewItem & item, unsigned int column )
+{
+ wxDataViewColumn* col = GetColumn( column );
+ if (!col)
+ return;
+
+ wxRect itemRect = GetItemRect(item, col);
+ wxDataViewRenderer* renderer = col->GetRenderer();
+ renderer->StartEditing(item, itemRect);
+}
+
#endif
// !wxUSE_GENERICDATAVIEWCTRL