Add wxDataViewTreeStore with sample

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@49168 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling 2007-10-16 11:41:46 +00:00
parent a3261ffb75
commit e94d0c1e66
4 changed files with 638 additions and 37 deletions

View File

@ -77,6 +77,10 @@ public:
void* GetID() const { return m_id; } void* GetID() const { return m_id; }
operator const void* () const { return m_id; } operator const void* () const { return m_id; }
#ifdef __WXDEBUG__
void Print( const wxString &text ) const { wxPrintf( "item %s: %d\n", text, (int) m_id ); }
#endif
private: private:
void* m_id; void* m_id;
}; };
@ -225,33 +229,6 @@ private:
unsigned int m_lastIndex; unsigned int m_lastIndex;
}; };
//-----------------------------------------------------------------------------
// wxDataViewTreeStore
//-----------------------------------------------------------------------------
#if 0
class wxDataViewTreeStore: public wxDataViewModel
{
public:
wxDataViewTreeStore();
~wxDataViewTreeStore();
void AddColumn( const wxString &variant_type );
wxDataViewItem AddItem( const wxDataViewItem& parent, const wxVariant &value );
wxDataViewItem AddContainer( const wxDataViewItem& parent, const wxVariant &value );
// implement base methods
virtual void GetValue( wxVariant &variant,
const wxDataViewItem &item, unsigned int col ) const;
virtual bool SetValue( const wxVariant &variant,
const wxDataViewItem &item, unsigned int col );
virtual wxDataViewItem GetParent( const wxDataViewItem &item ) const;
virtual bool IsContainer( const wxDataViewItem &item ) const;
virtual unsigned int GetChildren( const wxDataViewItem &item, wxDataViewItemArray &children ) const;
};
#endif
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// wxDataViewEditorCtrlEvtHandler // wxDataViewEditorCtrlEvtHandler
@ -482,11 +459,11 @@ public:
// short cuts // short cuts
wxDataViewColumn *AppendTextColumn( const wxString &label, unsigned int model_column, wxDataViewColumn *AppendTextColumn( const wxString &label, unsigned int model_column,
wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1, wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1,
wxAlignment align = wxALIGN_CENTER, wxAlignment align = wxALIGN_LEFT,
int flags = wxDATAVIEW_COL_RESIZABLE ); int flags = wxDATAVIEW_COL_RESIZABLE );
wxDataViewColumn *AppendIconTextColumn( const wxString &label, unsigned int model_column, wxDataViewColumn *AppendIconTextColumn( const wxString &label, unsigned int model_column,
wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1, wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1,
wxAlignment align = wxALIGN_CENTER, wxAlignment align = wxALIGN_LEFT,
int flags = wxDATAVIEW_COL_RESIZABLE ); int flags = wxDATAVIEW_COL_RESIZABLE );
wxDataViewColumn *AppendToggleColumn( const wxString &label, unsigned int model_column, wxDataViewColumn *AppendToggleColumn( const wxString &label, unsigned int model_column,
wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = wxDVC_TOGGLE_DEFAULT_WIDTH, wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = wxDVC_TOGGLE_DEFAULT_WIDTH,
@ -498,7 +475,7 @@ public:
int flags = wxDATAVIEW_COL_RESIZABLE ); int flags = wxDATAVIEW_COL_RESIZABLE );
wxDataViewColumn *AppendDateColumn( const wxString &label, unsigned int model_column, wxDataViewColumn *AppendDateColumn( const wxString &label, unsigned int model_column,
wxDataViewCellMode mode = wxDATAVIEW_CELL_ACTIVATABLE, int width = -1, wxDataViewCellMode mode = wxDATAVIEW_CELL_ACTIVATABLE, int width = -1,
wxAlignment align = wxALIGN_CENTER, wxAlignment align = wxALIGN_LEFT,
int flags = wxDATAVIEW_COL_RESIZABLE ); int flags = wxDATAVIEW_COL_RESIZABLE );
wxDataViewColumn *AppendBitmapColumn( const wxString &label, unsigned int model_column, wxDataViewColumn *AppendBitmapColumn( const wxString &label, unsigned int model_column,
wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1, wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1,
@ -506,11 +483,11 @@ public:
int flags = wxDATAVIEW_COL_RESIZABLE ); int flags = wxDATAVIEW_COL_RESIZABLE );
wxDataViewColumn *AppendTextColumn( const wxBitmap &label, unsigned int model_column, wxDataViewColumn *AppendTextColumn( const wxBitmap &label, unsigned int model_column,
wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1, wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1,
wxAlignment align = wxALIGN_CENTER, wxAlignment align = wxALIGN_LEFT,
int flags = wxDATAVIEW_COL_RESIZABLE ); int flags = wxDATAVIEW_COL_RESIZABLE );
wxDataViewColumn *AppendIconTextColumn( const wxBitmap &label, unsigned int model_column, wxDataViewColumn *AppendIconTextColumn( const wxBitmap &label, unsigned int model_column,
wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1, wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1,
wxAlignment align = wxALIGN_CENTER, wxAlignment align = wxALIGN_LEFT,
int flags = wxDATAVIEW_COL_RESIZABLE ); int flags = wxDATAVIEW_COL_RESIZABLE );
wxDataViewColumn *AppendToggleColumn( const wxBitmap &label, unsigned int model_column, wxDataViewColumn *AppendToggleColumn( const wxBitmap &label, unsigned int model_column,
wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = wxDVC_TOGGLE_DEFAULT_WIDTH, wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = wxDVC_TOGGLE_DEFAULT_WIDTH,
@ -522,7 +499,7 @@ public:
int flags = wxDATAVIEW_COL_RESIZABLE ); int flags = wxDATAVIEW_COL_RESIZABLE );
wxDataViewColumn *AppendDateColumn( const wxBitmap &label, unsigned int model_column, wxDataViewColumn *AppendDateColumn( const wxBitmap &label, unsigned int model_column,
wxDataViewCellMode mode = wxDATAVIEW_CELL_ACTIVATABLE, int width = -1, wxDataViewCellMode mode = wxDATAVIEW_CELL_ACTIVATABLE, int width = -1,
wxAlignment align = wxALIGN_CENTER, wxAlignment align = wxALIGN_LEFT,
int flags = wxDATAVIEW_COL_RESIZABLE ); int flags = wxDATAVIEW_COL_RESIZABLE );
wxDataViewColumn *AppendBitmapColumn( const wxBitmap &label, unsigned int model_column, wxDataViewColumn *AppendBitmapColumn( const wxBitmap &label, unsigned int model_column,
@ -686,6 +663,169 @@ typedef void (wxEvtHandler::*wxDataViewEventFunction)(wxDataViewEvent&);
#include "wx/generic/dataview.h" #include "wx/generic/dataview.h"
#endif #endif
//-----------------------------------------------------------------------------
// wxDataViewTreeStore
//-----------------------------------------------------------------------------
class WXDLLIMPEXP_ADV wxDataViewTreeStoreNode
{
public:
wxDataViewTreeStoreNode( wxDataViewTreeStoreNode *parent,
const wxString &text, const wxIcon &icon = wxNullIcon, wxClientData *data = NULL );
virtual ~wxDataViewTreeStoreNode();
void SetText( const wxString &text )
{ m_text = text; }
wxString GetText() const
{ return m_text; }
void SetIcon( const wxIcon &icon )
{ m_icon = icon; }
const wxIcon &GetIcon() const
{ return m_icon; }
void SetData( wxClientData *data )
{ if (m_data) delete m_data; m_data = data; }
wxClientData *GetData() const
{ return m_data; }
wxDataViewItem GetItem() const
{ return wxDataViewItem( (void*) this ); }
virtual bool IsContainer()
{ return false; }
wxDataViewTreeStoreNode *GetParent()
{ return m_parent; }
private:
wxDataViewTreeStoreNode *m_parent;
wxString m_text;
wxIcon m_icon;
wxClientData *m_data;
};
WX_DECLARE_LIST_WITH_DECL(wxDataViewTreeStoreNode, wxDataViewTreeStoreNodeList,
class WXDLLIMPEXP_ADV);
class WXDLLIMPEXP_ADV wxDataViewTreeStoreContainerNode: public wxDataViewTreeStoreNode
{
public:
wxDataViewTreeStoreContainerNode( wxDataViewTreeStoreNode *parent,
const wxString &text, const wxIcon &icon = wxNullIcon, const wxIcon &expanded = wxNullIcon,
wxClientData *data = NULL );
virtual ~wxDataViewTreeStoreContainerNode();
const wxDataViewTreeStoreNodeList &GetChildren() const
{ return m_children; }
wxDataViewTreeStoreNodeList &GetChildren()
{ return m_children; }
void SetExpandedIcon( const wxIcon &icon )
{ m_iconExpanded = icon; }
const wxIcon &GetExpandedIcon() const
{ return m_iconExpanded; }
virtual bool IsContainer()
{ return true; }
private:
wxDataViewTreeStoreNodeList m_children;
wxIcon m_iconExpanded;
};
//-----------------------------------------------------------------------------
class WXDLLIMPEXP_ADV wxDataViewTreeStore: public wxDataViewModel
{
public:
wxDataViewTreeStore();
~wxDataViewTreeStore();
wxDataViewItem AppendItem( const wxDataViewItem& parent,
const wxString &text, const wxIcon &icon = wxNullIcon, wxClientData *data = NULL );
wxDataViewItem PrependItem( const wxDataViewItem& parent,
const wxString &text, const wxIcon &icon = wxNullIcon, wxClientData *data = NULL );
wxDataViewItem InsertItem( const wxDataViewItem& parent, const wxDataViewItem& previous,
const wxString &text, const wxIcon &icon = wxNullIcon, wxClientData *data = NULL );
wxDataViewItem PrependContainer( const wxDataViewItem& parent,
const wxString &text, const wxIcon &icon = wxNullIcon, const wxIcon &expanded = wxNullIcon,
wxClientData *data = NULL );
wxDataViewItem AppendContainer( const wxDataViewItem& parent,
const wxString &text, const wxIcon &icon = wxNullIcon, const wxIcon &expanded = wxNullIcon,
wxClientData *data = NULL );
wxDataViewItem InsertContainer( const wxDataViewItem& parent, const wxDataViewItem& previous,
const wxString &text, const wxIcon &icon = wxNullIcon, const wxIcon &expanded = wxNullIcon,
wxClientData *data = NULL );
wxDataViewItem GetNthChild( const wxDataViewItem& parent, unsigned int pos ) const;
int GetChildCount( const wxDataViewItem& parent ) const;
void SetItemText( const wxDataViewItem& item, const wxString &text );
wxString GetItemText( const wxDataViewItem& item ) const;
void SetItemIcon( const wxDataViewItem& item, const wxIcon &icon );
const wxIcon &GetItemIcon( const wxDataViewItem& item ) const;
void SetItemExpandedIcon( const wxDataViewItem& item, const wxIcon &icon );
const wxIcon &GetItemExpandedIcon( const wxDataViewItem& item ) const;
void SetItemData( const wxDataViewItem& item, wxClientData *data );
wxClientData *GetItemData( const wxDataViewItem& item ) const;
void DeleteItem( const wxDataViewItem& item );
void DeleteChildren( const wxDataViewItem& item );
void DeleteAllItems();
// implement base methods
virtual void GetValue( wxVariant &variant,
const wxDataViewItem &item, unsigned int col ) const;
virtual bool SetValue( const wxVariant &variant,
const wxDataViewItem &item, unsigned int col );
virtual wxDataViewItem GetParent( const wxDataViewItem &item ) const;
virtual bool IsContainer( const wxDataViewItem &item ) const;
virtual unsigned int GetChildren( const wxDataViewItem &item, wxDataViewItemArray &children ) const;
virtual int Compare( const wxDataViewItem &item1, const wxDataViewItem &item2,
unsigned int column, bool ascending );
virtual bool HasDefaultCompare() const
{ return true; }
virtual unsigned int GetColumnCount() const
{ return 1; };
virtual wxString GetColumnType( unsigned int WXUNUSED(col) ) const
{ return "wxDataViewIconText"; }
wxDataViewTreeStoreNode *FindNode( const wxDataViewItem &item ) const;
wxDataViewTreeStoreContainerNode *FindContainerNode( const wxDataViewItem &item ) const;
wxDataViewTreeStoreNode *GetRoot() const { return m_root; }
public:
wxDataViewTreeStoreNode *m_root;
};
#if 0
class WXDLLIMPEXP_ADV wxDataViewTreeCtrl: public wxDataViewCtrl
{
public:
wxDataViewCtrl( wxWindow *parent, wxWindowID id,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize, long style = wxDV_NO_HEADER,
const wxValidator& validator = wxDefaultValidator );
bool Create( wxWindow *parent, wxWindowID id,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize, long style = wxDV_NO_HEADER,
const wxValidator& validator = wxDefaultValidator );
wxDataViewTreeStore *GetStore()
{ return (wxDataViewTreeStore*) GetModel(); }
void OnExpand( wxDataViewCtrl &event );
void OnCollapse( wxDataViewCtrl &event );
private:
DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxDataViewTreeCtrl)
};
#endif
#endif // wxUSE_DATAVIEWCTRL #endif // wxUSE_DATAVIEWCTRL
#endif #endif

View File

@ -487,12 +487,14 @@ public:
class MyFrame : public wxFrame class MyFrame : public wxFrame
{ {
public: public:
MyFrame(wxFrame *frame, wxChar *title, int x, int y, int w, int h); MyFrame(wxFrame *frame, const wxString &title, int x, int y, int w, int h);
public: public:
void OnQuit(wxCommandEvent& event); void OnQuit(wxCommandEvent& event);
void OnAbout(wxCommandEvent& event); void OnAbout(wxCommandEvent& event);
void OnTestTreeCtrl(wxCommandEvent& event);
void OnAddMozart(wxCommandEvent& event); void OnAddMozart(wxCommandEvent& event);
void OnDeleteMusic(wxCommandEvent& event); void OnDeleteMusic(wxCommandEvent& event);
@ -570,6 +572,8 @@ enum
ID_ABOUT = wxID_ABOUT, ID_ABOUT = wxID_ABOUT,
ID_EXIT = wxID_EXIT, ID_EXIT = wxID_EXIT,
ID_TEST_TREECTRL = 40,
ID_MUSIC_CTRL = 50, ID_MUSIC_CTRL = 50,
ID_ADD_MOZART = 100, ID_ADD_MOZART = 100,
@ -582,6 +586,7 @@ enum
BEGIN_EVENT_TABLE(MyFrame, wxFrame) BEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_MENU( ID_ABOUT, MyFrame::OnAbout ) EVT_MENU( ID_ABOUT, MyFrame::OnAbout )
EVT_MENU( ID_TEST_TREECTRL, MyFrame::OnTestTreeCtrl )
EVT_MENU( ID_EXIT, MyFrame::OnQuit ) EVT_MENU( ID_EXIT, MyFrame::OnQuit )
EVT_BUTTON( ID_ADD_MOZART, MyFrame::OnAddMozart ) EVT_BUTTON( ID_ADD_MOZART, MyFrame::OnAddMozart )
EVT_BUTTON( ID_DELETE_MUSIC, MyFrame::OnDeleteMusic ) EVT_BUTTON( ID_DELETE_MUSIC, MyFrame::OnDeleteMusic )
@ -608,7 +613,7 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_RIGHT_UP(MyFrame::OnRightClick) EVT_RIGHT_UP(MyFrame::OnRightClick)
END_EVENT_TABLE() END_EVENT_TABLE()
MyFrame::MyFrame(wxFrame *frame, wxChar *title, int x, int y, int w, int h): MyFrame::MyFrame(wxFrame *frame, const wxString &title, int x, int y, int w, int h):
wxFrame(frame, wxID_ANY, title, wxPoint(x, y), wxSize(w, h)) wxFrame(frame, wxID_ANY, title, wxPoint(x, y), wxSize(w, h))
{ {
m_log = NULL; m_log = NULL;
@ -621,6 +626,8 @@ MyFrame::MyFrame(wxFrame *frame, wxChar *title, int x, int y, int w, int h):
wxMenu *file_menu = new wxMenu; wxMenu *file_menu = new wxMenu;
file_menu->Append(ID_ABOUT, "&About"); file_menu->Append(ID_ABOUT, "&About");
file_menu->AppendSeparator(); file_menu->AppendSeparator();
file_menu->Append(ID_TEST_TREECTRL, "Test &Treectrl");
file_menu->AppendSeparator();
file_menu->Append(ID_EXIT, "E&xit"); file_menu->Append(ID_EXIT, "E&xit");
wxMenuBar *menu_bar = new wxMenuBar; wxMenuBar *menu_bar = new wxMenuBar;
@ -703,6 +710,69 @@ void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event) )
Close(true); Close(true);
} }
/* XPM */
static char *small1_xpm[] = {
/* columns rows colors chars-per-pixel */
"16 16 6 1",
". c Black",
"o c #FFFFFF",
"X c #000080",
"O c #FFFF00",
" c None",
"+ c #FF0000",
/* pixels */
" ",
" ",
" ",
" ....... ",
" .XXXXX. ",
" .oXXXX. ",
" .oXXX.......",
".....oXXX.OOOOO.",
".+++.XXXX.oOOOO.",
".o++......oOOOO.",
".o++++. .oOOOO.",
".o++++. .OOOOO.",
".+++++. .......",
"....... ",
" ",
" "
};
void MyFrame::OnTestTreeCtrl(wxCommandEvent& WXUNUSED(event) )
{
wxDialog dialog( this, -1, "Test wxDataViewTreeStore" );
wxBoxSizer *main_sizer = new wxBoxSizer( wxVERTICAL );
wxDataViewCtrl *treectrl = new wxDataViewCtrl( &dialog, -1,
wxDefaultPosition, wxSize(300,200), wxDV_NO_HEADER );
treectrl->AppendIconTextColumn( "no label", 0 );
main_sizer->Add( treectrl );
wxDataViewTreeStore *store = new wxDataViewTreeStore;
wxDataViewItem parent = store->AppendContainer( wxDataViewItem(0), "Root 1", wxIcon(small1_xpm) );
wxDataViewItem child = store->AppendContainer( parent, "Child 1", wxIcon(small1_xpm) );
child = store->AppendContainer( parent, "Child 1", wxIcon(small1_xpm) );
child = store->AppendContainer( parent, "Child 2", wxIcon(small1_xpm) );
child = store->AppendContainer( parent, "Child 3", wxIcon(small1_xpm) );
treectrl->AssociateModel( store );
store->DecRef();
wxSizer *button_sizer = dialog.CreateButtonSizer( wxOK );
if (button_sizer)
main_sizer->Add( button_sizer, 0, wxGROW );
dialog.SetSizer( main_sizer );
main_sizer->Fit( &dialog );
dialog.ShowModal();
}
void MyFrame::OnAddMozart(wxCommandEvent& WXUNUSED(event) ) void MyFrame::OnAddMozart(wxCommandEvent& WXUNUSED(event) )
{ {
m_music_model->AddToClassical( "Kleine Nachtmusik", "Wolfgang Mozart", 1787 ); m_music_model->AddToClassical( "Kleine Nachtmusik", "Wolfgang Mozart", 1787 );

View File

@ -21,6 +21,7 @@
#ifndef WX_PRECOMP #ifndef WX_PRECOMP
#include "wx/log.h" #include "wx/log.h"
#include "wx/icon.h"
#endif #endif
const wxChar wxDataViewCtrlNameStr[] = wxT("dataviewCtrl"); const wxChar wxDataViewCtrlNameStr[] = wxT("dataviewCtrl");
@ -830,5 +831,392 @@ DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_CLICK)
DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK) DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK)
DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_COLUMN_SORTED) DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_COLUMN_SORTED)
//-----------------------------------------------------------------------------
// wxDataViewTreeStore
//-----------------------------------------------------------------------------
wxDataViewTreeStoreNode::wxDataViewTreeStoreNode(
wxDataViewTreeStoreNode *parent,
const wxString &text, const wxIcon &icon, wxClientData *data )
{
m_parent = parent;
m_text = text;
m_icon = icon;
m_data = data;
}
wxDataViewTreeStoreNode::~wxDataViewTreeStoreNode()
{
if (m_data)
delete m_data;
}
#include "wx/listimpl.cpp"
WX_DEFINE_LIST(wxDataViewTreeStoreNodeList);
wxDataViewTreeStoreContainerNode::wxDataViewTreeStoreContainerNode(
wxDataViewTreeStoreNode *parent, const wxString &text,
const wxIcon &icon, const wxIcon &expanded, wxClientData *data ) :
wxDataViewTreeStoreNode( parent, text, icon, data )
{
m_iconExpanded = expanded;
m_children.DeleteContents(true);
}
wxDataViewTreeStoreContainerNode::~wxDataViewTreeStoreContainerNode()
{
}
//-----------------------------------------------------------------------------
wxDataViewTreeStore::wxDataViewTreeStore()
{
m_root = new wxDataViewTreeStoreContainerNode( NULL, wxEmptyString );
}
wxDataViewTreeStore::~wxDataViewTreeStore()
{
delete m_root;
}
wxDataViewItem wxDataViewTreeStore::AppendItem( const wxDataViewItem& parent,
const wxString &text, const wxIcon &icon, wxClientData *data )
{
wxDataViewTreeStoreContainerNode *parent_node = FindContainerNode( parent );
if (!parent_node) return wxDataViewItem(0);
wxDataViewTreeStoreNode *node =
new wxDataViewTreeStoreNode( parent_node, text, icon, data );
parent_node->GetChildren().Append( node );
// notify control
ItemAdded( parent, node->GetItem() );
return node->GetItem();
}
wxDataViewItem wxDataViewTreeStore::PrependItem( const wxDataViewItem& parent,
const wxString &text, const wxIcon &icon, wxClientData *data )
{
wxDataViewTreeStoreContainerNode *parent_node = FindContainerNode( parent );
if (!parent_node) return wxDataViewItem(0);
wxDataViewTreeStoreNode *node =
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& parent, const wxDataViewItem& previous,
const wxString &text, const wxIcon &icon, wxClientData *data )
{
return wxDataViewItem(0);
}
wxDataViewItem wxDataViewTreeStore::PrependContainer( const wxDataViewItem& parent,
const wxString &text, const wxIcon &icon, const wxIcon &expanded,
wxClientData *data )
{
wxDataViewTreeStoreContainerNode *parent_node = FindContainerNode( parent );
if (!parent_node) return wxDataViewItem(0);
wxDataViewTreeStoreContainerNode *node =
new wxDataViewTreeStoreContainerNode( parent_node, text, icon, expanded, data );
parent_node->GetChildren().Insert( node );
// notify control
ItemAdded( parent, node->GetItem() );
return node->GetItem();
}
wxDataViewItem wxDataViewTreeStore::AppendContainer( const wxDataViewItem& parent,
const wxString &text, const wxIcon &icon, const wxIcon &expanded,
wxClientData *data )
{
wxDataViewTreeStoreContainerNode *parent_node = FindContainerNode( parent );
if (!parent_node) return wxDataViewItem(0);
wxDataViewTreeStoreContainerNode *node =
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& parent, const wxDataViewItem& previous,
const wxString &text, const wxIcon &icon, const wxIcon &expanded,
wxClientData *data )
{
return wxDataViewItem(0);
}
wxDataViewItem wxDataViewTreeStore::GetNthChild( const wxDataViewItem& parent, unsigned int pos ) const
{
wxDataViewTreeStoreContainerNode *parent_node = FindContainerNode( parent );
if (!parent_node) return wxDataViewItem(0);
wxDataViewTreeStoreNodeList::compatibility_iterator node = parent_node->GetChildren().Item( pos );
if (node)
return node->GetData();
return wxDataViewItem(0);
}
int wxDataViewTreeStore::GetChildCount( const wxDataViewItem& parent ) const
{
wxDataViewTreeStoreNode *node = FindNode( parent );
if (!node) return -1;
if (!node->IsContainer())
return 0;
wxDataViewTreeStoreContainerNode *container_node = (wxDataViewTreeStoreContainerNode*) node;
return (int) container_node->GetChildren().GetCount();
}
void wxDataViewTreeStore::SetItemText( const wxDataViewItem& item, const wxString &text )
{
wxDataViewTreeStoreNode *node = FindNode( item );
if (!node) return;
node->SetText( text );
// notify control
ValueChanged( item, 0 );
}
wxString wxDataViewTreeStore::GetItemText( const wxDataViewItem& item ) const
{
wxDataViewTreeStoreNode *node = FindNode( item );
if (!node) return wxEmptyString;
return node->GetText();
}
void wxDataViewTreeStore::SetItemIcon( const wxDataViewItem& item, const wxIcon &icon )
{
wxDataViewTreeStoreNode *node = FindNode( item );
if (!node) return;
node->SetIcon( icon );
// notify control
ValueChanged( item, 0 );
}
const wxIcon &wxDataViewTreeStore::GetItemIcon( const wxDataViewItem& item ) const
{
wxDataViewTreeStoreNode *node = FindNode( item );
if (!node) return wxNullIcon;
return node->GetIcon();
}
void wxDataViewTreeStore::SetItemExpandedIcon( const wxDataViewItem& item, const wxIcon &icon )
{
wxDataViewTreeStoreContainerNode *node = FindContainerNode( item );
if (!node) return;
node->SetExpandedIcon( icon );
// notify control
ValueChanged( item, 0 );
}
const wxIcon &wxDataViewTreeStore::GetItemExpandedIcon( const wxDataViewItem& item ) const
{
wxDataViewTreeStoreContainerNode *node = FindContainerNode( item );
if (!node) return wxNullIcon;
return node->GetExpandedIcon();
}
void wxDataViewTreeStore::SetItemData( const wxDataViewItem& item, wxClientData *data )
{
wxDataViewTreeStoreNode *node = FindNode( item );
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
{
wxDataViewTreeStoreNode *node = FindNode( item );
if (!node) return NULL;
return node->GetData();
}
void wxDataViewTreeStore::DeleteItem( const wxDataViewItem& item )
{
if (!item.IsOk()) return;
wxDataViewItem parent_item = GetParent( item );
wxDataViewTreeStoreContainerNode *parent_node = FindContainerNode( parent_item );
if (!parent_node) return;
wxDataViewTreeStoreContainerNode *node = FindContainerNode( item );
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()
{
// TODO
}
void wxDataViewTreeStore::GetValue( wxVariant &variant,
const wxDataViewItem &item, unsigned int col ) const
{
// if (col != 0) return;
wxDataViewTreeStoreNode *node = FindNode( item );
if (!node) return;
wxDataViewIconText data( node->GetText(), node->GetIcon() );
variant << data;
}
bool wxDataViewTreeStore::SetValue( const wxVariant &variant,
const wxDataViewItem &item, unsigned int col )
{
// if (col != 0) return false;
wxDataViewTreeStoreNode *node = FindNode( item );
if (!node) return false;
wxDataViewIconText data;
data << variant;
node->SetText( data.GetText() );
node->SetIcon( data.GetIcon() );
return true;
}
wxDataViewItem wxDataViewTreeStore::GetParent( const wxDataViewItem &item ) const
{
wxDataViewTreeStoreNode *node = FindNode( item );
if (!node) return wxDataViewItem(0);
wxDataViewTreeStoreNode *parent = node->GetParent();
if (!parent) return wxDataViewItem(0);
if (parent == m_root)
return wxDataViewItem(0);
return parent->GetItem();
}
bool wxDataViewTreeStore::IsContainer( const wxDataViewItem &item ) const
{
wxDataViewTreeStoreNode *node = FindNode( item );
if (!node) return false;
return node->IsContainer();
}
unsigned int wxDataViewTreeStore::GetChildren( const wxDataViewItem &item, wxDataViewItemArray &children ) const
{
wxDataViewTreeStoreContainerNode *node = FindContainerNode( item );
if (!node) return 0;
wxDataViewTreeStoreNodeList::iterator iter;
for (iter = node->GetChildren().begin(); iter != node->GetChildren().end(); iter++)
{
wxDataViewTreeStoreNode* child = *iter;
children.Add( child->GetItem() );
}
return node->GetChildren().GetCount();
}
int wxDataViewTreeStore::Compare( const wxDataViewItem &item1, const wxDataViewItem &item2,
unsigned int WXUNUSED(column), bool WXUNUSED(ascending) )
{
wxDataViewTreeStoreNode *node1 = FindNode( item1 );
wxDataViewTreeStoreNode *node2 = FindNode( item2 );
if (!node1 || !node2)
return 0;
wxDataViewTreeStoreContainerNode* parent1 =
(wxDataViewTreeStoreContainerNode*) node1->GetParent();
wxDataViewTreeStoreContainerNode* parent2 =
(wxDataViewTreeStoreContainerNode*) node2->GetParent();
if (parent1 != parent2)
{
wxLogError( wxT("Comparing items with different parent.") );
return 0;
}
if (node1->IsContainer() && !!node2->IsContainer())
return 1;
if (node2->IsContainer() && !!node1->IsContainer())
return -1;
return parent1->GetChildren().IndexOf( node1 ) - parent1->GetChildren().IndexOf( node2 );
}
wxDataViewTreeStoreNode *wxDataViewTreeStore::FindNode( const wxDataViewItem &item ) const
{
if (!item.IsOk())
return m_root;
return (wxDataViewTreeStoreNode*) item.GetID();
}
wxDataViewTreeStoreContainerNode *wxDataViewTreeStore::FindContainerNode( const wxDataViewItem &item ) const
{
if (!item.IsOk())
return (wxDataViewTreeStoreContainerNode*) m_root;
wxDataViewTreeStoreNode* node = (wxDataViewTreeStoreNode*) item.GetID();
if (!node->IsContainer())
return NULL;
return (wxDataViewTreeStoreContainerNode*) node;
}
#endif #endif

View File

@ -467,7 +467,8 @@ wxgtk_tree_model_get_column_type (GtkTreeModel *tree_model,
gtype = G_TYPE_STRING; gtype = G_TYPE_STRING;
else else
{ {
wxFAIL_MSG( _T("non-string columns not supported yet") ); gtype = G_TYPE_STRING;
// wxFAIL_MSG( _T("non-string columns not supported yet") );
} }
return gtype; return gtype;
@ -2606,6 +2607,7 @@ gboolean wxDataViewCtrlInternal::iter_children( GtkTreeIter *iter, GtkTreeIter *
gboolean wxDataViewCtrlInternal::iter_has_child( GtkTreeIter *iter ) gboolean wxDataViewCtrlInternal::iter_has_child( GtkTreeIter *iter )
{ {
wxDataViewItem item( (void*) iter->user_data ); wxDataViewItem item( (void*) iter->user_data );
bool is_container = m_wx_model->IsContainer( item ); bool is_container = m_wx_model->IsContainer( item );
if (!is_container) if (!is_container)
@ -2673,6 +2675,7 @@ wxDataViewCtrlInternal_FindNode( wxDataViewModel * model, wxGtkTreeModelNode *tr
ItemList list; ItemList list;
list.DeleteContents( true ); list.DeleteContents( true );
wxDataViewItem it( item ); wxDataViewItem it( item );
while( it.IsOk() ) while( it.IsOk() )
{ {
wxDataViewItem * pItem = new wxDataViewItem( it ); wxDataViewItem * pItem = new wxDataViewItem( it );