#if wxUSE_DATAVIEWCTRL
#include "wx/dataview.h"
-#include "wx/spinctrl.h"
-#include "wx/choice.h"
-
-#include "wx/weakref.h"
-#include "wx/vector.h"
#ifndef WX_PRECOMP
#include "wx/dc.h"
#include "wx/settings.h"
#include "wx/log.h"
- #include "wx/icon.h"
#include "wx/crt.h"
#endif
+#include "wx/spinctrl.h"
+#include "wx/choice.h"
+#include "wx/imaglist.h"
+
const char wxDataViewCtrlNameStr[] = "dataviewCtrl";
void wxDataViewCtrlBase::ExpandAncestors( const wxDataViewItem & item )
{
if (!m_model) return;
-
+
if (!item.IsOk()) return;
wxVector<wxDataViewItem> parentChain;
-
+
// at first we get all the parents of the selected item
wxDataViewItem parent = m_model->GetParent(item);
while (parent.IsOk())
parentChain.push_back(parent);
parent = m_model->GetParent(parent);
}
-
+
// then we expand the parents, starting at the root
while (!parentChain.empty())
{
wxDataViewCtrlBase::AppendToggleColumn( const wxString &label, unsigned int model_column,
wxDataViewCellMode mode, int width, wxAlignment align, int flags )
{
-
wxDataViewColumn *ret = new wxDataViewColumn( label,
new wxDataViewToggleRenderer( wxT("bool"), mode ),
model_column, width, align, flags );
wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_COLUMN_SORTED, wxDataViewEvent )
wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_COLUMN_REORDERED, wxDataViewEvent )
+wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_ITEM_BEGIN_DRAG, wxDataViewEvent )
+wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_ITEM_DROP_POSSIBLE, wxDataViewEvent )
+wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_ITEM_DROP, wxDataViewEvent )
// -------------------------------------
// wxDataViewSpinRenderer
{
return m_cols[pos];
}
-
+
void wxDataViewListStore::AppendItem( const wxVector<wxVariant> &values, wxClientData *data )
{
wxDataViewListStoreLine *line = new wxDataViewListStoreLine( data );
line->m_values = values;
m_data.push_back( line );
-
+
RowAppended();
}
wxDataViewListStoreLine *line = new wxDataViewListStoreLine( data );
line->m_values = values;
m_data.insert( m_data.begin(), line );
-
+
RowPrepended();
}
wxDataViewListStoreLine *line = new wxDataViewListStoreLine( data );
line->m_values = values;
m_data.insert( m_data.begin()+row, line );
-
+
RowInserted( row );
}
{
wxVector<wxDataViewListStoreLine*>::iterator it = m_data.begin() + row;
m_data.erase( it );
-
+
RowDeleted( row );
}
wxDataViewListStoreLine* line = *it;
delete line;
}
-
+
Reset( 0 );
}
{
wxDataViewListStoreLine *line = m_data[row];
line->m_values[col] = value;
-
+
return true;
}
+//-----------------------------------------------------------------------------
+// wxDataViewListCtrl
+//-----------------------------------------------------------------------------
+
+IMPLEMENT_DYNAMIC_CLASS(wxDataViewListCtrl,wxDataViewCtrl)
+
+BEGIN_EVENT_TABLE(wxDataViewListCtrl,wxDataViewCtrl)
+ EVT_SIZE( wxDataViewListCtrl::OnSize )
+END_EVENT_TABLE()
+
+wxDataViewListCtrl::wxDataViewListCtrl()
+{
+}
+
+wxDataViewListCtrl::wxDataViewListCtrl( wxWindow *parent, wxWindowID id,
+ const wxPoint& pos, const wxSize& size, long style,
+ const wxValidator& validator )
+{
+ Create( parent, id, pos, size, style, validator );
+
+ wxDataViewListStore *store = new wxDataViewListStore;
+ AssociateModel( store );
+ store->DecRef();
+}
+
+wxDataViewListCtrl::~wxDataViewListCtrl()
+{
+}
+
+
+bool wxDataViewListCtrl::Create( wxWindow *parent, wxWindowID id,
+ const wxPoint& pos, const wxSize& size, long style,
+ const wxValidator& validator )
+{
+ return wxDataViewCtrl::Create( parent, id, pos, size, style, validator );
+}
+
+bool wxDataViewListCtrl::AppendColumn( wxDataViewColumn *column, const wxString &varianttype )
+{
+ GetStore()->AppendColumn( varianttype );
+ return wxDataViewCtrl::AppendColumn( column );
+}
+
+bool wxDataViewListCtrl::PrependColumn( wxDataViewColumn *column, const wxString &varianttype )
+{
+ GetStore()->PrependColumn( varianttype );
+ return wxDataViewCtrl::PrependColumn( column );
+}
+
+bool wxDataViewListCtrl::InsertColumn( unsigned int pos, wxDataViewColumn *column, const wxString &varianttype )
+{
+ GetStore()->InsertColumn( pos, varianttype );
+ return wxDataViewCtrl::InsertColumn( pos, column );
+}
+
+bool wxDataViewListCtrl::PrependColumn( wxDataViewColumn *col )
+{
+ return PrependColumn( col, "string" );
+}
+
+bool wxDataViewListCtrl::InsertColumn( unsigned int pos, wxDataViewColumn *col )
+{
+ return InsertColumn( pos, col, "string" );
+}
+
+bool wxDataViewListCtrl::AppendColumn( wxDataViewColumn *col )
+{
+ return AppendColumn( col, "string" );
+}
+
+wxDataViewColumn *wxDataViewListCtrl::AppendTextColumn( const wxString &label,
+ wxDataViewCellMode mode, int width, wxAlignment align, int flags )
+{
+ GetStore()->AppendColumn( wxT("string") );
+
+ wxDataViewColumn *ret = new wxDataViewColumn( label,
+ new wxDataViewTextRenderer( wxT("string"), mode ),
+ GetStore()->GetColumnCount()-1, width, align, flags );
+
+ wxDataViewCtrl::AppendColumn( ret );
+
+ return ret;
+}
+
+wxDataViewColumn *wxDataViewListCtrl::AppendToggleColumn( const wxString &label,
+ wxDataViewCellMode mode, int width, wxAlignment align, int flags )
+{
+ GetStore()->AppendColumn( wxT("bool") );
+
+ wxDataViewColumn *ret = new wxDataViewColumn( label,
+ new wxDataViewToggleRenderer( wxT("bool"), mode ),
+ GetStore()->GetColumnCount()-1, width, align, flags );
+
+ wxDataViewCtrl::AppendColumn( ret );
+
+ return ret;
+}
+
+wxDataViewColumn *wxDataViewListCtrl::AppendProgressColumn( const wxString &label,
+ wxDataViewCellMode mode, int width, wxAlignment align, int flags )
+{
+ GetStore()->AppendColumn( wxT("long") );
+
+ wxDataViewColumn *ret = new wxDataViewColumn( label,
+ new wxDataViewProgressRenderer( wxEmptyString, wxT("long"), mode ),
+ GetStore()->GetColumnCount()-1, width, align, flags );
+
+ wxDataViewCtrl::AppendColumn( ret );
+
+ return ret;
+}
+
+wxDataViewColumn *wxDataViewListCtrl::AppendIconTextColumn( const wxString &label,
+ wxDataViewCellMode mode, int width, wxAlignment align, int flags )
+{
+ GetStore()->AppendColumn( wxT("wxDataViewIconText") );
+
+ wxDataViewColumn *ret = new wxDataViewColumn( label,
+ new wxDataViewIconTextRenderer( wxT("wxDataViewIconText"), mode ),
+ GetStore()->GetColumnCount()-1, width, align, flags );
+
+ wxDataViewCtrl::AppendColumn( ret );
+
+ return ret;
+}
+
+void wxDataViewListCtrl::OnSize( wxSizeEvent &event )
+{
+ event.Skip( true );
+}
+
//-----------------------------------------------------------------------------
// wxDataViewTreeStore
//-----------------------------------------------------------------------------
new wxDataViewTreeStoreNode( parent_node, text, icon, data );
parent_node->GetChildren().Append( node );
- // notify control
- ItemAdded( parent, node->GetItem() );
-
return node->GetItem();
}
new wxDataViewTreeStoreNode( parent_node, text, icon, data );
parent_node->GetChildren().Insert( node );
- // notify control
- ItemAdded( parent, node->GetItem() );
-
return node->GetItem();
}
wxDataViewItem
-wxDataViewTreeStore::InsertItem(const wxDataViewItem& WXUNUSED(parent),
- const wxDataViewItem& WXUNUSED(previous),
- const wxString& WXUNUSED(text),
- const wxIcon& WXUNUSED(icon),
- wxClientData * WXUNUSED(data))
+wxDataViewTreeStore::InsertItem(const wxDataViewItem& parent,
+ const wxDataViewItem& previous,
+ const wxString& text,
+ const wxIcon& icon,
+ wxClientData *data)
{
- return wxDataViewItem(0);
+ wxDataViewTreeStoreContainerNode *parent_node = FindContainerNode( parent );
+ if (!parent_node) return wxDataViewItem(0);
+
+ wxDataViewTreeStoreNode *previous_node = FindNode( previous );
+ int pos = parent_node->GetChildren().IndexOf( previous_node );
+ if (pos == wxNOT_FOUND) return wxDataViewItem(0);
+
+ wxDataViewTreeStoreNode *node =
+ new wxDataViewTreeStoreNode( parent_node, text, icon, data );
+ parent_node->GetChildren().Insert( (size_t) pos, node );
+
+ return node->GetItem();
}
wxDataViewItem wxDataViewTreeStore::PrependContainer( const wxDataViewItem& parent,
new wxDataViewTreeStoreContainerNode( parent_node, text, icon, expanded, data );
parent_node->GetChildren().Insert( node );
- // notify control
- ItemAdded( parent, node->GetItem() );
-
return node->GetItem();
}
new wxDataViewTreeStoreContainerNode( parent_node, text, icon, expanded, data );
parent_node->GetChildren().Append( node );
- // notify control
- ItemAdded( parent, node->GetItem() );
-
return node->GetItem();
}
wxDataViewItem
-wxDataViewTreeStore::InsertContainer(const wxDataViewItem& WXUNUSED(parent),
- const wxDataViewItem& WXUNUSED(previous),
- const wxString& WXUNUSED(text),
- const wxIcon& WXUNUSED(icon),
- const wxIcon& WXUNUSED(expanded),
- wxClientData * WXUNUSED(data))
+wxDataViewTreeStore::InsertContainer(const wxDataViewItem& parent,
+ const wxDataViewItem& previous,
+ const wxString& text,
+ const wxIcon& icon,
+ const wxIcon& expanded,
+ wxClientData * data)
{
- return wxDataViewItem(0);
+ wxDataViewTreeStoreContainerNode *parent_node = FindContainerNode( parent );
+ if (!parent_node) return wxDataViewItem(0);
+
+ wxDataViewTreeStoreNode *previous_node = FindNode( previous );
+ int pos = parent_node->GetChildren().IndexOf( previous_node );
+ if (pos == wxNOT_FOUND) return wxDataViewItem(0);
+
+ wxDataViewTreeStoreContainerNode *node =
+ new wxDataViewTreeStoreContainerNode( parent_node, text, icon, expanded, data );
+ parent_node->GetChildren().Insert( (size_t) pos, node );
+
+ return node->GetItem();
}
wxDataViewItem wxDataViewTreeStore::GetNthChild( const wxDataViewItem& parent, unsigned int pos ) const
if (!node) return;
node->SetText( text );
-
- // notify control
- ValueChanged( item, 0 );
}
wxString wxDataViewTreeStore::GetItemText( const wxDataViewItem& item ) const
if (!node) return;
node->SetIcon( icon );
-
- // notify control
- ValueChanged( item, 0 );
}
const wxIcon &wxDataViewTreeStore::GetItemIcon( const wxDataViewItem& item ) const
if (!node) return;
node->SetExpandedIcon( icon );
-
- // notify control
- ValueChanged( item, 0 );
}
const wxIcon &wxDataViewTreeStore::GetItemExpandedIcon( const wxDataViewItem& item ) const
if (!node) return;
node->SetData( data );
-
- // notify control? only sensible when sorting on client data
- // ValueChanged( item, 0 );
}
wxClientData *wxDataViewTreeStore::GetItemData( const wxDataViewItem& item ) const
if (!node) return;
parent_node->GetChildren().DeleteObject( node );
-
- // notify control
- ItemDeleted( parent_item, item );
}
void wxDataViewTreeStore::DeleteChildren( const wxDataViewItem& item )
wxDataViewTreeStoreContainerNode *node = FindContainerNode( item );
if (!node) return;
- wxDataViewItemArray array;
- wxDataViewTreeStoreNodeList::iterator iter;
- for (iter = node->GetChildren().begin(); iter != node->GetChildren().end(); iter++)
- {
- wxDataViewTreeStoreNode* child = *iter;
- array.Add( child->GetItem() );
- }
-
node->GetChildren().clear();
-
- // notify control
- ItemsDeleted( item, array );
}
void wxDataViewTreeStore::DeleteAllItems()
if (m_imageList && (iconIndex != -1))
icon = m_imageList->GetIcon( iconIndex );
- return GetStore()->AppendItem( parent, text, icon, data );
+ wxDataViewItem res = GetStore()->AppendItem( parent, text, icon, data );
+
+ GetStore()->ItemAdded( parent, res );
+
+ return res;
}
wxDataViewItem wxDataViewTreeCtrl::PrependItem( const wxDataViewItem& parent,
if (m_imageList && (iconIndex != -1))
icon = m_imageList->GetIcon( iconIndex );
- return GetStore()->PrependItem( parent, text, icon, data );
+ wxDataViewItem res = GetStore()->PrependItem( parent, text, icon, data );
+
+ GetStore()->ItemAdded( parent, res );
+
+ return res;
}
wxDataViewItem wxDataViewTreeCtrl::InsertItem( const wxDataViewItem& parent, const wxDataViewItem& previous,
if (m_imageList && (iconIndex != -1))
icon = m_imageList->GetIcon( iconIndex );
- return GetStore()->InsertItem( parent, previous, text, icon, data );
+ wxDataViewItem res = GetStore()->InsertItem( parent, previous, text, icon, data );
+
+ GetStore()->ItemAdded( parent, res );
+
+ return res;
}
wxDataViewItem wxDataViewTreeCtrl::PrependContainer( const wxDataViewItem& parent,
if (m_imageList && (expandedIndex != -1))
expanded = m_imageList->GetIcon( expandedIndex );
- return GetStore()->PrependContainer( parent, text, icon, expanded, data );
+ wxDataViewItem res = GetStore()->PrependContainer( parent, text, icon, expanded, data );
+
+ GetStore()->ItemAdded( parent, res );
+
+ return res;
}
wxDataViewItem wxDataViewTreeCtrl::AppendContainer( const wxDataViewItem& parent,
if (m_imageList && (expandedIndex != -1))
expanded = m_imageList->GetIcon( expandedIndex );
- return GetStore()->AppendContainer( parent, text, icon, expanded, data );
+ wxDataViewItem res = GetStore()->AppendContainer( parent, text, icon, expanded, data );
+
+ GetStore()->ItemAdded( parent, res );
+
+ return res;
}
wxDataViewItem wxDataViewTreeCtrl::InsertContainer( const wxDataViewItem& parent, const wxDataViewItem& previous,
if (m_imageList && (expandedIndex != -1))
expanded = m_imageList->GetIcon( expandedIndex );
- return GetStore()->InsertContainer( parent, previous, text, icon, expanded, data );
+ wxDataViewItem res = GetStore()->InsertContainer( parent, previous, text, icon, expanded, data );
+
+ GetStore()->ItemAdded( parent, res );
+
+ return res;
+}
+
+void wxDataViewTreeCtrl::SetItemText( const wxDataViewItem& item, const wxString &text )
+{
+ GetStore()->SetItemText(item,text);
+
+ // notify control
+ GetStore()->ValueChanged( item, 0 );
+}
+
+void wxDataViewTreeCtrl::SetItemIcon( const wxDataViewItem& item, const wxIcon &icon )
+{
+ GetStore()->SetItemIcon(item,icon);
+
+ // notify control
+ GetStore()->ValueChanged( item, 0 );
+}
+
+void wxDataViewTreeCtrl::SetItemExpandedIcon( const wxDataViewItem& item, const wxIcon &icon )
+{
+ GetStore()->SetItemExpandedIcon(item,icon);
+
+ // notify control
+ GetStore()->ValueChanged( item, 0 );
+}
+
+void wxDataViewTreeCtrl::DeleteItem( const wxDataViewItem& item )
+{
+ wxDataViewItem parent_item = GetStore()->GetParent( item );
+
+ GetStore()->DeleteItem(item);
+
+ // notify control
+ GetStore()->ItemDeleted( parent_item, item );
+}
+
+void wxDataViewTreeCtrl::DeleteChildren( const wxDataViewItem& item )
+{
+ wxDataViewTreeStoreContainerNode *node = GetStore()->FindContainerNode( item );
+ if (!node) return;
+
+ wxDataViewItemArray array;
+ wxDataViewTreeStoreNodeList::iterator iter;
+ for (iter = node->GetChildren().begin(); iter != node->GetChildren().end(); iter++)
+ {
+ wxDataViewTreeStoreNode* child = *iter;
+ array.Add( child->GetItem() );
+ }
+
+ GetStore()->DeleteChildren( item );
+
+ // notify control
+ GetStore()->ItemsDeleted( item, array );
+}
+
+void wxDataViewTreeCtrl::DeleteAllItems()
+{
+ GetStore()->DeleteAllItems();
+
+ GetStore()->Cleared();
}
void wxDataViewTreeCtrl::OnExpanded( wxDataViewEvent &event )
if (!container) return;
container->SetExpanded( true );
+
GetStore()->ItemChanged( event.GetItem() );
}
if (!container) return;
container->SetExpanded( false );
+
GetStore()->ItemChanged( event.GetItem() );
}