]> git.saurik.com Git - wxWidgets.git/blame - src/osx/carbon/dataview.cpp
moving all dataview files to advanced
[wxWidgets.git] / src / osx / carbon / dataview.cpp
CommitLineData
489468fe 1/////////////////////////////////////////////////////////////////////////////
e86edab0
RR
2// Name: src/osx/carbon/dataview.cpp
3// Purpose: wxDataViewCtrl native carbon implementation
5829b303 4// Author:
e86edab0
RR
5// Id: $Id: dataview.cpp 58317 2009-01-23
6// Copyright: (c) 2009
489468fe
SC
7// Licence: wxWindows licence
8/////////////////////////////////////////////////////////////////////////////
9
10// For compilers that support precompilation, includes "wx.h".
11#include "wx/wxprec.h"
12
e86edab0 13#if (wxUSE_DATAVIEWCTRL == 1) && !defined(wxUSE_GENERICDATAVIEWCTRL)
489468fe
SC
14
15#ifndef WX_PRECOMP
e86edab0
RR
16 #include "wx/app.h"
17 #include "wx/toplevel.h"
18 #include "wx/font.h"
489468fe 19 #include "wx/settings.h"
e86edab0 20 #include "wx/utils.h"
489468fe
SC
21#endif
22
e86edab0
RR
23#include "wx/osx/carbon/dataview.h"
24#include "wx/osx/private.h"
25#include "wx/osx/uma.h"
489468fe
SC
26#include "wx/renderer.h"
27
e86edab0 28#include <limits>
489468fe 29
e86edab0
RR
30// ============================================================================
31// Variables used locally in dataview.cpp
32// ============================================================================
33static DataBrowserGetContextualMenuUPP gDataBrowserTableViewGetContextualMenuUPP = NULL;
34static DataBrowserItemCompareUPP gDataBrowserTableViewItemCompareUPP = NULL;
35static DataBrowserItemDataUPP gDataBrowserTableViewItemDataUPP = NULL;
36static DataBrowserItemNotificationUPP gDataBrowserTableViewItemNotificationUPP = NULL;
37
38static DataBrowserAcceptDragUPP gDataBrowserTableViewAcceptDragUPP = NULL;
39static DataBrowserAddDragItemUPP gDataBrowserTableViewAddDragItemUPP = NULL;
40static DataBrowserReceiveDragUPP gDataBrowserTableViewReceiveDragUPP = NULL;
41
42static DataBrowserDrawItemUPP gDataBrowserTableViewDrawItemUPP = NULL;
43static DataBrowserEditItemUPP gDataBrowserTableViewEditItemUPP = NULL;
44static DataBrowserHitTestUPP gDataBrowserTableViewHitTestUPP = NULL;
45static DataBrowserTrackingUPP gDataBrowserTableViewTrackingUPP = NULL;
46
47// ============================================================================
48// Functions used locally in dataview.cpp
49// ============================================================================
50static DataBrowserItemID* CreateDataBrowserItemIDArray(size_t& noOfEntries, wxDataViewItemArray const& items) // returns a newly allocated pointer to valid data browser item IDs
489468fe 51{
e86edab0 52 size_t const noOfItems = items.GetCount();
489468fe 53
e86edab0
RR
54 DataBrowserItemID* itemIDs(new DataBrowserItemID[noOfItems]);
55
56
57 // convert all valid data view items to data browser items
58 noOfEntries = 0;
59 for (size_t i=0; i<noOfItems; ++i)
60 if (items[i].IsOk())
61 {
62 itemIDs[noOfEntries] = reinterpret_cast<DataBrowserItemID>(items[i].GetID());
63 ++noOfEntries;
64 }
65 // done:
66 return itemIDs;
67}
489468fe 68
e86edab0 69static pascal OSStatus DataBrowserCtrlEventHandler(EventHandlerCallRef handler, EventRef EventReference, void* Data)
489468fe 70{
5829b303 71 wxDataViewCtrl* DataViewCtrlPtr((wxDataViewCtrl*) Data); // the 'Data' variable always contains a pointer to the data view control that installed the handler
489468fe
SC
72
73 wxMacCarbonEvent CarbonEvent(EventReference) ;
74
75
76 switch (GetEventKind(EventReference))
77 {
78 case kEventControlDraw:
79 {
80 OSStatus status;
81
82 DataViewCtrlPtr->MacSetDrawingContext(CarbonEvent.GetParameter<CGContextRef>(kEventParamCGContextRef,typeCGContextRef));
83 status = ::CallNextEventHandler(handler,EventReference);
84 DataViewCtrlPtr->MacSetDrawingContext(NULL);
85 return status;
5829b303 86 }
489468fe
SC
87 case kEventControlHit :
88 if (CarbonEvent.GetParameter<ControlPartCode>(kEventParamControlPart,typeControlPartCode) == kControlButtonPart) // we only care about the header
89 {
90 ControlRef controlReference;
91 DataBrowserPropertyID columnPropertyID;
92 unsigned long columnIndex;
93 OSStatus status;
94 wxDataViewEvent DataViewEvent(wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_CLICK,DataViewCtrlPtr->GetId());
95
96 CarbonEvent.GetParameter(kEventParamDirectObject,&controlReference);
97 // determine the column that triggered the event (this is the column that is responsible for sorting the data view):
98 status = ::GetDataBrowserSortProperty(controlReference,&columnPropertyID);
99 wxCHECK(status == noErr,status);
100 status = ::GetDataBrowserTableViewColumnPosition(controlReference,columnPropertyID,&columnIndex);
101 if (status == errDataBrowserPropertyNotFound) // user clicked into part of the header that does not have a property
102 return ::CallNextEventHandler(handler,EventReference);
103 wxCHECK(status == noErr,status);
104 // initialize wxWidget event handler:
105 DataViewEvent.SetEventObject(DataViewCtrlPtr);
106 DataViewEvent.SetColumn(columnIndex);
107 DataViewEvent.SetDataViewColumn(DataViewCtrlPtr->GetColumn(columnIndex));
108 // finally sent the equivalent wxWidget event:
489468fe 109 DataViewCtrlPtr->HandleWindowEvent(DataViewEvent);
489468fe 110 return ::CallNextEventHandler(handler,EventReference);
5829b303 111 }
489468fe
SC
112 else
113 return eventNotHandledErr;
5829b303 114 }
489468fe 115 return eventNotHandledErr;
5829b303 116}
489468fe 117
e86edab0 118static bool InitializeColumnDescription(DataBrowserListViewColumnDesc& columnDescription, wxDataViewColumn const* columnPtr, wxCFStringRef const& title)
489468fe
SC
119{
120 // set properties for the column:
e86edab0
RR
121 columnDescription.propertyDesc.propertyID = columnPtr->GetNativeData()->GetPropertyID();
122 columnDescription.propertyDesc.propertyType = columnPtr->GetRenderer()->GetNativeData()->GetPropertyType();
489468fe
SC
123 columnDescription.propertyDesc.propertyFlags = kDataBrowserListViewSelectionColumn; // make the column selectable
124 if (columnPtr->IsReorderable())
125 columnDescription.propertyDesc.propertyFlags |= kDataBrowserListViewMovableColumn;
126 if (columnPtr->IsResizeable())
127 {
128 columnDescription.headerBtnDesc.minimumWidth = 0;
129 columnDescription.headerBtnDesc.maximumWidth = 30000; // 32767 is the theoretical maximum though but 30000 looks nicer
5829b303 130 }
489468fe
SC
131 else
132 {
133 columnDescription.headerBtnDesc.minimumWidth = columnPtr->GetWidth();
134 columnDescription.headerBtnDesc.maximumWidth = columnPtr->GetWidth();
5829b303 135 }
489468fe
SC
136 if (columnPtr->IsSortable())
137 columnDescription.propertyDesc.propertyFlags |= kDataBrowserListViewSortableColumn;
e86edab0 138 if (columnPtr->GetRenderer()->GetMode() == wxDATAVIEW_CELL_EDITABLE)
489468fe
SC
139 columnDescription.propertyDesc.propertyFlags |= kDataBrowserPropertyIsEditable;
140 if ((columnDescription.propertyDesc.propertyType == kDataBrowserCustomType) ||
141 (columnDescription.propertyDesc.propertyType == kDataBrowserDateTimeType) ||
142 (columnDescription.propertyDesc.propertyType == kDataBrowserIconAndTextType) ||
143 (columnDescription.propertyDesc.propertyType == kDataBrowserTextType))
144 columnDescription.propertyDesc.propertyFlags |= kDataBrowserListViewTypeSelectColumn; // enables generally the possibility to have user input for the mentioned types
145#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
146 columnDescription.propertyDesc.propertyFlags |= kDataBrowserListViewNoGapForIconInHeaderButton;
147#endif
148 // set header's properties:
e86edab0
RR
149 columnDescription.headerBtnDesc.version = kDataBrowserListViewLatestHeaderDesc;
150 columnDescription.headerBtnDesc.titleOffset = 0;
151 columnDescription.headerBtnDesc.titleString = ::CFStringCreateCopy(kCFAllocatorDefault,title);
489468fe
SC
152 columnDescription.headerBtnDesc.initialOrder = kDataBrowserOrderIncreasing; // choose one of the orders as "undefined" is not supported anyway (s. ControlDefs.h in the HIToolbox framework)
153 columnDescription.headerBtnDesc.btnFontStyle.flags = kControlUseFontMask | kControlUseJustMask;
154 switch (columnPtr->GetAlignment())
155 {
156 case wxALIGN_CENTER:
157 case wxALIGN_CENTER_HORIZONTAL:
158 columnDescription.headerBtnDesc.btnFontStyle.just = teCenter;
159 break;
160 case wxALIGN_LEFT:
161 columnDescription.headerBtnDesc.btnFontStyle.just = teFlushLeft;
162 break;
163 case wxALIGN_RIGHT:
164 columnDescription.headerBtnDesc.btnFontStyle.just = teFlushRight;
165 break;
166 default:
167 columnDescription.headerBtnDesc.btnFontStyle.just = teFlushDefault;
5829b303 168 }
489468fe
SC
169 columnDescription.headerBtnDesc.btnFontStyle.font = kControlFontViewSystemFont;
170 columnDescription.headerBtnDesc.btnFontStyle.style = normal;
171 if (columnPtr->GetBitmap().IsOk())
172 {
173 columnDescription.headerBtnDesc.btnContentInfo.contentType = kControlContentIconRef;
489468fe 174 columnDescription.headerBtnDesc.btnContentInfo.u.iconRef = columnPtr->GetBitmap().GetIconRef();
489468fe
SC
175 }
176 else
177 {
178 // not text only as we otherwise could not add a bitmap later
179 // columnDescription.headerBtnDesc.btnContentInfo.contentType = kControlContentTextOnly;
180 columnDescription.headerBtnDesc.btnContentInfo.contentType = kControlContentIconRef;
181 columnDescription.headerBtnDesc.btnContentInfo.u.iconRef = NULL;
182 }
5829b303 183
489468fe
SC
184 // done:
185 return true;
5829b303 186}
489468fe 187
e86edab0
RR
188// ============================================================================
189// Type definitions of locally used function pointers
190// ============================================================================
191DEFINE_ONE_SHOT_HANDLER_GETTER(DataBrowserCtrlEventHandler)
489468fe 192
e86edab0
RR
193// ============================================================================
194// Helper functions for dataview implementation on OSX
195// ============================================================================
196wxWidgetImplType* CreateDataView(wxWindowMac* wxpeer, wxWindowMac* WXUNUSED(parent), wxWindowID WXUNUSED(id), wxPoint const& pos, wxSize const& size,
197 long style, long WXUNUSED(extraStyle))
489468fe 198{
e86edab0
RR
199 return new wxMacDataViewDataBrowserListViewControl(wxpeer,pos,size,style);
200}
5829b303 201
e86edab0
RR
202// ============================================================================
203// wxMacDataBrowserTableViewControl
204// ============================================================================
205pascal Boolean wxMacDataBrowserTableViewControl::DataBrowserCompareProc(ControlRef browser, DataBrowserItemID itemOneID, DataBrowserItemID itemTwoID, DataBrowserPropertyID sortProperty)
206{
207 wxMacDataBrowserTableViewControl* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl*>(wxMacControl::GetReferenceFromNativeControl(browser)));
5829b303 208
5829b303 209
e86edab0
RR
210 if (ControlPtr != NULL)
211 return ControlPtr->DataBrowserCompareProc(itemOneID,itemTwoID,sortProperty);
212 else
213 return errDataBrowserPropertyNotSupported;
214} /* wxMacDataBrowserTableViewControl::DataBrowserCompareProc(ControlRef, DataBrowserItemID, DataBrowserItemID, DataBrowserPropertyID) */
5829b303 215
e86edab0
RR
216pascal void wxMacDataBrowserTableViewControl::DataBrowserGetContextualMenuProc(ControlRef browser, MenuRef* menu, UInt32* helpType, CFStringRef* helpItemString, AEDesc* selection)
217{
218 wxMacDataBrowserTableViewControl* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl*>(wxMacControl::GetReferenceFromNativeControl(browser)));
5829b303 219
489468fe 220
e86edab0
RR
221 if (ControlPtr != NULL)
222 ControlPtr->DataBrowserGetContextualMenuProc(menu,helpType,helpItemString,selection);
223} /* wxMacDataBrowserTableViewControl::DataBrowserGetContextualMenuProc(ControlRef, MenuRef*, UInt32*, CFStringRef*, AEDesc*) */
489468fe 224
e86edab0
RR
225pascal OSStatus wxMacDataBrowserTableViewControl::DataBrowserGetSetItemDataProc(ControlRef browser, DataBrowserItemID itemID, DataBrowserPropertyID propertyID, DataBrowserItemDataRef itemData, Boolean getValue)
226{
227 wxMacDataBrowserTableViewControl* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl*>(wxMacControl::GetReferenceFromNativeControl(browser)));
5829b303 228
5829b303 229
e86edab0
RR
230 if (ControlPtr != NULL)
231 return ControlPtr->DataBrowserGetSetItemDataProc(itemID,propertyID,itemData,getValue);
232 else
233 return errDataBrowserPropertyNotSupported;
234} /* wxMacDataBrowserTableViewControl::DataBrowserGetSetItemDataProc(ControlRef, DataBrowserItemID, DataBrowserPropertyID, DataBrowserItemDataRef, Boolean) */
489468fe 235
e86edab0
RR
236pascal void wxMacDataBrowserTableViewControl::DataBrowserItemNotificationProc(ControlRef browser, DataBrowserItemID itemID, DataBrowserItemNotification message, DataBrowserItemDataRef itemData)
237{
238 wxMacDataBrowserTableViewControl* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl*>(wxMacControl::GetReferenceFromNativeControl(browser)));
489468fe 239
5829b303 240
e86edab0
RR
241 if (ControlPtr != NULL)
242 ControlPtr->DataBrowserItemNotificationProc(itemID,message,itemData);
243} /* wxMacDataBrowserTableViewControl::DataBrowserItemNotificationProc(ControlRef, DataBrowserItemID, DataBrowserItemNotification, DataBrowserItemDataRef) */
5829b303 244
e86edab0
RR
245pascal void wxMacDataBrowserTableViewControl::DataBrowserDrawItemProc(ControlRef browser, DataBrowserItemID itemID, DataBrowserPropertyID propertyID, DataBrowserItemState state, Rect const* rectangle, SInt16 bitDepth, Boolean colorDevice)
246{
247 wxMacDataBrowserTableViewControl* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl*>(wxMacControl::GetReferenceFromNativeControl(browser)));
5829b303 248
5829b303 249
e86edab0
RR
250 if (ControlPtr != NULL)
251 ControlPtr->DataBrowserDrawItemProc(itemID,propertyID,state,rectangle,bitDepth,colorDevice);
252} /* wxMacDataBrowserTableViewControl::DataBrowserDrawItemProc(ControlRef, DataBrowserItemID, DataBrowserPropertyID, DataBrowserItemState, Rect const*, SInt16, Boolean) */
5829b303 253
e86edab0
RR
254pascal Boolean wxMacDataBrowserTableViewControl::DataBrowserEditItemProc(ControlRef browser, DataBrowserItemID itemID, DataBrowserPropertyID propertyID, CFStringRef theString, Rect* maxEditTextRect, Boolean* shrinkToFit)
255{
256 wxMacDataBrowserTableViewControl* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl*>(wxMacControl::GetReferenceFromNativeControl(browser)));
5829b303 257
489468fe 258
e86edab0
RR
259 return ((ControlPtr != NULL) && ControlPtr->DataBrowserEditItemProc(itemID,propertyID,theString,maxEditTextRect,shrinkToFit));
260} /* wxMacDataBrowserTableViewControl::DataBrowserEditItemProc(ControlRef, DataBrowserItemID, DataBrowserPropertyID, CFStringRef, Rect*, Boolean*) */
5829b303 261
e86edab0
RR
262pascal Boolean wxMacDataBrowserTableViewControl::DataBrowserHitTestProc(ControlRef browser, DataBrowserItemID itemID, DataBrowserPropertyID propertyID, Rect const* theRect, Rect const* mouseRect)
263{
264 wxMacDataBrowserTableViewControl* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl*>(wxMacControl::GetReferenceFromNativeControl(browser)));
5829b303 265
5829b303 266
e86edab0
RR
267 return ((ControlPtr != NULL) && ControlPtr->DataBrowserHitTestProc(itemID,propertyID,theRect,mouseRect));
268} /* wxMacDataBrowserTableViewControl::DataBrowserHitTestProc(ControlRef, DataBrowserItemID, DataBrowserPropertyID, Rect const*, Rect const*) */
489468fe 269
e86edab0
RR
270pascal DataBrowserTrackingResult wxMacDataBrowserTableViewControl::DataBrowserTrackingProc(ControlRef browser, DataBrowserItemID itemID, DataBrowserPropertyID propertyID, Rect const* theRect, Point startPt, EventModifiers modifiers)
271{
272 wxMacDataBrowserTableViewControl* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl*>(wxMacControl::GetReferenceFromNativeControl(browser)));
489468fe 273
489468fe 274
e86edab0
RR
275 if (ControlPtr != NULL)
276 return ControlPtr->DataBrowserTrackingProc(itemID,propertyID,theRect,startPt,modifiers);
277 else
278 return kDataBrowserNothingHit;
279} /* wxMacDataBrowserTableViewControl::DataBrowserTrackingProc(ControlRef, DataBrowserItemID, DataBrowserPropertyID, Rect const*, Point, EventModifiers) */
5829b303 280
e86edab0
RR
281pascal Boolean wxMacDataBrowserTableViewControl::DataBrowserAcceptDragProc(ControlRef browser, DragReference dragRef, DataBrowserItemID itemID)
282{
283 wxMacDataBrowserTableViewControl* controlPtr(dynamic_cast<wxMacDataBrowserTableViewControl*>(wxMacControl::GetReferenceFromNativeControl(browser)));
284
285
286 return ((controlPtr != NULL) && controlPtr->DataBrowserAcceptDragProc(dragRef,itemID));
287} /* wxMacDataBrowserTableViewControl::DataBrowserAcceptDragProc(ControlRef, DragReference, DataBrowserItemID) */
5829b303 288
e86edab0
RR
289pascal Boolean wxMacDataBrowserTableViewControl::DataBrowserAddDragItemProc(ControlRef browser, DragReference dragRef, DataBrowserItemID itemID, ItemReference* itemRef)
290{
291 wxMacDataBrowserTableViewControl* controlPtr(dynamic_cast<wxMacDataBrowserTableViewControl*>(wxMacControl::GetReferenceFromNativeControl(browser)));
292
293
294 return ((controlPtr != NULL) && controlPtr->DataBrowserAddDragItemProc(dragRef,itemID,itemRef));
295} /* wxMacDataBrowserTableViewControl::DataBrowserAddDragItemProc(ControlRef, DragReference, DataBrowserItemID, ItemReference*) */
489468fe 296
e86edab0
RR
297pascal Boolean wxMacDataBrowserTableViewControl::DataBrowserReceiveDragProc(ControlRef browser, DragReference dragRef, DataBrowserItemID itemID)
298{
299 wxMacDataBrowserTableViewControl* controlPtr(dynamic_cast<wxMacDataBrowserTableViewControl*>(wxMacControl::GetReferenceFromNativeControl(browser)));
300
301
302 return ((controlPtr != NULL) && controlPtr->DataBrowserReceiveDragProc(dragRef,itemID));
303} /* wxMacDataBrowserTableViewControl::DataBrowserReceiveDragProc(ControlRef, DragReference, DataBrowserItemID) */
5829b303 304
e86edab0
RR
305wxMacDataBrowserTableViewControl::wxMacDataBrowserTableViewControl(wxWindow* peer, wxPoint const& pos, wxSize const& size, long style)
306 :wxMacControl(peer)
307{
308 Rect bounds = wxMacGetBoundsForControl(peer,pos,size);
309 OSStatus err = ::CreateDataBrowserControl(MAC_WXHWND(peer->MacGetTopLevelWindowRef()),&bounds,kDataBrowserListView,&(this->m_controlRef));
489468fe 310
489468fe 311
e86edab0
RR
312 SetReferenceInNativeControl();
313 verify_noerr(err);
314 // setup standard callbacks:
315 if (gDataBrowserTableViewGetContextualMenuUPP == NULL) gDataBrowserTableViewGetContextualMenuUPP = NewDataBrowserGetContextualMenuUPP(wxMacDataBrowserTableViewControl::DataBrowserGetContextualMenuProc);
316 if (gDataBrowserTableViewItemCompareUPP == NULL) gDataBrowserTableViewItemCompareUPP = NewDataBrowserItemCompareUPP (wxMacDataBrowserTableViewControl::DataBrowserCompareProc);
317 if (gDataBrowserTableViewItemDataUPP == NULL) gDataBrowserTableViewItemDataUPP = NewDataBrowserItemDataUPP (wxMacDataBrowserTableViewControl::DataBrowserGetSetItemDataProc);
318 if (gDataBrowserTableViewItemNotificationUPP == NULL)
489468fe 319 {
e86edab0
RR
320 gDataBrowserTableViewItemNotificationUPP =
321#if TARGET_API_MAC_OSX
322 (DataBrowserItemNotificationUPP) NewDataBrowserItemNotificationWithItemUPP(wxMacDataBrowserTableViewControl::DataBrowserItemNotificationProc);
323#else
324 NewDataBrowserItemNotificationUPP(wxMacDataBrowserTableViewControl::DataBrowserItemNotificationProc);
325#endif
5829b303 326 }
e86edab0
RR
327 // setup drag and drop callbacks:
328 if (gDataBrowserTableViewAcceptDragUPP == NULL) gDataBrowserTableViewAcceptDragUPP = NewDataBrowserAcceptDragUPP (wxMacDataBrowserTableViewControl::DataBrowserAcceptDragProc);
329 if (gDataBrowserTableViewAddDragItemUPP == NULL) gDataBrowserTableViewAddDragItemUPP = NewDataBrowserAddDragItemUPP(wxMacDataBrowserTableViewControl::DataBrowserAddDragItemProc);
330 if (gDataBrowserTableViewReceiveDragUPP == NULL) gDataBrowserTableViewReceiveDragUPP = NewDataBrowserReceiveDragUPP(wxMacDataBrowserTableViewControl::DataBrowserReceiveDragProc);
331
332 DataBrowserCallbacks callbacks; // variable definition
333
334 InitializeDataBrowserCallbacks(&callbacks,kDataBrowserLatestCallbacks);
335 callbacks.u.v1.getContextualMenuCallback = gDataBrowserTableViewGetContextualMenuUPP;
336 callbacks.u.v1.itemDataCallback = gDataBrowserTableViewItemDataUPP;
337 callbacks.u.v1.itemCompareCallback = gDataBrowserTableViewItemCompareUPP;
338 callbacks.u.v1.itemNotificationCallback = gDataBrowserTableViewItemNotificationUPP;
339 callbacks.u.v1.acceptDragCallback = gDataBrowserTableViewAcceptDragUPP;
340 callbacks.u.v1.addDragItemCallback = gDataBrowserTableViewAddDragItemUPP;
341 callbacks.u.v1.receiveDragCallback = gDataBrowserTableViewReceiveDragUPP;
342 this->SetCallbacks(&callbacks);
343
344 // setup callbacks for customized items:
345 if (gDataBrowserTableViewDrawItemUPP == NULL) gDataBrowserTableViewDrawItemUPP = NewDataBrowserDrawItemUPP(wxMacDataBrowserTableViewControl::DataBrowserDrawItemProc);
346 if (gDataBrowserTableViewEditItemUPP == NULL) gDataBrowserTableViewEditItemUPP = NewDataBrowserEditItemUPP(wxMacDataBrowserTableViewControl::DataBrowserEditItemProc);
347 if (gDataBrowserTableViewHitTestUPP == NULL) gDataBrowserTableViewHitTestUPP = NewDataBrowserHitTestUPP (wxMacDataBrowserTableViewControl::DataBrowserHitTestProc);
348 if (gDataBrowserTableViewTrackingUPP == NULL) gDataBrowserTableViewTrackingUPP = NewDataBrowserTrackingUPP(wxMacDataBrowserTableViewControl::DataBrowserTrackingProc);
349
350 DataBrowserCustomCallbacks customCallbacks; // variable definition
351
352 InitializeDataBrowserCustomCallbacks(&customCallbacks,kDataBrowserLatestCallbacks);
353 customCallbacks.u.v1.drawItemCallback = gDataBrowserTableViewDrawItemUPP;
354 customCallbacks.u.v1.editTextCallback = gDataBrowserTableViewEditItemUPP;
355 customCallbacks.u.v1.hitTestCallback = gDataBrowserTableViewHitTestUPP;
356 customCallbacks.u.v1.trackingCallback = gDataBrowserTableViewTrackingUPP;
357 this->SetCustomCallbacks(&customCallbacks);
358
359 // style setting:
360 this->EnableCellSizeModification( ((style & wxDV_VARIABLE_LINE_HEIGHT) != 0), true );
361
362 DataBrowserSelectionFlags flags; // variable definition
363
364 if (this->GetSelectionFlags(&flags) == noErr) // get default settings
489468fe 365 {
e86edab0
RR
366 if ((style & wxDV_MULTIPLE) != 0)
367 flags &= ~kDataBrowserSelectOnlyOne;
368 else
369 flags |= kDataBrowserSelectOnlyOne;
370 (void) this->SetSelectionFlags(flags);
5829b303 371 }
489468fe 372
e86edab0
RR
373 OptionBits attributes; // variable definition
374
375 if (this->GetAttributes(&attributes) == noErr) // get default settings
489468fe 376 {
e86edab0
RR
377 if ((style & wxDV_VERT_RULES) != 0)
378 attributes |= kDataBrowserAttributeListViewDrawColumnDividers;
489468fe 379 else
e86edab0
RR
380 attributes &= ~kDataBrowserAttributeListViewDrawColumnDividers;
381 if ((style & wxDV_ROW_LINES) != 0)
382 attributes |= kDataBrowserAttributeListViewAlternatingRowColors;
383 else
384 attributes &= ~kDataBrowserAttributeListViewAlternatingRowColors;
385 (void) this->SetAttributes(attributes);
5829b303 386 }
489468fe 387
e86edab0
RR
388 if ((style & wxDV_NO_HEADER) != 0)
389 this->SetHeaderButtonHeight(0);
390} /* wxMacDataBrowserTableViewControl::wxMacDataBrowserTableViewControl(wxWindow*, wxPoint const&, wxSize const&, long) */
489468fe 391
e86edab0
RR
392//
393// callback handling
394//
395OSStatus wxMacDataBrowserTableViewControl::SetCallbacks(DataBrowserCallbacks const* callbacks)
396{
397 return ::SetDataBrowserCallbacks(this->m_controlRef,callbacks);
398} /* wxMacDataBrowserTableViewControl::SetCallbacks(DataBrowserCallbacks const*) */
489468fe 399
e86edab0
RR
400OSStatus wxMacDataBrowserTableViewControl::SetCustomCallbacks(DataBrowserCustomCallbacks const* customCallbacks)
401{
402 return ::SetDataBrowserCustomCallbacks(this->m_controlRef,customCallbacks);
403} /* xMacDataBrowserTableViewControl::SetCustomCallbacks(DataBrowserCustomCallbacks const*) */
489468fe 404
e86edab0
RR
405//
406// DnD handling
407//
408OSStatus wxMacDataBrowserTableViewControl::EnableAutomaticDragTracking(bool enable)
489468fe 409{
e86edab0 410 return ::SetAutomaticControlDragTrackingEnabledForWindow(::GetControlOwner(this->m_controlRef),enable);
5829b303 411}
489468fe 412
e86edab0
RR
413//
414// header handling
415//
416OSStatus wxMacDataBrowserTableViewControl::GetHeaderDesc(DataBrowserPropertyID propertyID, DataBrowserListViewHeaderDesc* desc) const
489468fe 417{
e86edab0
RR
418 desc->version = kDataBrowserListViewLatestHeaderDesc; // if this statement is missing the next call will fail (NOT DOCUMENTED!!)
419 return ::GetDataBrowserListViewHeaderDesc(this->m_controlRef,propertyID,desc);
420}
489468fe 421
e86edab0
RR
422OSStatus wxMacDataBrowserTableViewControl::SetHeaderDesc(DataBrowserPropertyID propertyID, DataBrowserListViewHeaderDesc* desc)
423{
424 return ::SetDataBrowserListViewHeaderDesc(this->m_controlRef,propertyID,desc);
425}
489468fe 426
e86edab0
RR
427//
428// layout handling
429//
430OSStatus wxMacDataBrowserTableViewControl::AutoSizeColumns()
431{
432 return AutoSizeDataBrowserListViewColumns(this->m_controlRef);
433}
5829b303 434
e86edab0
RR
435OSStatus wxMacDataBrowserTableViewControl::EnableCellSizeModification(bool enableHeight, bool enableWidth)
436{
437 return ::SetDataBrowserTableViewGeometry(this->GetControlRef(),enableWidth,enableHeight);
438} /* wxMacDataBrowserTableViewControl::EnableCellSizeModification(bool, bool) */
5829b303 439
e86edab0
RR
440OSStatus wxMacDataBrowserTableViewControl::GetAttributes(OptionBits* attributes)
441{
442 return ::DataBrowserGetAttributes(this->GetControlRef(),attributes);
443} /* wxMacDataBrowserTableViewControl::GetAttributes(OptionBits*) */
5829b303 444
e86edab0
RR
445OSStatus wxMacDataBrowserTableViewControl::GetColumnWidth(DataBrowserPropertyID propertyID, UInt16* width) const
446{
447 return ::GetDataBrowserTableViewNamedColumnWidth(this->m_controlRef,propertyID,width);
5829b303 448}
489468fe 449
e86edab0 450OSStatus wxMacDataBrowserTableViewControl::GetDefaultColumnWidth( UInt16 *width ) const
489468fe 451{
e86edab0 452 return GetDataBrowserTableViewColumnWidth(this->m_controlRef, width );
5829b303 453}
489468fe 454
e86edab0 455OSStatus wxMacDataBrowserTableViewControl::GetDefaultRowHeight(UInt16* height) const
489468fe 456{
e86edab0 457 return ::GetDataBrowserTableViewRowHeight(this->m_controlRef,height);
5829b303 458}
489468fe 459
e86edab0 460OSStatus wxMacDataBrowserTableViewControl::GetHeaderButtonHeight(UInt16 *height)
489468fe 461{
e86edab0 462 return ::GetDataBrowserListViewHeaderBtnHeight(this->m_controlRef,height);
489468fe
SC
463}
464
e86edab0 465OSStatus wxMacDataBrowserTableViewControl::GetPartBounds(DataBrowserItemID item, DataBrowserPropertyID propertyID, DataBrowserPropertyPart part, Rect* bounds)
489468fe 466{
e86edab0
RR
467 return ::GetDataBrowserItemPartBounds(this->m_controlRef,item,propertyID,part,bounds);
468} /* wxMacDataBrowserTableViewControl::GetPartBounds(DataBrowserItemID, DataBrowswerPropertyID, DataBrowserPropertyPart, Rect*) */
489468fe 469
e86edab0 470OSStatus wxMacDataBrowserTableViewControl::GetRowHeight(DataBrowserItemID item, UInt16* height) const
489468fe 471{
e86edab0
RR
472 return ::GetDataBrowserTableViewItemRowHeight(this->m_controlRef,item,height);
473} /* wxMacDataBrowserTableViewControl::GetRowHeight(DataBrowserItemID, UInt16*) const */
489468fe 474
e86edab0 475OSStatus wxMacDataBrowserTableViewControl::GetScrollPosition( UInt32 *top , UInt32 *left ) const
489468fe 476{
e86edab0 477 return GetDataBrowserScrollPosition(this->m_controlRef, top , left );
5829b303 478}
489468fe 479
e86edab0
RR
480OSStatus wxMacDataBrowserTableViewControl::SetAttributes(OptionBits attributes)
481{
482 return ::DataBrowserChangeAttributes(this->GetControlRef(),attributes,~attributes);
483} /* wxMacDataBrowserTableViewControl::SetAttributes(OptionBits) */
484
485OSStatus wxMacDataBrowserTableViewControl::SetColumnWidth(DataBrowserPropertyID propertyID, UInt16 width)
489468fe 486{
e86edab0 487 return ::SetDataBrowserTableViewNamedColumnWidth(this->m_controlRef,propertyID,width);
5829b303 488}
489468fe 489
e86edab0
RR
490OSStatus wxMacDataBrowserTableViewControl::SetDefaultColumnWidth(UInt16 width)
491{
492 return ::SetDataBrowserTableViewColumnWidth(this->m_controlRef,width);
493}
489468fe 494
e86edab0 495OSStatus wxMacDataBrowserTableViewControl::SetDefaultRowHeight(UInt16 height)
489468fe 496{
e86edab0 497 return ::SetDataBrowserTableViewRowHeight(this->m_controlRef,height);
5829b303 498}
489468fe 499
e86edab0 500OSStatus wxMacDataBrowserTableViewControl::SetHasScrollBars(bool horiz, bool vert)
489468fe 501{
e86edab0
RR
502 return ::SetDataBrowserHasScrollBars(this->m_controlRef,horiz,vert);
503} /* wxMacDataBrowserTableViewControl::SetHasScrollBars(bool, bool) */
489468fe 504
e86edab0
RR
505OSStatus wxMacDataBrowserTableViewControl::SetHeaderButtonHeight(UInt16 height)
506{
507 return ::SetDataBrowserListViewHeaderBtnHeight(this->m_controlRef,height);
508} /* wxMacDataBrowserTableViewControl::SetHeaderButtonHeight(UInt16) */
489468fe 509
e86edab0 510OSStatus wxMacDataBrowserTableViewControl::SetHiliteStyle(DataBrowserTableViewHiliteStyle hiliteStyle)
489468fe 511{
e86edab0
RR
512 return ::SetDataBrowserTableViewHiliteStyle(this->m_controlRef,hiliteStyle);
513} /*wxMacDataBrowserTableViewControl::SetHiliteStyle(DataBrowserTableViewHiliteStyle) */
489468fe 514
e86edab0
RR
515OSStatus wxMacDataBrowserTableViewControl::SetIndent(float Indent)
516{
517 return ::DataBrowserSetMetric(this->m_controlRef,kDataBrowserMetricDisclosureColumnPerDepthGap,true,Indent);
518} /* wxMacDataBrowserTableViewControl::SetIndent(float* Indent) */
489468fe 519
e86edab0 520OSStatus wxMacDataBrowserTableViewControl::SetItemRowHeight(DataBrowserItemID item, UInt16 height)
489468fe 521{
e86edab0 522 return ::SetDataBrowserTableViewItemRowHeight(this->m_controlRef,item,height);
5829b303
VZ
523}
524
e86edab0
RR
525OSStatus wxMacDataBrowserTableViewControl::SetScrollPosition(UInt32 top, UInt32 left)
526{
527 return ::SetDataBrowserScrollPosition(this->m_controlRef,top,left);
528}
489468fe 529
e86edab0
RR
530//
531// column handling
532//
533OSStatus wxMacDataBrowserTableViewControl::GetColumnCount(UInt32* numColumns) const
489468fe 534{
e86edab0 535 return ::GetDataBrowserTableViewColumnCount(this->m_controlRef,numColumns);
489468fe
SC
536}
537
e86edab0 538OSStatus wxMacDataBrowserTableViewControl::GetColumnIndex(DataBrowserPropertyID propertyID, DataBrowserTableViewColumnIndex* index) const
489468fe 539{
e86edab0
RR
540 return ::GetDataBrowserTableViewColumnPosition(this->m_controlRef,propertyID,index);
541} /* wxMacDataBrowserTableViewControl::GetColumnIndex(DataBrowserPropertyID, DataBrowserTableViewColumnIndex*) const */
489468fe 542
e86edab0
RR
543OSStatus wxMacDataBrowserTableViewControl::GetFreePropertyID(DataBrowserPropertyID* propertyID) const
544{
545 for (*propertyID=kMinPropertyID; *propertyID<std::numeric_limits<DataBrowserPropertyID>::max(); ++(*propertyID))
546 if (this->IsUsedPropertyID(*propertyID) == errDataBrowserPropertyNotFound)
547 return noErr;
548 return errDataBrowserPropertyNotSupported;
549} /* wxMacDataBrowserTableViewControl::GetFreePropertyID(DataBrowserPropertyID*) const */
5829b303 550
e86edab0
RR
551OSStatus wxMacDataBrowserTableViewControl::GetPropertyFlags(DataBrowserPropertyID propertyID, DataBrowserPropertyFlags *flags) const
552{
553 return ::GetDataBrowserPropertyFlags(this->m_controlRef,propertyID,flags);
5829b303 554}
489468fe 555
e86edab0 556OSStatus wxMacDataBrowserTableViewControl::GetPropertyID(DataBrowserItemDataRef itemData, DataBrowserPropertyID* propertyID) const
489468fe 557{
e86edab0
RR
558 return ::GetDataBrowserItemDataProperty(itemData,propertyID);
559} /* wxMacDataBrowserTableViewControl::GetPropertyID(DataBrowserItemDataRef, DataBrowserPropertyID*) */
489468fe 560
e86edab0
RR
561OSStatus wxMacDataBrowserTableViewControl::GetPropertyID(DataBrowserTableViewColumnIndex index, DataBrowserTableViewColumnID* propertyID) const
562{
563 return ::GetDataBrowserTableViewColumnProperty(this->m_controlRef,index,propertyID);
564} /* wxMacDataBrowserTableViewControl::GetPropertyID(DataBrowserTableViewColumnIndex, DataBrowserTableViewColumnID*) */
489468fe 565
e86edab0 566OSStatus wxMacDataBrowserTableViewControl::IsUsedPropertyID(DataBrowserPropertyID propertyID) const
489468fe 567{
e86edab0
RR
568 // as the Mac interface does not provide a function that checks if the property id is in use or not a function is chosen that should not
569 // lead to a large overhead for the call but returns an error code if the property id does not exist, here we use the function that returns
570 // the column position for the property id:
571 DataBrowserTableViewColumnIndex index;
572
573 return ::GetDataBrowserTableViewColumnPosition(this->m_controlRef,propertyID,&index);
574} /* wxMacDataBrowserTableViewControl::IsUsedPropertyId(DataBrowserPropertyID) const */
489468fe 575
e86edab0 576OSStatus wxMacDataBrowserTableViewControl::RemoveColumnByProperty(DataBrowserTableViewColumnID propertyID)
489468fe 577{
e86edab0
RR
578 return ::RemoveDataBrowserTableViewColumn(this->m_controlRef,propertyID);
579} /* wxMacDataBrowserTableViewControl::RemoveColumnByProperty(DataBrowserTableViewColumnID) */
489468fe 580
e86edab0
RR
581OSStatus wxMacDataBrowserTableViewControl::RemoveColumnByIndex(DataBrowserTableViewColumnIndex index)
582{
583 DataBrowserTableViewColumnID propertyID;
5829b303 584
489468fe 585
e86edab0
RR
586 this->GetPropertyID(index,&propertyID);
587 return ::RemoveDataBrowserTableViewColumn(this->m_controlRef,propertyID);
588} /* wxMacDataBrowserTableViewControl::RemoveColumnByIndex(DataBrowserTableViewColumnIndex) */
489468fe 589
e86edab0
RR
590OSStatus wxMacDataBrowserTableViewControl::SetColumnIndex(DataBrowserPropertyID propertyID, DataBrowserTableViewColumnIndex index)
591{
592 return ::SetDataBrowserTableViewColumnPosition(this->m_controlRef,propertyID,index);
593} /* wxMacDataBrowserTableViewControl::SetColumnIndex(DataBrowserPropertyID, DataBrowserTableViewColumnIndex) */
489468fe 594
e86edab0 595OSStatus wxMacDataBrowserTableViewControl::SetDisclosureColumn(DataBrowserPropertyID propertyID, Boolean expandableRows)
489468fe 596{
e86edab0 597 return ::SetDataBrowserListViewDisclosureColumn(this->m_controlRef,propertyID,expandableRows);
5829b303 598}
489468fe 599
e86edab0
RR
600OSStatus wxMacDataBrowserTableViewControl::SetPropertyFlags(DataBrowserPropertyID propertyID, DataBrowserPropertyFlags flags)
601{
602 return ::SetDataBrowserPropertyFlags(this->m_controlRef,propertyID,flags);
603} /* wxMacDataBrowserTableViewControl::SetPropertyFlags(DataBrowserPropertyID, DataBrowserPropertyFlags) */
489468fe 604
e86edab0
RR
605//
606// item handling
607//
608OSStatus wxMacDataBrowserTableViewControl::AddItems(DataBrowserItemID container, UInt32 numItems, DataBrowserItemID const* items, DataBrowserPropertyID preSortProperty)
609{
610 return ::AddDataBrowserItems(this->m_controlRef,container,numItems,items,preSortProperty);
611} /* wxMacDataBrowserTableViewControl::AddItems(DataBrowserItemID, UInt32, DataBrowserItemID const*, DataBrowserPropertyID) */
489468fe 612
e86edab0 613OSStatus wxMacDataBrowserTableViewControl::GetFreeItemID(DataBrowserItemID* id) const
489468fe 614{
e86edab0
RR
615 ItemCount noOfItems;
616
617 OSStatus status;
618
619
620 status = this->GetItemCount(&noOfItems);
621 wxCHECK_MSG(status == noErr,status,_("Could not retrieve number of items"));
622 if (noOfItems == 0)
623 {
624 *id = 1;
625 return noErr;
626 }
627 else
628 {
629 // as there might be a lot of items in the data browser and mostly the data is added item by item the largest used ID number is roughly in the order of magnitude
630 // as the number of items; therefore, start from the number of items to look for a new ID:
631 for (*id=noOfItems; *id<std::numeric_limits<DataBrowserItemID>::max(); ++(*id))
632 if (this->IsUsedItemID(*id) == errDataBrowserItemNotFound)
633 return noErr;
634 // as the first approach was not successful, try from the beginning:
635 for (*id=0; *id<noOfItems; ++(*id))
636 if (this->IsUsedItemID(*id) == errDataBrowserItemNotFound)
637 return noErr;
638 // sorry, data browser is full:
639 return errDataBrowserItemNotAdded;
640 }
641} /* wxMacDataBrowserTableViewControl::GetFreeItemID(DataBrowserItemID*) const */
489468fe 642
e86edab0 643OSStatus wxMacDataBrowserTableViewControl::GetItemCount(DataBrowserItemID container, Boolean recurse, DataBrowserItemState state, ItemCount* numItems) const
489468fe 644{
e86edab0
RR
645 return GetDataBrowserItemCount(this->m_controlRef,container,recurse,state,numItems);
646} /* wxMacDataBrowserTableViewControl::GetItemCount(DataBrowserItemID, Boolean, DataBrowserItemState, ItemCount*) const */
489468fe 647
e86edab0 648OSStatus wxMacDataBrowserTableViewControl::GetItemID( DataBrowserTableViewRowIndex row, DataBrowserItemID * item ) const
489468fe 649{
e86edab0 650 return GetDataBrowserTableViewItemID(this->m_controlRef,row,item);
5829b303 651}
489468fe 652
e86edab0 653OSStatus wxMacDataBrowserTableViewControl::GetItems(DataBrowserItemID container, Boolean recurse, DataBrowserItemState state, Handle items) const
489468fe 654{
e86edab0
RR
655 return GetDataBrowserItems(this->m_controlRef,container,recurse,state,items);
656} /* wxMacDataBrowserTableViewControl::GetItems(DataBrowserItemID, Boolean, DataBrowserItemState, Handle) const */
489468fe 657
e86edab0 658OSStatus wxMacDataBrowserTableViewControl::GetItemRow(DataBrowserItemID item, DataBrowserTableViewRowIndex* row) const
489468fe 659{
e86edab0 660 return GetDataBrowserTableViewItemRow(this->m_controlRef,item,row);
5829b303 661}
489468fe 662
e86edab0 663OSStatus wxMacDataBrowserTableViewControl::GetItemState(DataBrowserItemID item, DataBrowserItemState* state) const
489468fe 664{
e86edab0 665 return ::GetDataBrowserItemState(this->m_controlRef,item,state);
5829b303 666}
489468fe 667
e86edab0
RR
668OSStatus wxMacDataBrowserTableViewControl::IsUsedItemID(DataBrowserItemID itemID) const
669{
670 // as the Mac interface does not provide a function that checks if the property id is in use or not a function is chosen that should not
671 // lead to a large overhead for the call but returns an error code if the property id does not exist, here we use the function that returns
672 // the column position for the property id:
673 DataBrowserTableViewColumnIndex index;
674
675 return ::GetDataBrowserTableViewItemRow(this->m_controlRef,itemID,&index);
676} /* wxMacDataBrowserTableViewControl::IsUsedItemID(DataBrowserItemID) const */
489468fe 677
e86edab0 678OSStatus wxMacDataBrowserTableViewControl::RemoveItems(DataBrowserItemID container, UInt32 numItems, DataBrowserItemID const* items, DataBrowserPropertyID preSortProperty)
489468fe 679{
e86edab0 680 return ::RemoveDataBrowserItems(this->m_controlRef,container,numItems,items,preSortProperty);
489468fe
SC
681}
682
e86edab0 683OSStatus wxMacDataBrowserTableViewControl::RevealItem(DataBrowserItemID item, DataBrowserPropertyID propertyID, DataBrowserRevealOptions options) const
489468fe 684{
e86edab0
RR
685 return ::RevealDataBrowserItem(this->m_controlRef,item,propertyID,options);
686} /* wxMacDataBrowserTableViewControl::RevealItem(DataBrowserItemID item, DataBrowserPropertyID propertyID, DataBrowserRevealOptions options) const */
489468fe 687
e86edab0
RR
688OSStatus wxMacDataBrowserTableViewControl::UpdateItems(DataBrowserItemID container, UInt32 numItems, DataBrowserItemID const* items, DataBrowserPropertyID preSortProperty,
689 DataBrowserPropertyID propertyID) const
489468fe 690{
e86edab0 691 return UpdateDataBrowserItems(this->m_controlRef,container,numItems,items,preSortProperty,propertyID);
5829b303 692}
489468fe 693
e86edab0
RR
694//
695// item selection
696//
697size_t wxMacDataBrowserTableViewControl::GetSelectedItemIDs(wxArrayDataBrowserItemID& itemIDs) const
489468fe 698{
e86edab0
RR
699 DataBrowserItemID* itemIDPtr;
700 Handle handle(::NewHandle(0));
701
702 size_t noOfItems;
489468fe 703
5829b303 704
e86edab0
RR
705 wxCHECK_MSG(this->GetItems(kDataBrowserNoItem,true,kDataBrowserItemIsSelected,handle) == noErr,0,_("Could not get selected items."));
706 noOfItems = static_cast<size_t>(::GetHandleSize(handle)/sizeof(DataBrowserItemID));
707 itemIDs.Empty();
708 itemIDs.Alloc(noOfItems);
709 HLock(handle);
710 itemIDPtr = (DataBrowserItemID*) (*handle);
711 for (size_t i=0; i<noOfItems; ++i)
489468fe 712 {
e86edab0
RR
713 itemIDs.Add(*itemIDPtr);
714 ++itemIDPtr;
715 }
716 HUnlock(handle);
717 DisposeHandle(handle);
718 return noOfItems;
719} /* wxMacDataBrowserTableViewControl::GetSelectedItemIDs(wxArrayDataBrowserItemID&) const*/
5829b303 720
e86edab0
RR
721OSStatus wxMacDataBrowserTableViewControl::GetSelectionAnchor(DataBrowserItemID* first, DataBrowserItemID* last) const
722{
723 return ::GetDataBrowserSelectionAnchor(this->m_controlRef,first,last);
724} /* wxMacDataBrowserTableViewControl::GetSelectionAnchor(DataBrowserItemID*, DataBrowserItemID*) const */
489468fe 725
e86edab0
RR
726OSStatus wxMacDataBrowserTableViewControl::GetSelectionFlags(DataBrowserSelectionFlags* flags) const
727{
728 return ::GetDataBrowserSelectionFlags(this->m_controlRef,flags);
729} /* wxMacDataBrowserTableViewControl::GetSelectionFlags(DataBrowserSelectionFlags*) const */
489468fe 730
e86edab0 731bool wxMacDataBrowserTableViewControl::IsItemSelected(DataBrowserItemID item) const
489468fe 732{
e86edab0
RR
733 return ::IsDataBrowserItemSelected(this->m_controlRef,item);
734} /* wxMacDataBrowserTableViewControl::IsItemSelected(DataBrowserItemID) const */
489468fe 735
e86edab0
RR
736OSStatus wxMacDataBrowserTableViewControl::SetSelectionFlags(DataBrowserSelectionFlags flags)
737{
738 return ::SetDataBrowserSelectionFlags(this->m_controlRef,flags);
739} /* wxMacDataBrowserTableViewControl::SetSelectionFlags(DataBrowserSelectionFlags) */
489468fe 740
e86edab0
RR
741OSStatus wxMacDataBrowserTableViewControl::SetSelectedItems(UInt32 numItems, DataBrowserItemID const* items, DataBrowserSetOption operation)
742{
743 return ::SetDataBrowserSelectedItems(this->m_controlRef, numItems, items, operation );
744} /* wxMacDataBrowserTableViewControl::SetSelectedItems(UInt32, DataBrowserItemID const*, DataBrowserSetOption) */
5829b303 745
e86edab0
RR
746OSStatus wxMacDataBrowserTableViewControl::GetSortOrder(DataBrowserSortOrder* order) const
747{
748 return ::GetDataBrowserSortOrder(this->m_controlRef,order);
749}
489468fe 750
e86edab0
RR
751OSStatus wxMacDataBrowserTableViewControl::GetSortProperty(DataBrowserPropertyID* propertyID) const
752{
753 return ::GetDataBrowserSortProperty(this->m_controlRef,propertyID);
5829b303 754}
489468fe 755
e86edab0 756OSStatus wxMacDataBrowserTableViewControl::Resort(DataBrowserItemID container, Boolean sortChildren)
489468fe 757{
e86edab0
RR
758 return ::SortDataBrowserContainer(this->m_controlRef,container,sortChildren);
759} /* wxMacDataBrowserTableViewControl::Resort(DataBrowserItemID, Boolean) */
489468fe 760
e86edab0
RR
761OSStatus wxMacDataBrowserTableViewControl::SetSortOrder(DataBrowserSortOrder order)
762{
763 return ::SetDataBrowserSortOrder(this->m_controlRef,order);
764}
5829b303 765
e86edab0
RR
766OSStatus wxMacDataBrowserTableViewControl::SetSortProperty(DataBrowserPropertyID propertyID)
767{
768 return ::SetDataBrowserSortProperty(this->m_controlRef,propertyID);
769}
5829b303 770
e86edab0
RR
771//
772// container handling
773//
774OSStatus wxMacDataBrowserTableViewControl::CloseContainer(DataBrowserItemID containerID)
775{
776 return ::CloseDataBrowserContainer(this->m_controlRef,containerID);
777} /* wxMacDataBrowserTableViewControl::CloseContainer(DataBrowserItemID) */
5829b303 778
e86edab0
RR
779OSStatus wxMacDataBrowserTableViewControl::OpenContainer(DataBrowserItemID containerID)
780{
781 return ::OpenDataBrowserContainer(this->m_controlRef,containerID);
782} /* wxMacDataBrowserTableViewControl::OpenContainer(DataBrowserItemID) */
489468fe 783
e86edab0
RR
784IMPLEMENT_ABSTRACT_CLASS(wxMacDataBrowserTableViewControl,wxMacControl)
785
786// ============================================================================
787// wxMacDataBrowserListViewControl
788// ============================================================================
789#pragma mark -
790//
791// column handling
792//
793OSStatus wxMacDataBrowserListViewControl::AddColumn(DataBrowserListViewColumnDesc *columnDesc, DataBrowserTableViewColumnIndex position)
489468fe 794{
e86edab0
RR
795 return AddDataBrowserListViewColumn(this->m_controlRef,columnDesc,position);
796} /* wxMacDataBrowserListViewControl::AddColumn(DataBrowserListViewColumnDesc*, DataBrowserTableViewColumnIndex) */
489468fe 797
e86edab0
RR
798// ============================================================================
799// wxMacDataViewDataBrowserListViewControl
800// ============================================================================
801#pragma mark -
802//
803// constructors / destructor
804//
805wxMacDataViewDataBrowserListViewControl::wxMacDataViewDataBrowserListViewControl(wxWindow* peer, wxPoint const& pos, wxSize const& size, long style)
806 :wxMacDataBrowserListViewControl(peer,pos,size,style)
807{
808 if ((style & wxBORDER_NONE) != 0)
809 this->SetData(kControlNoPart,kControlDataBrowserIncludesFrameAndFocusTag,(Boolean) false);
810 (void) this->EnableAutomaticDragTracking();
811 (void) this->SetHiliteStyle(kDataBrowserTableViewFillHilite);
812} /* wxMacDataViewDataBrowserListViewControl::wxMacDataViewDataBrowserListViewControl(wxWindow* , const wxPoint&, const wxSize&, long) */
5829b303 813
e86edab0
RR
814//
815// column related methods (inherited from wxDataViewWidgetImpl)
816//
817bool wxMacDataViewDataBrowserListViewControl::ClearColumns(void)
818{
819 UInt32 noOfColumns;
820
821
822 wxCHECK_MSG(this->GetColumnCount(&noOfColumns) == noErr,false,_("Could not determine number of columns."));
823 for (UInt32 i=0; i<noOfColumns; ++i)
824 wxCHECK_MSG(this->RemoveColumnByIndex(0) == noErr,false,_("Could not remove column."));
825 return true;
826}
5829b303 827
e86edab0
RR
828bool wxMacDataViewDataBrowserListViewControl::DeleteColumn(wxDataViewColumn* columnPtr)
829{
830 return (this->RemoveColumnByProperty(columnPtr->GetNativeData()->GetPropertyID()) == noErr);
831}
5829b303 832
e86edab0
RR
833void wxMacDataViewDataBrowserListViewControl::DoSetExpanderColumn(wxDataViewColumn const* columnPtr)
834{
835 this->SetDisclosureColumn(columnPtr->GetNativeData()->GetPropertyID(),false); // second parameter explicitely passed to ensure that arrow is centered
5829b303 836}
489468fe 837
e86edab0 838wxDataViewColumn* wxMacDataViewDataBrowserListViewControl::GetColumn(unsigned int pos) const
489468fe 839{
e86edab0
RR
840 DataBrowserPropertyID propertyID;
841
842
843 if (this->GetPropertyID(pos,&propertyID) == noErr)
844 return this->GetColumnPtr(propertyID);
489468fe 845 else
e86edab0
RR
846 return NULL;
847}
489468fe 848
e86edab0
RR
849int wxMacDataViewDataBrowserListViewControl::GetColumnPosition(wxDataViewColumn const* columnPtr) const
850{
851 if (columnPtr != NULL)
489468fe 852 {
e86edab0 853 DataBrowserTableViewColumnIndex Position;
5829b303 854
e86edab0
RR
855 wxCHECK_MSG(this->GetColumnIndex(columnPtr->GetNativeData()->GetPropertyID(),&Position) == noErr,wxNOT_FOUND,_("Could not determine column's position"));
856 return static_cast<int>(Position);
5829b303 857 }
e86edab0
RR
858 else
859 return wxNOT_FOUND;
5829b303 860}
489468fe 861
e86edab0 862bool wxMacDataViewDataBrowserListViewControl::InsertColumn(unsigned int pos, wxDataViewColumn* columnPtr)
489468fe 863{
e86edab0 864 DataBrowserListViewColumnDesc columnDescription;
489468fe 865
e86edab0 866 DataBrowserPropertyID newPropertyID;
5829b303 867
e86edab0 868 UInt32 noOfColumns;
5829b303 869
e86edab0 870 wxCFStringRef title(columnPtr->GetTitle(),m_font.Ok() ? dynamic_cast<wxDataViewCtrl*>(this->GetWXPeer())->GetFont().GetEncoding() : wxLocale::GetSystemEncoding());
489468fe 871
489468fe 872
e86edab0
RR
873 // try to get new ID for the column:
874 wxCHECK_MSG(this->GetFreePropertyID(&newPropertyID) == noErr,false,_("Cannot create new column's ID. Probably max. number of columns reached."));
875 // set native data:
876 columnPtr->GetNativeData()->SetPropertyID(newPropertyID);
877 // create a column description, add column to the native control and do some final layout adjustments:
878 wxCHECK_MSG(::InitializeColumnDescription(columnDescription,columnPtr,title), false,_("Column description could not be initialized."));
879 wxCHECK_MSG(this->AddColumn(&columnDescription,pos) == noErr, false,_("Column could not be added."));
880 wxCHECK_MSG(this->SetColumnWidth(newPropertyID,columnPtr->GetWidth()) == noErr,false,_("Column width could not be set."));
881 wxCHECK_MSG(this->GetColumnCount(&noOfColumns) == noErr, false,_("Number of columns could not be determined."));
882 if (noOfColumns == 1)
489468fe 883 {
e86edab0
RR
884 wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->GetWXPeer()));
885
886 wxCHECK_MSG(dataViewCtrlPtr != NULL,false,_("wxWidget's control not initialized."));
887 dataViewCtrlPtr->AddChildren(wxDataViewItem());
888 return true;
5829b303 889 }
e86edab0
RR
890 else
891 return this->Update(columnPtr);
5829b303 892}
489468fe 893
e86edab0
RR
894//
895// item related methods (inherited from wxDataViewWidgetImpl)
896//
897bool wxMacDataViewDataBrowserListViewControl::Add(wxDataViewItem const& parent, wxDataViewItem const& item)
489468fe 898{
e86edab0 899 DataBrowserItemID itemID(reinterpret_cast<DataBrowserItemID>(item.GetID()));
5829b303 900
5829b303 901
e86edab0
RR
902 return (( parent.IsOk() && this->AddItem(reinterpret_cast<DataBrowserItemID>(parent.GetID()),&itemID) == noErr) ||
903 (!(parent.IsOk()) && this->AddItem(kDataBrowserNoItem,&itemID) == noErr));
5829b303 904}
489468fe 905
e86edab0 906bool wxMacDataViewDataBrowserListViewControl::Add(wxDataViewItem const& parent, wxDataViewItemArray const& items)
489468fe 907{
e86edab0 908 bool noFailureFlag;
489468fe 909
e86edab0 910 DataBrowserItemID* itemIDs;
5829b303 911
e86edab0 912 size_t noOfEntries;
5829b303 913
5829b303 914
e86edab0
RR
915 // convert all valid data view items to data browser items:
916 itemIDs = ::CreateDataBrowserItemIDArray(noOfEntries,items);
917 // insert all valid items into control:
918 noFailureFlag = ((noOfEntries == 0) ||
919 !(parent.IsOk()) && (this->AddItems(kDataBrowserNoItem,noOfEntries,itemIDs,kDataBrowserItemNoProperty) == noErr) ||
920 parent.IsOk() && (this->AddItems(reinterpret_cast<DataBrowserItemID>(parent.GetID()),noOfEntries,itemIDs,kDataBrowserItemNoProperty) == noErr));
921 // give allocated array space free again:
922 delete[] itemIDs;
923 // done:
924 return noFailureFlag;
5829b303 925}
489468fe 926
e86edab0 927void wxMacDataViewDataBrowserListViewControl::Collapse(wxDataViewItem const& item)
489468fe 928{
e86edab0
RR
929 this->CloseContainer(reinterpret_cast<DataBrowserItemID>(item.GetID()));
930}
489468fe 931
e86edab0
RR
932void wxMacDataViewDataBrowserListViewControl::EnsureVisible(wxDataViewItem const& item, const wxDataViewColumn* columnPtr)
933{
934 DataBrowserPropertyID propertyID;
5829b303 935
5829b303 936
e86edab0
RR
937 if (columnPtr != NULL)
938 propertyID = columnPtr->GetNativeData()->GetPropertyID();
939 else
940 propertyID = kDataBrowserNoItem;
941 this->RevealItem(reinterpret_cast<DataBrowserItemID>(item.GetID()),propertyID,kDataBrowserRevealOnly);
5829b303 942}
489468fe 943
e86edab0 944void wxMacDataViewDataBrowserListViewControl::Expand(wxDataViewItem const& item)
9f68fe76 945{
e86edab0 946 this->OpenContainer(reinterpret_cast<DataBrowserItemID>(item.GetID()));
9f68fe76
VZ
947}
948
e86edab0 949unsigned int wxMacDataViewDataBrowserListViewControl::GetCount(void) const
9f68fe76 950{
e86edab0 951 ItemCount noOfItems;
9f68fe76 952
e86edab0
RR
953
954 wxCHECK_MSG(this->GetItemCount(&noOfItems) == noErr,0,_("Could not determine number of items"));
955 return noOfItems;
9f68fe76
VZ
956}
957
e86edab0
RR
958wxRect wxMacDataViewDataBrowserListViewControl::GetRectangle(wxDataViewItem const& item, wxDataViewColumn const* columnPtr)
959{
960 Rect MacRectangle;
961
489468fe 962
e86edab0
RR
963 if (this->GetPartBounds(reinterpret_cast<DataBrowserItemID>(item.GetID()),columnPtr->GetNativeData()->GetPropertyID(),kDataBrowserPropertyContentPart,&MacRectangle) == noErr)
964 {
965 wxRect rectangle;
489468fe 966
e86edab0
RR
967 ::wxMacNativeToRect(&MacRectangle,&rectangle);
968 return rectangle;
969 }
970 else
971 return wxRect();
489468fe
SC
972}
973
e86edab0 974bool wxMacDataViewDataBrowserListViewControl::IsExpanded(wxDataViewItem const& item) const
489468fe 975{
e86edab0
RR
976 DataBrowserItemState state;
977
978
979 return ((this->GetItemState(reinterpret_cast<DataBrowserItemID>(item.GetID()),&state) == noErr) &&
980 (state & kDataBrowserContainerIsOpen != 0));
5829b303 981}
489468fe 982
e86edab0 983bool wxMacDataViewDataBrowserListViewControl::Reload(void)
489468fe 984{
e86edab0 985 bool noFailureFlag;
489468fe 986
e86edab0 987 wxDataViewItemArray dataViewChildren;
489468fe 988
5829b303 989
e86edab0
RR
990 noFailureFlag = (this->RemoveItems() == noErr);
991 this->SetScrollPosition(0,0); // even after having removed all items the scrollbars may remain at their old position -> reset them
992 this->GetDataViewCtrl()->GetModel()->GetChildren(wxDataViewItem(),dataViewChildren);
993 this->GetDataViewCtrl()->GetModel()->ItemsAdded(wxDataViewItem(),dataViewChildren);
afe44233 994
e86edab0
RR
995 return noFailureFlag;
996}
489468fe 997
e86edab0
RR
998bool wxMacDataViewDataBrowserListViewControl::Remove(wxDataViewItem const& parent, wxDataViewItem const& item)
999{
1000 DataBrowserItemID itemID(reinterpret_cast<DataBrowserItemID>(item.GetID()));
5829b303 1001
489468fe 1002
e86edab0 1003 return (this->RemoveItem(reinterpret_cast<DataBrowserItemID>(parent.GetID()),&itemID) == noErr);
5829b303 1004}
489468fe 1005
e86edab0 1006bool wxMacDataViewDataBrowserListViewControl::Remove(wxDataViewItem const& parent, wxDataViewItemArray const& items)
636c8dab 1007{
e86edab0 1008 bool noFailureFlag;
489468fe 1009
e86edab0 1010 DataBrowserItemID* itemIDs;
489468fe 1011
e86edab0 1012 size_t noOfEntries;
5829b303 1013
489468fe 1014
e86edab0
RR
1015 // convert all valid data view items to data browser items:
1016 itemIDs = ::CreateDataBrowserItemIDArray(noOfEntries,items);
1017 // insert all valid items into control:
1018 noFailureFlag = ((noOfEntries == 0) ||
1019 !(parent.IsOk()) && (this->RemoveItems(kDataBrowserNoItem,noOfEntries,itemIDs,kDataBrowserItemNoProperty) == noErr) ||
1020 parent.IsOk() && (this->RemoveItems(reinterpret_cast<DataBrowserItemID>(parent.GetID()),noOfEntries,itemIDs,kDataBrowserItemNoProperty) == noErr));
1021 // give allocated array space free again:
1022 delete[] itemIDs;
1023 // done:
1024 return noFailureFlag;
489468fe
SC
1025}
1026
e86edab0 1027bool wxMacDataViewDataBrowserListViewControl::Update(wxDataViewColumn const* columnPtr)
489468fe 1028{
e86edab0 1029 return (this->UpdateItems(kDataBrowserNoItem,0,NULL,kDataBrowserItemNoProperty,columnPtr->GetNativeData()->GetPropertyID()) == noErr);
5829b303 1030}
489468fe 1031
e86edab0 1032bool wxMacDataViewDataBrowserListViewControl::Update(wxDataViewItem const& parent, wxDataViewItem const& item)
489468fe 1033{
e86edab0 1034 DataBrowserItemID itemID(reinterpret_cast<DataBrowserItemID>(item.GetID()));
489468fe 1035
489468fe 1036
e86edab0
RR
1037 if (parent.IsOk())
1038 return (this->UpdateItem(reinterpret_cast<DataBrowserItemID>(parent.GetID()),&itemID) == noErr);
1039 else
1040 return (this->UpdateItem(kDataBrowserNoItem,&itemID) == noErr);
1041}
489468fe 1042
e86edab0
RR
1043bool wxMacDataViewDataBrowserListViewControl::Update(wxDataViewItem const& parent, wxDataViewItemArray const& items)
1044{
1045 bool noFailureFlag;
489468fe 1046
e86edab0 1047 DataBrowserItemID* itemIDs;
489468fe 1048
e86edab0 1049 size_t noOfEntries;
489468fe 1050
489468fe 1051
e86edab0
RR
1052 // convert all valid data view items to data browser items:
1053 itemIDs = ::CreateDataBrowserItemIDArray(noOfEntries,items);
1054 if (parent.IsOk())
1055 noFailureFlag = (this->UpdateItems(reinterpret_cast<DataBrowserItemID>(parent.GetID()),noOfEntries,itemIDs,kDataBrowserItemNoProperty,kDataBrowserItemNoProperty) == noErr);
489468fe 1056 else
e86edab0
RR
1057 noFailureFlag = (this->UpdateItems(kDataBrowserNoItem,noOfEntries,itemIDs,kDataBrowserItemNoProperty,kDataBrowserItemNoProperty) == noErr);
1058 // release allocated array space:
1059 delete[] itemIDs;
489468fe 1060 // done:
e86edab0 1061 return noFailureFlag;
489468fe
SC
1062}
1063
e86edab0
RR
1064//
1065// model related methods
1066//
1067bool wxMacDataViewDataBrowserListViewControl::AssociateModel(wxDataViewModel* WXUNUSED(model))
489468fe 1068{
489468fe 1069 return true;
5829b303 1070}
489468fe 1071
e86edab0
RR
1072//
1073// selection related methods (inherited from wxDataViewWidgetImpl)
1074//
1075int wxMacDataViewDataBrowserListViewControl::GetSelections(wxDataViewItemArray& sel) const
489468fe 1076{
e86edab0 1077 size_t noOfSelectedItems;
5829b303 1078
e86edab0 1079 wxArrayDataBrowserItemID itemIDs;
5829b303 1080
5829b303 1081
e86edab0
RR
1082 noOfSelectedItems = this->GetSelectedItemIDs(itemIDs);
1083 sel.Empty();
1084 sel.SetCount(noOfSelectedItems);
1085 for (size_t i=0; i<noOfSelectedItems; ++i)
1086 sel[i] = wxDataViewItem(reinterpret_cast<void*>(itemIDs[i]));
1087 return static_cast<int>(noOfSelectedItems);
5829b303 1088}
489468fe 1089
e86edab0 1090bool wxMacDataViewDataBrowserListViewControl::IsSelected(wxDataViewItem const& item) const
489468fe 1091{
e86edab0 1092 return this->IsItemSelected(reinterpret_cast<DataBrowserItemID>(item.GetID()));
5829b303 1093}
489468fe 1094
e86edab0 1095void wxMacDataViewDataBrowserListViewControl::Select(wxDataViewItem const& item)
489468fe 1096{
e86edab0 1097 DataBrowserItemID itemID(reinterpret_cast<DataBrowserItemID>(item.GetID()));
5829b303 1098
e86edab0
RR
1099
1100 this->SetSelectedItems(1,&itemID,kDataBrowserItemsAdd);
5829b303 1101}
489468fe 1102
e86edab0 1103void wxMacDataViewDataBrowserListViewControl::SelectAll(void)
489468fe 1104{
e86edab0
RR
1105 DataBrowserItemID* itemIDPtr;
1106
1107 Handle handle(::NewHandle(0));
489468fe 1108
e86edab0 1109 size_t noOfItems;
489468fe 1110
e86edab0
RR
1111
1112 wxCHECK_RET(this->GetItems(kDataBrowserNoItem,true,kDataBrowserItemAnyState,handle) == noErr,_("Could not get items."));
1113 noOfItems = static_cast<size_t>(::GetHandleSize(handle)/sizeof(DataBrowserItemID));
1114 ::HLock(handle);
1115 itemIDPtr = (DataBrowserItemID*) (*handle);
1116 this->SetSelectedItems(noOfItems,itemIDPtr,kDataBrowserItemsAssign);
1117 ::HUnlock(handle);
1118 ::DisposeHandle(handle);
5829b303 1119}
489468fe 1120
e86edab0 1121void wxMacDataViewDataBrowserListViewControl::Unselect(wxDataViewItem const& item)
489468fe 1122{
e86edab0 1123 DataBrowserItemID itemID(reinterpret_cast<DataBrowserItemID>(item.GetID()));
a881f34e 1124
489468fe 1125
e86edab0 1126 this->SetSelectedItems(1,&itemID,kDataBrowserItemsRemove);
5829b303 1127}
489468fe 1128
e86edab0 1129void wxMacDataViewDataBrowserListViewControl::UnselectAll(void)
489468fe 1130{
e86edab0 1131 DataBrowserItemID* itemIDPtr;
5829b303 1132
e86edab0 1133 Handle handle(::NewHandle(0));
5829b303 1134
e86edab0 1135 size_t noOfItems;
489468fe 1136
e86edab0
RR
1137
1138 wxCHECK_RET(this->GetItems(kDataBrowserNoItem,true,kDataBrowserItemAnyState,handle) == noErr,_("Could not get items."));
1139 noOfItems = static_cast<size_t>(::GetHandleSize(handle)/sizeof(DataBrowserItemID));
1140 ::HLock(handle);
1141 itemIDPtr = (DataBrowserItemID*) (*handle);
1142 this->SetSelectedItems(noOfItems,itemIDPtr,kDataBrowserItemsRemove);
1143 ::HUnlock(handle);
1144 ::DisposeHandle(handle);
739a8399
RR
1145}
1146
e86edab0
RR
1147//
1148// sorting related methods
1149//
1150wxDataViewColumn* wxMacDataViewDataBrowserListViewControl::GetSortingColumn(void) const
489468fe
SC
1151{
1152 DataBrowserPropertyID propertyID;
1153
5829b303 1154
e86edab0 1155 if (this->GetSortProperty(&propertyID) == noErr)
489468fe
SC
1156 return this->GetColumnPtr(propertyID);
1157 else
1158 return NULL;
5829b303 1159}
489468fe 1160
e86edab0 1161void wxMacDataViewDataBrowserListViewControl::Resort(void)
489468fe 1162{
e86edab0 1163 (void) this->Resort();
5829b303 1164}
489468fe 1165
e86edab0
RR
1166//
1167// other methods (inherited from wxDataViewWidgetImpl)
1168//
1169void wxMacDataViewDataBrowserListViewControl::HitTest(wxPoint const& point, wxDataViewItem& item, wxDataViewColumn*& columnPtr) const
489468fe 1170{
e86edab0
RR
1171 // not yet implemented:
1172 item = wxDataViewItem();
1173 columnPtr = NULL;
5829b303 1174}
489468fe 1175
e86edab0 1176void wxMacDataViewDataBrowserListViewControl::DoSetIndent(int indent)
489468fe 1177{
e86edab0 1178 this->SetIndent(static_cast<float>(indent));
5829b303 1179}
489468fe 1180
e86edab0 1181void wxMacDataViewDataBrowserListViewControl::SetRowHeight(wxDataViewItem const& item, unsigned int height)
489468fe 1182{
e86edab0 1183 this->SetItemRowHeight(reinterpret_cast<DataBrowserItemID>(item.GetID()),static_cast<UInt16>(height));
5829b303 1184}
489468fe 1185
e86edab0 1186void wxMacDataViewDataBrowserListViewControl::OnSize(void)
489468fe 1187{
e86edab0
RR
1188 UInt32 noOfColumns;
1189
1190
1191 this->GetColumnCount(&noOfColumns);
1192 if (noOfColumns <= 1) // no horizontal scroll bar and the only column expands to the width of the whole control
1193 {
1194 this->SetHasScrollBars(false,true);
1195 this->AutoSizeColumns();
1196 }
1197 else // otherwise keep the current column size and have scrollbars in both directions
1198 this->SetHasScrollBars(true,true);
5829b303 1199}
489468fe 1200
e86edab0
RR
1201//
1202// callback functions (inherited from wxMacDataBrowserTableViewControl)
1203//
1204Boolean wxMacDataViewDataBrowserListViewControl::DataBrowserCompareProc(DataBrowserItemID itemOneID, DataBrowserItemID itemTwoID, DataBrowserPropertyID sortProperty)
489468fe 1205{
e86edab0 1206 DataBrowserSortOrder sortOrder;
5829b303 1207
e86edab0
RR
1208 DataBrowserTableViewColumnIndex modelColumnIndex;
1209
1210 wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->GetWXPeer()));
1211
5829b303 1212
e86edab0
RR
1213 wxCHECK_MSG(dataViewCtrlPtr != NULL, false,_("Pointer to data view control not set correctly."));
1214 wxCHECK_MSG(dataViewCtrlPtr->GetModel() != NULL,false,_("Pointer to model not set correctly."));
1215 if (sortProperty >= kMinPropertyID)
1216 {
1217 // variable definition and initialization:
1218 wxDataViewColumn* ColumnPtr(this->GetColumnPtr(sortProperty));
1219
1220 wxCHECK_MSG(ColumnPtr != NULL,false,_("Could not determine column index."));
1221 modelColumnIndex = ColumnPtr->GetModelColumn();
1222 }
1223 else
1224 modelColumnIndex = 0;
1225 this->GetSortOrder(&sortOrder);
1226 return static_cast<Boolean>(dataViewCtrlPtr->GetModel()->Compare(wxDataViewItem(reinterpret_cast<void*>(itemOneID)),wxDataViewItem(reinterpret_cast<void*>(itemTwoID)),
1227 modelColumnIndex,sortOrder != kDataBrowserOrderDecreasing) < 0);
1228} /* wxMacDataViewDataBrowserListViewControl::DataBrowserCompareProc(DataBrowserItemID, DataBrowserItemID, DataBrowserPropertyID) */
489468fe 1229
e86edab0
RR
1230void wxMacDataViewDataBrowserListViewControl::DataBrowserGetContextualMenuProc(MenuRef* menu, UInt32* helpType, CFStringRef* helpItemString, AEDesc* WXUNUSED(selection))
1231 // In this method we do not supply a contextual menu handler at all but only send a wxEVT_COMMAND_DATAVIEW_ITEM_CONTEXT_MENU.
489468fe 1232{
e86edab0 1233 wxArrayDataBrowserItemID itemIDs;
5829b303 1234
e86edab0 1235 wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->GetWXPeer()));
5829b303 1236
5829b303 1237
e86edab0
RR
1238 wxCHECK_RET(dataViewCtrlPtr != NULL,_("wxWidget control pointer is not a data view pointer"));
1239 // initialize parameters so that no context menu will be displayed automatically by the native data browser:
1240 *menu = NULL;
1241 *helpType = kCMHelpItemNoHelp;
1242 *helpItemString = NULL;
1243 // create information for a context menu event:
1244 wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_CONTEXT_MENU,dataViewCtrlPtr->GetId());
5829b303 1245
e86edab0
RR
1246 dataViewEvent.SetEventObject(dataViewCtrlPtr);
1247 dataViewEvent.SetModel(dataViewCtrlPtr->GetModel());
1248 // get the item information;
1249 // theoretically more than one ID can be returned but the event can only handle one item, therefore all item related data is using the data of the first item in the array:
1250 if (this->GetSelectedItemIDs(itemIDs) > 0)
1251 dataViewEvent.SetItem(wxDataViewItem(reinterpret_cast<void*>(itemIDs[0])));
1252 // finally send the equivalent wxWidget event:
1253 dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
1254} /* wxMacDataViewDataBrowserListViewControl::DataBrowserGetContextualMenuProc(MenuRef*, UInt32*, CFStringRef*, AEDesc*) */
489468fe 1255
e86edab0 1256OSStatus wxMacDataViewDataBrowserListViewControl::DataBrowserGetSetItemDataProc(DataBrowserItemID itemID, DataBrowserPropertyID propertyID, DataBrowserItemDataRef itemData, Boolean getValue)
489468fe 1257{
e86edab0 1258 if (getValue)
489468fe 1259 {
e86edab0
RR
1260 // variable definitions:
1261 wxDataViewCtrl* dataViewCtrlPtr;
1262
1263 dataViewCtrlPtr = dynamic_cast<wxDataViewCtrl*>(this->GetWXPeer());
1264 wxCHECK_MSG(dataViewCtrlPtr != NULL,errDataBrowserNotConfigured,_("Pointer to data view control not set correctly."));
1265 if (dataViewCtrlPtr->IsDeleting())
1266 return noErr; // if a delete process is running the data of editable fields cannot be saved because the associated model variable may already have been deleted
1267 else
1268 {
1269 // variable definitions:
1270 OSStatus errorStatus;
1271 wxDataViewColumn* dataViewColumnPtr;
1272
1273 wxCHECK_MSG(dataViewCtrlPtr->GetModel() != NULL,errDataBrowserNotConfigured,_("Pointer to model not set correctly."));
1274 dataViewColumnPtr = this->GetColumnPtr(propertyID);
1275 wxCHECK_MSG((dataViewColumnPtr != NULL) && (dataViewColumnPtr->GetRenderer() != NULL),errDataBrowserNotConfigured,_("There is no column or renderer for the specified column index."));
1276
1277 wxDataViewItem dvItem(reinterpret_cast<void*>(itemID));
1278 unsigned int col = dataViewColumnPtr->GetModelColumn();
1279
1280 switch (dataViewColumnPtr->GetRenderer()->GetNativeData()->GetPropertyType())
1281 {
1282 case kDataBrowserCheckboxType:
1283 {
1284 // variable definition:
1285 ThemeButtonValue buttonValue;
5829b303 1286
e86edab0
RR
1287 errorStatus = ::GetDataBrowserItemDataButtonValue(itemData,&buttonValue);
1288 if (errorStatus == noErr)
1289 {
1290 if (buttonValue == kThemeButtonOn)
1291 {
1292 // variable definition and initialization:
1293 wxVariant modifiedData(true);
1294
1295 if (dataViewCtrlPtr->GetModel()->SetValue(modifiedData, dvItem, col) &&
1296 dataViewCtrlPtr->GetModel()->ValueChanged(dvItem, col))
1297 return noErr;
1298 else
1299 return errDataBrowserInvalidPropertyData;
1300 }
1301 else if (buttonValue == kThemeButtonOff)
1302 {
1303 // variable definition and initialization:
1304 wxVariant modifiedData(false);
1305
1306 if (dataViewCtrlPtr->GetModel()->SetValue(modifiedData, dvItem, col) &&
1307 dataViewCtrlPtr->GetModel()->ValueChanged(dvItem, col))
1308 return noErr;
1309 else
1310 return errDataBrowserInvalidPropertyData;
1311 }
1312 else
1313 return errDataBrowserInvalidPropertyData;
1314 }
1315 else
1316 return errorStatus;
1317 } /* block */
1318 case kDataBrowserTextType:
1319 {
1320 // variable definitions:
1321 CFStringRef stringReference;
1322
1323 errorStatus = ::GetDataBrowserItemDataText(itemData,&stringReference);
1324 if (errorStatus == noErr)
1325 {
1326 // variable definitions and initializations:
1327#if wxCHECK_VERSION(2,9,0)
1328 wxCFStringRef modifiedString(stringReference);
1329#else
1330 wxMacCFStringHolder modifiedString(stringReference);
1331#endif
1332 wxVariant modifiedData(modifiedString.AsString());
1333
1334 if (dataViewCtrlPtr->GetModel()->SetValue(modifiedData, dvItem, col) &&
1335 dataViewCtrlPtr->GetModel()->ValueChanged(dvItem, col))
1336 return noErr;
1337 else
1338 return errDataBrowserInvalidPropertyData;
1339 }
1340 else
1341 return errorStatus;
1342 } /* block */
1343 default:
1344 return errDataBrowserPropertyNotSupported;
1345 }
1346 }
5829b303 1347 }
e86edab0
RR
1348 else
1349 {
1350 if (propertyID >= kMinPropertyID) // in case data columns set the data
1351 {
1352 // variable definitions:
1353 wxVariant variant;
1354 wxDataViewColumn* dataViewColumnPtr;
1355 wxDataViewCtrl* dataViewCtrlPtr;
1356
1357 dataViewCtrlPtr = dynamic_cast<wxDataViewCtrl*>(this->GetWXPeer());
1358 wxCHECK_MSG(dataViewCtrlPtr != NULL,errDataBrowserNotConfigured,_("Pointer to data view control not set correctly."));
1359 wxCHECK_MSG(dataViewCtrlPtr->GetModel() != NULL,errDataBrowserNotConfigured,_("Pointer to model not set correctly."));
1360 dataViewColumnPtr = this->GetColumnPtr(propertyID);
1361 wxCHECK_MSG(dataViewColumnPtr != NULL,errDataBrowserNotConfigured,_("No column for the specified column position existing."));
1362 wxCHECK_MSG(dataViewColumnPtr->GetRenderer() != NULL,errDataBrowserNotConfigured,_("No renderer specified for column."));
1363 dataViewCtrlPtr->GetModel()->GetValue(variant,wxDataViewItem(reinterpret_cast<void*>(itemID)),dataViewColumnPtr->GetModelColumn());
1364 if (!(variant.IsNull()))
1365 {
1366 dataViewColumnPtr->GetRenderer()->GetNativeData()->SetItemDataRef(itemData);
1367 dataViewColumnPtr->GetRenderer()->SetValue(variant);
1368 wxCHECK_MSG(dataViewColumnPtr->GetRenderer()->Render(),errDataBrowserNotConfigured,_("Rendering failed."));
1369 }
1370 return noErr;
1371 }
1372 else // react on special system requests
1373 {
1374 switch (propertyID)
1375 {
1376 case kDataBrowserContainerIsClosableProperty:
1377 {
1378 // variable definitions:
1379 wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->GetWXPeer()));
1380
1381 wxCHECK_MSG(dataViewCtrlPtr != NULL,errDataBrowserNotConfigured,_("Pointer to data view control not set correctly."));
1382 // initialize wxWidget event:
1383 wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSING,dataViewCtrlPtr->GetId()); // variable definition
1384
1385 dataViewEvent.SetEventObject(dataViewCtrlPtr);
1386 dataViewEvent.SetItem (wxDataViewItem(reinterpret_cast<void*>(itemID)));
1387 dataViewEvent.SetModel (dataViewCtrlPtr->GetModel());
1388 // finally send the equivalent wxWidget event:
1389 dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
1390 // opening the container is allowed if not vetoed:
1391 return ::SetDataBrowserItemDataBooleanValue(itemData,dataViewEvent.IsAllowed());
1392 } /* block */
1393 case kDataBrowserContainerIsOpenableProperty:
1394 {
1395 // variable definitions:
1396 wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->GetWXPeer()));
1397
1398 wxCHECK_MSG(dataViewCtrlPtr != NULL,errDataBrowserNotConfigured,_("Pointer to data view control not set correctly."));
1399 // initialize wxWidget event:
1400 wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDING,dataViewCtrlPtr->GetId()); // variable definition
1401
1402 dataViewEvent.SetEventObject(dataViewCtrlPtr);
1403 dataViewEvent.SetItem (wxDataViewItem(reinterpret_cast<void*>(itemID)));
1404 dataViewEvent.SetModel (dataViewCtrlPtr->GetModel());
1405 // finally send the equivalent wxWidget event:
1406 dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
1407 // opening the container is allowed if not vetoed:
1408 return ::SetDataBrowserItemDataBooleanValue(itemData,dataViewEvent.IsAllowed());
1409 } /* block */
1410 case kDataBrowserItemIsContainerProperty:
1411 {
1412 // variable definition:
1413 wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->GetWXPeer()));
1414
1415 wxCHECK_MSG(dataViewCtrlPtr != NULL,errDataBrowserNotConfigured,_("Pointer to data view control not set correctly."));
1416 wxCHECK_MSG(dataViewCtrlPtr->GetModel() != NULL,errDataBrowserNotConfigured,_("Pointer to model not set correctly."));
1417 return ::SetDataBrowserItemDataBooleanValue(itemData,dataViewCtrlPtr->GetModel()->IsContainer(wxDataViewItem(reinterpret_cast<void*>(itemID))));
1418 } /* block */
1419 case kDataBrowserItemIsEditableProperty:
1420 return ::SetDataBrowserItemDataBooleanValue(itemData,true);
1421 }
1422 }
1423 }
1424 return errDataBrowserPropertyNotSupported;
1425} /* wxMacDataViewDataBrowserListViewControl::DataBrowserGetSetItemDataProc(DataBrowserItemID, DataBrowserPropertyID, DataBrowserItemDataRef, Boolean) */
489468fe 1426
e86edab0 1427void wxMacDataViewDataBrowserListViewControl::DataBrowserItemNotificationProc(DataBrowserItemID itemID, DataBrowserItemNotification message, DataBrowserItemDataRef itemData)
489468fe 1428{
e86edab0 1429 wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->GetWXPeer()));
489468fe 1430
489468fe 1431
e86edab0
RR
1432 // check if the data view control pointer still exists because this call back function can still be called when the control has already been deleted:
1433 if (dataViewCtrlPtr != NULL)
1434 switch (message)
4219d8b0 1435 {
e86edab0
RR
1436 case kDataBrowserContainerClosed:
1437 dataViewCtrlPtr->FinishCustomItemEditing(); // stop editing of a custom item first (if necessary)
4219d8b0 1438 {
e86edab0
RR
1439 // initialize wxWidget event:
1440 wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSED,dataViewCtrlPtr->GetId()); // variable definition
1441
1442 dataViewEvent.SetEventObject(dataViewCtrlPtr);
1443 dataViewEvent.SetItem(wxDataViewItem(reinterpret_cast<void*>(itemID)));
1444 // finally send the equivalent wxWidget event:
1445 dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
1446 } /* block */
1447 break;
1448 case kDataBrowserContainerOpened:
1449 dataViewCtrlPtr->FinishCustomItemEditing(); // stop editing of a custom item first (if necessary)
1450 {
1451 // initialize wxWidget event:
1452 wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDED,dataViewCtrlPtr->GetId()); // variable definition
1453
1454 dataViewEvent.SetEventObject(dataViewCtrlPtr);
1455 dataViewEvent.SetItem(wxDataViewItem(reinterpret_cast<void*>(itemID)));
1456 // finally send the equivalent wxWidget event:
1457 dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
1458 // add children to the expanded container:
1459 dataViewCtrlPtr->AddChildren(wxDataViewItem(reinterpret_cast<void*>(itemID)));
1460 } /* block */
1461 break;
1462 case kDataBrowserEditStarted:
1463 dataViewCtrlPtr->FinishCustomItemEditing(); // stop editing of a custom item first (if necessary)
1464 {
1465 // initialize wxWidget event:
1466 DataBrowserPropertyID propertyID;
1467 wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_STARTED,dataViewCtrlPtr->GetId()); // variable definition
1468
1469 dataViewEvent.SetEventObject(dataViewCtrlPtr);
1470 dataViewEvent.SetItem(wxDataViewItem(reinterpret_cast<void*>(itemID)));
1471 if (this->GetPropertyID(itemData,&propertyID) == noErr)
1472 {
1473 // variable definition and initialization:
1474 DataBrowserTableViewColumnIndex columnIndex;
1475
1476 wxCHECK_RET(this->GetColumnIndex(propertyID,&columnIndex),_("Column index not found."));
1477 dataViewEvent.SetColumn(columnIndex);
1478 dataViewEvent.SetDataViewColumn(this->GetColumnPtr(propertyID));
1479 }
1480 // finally send the equivalent wxWidget event:
1481 dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
1482 } /* block */
1483 break;
1484 case kDataBrowserEditStopped:
1485 {
1486 // initialize wxWidget event:
1487 DataBrowserPropertyID propertyID;
1488 wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE,dataViewCtrlPtr->GetId()); // variable definition
1489
1490 dataViewEvent.SetEventObject(dataViewCtrlPtr);
1491 dataViewEvent.SetItem(wxDataViewItem(reinterpret_cast<void*>(itemID)));
1492 if (this->GetPropertyID(itemData,&propertyID) == noErr)
1493 {
1494 // variable definition and initialization:
1495 DataBrowserTableViewColumnIndex columnIndex;
1496
1497 wxCHECK_RET(this->GetColumnIndex(propertyID,&columnIndex),_("Column index not found."));
1498 dataViewEvent.SetColumn(columnIndex);
1499 dataViewEvent.SetDataViewColumn(this->GetColumnPtr(propertyID));
1500 }
1501 // finally send the equivalent wxWidget event:
1502 dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
1503 } /* block */
1504 break;
1505 case kDataBrowserItemAdded:
1506 dataViewCtrlPtr->FinishCustomItemEditing();
1507 break;
1508 case kDataBrowserItemDeselected:
1509 dataViewCtrlPtr->FinishCustomItemEditing();
1510 break;
1511 case kDataBrowserItemDoubleClicked:
1512 {
1513 // initialize wxWidget event:
1514 wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_ACTIVATED,dataViewCtrlPtr->GetId()); // variable definition
1515
1516 dataViewEvent.SetEventObject(dataViewCtrlPtr);
1517 dataViewEvent.SetItem(wxDataViewItem(reinterpret_cast<void*>(itemID)));
1518 // finally send the equivalent wxWidget event:
1519 dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
1520 } /* block */
1521 break;
1522 case kDataBrowserItemRemoved:
1523 dataViewCtrlPtr->FinishCustomItemEditing(); // stop editing of a custom item first (if necessary)
1524 break;
1525 case kDataBrowserItemSelected:
1526 break; // not implemented by wxWidgets; see kDataBrowserSelectionSetChanged
1527 case kDataBrowserSelectionSetChanged:
1528 {
1529 // initialize wxWidget event:
1530 wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_SELECTION_CHANGED,dataViewCtrlPtr->GetId()); // variable definition
1531
1532 dataViewEvent.SetEventObject(dataViewCtrlPtr);
1533 dataViewEvent.SetModel (dataViewCtrlPtr->GetModel());
1534 // finally send the equivalent wxWidget event:
1535 dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
1536 } /* block */
1537 break;
1538 case kDataBrowserTargetChanged: // no idea if this notification is ever sent
1539 break;
1540 case kDataBrowserUserStateChanged:
1541 {
1542 // finish custom item editing if necessary:
1543 dataViewCtrlPtr->FinishCustomItemEditing();
1544 // update column widths:
1545 for (size_t i=0; i<dataViewCtrlPtr->GetColumnCount(); ++i)
1546 {
1547 // constant definition for abbreviational purposes:
1548 wxDataViewColumn* const columnPtr = dataViewCtrlPtr->GetColumnPtr(i);
1549 // variable definition:
1550 UInt16 columnWidth;
1551
1552 wxCHECK_RET(this->GetColumnWidth(columnPtr->GetNativeData()->GetPropertyID(),&columnWidth) == noErr,_("Column width could not be determined"));
1553 columnPtr->SetWidthVariable(columnWidth);
1554 }
1555 // update sorting orders:
1556 DataBrowserPropertyID propertyID; // variable definition
1557
1558 if ((this->GetSortProperty(&propertyID) == noErr) && (propertyID >= kMinPropertyID))
1559 {
1560 DataBrowserSortOrder sortOrder;
1561 DataBrowserTableViewColumnIndex columnIndex;
1562
1563 if ((this->GetSortOrder(&sortOrder) == noErr) && (this->GetColumnIndex(propertyID,&columnIndex) == noErr))
1564 {
1565 // variable definition and initialization:
1566 wxDataViewColumn* columnPtr;
1567 columnPtr = dataViewCtrlPtr->GetColumn(columnIndex);
1568 // check if the sort order has changed:
1569 if ( columnPtr->IsSortOrderAscending() && (sortOrder == kDataBrowserOrderDecreasing) ||
1570 !(columnPtr->IsSortOrderAscending()) && (sortOrder == kDataBrowserOrderIncreasing))
1571 {
1572 columnPtr->SetSortOrder(!(columnPtr->IsSortOrderAscending()));
1573 // initialize wxWidget event:
1574 wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_COLUMN_SORTED,dataViewCtrlPtr->GetId()); // variable defintion
1575
1576 dataViewEvent.SetEventObject(dataViewCtrlPtr);
1577 dataViewEvent.SetColumn(columnIndex);
1578 dataViewEvent.SetDataViewColumn(columnPtr);
1579 // finally send the equivalent wxWidget event:
1580 dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
1581 }
1582 }
1583 }
1584 } /* block */
1585 break;
4219d8b0 1586 }
e86edab0 1587} /* wxMacDataViewDataBrowserListViewControl::DataBrowserItemNotificationProc(DataBrowserItemID, DataBrowserItemNotification, DataBrowserItemDataRef) */
5829b303 1588
e86edab0
RR
1589void wxMacDataViewDataBrowserListViewControl::DataBrowserDrawItemProc(DataBrowserItemID itemID, DataBrowserPropertyID propertyID, DataBrowserItemState state, Rect const* rectangle, SInt16 bitDepth, Boolean colorDevice)
1590{
1591 DataBrowserTableViewColumnIndex columnIndex;
5829b303 1592
e86edab0 1593 wxDataViewColumn* dataViewColumnPtr;
489468fe 1594
e86edab0
RR
1595 wxDataViewCtrl* dataViewCtrlPtr;
1596
1597 wxDataViewCustomRenderer* dataViewCustomRendererPtr;
1598
1599 wxVariant dataToRender;
1600
1601 dataViewCtrlPtr = dynamic_cast<wxDataViewCtrl*>(this->GetWXPeer());
1602 wxCHECK_RET(dataViewCtrlPtr != NULL, _("Pointer to data view control not set correctly."));
1603 wxCHECK_RET(dataViewCtrlPtr->GetModel() != NULL, _("Pointer to model not set correctly."));
1604 wxCHECK_RET(this->GetColumnIndex(propertyID,&columnIndex) == noErr,_("Could not determine column index."));
1605 dataViewColumnPtr = this->GetColumnPtr(propertyID);
1606 wxCHECK_RET(dataViewColumnPtr != NULL,_("No column for the specified column existing."));
1607 dataViewCustomRendererPtr = dynamic_cast<wxDataViewCustomRenderer*>(dataViewColumnPtr->GetRenderer());
1608 wxCHECK_RET(dataViewCustomRendererPtr != NULL,_("No renderer or invalid renderer type specified for custom data column."));
1609 dataViewCtrlPtr->GetModel()->GetValue(dataToRender,wxDataViewItem(reinterpret_cast<void*>(itemID)),dataViewColumnPtr->GetModelColumn());
1610 dataViewCustomRendererPtr->SetValue(dataToRender);
1611
1612 wxDataViewItem dataItem( reinterpret_cast<void*>(itemID) );
1613 dataViewCtrlPtr->GetModel()->GetValue(dataToRender,dataItem,dataViewColumnPtr->GetModelColumn());
1614 dataViewCustomRendererPtr->SetValue(dataToRender);
1615
1616 // try to determine the content's size (drawable part):
1617 Rect content;
1618 RgnHandle rgn(NewRgn());
1619 UInt16 headerHeight;
1620
1621 if (GetControlRegion(m_controlRef,kControlContentMetaPart,rgn) == noErr)
1622 GetRegionBounds(rgn,&content);
1623 else
1624 GetControlBounds(m_controlRef, &content);
1625 ::DisposeRgn(rgn);
1626 // space for the header
1627 this->GetHeaderButtonHeight(&headerHeight);
1628 content.top += headerHeight;
1629 // extra space for the frame (todo: do not how to determine the space automatically from the control)
1630 content.top += 5;
1631 content.left += 5;
1632 content.right -= 3;
1633 content.bottom -= 3;
1634 // extra space for the scrollbars:
1635 content.bottom -= wxSystemSettings::GetMetric(wxSYS_HSCROLL_Y);
1636 content.right -= wxSystemSettings::GetMetric(wxSYS_VSCROLL_X);
1637
1638 wxDC *dc = dataViewCustomRendererPtr->GetDC();
1639
1640 wxRect cellrect( static_cast<int>(rectangle->left),
1641 static_cast<int>(rectangle->top),
1642 static_cast<int>(1+rectangle->right-rectangle->left),
1643 static_cast<int>(rectangle->bottom-rectangle->top) );
1644
1645 bool is_active = IsControlActive( this->m_controlRef );
1646 if (state == kDataBrowserItemIsSelected)
489468fe 1647 {
e86edab0
RR
1648
1649 wxColour col( wxMacCreateCGColorFromHITheme( (is_active) ?
1650 kThemeBrushAlternatePrimaryHighlightColor
1651 : kThemeBrushSecondaryHighlightColor ) );
1652
1653 wxRect rect = cellrect;
1654 Rect itemrect;
1655 GetDataBrowserItemPartBounds( this->m_controlRef, itemID, propertyID,
1656 kDataBrowserPropertyEnclosingPart, &itemrect );
1657 rect.x = itemrect.left;
1658 rect.width = itemrect.right-itemrect.left+1;
1659
1660 wxBrush selBrush( col );
1661 wxPen oldpen( dc->GetPen() );
1662 wxBrush oldbrush( dc->GetBrush() );
1663 dc->SetPen( *wxTRANSPARENT_PEN );
1664 dc->SetBrush( selBrush );
1665 dc->DrawRectangle(rect);
1666 dc->SetBrush( oldbrush );
1667 dc->SetPen( oldpen );
1668 }
5829b303 1669
e86edab0
RR
1670 wxDataViewModel *model = dataViewCtrlPtr->GetModel();
1671 if ((columnIndex == 0) || !model->IsContainer(dataItem) || model->HasContainerColumns(dataItem))
1672 {
1673 // make sure that 'Render' can draw only in the allowed area:
1674 dc->SetClippingRegion(content.left,content.top,content.right-content.left+1,content.bottom-content.top+1);
1675 (void) (dataViewCustomRendererPtr->Render( cellrect, dc,
1676 ((state == kDataBrowserItemIsSelected) ? wxDATAVIEW_CELL_SELECTED : 0)));
1677 dc->DestroyClippingRegion(); // probably not necessary
5829b303 1678 }
e86edab0
RR
1679
1680 dataViewCustomRendererPtr->SetDC(NULL);
1681} /* wxMacDataViewDataBrowserListViewControl::DataBrowserDrawItemProc(DataBrowserItemID, DataBrowserPropertyID, DataBrowserItemState, Rect const*, SInt16, Boolean) */
489468fe 1682
e86edab0 1683Boolean wxMacDataViewDataBrowserListViewControl::DataBrowserEditItemProc(DataBrowserItemID itemID, DataBrowserPropertyID propertyID, CFStringRef theString, Rect* maxEditTextRect, Boolean* shrinkToFit)
489468fe 1684{
e86edab0
RR
1685 return false;
1686} /* wxMacDataViewDataBrowserListViewControl::DataBrowserEditItemProc(DataBrowserItemID, DataBrowserPropertyID, CFStringRef, Rect*, Boolean*) */
5829b303 1687
e86edab0
RR
1688Boolean wxMacDataViewDataBrowserListViewControl::DataBrowserHitTestProc(DataBrowserItemID WXUNUSED(itemID), DataBrowserPropertyID WXUNUSED(property), Rect const* WXUNUSED(theRect), Rect const* WXUNUSED(mouseRect))
1689{
1690 return true;
1691} /* wxMacDataViewDataBrowserListViewControl::DataBrowserHitTestProc(DataBrowserItemID, DataBrowserPropertyID, Rect const*, Rect const*) */
5829b303 1692
e86edab0
RR
1693DataBrowserTrackingResult wxMacDataViewDataBrowserListViewControl::DataBrowserTrackingProc(DataBrowserItemID itemID, DataBrowserPropertyID propertyID, Rect const* theRect, Point WXUNUSED(startPt), EventModifiers WXUNUSED(modifiers))
1694{
1695 wxDataViewColumn* dataViewColumnPtr;
5829b303 1696
e86edab0
RR
1697 wxDataViewCtrl* dataViewCtrlPtr;
1698
1699 wxDataViewCustomRenderer* dataViewCustomRendererPtr;
1700
1701 wxDataViewItem dataViewCustomRendererItem;
1702
1703
1704 dataViewCtrlPtr = dynamic_cast<wxDataViewCtrl*>(this->GetWXPeer());
1705 wxCHECK_MSG(dataViewCtrlPtr != NULL, false,_("Pointer to data view control not set correctly."));
1706 wxCHECK_MSG(dataViewCtrlPtr->GetModel() != NULL,false,_("Pointer to model not set correctly."));
1707 dataViewCustomRendererItem = reinterpret_cast<void*>(itemID);
1708 wxCHECK_MSG(dataViewCustomRendererItem.IsOk(),kDataBrowserNothingHit,_("Invalid data view item"));
1709 dataViewColumnPtr = this->GetColumnPtr(propertyID);
1710 wxCHECK_MSG(dataViewColumnPtr != NULL,kDataBrowserNothingHit,_("No column existing."));
1711 dataViewCustomRendererPtr = dynamic_cast<wxDataViewCustomRenderer*>(dataViewColumnPtr->GetRenderer());
1712 wxCHECK_MSG(dataViewCustomRendererPtr != NULL,kDataBrowserNothingHit,_("No renderer or invalid renderer type specified for custom data column."));
1713 // if the currently edited item is identical to the to be edited nothing is done (this hit should only be handled in the control itself):
1714 if (dataViewCtrlPtr->GetCustomRendererItem() == dataViewCustomRendererItem)
1715 return kDataBrowserContentHit;
1716 // an(other) item is going to be edited and therefore the current editing - if existing - has to be finished:
1717 if (dataViewCtrlPtr->GetCustomRendererPtr() != NULL)
1718 {
1719 dataViewCtrlPtr->GetCustomRendererPtr()->FinishEditing();
1720 dataViewCtrlPtr->SetCustomRendererItem(wxDataViewItem());
1721 dataViewCtrlPtr->SetCustomRendererPtr (NULL);
1722 }
1723 // check if renderer has got a valid editor control for editing; if this is the case start editing of the new item:
1724 if (dataViewCustomRendererPtr->HasEditorCtrl())
1725 {
1726 // variable definition:
1727 wxRect wxRectangle;
1728
1729 ::wxMacNativeToRect(theRect,&wxRectangle);
1730 dataViewCustomRendererPtr->StartEditing(dataViewCustomRendererItem,wxRectangle);
1731 dataViewCtrlPtr->SetCustomRendererItem(dataViewCustomRendererItem);
1732 dataViewCtrlPtr->SetCustomRendererPtr (dataViewCustomRendererPtr);
1733 }
1734 return kDataBrowserContentHit;
1735} /* wxMacDataViewDataBrowserListViewControl::DataBrowserTrackingProc(DataBrowserItemID, DataBrowserPropertyID, Rect const*, Point, EventModifiers) */
5829b303 1736
e86edab0
RR
1737Boolean wxMacDataViewDataBrowserListViewControl::DataBrowserAcceptDragProc(DragReference dragRef, DataBrowserItemID itemID)
1738{
1739 bool acceptDrag;
5829b303 1740
e86edab0 1741 UInt16 noOfDraggedItems;
489468fe 1742
e86edab0 1743 wxDataViewCtrl* dataViewCtrlPtr;
489468fe 1744
5829b303 1745
e86edab0
RR
1746 dataViewCtrlPtr = dynamic_cast<wxDataViewCtrl*>(this->GetWXPeer());
1747 wxCHECK_MSG(dataViewCtrlPtr != NULL, false,_("Pointer to data view control not set correctly."));
1748 wxCHECK_MSG(dataViewCtrlPtr->GetModel() != NULL,false,_("Pointer to model not set correctly."));
5829b303 1749
e86edab0
RR
1750 // send a drag possible event for each available and item und proceed with it unless the event is vetoed:
1751 ::CountDragItems(dragRef,&noOfDraggedItems);
1752 for (UInt16 indexDraggedItem=1; indexDraggedItem<=noOfDraggedItems; ++indexDraggedItem)
1753 {
1754 // collect native information:
1755 ItemReference itemRef;
1756 wxDataObjectComposite* dataObjects;
1757 wxMemoryBuffer buffer;
1758
1759 ::GetDragItemReferenceNumber(dragRef,indexDraggedItem,&itemRef); // the index begins with 1!
1760 dataObjects = this->GetDnDDataObjects(dragRef,itemRef);
1761 // create wxWidget's event:
1762 wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_DROP_POSSIBLE,dataViewCtrlPtr->GetId());
1763
1764 dataViewEvent.SetEventObject(dataViewCtrlPtr);
1765 dataViewEvent.SetItem(reinterpret_cast<void*>(itemID)); // this is the item that receives the event
1766 // (can be an invalid item ID, this is especially useful if the dataview does not contain any items)
1767 dataViewEvent.SetModel(dataViewCtrlPtr->GetModel());
1768 dataViewEvent.SetDataObject(dataObjects);
1769 dataViewEvent.SetDataFormat(this->GetDnDDataFormat(dataObjects));
1770 if (dataViewEvent.GetDataFormat().GetType() != wxDF_INVALID)
1771 {
1772 dataViewEvent.SetDataSize(dataObjects->GetDataSize(dataViewEvent.GetDataFormat().GetType()));
1773 dataObjects->GetDataHere(dataViewEvent.GetDataFormat().GetType(),buffer.GetWriteBuf(dataViewEvent.GetDataSize()));
1774 buffer.UngetWriteBuf(dataViewEvent.GetDataSize());
1775 dataViewEvent.SetDataBuffer(buffer.GetData());
1776 }
489468fe 1777
e86edab0
RR
1778 // send event:
1779 acceptDrag = dataViewCtrlPtr->HandleWindowEvent(dataViewEvent) && dataViewEvent.IsAllowed();
1780 delete dataObjects;
1781 if (!acceptDrag)
1782 return false;
1783 }
1784 return true;
1785} /* wxMacDataViewDataBrowserListViewControl::DataBrowserAcceptDragProc(DragReference, DataBrowserItemID) */
1786
1787Boolean wxMacDataViewDataBrowserListViewControl::DataBrowserAddDragItemProc(DragReference dragRef, DataBrowserItemID itemID, ItemReference* itemRef)
489468fe 1788{
e86edab0
RR
1789 Boolean addDragItem;
1790
1791 wxDataViewCtrl* dataViewCtrlPtr;
1792
1793 wxDataViewItem dataViewItem;
1794
1795
1796 dataViewCtrlPtr = dynamic_cast<wxDataViewCtrl*>(this->GetWXPeer());
1797 wxCHECK_MSG(dataViewCtrlPtr != NULL, false,_("Pointer to data view control not set correctly."));
1798 wxCHECK_MSG(dataViewCtrlPtr->GetModel() != NULL,false,_("Pointer to model not set correctly."));
1799 dataViewItem = reinterpret_cast<void*>(itemID);
1800 wxCHECK_MSG(dataViewItem.IsOk(),false,_("Invalid data view item"));
1801
1802 // send a begin drag event and proceed with dragging unless the event is vetoed:
1803 wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_BEGIN_DRAG,dataViewCtrlPtr->GetId());
1804
1805 dataViewEvent.SetEventObject(dataViewCtrlPtr);
1806 dataViewEvent.SetItem(dataViewItem);
1807 dataViewEvent.SetModel(dataViewCtrlPtr->GetModel());
1808 // the dataview event object is also initialized with a default set of data; as it is a set of data and the user should be able to easily complete
1809 // the object a wxDataObjectComposite object is used;
1810 // currently, the composite object only contains a TAB concatenated string of all data:
1811 wxDataObjectComposite* dataObject(new wxDataObjectComposite());
1812
1813 dataObject->Add(new wxTextDataObject(::ConcatenateDataViewItemValues(dataViewCtrlPtr,dataViewItem)));
1814 dataViewEvent.SetDataObject(dataObject);
1815 // check if event has not been vetoed:
1816 addDragItem = dataViewCtrlPtr->HandleWindowEvent(dataViewEvent) && dataViewEvent.IsAllowed();
1817 if (addDragItem)
489468fe 1818 {
e86edab0
RR
1819 // for the internal drag & drop functions create two flavors:
1820 // - the data browser's item id;
1821 // - the data contained the dataview event object (if available).
1822 // Definition: a flavor is the type dependent representation of identical data.
1823 // Example: a number can be represented by its value and by its value converted to a string. In this case the flavor
1824 // of the number's internal representation is typeSInt32 while its string representation has got the flavor 'TEXT'.
1825 // Item id is one of the flavors:
1826 wxCHECK_MSG(::AddDragItemFlavor(dragRef,*itemRef,typeUInt32,&itemID,sizeof(itemID),0) == noErr,false,_("Unable to handle native drag&drop data"));
1827 // if the dataview event object contains data it is used for additional flavors; all natively known flavors are supported:
1828 if (dataViewEvent.GetDataObject() != NULL)
1829 {
1830 // constant definition for abbreviational purposes:
1831 size_t const noOfFormats = dataViewEvent.GetDataObject()->GetFormatCount();
1832
1833 if (noOfFormats > 0)
1834 {
1835 // variable definition:
1836 wxDataFormat* dataFormats;
1837
1838 dataFormats = new wxDataFormat[noOfFormats];
1839 dataViewEvent.GetDataObject()->GetAllFormats(dataFormats,wxDataObject::Get);
1840 for (size_t i=0; i<noOfFormats; ++i)
1841 switch (dataFormats[i].GetType())
1842 {
1843 case wxDF_INVALID:
1844 wxFAIL_MSG(_("Data object has invalid data format"));
1845 break;
1846 case wxDF_TEXT:
1847 {
1848 // constant definition for abbreviational purposes:
1849 size_t const dataSize = dataViewEvent.GetDataObject()->GetDataSize(wxDF_TEXT);
1850 // variable definition and initialization:
1851 wxMemoryBuffer dataObject(dataSize);
1852
1853 dataViewEvent.GetDataObject()->GetDataHere(wxDF_TEXT,dataObject.GetWriteBuf(dataSize));
1854 dataObject.UngetWriteBuf(dataSize);
1855 if (::AddDragItemFlavor(dragRef,*itemRef,'TEXT',dataObject.GetData(),dataSize,0) != noErr)
1856 wxFAIL_MSG(_("Adding flavor TEXT failed"));
1857 } /* block */
1858 break;
1859 case wxDF_UNICODETEXT:
1860 {
1861 // constant definition for abbreviational purposes:
1862 size_t const dataSize = dataViewEvent.GetDataObject()->GetDataSize(wxDF_TEXT);
1863 // as there is no direct access to the data copy it to a memory buffer:
1864 wxMemoryBuffer dataObject(dataSize);
1865
1866 dataViewEvent.GetDataObject()->GetDataHere(wxDF_TEXT,dataObject.GetWriteBuf(dataSize));
1867 dataObject.UngetWriteBuf(dataSize);
1868 // if the data is stored in unicode format the internal representation is utf-8 (not mentioned in the documentation but in the source code);
1869 // DnD uses fixed utf-16 representation -> use the OSX functions for a conversion:
1870 CFDataRef osxData (::CFDataCreateWithBytesNoCopy(kCFAllocatorDefault,reinterpret_cast<UInt8*>(dataObject.GetData()),dataSize,kCFAllocatorNull));
1871 CFStringRef osxString(::CFStringCreateFromExternalRepresentation(kCFAllocatorDefault,osxData,kCFStringEncodingUTF8));
1872
1873 // the osxString contains now the data and therefore the previously occupied memory can be released and re-used:
1874 ::CFRelease(osxData);
1875 osxData = ::CFStringCreateExternalRepresentation(kCFAllocatorDefault,osxString,kCFStringEncodingUTF16,32);
1876 if (::AddDragItemFlavor(dragRef,*itemRef,'utxt',::CFDataGetBytePtr(osxData),::CFDataGetLength(osxData),0) != noErr)
1877 wxFAIL_MSG(_("Adding flavor utxt failed"));
1878 // clean up:
1879 ::CFRelease(osxData);
1880 ::CFRelease(osxString);
1881 } /* block */
1882 break;
1883 case wxDF_BITMAP:
1884 case wxDF_METAFILE:
1885 case wxDF_SYLK:
1886 case wxDF_DIF:
1887 case wxDF_TIFF:
1888 case wxDF_OEMTEXT:
1889 case wxDF_DIB:
1890 case wxDF_PALETTE:
1891 case wxDF_PENDATA:
1892 case wxDF_RIFF:
1893 case wxDF_WAVE:
1894 case wxDF_ENHMETAFILE:
1895 case wxDF_FILENAME:
1896 case wxDF_LOCALE:
1897 case wxDF_PRIVATE:
1898 case wxDF_HTML:
1899 break; // not (yet) supported data formats
1900 default:
1901 wxFAIL_MSG(_("Unknown data format"));
1902 }
1903 delete[] dataFormats;
1904 }
1905 }
489468fe 1906 }
e86edab0
RR
1907 // clean-up and return result:
1908 delete dataObject;
1909 return addDragItem;
1910} /* wxMacDataViewDataBrowserListViewControl::DataBrowserAddDragItemProc(DragReference, DataBrowserItemID, ItemReference*) */
489468fe 1911
e86edab0 1912Boolean wxMacDataViewDataBrowserListViewControl::DataBrowserReceiveDragProc(DragReference dragRef, DataBrowserItemID itemID)
489468fe 1913{
e86edab0 1914 UInt16 noOfDraggedItems;
5829b303 1915
e86edab0 1916 wxDataViewCtrl* dataViewCtrlPtr;
489468fe 1917
e86edab0
RR
1918
1919 dataViewCtrlPtr = dynamic_cast<wxDataViewCtrl*>(this->GetWXPeer());
1920 wxCHECK_MSG(dataViewCtrlPtr != NULL, false,_("Pointer to data view control not set correctly."));
1921 wxCHECK_MSG(dataViewCtrlPtr->GetModel() != NULL,false,_("Pointer to model not set correctly."));
1922
1923 // send a drag possible event for each available and item und proceed with it unless the event is vetoed:
1924 ::CountDragItems(dragRef,&noOfDraggedItems);
1925 for (UInt16 indexDraggedItem=1; indexDraggedItem<=noOfDraggedItems; ++indexDraggedItem)
489468fe 1926 {
e86edab0
RR
1927 bool receiveDrag;
1928 ItemReference itemRef;
1929 wxDataObjectComposite* dataObjects;
1930 wxMemoryBuffer buffer;
1931
1932 // collect native information:
1933 ::GetDragItemReferenceNumber(dragRef,indexDraggedItem,&itemRef); // the index begins with 1!
1934 dataObjects = this->GetDnDDataObjects(dragRef,itemRef);
1935 // create wxWidget's event:
1936 wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_DROP,dataViewCtrlPtr->GetId());
1937
1938 dataViewEvent.SetEventObject(dataViewCtrlPtr);
1939 dataViewEvent.SetItem(reinterpret_cast<void*>(itemID)); // this is the item that receives the event
1940 // (can be an invalid item ID, this is especially useful if the dataview does not contain any items)
1941 dataViewEvent.SetModel(dataViewCtrlPtr->GetModel());
1942 dataViewEvent.SetDataObject(dataObjects);
1943 dataViewEvent.SetDataFormat(this->GetDnDDataFormat(dataObjects));
1944 if (dataViewEvent.GetDataFormat().GetType() != wxDF_INVALID)
1945 {
1946 dataViewEvent.SetDataSize(dataObjects->GetDataSize(dataViewEvent.GetDataFormat().GetType()));
1947 dataObjects->GetDataHere(dataViewEvent.GetDataFormat().GetType(),buffer.GetWriteBuf(dataViewEvent.GetDataSize()));
1948 buffer.UngetWriteBuf(dataViewEvent.GetDataSize());
1949 dataViewEvent.SetDataBuffer(buffer.GetData());
1950 }
489468fe 1951
e86edab0
RR
1952 // send event:
1953 receiveDrag = dataViewCtrlPtr->HandleWindowEvent(dataViewEvent) && dataViewEvent.IsAllowed();
1954 delete dataObjects;
1955 if (!receiveDrag)
1956 return false;
5829b303 1957 }
e86edab0
RR
1958 return true;
1959} /* wxMacDataViewDataBrowserListViewControl::DataBrowserReceiveDragProc(DragReference, DataBrowserItemID) */
489468fe 1960
e86edab0
RR
1961//
1962// drag & drop helper methods
1963//
1964wxDataFormat wxMacDataViewDataBrowserListViewControl::GetDnDDataFormat(wxDataObjectComposite* dataObjects)
489468fe 1965{
e86edab0 1966 wxDataFormat resultFormat;
489468fe 1967
619df5a4 1968
e86edab0
RR
1969 if (dataObjects != NULL)
1970 {
1971 bool compatible(true);
619df5a4 1972
e86edab0
RR
1973 size_t const noOfFormats = dataObjects->GetFormatCount();
1974 size_t indexFormat;
619df5a4 1975
e86edab0 1976 wxDataFormat* formats;
619df5a4 1977
e86edab0
RR
1978 // get all formats and check afterwards if the formats are compatible; if they are compatible the preferred format is returned otherwise
1979 // wxDF_INVALID is returned;
1980 // currently compatible types (ordered by priority are):
1981 // - wxDF_UNICODETEXT - wxDF_TEXT
1982 formats = new wxDataFormat[noOfFormats];
1983 dataObjects->GetAllFormats(formats);
1984 indexFormat = 0;
1985 while ((indexFormat < noOfFormats) && compatible)
619df5a4 1986 {
e86edab0
RR
1987 switch (resultFormat.GetType())
1988 {
1989 case wxDF_INVALID:
1990 resultFormat.SetType(formats[indexFormat].GetType()); // first format (should only be reached if indexFormat == 0
1991 break;
1992 case wxDF_TEXT:
1993 if (formats[indexFormat].GetType() == wxDF_UNICODETEXT)
1994 resultFormat.SetType(wxDF_UNICODETEXT);
1995 else // incompatible
1996 {
1997 resultFormat.SetType(wxDF_INVALID);
1998 compatible = false;
1999 }
2000 break;
2001 case wxDF_UNICODETEXT:
2002 if (formats[indexFormat].GetType() != wxDF_TEXT)
2003 {
2004 resultFormat.SetType(wxDF_INVALID);
2005 compatible = false;
2006 }
2007 break;
2008 default:
2009 resultFormat.SetType(wxDF_INVALID); // not (yet) supported format
2010 compatible = false;
2011 }
2012 ++indexFormat;
2013 } /* while */
2014 // clean up:
2015 delete[] formats;
2016 }
2017 else
2018 resultFormat = wxDF_INVALID;
2019 return resultFormat;
2020} /* wxMacDataViewDataBrowserListViewControl::GetDnDDataFormat(wxDataObjectComposite*) */
619df5a4 2021
e86edab0 2022wxDataObjectComposite* wxMacDataViewDataBrowserListViewControl::GetDnDDataObjects(DragReference dragRef, ItemReference itemRef) const
489468fe 2023{
e86edab0
RR
2024 UInt16 noOfFlavors;
2025
2026 wxDataObjectComposite* dataObject;
489468fe
SC
2027
2028
e86edab0
RR
2029 ::CountDragItemFlavors(dragRef,itemRef,&noOfFlavors);
2030 if (noOfFlavors > 0)
489468fe 2031 {
e86edab0
RR
2032 // as the native drag data can be separated into TEXT and UTXT a pointer to a wxTextDataObject is used to track the existence of 'TEXT' and 'utxt' flavors:
2033 wxTextDataObject* textDataObject(NULL);
5829b303 2034
e86edab0
RR
2035 dataObject = new wxDataObjectComposite();
2036 for (UInt16 indexFlavor=1; indexFlavor<=noOfFlavors; ++indexFlavor)
489468fe 2037 {
e86edab0
RR
2038 // variable definition:
2039 FlavorType flavorDataObject;
2040
2041 if (::GetFlavorType(dragRef,itemRef,indexFlavor,&flavorDataObject) == noErr) // GetFlavorType uses a 1 based index!
2042 switch (flavorDataObject)
2043 {
2044 case 'TEXT':
2045 if (textDataObject == NULL) // otherwise a 'utxt' flavor has already been found that gets priority compared to the 'TEXT' flavor
2046 {
2047 // variable definitions:
2048 Size nativeDataSize;
2049 wxMemoryBuffer nativeData;
2050
2051 if ((::GetFlavorDataSize(dragRef,itemRef,'TEXT',&nativeDataSize) == noErr) &&
2052 (::GetFlavorData(dragRef,itemRef,'TEXT',nativeData.GetWriteBuf(nativeDataSize),&nativeDataSize,0) == noErr))
2053 {
2054 nativeData.UngetWriteBuf(nativeDataSize);
2055 textDataObject = new wxTextDataObject();
2056 if (textDataObject->SetData(nativeData.GetDataLen(),nativeData.GetData()))
2057 dataObject->Add(textDataObject);
2058 else
2059 {
2060 delete textDataObject;
2061 textDataObject = NULL;
2062 }
2063 }
2064 } /* block */
2065 break;
2066 case 'utxt':
2067 {
2068 // variable definition:
2069 Size nativeDataSize;
2070
2071 if (::GetFlavorDataSize(dragRef,itemRef,'utxt',&nativeDataSize) == noErr)
2072 {
2073 CFMutableDataRef draggedData;
2074
2075 draggedData = ::CFDataCreateMutable(kCFAllocatorDefault,nativeDataSize);
2076 ::CFDataSetLength(draggedData,nativeDataSize);
2077 if (::GetFlavorData(dragRef,itemRef,'utxt',::CFDataGetMutableBytePtr(draggedData),&nativeDataSize,0) == noErr)
2078 {
2079 // convert internally used UTF-16 representation to a UTF-8 representation:
2080 CFDataRef osxData;
2081 CFStringRef osxString;
2082
2083 osxString = ::CFStringCreateFromExternalRepresentation(kCFAllocatorDefault,draggedData,kCFStringEncodingUTF16); // BOM character is handled by this function automatically
2084 osxData = ::CFStringCreateExternalRepresentation(kCFAllocatorDefault,osxString,kCFStringEncodingUTF8,32);
2085 if (textDataObject == NULL)
2086 {
2087 textDataObject = new wxTextDataObject();
2088 if (textDataObject->SetData(::CFDataGetLength(osxData),::CFDataGetBytePtr(osxData)))
2089 dataObject->Add(textDataObject);
2090 else
2091 {
2092 delete textDataObject;
2093 textDataObject = NULL;
2094 }
2095 }
2096 else // overwrite data because the 'utxt' flavor has priority over the 'TEXT' flavor
2097 (void) textDataObject->SetData(::CFDataGetLength(osxData),::CFDataGetBytePtr(osxData));
2098 // clean up:
2099 ::CFRelease(osxData);
2100 ::CFRelease(osxString);
2101 }
2102 // clean up:
2103 ::CFRelease(draggedData);
2104 }
2105 } /* block */
2106 break;
2107 }
5829b303
VZ
2108 }
2109 }
e86edab0
RR
2110 else
2111 dataObject = NULL;
2112 return dataObject;
2113} /* wxMacDataViewDataBrowserListViewControl::GetDnDDataObjects(DragReference, ItemReference) const */
5829b303 2114
e86edab0
RR
2115//
2116// other methods
2117//
2118wxDataViewColumn* wxMacDataViewDataBrowserListViewControl::GetColumnPtr(DataBrowserPropertyID propertyID) const
2119{
2120 wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->GetWXPeer()));
2121
2122 if (dataViewCtrlPtr != NULL)
489468fe 2123 {
e86edab0
RR
2124 size_t const noOfColumns = dataViewCtrlPtr->GetColumnCount();
2125
2126 for (size_t i=0; i<noOfColumns; ++i)
2127 if (dataViewCtrlPtr->GetColumnPtr(i)->GetNativeData()->GetPropertyID() == propertyID)
2128 return dataViewCtrlPtr->GetColumnPtr(i);
489468fe 2129 }
e86edab0 2130 return NULL;
5829b303 2131}
489468fe 2132
e86edab0
RR
2133// ---------------------------------------------------------
2134// wxDataViewRenderer
2135// ---------------------------------------------------------
2136wxDataViewRenderer::wxDataViewRenderer(wxString const& varianttype, wxDataViewCellMode mode, int align)
2137 :wxDataViewRendererBase(varianttype,mode,align), m_alignment(align), m_mode(mode), m_NativeDataPtr(NULL)
2138{
2139}
2140
2141wxDataViewRenderer::~wxDataViewRenderer(void)
2142{
2143 delete this->m_NativeDataPtr;
2144}
2145
2146void wxDataViewRenderer::SetAlignment(int align)
2147{
2148 this->m_alignment = align;
2149}
2150
2151void wxDataViewRenderer::SetMode(wxDataViewCellMode mode)
2152{
2153 wxDataViewColumn* dataViewColumnPtr;
2154
2155
2156 m_mode = mode;
2157 dataViewColumnPtr = this->GetOwner();
2158 if (dataViewColumnPtr != NULL)
2159 {
2160 wxDataViewCtrl* dataViewCtrlPtr(dataViewColumnPtr->GetOwner());
2161
2162 if (dataViewCtrlPtr != NULL)
2163 {
2164 wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
2165
2166 if (macDataViewListCtrlPtr != NULL)
2167 {
2168 DataBrowserPropertyFlags flags;
2169
2170 verify_noerr(macDataViewListCtrlPtr->GetPropertyFlags(dataViewColumnPtr->GetNativeData()->GetPropertyID(),&flags));
2171 if (mode == wxDATAVIEW_CELL_EDITABLE)
2172 flags |= kDataBrowserPropertyIsEditable;
2173 else
2174 flags &= ~kDataBrowserPropertyIsEditable;
2175 verify_noerr(macDataViewListCtrlPtr->SetPropertyFlags(dataViewColumnPtr->GetNativeData()->GetPropertyID(),flags));
2176 }
2177 }
2178 }
2179}
2180
2181void wxDataViewRenderer::SetNativeData(wxDataViewRendererNativeData* newNativeDataPtr)
2182{
2183 delete this->m_NativeDataPtr;
2184 this->m_NativeDataPtr = newNativeDataPtr;
2185}
2186
2187IMPLEMENT_ABSTRACT_CLASS(wxDataViewRenderer,wxDataViewRendererBase)
2188
2189// ---------------------------------------------------------
2190// wxDataViewCustomRenderer
2191// ---------------------------------------------------------
2192wxDataViewCustomRenderer::wxDataViewCustomRenderer(wxString const& varianttype, wxDataViewCellMode mode, int align)
2193 :wxDataViewRenderer(varianttype,mode,align), m_editorCtrlPtr(NULL), m_DCPtr(NULL)
2194{
2195 this->SetNativeData(new wxDataViewRendererNativeData(kDataBrowserCustomType));
2196}
2197
2198bool wxDataViewCustomRenderer::Render()
2199{
2200 return true;
2201}
489468fe 2202
e86edab0
RR
2203IMPLEMENT_ABSTRACT_CLASS(wxDataViewCustomRenderer, wxDataViewRenderer)
2204
2205// ---------------------------------------------------------
2206// wxDataViewTextRenderer
2207// ---------------------------------------------------------
2208wxDataViewTextRenderer::wxDataViewTextRenderer(wxString const& varianttype, wxDataViewCellMode mode, int align)
2209 :wxDataViewRenderer(varianttype,mode,align)
2210{
2211 this->SetNativeData(new wxDataViewRendererNativeData(kDataBrowserTextType));
2212}
489468fe 2213
e86edab0
RR
2214bool wxDataViewTextRenderer::Render()
2215{
2216 wxCHECK_MSG(this->GetValue().GetType() == this->GetVariantType(),false,wxString(_("Text renderer cannot render value; value type: ")) << this->GetValue().GetType());
2217
2218 wxCFStringRef cfString(this->GetValue().GetString(),(this->GetView()->GetFont().Ok() ? this->GetView()->GetFont().GetEncoding() : wxLocale::GetSystemEncoding()));
2219 return (::SetDataBrowserItemDataText(this->GetNativeData()->GetItemDataRef(),cfString) == noErr);
2220}
2221
2222IMPLEMENT_CLASS(wxDataViewTextRenderer,wxDataViewRenderer)
2223
2224// ---------------------------------------------------------
2225// wxDataViewBitmapRenderer
2226// ---------------------------------------------------------
2227wxDataViewBitmapRenderer::wxDataViewBitmapRenderer(wxString const& varianttype, wxDataViewCellMode mode, int align)
2228 :wxDataViewRenderer(varianttype,mode,align)
2229{
2230 this->SetNativeData(new wxDataViewRendererNativeData(kDataBrowserIconType));
2231}
2232
2233bool wxDataViewBitmapRenderer::Render()
2234 // This method returns 'true' if
2235 // - the passed bitmap is valid and it could be assigned to the native data browser;
2236 // - the passed bitmap is invalid (or is not initialized); this case simulates a non-existing bitmap.
2237 // In all other cases the method returns 'false'.
2238{
2239 wxCHECK_MSG(this->GetValue().GetType() == this->GetVariantType(),false,wxString(_("Bitmap renderer cannot render value; value type: ")) << this->GetValue().GetType());
2240
2241 wxBitmap bitmap;
2242
2243 bitmap << this->GetValue();
2244 return (!(bitmap.Ok()) || (::SetDataBrowserItemDataIcon(this->GetNativeData()->GetItemDataRef(),bitmap.GetIconRef()) == noErr));
2245}
2246
2247IMPLEMENT_CLASS(wxDataViewBitmapRenderer,wxDataViewRenderer)
2248
2249// ---------------------------------------------------------
2250// wxDataViewIconTextRenderer
2251// ---------------------------------------------------------
2252wxDataViewIconTextRenderer::wxDataViewIconTextRenderer(wxString const& varianttype, wxDataViewCellMode mode, int align)
2253 :wxDataViewRenderer(varianttype,mode)
2254{
2255 this->SetNativeData(new wxDataViewRendererNativeData(kDataBrowserIconAndTextType));
2256}
2257
2258bool wxDataViewIconTextRenderer::Render()
2259{
2260 wxCHECK_MSG(this->GetValue().GetType() == this->GetVariantType(),false,wxString(_("Icon & text renderer cannot render value; value type: ")) << this->GetValue().GetType());
2261
2262 wxDataViewIconText iconText;
2263
2264 iconText << this->GetValue();
2265
2266 wxCFStringRef cfString(iconText.GetText(),(this->GetView()->GetFont().Ok() ? this->GetView()->GetFont().GetEncoding() : wxLocale::GetSystemEncoding()));
2267
2268 if (iconText.GetIcon().IsOk())
2269 if (::SetDataBrowserItemDataIcon(this->GetNativeData()->GetItemDataRef(),MAC_WXHICON(iconText.GetIcon().GetHICON())) != noErr)
2270 return false;
2271 return (::SetDataBrowserItemDataText(this->GetNativeData()->GetItemDataRef(),cfString) == noErr);
2272}
2273
2274IMPLEMENT_ABSTRACT_CLASS(wxDataViewIconTextRenderer,wxDataViewRenderer)
2275
2276
2277// ---------------------------------------------------------
2278// wxDataViewToggleRenderer
2279// ---------------------------------------------------------
2280wxDataViewToggleRenderer::wxDataViewToggleRenderer(wxString const& varianttype, wxDataViewCellMode mode, int align)
2281 :wxDataViewRenderer(varianttype,mode)
2282{
2283 this->SetNativeData(new wxDataViewRendererNativeData(kDataBrowserCheckboxType));
2284}
2285
2286bool wxDataViewToggleRenderer::Render()
2287{
2288 wxCHECK_MSG(this->GetValue().GetType() == this->GetVariantType(),false,wxString(_("Toggle renderer cannot render value; value type: ")) << this->GetValue().GetType());
2289 return (::SetDataBrowserItemDataButtonValue(this->GetNativeData()->GetItemDataRef(),this->GetValue().GetBool()) == noErr);
2290}
2291
2292IMPLEMENT_ABSTRACT_CLASS(wxDataViewToggleRenderer,wxDataViewRenderer)
2293
2294// ---------------------------------------------------------
2295// wxDataViewProgressRenderer
2296// ---------------------------------------------------------
2297wxDataViewProgressRenderer::wxDataViewProgressRenderer(wxString const& label, wxString const& varianttype, wxDataViewCellMode mode, int align)
2298 :wxDataViewRenderer(varianttype,mode,align)
2299{
2300 this->SetNativeData(new wxDataViewRendererNativeData(kDataBrowserProgressBarType));
2301}
2302
2303bool wxDataViewProgressRenderer::Render()
2304{
2305 wxCHECK_MSG(this->GetValue().GetType() == this->GetVariantType(),false,wxString(_("Progress renderer cannot render value type; value type: ")) << this->GetValue().GetType());
2306 return ((::SetDataBrowserItemDataMinimum(this->GetNativeData()->GetItemDataRef(), 0) == noErr) &&
2307 (::SetDataBrowserItemDataMaximum(this->GetNativeData()->GetItemDataRef(),100) == noErr) &&
2308 (::SetDataBrowserItemDataValue (this->GetNativeData()->GetItemDataRef(),this->GetValue().GetLong()) == noErr));
2309}
2310
2311IMPLEMENT_ABSTRACT_CLASS(wxDataViewProgressRenderer,wxDataViewRenderer)
2312
2313// ---------------------------------------------------------
2314// wxDataViewDateRenderer
2315// ---------------------------------------------------------
2316wxDataViewDateRenderer::wxDataViewDateRenderer(wxString const& varianttype, wxDataViewCellMode mode, int align)
2317 :wxDataViewRenderer(varianttype,mode,align)
2318{
2319 this->SetNativeData(new wxDataViewRendererNativeData(kDataBrowserDateTimeType));
2320}
2321
2322bool wxDataViewDateRenderer::Render()
2323{
2324 wxCHECK_MSG(this->GetValue().GetType() == this->GetVariantType(),false,wxString(_("Date renderer cannot render value; value type: ")) << this->GetValue().GetType());
2325 return (::SetDataBrowserItemDataDateTime(this->GetNativeData()->GetItemDataRef(),this->GetValue().GetDateTime().Subtract(wxDateTime(1,wxDateTime::Jan,1904)).GetSeconds().GetLo()) == noErr);
2326}
2327
2328IMPLEMENT_ABSTRACT_CLASS(wxDataViewDateRenderer,wxDataViewRenderer)
2329
2330// ---------------------------------------------------------
2331// wxDataViewColumn
2332// ---------------------------------------------------------
2333wxDataViewColumn::wxDataViewColumn(const wxString& title, wxDataViewRenderer* renderer, unsigned int model_column, int width, wxAlignment align, int flags)
2334 :wxDataViewColumnBase(renderer, model_column), m_NativeDataPtr(new wxDataViewColumnNativeData()), m_title(title)
2335{
2336 this->InitCommon(width, align, flags);
2337 if ((renderer != NULL) && (renderer->GetAlignment() == wxDVR_DEFAULT_ALIGNMENT))
2338 renderer->SetAlignment(align);
2339}
2340
2341wxDataViewColumn::wxDataViewColumn(const wxBitmap& bitmap, wxDataViewRenderer* renderer, unsigned int model_column, int width, wxAlignment align, int flags)
2342 :wxDataViewColumnBase(bitmap, renderer, model_column), m_NativeDataPtr(new wxDataViewColumnNativeData())
2343{
2344 this->InitCommon(width, align, flags);
2345 if ((renderer != NULL) && (renderer->GetAlignment() == wxDVR_DEFAULT_ALIGNMENT))
2346 renderer->SetAlignment(align);
2347}
2348
2349wxDataViewColumn::~wxDataViewColumn(void)
2350{
2351 delete this->m_NativeDataPtr;
2352}
2353
2354bool wxDataViewColumn::IsSortKey() const
2355{
2356 wxDataViewCtrl * const dataViewCtrlPtr(GetOwner());
2357 wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(
2358 dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(
2359 dataViewCtrlPtr->GetPeer()));
2360
2361 DataBrowserPropertyID propertyID;
2362 return (macDataViewListCtrlPtr->GetSortProperty(&propertyID) == noErr) &&
2363 (propertyID == this->GetNativeData()->GetPropertyID());
2364}
2365
2366void wxDataViewColumn::SetAlignment(wxAlignment align)
2367{
2368 wxDataViewCtrl* dataViewCtrlPtr(this->GetOwner());
2369
2370
2371 m_alignment = align;
2372 if (dataViewCtrlPtr != NULL)
2373 {
2374 wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
2375
2376 if (macDataViewListCtrlPtr != NULL)
2377 {
2378 DataBrowserListViewHeaderDesc headerDescription;
2379
2380 wxCHECK_RET(macDataViewListCtrlPtr->GetHeaderDesc(this->GetNativeData()->GetPropertyID(),&headerDescription) == noErr,_("Could not get header description."));
2381 switch (align)
2382 {
2383 case wxALIGN_CENTER:
2384 case wxALIGN_CENTER_HORIZONTAL:
2385 headerDescription.btnFontStyle.just = teCenter;
2386 break;
2387 case wxALIGN_LEFT:
2388 headerDescription.btnFontStyle.just = teFlushLeft;
2389 break;
2390 case wxALIGN_RIGHT:
2391 headerDescription.btnFontStyle.just = teFlushRight;
2392 break;
2393 default:
2394 headerDescription.btnFontStyle.just = teFlushDefault;
2395 }
2396 wxCHECK_RET(macDataViewListCtrlPtr->SetHeaderDesc(this->GetNativeData()->GetPropertyID(),&headerDescription) == noErr,_("Could not set alignment."));
2397 }
2398 }
2399}
2400
2401void wxDataViewColumn::SetBitmap(wxBitmap const& bitmap)
2402{
2403 wxDataViewCtrl* dataViewCtrlPtr(this->GetOwner());
2404
2405
2406 wxDataViewColumnBase::SetBitmap(bitmap);
2407 if (dataViewCtrlPtr != NULL)
2408 {
2409 wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
2410
2411 if (macDataViewListCtrlPtr != NULL)
2412 {
2413 DataBrowserListViewHeaderDesc headerDescription;
2414
2415 wxCHECK_RET(macDataViewListCtrlPtr->GetHeaderDesc(this->GetNativeData()->GetPropertyID(),&headerDescription) == noErr,_("Could not get header description."));
2416 if (this->GetBitmap().Ok())
2417 headerDescription.btnContentInfo.u.iconRef = this->GetBitmap().GetIconRef();
2418 else
2419 headerDescription.btnContentInfo.u.iconRef = NULL;
2420 wxCHECK_RET(macDataViewListCtrlPtr->SetHeaderDesc(this->GetNativeData()->GetPropertyID(),&headerDescription) == noErr,_("Could not set icon."));
2421 }
2422 }
2423}
2424
2425void wxDataViewColumn::SetMaxWidth(int maxWidth)
2426{
2427 wxDataViewCtrl* dataViewCtrlPtr(this->GetOwner());
2428
2429
2430 m_maxWidth = maxWidth;
2431 if (dataViewCtrlPtr != NULL)
2432 {
2433 wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
2434
2435 if (macDataViewListCtrlPtr != NULL)
2436 {
2437 DataBrowserListViewHeaderDesc headerDescription;
2438
2439 wxCHECK_RET(macDataViewListCtrlPtr->GetHeaderDesc(this->GetNativeData()->GetPropertyID(),&headerDescription) == noErr,_("Could not get header description."));
2440 headerDescription.maximumWidth = static_cast<UInt16>(maxWidth);
2441 wxCHECK_RET(macDataViewListCtrlPtr->SetHeaderDesc(this->GetNativeData()->GetPropertyID(),&headerDescription) == noErr,_("Could not set maximum width."));
2442 }
2443 }
2444}
2445
2446void wxDataViewColumn::SetMinWidth(int minWidth)
2447{
2448 wxDataViewCtrl* dataViewCtrlPtr(this->GetOwner());
2449
2450
2451 m_minWidth = minWidth;
2452 if (dataViewCtrlPtr != NULL)
2453 {
2454 wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
2455
2456 if (macDataViewListCtrlPtr != NULL)
2457 {
2458 DataBrowserListViewHeaderDesc headerDescription;
2459
2460 wxCHECK_RET(macDataViewListCtrlPtr->GetHeaderDesc(this->GetNativeData()->GetPropertyID(),&headerDescription) == noErr,_("Could not get header description."));
2461 headerDescription.minimumWidth = static_cast<UInt16>(minWidth);
2462 wxCHECK_RET(macDataViewListCtrlPtr->SetHeaderDesc(this->GetNativeData()->GetPropertyID(),&headerDescription) == noErr,_("Could not set minimum width."));
2463 }
2464 }
2465}
2466
2467void wxDataViewColumn::SetReorderable(bool reorderable)
2468{
2469 // first set the internal flag of the column:
2470 if (reorderable)
2471 m_flags |= wxDATAVIEW_COL_REORDERABLE;
2472 else
2473 m_flags &= ~wxDATAVIEW_COL_REORDERABLE;
2474 // if the column is associated with a control change also immediately the flags of the control:
2475 wxDataViewCtrl* dataViewCtrlPtr(this->GetOwner());
2476
2477 if (dataViewCtrlPtr != NULL)
2478 {
2479 DataBrowserPropertyFlags flags;
2480 wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
2481
2482 wxCHECK_RET(macDataViewListCtrlPtr != NULL, _("Valid pointer to native data view control does not exist"));
2483 wxCHECK_RET(macDataViewListCtrlPtr->GetPropertyFlags(this->GetNativeData()->GetPropertyID(),&flags) == noErr,_("Could not get property flags."));
2484 if (reorderable)
2485 flags |= kDataBrowserListViewMovableColumn;
2486 else
2487 flags &= ~kDataBrowserListViewMovableColumn;
2488 wxCHECK_RET(macDataViewListCtrlPtr->SetPropertyFlags(this->GetNativeData()->GetPropertyID(),flags) == noErr,_("Could not set property flags."));
2489 }
2490}
2491
2492void wxDataViewColumn::SetResizeable(bool resizeable)
2493{
2494 // first set the internal flag of the column:
2495 if (resizeable)
2496 m_flags |= wxDATAVIEW_COL_RESIZABLE;
2497 else
2498 m_flags &= ~wxDATAVIEW_COL_RESIZABLE;
2499 // if the column is associated with a control change also immediately the flags of the control:
2500 wxDataViewCtrl* dataViewCtrlPtr(this->GetOwner());
2501
2502 if (dataViewCtrlPtr != NULL)
2503 {
2504 wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
2505
2506 if (macDataViewListCtrlPtr != NULL)
2507 {
2508 DataBrowserListViewHeaderDesc headerDescription;
2509
2510 verify_noerr(macDataViewListCtrlPtr->GetHeaderDesc(this->GetNativeData()->GetPropertyID(),&headerDescription));
2511 if (resizeable)
2512 {
2513 if (this->GetMinWidth() >= this->GetMaxWidth())
2514 {
2515 this->m_minWidth = 0;
2516 this->m_maxWidth = 30000;
2517 }
2518 headerDescription.minimumWidth = this->m_minWidth;
2519 headerDescription.maximumWidth = this->m_maxWidth;
2520 }
2521 else
2522 {
2523 headerDescription.minimumWidth = this->m_width;
2524 headerDescription.maximumWidth = this->m_width;
2525 }
2526 verify_noerr(macDataViewListCtrlPtr->SetHeaderDesc(this->GetNativeData()->GetPropertyID(),&headerDescription));
2527 macDataViewListCtrlPtr->SetSortProperty(this->GetNativeData()->GetPropertyID());
2528 }
2529 }
2530}
2531
2532void wxDataViewColumn::SetSortable(bool sortable)
2533{
2534 // first set the internal flag of the column:
2535 if (sortable)
2536 m_flags |= wxDATAVIEW_COL_SORTABLE;
2537 else
2538 m_flags &= ~wxDATAVIEW_COL_SORTABLE;
2539 // if the column is associated with a control change also immediately the flags of the control:
2540 wxDataViewCtrl* dataViewCtrlPtr(this->GetOwner());
2541
2542 if (dataViewCtrlPtr != NULL)
2543 {
2544 DataBrowserPropertyFlags flags;
2545 wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
2546
2547 wxCHECK_RET(macDataViewListCtrlPtr != NULL, _("Valid pointer to native data view control does not exist"));
2548 wxCHECK_RET(macDataViewListCtrlPtr->GetPropertyFlags(this->GetNativeData()->GetPropertyID(),&flags) == noErr,_("Could not get property flags."));
2549 if (sortable)
2550 flags |= kDataBrowserListViewSortableColumn;
2551 else
2552 flags &= ~kDataBrowserListViewSortableColumn;
2553 wxCHECK_RET(macDataViewListCtrlPtr->SetPropertyFlags(this->GetNativeData()->GetPropertyID(),flags) == noErr,_("Could not set property flags."));
2554 }
2555}
2556
2557void wxDataViewColumn::SetSortOrder(bool ascending)
2558{
2559 wxDataViewCtrl* dataViewCtrlPtr(this->GetOwner());
2560
2561
2562 m_ascending = ascending;
2563 if (dataViewCtrlPtr != NULL)
2564 {
2565 wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
2566
2567 if (macDataViewListCtrlPtr != NULL)
2568 {
2569 DataBrowserListViewHeaderDesc headerDescription;
2570
2571 verify_noerr(macDataViewListCtrlPtr->GetHeaderDesc(this->GetNativeData()->GetPropertyID(),&headerDescription));
2572 if (ascending)
2573 headerDescription.initialOrder = kDataBrowserOrderIncreasing;
2574 else
2575 headerDescription.initialOrder = kDataBrowserOrderDecreasing;
2576 verify_noerr(macDataViewListCtrlPtr->SetHeaderDesc(this->GetNativeData()->GetPropertyID(),&headerDescription));
2577 macDataViewListCtrlPtr->SetSortProperty(this->GetNativeData()->GetPropertyID());
2578 }
2579 }
2580}
2581
2582void wxDataViewColumn::SetTitle(wxString const& title)
2583{
2584 wxDataViewCtrl* dataViewCtrlPtr(this->GetOwner());
2585
2586
2587 m_title = title;
2588 if (dataViewCtrlPtr != NULL)
2589 {
2590 wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
2591
2592 if (macDataViewListCtrlPtr != NULL)
2593 {
2594 DataBrowserListViewHeaderDesc headerDescription;
2595 wxCFStringRef cfTitle(title,(dataViewCtrlPtr->GetFont().Ok() ? dataViewCtrlPtr->GetFont().GetEncoding() : wxLocale::GetSystemEncoding()));
2596
2597 wxCHECK_RET(macDataViewListCtrlPtr->GetHeaderDesc(this->GetNativeData()->GetPropertyID(),&headerDescription) == noErr,_("Could not get header description."));
2598 headerDescription.titleString = cfTitle;
2599 wxCHECK_RET(macDataViewListCtrlPtr->SetHeaderDesc(this->GetNativeData()->GetPropertyID(),&headerDescription) == noErr,_("Could not set header description."));
2600 }
2601 }
2602}
2603
2604void wxDataViewColumn::SetWidth(int width)
2605{
2606 wxDataViewCtrl* dataViewCtrlPtr(this->GetOwner());
2607
2608
2609 if ((width >= m_minWidth) && (width <= m_maxWidth))
2610 {
2611 m_width = width;
2612 if (dataViewCtrlPtr != NULL)
2613 {
2614 wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
2615
2616 if (macDataViewListCtrlPtr != NULL)
2617 wxCHECK_RET(macDataViewListCtrlPtr->SetColumnWidth(this->GetNativeData()->GetPropertyID(),static_cast<UInt16>(width)) == noErr,_("Could not set column width."));
2618 }
2619 }
2620}
2621
2622void wxDataViewColumn::SetAsSortKey(bool WXUNUSED(sort))
2623{
2624 // see wxGTK native wxDataViewColumn implementation
2625 wxFAIL_MSG( "not implemented" );
2626}
2627
2628void wxDataViewColumn::SetNativeData(wxDataViewColumnNativeData* newNativeDataPtr)
2629{
2630 delete this->m_NativeDataPtr;
2631 this->m_NativeDataPtr = newNativeDataPtr;
2632}
489468fe 2633
e86edab0 2634#endif // wxUSE_DATAVIEWCTRL && !wxUSE_GENERICDATAVIEWCTRL