]>
Commit | Line | Data |
---|---|---|
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 | |
9 | // Licence: wxWindows licence | |
10 | ///////////////////////////////////////////////////////////////////////////// | |
11 | ||
12 | ||
13 | // ---------------------------------------------------------------------------- | |
14 | // MyMusicTreeModelNode: a node inside MyMusicTreeModel | |
15 | // ---------------------------------------------------------------------------- | |
16 | ||
17 | class MyMusicTreeModelNode; | |
18 | WX_DEFINE_ARRAY_PTR( MyMusicTreeModelNode*, MyMusicTreeModelNodePtrArray ); | |
19 | ||
20 | class MyMusicTreeModelNode | |
21 | { | |
22 | public: | |
23 | MyMusicTreeModelNode( MyMusicTreeModelNode* parent, | |
24 | const wxString &title, const wxString &artist, | |
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"; | |
33 | ||
34 | m_container = false; | |
35 | } | |
36 | ||
37 | MyMusicTreeModelNode( MyMusicTreeModelNode* parent, | |
38 | const wxString &branch ) | |
39 | { | |
40 | m_parent = parent; | |
41 | ||
42 | m_title = branch; | |
43 | m_year = -1; | |
44 | ||
45 | m_container = true; | |
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 | |
60 | { return m_container; } | |
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 | ||
75 | public: // public to avoid getters/setters | |
76 | wxString m_title; | |
77 | wxString m_artist; | |
78 | int m_year; | |
79 | wxString m_quality; | |
80 | ||
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 | ||
92 | private: | |
93 | MyMusicTreeModelNode *m_parent; | |
94 | MyMusicTreeModelNodePtrArray m_children; | |
95 | }; | |
96 | ||
97 | ||
98 | // ---------------------------------------------------------------------------- | |
99 | // MyMusicTreeModel | |
100 | // ---------------------------------------------------------------------------- | |
101 | ||
102 | /* | |
103 | Implement this data model | |
104 | Title Artist Year Judgement | |
105 | -------------------------------------------------------------------------- | |
106 | 1: 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 | ||
115 | class MyMusicTreeModel: public wxDataViewModel | |
116 | { | |
117 | public: | |
118 | MyMusicTreeModel(); | |
119 | ~MyMusicTreeModel() | |
120 | { | |
121 | delete m_root; | |
122 | } | |
123 | ||
124 | // helper method for wxLog | |
125 | ||
126 | wxString GetTitle( const wxDataViewItem &item ) const; | |
127 | wxString GetArtist( const wxDataViewItem &item ) const; | |
128 | int GetYear( const wxDataViewItem &item ) const; | |
129 | ||
130 | // helper methods to change the model | |
131 | ||
132 | void AddToClassical( const wxString &title, const wxString &artist, | |
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, | |
144 | unsigned int column, bool ascending ) const; | |
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 | ||
166 | virtual bool IsEnabled( const wxDataViewItem &item, | |
167 | unsigned int col ) const; | |
168 | ||
169 | virtual wxDataViewItem GetParent( const wxDataViewItem &item ) const; | |
170 | virtual bool IsContainer( const wxDataViewItem &item ) const; | |
171 | virtual unsigned int GetChildren( const wxDataViewItem &parent, | |
172 | wxDataViewItemArray &array ) const; | |
173 | ||
174 | private: | |
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 | ||
191 | class MyListModel: public wxDataViewVirtualListModel | |
192 | { | |
193 | public: | |
194 | enum | |
195 | { | |
196 | Col_EditableText, | |
197 | Col_IconText, | |
198 | Col_TextWithAttr, | |
199 | Col_Custom, | |
200 | Col_Max | |
201 | }; | |
202 | ||
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 | { | |
217 | return Col_Max; | |
218 | } | |
219 | ||
220 | virtual wxString GetColumnType( unsigned int col ) const | |
221 | { | |
222 | if (col == Col_IconText) | |
223 | return wxT("wxDataViewIconText"); | |
224 | ||
225 | return wxT("string"); | |
226 | } | |
227 | ||
228 | virtual void GetValueByRow( wxVariant &variant, | |
229 | unsigned int row, unsigned int col ) const; | |
230 | virtual bool GetAttrByRow( unsigned int row, unsigned int col, | |
231 | wxDataViewItemAttr &attr ) const; | |
232 | virtual bool SetValueByRow( const wxVariant &variant, | |
233 | unsigned int row, unsigned int col ); | |
234 | ||
235 | private: | |
236 | wxArrayString m_textColValues; | |
237 | wxArrayString m_iconColValues; | |
238 | wxIcon m_icon[2]; | |
239 | }; | |
240 | ||
241 | // ---------------------------------------------------------------------------- | |
242 | // MyListStoreDerivedModel | |
243 | // ---------------------------------------------------------------------------- | |
244 | ||
245 | class MyListStoreDerivedModel : public wxDataViewListStore | |
246 | { | |
247 | public: | |
248 | virtual bool IsEnabledByRow(unsigned int row, unsigned int col) const; | |
249 | }; |