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