]> git.saurik.com Git - wxWidgets.git/blame - samples/dataview/mymodels.h
fixing reentrancy which happened in tests, bringing client coordinates origins in...
[wxWidgets.git] / samples / dataview / mymodels.h
CommitLineData
03dfc8f5
VZ
1/////////////////////////////////////////////////////////////////////////////
2// Name: mymodels.h
3// Purpose: wxDataViewCtrl wxWidgets sample
4// Author: Robert Roebling
5// Modified by: Francesco Montorsi, Bo Yang
6// Created: 06/01/06
7// RCS-ID: $Id$
8// Copyright: (c) Robert Roebling
526954c5 9// Licence: wxWindows licence
03dfc8f5
VZ
10/////////////////////////////////////////////////////////////////////////////
11
12
13// ----------------------------------------------------------------------------
14// MyMusicTreeModelNode: a node inside MyMusicTreeModel
15// ----------------------------------------------------------------------------
16
17class MyMusicTreeModelNode;
18WX_DEFINE_ARRAY_PTR( MyMusicTreeModelNode*, MyMusicTreeModelNodePtrArray );
19
20class MyMusicTreeModelNode
21{
22public:
23 MyMusicTreeModelNode( MyMusicTreeModelNode* parent,
ecad59d8 24 const wxString &title, const wxString &artist,
03dfc8f5
VZ
25 unsigned int year )
26 {
27 m_parent = parent;
28
29 m_title = title;
30 m_artist = artist;
31 m_year = year;
32 m_quality = "good";
ecad59d8
FM
33
34 m_container = false;
03dfc8f5
VZ
35 }
36
37 MyMusicTreeModelNode( MyMusicTreeModelNode* parent,
38 const wxString &branch )
39 {
40 m_parent = parent;
41
42 m_title = branch;
43 m_year = -1;
ecad59d8
FM
44
45 m_container = true;
03dfc8f5
VZ
46 }
47
48 ~MyMusicTreeModelNode()
49 {
50 // free all our children nodes
51 size_t count = m_children.GetCount();
52 for (size_t i = 0; i < count; i++)
53 {
54 MyMusicTreeModelNode *child = m_children[i];
55 delete child;
56 }
57 }
58
59 bool IsContainer() const
ecad59d8 60 { return m_container; }
03dfc8f5
VZ
61
62 MyMusicTreeModelNode* GetParent()
63 { return m_parent; }
64 MyMusicTreeModelNodePtrArray& GetChildren()
65 { return m_children; }
66 MyMusicTreeModelNode* GetNthChild( unsigned int n )
67 { return m_children.Item( n ); }
68 void Insert( MyMusicTreeModelNode* child, unsigned int n)
69 { m_children.Insert( child, n); }
70 void Append( MyMusicTreeModelNode* child )
71 { m_children.Add( child ); }
72 unsigned int GetChildCount() const
73 { return m_children.GetCount(); }
74
75public: // public to avoid getters/setters
76 wxString m_title;
77 wxString m_artist;
78 int m_year;
79 wxString m_quality;
80
ecad59d8
FM
81 // TODO/FIXME:
82 // the GTK version of wxDVC (in particular wxDataViewCtrlInternal::ItemAdded)
83 // needs to know in advance if a node is or _will be_ a container.
84 // Thus implementing:
85 // bool IsContainer() const
86 // { return m_children.GetCount()>0; }
87 // doesn't work with wxGTK when MyMusicTreeModel::AddToClassical is called
88 // AND the classical node was removed (a new node temporary without children
89 // would be added to the control)
90 bool m_container;
91
03dfc8f5
VZ
92private:
93 MyMusicTreeModelNode *m_parent;
94 MyMusicTreeModelNodePtrArray m_children;
95};
96
97
98// ----------------------------------------------------------------------------
99// MyMusicTreeModel
100// ----------------------------------------------------------------------------
101
102/*
103Implement this data model
104 Title Artist Year Judgement
105--------------------------------------------------------------------------
1061: My Music:
107 2: Pop music
108 3: You are not alone Michael Jackson 1995 good
109 4: Take a bow Madonna 1994 good
110 5: Classical music
111 6: Ninth Symphony Ludwig v. Beethoven 1824 good
112 7: German Requiem Johannes Brahms 1868 good
113*/
114
115class MyMusicTreeModel: public wxDataViewModel
116{
117public:
118 MyMusicTreeModel();
119 ~MyMusicTreeModel()
120 {
121 delete m_root;
122 }
123
124 // helper method for wxLog
125
126 wxString GetTitle( const wxDataViewItem &item ) const;
ecc32226 127 wxString GetArtist( const wxDataViewItem &item ) const;
03dfc8f5
VZ
128 int GetYear( const wxDataViewItem &item ) const;
129
130 // helper methods to change the model
131
ecad59d8 132 void AddToClassical( const wxString &title, const wxString &artist,
03dfc8f5
VZ
133 unsigned int year );
134 void Delete( const wxDataViewItem &item );
135
136 wxDataViewItem GetNinthItem() const
137 {
138 return wxDataViewItem( m_ninth );
139 }
140
141 // override sorting to always sort branches ascendingly
142
143 int Compare( const wxDataViewItem &item1, const wxDataViewItem &item2,
a82e28dd 144 unsigned int column, bool ascending ) const;
03dfc8f5
VZ
145
146 // implementation of base class virtuals to define model
147
148 virtual unsigned int GetColumnCount() const
149 {
150 return 6;
151 }
152
153 virtual wxString GetColumnType( unsigned int col ) const
154 {
155 if (col == 2)
156 return wxT("long");
157
158 return wxT("string");
159 }
160
161 virtual void GetValue( wxVariant &variant,
162 const wxDataViewItem &item, unsigned int col ) const;
163 virtual bool SetValue( const wxVariant &variant,
164 const wxDataViewItem &item, unsigned int col );
165
98f8e666
VZ
166 virtual bool IsEnabled( const wxDataViewItem &item,
167 unsigned int col ) const;
168
03dfc8f5
VZ
169 virtual wxDataViewItem GetParent( const wxDataViewItem &item ) const;
170 virtual bool IsContainer( const wxDataViewItem &item ) const;
ecad59d8 171 virtual unsigned int GetChildren( const wxDataViewItem &parent,
03dfc8f5
VZ
172 wxDataViewItemArray &array ) const;
173
174private:
175 MyMusicTreeModelNode* m_root;
176
177 // pointers to some "special" nodes of the tree:
178 MyMusicTreeModelNode* m_pop;
179 MyMusicTreeModelNode* m_classical;
180 MyMusicTreeModelNode* m_ninth;
181
182 // ??
183 bool m_classicalMusicIsKnownToControl;
184};
185
186
187// ----------------------------------------------------------------------------
188// MyListModel
189// ----------------------------------------------------------------------------
190
191class MyListModel: public wxDataViewVirtualListModel
192{
193public:
2746bccf
VZ
194 enum
195 {
196 Col_EditableText,
197 Col_IconText,
198 Col_TextWithAttr,
ef6833f9 199 Col_Custom,
2746bccf
VZ
200 Col_Max
201 };
202
03dfc8f5
VZ
203 MyListModel();
204
205 // helper methods to change the model
206
207 void Prepend( const wxString &text );
208 void DeleteItem( const wxDataViewItem &item );
209 void DeleteItems( const wxDataViewItemArray &items );
210 void AddMany();
211
212
213 // implementation of base class virtuals to define model
214
215 virtual unsigned int GetColumnCount() const
216 {
2746bccf 217 return Col_Max;
03dfc8f5
VZ
218 }
219
220 virtual wxString GetColumnType( unsigned int col ) const
221 {
2746bccf 222 if (col == Col_IconText)
03dfc8f5
VZ
223 return wxT("wxDataViewIconText");
224
225 return wxT("string");
226 }
227
03dfc8f5
VZ
228 virtual void GetValueByRow( wxVariant &variant,
229 unsigned int row, unsigned int col ) const;
7fadac88
VZ
230 virtual bool GetAttrByRow( unsigned int row, unsigned int col,
231 wxDataViewItemAttr &attr ) const;
03dfc8f5
VZ
232 virtual bool SetValueByRow( const wxVariant &variant,
233 unsigned int row, unsigned int col );
234
235private:
205bdf20
VZ
236 wxArrayString m_textColValues;
237 wxArrayString m_iconColValues;
03dfc8f5 238 wxIcon m_icon[2];
03dfc8f5
VZ
239};
240
98f8e666
VZ
241// ----------------------------------------------------------------------------
242// MyListStoreDerivedModel
243// ----------------------------------------------------------------------------
244
245class MyListStoreDerivedModel : public wxDataViewListStore
246{
247public:
248 virtual bool IsEnabledByRow(unsigned int row, unsigned int col) const;
249};