]> git.saurik.com Git - wxWidgets.git/blob - src/common/datavcmn.cpp
Make SetLocal actually work instead of crashing immediately; due to required longevit...
[wxWidgets.git] / src / common / datavcmn.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/common/datavcmn.cpp
3 // Purpose: wxDataViewCtrl base classes and common parts
4 // Author: Robert Roebling
5 // Created: 2006/02/20
6 // RCS-ID: $Id$
7 // Copyright: (c) 2006, Robert Roebling
8 // Licence: wxWindows licence
9 /////////////////////////////////////////////////////////////////////////////
10
11 // For compilers that support precompilation, includes "wx.h".
12 #include "wx/wxprec.h"
13
14 #ifdef __BORLANDC__
15 #pragma hdrstop
16 #endif
17
18 #include "wx/defs.h"
19
20 #if wxUSE_DATAVIEWCTRL
21
22 #include "wx/object.h"
23 #include "wx/dataview.h"
24 #include "wx/log.h"
25 #include "wx/image.h"
26
27 // ---------------------------------------------------------
28 // wxDataViewModel
29 // ---------------------------------------------------------
30
31 IMPLEMENT_ABSTRACT_CLASS(wxDataViewModel, wxObject)
32
33 // ---------------------------------------------------------
34 // wxDataViewListModel
35 // ---------------------------------------------------------
36
37 class wxDataViewViewingColumn: public wxObject
38 {
39 public:
40 wxDataViewViewingColumn( wxDataViewColumn *view_column, size_t model_column )
41 {
42 m_viewColumn = view_column;
43 m_modelColumn = model_column;
44 }
45
46 wxDataViewColumn *m_viewColumn;
47 size_t m_modelColumn;
48 };
49
50
51 IMPLEMENT_ABSTRACT_CLASS(wxDataViewListModel, wxDataViewModel)
52
53 wxDataViewListModel::wxDataViewListModel()
54 {
55 m_notifier = NULL;
56 m_viewingColumns.DeleteContents( true );
57 }
58
59 wxDataViewListModel::~wxDataViewListModel()
60 {
61 if (m_notifier)
62 delete m_notifier;
63 }
64
65 bool wxDataViewListModel::RowAppended()
66 {
67 if (m_notifier)
68 return m_notifier->RowAppended();
69
70 return false;
71 }
72
73 bool wxDataViewListModel::RowPrepended()
74 {
75 if (m_notifier)
76 return m_notifier->RowPrepended();
77
78 return false;
79 }
80
81 bool wxDataViewListModel::RowInserted( size_t before )
82 {
83 if (m_notifier)
84 return m_notifier->RowInserted( before );
85
86 return false;
87 }
88
89 bool wxDataViewListModel::RowDeleted( size_t row )
90 {
91 if (m_notifier)
92 return m_notifier->RowDeleted( row );
93
94 return false;
95 }
96
97 bool wxDataViewListModel::RowChanged( size_t row )
98 {
99 if (m_notifier)
100 return m_notifier->RowChanged( row );
101
102 return false;
103 }
104
105 bool wxDataViewListModel::ValueChanged( size_t col, size_t row )
106 {
107 bool ret = false;
108
109 if (m_notifier)
110 ret = m_notifier->ValueChanged( col, row );
111
112 wxNode *node = m_viewingColumns.GetFirst();
113 while (node)
114 {
115 wxDataViewViewingColumn* tmp = (wxDataViewViewingColumn*) node->GetData();
116
117 if (tmp->m_modelColumn == col)
118 m_notifier->ValueChanged( tmp->m_viewColumn, col, row );
119
120 node = node->GetNext();
121 }
122
123 return ret;
124 }
125
126 bool wxDataViewListModel::Cleared()
127 {
128 if (m_notifier)
129 return m_notifier->Cleared();
130
131 return false;
132 }
133
134 void wxDataViewListModel::AddViewingColumn( wxDataViewColumn *view_column, size_t model_column )
135 {
136 m_viewingColumns.Append( new wxDataViewViewingColumn( view_column, model_column ) );
137 }
138
139 void wxDataViewListModel::RemoveViewingColumn( wxDataViewColumn *column )
140 {
141 wxNode *node = m_viewingColumns.GetFirst();
142 while (node)
143 {
144 wxDataViewViewingColumn* tmp = (wxDataViewViewingColumn*) node->GetData();
145
146 if (tmp->m_viewColumn == column)
147 {
148 m_viewingColumns.DeleteObject( tmp );
149 return;
150 }
151
152 node = node->GetNext();
153 }
154 }
155
156 void wxDataViewListModel::SetNotifier( wxDataViewListModelNotifier *notifier )
157 {
158 if (m_notifier)
159 delete m_notifier;
160
161 m_notifier = notifier;
162 }
163
164 wxDataViewListModelNotifier* wxDataViewListModel::GetNotifier()
165 {
166 return m_notifier;
167 }
168
169 // ---------------------------------------------------------
170 // wxDataViewCellBase
171 // ---------------------------------------------------------
172
173 IMPLEMENT_ABSTRACT_CLASS(wxDataViewCellBase, wxObject)
174
175 wxDataViewCellBase::wxDataViewCellBase( const wxString &varianttype, wxDataViewCellMode mode )
176 {
177 m_variantType = varianttype;
178 m_mode = mode;
179 }
180
181 // ---------------------------------------------------------
182 // wxDataViewColumnBase
183 // ---------------------------------------------------------
184
185 IMPLEMENT_ABSTRACT_CLASS(wxDataViewColumnBase, wxObject)
186
187 wxDataViewColumnBase::wxDataViewColumnBase( const wxString &title, wxDataViewCell *cell, size_t model_column, int flags)
188 {
189 m_cell = cell;
190 m_model_column = model_column;
191 m_flags = flags;
192 m_title = title;
193 m_owner = NULL;
194 m_cell->SetOwner( (wxDataViewColumn*) this );
195 }
196
197 wxDataViewColumnBase::~wxDataViewColumnBase()
198 {
199 if (m_cell)
200 delete m_cell;
201
202 if (GetOwner())
203 {
204 GetOwner()->GetModel()->RemoveViewingColumn( (wxDataViewColumn*) this );
205 }
206 }
207
208 void wxDataViewColumnBase::SetTitle( const wxString &title )
209 {
210 m_title = title;
211 }
212
213 wxString wxDataViewColumnBase::GetTitle()
214 {
215 return m_title;
216 }
217
218 // ---------------------------------------------------------
219 // wxDataViewCtrlBase
220 // ---------------------------------------------------------
221
222 IMPLEMENT_ABSTRACT_CLASS(wxDataViewCtrlBase, wxControl)
223
224 wxDataViewCtrlBase::wxDataViewCtrlBase()
225 {
226 m_model = NULL;
227 m_cols.DeleteContents( true );
228 }
229
230 wxDataViewCtrlBase::~wxDataViewCtrlBase()
231 {
232 if (m_model)
233 delete m_model;
234 }
235
236 bool wxDataViewCtrlBase::AssociateModel( wxDataViewListModel *model )
237 {
238 if (m_model)
239 delete m_model;
240
241 m_model = model;
242
243 return true;
244 }
245
246 wxDataViewListModel* wxDataViewCtrlBase::GetModel()
247 {
248 return m_model;
249 }
250
251 bool wxDataViewCtrlBase::AppendTextColumn( const wxString &label, size_t model_column )
252 {
253 return AppendColumn( new wxDataViewColumn( label, new wxDataViewTextCell(), model_column ) );
254 }
255
256 bool wxDataViewCtrlBase::AppendToggleColumn( const wxString &label, size_t model_column )
257 {
258 return AppendColumn( new wxDataViewColumn( label, new wxDataViewToggleCell(), model_column ) );
259 }
260
261 bool wxDataViewCtrlBase::AppendProgressColumn( const wxString &label, size_t model_column )
262 {
263 return AppendColumn( new wxDataViewColumn( label, new wxDataViewProgressCell(), model_column ) );
264 }
265
266 bool wxDataViewCtrlBase::AppendDateColumn( const wxString &label, size_t model_column )
267 {
268 return AppendColumn( new wxDataViewColumn( label, new wxDataViewDateCell(), model_column ) );
269 }
270
271 bool wxDataViewCtrlBase::AppendColumn( wxDataViewColumn *col )
272 {
273 m_cols.Append( (wxObject*) col );
274 col->SetOwner( (wxDataViewCtrl*) this );
275 m_model->AddViewingColumn( col, col->GetModelColumn() );
276 return true;
277 }
278
279 size_t wxDataViewCtrlBase::GetNumberOfColumns()
280 {
281 return m_cols.GetCount();
282 }
283
284 bool wxDataViewCtrlBase::DeleteColumn( size_t pos )
285 {
286 return false;
287 }
288
289 bool wxDataViewCtrlBase::ClearColumns()
290 {
291 return false;
292 }
293
294 wxDataViewColumn* wxDataViewCtrlBase::GetColumn( size_t pos )
295 {
296 return (wxDataViewColumn*) m_cols[ pos ];
297 }
298
299 #endif