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:
parent
a3261ffb75
commit
e94d0c1e66
@ -77,6 +77,10 @@ public:
|
||||
void* GetID() 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:
|
||||
void* m_id;
|
||||
};
|
||||
@ -225,33 +229,6 @@ private:
|
||||
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
|
||||
@ -482,11 +459,11 @@ public:
|
||||
// short cuts
|
||||
wxDataViewColumn *AppendTextColumn( const wxString &label, unsigned int model_column,
|
||||
wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1,
|
||||
wxAlignment align = wxALIGN_CENTER,
|
||||
wxAlignment align = wxALIGN_LEFT,
|
||||
int flags = wxDATAVIEW_COL_RESIZABLE );
|
||||
wxDataViewColumn *AppendIconTextColumn( const wxString &label, unsigned int model_column,
|
||||
wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1,
|
||||
wxAlignment align = wxALIGN_CENTER,
|
||||
wxAlignment align = wxALIGN_LEFT,
|
||||
int flags = wxDATAVIEW_COL_RESIZABLE );
|
||||
wxDataViewColumn *AppendToggleColumn( const wxString &label, unsigned int model_column,
|
||||
wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = wxDVC_TOGGLE_DEFAULT_WIDTH,
|
||||
@ -498,7 +475,7 @@ public:
|
||||
int flags = wxDATAVIEW_COL_RESIZABLE );
|
||||
wxDataViewColumn *AppendDateColumn( const wxString &label, unsigned int model_column,
|
||||
wxDataViewCellMode mode = wxDATAVIEW_CELL_ACTIVATABLE, int width = -1,
|
||||
wxAlignment align = wxALIGN_CENTER,
|
||||
wxAlignment align = wxALIGN_LEFT,
|
||||
int flags = wxDATAVIEW_COL_RESIZABLE );
|
||||
wxDataViewColumn *AppendBitmapColumn( const wxString &label, unsigned int model_column,
|
||||
wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1,
|
||||
@ -506,11 +483,11 @@ public:
|
||||
int flags = wxDATAVIEW_COL_RESIZABLE );
|
||||
wxDataViewColumn *AppendTextColumn( const wxBitmap &label, unsigned int model_column,
|
||||
wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1,
|
||||
wxAlignment align = wxALIGN_CENTER,
|
||||
wxAlignment align = wxALIGN_LEFT,
|
||||
int flags = wxDATAVIEW_COL_RESIZABLE );
|
||||
wxDataViewColumn *AppendIconTextColumn( const wxBitmap &label, unsigned int model_column,
|
||||
wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1,
|
||||
wxAlignment align = wxALIGN_CENTER,
|
||||
wxAlignment align = wxALIGN_LEFT,
|
||||
int flags = wxDATAVIEW_COL_RESIZABLE );
|
||||
wxDataViewColumn *AppendToggleColumn( const wxBitmap &label, unsigned int model_column,
|
||||
wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = wxDVC_TOGGLE_DEFAULT_WIDTH,
|
||||
@ -522,7 +499,7 @@ public:
|
||||
int flags = wxDATAVIEW_COL_RESIZABLE );
|
||||
wxDataViewColumn *AppendDateColumn( const wxBitmap &label, unsigned int model_column,
|
||||
wxDataViewCellMode mode = wxDATAVIEW_CELL_ACTIVATABLE, int width = -1,
|
||||
wxAlignment align = wxALIGN_CENTER,
|
||||
wxAlignment align = wxALIGN_LEFT,
|
||||
int flags = wxDATAVIEW_COL_RESIZABLE );
|
||||
|
||||
wxDataViewColumn *AppendBitmapColumn( const wxBitmap &label, unsigned int model_column,
|
||||
@ -686,6 +663,169 @@ typedef void (wxEvtHandler::*wxDataViewEventFunction)(wxDataViewEvent&);
|
||||
#include "wx/generic/dataview.h"
|
||||
#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
|
||||
|
@ -487,12 +487,14 @@ public:
|
||||
class MyFrame : public wxFrame
|
||||
{
|
||||
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:
|
||||
void OnQuit(wxCommandEvent& event);
|
||||
void OnAbout(wxCommandEvent& event);
|
||||
|
||||
void OnTestTreeCtrl(wxCommandEvent& event);
|
||||
|
||||
void OnAddMozart(wxCommandEvent& event);
|
||||
void OnDeleteMusic(wxCommandEvent& event);
|
||||
|
||||
@ -570,6 +572,8 @@ enum
|
||||
ID_ABOUT = wxID_ABOUT,
|
||||
ID_EXIT = wxID_EXIT,
|
||||
|
||||
ID_TEST_TREECTRL = 40,
|
||||
|
||||
ID_MUSIC_CTRL = 50,
|
||||
|
||||
ID_ADD_MOZART = 100,
|
||||
@ -582,6 +586,7 @@ enum
|
||||
|
||||
BEGIN_EVENT_TABLE(MyFrame, wxFrame)
|
||||
EVT_MENU( ID_ABOUT, MyFrame::OnAbout )
|
||||
EVT_MENU( ID_TEST_TREECTRL, MyFrame::OnTestTreeCtrl )
|
||||
EVT_MENU( ID_EXIT, MyFrame::OnQuit )
|
||||
EVT_BUTTON( ID_ADD_MOZART, MyFrame::OnAddMozart )
|
||||
EVT_BUTTON( ID_DELETE_MUSIC, MyFrame::OnDeleteMusic )
|
||||
@ -608,7 +613,7 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame)
|
||||
EVT_RIGHT_UP(MyFrame::OnRightClick)
|
||||
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))
|
||||
{
|
||||
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;
|
||||
file_menu->Append(ID_ABOUT, "&About");
|
||||
file_menu->AppendSeparator();
|
||||
file_menu->Append(ID_TEST_TREECTRL, "Test &Treectrl");
|
||||
file_menu->AppendSeparator();
|
||||
file_menu->Append(ID_EXIT, "E&xit");
|
||||
|
||||
wxMenuBar *menu_bar = new wxMenuBar;
|
||||
@ -703,6 +710,69 @@ void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event) )
|
||||
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) )
|
||||
{
|
||||
m_music_model->AddToClassical( "Kleine Nachtmusik", "Wolfgang Mozart", 1787 );
|
||||
|
@ -21,6 +21,7 @@
|
||||
|
||||
#ifndef WX_PRECOMP
|
||||
#include "wx/log.h"
|
||||
#include "wx/icon.h"
|
||||
#endif
|
||||
|
||||
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_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
|
||||
|
||||
|
@ -467,7 +467,8 @@ wxgtk_tree_model_get_column_type (GtkTreeModel *tree_model,
|
||||
gtype = G_TYPE_STRING;
|
||||
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;
|
||||
@ -2606,11 +2607,12 @@ gboolean wxDataViewCtrlInternal::iter_children( GtkTreeIter *iter, GtkTreeIter *
|
||||
gboolean wxDataViewCtrlInternal::iter_has_child( GtkTreeIter *iter )
|
||||
{
|
||||
wxDataViewItem item( (void*) iter->user_data );
|
||||
|
||||
bool is_container = m_wx_model->IsContainer( item );
|
||||
|
||||
if (!is_container)
|
||||
return FALSE;
|
||||
|
||||
|
||||
wxGtkTreeModelNode *node = FindNode( iter );
|
||||
BuildBranch( node );
|
||||
|
||||
@ -2673,6 +2675,7 @@ wxDataViewCtrlInternal_FindNode( wxDataViewModel * model, wxGtkTreeModelNode *tr
|
||||
ItemList list;
|
||||
list.DeleteContents( true );
|
||||
wxDataViewItem it( item );
|
||||
|
||||
while( it.IsOk() )
|
||||
{
|
||||
wxDataViewItem * pItem = new wxDataViewItem( it );
|
||||
|
Loading…
Reference in New Issue
Block a user