]> git.saurik.com Git - wxWidgets.git/blob - src/mac/carbon/dataview.cpp
fix crash in BitmapComboBoxWidgetsPage under wxUniv
[wxWidgets.git] / src / mac / carbon / dataview.cpp
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 #include "wx/settings.h"
26 #include "wx/dcclient.h"
27 #include "wx/icon.h"
28 #endif
29
30 #include "wx/renderer.h"
31
32 //-----------------------------------------------------------------------------
33 // local constants
34 //-----------------------------------------------------------------------------
35
36 // a list of all catchable events:
37 static EventTypeSpec const eventList[] =
38 {
39 {kEventClassControl, kEventControlDraw},
40 {kEventClassControl, kEventControlHit}
41 };
42
43 //-----------------------------------------------------------------------------
44 // local functions
45 //-----------------------------------------------------------------------------
46
47 static pascal OSStatus wxMacDataViewCtrlEventHandler(EventHandlerCallRef handler, EventRef EventReference, void* Data)
48 {
49 wxDataViewCtrl* DataViewCtrlPtr((wxDataViewCtrl*) Data); // the 'Data' variable always contains a pointer to the data view control that installed the handler
50
51 wxMacCarbonEvent CarbonEvent(EventReference) ;
52
53
54 switch (GetEventKind(EventReference))
55 {
56 case kEventControlDraw:
57 {
58 OSStatus status;
59
60 DataViewCtrlPtr->MacSetDrawingContext(CarbonEvent.GetParameter<CGContextRef>(kEventParamCGContextRef,typeCGContextRef));
61 status = ::CallNextEventHandler(handler,EventReference);
62 DataViewCtrlPtr->MacSetDrawingContext(NULL);
63 return status;
64 } /* block */
65 case kEventControlHit :
66 if (CarbonEvent.GetParameter<ControlPartCode>(kEventParamControlPart,typeControlPartCode) == kControlButtonPart) // we only care about the header
67 {
68 ControlRef controlReference;
69 DataBrowserPropertyID columnPropertyID;
70 unsigned long columnIndex;
71 OSStatus status;
72 wxDataViewEvent DataViewEvent(wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_CLICK,DataViewCtrlPtr->GetId());
73
74 CarbonEvent.GetParameter(kEventParamDirectObject,&controlReference);
75 // determine the column that triggered the event (this is the column that is responsible for sorting the data view):
76 status = ::GetDataBrowserSortProperty(controlReference,&columnPropertyID);
77 wxCHECK(status == noErr,status);
78 status = ::GetDataBrowserTableViewColumnPosition(controlReference,columnPropertyID,&columnIndex);
79 if (status == errDataBrowserPropertyNotFound) // user clicked into part of the header that does not have a property
80 return ::CallNextEventHandler(handler,EventReference);
81 wxCHECK(status == noErr,status);
82 // initialize wxWidget event handler:
83 DataViewEvent.SetEventObject(DataViewCtrlPtr);
84 DataViewEvent.SetColumn(columnIndex);
85 DataViewEvent.SetDataViewColumn(DataViewCtrlPtr->GetColumn(columnIndex));
86 // finally sent the equivalent wxWidget event:
87 #if wxCHECK_VERSION(2,9,0)
88 DataViewCtrlPtr->HandleWindowEvent(DataViewEvent);
89 #else
90 DataViewCtrlPtr->GetEventHandler()->ProcessEvent(DataViewEvent);
91 #endif
92 return ::CallNextEventHandler(handler,EventReference);
93 } /* if */
94 else
95 return eventNotHandledErr;
96 } /* switch */
97
98 return eventNotHandledErr;
99 } /* wxMacDataViewCtrlEventHandler(EventHandlerCallRef, EventRef, void*) */
100
101 static DataBrowserItemID* CreateDataBrowserItemIDArray(size_t& noOfEntries, wxDataViewItemArray const& items) // returns a newly allocated pointer to valid data browser item IDs
102 {
103 size_t const noOfItems = items.GetCount();
104
105 DataBrowserItemID* itemIDs(new DataBrowserItemID[noOfItems]);
106
107
108 // convert all valid data view items to data browser items
109 noOfEntries = 0;
110 for (size_t i=0; i<noOfItems; ++i)
111 if (items[i].IsOk())
112 {
113 itemIDs[noOfEntries] = reinterpret_cast<DataBrowserItemID>(items[i].GetID());
114 ++noOfEntries;
115 } /* if */
116 // done:
117 return itemIDs;
118 } /* CreateDataBrowserItemIDArray(size_t&, wxDataViewItemArray const&) */
119
120 #if wxCHECK_VERSION(2,9,0)
121 static bool InitializeColumnDescription(DataBrowserListViewColumnDesc& columnDescription, wxDataViewColumn const* columnPtr, DataBrowserPropertyID columnPropertyID, wxCFStringRef const& title)
122 #else
123 static bool InitializeColumnDescription(DataBrowserListViewColumnDesc& columnDescription, wxDataViewColumn const* columnPtr, DataBrowserPropertyID columnPropertyID, wxMacCFStringHolder const& title)
124 #endif
125 {
126 // set properties for the column:
127 columnDescription.propertyDesc.propertyID = columnPropertyID;
128 columnDescription.propertyDesc.propertyType = columnPtr->GetRenderer()->GetPropertyType();
129 columnDescription.propertyDesc.propertyFlags = kDataBrowserListViewSelectionColumn; // make the column selectable
130 if (columnPtr->IsReorderable())
131 columnDescription.propertyDesc.propertyFlags |= kDataBrowserListViewMovableColumn;
132 if (columnPtr->IsResizeable())
133 {
134 columnDescription.headerBtnDesc.minimumWidth = 0;
135 columnDescription.headerBtnDesc.maximumWidth = 30000; // 32767 is the theoretical maximum though but 30000 looks nicer
136 } /* if */
137 else
138 {
139 columnDescription.headerBtnDesc.minimumWidth = columnPtr->GetWidth();
140 columnDescription.headerBtnDesc.maximumWidth = columnPtr->GetWidth();
141 } /* if */
142 if (columnPtr->IsSortable())
143 columnDescription.propertyDesc.propertyFlags |= kDataBrowserListViewSortableColumn;
144 if (columnPtr->GetRenderer()->GetMode() == wxDATAVIEW_CELL_EDITABLE)
145 columnDescription.propertyDesc.propertyFlags |= kDataBrowserPropertyIsEditable;
146 if ((columnDescription.propertyDesc.propertyType == kDataBrowserCustomType) ||
147 (columnDescription.propertyDesc.propertyType == kDataBrowserDateTimeType) ||
148 (columnDescription.propertyDesc.propertyType == kDataBrowserIconAndTextType) ||
149 (columnDescription.propertyDesc.propertyType == kDataBrowserTextType))
150 columnDescription.propertyDesc.propertyFlags |= kDataBrowserListViewTypeSelectColumn; // enables generally the possibility to have user input for the mentioned types
151 #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
152 columnDescription.propertyDesc.propertyFlags |= kDataBrowserListViewNoGapForIconInHeaderButton;
153 #endif
154 // set header's properties:
155 columnDescription.headerBtnDesc.version = kDataBrowserListViewLatestHeaderDesc;
156 columnDescription.headerBtnDesc.titleOffset = 0;
157 columnDescription.headerBtnDesc.titleString = ::CFStringCreateCopy(kCFAllocatorDefault,title);
158 columnDescription.headerBtnDesc.initialOrder = kDataBrowserOrderIncreasing; // choose one of the orders as "undefined" is not supported anyway (s. ControlDefs.h in the HIToolbox framework)
159 columnDescription.headerBtnDesc.btnFontStyle.flags = kControlUseFontMask | kControlUseJustMask;
160 switch (columnPtr->GetAlignment())
161 {
162 case wxALIGN_CENTER:
163 case wxALIGN_CENTER_HORIZONTAL:
164 columnDescription.headerBtnDesc.btnFontStyle.just = teCenter;
165 break;
166 case wxALIGN_LEFT:
167 columnDescription.headerBtnDesc.btnFontStyle.just = teFlushLeft;
168 break;
169 case wxALIGN_RIGHT:
170 columnDescription.headerBtnDesc.btnFontStyle.just = teFlushRight;
171 break;
172 default:
173 columnDescription.headerBtnDesc.btnFontStyle.just = teFlushDefault;
174 } /* switch */
175 columnDescription.headerBtnDesc.btnFontStyle.font = kControlFontViewSystemFont;
176 columnDescription.headerBtnDesc.btnFontStyle.style = normal;
177 if (columnPtr->GetBitmap().IsOk())
178 {
179 columnDescription.headerBtnDesc.btnContentInfo.contentType = kControlContentIconRef;
180 #if wxCHECK_VERSION(2,9,0)
181 columnDescription.headerBtnDesc.btnContentInfo.u.iconRef = columnPtr->GetBitmap().GetIconRef();
182 #else
183 columnDescription.headerBtnDesc.btnContentInfo.u.iconRef = columnPtr->GetBitmap().GetBitmapData()->GetIconRef();
184 #endif
185 }
186 else
187 {
188 // not text only as we otherwise could not add a bitmap later
189 // columnDescription.headerBtnDesc.btnContentInfo.contentType = kControlContentTextOnly;
190 columnDescription.headerBtnDesc.btnContentInfo.contentType = kControlContentIconRef;
191 columnDescription.headerBtnDesc.btnContentInfo.u.iconRef = NULL;
192 }
193
194 // done:
195 return true;
196 } /* InitializeColumnDescription(DataBrowserListViewColumnDesc&, wxDataViewColumn const*, DataBrowserPropertyID, wxMacCFStringHolder const&) */
197
198 //-----------------------------------------------------------------------------
199 // local function pointers
200 //-----------------------------------------------------------------------------
201
202 DEFINE_ONE_SHOT_HANDLER_GETTER(wxMacDataViewCtrlEventHandler)
203
204 // ---------------------------------------------------------
205 // wxMacDataViewModelNotifier
206 // ---------------------------------------------------------
207 #pragma mark -
208 class wxMacDataViewModelNotifier : public wxDataViewModelNotifier
209 {
210 public:
211 wxMacDataViewModelNotifier(wxMacDataViewDataBrowserListViewControl* initDataViewControlPtr) : m_dataViewControlPtr(initDataViewControlPtr)
212 {
213 }
214
215 virtual bool ItemAdded(const wxDataViewItem &parent, const wxDataViewItem &item)
216 {
217 DataBrowserItemID itemID(reinterpret_cast<DataBrowserItemID>(item.GetID()));
218
219 wxCHECK_MSG(item.IsOk(),false,_("Added item is invalid."));
220 bool noFailureFlag = (!(parent.IsOk()) && (this->m_dataViewControlPtr->AddItem(kDataBrowserNoItem,&itemID) == noErr) ||
221 parent.IsOk() && (this->m_dataViewControlPtr->AddItem(reinterpret_cast<DataBrowserItemID>(parent.GetID()),&itemID) == noErr));
222
223 wxDataViewCtrl *dvc = (wxDataViewCtrl*) this->m_dataViewControlPtr->GetPeer();
224 if (dvc->GetWindowStyle() & wxDV_VARIABLE_LINE_HEIGHT)
225 {
226 wxDataViewModel *model = GetOwner();
227
228 int height = 20; // TODO find out standard height
229 unsigned int num = dvc->GetColumnCount();
230 unsigned int col;
231 for (col = 0; col < num; col++)
232 {
233 wxDataViewColumn *column = dvc->GetColumn( col );
234 if (column->IsHidden())
235 continue;
236
237 wxDataViewCustomRenderer *renderer = wxDynamicCast( column->GetRenderer(), wxDataViewCustomRenderer );
238 if (renderer)
239 {
240 wxVariant value;
241 model->GetValue( value, item, column->GetModelColumn() );
242 renderer->SetValue( value );
243 height = wxMax( height, renderer->GetSize().y );
244 }
245
246 }
247
248 if (height > 20)
249 this->m_dataViewControlPtr->SetRowHeight( itemID, height );
250 }
251
252 return noFailureFlag;
253 } /* ItemAdded(wxDataViewItem const&, wxDataViewItem const&) */
254
255 virtual bool ItemsAdded(wxDataViewItem const& parent, wxDataViewItemArray const& items)
256 {
257 bool noFailureFlag;
258
259 DataBrowserItemID* itemIDs;
260
261 size_t noOfEntries;
262
263
264 // convert all valid data view items to data browser items:
265 itemIDs = ::CreateDataBrowserItemIDArray(noOfEntries,items);
266 // insert all valid items into control:
267 noFailureFlag = ((noOfEntries == 0) ||
268 !(parent.IsOk()) && (this->m_dataViewControlPtr->AddItems(kDataBrowserNoItem,noOfEntries,itemIDs,kDataBrowserItemNoProperty) == noErr) ||
269 parent.IsOk() && (this->m_dataViewControlPtr->AddItems(reinterpret_cast<DataBrowserItemID>(parent.GetID()),noOfEntries,itemIDs,kDataBrowserItemNoProperty) == noErr));
270 // give allocated array space free again:
271 delete[] itemIDs;
272
273 wxDataViewCtrl *dvc = (wxDataViewCtrl*) this->m_dataViewControlPtr->GetPeer();
274 if (dvc->GetWindowStyle() & wxDV_VARIABLE_LINE_HEIGHT)
275 {
276 wxDataViewItem item = items[0]; // TODO get all items
277 DataBrowserItemID itemID(reinterpret_cast<DataBrowserItemID>(item.GetID()));
278
279 wxDataViewModel *model = GetOwner();
280
281 int height = 20; // TODO find out standard height
282 unsigned int num = dvc->GetColumnCount();
283 unsigned int col;
284 for (col = 0; col < num; col++)
285 {
286 wxDataViewColumn *column = dvc->GetColumn( col );
287 if (column->IsHidden())
288 continue;
289
290 wxDataViewCustomRenderer *renderer = wxDynamicCast( column->GetRenderer(), wxDataViewCustomRenderer );
291 if (renderer)
292 {
293 wxVariant value;
294 model->GetValue( value, item, column->GetModelColumn() );
295 renderer->SetValue( value );
296 height = wxMax( height, renderer->GetSize().y );
297 }
298
299 }
300
301 if (height > 20)
302 this->m_dataViewControlPtr->SetRowHeight( itemID, height );
303 }
304
305 // done:
306 return noFailureFlag;
307 } /* ItemsAdded(wxDataViewItem const&, wxDataViewItemArray const&) */
308
309 virtual bool ItemChanged(wxDataViewItem const& item)
310 {
311 DataBrowserItemID itemID(reinterpret_cast<DataBrowserItemID>(item.GetID()));
312
313
314 wxCHECK_MSG(item.IsOk(),false,_("Changed item is invalid."));
315 if (this->m_dataViewControlPtr->UpdateItems(&itemID) == noErr)
316 {
317 wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->m_dataViewControlPtr->GetPeer()));
318
319 // sent the equivalent wxWidget event:
320 wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED,dataViewCtrlPtr->GetId()); // variable defintion
321
322 dataViewEvent.SetEventObject(dataViewCtrlPtr);
323 dataViewEvent.SetItem(item);
324 // sent the equivalent wxWidget event:
325 #if wxCHECK_VERSION(2,9,0)
326 dataViewCtrlPtr->HandleWindowEvent(dataViewEvent);
327 #else
328 dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
329 #endif
330 // done
331 return true;
332 } /* if */
333 else
334 return false;
335 } /* ItemChanged(wxDataViewItem const&) */
336
337 virtual bool ItemsChanged(wxDataViewItemArray const& items)
338 {
339 bool noFailureFlag;
340
341 DataBrowserItemID* itemIDs;
342
343 size_t noOfEntries;
344
345
346 // convert all valid data view items to data browser items:
347 itemIDs = ::CreateDataBrowserItemIDArray(noOfEntries,items);
348 // change items (ATTENTION: ONLY ITEMS OF THE ROOT ARE CHANGED BECAUSE THE PARENT PARAMETER IS MISSING):
349 noFailureFlag = (this->m_dataViewControlPtr->UpdateItems(kDataBrowserNoItem,noOfEntries,itemIDs,kDataBrowserItemNoProperty,kDataBrowserItemNoProperty) == noErr);
350 if (noFailureFlag)
351 {
352 wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->m_dataViewControlPtr->GetPeer()));
353
354 // send for all changed items a wxWidget event:
355 wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED,dataViewCtrlPtr->GetId()); // variable defintion
356
357 dataViewEvent.SetEventObject(dataViewCtrlPtr);
358 for (size_t i=0; i<noOfEntries; ++i)
359 {
360 dataViewEvent.SetItem(reinterpret_cast<void*>(itemIDs[i]));
361 #if wxCHECK_VERSION(2,9,0)
362 dataViewCtrlPtr->HandleWindowEvent(dataViewEvent);
363 #else
364 dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
365 #endif
366 } /* for */
367 } /* if */
368 // release allocated array space:
369 delete[] itemIDs;
370 // done:
371 return noFailureFlag;
372 } /* ItemsChanged(wxDataViewItem const&) */
373
374 virtual bool ItemDeleted(wxDataViewItem const& parent, wxDataViewItem const& item)
375 {
376 if (item.IsOk())
377 {
378 // variable definition and initialization:
379 DataBrowserItemID itemID(reinterpret_cast<DataBrowserItemID>(item.GetID()));
380 OSStatus errorStatus;
381 wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->m_dataViewControlPtr->GetPeer()));
382
383 // when this method is called and currently an item is being edited this item may have already been deleted in the model (the passed item and the being edited item have
384 // not to be identical because the being edited item might be below the passed item in the hierarchy);
385 // to prevent the control trying to ask the model to update an already deleted item the control is informed that currently a deleting process
386 // has been started and that variables can currently not be updated even when requested by the system:
387 dataViewCtrlPtr->SetDeleting(true);
388 errorStatus = this->m_dataViewControlPtr->RemoveItem(reinterpret_cast<DataBrowserItemID>(parent.GetID()),&itemID);
389 // enable automatic updating again:
390 dataViewCtrlPtr->SetDeleting(false);
391 return (errorStatus == noErr);
392 } /* if */
393 else
394 return false;
395 } /* ItemDeleted(wxDataViewItem const&, wxDataViewItem const&) */
396
397 virtual bool ItemsDeleted(wxDataViewItem const& parent, wxDataViewItemArray const& items)
398 {
399 bool noFailureFlag;
400
401 DataBrowserItemID* itemIDs;
402
403 wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->m_dataViewControlPtr->GetPeer()));
404
405 size_t noOfEntries;
406
407
408 wxCHECK_MSG(dataViewCtrlPtr != NULL,false,_("Data view control is not correctly initialized"));
409 // convert all valid data view items to data browser items:
410 itemIDs = ::CreateDataBrowserItemIDArray(noOfEntries,items);
411 // when this method is called and currently an item is being edited this item may have already been deleted in the model (the passed item and the being edited item have
412 // not to be identical because the being edited item might be below the passed item in the hierarchy);
413 // to prevent the control trying to ask the model to update an already deleted item the control is informed that currently a deleting process
414 // has been started and that variables can currently not be updated even when requested by the system:
415 dataViewCtrlPtr->SetDeleting(true);
416 // insert all valid items into control:
417 noFailureFlag = ((noOfEntries == 0) ||
418 !(parent.IsOk()) && (this->m_dataViewControlPtr->RemoveItems(kDataBrowserNoItem,noOfEntries,itemIDs,kDataBrowserItemNoProperty) == noErr) ||
419 parent.IsOk() && (this->m_dataViewControlPtr->RemoveItems(reinterpret_cast<DataBrowserItemID>(parent.GetID()),noOfEntries,itemIDs,kDataBrowserItemNoProperty) == noErr));
420 // enable automatic updating again:
421 dataViewCtrlPtr->SetDeleting(false);
422 // give allocated array space free again:
423 delete[] itemIDs;
424 // done:
425 return noFailureFlag;
426 } /* ItemsDeleted(wxDataViewItem const&, wxDataViewItemArray const&) */
427
428 virtual bool ValueChanged(wxDataViewItem const& item, unsigned int col)
429 {
430 DataBrowserItemID itemID(reinterpret_cast<DataBrowserItemID>(item.GetID()));
431 DataBrowserItemID parentID;
432
433 DataBrowserPropertyID propertyID;
434
435 wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->m_dataViewControlPtr->GetPeer()));
436
437
438 wxCHECK_MSG(item.IsOk(), false,_("Passed item is invalid."));
439 wxCHECK_MSG(this->GetOwner() != NULL,false,_("Owner not initialized."));
440 wxCHECK_MSG(dataViewCtrlPtr != NULL, false,_("Control is wrongly initialized."));
441 parentID = reinterpret_cast<DataBrowserItemID>(this->GetOwner()->GetParent(item).GetID());
442 if ((this->m_dataViewControlPtr->GetPropertyID(col,&propertyID) == noErr) &&
443 (this->m_dataViewControlPtr->UpdateItems(parentID,1,&itemID,dataViewCtrlPtr->GetColumn(col)->GetPropertyID(),propertyID) == noErr))
444 {
445 // variable definition and initialization:
446 wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED,dataViewCtrlPtr->GetId());
447
448 dataViewEvent.SetEventObject(dataViewCtrlPtr);
449 dataViewEvent.SetColumn(col);
450 dataViewEvent.SetItem(item);
451 // send the equivalent wxWidget event:
452 #if wxCHECK_VERSION(2,9,0)
453 dataViewCtrlPtr->HandleWindowEvent(dataViewEvent);
454 #else
455 dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
456 #endif
457 // done
458 return true;
459 } /* if */
460 else
461 return false;
462 } /* ValueChanged(wxDataViewItem const&, unsigned int) */
463
464 virtual bool Cleared(void)
465 {
466 bool noFailureFlag = (this->m_dataViewControlPtr->RemoveItems() == noErr);
467 wxDataViewItem item;
468 wxDataViewItemArray array;
469 GetOwner()->GetChildren( item, array );
470 ItemsAdded( item, array );
471 return noFailureFlag;
472 } /* Cleared(void) */
473
474 virtual void Resort(void)
475 {
476 this->m_dataViewControlPtr->Resort();
477 }
478
479 protected:
480 private:
481 //
482 // variables
483 //
484 wxMacDataViewDataBrowserListViewControl* m_dataViewControlPtr;
485 };
486
487 // ---------------------------------------------------------
488 // wxDataViewRenderer
489 // ---------------------------------------------------------
490 #pragma mark -
491 wxDataViewRenderer::wxDataViewRenderer(wxString const& varianttype, wxDataViewCellMode mode, int align)
492 :wxDataViewRendererBase(varianttype,mode,align), m_alignment(align), m_mode(mode)
493 {
494 } /* wxDataViewRenderer::wxDataViewRenderer(wxString const&, wxDataViewCellMode) */
495
496 void wxDataViewRenderer::SetMode(wxDataViewCellMode mode)
497 {
498 wxDataViewColumn* dataViewColumnPtr;
499
500
501 this->m_mode = mode;
502 dataViewColumnPtr = this->GetOwner();
503 if (dataViewColumnPtr != NULL)
504 {
505 // variable definition and initialization:
506 wxDataViewCtrl* dataViewCtrlPtr(dataViewColumnPtr->GetOwner());
507
508 if (dataViewCtrlPtr != NULL)
509 {
510 // variable definition and initialization:
511 wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
512
513 if (macDataViewListCtrlPtr != NULL)
514 {
515 // variable definition and initialization:
516 DataBrowserPropertyFlags flags;
517
518 verify_noerr(macDataViewListCtrlPtr->GetPropertyFlags(dataViewColumnPtr->GetPropertyID(),&flags));
519 if (mode == wxDATAVIEW_CELL_EDITABLE)
520 flags |= kDataBrowserPropertyIsEditable;
521 else
522 flags &= ~kDataBrowserPropertyIsEditable;
523 verify_noerr(macDataViewListCtrlPtr->SetPropertyFlags(dataViewColumnPtr->GetPropertyID(),flags));
524 } /* if */
525 } /* if */
526 } /* if */
527 } /* wxDataViewRenderer::SetMode(wxDataViewCellMode) */
528
529 IMPLEMENT_ABSTRACT_CLASS(wxDataViewRenderer,wxDataViewRendererBase)
530
531 // ---------------------------------------------------------
532 // wxDataViewCustomRenderer
533 // ---------------------------------------------------------
534 #pragma mark -
535 wxDataViewCustomRenderer::wxDataViewCustomRenderer(wxString const& varianttype, wxDataViewCellMode mode, int align)
536 :wxDataViewRenderer(varianttype,mode,align), m_editorCtrlPtr(NULL), m_DCPtr(NULL)
537 {
538 } /* wxDataViewCustomRenderer::wxDataViewCustomRenderer(wxString const&, wxDataViewCellMode) */
539
540 wxDataViewCustomRenderer::~wxDataViewCustomRenderer(void)
541 {
542 if (this->m_DCPtr != NULL)
543 delete this->m_DCPtr;
544 } /* wxDataViewCustomRenderer::~wxDataViewCustomRenderer(void) */
545
546 void wxDataViewCustomRenderer::RenderText( const wxString &text, int xoffset, wxRect cell, wxDC *dc, int state )
547 {
548 wxDataViewCtrl *view = GetOwner()->GetOwner();
549 wxColour col = (state & wxDATAVIEW_CELL_SELECTED) ? wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT) : view->GetForegroundColour();
550 dc->SetTextForeground(col);
551 dc->DrawText( text, cell.x + xoffset, cell.y + ((cell.height - dc->GetCharHeight()) / 2));
552 }
553
554 wxDC* wxDataViewCustomRenderer::GetDC(void)
555 {
556 if (this->m_DCPtr == NULL)
557 {
558 if ((GetOwner() == NULL) || (GetOwner()->GetOwner() == NULL))
559 return NULL;
560 this->m_DCPtr = new wxWindowDC(this->GetOwner()->GetOwner());
561 } /* if */
562 return this->m_DCPtr;
563 } /* wxDataViewCustomRenderer::GetDC(void) */
564
565 bool wxDataViewCustomRenderer::Render(void)
566 {
567 return true;
568 } /* wxDataViewCustomRenderer::Render(void) */
569
570 void wxDataViewCustomRenderer::SetDC(wxDC* newDCPtr)
571 {
572 delete this->m_DCPtr;
573 this->m_DCPtr = newDCPtr;
574 } /* wxDataViewCustomRenderer::SetDC(wxDC*) */
575
576 WXDataBrowserPropertyType wxDataViewCustomRenderer::GetPropertyType(void) const
577 {
578 return kDataBrowserCustomType;
579 } /* wxDataViewCustomRenderer::GetPropertyType(void) const */
580
581 IMPLEMENT_ABSTRACT_CLASS(wxDataViewCustomRenderer, wxDataViewRenderer)
582
583 // ---------------------------------------------------------
584 // wxDataViewTextRenderer
585 // ---------------------------------------------------------
586 #pragma mark -
587 wxDataViewTextRenderer::wxDataViewTextRenderer(wxString const& varianttype, wxDataViewCellMode mode, int align)
588 :wxDataViewRenderer(varianttype,mode,align)
589 {
590 } /* wxDataViewTextRenderer::wxDataViewTextRenderer(wxString const&, wxDataViewCellMode, int) */
591
592 bool wxDataViewTextRenderer::Render(void)
593 {
594 wxCHECK_MSG(this->GetValue().GetType() == this->GetVariantType(),false,wxString(_("Text renderer cannot render value; value type: ")) << this->GetValue().GetType());
595
596 // variable definition:
597 #if wxCHECK_VERSION(2,9,0)
598 wxCFStringRef cfString(this->GetValue().GetString(),(this->GetView()->GetFont().Ok() ? this->GetView()->GetFont().GetEncoding() : wxLocale::GetSystemEncoding()));
599 #else
600 wxMacCFStringHolder cfString(this->GetValue().GetString(),(this->GetView()->GetFont().Ok() ? this->GetView()->GetFont().GetEncoding() : wxLocale::GetSystemEncoding()));
601 #endif
602 return (::SetDataBrowserItemDataText(this->GetDataReference(),cfString) == noErr);
603 } /* wxDataViewTextRenderer::Render(void) */
604
605 WXDataBrowserPropertyType wxDataViewTextRenderer::GetPropertyType(void) const
606 {
607 return kDataBrowserTextType;
608 } /* wxDataViewTextRenderer::GetPropertyType(void) const */
609
610 IMPLEMENT_CLASS(wxDataViewTextRenderer,wxDataViewRenderer)
611
612 // ---------------------------------------------------------
613 // wxDataViewTextRendererAttr
614 // ---------------------------------------------------------
615 #pragma mark -
616 wxDataViewTextRendererAttr::wxDataViewTextRendererAttr(wxString const& varianttype, wxDataViewCellMode mode, int align)
617 :wxDataViewTextRenderer(varianttype,mode,align)
618 {
619 } /* wxDataViewTextRendererAttr::wxDataViewTextRendererAttr(wxString const&, wxDataViewCellMode, int) */
620
621 IMPLEMENT_CLASS(wxDataViewTextRendererAttr,wxDataViewTextRenderer)
622
623 // ---------------------------------------------------------
624 // wxDataViewBitmapRenderer
625 // ---------------------------------------------------------
626 #pragma mark -
627 wxDataViewBitmapRenderer::wxDataViewBitmapRenderer(wxString const& varianttype, wxDataViewCellMode mode, int align)
628 :wxDataViewRenderer(varianttype,mode,align)
629 {
630 }
631
632 bool wxDataViewBitmapRenderer::Render(void)
633 // This method returns 'true' if
634 // - the passed bitmap is valid and it could be assigned to the native data browser;
635 // - the passed bitmap is invalid (or is not initialized); this case simulates a non-existing bitmap.
636 // In all other cases the method returns 'false'.
637 {
638 wxCHECK_MSG(this->GetValue().GetType() == this->GetVariantType(),false,wxString(_("Bitmap renderer cannot render value; value type: ")) << this->GetValue().GetType());
639
640 // variable definition:
641 wxBitmap bitmap;
642
643 bitmap << this->GetValue();
644 if (bitmap.Ok())
645 #if wxCHECK_VERSION(2,9,0)
646 return (::SetDataBrowserItemDataIcon(this->GetDataReference(),bitmap.GetIconRef()) == noErr);
647 #else
648 return (::SetDataBrowserItemDataIcon(this->GetDataReference(),bitmap.GetBitmapData()->GetIconRef()) == noErr);
649 #endif
650 else
651 return true;
652 } /* wxDataViewBitmapRenderer::Render(void) */
653
654 WXDataBrowserPropertyType wxDataViewBitmapRenderer::GetPropertyType(void) const
655 {
656 return kDataBrowserIconType;
657 } /* wxDataViewBitmapRenderer::GetPropertyType(void) const */
658
659 IMPLEMENT_CLASS(wxDataViewBitmapRenderer,wxDataViewRenderer)
660
661 // ---------------------------------------------------------
662 // wxDataViewIconTextRenderer
663 // ---------------------------------------------------------
664 #pragma mark -
665 wxDataViewIconTextRenderer::wxDataViewIconTextRenderer(wxString const& varianttype, wxDataViewCellMode mode, int align)
666 :wxDataViewRenderer(varianttype,mode)
667 {
668 }
669
670 bool wxDataViewIconTextRenderer::Render(void)
671 {
672 wxCHECK_MSG(this->GetValue().GetType() == this->GetVariantType(),false,wxString(_("Icon & text renderer cannot render value; value type: ")) << this->GetValue().GetType());
673
674 // variable definition:
675 wxDataViewIconText iconText;
676
677 iconText << this->GetValue();
678
679 // variable definition:
680 #if wxCHECK_VERSION(2,9,0)
681 wxCFStringRef cfString(iconText.GetText(),(this->GetView()->GetFont().Ok() ? this->GetView()->GetFont().GetEncoding() : wxLocale::GetSystemEncoding()));
682 #else
683 wxMacCFStringHolder cfString(iconText.GetText(),(this->GetView()->GetFont().Ok() ? this->GetView()->GetFont().GetEncoding() : wxLocale::GetSystemEncoding()));
684 #endif
685
686 if (iconText.GetIcon().IsOk())
687 if (::SetDataBrowserItemDataIcon(this->GetDataReference(),MAC_WXHICON(iconText.GetIcon().GetHICON())) != noErr)
688 return false;
689 return (::SetDataBrowserItemDataText(this->GetDataReference(),cfString) == noErr);
690 } /* wxDataViewIconTextRenderer::Render(void) */
691
692 WXDataBrowserPropertyType wxDataViewIconTextRenderer::GetPropertyType(void) const
693 {
694 return kDataBrowserIconAndTextType;
695 } /* wxDataViewIconTextRenderer::GetPropertyType(void) const */
696
697 IMPLEMENT_ABSTRACT_CLASS(wxDataViewIconTextRenderer,wxDataViewRenderer)
698
699
700 // ---------------------------------------------------------
701 // wxDataViewToggleRenderer
702 // ---------------------------------------------------------
703 #pragma mark -
704 wxDataViewToggleRenderer::wxDataViewToggleRenderer(wxString const& varianttype, wxDataViewCellMode mode, int align)
705 :wxDataViewRenderer(varianttype,mode)
706 {
707 }
708
709 bool wxDataViewToggleRenderer::Render(void)
710 {
711 wxCHECK_MSG(this->GetValue().GetType() == this->GetVariantType(),false,wxString(_("Toggle renderer cannot render value; value type: ")) << this->GetValue().GetType());
712 return (::SetDataBrowserItemDataButtonValue(this->GetDataReference(),this->GetValue().GetBool()) == noErr);
713 } /* wxDataViewToggleRenderer::Render(void) */
714
715 WXDataBrowserPropertyType wxDataViewToggleRenderer::GetPropertyType(void) const
716 {
717 return kDataBrowserCheckboxType;
718 } /* wxDataViewToggleRenderer::GetPropertyType(void) const */
719
720 IMPLEMENT_ABSTRACT_CLASS(wxDataViewToggleRenderer,wxDataViewRenderer)
721
722 // ---------------------------------------------------------
723 // wxDataViewProgressRenderer
724 // ---------------------------------------------------------
725 #pragma mark -
726 wxDataViewProgressRenderer::wxDataViewProgressRenderer(wxString const& label, wxString const& varianttype, wxDataViewCellMode mode, int align)
727 :wxDataViewRenderer(varianttype,mode,align)
728 {
729 }
730
731 bool wxDataViewProgressRenderer::Render(void)
732 {
733 wxCHECK_MSG(this->GetValue().GetType() == this->GetVariantType(),false,wxString(_("Progress renderer cannot render value type; value type: ")) << this->GetValue().GetType());
734 return ((::SetDataBrowserItemDataMinimum(this->GetDataReference(), 0) == noErr) &&
735 (::SetDataBrowserItemDataMaximum(this->GetDataReference(),100) == noErr) &&
736 (::SetDataBrowserItemDataValue (this->GetDataReference(),this->GetValue().GetLong()) == noErr));
737 } /* wxDataViewProgressRenderer::Render(void) */
738
739 WXDataBrowserPropertyType wxDataViewProgressRenderer::GetPropertyType(void) const
740 {
741 return kDataBrowserProgressBarType;
742 } /* wxDataViewProgressRenderer::GetPropertyType(void) const */
743
744 IMPLEMENT_ABSTRACT_CLASS(wxDataViewProgressRenderer,wxDataViewRenderer)
745
746 // ---------------------------------------------------------
747 // wxDataViewDateRenderer
748 // ---------------------------------------------------------
749 #pragma mark -
750 wxDataViewDateRenderer::wxDataViewDateRenderer(wxString const& varianttype, wxDataViewCellMode mode, int align)
751 :wxDataViewRenderer(varianttype,mode,align)
752 {
753 }
754
755 bool wxDataViewDateRenderer::Render(void)
756 {
757 wxCHECK_MSG(this->GetValue().GetType() == this->GetVariantType(),false,wxString(_("Date renderer cannot render value; value type: ")) << this->GetValue().GetType());
758 return (::SetDataBrowserItemDataDateTime(this->GetDataReference(),this->GetValue().GetDateTime().Subtract(wxDateTime(1,wxDateTime::Jan,1904)).GetSeconds().GetLo()) == noErr);
759 } /* wxDataViewDateRenderer::Render(void) */
760
761 WXDataBrowserPropertyType wxDataViewDateRenderer::GetPropertyType(void) const
762 {
763 return kDataBrowserDateTimeType;
764 } /* wxDataViewDateRenderer::GetPropertyType(void) const */
765
766 IMPLEMENT_ABSTRACT_CLASS(wxDataViewDateRenderer,wxDataViewRenderer)
767
768 // ---------------------------------------------------------
769 // wxDataViewColumn
770 // ---------------------------------------------------------
771 #pragma mark -
772 wxDataViewColumn::wxDataViewColumn(wxString const &title, wxDataViewRenderer *cell, unsigned int model_column, int width, wxAlignment align, int flags)
773 :wxDataViewColumnBase(title,cell,model_column,width,align,flags), m_ascending(true),
774 m_flags(flags & ~(wxDATAVIEW_COL_HIDDEN)), m_maxWidth(30000), m_minWidth(0), m_width(width >= 0 ? width : wxDVC_DEFAULT_WIDTH),
775 m_alignment(align), m_title(title)
776 {
777 } /* wxDataViewColumn::wxDataViewColumn(wxString const &title, wxDataViewRenderer*, unsigned int, int, wxAlignment, int) */
778
779 wxDataViewColumn::wxDataViewColumn(wxBitmap const& bitmap, wxDataViewRenderer *cell, unsigned int model_column, int width, wxAlignment align, int flags)
780 :wxDataViewColumnBase(bitmap,cell,model_column,width,align,flags), m_ascending(true),
781 m_flags(flags & ~(wxDATAVIEW_COL_HIDDEN)), m_maxWidth(30000), m_minWidth(0), m_width(width >= 0 ? width : wxDVC_DEFAULT_WIDTH),
782 m_alignment(align)
783 {
784 } /* wxDataViewColumn::wxDataViewColumn(wxBitmap const&, wxDataViewRenderer*, unsigned int, int, wxAlignment, int) */
785
786 void wxDataViewColumn::SetAlignment(wxAlignment align)
787 {
788 wxDataViewCtrl* dataViewCtrlPtr(this->GetOwner());
789
790
791 this->m_alignment = align;
792 if (dataViewCtrlPtr != NULL)
793 {
794 // variable definition and initialization:
795 wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
796
797 if (macDataViewListCtrlPtr != NULL)
798 {
799 // variable definition and initialization:
800 DataBrowserListViewHeaderDesc headerDescription;
801
802 wxCHECK_RET(macDataViewListCtrlPtr->GetHeaderDesc(this->GetPropertyID(),&headerDescription) == noErr,_("Could not get header description."));
803 switch (align)
804 {
805 case wxALIGN_CENTER:
806 case wxALIGN_CENTER_HORIZONTAL:
807 headerDescription.btnFontStyle.just = teCenter;
808 break;
809 case wxALIGN_LEFT:
810 headerDescription.btnFontStyle.just = teFlushLeft;
811 break;
812 case wxALIGN_RIGHT:
813 headerDescription.btnFontStyle.just = teFlushRight;
814 break;
815 default:
816 headerDescription.btnFontStyle.just = teFlushDefault;
817 } /* switch */
818 wxCHECK_RET(macDataViewListCtrlPtr->SetHeaderDesc(this->GetPropertyID(),&headerDescription) == noErr,_("Could not set alignment."));
819 } /* if */
820 } /* if */
821 } /* wxDataViewColumn::SetAlignment(wxAlignment) */
822
823 void wxDataViewColumn::SetBitmap(wxBitmap const& bitmap)
824 {
825 wxDataViewCtrl* dataViewCtrlPtr(this->GetOwner());
826
827
828 wxDataViewColumnBase::SetBitmap(bitmap);
829 if (dataViewCtrlPtr != NULL)
830 {
831 // variable definition and initialization:
832 wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
833
834 if (macDataViewListCtrlPtr != NULL)
835 {
836 // variable definition and initialization:
837 DataBrowserListViewHeaderDesc headerDescription;
838
839 wxCHECK_RET(macDataViewListCtrlPtr->GetHeaderDesc(this->GetPropertyID(),&headerDescription) == noErr,_("Could not get header description."));
840 if (this->GetBitmap().Ok())
841 #if wxCHECK_VERSION(2,9,0)
842 headerDescription.btnContentInfo.u.iconRef = this->GetBitmap().GetIconRef();
843 #else
844 headerDescription.btnContentInfo.u.iconRef = this->GetBitmap().GetBitmapData()->GetIconRef();
845 #endif
846 else
847 headerDescription.btnContentInfo.u.iconRef = NULL;
848 wxCHECK_RET(macDataViewListCtrlPtr->SetHeaderDesc(this->GetPropertyID(),&headerDescription) == noErr,_("Could not set icon."));
849 } /* if */
850 } /* if */
851 } /* wxDataViewColumn::SetBitmap(wxBitmap const&) */
852
853 void wxDataViewColumn::SetFlags(int flags)
854 {
855 this->SetHidden ((flags & wxDATAVIEW_COL_HIDDEN) != 0);
856 this->SetReorderable((flags & wxDATAVIEW_COL_REORDERABLE) != 0);
857 this->SetResizeable ((flags & wxDATAVIEW_COL_RESIZABLE) != 0);
858 this->SetSortable ((flags & wxDATAVIEW_COL_SORTABLE) != 0);
859 } /* wxDataViewColumn::SetFlags(int) */
860
861 void wxDataViewColumn::SetMaxWidth(int maxWidth)
862 {
863 wxDataViewCtrl* dataViewCtrlPtr(this->GetOwner());
864
865
866 this->m_maxWidth = maxWidth;
867 if (dataViewCtrlPtr != NULL)
868 {
869 // variable definition and initialization:
870 wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
871
872 if (macDataViewListCtrlPtr != NULL)
873 {
874 // variable definition and initialization:
875 DataBrowserListViewHeaderDesc headerDescription;
876
877 wxCHECK_RET(macDataViewListCtrlPtr->GetHeaderDesc(this->GetPropertyID(),&headerDescription) == noErr,_("Could not get header description."));
878 headerDescription.maximumWidth = static_cast<UInt16>(maxWidth);
879 wxCHECK_RET(macDataViewListCtrlPtr->SetHeaderDesc(this->GetPropertyID(),&headerDescription) == noErr,_("Could not set maximum width."));
880 } /* if */
881 } /* if */
882 } /* wxDataViewColumn::SetMaxWidth(int) */
883
884 void wxDataViewColumn::SetMinWidth(int minWidth)
885 {
886 wxDataViewCtrl* dataViewCtrlPtr(this->GetOwner());
887
888
889 this->m_minWidth = minWidth;
890 if (dataViewCtrlPtr != NULL)
891 {
892 // variable definition and initialization:
893 wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
894
895 if (macDataViewListCtrlPtr != NULL)
896 {
897 // variable definition and initialization:
898 DataBrowserListViewHeaderDesc headerDescription;
899
900 wxCHECK_RET(macDataViewListCtrlPtr->GetHeaderDesc(this->GetPropertyID(),&headerDescription) == noErr,_("Could not get header description."));
901 headerDescription.minimumWidth = static_cast<UInt16>(minWidth);
902 wxCHECK_RET(macDataViewListCtrlPtr->SetHeaderDesc(this->GetPropertyID(),&headerDescription) == noErr,_("Could not set minimum width."));
903 } /* if */
904 } /* if */
905 } /* wxDataViewColumn::SetMaxWidth(int) */
906
907 void wxDataViewColumn::SetReorderable(bool reorderable)
908 {
909 // first set the internal flag of the column:
910 if (reorderable)
911 this->m_flags |= wxDATAVIEW_COL_REORDERABLE;
912 else
913 this->m_flags &= ~wxDATAVIEW_COL_REORDERABLE;
914 // if the column is associated with a control change also immediately the flags of the control:
915 wxDataViewCtrl* dataViewCtrlPtr(this->GetOwner()); // variable definition and initialization
916
917 if (dataViewCtrlPtr != NULL)
918 {
919 // variable definition and initialization:
920 DataBrowserPropertyFlags flags;
921 wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
922
923 wxCHECK_RET(macDataViewListCtrlPtr != NULL, _("Valid pointer to native data view control does not exist"));
924 wxCHECK_RET(macDataViewListCtrlPtr->GetPropertyFlags(this->GetPropertyID(),&flags) == noErr,_("Could not get property flags."));
925 if (reorderable)
926 flags |= kDataBrowserListViewMovableColumn;
927 else
928 flags &= ~kDataBrowserListViewMovableColumn;
929 wxCHECK_RET(macDataViewListCtrlPtr->SetPropertyFlags(this->GetPropertyID(),flags) == noErr,_("Could not set property flags."));
930 } /* if */
931 } /* wxDataViewColumn::SetReorderable(bool) */
932
933 void wxDataViewColumn::SetResizeable(bool resizeable)
934 {
935 // first set the internal flag of the column:
936 if (resizeable)
937 this->m_flags |= wxDATAVIEW_COL_RESIZABLE;
938 else
939 this->m_flags &= ~wxDATAVIEW_COL_RESIZABLE;
940 // if the column is associated with a control change also immediately the flags of the control:
941 wxDataViewCtrl* dataViewCtrlPtr(this->GetOwner()); // variable definition and initialization
942
943 if (dataViewCtrlPtr != NULL)
944 {
945 // variable definition and initialization:
946 wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
947
948 if (macDataViewListCtrlPtr != NULL)
949 {
950 // variable definition and initialization:
951 DataBrowserListViewHeaderDesc headerDescription;
952
953 verify_noerr(macDataViewListCtrlPtr->GetHeaderDesc(this->GetPropertyID(),&headerDescription));
954 if (resizeable) {
955 headerDescription.minimumWidth = 0;
956 headerDescription.maximumWidth = 30000;
957 }
958 else {
959 headerDescription.minimumWidth = this->m_width;
960 headerDescription.maximumWidth = this->m_width;
961 }
962 verify_noerr(macDataViewListCtrlPtr->SetHeaderDesc(this->GetPropertyID(),&headerDescription));
963 macDataViewListCtrlPtr->SetSortProperty(this->GetPropertyID());
964 } /* if */
965 } /* if */
966 } /* wxDataViewColumn::SetResizeable(bool) */
967
968 void wxDataViewColumn::SetSortable(bool sortable)
969 {
970 // first set the internal flag of the column:
971 if (sortable)
972 this->m_flags |= wxDATAVIEW_COL_SORTABLE;
973 else
974 this->m_flags &= ~wxDATAVIEW_COL_SORTABLE;
975 // if the column is associated with a control change also immediately the flags of the control:
976 wxDataViewCtrl* dataViewCtrlPtr(this->GetOwner()); // variable definition and initialization
977
978 if (dataViewCtrlPtr != NULL)
979 {
980 // variable definition and initialization:
981 DataBrowserPropertyFlags flags;
982 wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
983
984 wxCHECK_RET(macDataViewListCtrlPtr != NULL, _("Valid pointer to native data view control does not exist"));
985 wxCHECK_RET(macDataViewListCtrlPtr->GetPropertyFlags(this->GetPropertyID(),&flags) == noErr,_("Could not get property flags."));
986 if (sortable)
987 flags |= kDataBrowserListViewSortableColumn;
988 else
989 flags &= ~kDataBrowserListViewSortableColumn;
990 wxCHECK_RET(macDataViewListCtrlPtr->SetPropertyFlags(this->GetPropertyID(),flags) == noErr,_("Could not set property flags."));
991 } /* if */
992 } /* wxDataViewColumn::SetSortable(bool) */
993
994 void wxDataViewColumn::SetSortOrder(bool ascending)
995 {
996 wxDataViewCtrl* dataViewCtrlPtr(this->GetOwner());
997
998
999 this->m_ascending = ascending;
1000 if (dataViewCtrlPtr != NULL)
1001 {
1002 // variable definition and initialization:
1003 wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
1004
1005 if (macDataViewListCtrlPtr != NULL)
1006 {
1007 // variable definition and initialization:
1008 DataBrowserListViewHeaderDesc headerDescription;
1009
1010 verify_noerr(macDataViewListCtrlPtr->GetHeaderDesc(this->GetPropertyID(),&headerDescription));
1011 if (ascending)
1012 headerDescription.initialOrder = kDataBrowserOrderIncreasing;
1013 else
1014 headerDescription.initialOrder = kDataBrowserOrderDecreasing;
1015 verify_noerr(macDataViewListCtrlPtr->SetHeaderDesc(this->GetPropertyID(),&headerDescription));
1016 macDataViewListCtrlPtr->SetSortProperty(this->GetPropertyID());
1017 } /* if */
1018 } /* if */
1019 } /* wxDataViewColumn::SetSortOrder(bool) */
1020
1021 void wxDataViewColumn::SetTitle(wxString const& title)
1022 {
1023 wxDataViewCtrl* dataViewCtrlPtr(this->GetOwner());
1024
1025
1026 this->m_title = title;
1027 if (dataViewCtrlPtr != NULL)
1028 {
1029 // variable definition and initialization:
1030 wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
1031
1032 if (macDataViewListCtrlPtr != NULL)
1033 {
1034 // variable definition and initialization:
1035 DataBrowserListViewHeaderDesc headerDescription;
1036 #if wxCHECK_VERSION(2,9,0)
1037 wxCFStringRef cfTitle(title,(dataViewCtrlPtr->GetFont().Ok() ? dataViewCtrlPtr->GetFont().GetEncoding() : wxLocale::GetSystemEncoding()));
1038 #else
1039 wxMacCFStringHolder cfTitle(title,(dataViewCtrlPtr->GetFont().Ok() ? dataViewCtrlPtr->GetFont().GetEncoding() : wxLocale::GetSystemEncoding()));
1040 #endif
1041
1042 wxCHECK_RET(macDataViewListCtrlPtr->GetHeaderDesc(this->GetPropertyID(),&headerDescription) == noErr,_("Could not get header description."));
1043 headerDescription.titleString = cfTitle;
1044 wxCHECK_RET(macDataViewListCtrlPtr->SetHeaderDesc(this->GetPropertyID(),&headerDescription) == noErr,_("Could not set header description."));
1045 } /* if */
1046 } /* if */
1047 } /* wxDataViewColumn::SetTitle(wxString const&) */
1048
1049 void wxDataViewColumn::SetWidth(int width)
1050 {
1051 wxDataViewCtrl* dataViewCtrlPtr(this->GetOwner());
1052
1053
1054 if ((width >= this->m_minWidth) && (width <= this->m_maxWidth))
1055 {
1056 this->m_width = width;
1057 if (dataViewCtrlPtr != NULL)
1058 {
1059 // variable definition and initialization:
1060 wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
1061
1062 if (macDataViewListCtrlPtr != NULL)
1063 wxCHECK_RET(macDataViewListCtrlPtr->SetColumnWidth(this->GetPropertyID(),static_cast<UInt16>(width)) == noErr,_("Could not set column width."));
1064 } /* if */
1065 } /* if */
1066 } /* wxDataViewColumn::SetWidth(int) */
1067
1068 IMPLEMENT_ABSTRACT_CLASS(wxDataViewColumn,wxDataViewColumnBase)
1069
1070 //-----------------------------------------------------------------------------
1071 // wxDataViewCtrl
1072 //-----------------------------------------------------------------------------
1073 #pragma mark -
1074 void wxDataViewCtrl::Init(void)
1075 {
1076 this->m_CustomRendererPtr = NULL;
1077 this->m_Deleting = false;
1078 this->m_macIsUserPane = false;
1079 this->m_cgContext = NULL;
1080 } /* wxDataViewCtrl::Init(void) */
1081
1082 bool wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxValidator& validator )
1083 {
1084 if (!(this->wxControl::Create(parent,id,pos,size,(style | wxSUNKEN_BORDER) & ~(wxHSCROLL | wxVSCROLL),validator)))
1085 return false;
1086
1087 #ifdef __WXMAC__
1088 MacSetClipChildren(true) ;
1089 #endif
1090
1091 this->m_peer = new wxMacDataViewDataBrowserListViewControl(this,pos,size,style);
1092 this->MacPostControlCreate(pos,size);
1093 ::SetAutomaticControlDragTrackingEnabledForWindow(::GetControlOwner(this->m_peer->GetControlRef()),true);
1094
1095 InstallControlEventHandler(this->m_peer->GetControlRef(),GetwxMacDataViewCtrlEventHandlerUPP(),GetEventTypeCount(eventList),eventList,this,NULL);
1096
1097 ::SetDataBrowserTableViewHiliteStyle( this->m_peer->GetControlRef(), kDataBrowserTableViewFillHilite );
1098
1099 ::SetDataBrowserTableViewGeometry( this->m_peer->GetControlRef(), true, false );
1100
1101 return true;
1102 } /* wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxValidator& validator) */
1103
1104 /*static*/
1105 wxVisualAttributes wxDataViewCtrl::GetClassDefaultAttributes(wxWindowVariant variant)
1106 {
1107 wxVisualAttributes attr;
1108
1109 attr.colFg = wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOWTEXT );
1110 attr.colBg = wxSystemSettings::GetColour( wxSYS_COLOUR_LISTBOX );
1111 attr.font.MacCreateFromThemeFont(kThemeViewsFont);
1112
1113 return attr;
1114 }
1115
1116 bool wxDataViewCtrl::AssociateModel(wxDataViewModel* model)
1117 {
1118 if (!wxDataViewCtrlBase::AssociateModel(model))
1119 return false;
1120
1121 model->AddNotifier(new wxMacDataViewModelNotifier(dynamic_cast<wxMacDataViewDataBrowserListViewControl*>(this->m_peer)));
1122
1123 return true;
1124 } /* wxDataViewCtrl::AssociateModel(wxDataViewModel*) */
1125
1126 bool wxDataViewCtrl::AppendColumn(wxDataViewColumn* columnPtr)
1127 {
1128 DataBrowserListViewColumnDesc columnDescription;
1129
1130 DataBrowserPropertyID NewPropertyID;
1131
1132 wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
1133
1134 #if wxCHECK_VERSION(2,9,0)
1135 wxCFStringRef title(columnPtr->GetTitle(),this->m_font.Ok() ? this->GetFont().GetEncoding() : wxLocale::GetSystemEncoding());
1136 #else
1137 wxMacCFStringHolder title(columnPtr->GetTitle(),this->m_font.Ok() ? this->GetFont().GetEncoding() : wxLocale::GetSystemEncoding());
1138 #endif
1139
1140
1141 // first, some error checking:
1142 wxCHECK_MSG(MacDataViewListCtrlPtr != NULL, false,_("m_peer is not or incorrectly initialized"));
1143 wxCHECK_MSG(columnPtr != NULL, false,_("Column pointer must not be NULL."));
1144 wxCHECK_MSG(columnPtr->GetRenderer() != NULL, false,_("Column does not have a renderer."));
1145 wxCHECK_MSG(this->GetModel() != NULL, false,_("No model associated with control."));
1146 wxCHECK_MSG((columnPtr->GetModelColumn() >= 0) &&
1147 (columnPtr->GetModelColumn() < this->GetModel()->GetColumnCount()),false,_("Column's model column has no equivalent in the associated model."));
1148
1149 // try to get new ID for the column:
1150 wxCHECK_MSG(MacDataViewListCtrlPtr->GetFreePropertyID(&NewPropertyID) == noErr,false,_("Cannot create new column's ID. Probably max. number of columns reached."));
1151 // full column variable initialization:
1152 columnPtr->SetPropertyID(NewPropertyID);
1153 // add column to wxWidget's internal structure:
1154 wxCHECK_MSG(this->wxDataViewCtrlBase::AppendColumn(columnPtr) &&
1155 this->m_ColumnPointers.insert(ColumnPointerHashMapType::value_type(NewPropertyID,columnPtr)).second,false,_("Could not add column to internal structures."));
1156 // create a column description and add column to the native control:
1157 wxCHECK_MSG(::InitializeColumnDescription(columnDescription,columnPtr,NewPropertyID,title), false,_("Column description could not be initialized."));
1158 wxCHECK_MSG(MacDataViewListCtrlPtr->AddColumn(&columnDescription,kDataBrowserListViewAppendColumn) == noErr,false,_("Column could not be added."));
1159
1160 // final adjustments for the layout:
1161 wxCHECK_MSG(MacDataViewListCtrlPtr->SetColumnWidth(NewPropertyID,columnPtr->GetWidth()) == noErr,false,_("Column width could not be set."));
1162
1163 // make sure that the data is up-to-date...
1164 // if the newly appended column is the first column add the initial data to the control and mark the column as an expander column,
1165 // otherwise ask the control to 'update' the data in the newly appended column:
1166 if (this->GetColumnCount() == 1)
1167 {
1168 this->SetExpanderColumn(columnPtr);
1169 this->AddChildrenLevel(wxDataViewItem());
1170 } /* if */
1171 else
1172 MacDataViewListCtrlPtr->UpdateItems(kDataBrowserNoItem,0,NULL,kDataBrowserItemNoProperty,NewPropertyID);
1173 // done:
1174 return true;
1175 } /* wxDataViewCtrl::AppendColumn(wxDataViewColumn*) */
1176
1177 bool wxDataViewCtrl::ClearColumns(void)
1178 {
1179 wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
1180
1181
1182 while (this->m_ColumnPointers.begin() != this->m_ColumnPointers.end())
1183 {
1184 wxCHECK_MSG(MacDataViewListCtrlPtr->RemoveColumnByProperty(this->m_ColumnPointers.begin()->first) == noErr,false,_("Could not remove column."));
1185 delete this->m_ColumnPointers.begin()->second;
1186 this->m_ColumnPointers.erase(this->m_ColumnPointers.begin());
1187 } /* while */
1188 return true;
1189 } /* wxDataViewCtrl::ClearColumns(void) */
1190
1191 bool wxDataViewCtrl::DeleteColumn(wxDataViewColumn* columnPtr)
1192 {
1193 wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
1194
1195
1196 if ((MacDataViewListCtrlPtr->RemoveColumnByProperty(columnPtr->GetPropertyID()) == noErr) && (this->m_ColumnPointers.erase(columnPtr->GetPropertyID()) > 0))
1197 {
1198 delete columnPtr;
1199 return true;
1200 } /* if */
1201 else
1202 return false;
1203 } /* wxDataViewCtrl::DeleteColumn(wxDataViewColumn*) */
1204
1205 wxDataViewColumn* wxDataViewCtrl::GetColumn(unsigned int pos) const
1206 {
1207 DataBrowserPropertyID propertyID;
1208
1209 wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
1210
1211
1212 if (MacDataViewListCtrlPtr->GetPropertyID(pos,&propertyID) == noErr)
1213 {
1214 // variable definition:
1215 ColumnPointerHashMapType::const_iterator Result(this->m_ColumnPointers.find(propertyID));
1216
1217 if (Result != this->m_ColumnPointers.end())
1218 return Result->second;
1219 else
1220 return NULL;
1221 } /* if */
1222 else
1223 return NULL;
1224 } /* wxDataViewCtrl::GetColumn(unsigned int pos) const */
1225
1226 unsigned int wxDataViewCtrl::GetColumnCount(void) const
1227 {
1228 return this->m_ColumnPointers.size();
1229 } /* wxDataViewCtrl::GetColumnCount(void) const */
1230
1231 int wxDataViewCtrl::GetColumnPosition(wxDataViewColumn const* columnPtr) const
1232 {
1233 if (columnPtr != NULL)
1234 {
1235 // variable definition and initialization:
1236 DataBrowserTableViewColumnIndex Position;
1237 wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
1238
1239 wxCHECK_MSG(MacDataViewListCtrlPtr->GetColumnIndex(columnPtr->GetPropertyID(),&Position) == noErr,-1,_("Could not determine column's position"));
1240 return static_cast<int>(Position);
1241 } /* if */
1242 else
1243 return wxNOT_FOUND;
1244 } /* wxDataViewCtrl::GetColumnPosition(wxDataViewColumn const*) const */
1245
1246 bool wxDataViewCtrl::PrependColumn(wxDataViewColumn* columnPtr)
1247 {
1248 DataBrowserListViewColumnDesc columnDescription;
1249
1250 DataBrowserPropertyID NewPropertyID;
1251
1252 wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
1253
1254 #if wxCHECK_VERSION(2,9,0)
1255 wxCFStringRef title(columnPtr->GetTitle(),this->m_font.Ok() ? this->GetFont().GetEncoding() : wxLocale::GetSystemEncoding());
1256 #else
1257 wxMacCFStringHolder title(columnPtr->GetTitle(),this->m_font.Ok() ? this->GetFont().GetEncoding() : wxLocale::GetSystemEncoding());
1258 #endif
1259
1260
1261 // first, some error checking:
1262 wxCHECK_MSG(MacDataViewListCtrlPtr != NULL, false,_("m_peer is not or incorrectly initialized"));
1263 wxCHECK_MSG(columnPtr != NULL, false,_("Column pointer must not be NULL."));
1264 wxCHECK_MSG(columnPtr->GetRenderer() != NULL, false,_("Column does not have a renderer."));
1265 wxCHECK_MSG(this->GetModel() != NULL, false,_("No model associated with control."));
1266 wxCHECK_MSG((columnPtr->GetModelColumn() >= 0) &&
1267 (columnPtr->GetModelColumn() < this->GetModel()->GetColumnCount()),false,_("Column's model column has no equivalent in the associated model."));
1268
1269 // try to get new ID for the column:
1270 wxCHECK_MSG(MacDataViewListCtrlPtr->GetFreePropertyID(&NewPropertyID) == noErr,false,_("Cannot create new column's ID. Probably max. number of columns reached."));
1271 // full column variable initialization:
1272 columnPtr->SetPropertyID(NewPropertyID);
1273 // add column to wxWidget's internal structure:
1274 wxCHECK_MSG(this->wxDataViewCtrlBase::AppendColumn(columnPtr) &&
1275 this->m_ColumnPointers.insert(ColumnPointerHashMapType::value_type(NewPropertyID,columnPtr)).second,false,_("Could not add column to internal structures."));
1276 // create a column description and add column to the native control:
1277 wxCHECK_MSG(::InitializeColumnDescription(columnDescription,columnPtr,NewPropertyID,title),false,_("Column description could not be initialized."));
1278 wxCHECK_MSG(MacDataViewListCtrlPtr->AddColumn(&columnDescription,0) == noErr, false,_("Column could not be added."));
1279
1280 // final adjustments for the layout:
1281 wxCHECK_MSG(MacDataViewListCtrlPtr->SetColumnWidth(NewPropertyID,columnPtr->GetWidth()) == noErr,false,_("Column width could not be set."));
1282
1283 // make sure that the data is up-to-date...
1284 // if the newly appended column is the first column add the initial data to the control and mark the column as an expander column,
1285 // otherwise ask the control to 'update' the data in the newly appended column:
1286 if (this->GetColumnCount() == 1)
1287 {
1288 this->SetExpanderColumn(columnPtr);
1289 this->AddChildrenLevel(wxDataViewItem());
1290 } /* if */
1291 else
1292 MacDataViewListCtrlPtr->UpdateItems(kDataBrowserNoItem,0,NULL,kDataBrowserItemNoProperty,NewPropertyID);
1293 // done:
1294 return true;
1295 } /* wxDataViewCtrl::PrependColumn(wxDataViewColumn*) */
1296
1297 void wxDataViewCtrl::Collapse(wxDataViewItem const& item)
1298 {
1299 wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
1300
1301
1302 MacDataViewListCtrlPtr->CloseContainer(reinterpret_cast<DataBrowserItemID>(item.GetID()));
1303 } /* wxDataViewCtrl::Collapse(wxDataViewItem const&) */
1304
1305 void wxDataViewCtrl::EnsureVisible(wxDataViewItem const& item, wxDataViewColumn const* columnPtr)
1306 {
1307 if (item.IsOk())
1308 {
1309 // variable definition and initialization:
1310 DataBrowserPropertyID propertyID;
1311 wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
1312
1313 if (columnPtr != NULL)
1314 propertyID = columnPtr->GetPropertyID();
1315 else
1316 propertyID = kDataBrowserNoItem;
1317 MacDataViewListCtrlPtr->RevealItem(reinterpret_cast<DataBrowserItemID>(item.GetID()),propertyID,kDataBrowserRevealOnly);
1318 } /* if */
1319 } /* wxDataViewCtrl::EnsureVisible(wxDataViewItem const&, wxDataViewColumn const*) */
1320
1321 void wxDataViewCtrl::Expand(wxDataViewItem const& item)
1322 {
1323 wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
1324
1325
1326 MacDataViewListCtrlPtr->OpenContainer(reinterpret_cast<DataBrowserItemID>(item.GetID()));
1327 } /* wxDataViewCtrl::Expand(wxDataViewItem const&) */
1328
1329 wxDataViewColumn* wxDataViewCtrl::GetSortingColumn(void) const
1330 {
1331 DataBrowserPropertyID propertyID;
1332
1333 wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
1334
1335
1336 if (MacDataViewListCtrlPtr->GetSortProperty(&propertyID) == noErr)
1337 return this->GetColumnPtr(propertyID);
1338 else
1339 return NULL;
1340 } /* wxDataViewCtrl::GetSortingColumn(void) const */
1341
1342 unsigned int wxDataViewCtrl::GetCount(void) const
1343 {
1344 ItemCount noOfItems;
1345
1346
1347 wxCHECK_MSG(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer)->GetItemCount(&noOfItems) == noErr,0,_("Could not determine number of items"));
1348 return noOfItems;
1349 } /* wxDataViewCtrl::GetCount(void) const */
1350
1351 wxRect wxDataViewCtrl::GetItemRect(wxDataViewItem const& item, wxDataViewColumn const* columnPtr) const
1352 {
1353 if (item.IsOk() && (columnPtr != NULL))
1354 {
1355 // variable definition:
1356 Rect MacRectangle;
1357 wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
1358
1359 if (MacDataViewListCtrlPtr->GetPartBounds(reinterpret_cast<DataBrowserItemID>(item.GetID()),columnPtr->GetPropertyID(),kDataBrowserPropertyContentPart,&MacRectangle) == noErr)
1360 {
1361 // variable definition:
1362 wxRect rectangle;
1363
1364 ::wxMacNativeToRect(&MacRectangle,&rectangle);
1365 return rectangle;
1366 } /* if */
1367 else
1368 return wxRect();
1369 } /* if */
1370 else
1371 return wxRect();
1372 } /* wxDataViewCtrl::GetItemRect(wxDataViewItem const&, unsigned int) const */
1373
1374 wxDataViewItem wxDataViewCtrl::GetSelection(void) const
1375 {
1376 wxArrayDataBrowserItemID itemIDs;
1377
1378 wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
1379
1380
1381 if (MacDataViewListCtrlPtr->GetSelectedItemIDs(itemIDs) > 0)
1382 return wxDataViewItem(reinterpret_cast<void*>(itemIDs[0]));
1383 else
1384 return wxDataViewItem();
1385 } /* wxDataViewCtrl::GetSelection(void) const */
1386
1387 int wxDataViewCtrl::GetSelections(wxDataViewItemArray& sel) const
1388 {
1389 size_t NoOfSelectedItems;
1390
1391 wxArrayDataBrowserItemID itemIDs;
1392
1393 wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
1394
1395
1396 NoOfSelectedItems = MacDataViewListCtrlPtr->GetSelectedItemIDs(itemIDs);
1397 sel.Empty();
1398 sel.SetCount(NoOfSelectedItems);
1399 for (size_t i=0; i<NoOfSelectedItems; ++i)
1400 sel[i] = wxDataViewItem(reinterpret_cast<void*>(itemIDs[i]));
1401 return static_cast<int>(NoOfSelectedItems);
1402 } /* wxDataViewCtrl::GetSelections(wxDataViewItemArray&) const */
1403
1404 void wxDataViewCtrl::HitTest(wxPoint const& point, wxDataViewItem& item, wxDataViewColumn*& columnPtr) const
1405 {
1406 item = wxDataViewItem();
1407 columnPtr = NULL;
1408 } /* wxDataViewCtrl::HitTest(wxPoint const&, wxDataViewItem&, wxDataViewColumn*&) const */
1409
1410 bool wxDataViewCtrl::IsSelected(wxDataViewItem const& item) const
1411 {
1412 wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
1413
1414
1415 return MacDataViewListCtrlPtr->IsItemSelected(reinterpret_cast<DataBrowserItemID>(item.GetID()));
1416 } /* wxDataViewCtrl::IsSelected(wxDataViewItem const&) const */
1417
1418 void wxDataViewCtrl::SelectAll(void)
1419 {
1420 DataBrowserItemID* itemIDPtr;
1421
1422 Handle handle(::NewHandle(0));
1423
1424 size_t NoOfItems;
1425
1426 wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
1427
1428
1429 wxCHECK_RET(MacDataViewListCtrlPtr->GetItems(kDataBrowserNoItem,true,kDataBrowserItemAnyState,handle) == noErr,_("Could not get items."));
1430 NoOfItems = static_cast<size_t>(::GetHandleSize(handle)/sizeof(DataBrowserItemID));
1431 HLock(handle);
1432 itemIDPtr = (DataBrowserItemID*) (*handle);
1433 MacDataViewListCtrlPtr->SetSelectedItems(NoOfItems,itemIDPtr,kDataBrowserItemsAssign);
1434 HUnlock(handle);
1435 DisposeHandle(handle);
1436 } /* wxDataViewCtrl::SelectAll(void) */
1437
1438 void wxDataViewCtrl::Select(wxDataViewItem const& item)
1439 {
1440 if (item.IsOk())
1441 {
1442 // variable definition and initialization:
1443 DataBrowserItemID itemID(reinterpret_cast<DataBrowserItemID>(item.GetID()));
1444 wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
1445
1446 MacDataViewListCtrlPtr->SetSelectedItems(1,&itemID,kDataBrowserItemsAdd);
1447 } /* if */
1448 } /* wxDataViewCtrl::Select(wxDataViewItem const&) */
1449
1450 void wxDataViewCtrl::SetSelections(wxDataViewItemArray const& sel)
1451 {
1452 size_t const NoOfSelections = sel.GetCount();
1453
1454 DataBrowserItemID* itemIDs;
1455
1456 wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
1457
1458
1459 itemIDs = new DataBrowserItemID[NoOfSelections];
1460 for (size_t i=0; i<NoOfSelections; ++i)
1461 itemIDs[i] = reinterpret_cast<DataBrowserItemID>(sel[i].GetID());
1462 MacDataViewListCtrlPtr->SetSelectedItems(NoOfSelections,itemIDs,kDataBrowserItemsAssign);
1463 delete[] itemIDs;
1464 } /* wxDataViewCtrl::SetSelections(wxDataViewItemArray const&) */
1465
1466 void wxDataViewCtrl::Unselect(wxDataViewItem const& item)
1467 {
1468 if (item.IsOk())
1469 {
1470 // variable definition and initialization:
1471 DataBrowserItemID itemID(reinterpret_cast<DataBrowserItemID>(item.GetID()));
1472 wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
1473
1474 MacDataViewListCtrlPtr->SetSelectedItems(1,&itemID,kDataBrowserItemsRemove);
1475 } /* if */
1476 } /* wxDataViewCtrl::Unselect(wxDataViewItem const&) */
1477
1478 void wxDataViewCtrl::UnselectAll(void)
1479 {
1480 DataBrowserItemID* itemIDPtr;
1481
1482 Handle handle(::NewHandle(0));
1483
1484 size_t NoOfItems;
1485
1486 wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
1487
1488
1489 wxCHECK_RET(MacDataViewListCtrlPtr->GetItems(kDataBrowserNoItem,true,kDataBrowserItemAnyState,handle) == noErr,_("Could not get items."));
1490 NoOfItems = static_cast<size_t>(::GetHandleSize(handle)/sizeof(DataBrowserItemID));
1491 HLock(handle);
1492 itemIDPtr = (DataBrowserItemID*) (*handle);
1493 MacDataViewListCtrlPtr->SetSelectedItems(NoOfItems,itemIDPtr,kDataBrowserItemsRemove);
1494 HUnlock(handle);
1495 DisposeHandle(handle);
1496 } /* wxDataViewCtrl::UnselectAll(void) */
1497
1498 // data handling:
1499 void wxDataViewCtrl::AddChildrenLevel(wxDataViewItem const& parentItem)
1500 {
1501 int NoOfChildren;
1502
1503 wxDataViewItemArray items;
1504
1505
1506 wxCHECK_RET(this->GetModel() != NULL,_("Model pointer not initialized."));
1507 NoOfChildren = this->GetModel()->GetChildren(parentItem,items);
1508 #if 0
1509 for (int i=0; i<NoOfChildren; ++i)
1510 (void) this->GetModel()->ItemAdded(parentItem,items[i]);
1511 #else
1512 (void) this->GetModel()->ItemsAdded(parentItem,items);
1513 #endif
1514 } /* wxDataViewCtrl::AddChildrenLevel(wxDataViewItem const&) */
1515
1516 void wxDataViewCtrl::FinishCustomItemEditing(void)
1517 {
1518 if (this->GetCustomRendererItem().IsOk())
1519 {
1520 this->GetCustomRendererPtr()->FinishEditing();
1521 this->SetCustomRendererItem(wxDataViewItem());
1522 this->SetCustomRendererPtr (NULL);
1523 } /* if */
1524 } /* wxDataViewCtrl::FinishCustomItemEditing(void) */
1525
1526 wxDataViewColumn* wxDataViewCtrl::GetColumnPtr(WXDataBrowserPropertyID propertyID) const
1527 {
1528 // variable definition:
1529 ColumnPointerHashMapType::const_iterator Result(this->m_ColumnPointers.find(propertyID));
1530
1531 if (Result != this->m_ColumnPointers.end())
1532 return Result->second;
1533 else
1534 return NULL;
1535 } /* wxDataViewCtrl::GetColumnPtr(DataBrowserPropertyID) const */
1536
1537 // inherited methods from wxDataViewCtrlBase
1538 void wxDataViewCtrl::DoSetExpanderColumn(void)
1539 {
1540 if (this->GetExpanderColumn() != NULL)
1541 {
1542 // variable definition and initialization:
1543 wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
1544
1545 (void) MacDataViewListCtrlPtr->SetDisclosureColumn(this->GetExpanderColumn()->GetPropertyID(),false); // second parameter explicitely passed to ensure that arrow is centered
1546 } /* if */
1547 } /* wxDataViewCtrl::DoSetExpanderColumn(void) */
1548
1549 void wxDataViewCtrl::DoSetIndent(void)
1550 {
1551 wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
1552
1553
1554 (void) MacDataViewListCtrlPtr->SetIndent(static_cast<float>(this->GetIndent()));
1555 } /* wxDataViewCtrl::DoSetIndent(void) */
1556
1557 // event handling:
1558 void wxDataViewCtrl::OnSize(wxSizeEvent& event)
1559 {
1560 unsigned int const NoOfColumns = this->GetColumnCount();
1561
1562
1563 for (unsigned int i=0; i<NoOfColumns; ++i)
1564 {
1565 // variable definition and initialization:
1566 wxDataViewColumn* dataViewColumnPtr(this->GetColumn(i));
1567
1568 if (dataViewColumnPtr != NULL)
1569 {
1570 // variable definition and initialization:
1571 wxDataViewCustomRenderer* dataViewCustomRendererPtr(dynamic_cast<wxDataViewCustomRenderer*>(dataViewColumnPtr->GetRenderer()));
1572
1573 if (dataViewCustomRendererPtr != NULL)
1574 dataViewCustomRendererPtr->SetDC(NULL); // reset DC because DC has changed
1575 } /* if */
1576 } /* for */
1577
1578 wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
1579 ControlRef ref = MacDataViewListCtrlPtr->GetControlRef();
1580 if (NoOfColumns == 1)
1581 {
1582 ::SetDataBrowserHasScrollBars( ref, false, true );
1583 ::AutoSizeDataBrowserListViewColumns( ref );
1584 }
1585 if (NoOfColumns > 1)
1586 {
1587 ::SetDataBrowserHasScrollBars( ref, true, true );
1588 }
1589
1590 event.Skip();
1591 } /* wxDataViewCtrl::OnSize(wxSizeEvent&) */
1592
1593 IMPLEMENT_DYNAMIC_CLASS(wxDataViewCtrl,wxDataViewCtrlBase)
1594
1595 BEGIN_EVENT_TABLE(wxDataViewCtrl,wxDataViewCtrlBase)
1596 EVT_SIZE(wxDataViewCtrl::OnSize)
1597 END_EVENT_TABLE()
1598
1599 #endif
1600 // !wxUSE_GENERICDATAVIEWCTRL
1601
1602 #endif
1603 // wxUSE_DATAVIEWCTRL
1604