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