]> git.saurik.com Git - wxWidgets.git/blame - src/osx/carbon/dataview.cpp
Show labels for controls in wxOSX/Carbon toolbars.
[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{
de40d736 857 SetDisclosureColumn(columnPtr->GetNativeData()->GetPropertyID(),false); // second parameter explicitely 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
de40d736 892 wxCFStringRef title(columnPtr->GetTitle(),m_font.Ok() ? 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//
1098int wxMacDataViewDataBrowserListViewControl::GetSelections(wxDataViewItemArray& sel) const
489468fe 1099{
e86edab0 1100 size_t noOfSelectedItems;
5829b303 1101
e86edab0 1102 wxArrayDataBrowserItemID itemIDs;
5829b303 1103
5829b303 1104
de40d736 1105 noOfSelectedItems = GetSelectedItemIDs(itemIDs);
e86edab0
RR
1106 sel.Empty();
1107 sel.SetCount(noOfSelectedItems);
1108 for (size_t i=0; i<noOfSelectedItems; ++i)
1109 sel[i] = wxDataViewItem(reinterpret_cast<void*>(itemIDs[i]));
1110 return static_cast<int>(noOfSelectedItems);
5829b303 1111}
489468fe 1112
e86edab0 1113bool wxMacDataViewDataBrowserListViewControl::IsSelected(wxDataViewItem const& item) const
489468fe 1114{
de40d736 1115 return IsItemSelected(reinterpret_cast<DataBrowserItemID>(item.GetID()));
5829b303 1116}
489468fe 1117
e86edab0 1118void wxMacDataViewDataBrowserListViewControl::Select(wxDataViewItem const& item)
489468fe 1119{
e86edab0 1120 DataBrowserItemID itemID(reinterpret_cast<DataBrowserItemID>(item.GetID()));
5829b303 1121
e86edab0 1122
de40d736 1123 SetSelectedItems(1,&itemID,kDataBrowserItemsAdd);
5829b303 1124}
489468fe 1125
de40d736 1126void wxMacDataViewDataBrowserListViewControl::SelectAll()
489468fe 1127{
e86edab0
RR
1128 DataBrowserItemID* itemIDPtr;
1129
1130 Handle handle(::NewHandle(0));
489468fe 1131
e86edab0 1132 size_t noOfItems;
489468fe 1133
e86edab0 1134
de40d736 1135 wxCHECK_RET(GetItems(kDataBrowserNoItem,true,kDataBrowserItemAnyState,handle) == noErr,_("Could not get items."));
e86edab0
RR
1136 noOfItems = static_cast<size_t>(::GetHandleSize(handle)/sizeof(DataBrowserItemID));
1137 ::HLock(handle);
1138 itemIDPtr = (DataBrowserItemID*) (*handle);
de40d736 1139 SetSelectedItems(noOfItems,itemIDPtr,kDataBrowserItemsAssign);
e86edab0
RR
1140 ::HUnlock(handle);
1141 ::DisposeHandle(handle);
5829b303 1142}
489468fe 1143
e86edab0 1144void wxMacDataViewDataBrowserListViewControl::Unselect(wxDataViewItem const& item)
489468fe 1145{
e86edab0 1146 DataBrowserItemID itemID(reinterpret_cast<DataBrowserItemID>(item.GetID()));
a881f34e 1147
489468fe 1148
de40d736 1149 SetSelectedItems(1,&itemID,kDataBrowserItemsRemove);
5829b303 1150}
489468fe 1151
de40d736 1152void wxMacDataViewDataBrowserListViewControl::UnselectAll()
489468fe 1153{
e86edab0 1154 DataBrowserItemID* itemIDPtr;
5829b303 1155
e86edab0 1156 Handle handle(::NewHandle(0));
5829b303 1157
e86edab0 1158 size_t noOfItems;
489468fe 1159
e86edab0 1160
de40d736 1161 wxCHECK_RET(GetItems(kDataBrowserNoItem,true,kDataBrowserItemAnyState,handle) == noErr,_("Could not get items."));
e86edab0
RR
1162 noOfItems = static_cast<size_t>(::GetHandleSize(handle)/sizeof(DataBrowserItemID));
1163 ::HLock(handle);
1164 itemIDPtr = (DataBrowserItemID*) (*handle);
de40d736 1165 SetSelectedItems(noOfItems,itemIDPtr,kDataBrowserItemsRemove);
e86edab0
RR
1166 ::HUnlock(handle);
1167 ::DisposeHandle(handle);
739a8399
RR
1168}
1169
e86edab0
RR
1170//
1171// sorting related methods
1172//
de40d736 1173wxDataViewColumn* wxMacDataViewDataBrowserListViewControl::GetSortingColumn() const
489468fe
SC
1174{
1175 DataBrowserPropertyID propertyID;
1176
5829b303 1177
de40d736
VZ
1178 if (GetSortProperty(&propertyID) == noErr)
1179 return GetColumnPtr(propertyID);
489468fe
SC
1180 else
1181 return NULL;
5829b303 1182}
489468fe 1183
de40d736 1184void wxMacDataViewDataBrowserListViewControl::Resort()
489468fe 1185{
de40d736 1186 (void) Resort();
5829b303 1187}
489468fe 1188
e86edab0
RR
1189//
1190// other methods (inherited from wxDataViewWidgetImpl)
1191//
8f2a8de6
VZ
1192void
1193wxMacDataViewDataBrowserListViewControl::HitTest(const wxPoint& WXUNUSED(point),
1194 wxDataViewItem& item,
1195 wxDataViewColumn*& columnPtr) const
489468fe 1196{
e86edab0
RR
1197 // not yet implemented:
1198 item = wxDataViewItem();
1199 columnPtr = NULL;
5829b303 1200}
489468fe 1201
e86edab0 1202void wxMacDataViewDataBrowserListViewControl::DoSetIndent(int indent)
489468fe 1203{
de40d736 1204 SetIndent(static_cast<float>(indent));
5829b303 1205}
489468fe 1206
e86edab0 1207void wxMacDataViewDataBrowserListViewControl::SetRowHeight(wxDataViewItem const& item, unsigned int height)
489468fe 1208{
de40d736 1209 SetItemRowHeight(reinterpret_cast<DataBrowserItemID>(item.GetID()),static_cast<UInt16>(height));
5829b303 1210}
489468fe 1211
de40d736 1212void wxMacDataViewDataBrowserListViewControl::OnSize()
489468fe 1213{
e86edab0 1214 UInt32 noOfColumns;
8f2a8de6
VZ
1215
1216
de40d736 1217 GetColumnCount(&noOfColumns);
e86edab0
RR
1218 if (noOfColumns <= 1) // no horizontal scroll bar and the only column expands to the width of the whole control
1219 {
de40d736
VZ
1220 SetHasScrollBars(false,true);
1221 AutoSizeColumns();
e86edab0
RR
1222 }
1223 else // otherwise keep the current column size and have scrollbars in both directions
de40d736 1224 SetHasScrollBars(true,true);
5829b303 1225}
489468fe 1226
e86edab0
RR
1227//
1228// callback functions (inherited from wxMacDataBrowserTableViewControl)
1229//
1230Boolean wxMacDataViewDataBrowserListViewControl::DataBrowserCompareProc(DataBrowserItemID itemOneID, DataBrowserItemID itemTwoID, DataBrowserPropertyID sortProperty)
489468fe 1231{
e86edab0 1232 DataBrowserSortOrder sortOrder;
5829b303 1233
e86edab0 1234 DataBrowserTableViewColumnIndex modelColumnIndex;
8f2a8de6 1235
de40d736 1236 wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(GetWXPeer()));
8f2a8de6 1237
5829b303 1238
e86edab0
RR
1239 wxCHECK_MSG(dataViewCtrlPtr != NULL, false,_("Pointer to data view control not set correctly."));
1240 wxCHECK_MSG(dataViewCtrlPtr->GetModel() != NULL,false,_("Pointer to model not set correctly."));
1241 if (sortProperty >= kMinPropertyID)
1242 {
1243 // variable definition and initialization:
de40d736 1244 wxDataViewColumn* ColumnPtr(GetColumnPtr(sortProperty));
8f2a8de6 1245
e86edab0
RR
1246 wxCHECK_MSG(ColumnPtr != NULL,false,_("Could not determine column index."));
1247 modelColumnIndex = ColumnPtr->GetModelColumn();
1248 }
1249 else
1250 modelColumnIndex = 0;
de40d736 1251 GetSortOrder(&sortOrder);
e86edab0
RR
1252 return static_cast<Boolean>(dataViewCtrlPtr->GetModel()->Compare(wxDataViewItem(reinterpret_cast<void*>(itemOneID)),wxDataViewItem(reinterpret_cast<void*>(itemTwoID)),
1253 modelColumnIndex,sortOrder != kDataBrowserOrderDecreasing) < 0);
de40d736 1254}
489468fe 1255
e86edab0
RR
1256void wxMacDataViewDataBrowserListViewControl::DataBrowserGetContextualMenuProc(MenuRef* menu, UInt32* helpType, CFStringRef* helpItemString, AEDesc* WXUNUSED(selection))
1257 // In this method we do not supply a contextual menu handler at all but only send a wxEVT_COMMAND_DATAVIEW_ITEM_CONTEXT_MENU.
489468fe 1258{
e86edab0 1259 wxArrayDataBrowserItemID itemIDs;
5829b303 1260
de40d736 1261 wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(GetWXPeer()));
5829b303 1262
5829b303 1263
e86edab0
RR
1264 wxCHECK_RET(dataViewCtrlPtr != NULL,_("wxWidget control pointer is not a data view pointer"));
1265 // initialize parameters so that no context menu will be displayed automatically by the native data browser:
1266 *menu = NULL;
1267 *helpType = kCMHelpItemNoHelp;
1268 *helpItemString = NULL;
1269 // create information for a context menu event:
1270 wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_CONTEXT_MENU,dataViewCtrlPtr->GetId());
5829b303 1271
e86edab0
RR
1272 dataViewEvent.SetEventObject(dataViewCtrlPtr);
1273 dataViewEvent.SetModel(dataViewCtrlPtr->GetModel());
1274 // get the item information;
1275 // 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 1276 if (GetSelectedItemIDs(itemIDs) > 0)
e86edab0
RR
1277 dataViewEvent.SetItem(wxDataViewItem(reinterpret_cast<void*>(itemIDs[0])));
1278 // finally send the equivalent wxWidget event:
1279 dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
de40d736 1280}
489468fe 1281
e86edab0 1282OSStatus wxMacDataViewDataBrowserListViewControl::DataBrowserGetSetItemDataProc(DataBrowserItemID itemID, DataBrowserPropertyID propertyID, DataBrowserItemDataRef itemData, Boolean getValue)
489468fe 1283{
e86edab0 1284 if (getValue)
489468fe 1285 {
e86edab0
RR
1286 // variable definitions:
1287 wxDataViewCtrl* dataViewCtrlPtr;
8f2a8de6 1288
de40d736 1289 dataViewCtrlPtr = dynamic_cast<wxDataViewCtrl*>(GetWXPeer());
e86edab0
RR
1290 wxCHECK_MSG(dataViewCtrlPtr != NULL,errDataBrowserNotConfigured,_("Pointer to data view control not set correctly."));
1291 if (dataViewCtrlPtr->IsDeleting())
1292 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
1293 else
1294 {
1295 // variable definitions:
1296 OSStatus errorStatus;
1297 wxDataViewColumn* dataViewColumnPtr;
8f2a8de6 1298
e86edab0 1299 wxCHECK_MSG(dataViewCtrlPtr->GetModel() != NULL,errDataBrowserNotConfigured,_("Pointer to model not set correctly."));
de40d736 1300 dataViewColumnPtr = GetColumnPtr(propertyID);
e86edab0
RR
1301 wxCHECK_MSG((dataViewColumnPtr != NULL) && (dataViewColumnPtr->GetRenderer() != NULL),errDataBrowserNotConfigured,_("There is no column or renderer for the specified column index."));
1302
1303 wxDataViewItem dvItem(reinterpret_cast<void*>(itemID));
1304 unsigned int col = dataViewColumnPtr->GetModelColumn();
8f2a8de6 1305
e86edab0
RR
1306 switch (dataViewColumnPtr->GetRenderer()->GetNativeData()->GetPropertyType())
1307 {
1308 case kDataBrowserCheckboxType:
1309 {
1310 // variable definition:
1311 ThemeButtonValue buttonValue;
5829b303 1312
e86edab0
RR
1313 errorStatus = ::GetDataBrowserItemDataButtonValue(itemData,&buttonValue);
1314 if (errorStatus == noErr)
1315 {
1316 if (buttonValue == kThemeButtonOn)
1317 {
1318 // variable definition and initialization:
1319 wxVariant modifiedData(true);
1320
795dac4c 1321 if (dataViewCtrlPtr->GetModel()->ChangeValue(modifiedData, dvItem, col))
e86edab0
RR
1322 return noErr;
1323 else
1324 return errDataBrowserInvalidPropertyData;
1325 }
1326 else if (buttonValue == kThemeButtonOff)
1327 {
1328 // variable definition and initialization:
1329 wxVariant modifiedData(false);
1330
795dac4c 1331 if (dataViewCtrlPtr->GetModel()->ChangeValue(modifiedData, dvItem, col))
e86edab0
RR
1332 return noErr;
1333 else
1334 return errDataBrowserInvalidPropertyData;
1335 }
1336 else
1337 return errDataBrowserInvalidPropertyData;
1338 }
1339 else
1340 return errorStatus;
1341 } /* block */
1342 case kDataBrowserTextType:
1343 {
1344 // variable definitions:
1345 CFStringRef stringReference;
1346
1347 errorStatus = ::GetDataBrowserItemDataText(itemData,&stringReference);
1348 if (errorStatus == noErr)
1349 {
1350 // variable definitions and initializations:
1351#if wxCHECK_VERSION(2,9,0)
1352 wxCFStringRef modifiedString(stringReference);
1353#else
1354 wxMacCFStringHolder modifiedString(stringReference);
1355#endif
1356 wxVariant modifiedData(modifiedString.AsString());
8f2a8de6 1357
795dac4c 1358 if (dataViewCtrlPtr->GetModel()->ChangeValue(modifiedData, dvItem, col))
e86edab0
RR
1359 return noErr;
1360 else
1361 return errDataBrowserInvalidPropertyData;
1362 }
1363 else
1364 return errorStatus;
1365 } /* block */
1366 default:
1367 return errDataBrowserPropertyNotSupported;
1368 }
1369 }
5829b303 1370 }
e86edab0
RR
1371 else
1372 {
1373 if (propertyID >= kMinPropertyID) // in case data columns set the data
1374 {
1375 // variable definitions:
1376 wxVariant variant;
1377 wxDataViewColumn* dataViewColumnPtr;
1378 wxDataViewCtrl* dataViewCtrlPtr;
8f2a8de6 1379
de40d736 1380 dataViewCtrlPtr = dynamic_cast<wxDataViewCtrl*>(GetWXPeer());
e86edab0
RR
1381 wxCHECK_MSG(dataViewCtrlPtr != NULL,errDataBrowserNotConfigured,_("Pointer to data view control not set correctly."));
1382 wxCHECK_MSG(dataViewCtrlPtr->GetModel() != NULL,errDataBrowserNotConfigured,_("Pointer to model not set correctly."));
de40d736 1383 dataViewColumnPtr = GetColumnPtr(propertyID);
e86edab0
RR
1384 wxCHECK_MSG(dataViewColumnPtr != NULL,errDataBrowserNotConfigured,_("No column for the specified column position existing."));
1385 wxCHECK_MSG(dataViewColumnPtr->GetRenderer() != NULL,errDataBrowserNotConfigured,_("No renderer specified for column."));
1386 dataViewCtrlPtr->GetModel()->GetValue(variant,wxDataViewItem(reinterpret_cast<void*>(itemID)),dataViewColumnPtr->GetModelColumn());
1387 if (!(variant.IsNull()))
1388 {
1389 dataViewColumnPtr->GetRenderer()->GetNativeData()->SetItemDataRef(itemData);
1390 dataViewColumnPtr->GetRenderer()->SetValue(variant);
8f2a8de6 1391 wxCHECK_MSG(dataViewColumnPtr->GetRenderer()->MacRender(),errDataBrowserNotConfigured,_("Rendering failed."));
e86edab0
RR
1392 }
1393 return noErr;
1394 }
1395 else // react on special system requests
1396 {
1397 switch (propertyID)
1398 {
1399 case kDataBrowserContainerIsClosableProperty:
1400 {
1401 // variable definitions:
de40d736 1402 wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(GetWXPeer()));
8f2a8de6 1403
e86edab0
RR
1404 wxCHECK_MSG(dataViewCtrlPtr != NULL,errDataBrowserNotConfigured,_("Pointer to data view control not set correctly."));
1405 // initialize wxWidget event:
1406 wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSING,dataViewCtrlPtr->GetId()); // variable definition
8f2a8de6 1407
e86edab0
RR
1408 dataViewEvent.SetEventObject(dataViewCtrlPtr);
1409 dataViewEvent.SetItem (wxDataViewItem(reinterpret_cast<void*>(itemID)));
1410 dataViewEvent.SetModel (dataViewCtrlPtr->GetModel());
1411 // finally send the equivalent wxWidget event:
1412 dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
1413 // opening the container is allowed if not vetoed:
1414 return ::SetDataBrowserItemDataBooleanValue(itemData,dataViewEvent.IsAllowed());
1415 } /* block */
1416 case kDataBrowserContainerIsOpenableProperty:
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_EXPANDING,dataViewCtrlPtr->GetId()); // variable definition
1424
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 kDataBrowserItemIsContainerProperty:
1434 {
1435 // variable definition:
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 wxCHECK_MSG(dataViewCtrlPtr->GetModel() != NULL,errDataBrowserNotConfigured,_("Pointer to model not set correctly."));
1440 return ::SetDataBrowserItemDataBooleanValue(itemData,dataViewCtrlPtr->GetModel()->IsContainer(wxDataViewItem(reinterpret_cast<void*>(itemID))));
1441 } /* block */
1442 case kDataBrowserItemIsEditableProperty:
1443 return ::SetDataBrowserItemDataBooleanValue(itemData,true);
1444 }
1445 }
1446 }
1447 return errDataBrowserPropertyNotSupported;
de40d736 1448}
489468fe 1449
e86edab0 1450void wxMacDataViewDataBrowserListViewControl::DataBrowserItemNotificationProc(DataBrowserItemID itemID, DataBrowserItemNotification message, DataBrowserItemDataRef itemData)
489468fe 1451{
de40d736 1452 wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(GetWXPeer()));
489468fe 1453
489468fe 1454
e86edab0
RR
1455 // 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:
1456 if (dataViewCtrlPtr != NULL)
1457 switch (message)
4219d8b0 1458 {
e86edab0
RR
1459 case kDataBrowserContainerClosed:
1460 dataViewCtrlPtr->FinishCustomItemEditing(); // stop editing of a custom item first (if necessary)
4219d8b0 1461 {
e86edab0
RR
1462 // initialize wxWidget event:
1463 wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSED,dataViewCtrlPtr->GetId()); // variable definition
8f2a8de6 1464
e86edab0
RR
1465 dataViewEvent.SetEventObject(dataViewCtrlPtr);
1466 dataViewEvent.SetItem(wxDataViewItem(reinterpret_cast<void*>(itemID)));
1467 // finally send the equivalent wxWidget event:
1468 dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
1469 } /* block */
1470 break;
1471 case kDataBrowserContainerOpened:
1472 dataViewCtrlPtr->FinishCustomItemEditing(); // stop editing of a custom item first (if necessary)
1473 {
1474 // initialize wxWidget event:
1475 wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDED,dataViewCtrlPtr->GetId()); // variable definition
8f2a8de6 1476
e86edab0
RR
1477 dataViewEvent.SetEventObject(dataViewCtrlPtr);
1478 dataViewEvent.SetItem(wxDataViewItem(reinterpret_cast<void*>(itemID)));
1479 // finally send the equivalent wxWidget event:
1480 dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
1481 // add children to the expanded container:
1482 dataViewCtrlPtr->AddChildren(wxDataViewItem(reinterpret_cast<void*>(itemID)));
1483 } /* block */
1484 break;
1485 case kDataBrowserEditStarted:
1486 dataViewCtrlPtr->FinishCustomItemEditing(); // stop editing of a custom item first (if necessary)
1487 {
1488 // initialize wxWidget event:
8f2a8de6 1489 DataBrowserPropertyID propertyID;
e86edab0 1490 wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_STARTED,dataViewCtrlPtr->GetId()); // variable definition
8f2a8de6 1491
e86edab0
RR
1492 dataViewEvent.SetEventObject(dataViewCtrlPtr);
1493 dataViewEvent.SetItem(wxDataViewItem(reinterpret_cast<void*>(itemID)));
de40d736 1494 if (GetPropertyID(itemData,&propertyID) == noErr)
e86edab0
RR
1495 {
1496 // variable definition and initialization:
1497 DataBrowserTableViewColumnIndex columnIndex;
8f2a8de6 1498
de40d736 1499 wxCHECK_RET(GetColumnIndex(propertyID,&columnIndex),_("Column index not found."));
e86edab0 1500 dataViewEvent.SetColumn(columnIndex);
de40d736 1501 dataViewEvent.SetDataViewColumn(GetColumnPtr(propertyID));
e86edab0
RR
1502 }
1503 // finally send the equivalent wxWidget event:
1504 dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
1505 } /* block */
1506 break;
1507 case kDataBrowserEditStopped:
1508 {
1509 // initialize wxWidget event:
8f2a8de6 1510 DataBrowserPropertyID propertyID;
e86edab0 1511 wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE,dataViewCtrlPtr->GetId()); // variable definition
8f2a8de6 1512
e86edab0
RR
1513 dataViewEvent.SetEventObject(dataViewCtrlPtr);
1514 dataViewEvent.SetItem(wxDataViewItem(reinterpret_cast<void*>(itemID)));
de40d736 1515 if (GetPropertyID(itemData,&propertyID) == noErr)
e86edab0
RR
1516 {
1517 // variable definition and initialization:
1518 DataBrowserTableViewColumnIndex columnIndex;
1519
de40d736 1520 wxCHECK_RET(GetColumnIndex(propertyID,&columnIndex),_("Column index not found."));
e86edab0 1521 dataViewEvent.SetColumn(columnIndex);
de40d736 1522 dataViewEvent.SetDataViewColumn(GetColumnPtr(propertyID));
e86edab0
RR
1523 }
1524 // finally send the equivalent wxWidget event:
1525 dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
1526 } /* block */
1527 break;
1528 case kDataBrowserItemAdded:
1529 dataViewCtrlPtr->FinishCustomItemEditing();
1530 break;
1531 case kDataBrowserItemDeselected:
1532 dataViewCtrlPtr->FinishCustomItemEditing();
1533 break;
1534 case kDataBrowserItemDoubleClicked:
1535 {
1536 // initialize wxWidget event:
1537 wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_ACTIVATED,dataViewCtrlPtr->GetId()); // variable definition
1538
1539 dataViewEvent.SetEventObject(dataViewCtrlPtr);
1540 dataViewEvent.SetItem(wxDataViewItem(reinterpret_cast<void*>(itemID)));
1541 // finally send the equivalent wxWidget event:
1542 dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
1543 } /* block */
1544 break;
1545 case kDataBrowserItemRemoved:
1546 dataViewCtrlPtr->FinishCustomItemEditing(); // stop editing of a custom item first (if necessary)
1547 break;
1548 case kDataBrowserItemSelected:
1549 break; // not implemented by wxWidgets; see kDataBrowserSelectionSetChanged
1550 case kDataBrowserSelectionSetChanged:
1551 {
1552 // initialize wxWidget event:
1553 wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_SELECTION_CHANGED,dataViewCtrlPtr->GetId()); // variable definition
1554
1555 dataViewEvent.SetEventObject(dataViewCtrlPtr);
1556 dataViewEvent.SetModel (dataViewCtrlPtr->GetModel());
1557 // finally send the equivalent wxWidget event:
1558 dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
1559 } /* block */
1560 break;
1561 case kDataBrowserTargetChanged: // no idea if this notification is ever sent
1562 break;
1563 case kDataBrowserUserStateChanged:
1564 {
1565 // finish custom item editing if necessary:
1566 dataViewCtrlPtr->FinishCustomItemEditing();
1567 // update column widths:
1568 for (size_t i=0; i<dataViewCtrlPtr->GetColumnCount(); ++i)
1569 {
1570 // constant definition for abbreviational purposes:
1571 wxDataViewColumn* const columnPtr = dataViewCtrlPtr->GetColumnPtr(i);
1572 // variable definition:
1573 UInt16 columnWidth;
8f2a8de6 1574
de40d736 1575 wxCHECK_RET(GetColumnWidth(columnPtr->GetNativeData()->GetPropertyID(),&columnWidth) == noErr,_("Column width could not be determined"));
e86edab0
RR
1576 columnPtr->SetWidthVariable(columnWidth);
1577 }
1578 // update sorting orders:
1579 DataBrowserPropertyID propertyID; // variable definition
1580
de40d736 1581 if ((GetSortProperty(&propertyID) == noErr) && (propertyID >= kMinPropertyID))
e86edab0
RR
1582 {
1583 DataBrowserSortOrder sortOrder;
1584 DataBrowserTableViewColumnIndex columnIndex;
8f2a8de6 1585
de40d736 1586 if ((GetSortOrder(&sortOrder) == noErr) && (GetColumnIndex(propertyID,&columnIndex) == noErr))
e86edab0
RR
1587 {
1588 // variable definition and initialization:
1589 wxDataViewColumn* columnPtr;
1590 columnPtr = dataViewCtrlPtr->GetColumn(columnIndex);
1591 // check if the sort order has changed:
1592 if ( columnPtr->IsSortOrderAscending() && (sortOrder == kDataBrowserOrderDecreasing) ||
1593 !(columnPtr->IsSortOrderAscending()) && (sortOrder == kDataBrowserOrderIncreasing))
1594 {
1595 columnPtr->SetSortOrder(!(columnPtr->IsSortOrderAscending()));
1596 // initialize wxWidget event:
1597 wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_COLUMN_SORTED,dataViewCtrlPtr->GetId()); // variable defintion
1598
1599 dataViewEvent.SetEventObject(dataViewCtrlPtr);
1600 dataViewEvent.SetColumn(columnIndex);
1601 dataViewEvent.SetDataViewColumn(columnPtr);
1602 // finally send the equivalent wxWidget event:
1603 dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
1604 }
1605 }
1606 }
1607 } /* block */
1608 break;
4219d8b0 1609 }
de40d736 1610}
5829b303 1611
8f2a8de6
VZ
1612void
1613wxMacDataViewDataBrowserListViewControl::DataBrowserDrawItemProc(DataBrowserItemID itemID,
1614 DataBrowserPropertyID propertyID,
1615 DataBrowserItemState state,
1616 Rect const* rectangle,
1617 SInt16 WXUNUSED(bitDepth),
1618 Boolean WXUNUSED(colorDevice))
e86edab0
RR
1619{
1620 DataBrowserTableViewColumnIndex columnIndex;
5829b303 1621
e86edab0 1622 wxDataViewColumn* dataViewColumnPtr;
489468fe 1623
e86edab0 1624 wxDataViewCtrl* dataViewCtrlPtr;
8f2a8de6 1625
e86edab0
RR
1626 wxDataViewCustomRenderer* dataViewCustomRendererPtr;
1627
1628 wxVariant dataToRender;
1629
de40d736 1630 dataViewCtrlPtr = dynamic_cast<wxDataViewCtrl*>(GetWXPeer());
e86edab0
RR
1631 wxCHECK_RET(dataViewCtrlPtr != NULL, _("Pointer to data view control not set correctly."));
1632 wxCHECK_RET(dataViewCtrlPtr->GetModel() != NULL, _("Pointer to model not set correctly."));
de40d736
VZ
1633 wxCHECK_RET(GetColumnIndex(propertyID,&columnIndex) == noErr,_("Could not determine column index."));
1634 dataViewColumnPtr = GetColumnPtr(propertyID);
e86edab0
RR
1635 wxCHECK_RET(dataViewColumnPtr != NULL,_("No column for the specified column existing."));
1636 dataViewCustomRendererPtr = dynamic_cast<wxDataViewCustomRenderer*>(dataViewColumnPtr->GetRenderer());
1637 wxCHECK_RET(dataViewCustomRendererPtr != NULL,_("No renderer or invalid renderer type specified for custom data column."));
1638 dataViewCtrlPtr->GetModel()->GetValue(dataToRender,wxDataViewItem(reinterpret_cast<void*>(itemID)),dataViewColumnPtr->GetModelColumn());
1639 dataViewCustomRendererPtr->SetValue(dataToRender);
1640
1641 wxDataViewItem dataItem( reinterpret_cast<void*>(itemID) );
1642 dataViewCtrlPtr->GetModel()->GetValue(dataToRender,dataItem,dataViewColumnPtr->GetModelColumn());
1643 dataViewCustomRendererPtr->SetValue(dataToRender);
1644
1645 // try to determine the content's size (drawable part):
1646 Rect content;
1647 RgnHandle rgn(NewRgn());
1648 UInt16 headerHeight;
1649
1650 if (GetControlRegion(m_controlRef,kControlContentMetaPart,rgn) == noErr)
1651 GetRegionBounds(rgn,&content);
1652 else
1653 GetControlBounds(m_controlRef, &content);
1654 ::DisposeRgn(rgn);
1655 // space for the header
de40d736 1656 GetHeaderButtonHeight(&headerHeight);
e86edab0
RR
1657 content.top += headerHeight;
1658 // extra space for the frame (todo: do not how to determine the space automatically from the control)
1659 content.top += 5;
1660 content.left += 5;
1661 content.right -= 3;
1662 content.bottom -= 3;
1663 // extra space for the scrollbars:
1664 content.bottom -= wxSystemSettings::GetMetric(wxSYS_HSCROLL_Y);
1665 content.right -= wxSystemSettings::GetMetric(wxSYS_VSCROLL_X);
1666
1667 wxDC *dc = dataViewCustomRendererPtr->GetDC();
8f2a8de6 1668
35d85392
RR
1669 int active_border_fudge = 0;
1670 if (dataViewCtrlPtr->HasFocus() && !dataViewCtrlPtr->HasFlag( wxBORDER_NONE ))
1671 active_border_fudge = 1;
1672 else
1673 active_border_fudge = -2;
8f2a8de6 1674
35d85392
RR
1675 wxRect cellrect( static_cast<int>(rectangle->left + active_border_fudge),
1676 static_cast<int>(rectangle->top + active_border_fudge),
e86edab0
RR
1677 static_cast<int>(1+rectangle->right-rectangle->left),
1678 static_cast<int>(rectangle->bottom-rectangle->top) );
8f2a8de6 1679
de40d736 1680 bool is_active = IsControlActive( m_controlRef );
e86edab0 1681 if (state == kDataBrowserItemIsSelected)
489468fe 1682 {
8f2a8de6 1683 wxColour col( wxMacCreateCGColorFromHITheme( (is_active) ?
e86edab0
RR
1684 kThemeBrushAlternatePrimaryHighlightColor
1685 : kThemeBrushSecondaryHighlightColor ) );
8f2a8de6 1686
e86edab0
RR
1687 wxRect rect = cellrect;
1688 Rect itemrect;
de40d736 1689 GetDataBrowserItemPartBounds( m_controlRef, itemID, propertyID,
e86edab0 1690 kDataBrowserPropertyEnclosingPart, &itemrect );
35d85392
RR
1691 rect.x = itemrect.left-2;
1692 rect.width = itemrect.right-itemrect.left+3;
8f2a8de6 1693
0b2a23c4
VZ
1694 wxDCPenChanger setPen(*dc, *wxTRANSPARENT_PEN);
1695 wxDCBrushChanger setBrush(*dc, col);
e86edab0 1696 dc->DrawRectangle(rect);
e86edab0 1697 }
5829b303 1698
e86edab0
RR
1699 wxDataViewModel *model = dataViewCtrlPtr->GetModel();
1700 if ((columnIndex == 0) || !model->IsContainer(dataItem) || model->HasContainerColumns(dataItem))
8f2a8de6 1701 {
e86edab0
RR
1702 // make sure that 'Render' can draw only in the allowed area:
1703 dc->SetClippingRegion(content.left,content.top,content.right-content.left+1,content.bottom-content.top+1);
62265c2c 1704 (void) (dataViewCustomRendererPtr->WXCallRender( cellrect, dc,
e86edab0
RR
1705 ((state == kDataBrowserItemIsSelected) ? wxDATAVIEW_CELL_SELECTED : 0)));
1706 dc->DestroyClippingRegion(); // probably not necessary
5829b303 1707 }
8f2a8de6 1708
e86edab0 1709 dataViewCustomRendererPtr->SetDC(NULL);
de40d736 1710}
489468fe 1711
8f2a8de6
VZ
1712Boolean
1713wxMacDataViewDataBrowserListViewControl::DataBrowserEditItemProc(
1714 DataBrowserItemID WXUNUSED(itemID),
1715 DataBrowserPropertyID WXUNUSED(propertyID),
1716 CFStringRef WXUNUSED(theString),
1717 Rect* WXUNUSED(maxEditTextRect),
1718 Boolean* WXUNUSED(shrinkToFit))
489468fe 1719{
e86edab0 1720 return false;
de40d736 1721}
5829b303 1722
e86edab0
RR
1723Boolean wxMacDataViewDataBrowserListViewControl::DataBrowserHitTestProc(DataBrowserItemID WXUNUSED(itemID), DataBrowserPropertyID WXUNUSED(property), Rect const* WXUNUSED(theRect), Rect const* WXUNUSED(mouseRect))
1724{
1725 return true;
de40d736 1726}
5829b303 1727
e86edab0
RR
1728DataBrowserTrackingResult wxMacDataViewDataBrowserListViewControl::DataBrowserTrackingProc(DataBrowserItemID itemID, DataBrowserPropertyID propertyID, Rect const* theRect, Point WXUNUSED(startPt), EventModifiers WXUNUSED(modifiers))
1729{
1730 wxDataViewColumn* dataViewColumnPtr;
5829b303 1731
e86edab0 1732 wxDataViewCtrl* dataViewCtrlPtr;
8f2a8de6 1733
e86edab0 1734 wxDataViewCustomRenderer* dataViewCustomRendererPtr;
8f2a8de6 1735
e86edab0
RR
1736 wxDataViewItem dataViewCustomRendererItem;
1737
1738
de40d736 1739 dataViewCtrlPtr = dynamic_cast<wxDataViewCtrl*>(GetWXPeer());
e86edab0
RR
1740 wxCHECK_MSG(dataViewCtrlPtr != NULL, false,_("Pointer to data view control not set correctly."));
1741 wxCHECK_MSG(dataViewCtrlPtr->GetModel() != NULL,false,_("Pointer to model not set correctly."));
1742 dataViewCustomRendererItem = reinterpret_cast<void*>(itemID);
1743 wxCHECK_MSG(dataViewCustomRendererItem.IsOk(),kDataBrowserNothingHit,_("Invalid data view item"));
de40d736 1744 dataViewColumnPtr = GetColumnPtr(propertyID);
e86edab0
RR
1745 wxCHECK_MSG(dataViewColumnPtr != NULL,kDataBrowserNothingHit,_("No column existing."));
1746 dataViewCustomRendererPtr = dynamic_cast<wxDataViewCustomRenderer*>(dataViewColumnPtr->GetRenderer());
1747 wxCHECK_MSG(dataViewCustomRendererPtr != NULL,kDataBrowserNothingHit,_("No renderer or invalid renderer type specified for custom data column."));
1748 // 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):
1749 if (dataViewCtrlPtr->GetCustomRendererItem() == dataViewCustomRendererItem)
1750 return kDataBrowserContentHit;
1751 // an(other) item is going to be edited and therefore the current editing - if existing - has to be finished:
1752 if (dataViewCtrlPtr->GetCustomRendererPtr() != NULL)
1753 {
1754 dataViewCtrlPtr->GetCustomRendererPtr()->FinishEditing();
1755 dataViewCtrlPtr->SetCustomRendererItem(wxDataViewItem());
1756 dataViewCtrlPtr->SetCustomRendererPtr (NULL);
1757 }
1758 // check if renderer has got a valid editor control for editing; if this is the case start editing of the new item:
1759 if (dataViewCustomRendererPtr->HasEditorCtrl())
1760 {
1761 // variable definition:
1762 wxRect wxRectangle;
8f2a8de6 1763
e86edab0
RR
1764 ::wxMacNativeToRect(theRect,&wxRectangle);
1765 dataViewCustomRendererPtr->StartEditing(dataViewCustomRendererItem,wxRectangle);
1766 dataViewCtrlPtr->SetCustomRendererItem(dataViewCustomRendererItem);
1767 dataViewCtrlPtr->SetCustomRendererPtr (dataViewCustomRendererPtr);
1768 }
1769 return kDataBrowserContentHit;
de40d736 1770}
5829b303 1771
e86edab0
RR
1772Boolean wxMacDataViewDataBrowserListViewControl::DataBrowserAcceptDragProc(DragReference dragRef, DataBrowserItemID itemID)
1773{
1774 bool acceptDrag;
5829b303 1775
e86edab0 1776 UInt16 noOfDraggedItems;
489468fe 1777
e86edab0 1778 wxDataViewCtrl* dataViewCtrlPtr;
489468fe 1779
5829b303 1780
de40d736 1781 dataViewCtrlPtr = dynamic_cast<wxDataViewCtrl*>(GetWXPeer());
e86edab0
RR
1782 wxCHECK_MSG(dataViewCtrlPtr != NULL, false,_("Pointer to data view control not set correctly."));
1783 wxCHECK_MSG(dataViewCtrlPtr->GetModel() != NULL,false,_("Pointer to model not set correctly."));
5829b303 1784
e86edab0
RR
1785 // send a drag possible event for each available and item und proceed with it unless the event is vetoed:
1786 ::CountDragItems(dragRef,&noOfDraggedItems);
1787 for (UInt16 indexDraggedItem=1; indexDraggedItem<=noOfDraggedItems; ++indexDraggedItem)
1788 {
1789 // collect native information:
1790 ItemReference itemRef;
1791 wxDataObjectComposite* dataObjects;
1792 wxMemoryBuffer buffer;
8f2a8de6 1793
e86edab0 1794 ::GetDragItemReferenceNumber(dragRef,indexDraggedItem,&itemRef); // the index begins with 1!
de40d736 1795 dataObjects = GetDnDDataObjects(dragRef,itemRef);
e86edab0
RR
1796 // create wxWidget's event:
1797 wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_DROP_POSSIBLE,dataViewCtrlPtr->GetId());
1798
1799 dataViewEvent.SetEventObject(dataViewCtrlPtr);
1800 dataViewEvent.SetItem(reinterpret_cast<void*>(itemID)); // this is the item that receives the event
1801 // (can be an invalid item ID, this is especially useful if the dataview does not contain any items)
1802 dataViewEvent.SetModel(dataViewCtrlPtr->GetModel());
1803 dataViewEvent.SetDataObject(dataObjects);
de40d736 1804 dataViewEvent.SetDataFormat(GetDnDDataFormat(dataObjects));
e86edab0
RR
1805 if (dataViewEvent.GetDataFormat().GetType() != wxDF_INVALID)
1806 {
1807 dataViewEvent.SetDataSize(dataObjects->GetDataSize(dataViewEvent.GetDataFormat().GetType()));
1808 dataObjects->GetDataHere(dataViewEvent.GetDataFormat().GetType(),buffer.GetWriteBuf(dataViewEvent.GetDataSize()));
1809 buffer.UngetWriteBuf(dataViewEvent.GetDataSize());
1810 dataViewEvent.SetDataBuffer(buffer.GetData());
1811 }
489468fe 1812
e86edab0
RR
1813 // send event:
1814 acceptDrag = dataViewCtrlPtr->HandleWindowEvent(dataViewEvent) && dataViewEvent.IsAllowed();
1815 delete dataObjects;
1816 if (!acceptDrag)
1817 return false;
1818 }
1819 return true;
de40d736 1820}
e86edab0
RR
1821
1822Boolean wxMacDataViewDataBrowserListViewControl::DataBrowserAddDragItemProc(DragReference dragRef, DataBrowserItemID itemID, ItemReference* itemRef)
489468fe 1823{
e86edab0
RR
1824 Boolean addDragItem;
1825
1826 wxDataViewCtrl* dataViewCtrlPtr;
8f2a8de6 1827
e86edab0
RR
1828 wxDataViewItem dataViewItem;
1829
1830
de40d736 1831 dataViewCtrlPtr = dynamic_cast<wxDataViewCtrl*>(GetWXPeer());
e86edab0
RR
1832 wxCHECK_MSG(dataViewCtrlPtr != NULL, false,_("Pointer to data view control not set correctly."));
1833 wxCHECK_MSG(dataViewCtrlPtr->GetModel() != NULL,false,_("Pointer to model not set correctly."));
1834 dataViewItem = reinterpret_cast<void*>(itemID);
1835 wxCHECK_MSG(dataViewItem.IsOk(),false,_("Invalid data view item"));
1836
1837 // send a begin drag event and proceed with dragging unless the event is vetoed:
1838 wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_BEGIN_DRAG,dataViewCtrlPtr->GetId());
1839
1840 dataViewEvent.SetEventObject(dataViewCtrlPtr);
1841 dataViewEvent.SetItem(dataViewItem);
1842 dataViewEvent.SetModel(dataViewCtrlPtr->GetModel());
1843 // 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
1844 // the object a wxDataObjectComposite object is used;
1845 // currently, the composite object only contains a TAB concatenated string of all data:
1846 wxDataObjectComposite* dataObject(new wxDataObjectComposite());
8f2a8de6 1847
e86edab0
RR
1848 dataObject->Add(new wxTextDataObject(::ConcatenateDataViewItemValues(dataViewCtrlPtr,dataViewItem)));
1849 dataViewEvent.SetDataObject(dataObject);
1850 // check if event has not been vetoed:
1851 addDragItem = dataViewCtrlPtr->HandleWindowEvent(dataViewEvent) && dataViewEvent.IsAllowed();
1852 if (addDragItem)
489468fe 1853 {
e86edab0
RR
1854 // for the internal drag & drop functions create two flavors:
1855 // - the data browser's item id;
1856 // - the data contained the dataview event object (if available).
1857 // Definition: a flavor is the type dependent representation of identical data.
1858 // Example: a number can be represented by its value and by its value converted to a string. In this case the flavor
1859 // of the number's internal representation is typeSInt32 while its string representation has got the flavor 'TEXT'.
1860 // Item id is one of the flavors:
1861 wxCHECK_MSG(::AddDragItemFlavor(dragRef,*itemRef,typeUInt32,&itemID,sizeof(itemID),0) == noErr,false,_("Unable to handle native drag&drop data"));
1862 // if the dataview event object contains data it is used for additional flavors; all natively known flavors are supported:
1863 if (dataViewEvent.GetDataObject() != NULL)
1864 {
1865 // constant definition for abbreviational purposes:
1866 size_t const noOfFormats = dataViewEvent.GetDataObject()->GetFormatCount();
8f2a8de6 1867
e86edab0
RR
1868 if (noOfFormats > 0)
1869 {
1870 // variable definition:
1871 wxDataFormat* dataFormats;
8f2a8de6 1872
e86edab0
RR
1873 dataFormats = new wxDataFormat[noOfFormats];
1874 dataViewEvent.GetDataObject()->GetAllFormats(dataFormats,wxDataObject::Get);
1875 for (size_t i=0; i<noOfFormats; ++i)
1876 switch (dataFormats[i].GetType())
1877 {
1878 case wxDF_INVALID:
1879 wxFAIL_MSG(_("Data object has invalid data format"));
1880 break;
1881 case wxDF_TEXT:
1882 {
1883 // constant definition for abbreviational purposes:
1884 size_t const dataSize = dataViewEvent.GetDataObject()->GetDataSize(wxDF_TEXT);
1885 // variable definition and initialization:
1886 wxMemoryBuffer dataObject(dataSize);
8f2a8de6 1887
e86edab0
RR
1888 dataViewEvent.GetDataObject()->GetDataHere(wxDF_TEXT,dataObject.GetWriteBuf(dataSize));
1889 dataObject.UngetWriteBuf(dataSize);
1890 if (::AddDragItemFlavor(dragRef,*itemRef,'TEXT',dataObject.GetData(),dataSize,0) != noErr)
1891 wxFAIL_MSG(_("Adding flavor TEXT failed"));
1892 } /* block */
1893 break;
1894 case wxDF_UNICODETEXT:
1895 {
1896 // constant definition for abbreviational purposes:
1897 size_t const dataSize = dataViewEvent.GetDataObject()->GetDataSize(wxDF_TEXT);
1898 // as there is no direct access to the data copy it to a memory buffer:
1899 wxMemoryBuffer dataObject(dataSize);
8f2a8de6 1900
e86edab0
RR
1901 dataViewEvent.GetDataObject()->GetDataHere(wxDF_TEXT,dataObject.GetWriteBuf(dataSize));
1902 dataObject.UngetWriteBuf(dataSize);
1903 // if the data is stored in unicode format the internal representation is utf-8 (not mentioned in the documentation but in the source code);
1904 // DnD uses fixed utf-16 representation -> use the OSX functions for a conversion:
1905 CFDataRef osxData (::CFDataCreateWithBytesNoCopy(kCFAllocatorDefault,reinterpret_cast<UInt8*>(dataObject.GetData()),dataSize,kCFAllocatorNull));
1906 CFStringRef osxString(::CFStringCreateFromExternalRepresentation(kCFAllocatorDefault,osxData,kCFStringEncodingUTF8));
8f2a8de6 1907
e86edab0
RR
1908 // the osxString contains now the data and therefore the previously occupied memory can be released and re-used:
1909 ::CFRelease(osxData);
1910 osxData = ::CFStringCreateExternalRepresentation(kCFAllocatorDefault,osxString,kCFStringEncodingUTF16,32);
1911 if (::AddDragItemFlavor(dragRef,*itemRef,'utxt',::CFDataGetBytePtr(osxData),::CFDataGetLength(osxData),0) != noErr)
1912 wxFAIL_MSG(_("Adding flavor utxt failed"));
1913 // clean up:
1914 ::CFRelease(osxData);
1915 ::CFRelease(osxString);
1916 } /* block */
1917 break;
1918 case wxDF_BITMAP:
1919 case wxDF_METAFILE:
1920 case wxDF_SYLK:
1921 case wxDF_DIF:
1922 case wxDF_TIFF:
1923 case wxDF_OEMTEXT:
1924 case wxDF_DIB:
1925 case wxDF_PALETTE:
1926 case wxDF_PENDATA:
1927 case wxDF_RIFF:
1928 case wxDF_WAVE:
1929 case wxDF_ENHMETAFILE:
1930 case wxDF_FILENAME:
1931 case wxDF_LOCALE:
1932 case wxDF_PRIVATE:
1933 case wxDF_HTML:
1934 break; // not (yet) supported data formats
1935 default:
1936 wxFAIL_MSG(_("Unknown data format"));
1937 }
1938 delete[] dataFormats;
1939 }
1940 }
489468fe 1941 }
e86edab0
RR
1942 // clean-up and return result:
1943 delete dataObject;
1944 return addDragItem;
de40d736 1945}
489468fe 1946
e86edab0 1947Boolean wxMacDataViewDataBrowserListViewControl::DataBrowserReceiveDragProc(DragReference dragRef, DataBrowserItemID itemID)
489468fe 1948{
e86edab0 1949 UInt16 noOfDraggedItems;
5829b303 1950
e86edab0 1951 wxDataViewCtrl* dataViewCtrlPtr;
489468fe 1952
e86edab0 1953
de40d736 1954 dataViewCtrlPtr = dynamic_cast<wxDataViewCtrl*>(GetWXPeer());
e86edab0
RR
1955 wxCHECK_MSG(dataViewCtrlPtr != NULL, false,_("Pointer to data view control not set correctly."));
1956 wxCHECK_MSG(dataViewCtrlPtr->GetModel() != NULL,false,_("Pointer to model not set correctly."));
1957
1958 // send a drag possible event for each available and item und proceed with it unless the event is vetoed:
1959 ::CountDragItems(dragRef,&noOfDraggedItems);
1960 for (UInt16 indexDraggedItem=1; indexDraggedItem<=noOfDraggedItems; ++indexDraggedItem)
489468fe 1961 {
e86edab0
RR
1962 bool receiveDrag;
1963 ItemReference itemRef;
1964 wxDataObjectComposite* dataObjects;
1965 wxMemoryBuffer buffer;
8f2a8de6 1966
e86edab0
RR
1967 // collect native information:
1968 ::GetDragItemReferenceNumber(dragRef,indexDraggedItem,&itemRef); // the index begins with 1!
de40d736 1969 dataObjects = GetDnDDataObjects(dragRef,itemRef);
e86edab0
RR
1970 // create wxWidget's event:
1971 wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_DROP,dataViewCtrlPtr->GetId());
1972
1973 dataViewEvent.SetEventObject(dataViewCtrlPtr);
1974 dataViewEvent.SetItem(reinterpret_cast<void*>(itemID)); // this is the item that receives the event
1975 // (can be an invalid item ID, this is especially useful if the dataview does not contain any items)
1976 dataViewEvent.SetModel(dataViewCtrlPtr->GetModel());
1977 dataViewEvent.SetDataObject(dataObjects);
de40d736 1978 dataViewEvent.SetDataFormat(GetDnDDataFormat(dataObjects));
e86edab0
RR
1979 if (dataViewEvent.GetDataFormat().GetType() != wxDF_INVALID)
1980 {
1981 dataViewEvent.SetDataSize(dataObjects->GetDataSize(dataViewEvent.GetDataFormat().GetType()));
1982 dataObjects->GetDataHere(dataViewEvent.GetDataFormat().GetType(),buffer.GetWriteBuf(dataViewEvent.GetDataSize()));
1983 buffer.UngetWriteBuf(dataViewEvent.GetDataSize());
1984 dataViewEvent.SetDataBuffer(buffer.GetData());
1985 }
489468fe 1986
e86edab0
RR
1987 // send event:
1988 receiveDrag = dataViewCtrlPtr->HandleWindowEvent(dataViewEvent) && dataViewEvent.IsAllowed();
1989 delete dataObjects;
1990 if (!receiveDrag)
1991 return false;
5829b303 1992 }
e86edab0 1993 return true;
de40d736 1994}
489468fe 1995
e86edab0
RR
1996//
1997// drag & drop helper methods
1998//
1999wxDataFormat wxMacDataViewDataBrowserListViewControl::GetDnDDataFormat(wxDataObjectComposite* dataObjects)
489468fe 2000{
e86edab0 2001 wxDataFormat resultFormat;
489468fe 2002
619df5a4 2003
e86edab0
RR
2004 if (dataObjects != NULL)
2005 {
2006 bool compatible(true);
619df5a4 2007
e86edab0
RR
2008 size_t const noOfFormats = dataObjects->GetFormatCount();
2009 size_t indexFormat;
619df5a4 2010
e86edab0 2011 wxDataFormat* formats;
8f2a8de6 2012
e86edab0
RR
2013 // get all formats and check afterwards if the formats are compatible; if they are compatible the preferred format is returned otherwise
2014 // wxDF_INVALID is returned;
2015 // currently compatible types (ordered by priority are):
2016 // - wxDF_UNICODETEXT - wxDF_TEXT
2017 formats = new wxDataFormat[noOfFormats];
2018 dataObjects->GetAllFormats(formats);
2019 indexFormat = 0;
2020 while ((indexFormat < noOfFormats) && compatible)
619df5a4 2021 {
e86edab0
RR
2022 switch (resultFormat.GetType())
2023 {
2024 case wxDF_INVALID:
2025 resultFormat.SetType(formats[indexFormat].GetType()); // first format (should only be reached if indexFormat == 0
2026 break;
2027 case wxDF_TEXT:
2028 if (formats[indexFormat].GetType() == wxDF_UNICODETEXT)
2029 resultFormat.SetType(wxDF_UNICODETEXT);
2030 else // incompatible
2031 {
2032 resultFormat.SetType(wxDF_INVALID);
2033 compatible = false;
2034 }
2035 break;
2036 case wxDF_UNICODETEXT:
2037 if (formats[indexFormat].GetType() != wxDF_TEXT)
2038 {
2039 resultFormat.SetType(wxDF_INVALID);
2040 compatible = false;
2041 }
2042 break;
2043 default:
2044 resultFormat.SetType(wxDF_INVALID); // not (yet) supported format
2045 compatible = false;
2046 }
2047 ++indexFormat;
2048 } /* while */
2049 // clean up:
2050 delete[] formats;
2051 }
2052 else
2053 resultFormat = wxDF_INVALID;
2054 return resultFormat;
de40d736 2055}
619df5a4 2056
e86edab0 2057wxDataObjectComposite* wxMacDataViewDataBrowserListViewControl::GetDnDDataObjects(DragReference dragRef, ItemReference itemRef) const
489468fe 2058{
e86edab0
RR
2059 UInt16 noOfFlavors;
2060
2061 wxDataObjectComposite* dataObject;
489468fe
SC
2062
2063
e86edab0
RR
2064 ::CountDragItemFlavors(dragRef,itemRef,&noOfFlavors);
2065 if (noOfFlavors > 0)
489468fe 2066 {
e86edab0
RR
2067 // 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:
2068 wxTextDataObject* textDataObject(NULL);
5829b303 2069
e86edab0
RR
2070 dataObject = new wxDataObjectComposite();
2071 for (UInt16 indexFlavor=1; indexFlavor<=noOfFlavors; ++indexFlavor)
489468fe 2072 {
e86edab0
RR
2073 // variable definition:
2074 FlavorType flavorDataObject;
8f2a8de6 2075
e86edab0
RR
2076 if (::GetFlavorType(dragRef,itemRef,indexFlavor,&flavorDataObject) == noErr) // GetFlavorType uses a 1 based index!
2077 switch (flavorDataObject)
2078 {
2079 case 'TEXT':
2080 if (textDataObject == NULL) // otherwise a 'utxt' flavor has already been found that gets priority compared to the 'TEXT' flavor
2081 {
2082 // variable definitions:
2083 Size nativeDataSize;
2084 wxMemoryBuffer nativeData;
8f2a8de6 2085
e86edab0
RR
2086 if ((::GetFlavorDataSize(dragRef,itemRef,'TEXT',&nativeDataSize) == noErr) &&
2087 (::GetFlavorData(dragRef,itemRef,'TEXT',nativeData.GetWriteBuf(nativeDataSize),&nativeDataSize,0) == noErr))
2088 {
2089 nativeData.UngetWriteBuf(nativeDataSize);
2090 textDataObject = new wxTextDataObject();
2091 if (textDataObject->SetData(nativeData.GetDataLen(),nativeData.GetData()))
2092 dataObject->Add(textDataObject);
2093 else
2094 {
2095 delete textDataObject;
2096 textDataObject = NULL;
2097 }
2098 }
2099 } /* block */
2100 break;
2101 case 'utxt':
2102 {
2103 // variable definition:
2104 Size nativeDataSize;
8f2a8de6 2105
e86edab0
RR
2106 if (::GetFlavorDataSize(dragRef,itemRef,'utxt',&nativeDataSize) == noErr)
2107 {
2108 CFMutableDataRef draggedData;
8f2a8de6 2109
e86edab0
RR
2110 draggedData = ::CFDataCreateMutable(kCFAllocatorDefault,nativeDataSize);
2111 ::CFDataSetLength(draggedData,nativeDataSize);
2112 if (::GetFlavorData(dragRef,itemRef,'utxt',::CFDataGetMutableBytePtr(draggedData),&nativeDataSize,0) == noErr)
2113 {
2114 // convert internally used UTF-16 representation to a UTF-8 representation:
2115 CFDataRef osxData;
2116 CFStringRef osxString;
8f2a8de6 2117
e86edab0
RR
2118 osxString = ::CFStringCreateFromExternalRepresentation(kCFAllocatorDefault,draggedData,kCFStringEncodingUTF16); // BOM character is handled by this function automatically
2119 osxData = ::CFStringCreateExternalRepresentation(kCFAllocatorDefault,osxString,kCFStringEncodingUTF8,32);
2120 if (textDataObject == NULL)
2121 {
2122 textDataObject = new wxTextDataObject();
2123 if (textDataObject->SetData(::CFDataGetLength(osxData),::CFDataGetBytePtr(osxData)))
2124 dataObject->Add(textDataObject);
2125 else
2126 {
2127 delete textDataObject;
2128 textDataObject = NULL;
2129 }
2130 }
2131 else // overwrite data because the 'utxt' flavor has priority over the 'TEXT' flavor
2132 (void) textDataObject->SetData(::CFDataGetLength(osxData),::CFDataGetBytePtr(osxData));
2133 // clean up:
2134 ::CFRelease(osxData);
2135 ::CFRelease(osxString);
2136 }
2137 // clean up:
2138 ::CFRelease(draggedData);
2139 }
2140 } /* block */
2141 break;
2142 }
5829b303
VZ
2143 }
2144 }
e86edab0
RR
2145 else
2146 dataObject = NULL;
2147 return dataObject;
de40d736 2148}
5829b303 2149
e86edab0
RR
2150//
2151// other methods
2152//
2153wxDataViewColumn* wxMacDataViewDataBrowserListViewControl::GetColumnPtr(DataBrowserPropertyID propertyID) const
2154{
de40d736 2155 wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(GetWXPeer()));
8f2a8de6 2156
e86edab0 2157 if (dataViewCtrlPtr != NULL)
489468fe 2158 {
e86edab0 2159 size_t const noOfColumns = dataViewCtrlPtr->GetColumnCount();
8f2a8de6 2160
e86edab0
RR
2161 for (size_t i=0; i<noOfColumns; ++i)
2162 if (dataViewCtrlPtr->GetColumnPtr(i)->GetNativeData()->GetPropertyID() == propertyID)
2163 return dataViewCtrlPtr->GetColumnPtr(i);
489468fe 2164 }
e86edab0 2165 return NULL;
5829b303 2166}
489468fe 2167
e86edab0
RR
2168// ---------------------------------------------------------
2169// wxDataViewRenderer
2170// ---------------------------------------------------------
2171wxDataViewRenderer::wxDataViewRenderer(wxString const& varianttype, wxDataViewCellMode mode, int align)
2172 :wxDataViewRendererBase(varianttype,mode,align), m_alignment(align), m_mode(mode), m_NativeDataPtr(NULL)
2173{
2174}
2175
de40d736 2176wxDataViewRenderer::~wxDataViewRenderer()
e86edab0 2177{
de40d736 2178 delete m_NativeDataPtr;
e86edab0
RR
2179}
2180
2181void wxDataViewRenderer::SetAlignment(int align)
2182{
de40d736 2183 m_alignment = align;
e86edab0
RR
2184}
2185
c937bcac
VZ
2186namespace
2187{
2188
2189// get the browser control or NULL if anything went wrong (it's not supposed to
2190// so we assert if it did)
2191wxMacDataViewDataBrowserListViewControl *
2192GetBrowserFromCol(wxDataViewColumn *col)
2193{
2194 wxCHECK_MSG( col, NULL, "should have a valid column" );
2195
2196 wxDataViewCtrl * const dvc = col->GetOwner();
2197 wxCHECK_MSG( dvc, NULL, "column must be associated with the control" );
2198
2199 return static_cast<wxMacDataViewDataBrowserListViewControl *>(dvc->GetPeer());
2200}
2201
2202} // anonymous namespace
2203
e86edab0
RR
2204void wxDataViewRenderer::SetMode(wxDataViewCellMode mode)
2205{
c937bcac
VZ
2206 wxDataViewColumn * const col = GetOwner();
2207 wxMacDataViewDataBrowserListViewControl * const
2208 browser = GetBrowserFromCol(col);
2209 wxCHECK_RET( browser, "must be fully initialized" );
e86edab0 2210
c937bcac 2211 const DataBrowserPropertyID colID = col->GetNativeData()->GetPropertyID();
e86edab0 2212
c937bcac
VZ
2213 DataBrowserPropertyFlags flags;
2214 verify_noerr( browser->GetPropertyFlags(colID, &flags) );
2215
2216 if ( (mode == wxDATAVIEW_CELL_EDITABLE) ||
2217 (mode == wxDATAVIEW_CELL_ACTIVATABLE) )
2218 flags |= kDataBrowserPropertyIsEditable;
2219 else
2220 flags &= ~kDataBrowserPropertyIsEditable;
2221
2222 verify_noerr( browser->SetPropertyFlags(colID, flags) );
2223}
2224
2225void wxDataViewRenderer::EnableEllipsize(wxEllipsizeMode mode)
2226{
2227 wxDataViewColumn * const col = GetOwner();
2228
2229 wxMacDataViewDataBrowserListViewControl * const
2230 browser = GetBrowserFromCol(col);
2231 wxCHECK_RET( browser, "must be fully initialized" );
2232
2233 const DataBrowserPropertyID colID = col->GetNativeData()->GetPropertyID();
2234
2235 DataBrowserPropertyFlags flags;
2236 browser->GetPropertyFlags(colID, &flags);
2237
2238 flags &= ~(kDataBrowserDoNotTruncateText |
2239 kDataBrowserTruncateTextAtStart |
2240 kDataBrowserTruncateTextMiddle |
2241 kDataBrowserTruncateTextAtEnd);
e86edab0 2242
c937bcac
VZ
2243 int flagToSet = 0;
2244 switch ( mode )
e86edab0 2245 {
c937bcac
VZ
2246 case wxELLIPSIZE_NONE:
2247 flagToSet = kDataBrowserDoNotTruncateText;
2248 break;
e86edab0 2249
c937bcac
VZ
2250 case wxELLIPSIZE_START:
2251 flagToSet = kDataBrowserTruncateTextAtStart;
2252 break;
2253
2254 case wxELLIPSIZE_MIDDLE:
2255 flagToSet = kDataBrowserTruncateTextMiddle;
2256 break;
2257
2258 case wxELLIPSIZE_END:
2259 flagToSet = kDataBrowserTruncateTextAtEnd;
2260 break;
e86edab0 2261 }
c937bcac
VZ
2262
2263 wxCHECK_RET( flagToSet, "unknown wxEllipsizeMode value" );
2264
2265 flags |= flagToSet;
2266 verify_noerr( browser->SetPropertyFlags(colID, flags) );
2267}
2268
2269wxEllipsizeMode wxDataViewRenderer::GetEllipsizeMode() const
2270{
2271 wxDataViewColumn * const col = GetOwner();
2272
2273 wxMacDataViewDataBrowserListViewControl * const
2274 browser = GetBrowserFromCol(col);
2275 wxCHECK_MSG( browser, wxELLIPSIZE_NONE, "must be fully initialized" );
2276
2277 const DataBrowserPropertyID colID = col->GetNativeData()->GetPropertyID();
2278
2279 DataBrowserPropertyFlags flags;
2280 browser->GetPropertyFlags(colID, &flags);
2281
2282 if ( flags & kDataBrowserDoNotTruncateText )
2283 return wxELLIPSIZE_NONE;
2284 if ( flags & kDataBrowserTruncateTextAtStart )
2285 return wxELLIPSIZE_START;
c937bcac
VZ
2286 if ( flags & kDataBrowserTruncateTextAtEnd )
2287 return wxELLIPSIZE_END;
2288
c32eeacc
VZ
2289 // kDataBrowserTruncateTextMiddle == 0 so there is no need to test for it
2290 return wxELLIPSIZE_MIDDLE;
e86edab0
RR
2291}
2292
2293void wxDataViewRenderer::SetNativeData(wxDataViewRendererNativeData* newNativeDataPtr)
2294{
de40d736
VZ
2295 delete m_NativeDataPtr;
2296 m_NativeDataPtr = newNativeDataPtr;
e86edab0
RR
2297}
2298
2299IMPLEMENT_ABSTRACT_CLASS(wxDataViewRenderer,wxDataViewRendererBase)
2300
2301// ---------------------------------------------------------
2302// wxDataViewCustomRenderer
2303// ---------------------------------------------------------
2304wxDataViewCustomRenderer::wxDataViewCustomRenderer(wxString const& varianttype, wxDataViewCellMode mode, int align)
6eec70b9
VZ
2305 :wxDataViewCustomRendererBase(varianttype,mode,align),
2306 m_editorCtrlPtr(NULL),
2307 m_DCPtr(NULL)
e86edab0 2308{
de40d736 2309 SetNativeData(new wxDataViewRendererNativeData(kDataBrowserCustomType));
e86edab0
RR
2310}
2311
8f2a8de6 2312bool wxDataViewCustomRenderer::MacRender()
e86edab0
RR
2313{
2314 return true;
2315}
489468fe 2316
e86edab0
RR
2317IMPLEMENT_ABSTRACT_CLASS(wxDataViewCustomRenderer, wxDataViewRenderer)
2318
2319// ---------------------------------------------------------
2320// wxDataViewTextRenderer
2321// ---------------------------------------------------------
2322wxDataViewTextRenderer::wxDataViewTextRenderer(wxString const& varianttype, wxDataViewCellMode mode, int align)
2323 :wxDataViewRenderer(varianttype,mode,align)
2324{
de40d736 2325 SetNativeData(new wxDataViewRendererNativeData(kDataBrowserTextType));
e86edab0 2326}
489468fe 2327
8f2a8de6 2328bool wxDataViewTextRenderer::MacRender()
e86edab0 2329{
de40d736 2330 wxCHECK_MSG(GetValue().GetType() == GetVariantType(),false,wxString(_("Text renderer cannot render value; value type: ")) << GetValue().GetType());
e86edab0 2331
de40d736
VZ
2332 wxCFStringRef cfString(GetValue().GetString(),(GetView()->GetFont().Ok() ? GetView()->GetFont().GetEncoding() : wxLocale::GetSystemEncoding()));
2333 return (::SetDataBrowserItemDataText(GetNativeData()->GetItemDataRef(),cfString) == noErr);
e86edab0
RR
2334}
2335
2336IMPLEMENT_CLASS(wxDataViewTextRenderer,wxDataViewRenderer)
2337
2338// ---------------------------------------------------------
2339// wxDataViewBitmapRenderer
2340// ---------------------------------------------------------
2341wxDataViewBitmapRenderer::wxDataViewBitmapRenderer(wxString const& varianttype, wxDataViewCellMode mode, int align)
2342 :wxDataViewRenderer(varianttype,mode,align)
2343{
de40d736 2344 SetNativeData(new wxDataViewRendererNativeData(kDataBrowserIconType));
e86edab0
RR
2345}
2346
8f2a8de6 2347bool wxDataViewBitmapRenderer::MacRender()
e86edab0
RR
2348 // This method returns 'true' if
2349 // - the passed bitmap is valid and it could be assigned to the native data browser;
2350 // - the passed bitmap is invalid (or is not initialized); this case simulates a non-existing bitmap.
2351 // In all other cases the method returns 'false'.
2352{
de40d736 2353 wxCHECK_MSG(GetValue().GetType() == GetVariantType(),false,wxString(_("Bitmap renderer cannot render value; value type: ")) << GetValue().GetType());
e86edab0
RR
2354
2355 wxBitmap bitmap;
2356
de40d736
VZ
2357 bitmap << GetValue();
2358 return (!(bitmap.Ok()) || (::SetDataBrowserItemDataIcon(GetNativeData()->GetItemDataRef(),bitmap.GetIconRef()) == noErr));
e86edab0
RR
2359}
2360
2361IMPLEMENT_CLASS(wxDataViewBitmapRenderer,wxDataViewRenderer)
2362
2363// ---------------------------------------------------------
2364// wxDataViewIconTextRenderer
2365// ---------------------------------------------------------
8f2a8de6
VZ
2366wxDataViewIconTextRenderer::wxDataViewIconTextRenderer(
2367 const wxString& varianttype,
2368 wxDataViewCellMode mode,
2369 int WXUNUSED(align))
e86edab0
RR
2370 :wxDataViewRenderer(varianttype,mode)
2371{
de40d736 2372 SetNativeData(new wxDataViewRendererNativeData(kDataBrowserIconAndTextType));
e86edab0
RR
2373}
2374
8f2a8de6 2375bool wxDataViewIconTextRenderer::MacRender()
e86edab0 2376{
de40d736 2377 wxCHECK_MSG(GetValue().GetType() == GetVariantType(),false,wxString(_("Icon & text renderer cannot render value; value type: ")) << GetValue().GetType());
e86edab0
RR
2378
2379 wxDataViewIconText iconText;
2380
de40d736 2381 iconText << GetValue();
e86edab0 2382
de40d736 2383 wxCFStringRef cfString(iconText.GetText(),(GetView()->GetFont().Ok() ? GetView()->GetFont().GetEncoding() : wxLocale::GetSystemEncoding()));
e86edab0
RR
2384
2385 if (iconText.GetIcon().IsOk())
de40d736 2386 if (::SetDataBrowserItemDataIcon(GetNativeData()->GetItemDataRef(),MAC_WXHICON(iconText.GetIcon().GetHICON())) != noErr)
e86edab0 2387 return false;
de40d736 2388 return (::SetDataBrowserItemDataText(GetNativeData()->GetItemDataRef(),cfString) == noErr);
e86edab0
RR
2389}
2390
2391IMPLEMENT_ABSTRACT_CLASS(wxDataViewIconTextRenderer,wxDataViewRenderer)
2392
2393
2394// ---------------------------------------------------------
2395// wxDataViewToggleRenderer
2396// ---------------------------------------------------------
8f2a8de6
VZ
2397wxDataViewToggleRenderer::wxDataViewToggleRenderer(
2398 const wxString& varianttype,
2399 wxDataViewCellMode mode,
2400 int WXUNUSED(align))
e86edab0
RR
2401 :wxDataViewRenderer(varianttype,mode)
2402{
de40d736 2403 SetNativeData(new wxDataViewRendererNativeData(kDataBrowserCheckboxType));
e86edab0
RR
2404}
2405
8f2a8de6 2406bool wxDataViewToggleRenderer::MacRender()
e86edab0 2407{
de40d736
VZ
2408 wxCHECK_MSG(GetValue().GetType() == GetVariantType(),false,wxString(_("Toggle renderer cannot render value; value type: ")) << GetValue().GetType());
2409 return (::SetDataBrowserItemDataButtonValue(GetNativeData()->GetItemDataRef(),GetValue().GetBool()) == noErr);
e86edab0
RR
2410}
2411
2412IMPLEMENT_ABSTRACT_CLASS(wxDataViewToggleRenderer,wxDataViewRenderer)
2413
2414// ---------------------------------------------------------
2415// wxDataViewProgressRenderer
2416// ---------------------------------------------------------
8f2a8de6
VZ
2417wxDataViewProgressRenderer::wxDataViewProgressRenderer(
2418 const wxString& WXUNUSED(label),
2419 wxString const& varianttype,
2420 wxDataViewCellMode mode,
2421 int align)
e86edab0
RR
2422 :wxDataViewRenderer(varianttype,mode,align)
2423{
de40d736 2424 SetNativeData(new wxDataViewRendererNativeData(kDataBrowserProgressBarType));
e86edab0
RR
2425}
2426
8f2a8de6 2427bool wxDataViewProgressRenderer::MacRender()
e86edab0 2428{
de40d736
VZ
2429 wxCHECK_MSG(GetValue().GetType() == GetVariantType(),false,wxString(_("Progress renderer cannot render value type; value type: ")) << GetValue().GetType());
2430 return ((::SetDataBrowserItemDataMinimum(GetNativeData()->GetItemDataRef(), 0) == noErr) &&
2431 (::SetDataBrowserItemDataMaximum(GetNativeData()->GetItemDataRef(),100) == noErr) &&
2432 (::SetDataBrowserItemDataValue (GetNativeData()->GetItemDataRef(),GetValue().GetLong()) == noErr));
e86edab0
RR
2433}
2434
2435IMPLEMENT_ABSTRACT_CLASS(wxDataViewProgressRenderer,wxDataViewRenderer)
2436
2437// ---------------------------------------------------------
2438// wxDataViewDateRenderer
2439// ---------------------------------------------------------
2440wxDataViewDateRenderer::wxDataViewDateRenderer(wxString const& varianttype, wxDataViewCellMode mode, int align)
2441 :wxDataViewRenderer(varianttype,mode,align)
2442{
de40d736 2443 SetNativeData(new wxDataViewRendererNativeData(kDataBrowserDateTimeType));
e86edab0
RR
2444}
2445
8f2a8de6 2446bool wxDataViewDateRenderer::MacRender()
e86edab0 2447{
de40d736
VZ
2448 wxCHECK_MSG(GetValue().GetType() == GetVariantType(),false,wxString(_("Date renderer cannot render value; value type: ")) << GetValue().GetType());
2449 return (::SetDataBrowserItemDataDateTime(GetNativeData()->GetItemDataRef(),GetValue().GetDateTime().Subtract(wxDateTime(1,wxDateTime::Jan,1904)).GetSeconds().GetLo()) == noErr);
e86edab0
RR
2450}
2451
2452IMPLEMENT_ABSTRACT_CLASS(wxDataViewDateRenderer,wxDataViewRenderer)
2453
2454// ---------------------------------------------------------
2455// wxDataViewColumn
2456// ---------------------------------------------------------
2457wxDataViewColumn::wxDataViewColumn(const wxString& title, wxDataViewRenderer* renderer, unsigned int model_column, int width, wxAlignment align, int flags)
2458 :wxDataViewColumnBase(renderer, model_column), m_NativeDataPtr(new wxDataViewColumnNativeData()), m_title(title)
2459{
de40d736 2460 InitCommon(width, align, flags);
e86edab0
RR
2461 if ((renderer != NULL) && (renderer->GetAlignment() == wxDVR_DEFAULT_ALIGNMENT))
2462 renderer->SetAlignment(align);
2463}
2464
2465wxDataViewColumn::wxDataViewColumn(const wxBitmap& bitmap, wxDataViewRenderer* renderer, unsigned int model_column, int width, wxAlignment align, int flags)
2466 :wxDataViewColumnBase(bitmap, renderer, model_column), m_NativeDataPtr(new wxDataViewColumnNativeData())
2467{
de40d736 2468 InitCommon(width, align, flags);
e86edab0
RR
2469 if ((renderer != NULL) && (renderer->GetAlignment() == wxDVR_DEFAULT_ALIGNMENT))
2470 renderer->SetAlignment(align);
2471}
2472
de40d736 2473wxDataViewColumn::~wxDataViewColumn()
e86edab0 2474{
de40d736 2475 delete m_NativeDataPtr;
e86edab0
RR
2476}
2477
d831e2db
VZ
2478int wxDataViewColumn::GetWidth() const
2479{
2480 // FIXME: This returns the last programatically set width and will not work if
2481 // the user changes the column's width by dragging it with the mouse.
2482 return m_width;
2483}
2484
e86edab0
RR
2485bool wxDataViewColumn::IsSortKey() const
2486{
2487 wxDataViewCtrl * const dataViewCtrlPtr(GetOwner());
2488 wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(
2489 dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(
2490 dataViewCtrlPtr->GetPeer()));
2491
2492 DataBrowserPropertyID propertyID;
2493 return (macDataViewListCtrlPtr->GetSortProperty(&propertyID) == noErr) &&
de40d736 2494 (propertyID == GetNativeData()->GetPropertyID());
e86edab0
RR
2495}
2496
2497void wxDataViewColumn::SetAlignment(wxAlignment align)
2498{
de40d736 2499 wxDataViewCtrl* dataViewCtrlPtr(GetOwner());
e86edab0
RR
2500
2501
2502 m_alignment = align;
2503 if (dataViewCtrlPtr != NULL)
2504 {
2505 wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
2506
2507 if (macDataViewListCtrlPtr != NULL)
2508 {
2509 DataBrowserListViewHeaderDesc headerDescription;
2510
de40d736 2511 wxCHECK_RET(macDataViewListCtrlPtr->GetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription) == noErr,_("Could not get header description."));
e86edab0
RR
2512 switch (align)
2513 {
2514 case wxALIGN_CENTER:
2515 case wxALIGN_CENTER_HORIZONTAL:
2516 headerDescription.btnFontStyle.just = teCenter;
2517 break;
2518 case wxALIGN_LEFT:
2519 headerDescription.btnFontStyle.just = teFlushLeft;
2520 break;
2521 case wxALIGN_RIGHT:
2522 headerDescription.btnFontStyle.just = teFlushRight;
2523 break;
2524 default:
2525 headerDescription.btnFontStyle.just = teFlushDefault;
2526 }
de40d736 2527 wxCHECK_RET(macDataViewListCtrlPtr->SetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription) == noErr,_("Could not set alignment."));
e86edab0
RR
2528 }
2529 }
2530}
2531
2532void wxDataViewColumn::SetBitmap(wxBitmap const& bitmap)
2533{
de40d736 2534 wxDataViewCtrl* dataViewCtrlPtr(GetOwner());
e86edab0
RR
2535
2536
2537 wxDataViewColumnBase::SetBitmap(bitmap);
2538 if (dataViewCtrlPtr != NULL)
2539 {
2540 wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
2541
2542 if (macDataViewListCtrlPtr != NULL)
2543 {
2544 DataBrowserListViewHeaderDesc headerDescription;
2545
de40d736
VZ
2546 wxCHECK_RET(macDataViewListCtrlPtr->GetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription) == noErr,_("Could not get header description."));
2547 if (GetBitmap().Ok())
2548 headerDescription.btnContentInfo.u.iconRef = GetBitmap().GetIconRef();
e86edab0
RR
2549 else
2550 headerDescription.btnContentInfo.u.iconRef = NULL;
de40d736 2551 wxCHECK_RET(macDataViewListCtrlPtr->SetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription) == noErr,_("Could not set icon."));
e86edab0
RR
2552 }
2553 }
2554}
2555
2556void wxDataViewColumn::SetMaxWidth(int maxWidth)
2557{
de40d736 2558 wxDataViewCtrl* dataViewCtrlPtr(GetOwner());
e86edab0
RR
2559
2560
2561 m_maxWidth = maxWidth;
2562 if (dataViewCtrlPtr != NULL)
2563 {
2564 wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
2565
2566 if (macDataViewListCtrlPtr != NULL)
2567 {
2568 DataBrowserListViewHeaderDesc headerDescription;
2569
de40d736 2570 wxCHECK_RET(macDataViewListCtrlPtr->GetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription) == noErr,_("Could not get header description."));
e86edab0 2571 headerDescription.maximumWidth = static_cast<UInt16>(maxWidth);
de40d736 2572 wxCHECK_RET(macDataViewListCtrlPtr->SetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription) == noErr,_("Could not set maximum width."));
e86edab0
RR
2573 }
2574 }
2575}
2576
2577void wxDataViewColumn::SetMinWidth(int minWidth)
2578{
de40d736 2579 wxDataViewCtrl* dataViewCtrlPtr(GetOwner());
e86edab0
RR
2580
2581
2582 m_minWidth = minWidth;
2583 if (dataViewCtrlPtr != NULL)
2584 {
2585 wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
2586
2587 if (macDataViewListCtrlPtr != NULL)
2588 {
2589 DataBrowserListViewHeaderDesc headerDescription;
2590
de40d736 2591 wxCHECK_RET(macDataViewListCtrlPtr->GetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription) == noErr,_("Could not get header description."));
e86edab0 2592 headerDescription.minimumWidth = static_cast<UInt16>(minWidth);
de40d736 2593 wxCHECK_RET(macDataViewListCtrlPtr->SetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription) == noErr,_("Could not set minimum width."));
e86edab0
RR
2594 }
2595 }
2596}
2597
2598void wxDataViewColumn::SetReorderable(bool reorderable)
2599{
2600 // first set the internal flag of the column:
2601 if (reorderable)
2602 m_flags |= wxDATAVIEW_COL_REORDERABLE;
2603 else
2604 m_flags &= ~wxDATAVIEW_COL_REORDERABLE;
2605 // if the column is associated with a control change also immediately the flags of the control:
de40d736 2606 wxDataViewCtrl* dataViewCtrlPtr(GetOwner());
e86edab0
RR
2607
2608 if (dataViewCtrlPtr != NULL)
2609 {
2610 DataBrowserPropertyFlags flags;
2611 wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
2612
2613 wxCHECK_RET(macDataViewListCtrlPtr != NULL, _("Valid pointer to native data view control does not exist"));
de40d736 2614 wxCHECK_RET(macDataViewListCtrlPtr->GetPropertyFlags(GetNativeData()->GetPropertyID(),&flags) == noErr,_("Could not get property flags."));
e86edab0
RR
2615 if (reorderable)
2616 flags |= kDataBrowserListViewMovableColumn;
2617 else
2618 flags &= ~kDataBrowserListViewMovableColumn;
de40d736 2619 wxCHECK_RET(macDataViewListCtrlPtr->SetPropertyFlags(GetNativeData()->GetPropertyID(),flags) == noErr,_("Could not set property flags."));
e86edab0
RR
2620 }
2621}
2622
2623void wxDataViewColumn::SetResizeable(bool resizeable)
2624{
2625 // first set the internal flag of the column:
2626 if (resizeable)
2627 m_flags |= wxDATAVIEW_COL_RESIZABLE;
2628 else
2629 m_flags &= ~wxDATAVIEW_COL_RESIZABLE;
2630 // if the column is associated with a control change also immediately the flags of the control:
de40d736 2631 wxDataViewCtrl* dataViewCtrlPtr(GetOwner());
e86edab0
RR
2632
2633 if (dataViewCtrlPtr != NULL)
2634 {
2635 wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
2636
2637 if (macDataViewListCtrlPtr != NULL)
2638 {
2639 DataBrowserListViewHeaderDesc headerDescription;
2640
de40d736 2641 verify_noerr(macDataViewListCtrlPtr->GetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription));
e86edab0
RR
2642 if (resizeable)
2643 {
de40d736 2644 if (GetMinWidth() >= GetMaxWidth())
e86edab0 2645 {
de40d736
VZ
2646 m_minWidth = 0;
2647 m_maxWidth = 30000;
e86edab0 2648 }
de40d736
VZ
2649 headerDescription.minimumWidth = m_minWidth;
2650 headerDescription.maximumWidth = m_maxWidth;
e86edab0
RR
2651 }
2652 else
2653 {
de40d736
VZ
2654 headerDescription.minimumWidth = m_width;
2655 headerDescription.maximumWidth = m_width;
e86edab0 2656 }
de40d736
VZ
2657 verify_noerr(macDataViewListCtrlPtr->SetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription));
2658 macDataViewListCtrlPtr->SetSortProperty(GetNativeData()->GetPropertyID());
e86edab0
RR
2659 }
2660 }
2661}
2662
2663void wxDataViewColumn::SetSortable(bool sortable)
2664{
2665 // first set the internal flag of the column:
2666 if (sortable)
2667 m_flags |= wxDATAVIEW_COL_SORTABLE;
2668 else
2669 m_flags &= ~wxDATAVIEW_COL_SORTABLE;
2670 // if the column is associated with a control change also immediately the flags of the control:
de40d736 2671 wxDataViewCtrl* dataViewCtrlPtr(GetOwner());
e86edab0
RR
2672
2673 if (dataViewCtrlPtr != NULL)
2674 {
2675 DataBrowserPropertyFlags flags;
2676 wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
2677
2678 wxCHECK_RET(macDataViewListCtrlPtr != NULL, _("Valid pointer to native data view control does not exist"));
de40d736 2679 wxCHECK_RET(macDataViewListCtrlPtr->GetPropertyFlags(GetNativeData()->GetPropertyID(),&flags) == noErr,_("Could not get property flags."));
e86edab0
RR
2680 if (sortable)
2681 flags |= kDataBrowserListViewSortableColumn;
2682 else
2683 flags &= ~kDataBrowserListViewSortableColumn;
de40d736 2684 wxCHECK_RET(macDataViewListCtrlPtr->SetPropertyFlags(GetNativeData()->GetPropertyID(),flags) == noErr,_("Could not set property flags."));
e86edab0
RR
2685 }
2686}
2687
2688void wxDataViewColumn::SetSortOrder(bool ascending)
2689{
de40d736 2690 wxDataViewCtrl* dataViewCtrlPtr(GetOwner());
e86edab0
RR
2691
2692
2693 m_ascending = ascending;
2694 if (dataViewCtrlPtr != NULL)
2695 {
2696 wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
2697
2698 if (macDataViewListCtrlPtr != NULL)
2699 {
2700 DataBrowserListViewHeaderDesc headerDescription;
2701
de40d736 2702 verify_noerr(macDataViewListCtrlPtr->GetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription));
e86edab0
RR
2703 if (ascending)
2704 headerDescription.initialOrder = kDataBrowserOrderIncreasing;
2705 else
2706 headerDescription.initialOrder = kDataBrowserOrderDecreasing;
de40d736
VZ
2707 verify_noerr(macDataViewListCtrlPtr->SetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription));
2708 macDataViewListCtrlPtr->SetSortProperty(GetNativeData()->GetPropertyID());
e86edab0
RR
2709 }
2710 }
2711}
2712
2713void wxDataViewColumn::SetTitle(wxString const& title)
2714{
de40d736 2715 wxDataViewCtrl* dataViewCtrlPtr(GetOwner());
e86edab0
RR
2716
2717
2718 m_title = title;
2719 if (dataViewCtrlPtr != NULL)
2720 {
2721 wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
2722
2723 if (macDataViewListCtrlPtr != NULL)
2724 {
2725 DataBrowserListViewHeaderDesc headerDescription;
2726 wxCFStringRef cfTitle(title,(dataViewCtrlPtr->GetFont().Ok() ? dataViewCtrlPtr->GetFont().GetEncoding() : wxLocale::GetSystemEncoding()));
2727
de40d736 2728 wxCHECK_RET(macDataViewListCtrlPtr->GetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription) == noErr,_("Could not get header description."));
e86edab0 2729 headerDescription.titleString = cfTitle;
de40d736 2730 wxCHECK_RET(macDataViewListCtrlPtr->SetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription) == noErr,_("Could not set header description."));
e86edab0
RR
2731 }
2732 }
2733}
2734
2735void wxDataViewColumn::SetWidth(int width)
2736{
de40d736 2737 wxDataViewCtrl* dataViewCtrlPtr(GetOwner());
e86edab0
RR
2738
2739
2740 if ((width >= m_minWidth) && (width <= m_maxWidth))
2741 {
2742 m_width = width;
2743 if (dataViewCtrlPtr != NULL)
2744 {
2745 wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
2746
2747 if (macDataViewListCtrlPtr != NULL)
de40d736 2748 wxCHECK_RET(macDataViewListCtrlPtr->SetColumnWidth(GetNativeData()->GetPropertyID(),static_cast<UInt16>(width)) == noErr,_("Could not set column width."));
e86edab0
RR
2749 }
2750 }
2751}
2752
2753void wxDataViewColumn::SetAsSortKey(bool WXUNUSED(sort))
2754{
2755 // see wxGTK native wxDataViewColumn implementation
2756 wxFAIL_MSG( "not implemented" );
2757}
2758
2759void wxDataViewColumn::SetNativeData(wxDataViewColumnNativeData* newNativeDataPtr)
2760{
de40d736
VZ
2761 delete m_NativeDataPtr;
2762 m_NativeDataPtr = newNativeDataPtr;
e86edab0 2763}
489468fe 2764
e86edab0 2765#endif // wxUSE_DATAVIEWCTRL && !wxUSE_GENERICDATAVIEWCTRL