]>
Commit | Line | Data |
---|---|---|
c0a66d92 RR |
1 | ///////////////////////////////////////////////////////////////////////////// |
2 | // Name: src/mac/carbon/datavgen.cpp | |
3 | // Purpose: wxDataViewCtrl native mac implementation | |
4 | // Author: | |
5 | // Id: $Id$ | |
6 | // Copyright: (c) 2007 | |
7 | // Licence: wxWindows licence | |
8 | ///////////////////////////////////////////////////////////////////////////// | |
9 | ||
10 | // For compilers that support precompilation, includes "wx.h". | |
11 | #include "wx/wxprec.h" | |
12 | ||
13 | #if wxUSE_DATAVIEWCTRL | |
14 | ||
15 | #include "wx/dataview.h" | |
16 | ||
17 | #if !defined(wxUSE_GENERICDATAVIEWCTRL) || (wxUSE_GENERICDATAVIEWCTRL == 0) | |
18 | ||
19 | #include <limits> | |
20 | ||
21 | #include "wx/mac/carbon/databrow.h" | |
22 | ||
23 | #ifndef WX_PRECOMP | |
24 | #include "wx/timer.h" | |
25 | #endif | |
26 | ||
27 | #include "wx/icon.h" | |
28 | #include "wx/renderer.h" | |
29 | ||
30 | //----------------------------------------------------------------------------- | |
31 | // local constants | |
32 | //----------------------------------------------------------------------------- | |
33 | ||
34 | // a list of all catchable events: | |
35 | static EventTypeSpec const eventList[] = | |
36 | { | |
37 | {kEventClassControl, kEventControlDraw}, | |
38 | {kEventClassControl, kEventControlHit} | |
39 | }; | |
40 | ||
41 | //----------------------------------------------------------------------------- | |
42 | // local functions | |
43 | //----------------------------------------------------------------------------- | |
44 | ||
45 | static pascal OSStatus wxMacDataViewCtrlEventHandler(EventHandlerCallRef handler, EventRef EventReference, void* Data) | |
46 | { | |
47 | wxDataViewCtrl* DataViewCtrlPtr((wxDataViewCtrl*) Data); // the 'Data' variable always contains a pointer to the data view control that installed the handler | |
48 | ||
49 | wxMacCarbonEvent CarbonEvent(EventReference) ; | |
50 | ||
51 | ||
52 | switch (GetEventKind(EventReference)) | |
53 | { | |
54 | case kEventControlDraw: | |
55 | { | |
56 | OSStatus status; | |
57 | ||
58 | DataViewCtrlPtr->MacSetDrawingContext(CarbonEvent.GetParameter<CGContextRef>(kEventParamCGContextRef,typeCGContextRef)); | |
59 | status = ::CallNextEventHandler(handler,EventReference); | |
60 | DataViewCtrlPtr->MacSetDrawingContext(NULL); | |
61 | return status; | |
62 | } /* block */ | |
63 | case kEventControlHit : | |
64 | if (CarbonEvent.GetParameter<ControlPartCode>(kEventParamControlPart,typeControlPartCode) == kControlButtonPart) // we only care about the header | |
65 | { | |
66 | ControlRef controlReference; | |
67 | DataBrowserPropertyID columnPropertyID; | |
68 | unsigned long columnIndex; | |
69 | OSStatus status; | |
70 | wxDataViewEvent DataViewEvent(wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_CLICK,DataViewCtrlPtr->GetId()); | |
71 | ||
72 | CarbonEvent.GetParameter(kEventParamDirectObject,&controlReference); | |
73 | // determine the column that triggered the event (this is the column that is responsible for sorting the data view): | |
74 | status = ::GetDataBrowserSortProperty(controlReference,&columnPropertyID); | |
75 | wxCHECK(status == noErr,status); | |
76 | status = ::GetDataBrowserTableViewColumnPosition(controlReference,columnPropertyID,&columnIndex); | |
77 | if (status == errDataBrowserPropertyNotFound) // user clicked into part of the header that does not have a property | |
78 | return ::CallNextEventHandler(handler,EventReference); | |
79 | wxCHECK(status == noErr,status); | |
80 | // initialize wxWidget event handler: | |
81 | DataViewEvent.SetEventObject(DataViewCtrlPtr); | |
82 | DataViewEvent.SetColumn(columnIndex); | |
83 | DataViewEvent.SetDataViewColumn(DataViewCtrlPtr->GetColumn(columnIndex)); | |
84 | // finally sent the equivalent wxWidget event: | |
85 | DataViewCtrlPtr->GetEventHandler()->ProcessEvent(DataViewEvent); | |
86 | return ::CallNextEventHandler(handler,EventReference); | |
87 | } /* if */ | |
88 | else | |
89 | return eventNotHandledErr; | |
90 | } /* switch */ | |
91 | ||
92 | return eventNotHandledErr; | |
93 | } /* wxMacDataViewCtrlEventHandler(EventHandlerCallRef, EventRef, void*) */ | |
94 | ||
95 | //----------------------------------------------------------------------------- | |
96 | // local function pointers | |
97 | //----------------------------------------------------------------------------- | |
98 | ||
99 | DEFINE_ONE_SHOT_HANDLER_GETTER(wxMacDataViewCtrlEventHandler) | |
100 | ||
101 | // --------------------------------------------------------- | |
102 | // wxMacDataViewListModelNotifier | |
103 | // --------------------------------------------------------- | |
104 | #pragma mark - | |
105 | class wxMacDataViewListModelNotifier : public wxDataViewListModelNotifier | |
106 | { | |
107 | public: | |
108 | wxMacDataViewListModelNotifier(wxMacDataViewDataBrowserListViewControl* initDataViewControlPtr) : m_dataViewControlPtr(initDataViewControlPtr) | |
109 | { | |
110 | } | |
111 | ||
112 | virtual bool RowAppended(void) | |
113 | { | |
114 | DataBrowserItemID newRowID; | |
115 | ||
116 | ||
117 | if ((this->m_dataViewControlPtr->GetFreeItemID(&newRowID) == noErr) && | |
118 | this->m_dataViewControlPtr->InsertItemIDRowPair(newRowID,this->GetOwner()->GetRowCount()-1) && | |
119 | (this->m_dataViewControlPtr->AddItem(kDataBrowserNoItem,&newRowID) == noErr)) | |
120 | { | |
121 | wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->m_dataViewControlPtr->GetPeer())); | |
122 | ||
123 | // sent the equivalent wxWidget event: | |
124 | wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_MODEL_ROW_APPENDED,dataViewCtrlPtr->GetId()); // variable defintion | |
125 | ||
126 | dataViewEvent.SetEventObject(dataViewCtrlPtr); | |
127 | dataViewEvent.SetRow(this->GetOwner()->GetRowCount()-1); | |
128 | // sent the equivalent wxWidget event: | |
129 | dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent); | |
130 | // done | |
131 | return true; | |
132 | } /* if */ | |
133 | else | |
134 | return false; | |
135 | } | |
136 | virtual bool RowChanged(unsigned int row) | |
137 | { | |
138 | DataBrowserItemID itemID; | |
139 | ||
140 | ||
141 | if (this->m_dataViewControlPtr->GetItemID(row,&itemID) == noErr) | |
142 | { | |
143 | wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->m_dataViewControlPtr->GetPeer())); | |
144 | ||
145 | // sent the equivalent wxWidget event: | |
146 | wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_MODEL_ROW_CHANGED,dataViewCtrlPtr->GetId()); // variable defintion | |
147 | ||
148 | dataViewEvent.SetEventObject(dataViewCtrlPtr); | |
149 | dataViewEvent.SetRow(row); | |
150 | // sent the equivalent wxWidget event: | |
151 | dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent); | |
152 | // done | |
153 | return true; | |
154 | } /* if */ | |
155 | else | |
156 | return false; | |
157 | } | |
158 | virtual bool RowDeleted(unsigned int row) | |
159 | { | |
160 | DataBrowserItemID itemID; | |
161 | ||
162 | ||
163 | if (this->m_dataViewControlPtr->GetItemID(row,&itemID) == noErr) | |
164 | { | |
165 | // variable definition: | |
166 | unsigned long rowIndex; | |
167 | ||
168 | wxCHECK_MSG(this->m_dataViewControlPtr->GetRowIndex(rowIndex,itemID) && this->m_dataViewControlPtr->DeleteItemIDRowPair(itemID),false,_("Unable to delete row data.")); | |
169 | this->m_dataViewControlPtr->RenumberItemIDRowIndicesDeletion(rowIndex); | |
170 | if (this->m_dataViewControlPtr->RemoveItem(kDataBrowserNoItem,&itemID) == noErr) | |
171 | { | |
172 | wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->m_dataViewControlPtr->GetPeer())); | |
173 | ||
174 | // sent the equivalent wxWidget event: | |
175 | wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_MODEL_ROW_DELETED,dataViewCtrlPtr->GetId()); // variable defintion | |
176 | ||
177 | dataViewEvent.SetEventObject(dataViewCtrlPtr); | |
178 | dataViewEvent.SetRow(row); | |
179 | // sent the equivalent wxWidget event: | |
180 | dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent); | |
181 | // done | |
182 | return true; | |
183 | } /* if */ | |
184 | else | |
185 | return false; | |
186 | } /* if */ | |
187 | else | |
188 | return false; | |
189 | } | |
190 | virtual bool RowInserted(unsigned int before) | |
191 | { | |
192 | DataBrowserItemID newRowID; | |
193 | ||
194 | ||
195 | if (this->m_dataViewControlPtr->GetFreeItemID(&newRowID) == noErr) | |
196 | { | |
197 | this->m_dataViewControlPtr->RenumberItemIDRowIndicesInsertion(before); | |
198 | if (this->m_dataViewControlPtr->InsertItemIDRowPair(newRowID,before) && (this->m_dataViewControlPtr->AddItem(kDataBrowserNoItem,&newRowID) == noErr)) | |
199 | { | |
200 | wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->m_dataViewControlPtr->GetPeer())); | |
201 | ||
202 | // sent the equivalent wxWidget event: | |
203 | wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_MODEL_ROW_INSERTED,dataViewCtrlPtr->GetId()); // variable defintion | |
204 | ||
205 | dataViewEvent.SetEventObject(dataViewCtrlPtr); | |
206 | dataViewEvent.SetRow(before); | |
207 | // sent the equivalent wxWidget event: | |
208 | dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent); | |
209 | // done | |
210 | return true; | |
211 | } /* if */ | |
212 | else | |
213 | return false; | |
214 | } /* if */ | |
215 | else | |
216 | return false; | |
217 | } | |
218 | virtual bool RowPrepended(void) | |
219 | { | |
220 | DataBrowserItemID newRowID; | |
221 | ||
222 | ||
223 | if (this->m_dataViewControlPtr->GetFreeItemID(&newRowID) == noErr) | |
224 | { | |
225 | this->m_dataViewControlPtr->RenumberItemIDRowIndicesInsertion(0); | |
226 | if (this->m_dataViewControlPtr->InsertItemIDRowPair(newRowID,0) && (this->m_dataViewControlPtr->AddItem(kDataBrowserNoItem,&newRowID) == noErr)) | |
227 | { | |
228 | wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->m_dataViewControlPtr->GetPeer())); | |
229 | ||
230 | // sent the equivalent wxWidget event: | |
231 | wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_MODEL_ROW_PREPENDED,dataViewCtrlPtr->GetId()); // variable defintion | |
232 | ||
233 | dataViewEvent.SetEventObject(dataViewCtrlPtr); | |
234 | dataViewEvent.SetRow(0); | |
235 | // sent the equivalent wxWidget event: | |
236 | dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent); | |
237 | // done | |
238 | return true; | |
239 | } /* if */ | |
240 | else | |
241 | return false; | |
242 | } /* if */ | |
243 | else | |
244 | return false; | |
245 | } | |
246 | virtual bool ValueChanged(unsigned int col, unsigned int row) | |
247 | { | |
248 | DataBrowserItemID itemID; | |
249 | ||
250 | DataBrowserPropertyID propertyID; | |
251 | ||
252 | ||
253 | wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->m_dataViewControlPtr->GetPeer())); | |
254 | ||
255 | if ((dataViewCtrlPtr != NULL) && (this->m_dataViewControlPtr->GetItemID(row,&itemID) == noErr) && (this->m_dataViewControlPtr->GetColumnID(col,&propertyID) == noErr) && | |
256 | (this->m_dataViewControlPtr->UpdateItems(kDataBrowserNoItem,1,&itemID,dataViewCtrlPtr->GetColumn(col)->GetPropertyID(),propertyID) == noErr)) | |
257 | { | |
258 | wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->m_dataViewControlPtr->GetPeer())); | |
259 | ||
260 | // sent the equivalent wxWidget event: | |
261 | wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_MODEL_VALUE_CHANGED,dataViewCtrlPtr->GetId()); // variable defintion | |
262 | ||
263 | dataViewEvent.SetEventObject(dataViewCtrlPtr); | |
264 | dataViewEvent.SetColumn(col); | |
265 | dataViewEvent.SetRow(row); | |
266 | // sent the equivalent wxWidget event: | |
267 | dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent); | |
268 | // done | |
269 | return true; | |
270 | } /* if */ | |
271 | else | |
272 | return false; | |
273 | } | |
274 | virtual bool RowsReordered(unsigned int* new_order) | |
275 | { | |
276 | DataBrowserPropertyID propertyId; | |
277 | ||
278 | ||
279 | if ((new_order != NULL) && (this->m_dataViewControlPtr->GetSortProperty(&propertyId) == noErr) && (propertyId >= kMinPropertyID)) | |
280 | { | |
281 | DataBrowserSortOrder sortOrder; | |
282 | unsigned long column; | |
283 | ||
284 | if ((this->m_dataViewControlPtr->GetSortOrder(&sortOrder) == noErr) && (this->m_dataViewControlPtr->GetPropertyColumn(propertyId,&column) == noErr)) | |
285 | { | |
286 | wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->m_dataViewControlPtr->GetPeer())); | |
287 | ||
288 | if (dataViewCtrlPtr->GetColumn(column)->IsSortOrderAscending()) | |
289 | this->m_dataViewControlPtr->RenumberItemIDRowIndices(new_order); | |
290 | else // the sort order of the control is descending but the passed sort order is always ordered top - down | |
291 | { | |
292 | ItemCount itemCount; | |
293 | ||
294 | if (this->m_dataViewControlPtr->GetItemCount(&itemCount) != noErr) | |
295 | return false; | |
296 | unsigned int* reversedOrder(new unsigned int[itemCount]); | |
297 | ||
298 | for (ItemCount i=0; i<itemCount; ++i) | |
299 | reversedOrder[i] = itemCount-new_order[i]; | |
300 | this->m_dataViewControlPtr->RenumberItemIDRowIndices(reversedOrder); | |
301 | delete[] reversedOrder; | |
302 | } /* if */ | |
303 | if (this->m_dataViewControlPtr->UpdateItems()) | |
304 | { | |
305 | // sent the equivalent wxWidget event: | |
306 | wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_MODEL_ROWS_REORDERED,dataViewCtrlPtr->GetId()); // variable defintion | |
307 | ||
308 | dataViewEvent.SetEventObject(dataViewCtrlPtr); | |
309 | // sent the equivalent wxWidget event: | |
310 | dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent); | |
311 | // done | |
312 | return true; | |
313 | } /* if */ | |
314 | else | |
315 | return false; | |
316 | } /* if */ | |
317 | else | |
318 | return false; | |
319 | } /* if */ | |
320 | else | |
321 | return false; | |
322 | } | |
323 | virtual bool Cleared(void) | |
324 | { | |
325 | this->m_dataViewControlPtr->ClearItemIDRowPairs(); | |
326 | if (this->m_dataViewControlPtr->RemoveItems() == noErr) | |
327 | { | |
328 | wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->m_dataViewControlPtr->GetPeer())); | |
329 | ||
330 | // sent the equivalent wxWidget event: | |
331 | wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_MODEL_CLEARED,dataViewCtrlPtr->GetId()); // variable defintion | |
332 | ||
333 | dataViewEvent.SetEventObject(dataViewCtrlPtr); | |
334 | // sent the equivalent wxWidget event: | |
335 | dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent); | |
336 | // done | |
337 | return true; | |
338 | } /* if */ | |
339 | else | |
340 | return false; | |
341 | } | |
342 | ||
343 | protected: | |
344 | private: | |
345 | // | |
346 | // variables | |
347 | // | |
348 | wxMacDataViewDataBrowserListViewControl* m_dataViewControlPtr; | |
349 | }; | |
350 | ||
351 | // --------------------------------------------------------- | |
352 | // wxDataViewRenderer | |
353 | // --------------------------------------------------------- | |
354 | #pragma mark - | |
355 | wxDataViewRenderer::wxDataViewRenderer(wxString const& varianttype, wxDataViewCellMode mode, int align) | |
356 | :wxDataViewRendererBase(varianttype,mode,align), m_alignment(align), m_mode(mode) | |
357 | { | |
358 | } /* wxDataViewRenderer::wxDataViewRenderer(wxString const&, wxDataViewCellMode) */ | |
359 | ||
360 | void wxDataViewRenderer::SetMode(wxDataViewCellMode mode) | |
361 | { | |
362 | wxDataViewColumn* dataViewColumnPtr; | |
363 | ||
364 | ||
365 | this->m_mode = mode; | |
366 | dataViewColumnPtr = this->GetOwner(); | |
367 | if (dataViewColumnPtr != NULL) | |
368 | { | |
369 | // variable definition and initialization: | |
370 | wxDataViewCtrl* dataViewCtrlPtr(dataViewColumnPtr->GetOwner()); | |
371 | ||
372 | if (dataViewCtrlPtr != NULL) | |
373 | { | |
374 | // variable definition and initialization: | |
375 | wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer())); | |
376 | ||
377 | if (macDataViewListCtrlPtr != NULL) | |
378 | { | |
379 | // variable definition and initialization: | |
380 | DataBrowserPropertyFlags flags; | |
381 | ||
382 | verify_noerr(macDataViewListCtrlPtr->GetPropertyFlags(dataViewColumnPtr->GetPropertyID(),&flags)); | |
383 | if (mode == wxDATAVIEW_CELL_EDITABLE) | |
384 | flags |= kDataBrowserPropertyIsEditable; | |
385 | else | |
386 | flags &= ~kDataBrowserPropertyIsEditable; | |
387 | verify_noerr(macDataViewListCtrlPtr->SetPropertyFlags(dataViewColumnPtr->GetPropertyID(),flags)); | |
388 | } /* if */ | |
389 | } /* if */ | |
390 | } /* if */ | |
391 | } /* wxDataViewRenderer::SetMode(wxDataViewCellMode) */ | |
392 | ||
393 | IMPLEMENT_ABSTRACT_CLASS(wxDataViewRenderer,wxDataViewRendererBase) | |
394 | ||
395 | // --------------------------------------------------------- | |
396 | // wxDataViewCustomRenderer | |
397 | // --------------------------------------------------------- | |
398 | #pragma mark - | |
399 | wxDataViewCustomRenderer::wxDataViewCustomRenderer(wxString const& varianttype, wxDataViewCellMode mode, int align) | |
400 | :wxDataViewRenderer(varianttype,mode,align), m_editorCtrlPtr(NULL) | |
401 | { | |
402 | } /* wxDataViewCustomRenderer::wxDataViewCustomRenderer(wxString const&, wxDataViewCellMode) */ | |
403 | ||
404 | wxDataViewCustomRenderer::~wxDataViewCustomRenderer(void) | |
405 | { | |
406 | if (this->m_DCPtr != NULL) | |
407 | delete this->m_DCPtr; | |
408 | } /* wxDataViewCustomRenderer::~wxDataViewCustomRenderer(void) */ | |
409 | ||
410 | wxDC* wxDataViewCustomRenderer::GetDC(void) | |
411 | { | |
412 | if (this->m_DCPtr == NULL) | |
413 | { | |
414 | if ((GetOwner() == NULL) || (GetOwner()->GetOwner() == NULL)) | |
415 | return NULL; | |
416 | this->m_DCPtr = new wxClientDC(this->GetOwner()->GetOwner()); | |
417 | } /* if */ | |
418 | return this->m_DCPtr; | |
419 | } /* wxDataViewCustomRenderer::GetDC(void) */ | |
420 | ||
421 | bool wxDataViewCustomRenderer::Render(void) | |
422 | { | |
423 | return false; | |
424 | } /* wxDataViewCustomRenderer::Render(void) */ | |
425 | ||
426 | void wxDataViewCustomRenderer::SetDC(wxDC* newDCPtr) | |
427 | { | |
428 | delete this->m_DCPtr; | |
429 | this->m_DCPtr = newDCPtr; | |
430 | } /* wxDataViewCustomRenderer::SetDC(wxDC*) */ | |
431 | ||
432 | ||
433 | IMPLEMENT_ABSTRACT_CLASS(wxDataViewCustomRenderer, wxDataViewRenderer) | |
434 | ||
435 | // --------------------------------------------------------- | |
436 | // wxDataViewTextRenderer | |
437 | // --------------------------------------------------------- | |
438 | #pragma mark - | |
439 | wxDataViewTextRenderer::wxDataViewTextRenderer(wxString const& varianttype, wxDataViewCellMode mode, int align) | |
440 | :wxDataViewRenderer(varianttype,mode,align) | |
441 | { | |
442 | } /* wxDataViewTextRenderer::wxDataViewTextRenderer(wxString const&, wxDataViewCellMode, int) */ | |
443 | ||
444 | bool wxDataViewTextRenderer::Render(void) | |
445 | { | |
446 | if (this->GetValue().GetType() == this->GetVariantType()) | |
447 | { | |
448 | // variable definition: | |
449 | wxMacCFStringHolder cfString(this->GetValue().GetString(),(this->GetView()->GetFont().Ok() ? this->GetView()->GetFont().GetEncoding() : wxLocale::GetSystemEncoding())); | |
450 | ||
451 | return (::SetDataBrowserItemDataText(this->GetDataReference(),cfString) == noErr); | |
452 | } /* if */ | |
453 | else | |
454 | return false; | |
455 | } /* wxDataViewTextRenderer::Render(void) */ | |
456 | ||
457 | IMPLEMENT_CLASS(wxDataViewTextRenderer,wxDataViewRenderer) | |
458 | ||
459 | // --------------------------------------------------------- | |
460 | // wxDataViewBitmapRenderer | |
461 | // --------------------------------------------------------- | |
462 | #pragma mark - | |
463 | wxDataViewBitmapRenderer::wxDataViewBitmapRenderer(wxString const& varianttype, wxDataViewCellMode mode, int align) | |
464 | :wxDataViewRenderer(varianttype,mode,align) | |
465 | { | |
466 | } | |
467 | ||
468 | bool wxDataViewBitmapRenderer::Render(void) | |
469 | { | |
470 | if (this->GetValue().GetType() == this->GetVariantType()) | |
471 | { | |
472 | wxBitmap bitmap; | |
473 | ||
474 | bitmap << this->GetValue(); | |
475 | if (bitmap.Ok()) | |
476 | return (::SetDataBrowserItemDataIcon(this->GetDataReference(),bitmap.GetBitmapData()->GetIconRef()) == noErr); | |
477 | else | |
478 | return false; | |
479 | } /* if */ | |
480 | else | |
481 | return false; | |
482 | } /* wxDataViewBitmapRenderer::Render(void) */ | |
483 | ||
484 | IMPLEMENT_CLASS(wxDataViewBitmapRenderer,wxDataViewRenderer) | |
485 | ||
486 | // --------------------------------------------------------- | |
487 | // wxDataViewToggleRenderer | |
488 | // --------------------------------------------------------- | |
489 | #pragma mark - | |
490 | wxDataViewToggleRenderer::wxDataViewToggleRenderer(wxString const& varianttype, wxDataViewCellMode mode, int align) | |
491 | :wxDataViewRenderer(varianttype,mode) | |
492 | { | |
493 | } | |
494 | ||
495 | bool wxDataViewToggleRenderer::Render(void) | |
496 | { | |
497 | if (this->GetValue().GetType() == this->GetVariantType()) | |
498 | return (::SetDataBrowserItemDataButtonValue(this->GetDataReference(),this->GetValue().GetBool()) == noErr); | |
499 | else | |
500 | return false; | |
501 | } /* wxDataViewToggleRenderer::Render(void) */ | |
502 | ||
503 | IMPLEMENT_ABSTRACT_CLASS(wxDataViewToggleRenderer,wxDataViewRenderer) | |
504 | ||
505 | // --------------------------------------------------------- | |
506 | // wxDataViewProgressRenderer | |
507 | // --------------------------------------------------------- | |
508 | #pragma mark - | |
509 | wxDataViewProgressRenderer::wxDataViewProgressRenderer(wxString const& label, wxString const& varianttype, wxDataViewCellMode mode, int align) | |
510 | :wxDataViewRenderer(varianttype,mode,align) | |
511 | { | |
512 | } | |
513 | ||
514 | bool wxDataViewProgressRenderer::Render(void) | |
515 | { | |
516 | if (this->GetValue().GetType() == this->GetVariantType()) | |
517 | return ((::SetDataBrowserItemDataMinimum(this->GetDataReference(), 0) == noErr) && | |
518 | (::SetDataBrowserItemDataMaximum(this->GetDataReference(),100) == noErr) && | |
519 | (::SetDataBrowserItemDataValue (this->GetDataReference(),this->GetValue().GetLong()) == noErr)); | |
520 | else | |
521 | return false; | |
522 | } /* wxDataViewProgressRenderer::Render(void) */ | |
523 | ||
524 | IMPLEMENT_ABSTRACT_CLASS(wxDataViewProgressRenderer,wxDataViewRenderer) | |
525 | ||
526 | // --------------------------------------------------------- | |
527 | // wxDataViewDateRenderer | |
528 | // --------------------------------------------------------- | |
529 | #pragma mark - | |
530 | wxDataViewDateRenderer::wxDataViewDateRenderer(wxString const& varianttype, wxDataViewCellMode mode, int align) | |
531 | :wxDataViewRenderer(varianttype,mode,align) | |
532 | { | |
533 | } | |
534 | ||
535 | bool wxDataViewDateRenderer::Render(void) | |
536 | { | |
537 | if (this->GetValue().GetType() == this->GetVariantType()) | |
538 | return (::SetDataBrowserItemDataDateTime(this->GetDataReference(),this->GetValue().GetDateTime().Subtract(wxDateTime(1,wxDateTime::Jan,1904)).GetSeconds().GetLo()) == noErr); | |
539 | else | |
540 | return false; | |
541 | } /* wxDataViewDateRenderer::Render(void) */ | |
542 | ||
543 | IMPLEMENT_ABSTRACT_CLASS(wxDataViewDateRenderer,wxDataViewRenderer) | |
544 | ||
545 | // --------------------------------------------------------- | |
546 | // wxDataViewColumn | |
547 | // --------------------------------------------------------- | |
548 | #pragma mark - | |
549 | wxDataViewColumn::wxDataViewColumn(wxString const &title, wxDataViewRenderer *cell, unsigned int model_column, int width, wxAlignment align, int flags) | |
550 | :wxDataViewColumnBase(title,cell,model_column,width,wxALIGN_CENTER,flags), m_alignment(align), m_ascending(true), | |
551 | m_flags(flags & ~(wxDATAVIEW_COL_HIDDEN | wxDATAVIEW_COL_RESIZABLE)), m_minWidth(0), m_maxWidth(std::numeric_limits<int>::max()), m_width(width), m_title(title) | |
552 | { | |
553 | } /* wxDataViewColumn::wxDataViewColumn(wxString const &title, wxDataViewRenderer*, unsigned int, int, wxAlignment, int) */ | |
554 | ||
555 | wxDataViewColumn::wxDataViewColumn(wxBitmap const& bitmap, wxDataViewRenderer *cell, unsigned int model_column, int width, wxAlignment align, int flags) | |
556 | :wxDataViewColumnBase(bitmap,cell,model_column,width,wxALIGN_CENTER,flags), m_ascending(true), m_alignment(align), | |
557 | m_flags(flags & (wxDATAVIEW_COL_HIDDEN | wxDATAVIEW_COL_RESIZABLE)), m_minWidth(0), m_maxWidth(std::numeric_limits<int>::max()), m_width(width) | |
558 | { | |
559 | } /* wxDataViewColumn::wxDataViewColumn(wxBitmap const&, wxDataViewRenderer*, unsigned int, int, wxAlignment, int) */ | |
560 | ||
561 | void wxDataViewColumn::SetAlignment(wxAlignment align) | |
562 | { | |
563 | wxDataViewCtrl* dataViewCtrlPtr(this->GetOwner()); | |
564 | ||
565 | ||
566 | this->m_alignment = align; | |
567 | if (dataViewCtrlPtr != NULL) | |
568 | { | |
569 | // variable definition and initialization: | |
570 | wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer())); | |
571 | ||
572 | if (macDataViewListCtrlPtr != NULL) | |
573 | { | |
574 | // variable definition and initialization: | |
575 | DataBrowserListViewHeaderDesc headerDescription; | |
576 | ||
577 | wxCHECK_RET(macDataViewListCtrlPtr->GetHeaderDesc(this->GetPropertyID(),&headerDescription) == noErr,_("Could not get header description.")); | |
578 | switch (align) | |
579 | { | |
580 | case wxALIGN_CENTER: | |
581 | case wxALIGN_CENTER_HORIZONTAL: | |
582 | headerDescription.btnFontStyle.just = teCenter; | |
583 | break; | |
584 | case wxALIGN_LEFT: | |
585 | headerDescription.btnFontStyle.just = teFlushLeft; | |
586 | break; | |
587 | case wxALIGN_RIGHT: | |
588 | headerDescription.btnFontStyle.just = teFlushRight; | |
589 | break; | |
590 | default: | |
591 | headerDescription.btnFontStyle.just = teFlushDefault; | |
592 | } /* switch */ | |
593 | wxCHECK_RET(macDataViewListCtrlPtr->SetHeaderDesc(this->GetPropertyID(),&headerDescription) == noErr,_("Could not set alignment.")); | |
594 | } /* if */ | |
595 | } /* if */ | |
596 | } /* wxDataViewColumn::SetAlignment(wxAlignment) */ | |
597 | ||
598 | void wxDataViewColumn::SetBitmap(wxBitmap const& bitmap) | |
599 | { | |
600 | wxDataViewCtrl* dataViewCtrlPtr(this->GetOwner()); | |
601 | ||
602 | ||
603 | wxDataViewColumnBase::SetBitmap(bitmap); | |
604 | if (dataViewCtrlPtr != NULL) | |
605 | { | |
606 | // variable definition and initialization: | |
607 | wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer())); | |
608 | ||
609 | if (macDataViewListCtrlPtr != NULL) | |
610 | { | |
611 | // variable definition and initialization: | |
612 | DataBrowserListViewHeaderDesc headerDescription; | |
613 | ||
614 | wxCHECK_RET(macDataViewListCtrlPtr->GetHeaderDesc(this->GetPropertyID(),&headerDescription) == noErr,_("Could not get header description.")); | |
615 | if (this->GetBitmap().Ok()) | |
616 | headerDescription.btnContentInfo.u.iconRef = this->GetBitmap().GetBitmapData()->GetIconRef(); | |
617 | else | |
618 | headerDescription.btnContentInfo.u.iconRef = NULL; | |
619 | wxCHECK_RET(macDataViewListCtrlPtr->SetHeaderDesc(this->GetPropertyID(),&headerDescription) == noErr,_("Could not set icon.")); | |
620 | } /* if */ | |
621 | } /* if */ | |
622 | } /* wxDataViewColumn::SetBitmap(wxBitmap const&) */ | |
623 | ||
624 | void wxDataViewColumn::SetFlags(int flags) | |
625 | { | |
626 | this->SetHidden ((flags & wxDATAVIEW_COL_HIDDEN) != 0); | |
627 | this->SetResizeable((flags & wxDATAVIEW_COL_RESIZABLE) != 0); | |
628 | this->SetSortable ((flags & wxDATAVIEW_COL_SORTABLE) != 0); | |
629 | } /* wxDataViewColumn::SetFlags(int) */ | |
630 | ||
631 | void wxDataViewColumn::SetMaxWidth(int maxWidth) | |
632 | { | |
633 | wxDataViewCtrl* dataViewCtrlPtr(this->GetOwner()); | |
634 | ||
635 | ||
636 | this->m_maxWidth = maxWidth; | |
637 | if (dataViewCtrlPtr != NULL) | |
638 | { | |
639 | // variable definition and initialization: | |
640 | wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer())); | |
641 | ||
642 | if (macDataViewListCtrlPtr != NULL) | |
643 | { | |
644 | // variable definition and initialization: | |
645 | DataBrowserListViewHeaderDesc headerDescription; | |
646 | ||
647 | wxCHECK_RET(macDataViewListCtrlPtr->GetHeaderDesc(this->GetPropertyID(),&headerDescription) == noErr,_("Could not get header description.")); | |
648 | headerDescription.maximumWidth = static_cast<UInt16>(maxWidth); | |
649 | wxCHECK_RET(macDataViewListCtrlPtr->SetHeaderDesc(this->GetPropertyID(),&headerDescription) == noErr,_("Could not set maximum width.")); | |
650 | } /* if */ | |
651 | } /* if */ | |
652 | } /* wxDataViewColumn::SetMaxWidth(int) */ | |
653 | ||
654 | void wxDataViewColumn::SetMinWidth(int minWidth) | |
655 | { | |
656 | wxDataViewCtrl* dataViewCtrlPtr(this->GetOwner()); | |
657 | ||
658 | ||
659 | this->m_minWidth = minWidth; | |
660 | if (dataViewCtrlPtr != NULL) | |
661 | { | |
662 | // variable definition and initialization: | |
663 | wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer())); | |
664 | ||
665 | if (macDataViewListCtrlPtr != NULL) | |
666 | { | |
667 | // variable definition and initialization: | |
668 | DataBrowserListViewHeaderDesc headerDescription; | |
669 | ||
670 | wxCHECK_RET(macDataViewListCtrlPtr->GetHeaderDesc(this->GetPropertyID(),&headerDescription) == noErr,_("Could not get header description.")); | |
671 | headerDescription.minimumWidth = static_cast<UInt16>(minWidth); | |
672 | wxCHECK_RET(macDataViewListCtrlPtr->SetHeaderDesc(this->GetPropertyID(),&headerDescription) == noErr,_("Could not set minimum width.")); | |
673 | } /* if */ | |
674 | } /* if */ | |
675 | } /* wxDataViewColumn::SetMaxWidth(int) */ | |
676 | ||
677 | void wxDataViewColumn::SetResizeable(bool WXUNUSED(resizeable)) | |
678 | { | |
679 | } /* wxDataViewColumn::SetResizeable(bool) */ | |
680 | ||
681 | void wxDataViewColumn::SetSortable(bool sortable) | |
682 | { | |
683 | // variable definition and initialization: | |
684 | wxDataViewCtrl* dataViewCtrlPtr(this->GetOwner()); | |
685 | ||
686 | if (dataViewCtrlPtr != NULL) | |
687 | { | |
688 | // variable definition and initialization: | |
689 | wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer())); | |
690 | ||
691 | if (macDataViewListCtrlPtr != NULL) | |
692 | { | |
693 | // variable definition and initialization: | |
694 | DataBrowserPropertyFlags flags; | |
695 | ||
696 | wxCHECK_RET(macDataViewListCtrlPtr->GetPropertyFlags(this->GetPropertyID(),&flags) == noErr,_("Could not get property flags.")); | |
697 | if (sortable) | |
698 | { | |
699 | this->m_flags |= wxDATAVIEW_COL_SORTABLE; | |
700 | flags |= kDataBrowserListViewSortableColumn; | |
701 | } /* if */ | |
702 | else | |
703 | { | |
704 | this->m_flags &= ~wxDATAVIEW_COL_SORTABLE; | |
705 | flags &= ~kDataBrowserPropertyIsEditable; | |
706 | } /* if */ | |
707 | wxCHECK_RET(macDataViewListCtrlPtr->SetPropertyFlags(this->GetPropertyID(),flags) == noErr,_("Could not set property flags.")); | |
708 | } /* if */ | |
709 | } /* if */ | |
710 | } /* wxDataViewColumn::SetSortable(bool) */ | |
711 | ||
712 | void wxDataViewColumn::SetSortOrder(bool ascending) | |
713 | { | |
714 | wxDataViewCtrl* dataViewCtrlPtr(this->GetOwner()); | |
715 | ||
716 | ||
717 | this->m_ascending = ascending; | |
718 | if (dataViewCtrlPtr != NULL) | |
719 | { | |
720 | // variable definition and initialization: | |
721 | wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer())); | |
722 | ||
723 | if (macDataViewListCtrlPtr != NULL) | |
724 | { | |
725 | // variable definition and initialization: | |
726 | DataBrowserListViewHeaderDesc headerDescription; | |
727 | ||
728 | verify_noerr(macDataViewListCtrlPtr->GetHeaderDesc(this->GetPropertyID(),&headerDescription)); | |
729 | if (ascending) | |
730 | headerDescription.initialOrder = kDataBrowserOrderIncreasing; | |
731 | else | |
732 | headerDescription.initialOrder = kDataBrowserOrderDecreasing; | |
733 | verify_noerr(macDataViewListCtrlPtr->SetHeaderDesc(this->GetPropertyID(),&headerDescription)); | |
734 | } /* if */ | |
735 | } /* if */ | |
736 | } /* wxDataViewColumn::SetSortOrder(bool) */ | |
737 | ||
738 | void wxDataViewColumn::SetTitle(wxString const& title) | |
739 | { | |
740 | wxDataViewCtrl* dataViewCtrlPtr(this->GetOwner()); | |
741 | ||
742 | ||
743 | this->m_title = title; | |
744 | if (dataViewCtrlPtr != NULL) | |
745 | { | |
746 | // variable definition and initialization: | |
747 | wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer())); | |
748 | ||
749 | if (macDataViewListCtrlPtr != NULL) | |
750 | { | |
751 | // variable definition and initialization: | |
752 | DataBrowserListViewHeaderDesc headerDescription; | |
753 | wxMacCFStringHolder cfTitle(title,(dataViewCtrlPtr->GetFont().Ok() ? dataViewCtrlPtr->GetFont().GetEncoding() : wxLocale::GetSystemEncoding())); | |
754 | ||
755 | wxCHECK_RET(macDataViewListCtrlPtr->GetHeaderDesc(this->GetPropertyID(),&headerDescription) == noErr,_("Could not get header description.")); | |
756 | headerDescription.titleString = cfTitle; | |
757 | wxCHECK_RET(macDataViewListCtrlPtr->SetHeaderDesc(this->GetPropertyID(),&headerDescription) == noErr,_("Could not set header description.")); | |
758 | } /* if */ | |
759 | } /* if */ | |
760 | } /* wxDataViewColumn::SetTitle(wxString const&) */ | |
761 | ||
762 | void wxDataViewColumn::SetWidth(int width) | |
763 | { | |
764 | wxDataViewCtrl* dataViewCtrlPtr(this->GetOwner()); | |
765 | ||
766 | ||
767 | if ((width >= this->m_minWidth) && (width <= this->m_maxWidth)) | |
768 | { | |
769 | this->m_width = width; | |
770 | if (dataViewCtrlPtr != NULL) | |
771 | { | |
772 | // variable definition and initialization: | |
773 | wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer())); | |
774 | ||
775 | if (macDataViewListCtrlPtr != NULL) | |
776 | wxCHECK_RET(macDataViewListCtrlPtr->SetColumnWidth(this->GetPropertyID(),static_cast<UInt16>(width)) == noErr,_("Could not set column width.")); | |
777 | } /* if */ | |
778 | } /* if */ | |
779 | } /* wxDataViewColumn::SetWidth(int) */ | |
780 | ||
781 | IMPLEMENT_ABSTRACT_CLASS(wxDataViewColumn,wxDataViewColumnBase) | |
782 | ||
783 | //----------------------------------------------------------------------------- | |
784 | // wxDataViewCtrl | |
785 | //----------------------------------------------------------------------------- | |
786 | #pragma mark - | |
787 | void wxDataViewCtrl::Init(void) | |
788 | { | |
789 | this->m_macIsUserPane = false; | |
790 | this->m_NotifierPtr = NULL; | |
791 | this->m_cgContext = NULL; | |
792 | } /* wxDataViewCtrl::Init(void) */ | |
793 | ||
794 | bool wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxValidator& validator ) | |
795 | { | |
796 | if (!(this->wxControl::Create(parent,id,pos,size,(style | wxSUNKEN_BORDER) & ~(wxHSCROLL | wxVSCROLL),validator))) | |
797 | return false; | |
798 | ||
799 | #ifdef __WXMAC__ | |
800 | MacSetClipChildren(true) ; | |
801 | #endif | |
802 | ||
803 | this->m_peer = new wxMacDataViewDataBrowserListViewControl(this,pos,size,style); | |
804 | this->MacPostControlCreate(pos,size); | |
805 | ||
806 | InstallControlEventHandler(this->m_peer->GetControlRef(),GetwxMacDataViewCtrlEventHandlerUPP(),GetEventTypeCount(eventList),eventList,this,NULL); | |
807 | ||
808 | return true; | |
809 | } /* wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxValidator& validator) */ | |
810 | ||
811 | void wxDataViewCtrl::OnSize(wxSizeEvent& event) | |
812 | { | |
813 | unsigned int const NoOfColumns = this->GetColumnCount(); | |
814 | ||
815 | ||
816 | for (unsigned int i=0; i<NoOfColumns; ++i) | |
817 | { | |
818 | // variable definition and initialization: | |
819 | wxDataViewColumn* dataViewColumnPtr(this->GetColumn(i)); | |
820 | ||
821 | if (dataViewColumnPtr != NULL) | |
822 | { | |
823 | // variable definition and initialization: | |
824 | wxDataViewCustomRenderer* dataViewCustomRendererPtr(dynamic_cast<wxDataViewCustomRenderer*>(dataViewColumnPtr->GetRenderer())); | |
825 | ||
826 | if (dataViewCustomRendererPtr != NULL) | |
827 | dataViewCustomRendererPtr->SetDC(NULL); // reset DC because DC has changed | |
828 | } /* if */ | |
829 | } /* for */ | |
830 | event.Skip(); | |
831 | } /* wxDataViewCtrl::OnSize(wxSizeEvent&) */ | |
832 | ||
833 | bool wxDataViewCtrl::AssociateModel(wxDataViewListModel *model) | |
834 | { | |
835 | if (!wxDataViewCtrlBase::AssociateModel(model)) | |
836 | return false; | |
837 | ||
838 | this->m_NotifierPtr = new wxMacDataViewListModelNotifier(dynamic_cast<wxMacDataViewDataBrowserListViewControl*>(this->m_peer)); | |
839 | model->AddNotifier(this->m_NotifierPtr); | |
840 | ||
841 | return true; | |
842 | } | |
843 | ||
844 | bool wxDataViewCtrl::AppendColumn(wxDataViewColumn* dataViewColumnPtr) | |
845 | { | |
846 | wxCHECK_MSG(dataViewColumnPtr != NULL, false,_("Column pointer must not be NULL.")); | |
847 | wxCHECK_MSG(dataViewColumnPtr->GetRenderer() != NULL,false,_("Column does not have a renderer.")); | |
848 | if (this->wxDataViewCtrlBase::AppendColumn(dataViewColumnPtr)) | |
849 | { | |
850 | // variable definition: | |
851 | DataBrowserPropertyID FreeID; | |
852 | DataBrowserListViewColumnDesc columnDescription; | |
853 | wxMacCFStringHolder cfTitle(dataViewColumnPtr->GetTitle(),(this->m_font.Ok() ? this->m_font.GetEncoding() : wxLocale::GetSystemEncoding())); | |
854 | wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer)); | |
855 | ||
856 | // initialize column description: | |
857 | wxCHECK_MSG (MacDataViewListCtrlPtr != NULL,false,_("m_peer is not or incorrectly initialized")); | |
858 | verify_noerr(MacDataViewListCtrlPtr->GetFreePropertyID(&FreeID)); | |
859 | dataViewColumnPtr->SetPropertyID(FreeID); | |
860 | columnDescription.propertyDesc.propertyID = FreeID; | |
861 | columnDescription.propertyDesc.propertyType = dataViewColumnPtr->GetRenderer()->GetPropertyType(); | |
862 | columnDescription.propertyDesc.propertyFlags = kDataBrowserListViewSelectionColumn; | |
863 | if (dataViewColumnPtr->IsSortable()) | |
864 | columnDescription.propertyDesc.propertyFlags |= kDataBrowserListViewSortableColumn; | |
865 | if (dataViewColumnPtr->IsResizeable()) | |
866 | columnDescription.propertyDesc.propertyFlags |= kDataBrowserListViewMovableColumn; | |
867 | if (dataViewColumnPtr->GetRenderer()->GetMode() == wxDATAVIEW_CELL_EDITABLE) | |
868 | columnDescription.propertyDesc.propertyFlags |= kDataBrowserPropertyIsEditable; | |
869 | #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2 | |
870 | if ((columnDescription.propertyDesc.propertyType == kDataBrowserTextType) || | |
871 | (columnDescription.propertyDesc.propertyType == kDataBrowserIconAndTextType) || | |
872 | (columnDescription.propertyDesc.propertyType == kDataBrowserDateTimeType)) | |
873 | columnDescription.propertyDesc.propertyFlags |= kDataBrowserListViewTypeSelectColumn; | |
874 | #endif | |
875 | #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4 | |
876 | columnDescription.propertyDesc.propertyFlags |= kDataBrowserListViewNoGapForIconInHeaderButton; | |
877 | #endif | |
878 | columnDescription.headerBtnDesc.version = kDataBrowserListViewLatestHeaderDesc; | |
879 | columnDescription.headerBtnDesc.minimumWidth = 0; | |
880 | columnDescription.headerBtnDesc.maximumWidth = 30000; | |
881 | columnDescription.headerBtnDesc.titleOffset = 0; | |
882 | columnDescription.headerBtnDesc.titleString = cfTitle; // we cannot directly use the wxMacCFStringHolder constructor call because then the CFStringRef is released | |
883 | // having called 'AddColumn' where the title (CFStringRef) is going to be used | |
884 | columnDescription.headerBtnDesc.initialOrder = kDataBrowserOrderIncreasing; | |
885 | columnDescription.headerBtnDesc.btnFontStyle.flags = kControlUseFontMask | kControlUseJustMask; | |
886 | switch (dataViewColumnPtr->GetAlignment()) | |
887 | { | |
888 | case wxALIGN_CENTER: | |
889 | case wxALIGN_CENTER_HORIZONTAL: | |
890 | columnDescription.headerBtnDesc.btnFontStyle.just = teCenter; | |
891 | break; | |
892 | case wxALIGN_LEFT: | |
893 | columnDescription.headerBtnDesc.btnFontStyle.just = teFlushLeft; | |
894 | break; | |
895 | case wxALIGN_RIGHT: | |
896 | columnDescription.headerBtnDesc.btnFontStyle.just = teFlushRight; | |
897 | break; | |
898 | default: | |
899 | columnDescription.headerBtnDesc.btnFontStyle.just = teFlushDefault; | |
900 | } /* switch */ | |
901 | columnDescription.headerBtnDesc.btnFontStyle.font = kControlFontViewSystemFont; | |
902 | columnDescription.headerBtnDesc.btnFontStyle.style = normal; | |
903 | columnDescription.headerBtnDesc.btnContentInfo.contentType = kControlContentIconRef; | |
904 | if (dataViewColumnPtr->GetBitmap().Ok()) | |
905 | columnDescription.headerBtnDesc.btnContentInfo.u.iconRef = dataViewColumnPtr->GetBitmap().GetBitmapData()->GetIconRef(); | |
906 | // add column: | |
907 | verify_noerr(MacDataViewListCtrlPtr->AddColumn(&columnDescription,kDataBrowserListViewAppendColumn)); | |
908 | // final adjustments for the layout: | |
909 | if (dataViewColumnPtr->GetWidth() <= 0) | |
910 | { | |
911 | // variable definition: | |
912 | UInt16 defaultColumnWidth; | |
913 | ||
914 | MacDataViewListCtrlPtr->GetDefaultColumnWidth(&defaultColumnWidth); | |
915 | dataViewColumnPtr->SetWidth(defaultColumnWidth); | |
916 | } /* if */ | |
917 | verify_noerr(MacDataViewListCtrlPtr->SetColumnWidth(dataViewColumnPtr->GetPropertyID(),dataViewColumnPtr->GetWidth())); | |
918 | if (dataViewColumnPtr->IsSortable()) // if the current column is sortable and there is no active sortable column yet, the new column will become active | |
919 | { | |
920 | // variable definition: | |
921 | DataBrowserPropertyID sortedProperty; | |
922 | ||
923 | if ((MacDataViewListCtrlPtr->GetSortProperty(&sortedProperty) == noErr) && (sortedProperty < kMinPropertyID)) | |
924 | MacDataViewListCtrlPtr->SetSortProperty(dataViewColumnPtr->GetPropertyID()); | |
925 | } /* if */ | |
926 | ||
927 | // now, make sure that data is shown in the newly appended column: | |
928 | if ((this->GetModel() != NULL) && (this->m_NotifierPtr != NULL) && (dataViewColumnPtr->GetModelColumn() >= 0) && (dataViewColumnPtr->GetModelColumn() < this->GetModel()->GetColumnCount())) | |
929 | if (this->GetColumnCount() == 1) // the newly appended column is the only one and this means that no data has been inserted yet, so do it now: | |
930 | { | |
931 | // variable definition: | |
932 | DataBrowserItemID newID; | |
933 | ||
934 | for (size_t i=0; i<this->GetModel()->GetRowCount(); ++i) | |
935 | if (!((MacDataViewListCtrlPtr->GetFreeItemID(&newID) == noErr) && MacDataViewListCtrlPtr->InsertItemIDRowPair(newID,i) && (MacDataViewListCtrlPtr->AddItem(kDataBrowserNoItem,&newID) == noErr))) | |
936 | return false; | |
937 | } /* if */ | |
938 | else | |
939 | for (size_t i=0; i<this->GetModel()->GetRowCount(); ++i) | |
940 | (void) this->m_NotifierPtr->ValueChanged(dataViewColumnPtr->GetModelColumn(),i); | |
941 | // done: | |
942 | return true; | |
943 | } /* if */ | |
944 | else | |
945 | return false; | |
946 | } /* wxDataViewCtrl::AppendColumn(wxDataViewColumn*) */ | |
947 | ||
948 | int wxDataViewCtrl::GetSelection(void) const | |
949 | { | |
950 | wxArrayInt selectedRows; | |
951 | ||
952 | ||
953 | if (this->GetSelections(selectedRows) > 0) | |
954 | return selectedRows[0]; | |
955 | else | |
956 | return wxNOT_FOUND; | |
957 | } /* wxDataViewCtrl::GetSelection(void) const */ | |
958 | ||
959 | int wxDataViewCtrl::GetSelections(wxArrayInt& selectedRows) const | |
960 | { | |
961 | size_t NoOfSelections; | |
962 | ||
963 | wxArrayDataBrowserItemID itemIDs; | |
964 | ||
965 | wxMacDataViewDataBrowserListViewControlPointer dataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer)); | |
966 | ||
967 | ||
968 | if (dataViewListCtrlPtr == NULL) | |
969 | NoOfSelections = 0; | |
970 | else | |
971 | NoOfSelections = dataViewListCtrlPtr->GetSelectedItemIDs(itemIDs); | |
972 | selectedRows.Empty(); | |
973 | selectedRows.Alloc(NoOfSelections); | |
974 | for (size_t i=0; i<NoOfSelections; ++i) | |
975 | { | |
976 | // variable definition: | |
977 | DataBrowserTableViewRowIndex rowIndex; | |
978 | ||
979 | wxCHECK_MSG(dataViewListCtrlPtr->GetRowIndex(rowIndex,itemIDs[i]),0,_("Could not determine row index.")); | |
980 | selectedRows[i] = static_cast<int>(rowIndex); | |
981 | } /* for */ | |
982 | return static_cast<int>(NoOfSelections); | |
983 | } /* wxDataViewCtrl::GetSelections(wxArrayInt&) const */ | |
984 | ||
985 | bool wxDataViewCtrl::IsSelected(unsigned int row) const | |
986 | { | |
987 | DataBrowserItemID itemID; | |
988 | ||
989 | wxMacDataViewDataBrowserListViewControlPointer dataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer)); | |
990 | ||
991 | ||
992 | return ((dataViewListCtrlPtr != NULL) && (dataViewListCtrlPtr->GetItemID(row,&itemID) == noErr) && dataViewListCtrlPtr->IsItemSelected(itemID)); | |
993 | } /* wxDataViewCtrl::IsSelected(unsigned int row) const */ | |
994 | ||
995 | void wxDataViewCtrl::SetSelection(int row) | |
996 | { | |
997 | wxArrayDataBrowserItemID selectedItemIDs; | |
998 | ||
999 | size_t NoOfSelections; | |
1000 | ||
1001 | wxMacDataViewDataBrowserListViewControlPointer dataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer)); | |
1002 | ||
1003 | ||
1004 | wxCHECK_RET(dataViewListCtrlPtr != NULL,_("Peer pointer not initialized.")); | |
1005 | if (row == -1) // unselect all selected items | |
1006 | { | |
1007 | NoOfSelections = dataViewListCtrlPtr->GetSelectedItemIDs(selectedItemIDs); | |
1008 | for (size_t i=0; i<NoOfSelections; ++i) | |
1009 | (void) dataViewListCtrlPtr->SetSelectedItems(1,&(selectedItemIDs[i]),kDataBrowserItemsRemove); | |
1010 | } /* if */ | |
1011 | else if (row >= 0) // select specified item | |
1012 | { | |
1013 | // variable definition: | |
1014 | DataBrowserItemID itemID; | |
1015 | ||
1016 | verify_noerr(dataViewListCtrlPtr->GetItemID(row,&itemID)); | |
1017 | verify_noerr(dataViewListCtrlPtr->SetSelectedItems(1,&itemID,kDataBrowserItemsAdd)); // should also deselect automatically all other items | |
1018 | } /* if */ | |
1019 | } /* wxDataViewCtrl::SetSelection(int) */ | |
1020 | ||
1021 | void wxDataViewCtrl::SetSelectionRange(unsigned int from, unsigned int to) | |
1022 | { | |
1023 | wxCHECK_RET(from <= to,_("Invalid specified range ('from' has to be smaller or equal to 'to').")); | |
1024 | ||
1025 | // variable definition: | |
1026 | wxArrayInt selectedRows; | |
1027 | ||
1028 | selectedRows.Alloc(to-from+1); | |
1029 | for (unsigned int i=from; i<=to; ++i) | |
1030 | selectedRows.Add(i); | |
1031 | this->SetSelections(selectedRows); | |
1032 | } /* wxDataViewCtrl::SetSelectionRange(unsigned int, unsigned int) */ | |
1033 | ||
1034 | void wxDataViewCtrl::SetSelections(wxArrayInt const& selectedRows) | |
1035 | { | |
1036 | wxMacDataViewDataBrowserListViewControlPointer dataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer)); | |
1037 | ||
1038 | ||
1039 | wxCHECK_RET(dataViewListCtrlPtr != NULL,_("Peer pointer not initialized.")); | |
1040 | // unselect all selected items: | |
1041 | this->SetSelection(-1); | |
1042 | for (size_t i=0; i<selectedRows.GetCount(); ++i) | |
1043 | { | |
1044 | // variable definition: | |
1045 | DataBrowserItemID itemID; | |
1046 | ||
1047 | verify_noerr(dataViewListCtrlPtr->GetItemID(selectedRows[i],&itemID)); | |
1048 | verify_noerr(dataViewListCtrlPtr->SetSelectedItems(1,&itemID,kDataBrowserItemsAssign)); | |
1049 | } /* if */ | |
1050 | } /* wxDataViewCtrl::SetSelections(wxArrayInt const&) */ | |
1051 | ||
1052 | void wxDataViewCtrl::Unselect(unsigned int row) | |
1053 | { | |
1054 | DataBrowserItemID itemID; | |
1055 | ||
1056 | wxMacDataViewDataBrowserListViewControlPointer dataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer)); | |
1057 | ||
1058 | ||
1059 | wxCHECK_RET( dataViewListCtrlPtr != NULL, _("Peer pointer not initialized.")); | |
1060 | wxCHECK_RET((dataViewListCtrlPtr->GetItemID(row,&itemID) == noErr) && (dataViewListCtrlPtr->SetSelectedItems(1,&itemID,kDataBrowserItemsRemove) == noErr),_("Unselection impossible.")); | |
1061 | } /* wxDataViewCtrl::Unselect(unsigned int) */ | |
1062 | ||
1063 | void wxDataViewCtrl::ReverseSorting(DataBrowserPropertyID columnID) | |
1064 | { | |
1065 | ||
1066 | if (columnID >= kMinPropertyID) | |
1067 | { | |
1068 | // variable definition and initialization: | |
1069 | DataBrowserPropertyID sortPropertyID; | |
1070 | wxMacDataViewDataBrowserListViewControlPointer dataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer)); | |
1071 | ||
1072 | wxCHECK_RET(dataViewListCtrlPtr != NULL,_("Peer pointer not initialized.")); | |
1073 | wxCHECK_RET(dataViewListCtrlPtr->GetSortProperty(&sortPropertyID) == noErr,_("Determination of sort property impossible.")); | |
1074 | if (sortPropertyID == columnID) | |
1075 | { | |
1076 | // variable defintion: | |
1077 | DataBrowserSortOrder sortOrderCtrl; | |
1078 | DataBrowserTableViewColumnID columnIndex; | |
1079 | wxDataViewColumn* dataViewColumnPtr; | |
1080 | ||
1081 | wxCHECK_RET(dataViewListCtrlPtr->GetPropertyColumn(columnID,&columnIndex) == noErr,_("Determination of column index impossible")); | |
1082 | wxCHECK_RET(dataViewListCtrlPtr->GetSortOrder(&sortOrderCtrl) == noErr,_("Determination of sort order impossible")); | |
1083 | dataViewColumnPtr = this->GetColumn(columnIndex); | |
1084 | wxCHECK_RET(dataViewColumnPtr != NULL,_("Column could not be obtained.")); | |
1085 | if ((sortOrderCtrl == kDataBrowserOrderIncreasing) && !(dataViewColumnPtr->IsSortOrderAscending()) || | |
1086 | (sortOrderCtrl == kDataBrowserOrderDecreasing) && dataViewColumnPtr->IsSortOrderAscending()) | |
1087 | dataViewListCtrlPtr->ReverseRowIndexNumbering(); | |
1088 | } /* if */ | |
1089 | } /* if */ | |
1090 | } /* wxDataViewCtrl::ReverseSorting(DataBrowserPropertyID columnID) */ | |
1091 | ||
1092 | IMPLEMENT_DYNAMIC_CLASS(wxDataViewCtrl,wxDataViewCtrlBase) | |
1093 | ||
1094 | BEGIN_EVENT_TABLE(wxDataViewCtrl,wxDataViewCtrlBase) | |
1095 | EVT_SIZE(wxDataViewCtrl::OnSize) | |
1096 | END_EVENT_TABLE() | |
1097 | ||
1098 | #endif | |
1099 | // !wxUSE_GENERICDATAVIEWCTRL | |
1100 | ||
1101 | #endif | |
1102 | // wxUSE_DATAVIEWCTRL | |
1103 |