]> git.saurik.com Git - wxWidgets.git/blame - src/osx/carbon/dataview.cpp
Create an autorelease pool to catch objects created during several special situations...
[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);
8f2a8de6 1704 (void) (dataViewCustomRendererPtr->Render( 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;
2286 if ( flags & kDataBrowserTruncateTextMiddle )
2287 return wxELLIPSIZE_MIDDLE;
2288 if ( flags & kDataBrowserTruncateTextAtEnd )
2289 return wxELLIPSIZE_END;
2290
2291 wxFAIL_MSG( "unknown flags" );
2292
2293 return wxELLIPSIZE_NONE;
e86edab0
RR
2294}
2295
2296void wxDataViewRenderer::SetNativeData(wxDataViewRendererNativeData* newNativeDataPtr)
2297{
de40d736
VZ
2298 delete m_NativeDataPtr;
2299 m_NativeDataPtr = newNativeDataPtr;
e86edab0
RR
2300}
2301
2302IMPLEMENT_ABSTRACT_CLASS(wxDataViewRenderer,wxDataViewRendererBase)
2303
2304// ---------------------------------------------------------
2305// wxDataViewCustomRenderer
2306// ---------------------------------------------------------
2307wxDataViewCustomRenderer::wxDataViewCustomRenderer(wxString const& varianttype, wxDataViewCellMode mode, int align)
2308 :wxDataViewRenderer(varianttype,mode,align), m_editorCtrlPtr(NULL), m_DCPtr(NULL)
2309{
de40d736 2310 SetNativeData(new wxDataViewRendererNativeData(kDataBrowserCustomType));
e86edab0
RR
2311}
2312
8f2a8de6 2313bool wxDataViewCustomRenderer::MacRender()
e86edab0
RR
2314{
2315 return true;
2316}
489468fe 2317
e86edab0
RR
2318IMPLEMENT_ABSTRACT_CLASS(wxDataViewCustomRenderer, wxDataViewRenderer)
2319
2320// ---------------------------------------------------------
2321// wxDataViewTextRenderer
2322// ---------------------------------------------------------
2323wxDataViewTextRenderer::wxDataViewTextRenderer(wxString const& varianttype, wxDataViewCellMode mode, int align)
2324 :wxDataViewRenderer(varianttype,mode,align)
2325{
de40d736 2326 SetNativeData(new wxDataViewRendererNativeData(kDataBrowserTextType));
e86edab0 2327}
489468fe 2328
8f2a8de6 2329bool wxDataViewTextRenderer::MacRender()
e86edab0 2330{
de40d736 2331 wxCHECK_MSG(GetValue().GetType() == GetVariantType(),false,wxString(_("Text renderer cannot render value; value type: ")) << GetValue().GetType());
e86edab0 2332
de40d736
VZ
2333 wxCFStringRef cfString(GetValue().GetString(),(GetView()->GetFont().Ok() ? GetView()->GetFont().GetEncoding() : wxLocale::GetSystemEncoding()));
2334 return (::SetDataBrowserItemDataText(GetNativeData()->GetItemDataRef(),cfString) == noErr);
e86edab0
RR
2335}
2336
2337IMPLEMENT_CLASS(wxDataViewTextRenderer,wxDataViewRenderer)
2338
2339// ---------------------------------------------------------
2340// wxDataViewBitmapRenderer
2341// ---------------------------------------------------------
2342wxDataViewBitmapRenderer::wxDataViewBitmapRenderer(wxString const& varianttype, wxDataViewCellMode mode, int align)
2343 :wxDataViewRenderer(varianttype,mode,align)
2344{
de40d736 2345 SetNativeData(new wxDataViewRendererNativeData(kDataBrowserIconType));
e86edab0
RR
2346}
2347
8f2a8de6 2348bool wxDataViewBitmapRenderer::MacRender()
e86edab0
RR
2349 // This method returns 'true' if
2350 // - the passed bitmap is valid and it could be assigned to the native data browser;
2351 // - the passed bitmap is invalid (or is not initialized); this case simulates a non-existing bitmap.
2352 // In all other cases the method returns 'false'.
2353{
de40d736 2354 wxCHECK_MSG(GetValue().GetType() == GetVariantType(),false,wxString(_("Bitmap renderer cannot render value; value type: ")) << GetValue().GetType());
e86edab0
RR
2355
2356 wxBitmap bitmap;
2357
de40d736
VZ
2358 bitmap << GetValue();
2359 return (!(bitmap.Ok()) || (::SetDataBrowserItemDataIcon(GetNativeData()->GetItemDataRef(),bitmap.GetIconRef()) == noErr));
e86edab0
RR
2360}
2361
2362IMPLEMENT_CLASS(wxDataViewBitmapRenderer,wxDataViewRenderer)
2363
2364// ---------------------------------------------------------
2365// wxDataViewIconTextRenderer
2366// ---------------------------------------------------------
8f2a8de6
VZ
2367wxDataViewIconTextRenderer::wxDataViewIconTextRenderer(
2368 const wxString& varianttype,
2369 wxDataViewCellMode mode,
2370 int WXUNUSED(align))
e86edab0
RR
2371 :wxDataViewRenderer(varianttype,mode)
2372{
de40d736 2373 SetNativeData(new wxDataViewRendererNativeData(kDataBrowserIconAndTextType));
e86edab0
RR
2374}
2375
8f2a8de6 2376bool wxDataViewIconTextRenderer::MacRender()
e86edab0 2377{
de40d736 2378 wxCHECK_MSG(GetValue().GetType() == GetVariantType(),false,wxString(_("Icon & text renderer cannot render value; value type: ")) << GetValue().GetType());
e86edab0
RR
2379
2380 wxDataViewIconText iconText;
2381
de40d736 2382 iconText << GetValue();
e86edab0 2383
de40d736 2384 wxCFStringRef cfString(iconText.GetText(),(GetView()->GetFont().Ok() ? GetView()->GetFont().GetEncoding() : wxLocale::GetSystemEncoding()));
e86edab0
RR
2385
2386 if (iconText.GetIcon().IsOk())
de40d736 2387 if (::SetDataBrowserItemDataIcon(GetNativeData()->GetItemDataRef(),MAC_WXHICON(iconText.GetIcon().GetHICON())) != noErr)
e86edab0 2388 return false;
de40d736 2389 return (::SetDataBrowserItemDataText(GetNativeData()->GetItemDataRef(),cfString) == noErr);
e86edab0
RR
2390}
2391
2392IMPLEMENT_ABSTRACT_CLASS(wxDataViewIconTextRenderer,wxDataViewRenderer)
2393
2394
2395// ---------------------------------------------------------
2396// wxDataViewToggleRenderer
2397// ---------------------------------------------------------
8f2a8de6
VZ
2398wxDataViewToggleRenderer::wxDataViewToggleRenderer(
2399 const wxString& varianttype,
2400 wxDataViewCellMode mode,
2401 int WXUNUSED(align))
e86edab0
RR
2402 :wxDataViewRenderer(varianttype,mode)
2403{
de40d736 2404 SetNativeData(new wxDataViewRendererNativeData(kDataBrowserCheckboxType));
e86edab0
RR
2405}
2406
8f2a8de6 2407bool wxDataViewToggleRenderer::MacRender()
e86edab0 2408{
de40d736
VZ
2409 wxCHECK_MSG(GetValue().GetType() == GetVariantType(),false,wxString(_("Toggle renderer cannot render value; value type: ")) << GetValue().GetType());
2410 return (::SetDataBrowserItemDataButtonValue(GetNativeData()->GetItemDataRef(),GetValue().GetBool()) == noErr);
e86edab0
RR
2411}
2412
2413IMPLEMENT_ABSTRACT_CLASS(wxDataViewToggleRenderer,wxDataViewRenderer)
2414
2415// ---------------------------------------------------------
2416// wxDataViewProgressRenderer
2417// ---------------------------------------------------------
8f2a8de6
VZ
2418wxDataViewProgressRenderer::wxDataViewProgressRenderer(
2419 const wxString& WXUNUSED(label),
2420 wxString const& varianttype,
2421 wxDataViewCellMode mode,
2422 int align)
e86edab0
RR
2423 :wxDataViewRenderer(varianttype,mode,align)
2424{
de40d736 2425 SetNativeData(new wxDataViewRendererNativeData(kDataBrowserProgressBarType));
e86edab0
RR
2426}
2427
8f2a8de6 2428bool wxDataViewProgressRenderer::MacRender()
e86edab0 2429{
de40d736
VZ
2430 wxCHECK_MSG(GetValue().GetType() == GetVariantType(),false,wxString(_("Progress renderer cannot render value type; value type: ")) << GetValue().GetType());
2431 return ((::SetDataBrowserItemDataMinimum(GetNativeData()->GetItemDataRef(), 0) == noErr) &&
2432 (::SetDataBrowserItemDataMaximum(GetNativeData()->GetItemDataRef(),100) == noErr) &&
2433 (::SetDataBrowserItemDataValue (GetNativeData()->GetItemDataRef(),GetValue().GetLong()) == noErr));
e86edab0
RR
2434}
2435
2436IMPLEMENT_ABSTRACT_CLASS(wxDataViewProgressRenderer,wxDataViewRenderer)
2437
2438// ---------------------------------------------------------
2439// wxDataViewDateRenderer
2440// ---------------------------------------------------------
2441wxDataViewDateRenderer::wxDataViewDateRenderer(wxString const& varianttype, wxDataViewCellMode mode, int align)
2442 :wxDataViewRenderer(varianttype,mode,align)
2443{
de40d736 2444 SetNativeData(new wxDataViewRendererNativeData(kDataBrowserDateTimeType));
e86edab0
RR
2445}
2446
8f2a8de6 2447bool wxDataViewDateRenderer::MacRender()
e86edab0 2448{
de40d736
VZ
2449 wxCHECK_MSG(GetValue().GetType() == GetVariantType(),false,wxString(_("Date renderer cannot render value; value type: ")) << GetValue().GetType());
2450 return (::SetDataBrowserItemDataDateTime(GetNativeData()->GetItemDataRef(),GetValue().GetDateTime().Subtract(wxDateTime(1,wxDateTime::Jan,1904)).GetSeconds().GetLo()) == noErr);
e86edab0
RR
2451}
2452
2453IMPLEMENT_ABSTRACT_CLASS(wxDataViewDateRenderer,wxDataViewRenderer)
2454
2455// ---------------------------------------------------------
2456// wxDataViewColumn
2457// ---------------------------------------------------------
2458wxDataViewColumn::wxDataViewColumn(const wxString& title, wxDataViewRenderer* renderer, unsigned int model_column, int width, wxAlignment align, int flags)
2459 :wxDataViewColumnBase(renderer, model_column), m_NativeDataPtr(new wxDataViewColumnNativeData()), m_title(title)
2460{
de40d736 2461 InitCommon(width, align, flags);
e86edab0
RR
2462 if ((renderer != NULL) && (renderer->GetAlignment() == wxDVR_DEFAULT_ALIGNMENT))
2463 renderer->SetAlignment(align);
2464}
2465
2466wxDataViewColumn::wxDataViewColumn(const wxBitmap& bitmap, wxDataViewRenderer* renderer, unsigned int model_column, int width, wxAlignment align, int flags)
2467 :wxDataViewColumnBase(bitmap, renderer, model_column), m_NativeDataPtr(new wxDataViewColumnNativeData())
2468{
de40d736 2469 InitCommon(width, align, flags);
e86edab0
RR
2470 if ((renderer != NULL) && (renderer->GetAlignment() == wxDVR_DEFAULT_ALIGNMENT))
2471 renderer->SetAlignment(align);
2472}
2473
de40d736 2474wxDataViewColumn::~wxDataViewColumn()
e86edab0 2475{
de40d736 2476 delete m_NativeDataPtr;
e86edab0
RR
2477}
2478
d831e2db
VZ
2479int wxDataViewColumn::GetWidth() const
2480{
2481 // FIXME: This returns the last programatically set width and will not work if
2482 // the user changes the column's width by dragging it with the mouse.
2483 return m_width;
2484}
2485
e86edab0
RR
2486bool wxDataViewColumn::IsSortKey() const
2487{
2488 wxDataViewCtrl * const dataViewCtrlPtr(GetOwner());
2489 wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(
2490 dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(
2491 dataViewCtrlPtr->GetPeer()));
2492
2493 DataBrowserPropertyID propertyID;
2494 return (macDataViewListCtrlPtr->GetSortProperty(&propertyID) == noErr) &&
de40d736 2495 (propertyID == GetNativeData()->GetPropertyID());
e86edab0
RR
2496}
2497
2498void wxDataViewColumn::SetAlignment(wxAlignment align)
2499{
de40d736 2500 wxDataViewCtrl* dataViewCtrlPtr(GetOwner());
e86edab0
RR
2501
2502
2503 m_alignment = align;
2504 if (dataViewCtrlPtr != NULL)
2505 {
2506 wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
2507
2508 if (macDataViewListCtrlPtr != NULL)
2509 {
2510 DataBrowserListViewHeaderDesc headerDescription;
2511
de40d736 2512 wxCHECK_RET(macDataViewListCtrlPtr->GetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription) == noErr,_("Could not get header description."));
e86edab0
RR
2513 switch (align)
2514 {
2515 case wxALIGN_CENTER:
2516 case wxALIGN_CENTER_HORIZONTAL:
2517 headerDescription.btnFontStyle.just = teCenter;
2518 break;
2519 case wxALIGN_LEFT:
2520 headerDescription.btnFontStyle.just = teFlushLeft;
2521 break;
2522 case wxALIGN_RIGHT:
2523 headerDescription.btnFontStyle.just = teFlushRight;
2524 break;
2525 default:
2526 headerDescription.btnFontStyle.just = teFlushDefault;
2527 }
de40d736 2528 wxCHECK_RET(macDataViewListCtrlPtr->SetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription) == noErr,_("Could not set alignment."));
e86edab0
RR
2529 }
2530 }
2531}
2532
2533void wxDataViewColumn::SetBitmap(wxBitmap const& bitmap)
2534{
de40d736 2535 wxDataViewCtrl* dataViewCtrlPtr(GetOwner());
e86edab0
RR
2536
2537
2538 wxDataViewColumnBase::SetBitmap(bitmap);
2539 if (dataViewCtrlPtr != NULL)
2540 {
2541 wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
2542
2543 if (macDataViewListCtrlPtr != NULL)
2544 {
2545 DataBrowserListViewHeaderDesc headerDescription;
2546
de40d736
VZ
2547 wxCHECK_RET(macDataViewListCtrlPtr->GetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription) == noErr,_("Could not get header description."));
2548 if (GetBitmap().Ok())
2549 headerDescription.btnContentInfo.u.iconRef = GetBitmap().GetIconRef();
e86edab0
RR
2550 else
2551 headerDescription.btnContentInfo.u.iconRef = NULL;
de40d736 2552 wxCHECK_RET(macDataViewListCtrlPtr->SetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription) == noErr,_("Could not set icon."));
e86edab0
RR
2553 }
2554 }
2555}
2556
2557void wxDataViewColumn::SetMaxWidth(int maxWidth)
2558{
de40d736 2559 wxDataViewCtrl* dataViewCtrlPtr(GetOwner());
e86edab0
RR
2560
2561
2562 m_maxWidth = maxWidth;
2563 if (dataViewCtrlPtr != NULL)
2564 {
2565 wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
2566
2567 if (macDataViewListCtrlPtr != NULL)
2568 {
2569 DataBrowserListViewHeaderDesc headerDescription;
2570
de40d736 2571 wxCHECK_RET(macDataViewListCtrlPtr->GetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription) == noErr,_("Could not get header description."));
e86edab0 2572 headerDescription.maximumWidth = static_cast<UInt16>(maxWidth);
de40d736 2573 wxCHECK_RET(macDataViewListCtrlPtr->SetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription) == noErr,_("Could not set maximum width."));
e86edab0
RR
2574 }
2575 }
2576}
2577
2578void wxDataViewColumn::SetMinWidth(int minWidth)
2579{
de40d736 2580 wxDataViewCtrl* dataViewCtrlPtr(GetOwner());
e86edab0
RR
2581
2582
2583 m_minWidth = minWidth;
2584 if (dataViewCtrlPtr != NULL)
2585 {
2586 wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
2587
2588 if (macDataViewListCtrlPtr != NULL)
2589 {
2590 DataBrowserListViewHeaderDesc headerDescription;
2591
de40d736 2592 wxCHECK_RET(macDataViewListCtrlPtr->GetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription) == noErr,_("Could not get header description."));
e86edab0 2593 headerDescription.minimumWidth = static_cast<UInt16>(minWidth);
de40d736 2594 wxCHECK_RET(macDataViewListCtrlPtr->SetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription) == noErr,_("Could not set minimum width."));
e86edab0
RR
2595 }
2596 }
2597}
2598
2599void wxDataViewColumn::SetReorderable(bool reorderable)
2600{
2601 // first set the internal flag of the column:
2602 if (reorderable)
2603 m_flags |= wxDATAVIEW_COL_REORDERABLE;
2604 else
2605 m_flags &= ~wxDATAVIEW_COL_REORDERABLE;
2606 // if the column is associated with a control change also immediately the flags of the control:
de40d736 2607 wxDataViewCtrl* dataViewCtrlPtr(GetOwner());
e86edab0
RR
2608
2609 if (dataViewCtrlPtr != NULL)
2610 {
2611 DataBrowserPropertyFlags flags;
2612 wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
2613
2614 wxCHECK_RET(macDataViewListCtrlPtr != NULL, _("Valid pointer to native data view control does not exist"));
de40d736 2615 wxCHECK_RET(macDataViewListCtrlPtr->GetPropertyFlags(GetNativeData()->GetPropertyID(),&flags) == noErr,_("Could not get property flags."));
e86edab0
RR
2616 if (reorderable)
2617 flags |= kDataBrowserListViewMovableColumn;
2618 else
2619 flags &= ~kDataBrowserListViewMovableColumn;
de40d736 2620 wxCHECK_RET(macDataViewListCtrlPtr->SetPropertyFlags(GetNativeData()->GetPropertyID(),flags) == noErr,_("Could not set property flags."));
e86edab0
RR
2621 }
2622}
2623
2624void wxDataViewColumn::SetResizeable(bool resizeable)
2625{
2626 // first set the internal flag of the column:
2627 if (resizeable)
2628 m_flags |= wxDATAVIEW_COL_RESIZABLE;
2629 else
2630 m_flags &= ~wxDATAVIEW_COL_RESIZABLE;
2631 // if the column is associated with a control change also immediately the flags of the control:
de40d736 2632 wxDataViewCtrl* dataViewCtrlPtr(GetOwner());
e86edab0
RR
2633
2634 if (dataViewCtrlPtr != NULL)
2635 {
2636 wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
2637
2638 if (macDataViewListCtrlPtr != NULL)
2639 {
2640 DataBrowserListViewHeaderDesc headerDescription;
2641
de40d736 2642 verify_noerr(macDataViewListCtrlPtr->GetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription));
e86edab0
RR
2643 if (resizeable)
2644 {
de40d736 2645 if (GetMinWidth() >= GetMaxWidth())
e86edab0 2646 {
de40d736
VZ
2647 m_minWidth = 0;
2648 m_maxWidth = 30000;
e86edab0 2649 }
de40d736
VZ
2650 headerDescription.minimumWidth = m_minWidth;
2651 headerDescription.maximumWidth = m_maxWidth;
e86edab0
RR
2652 }
2653 else
2654 {
de40d736
VZ
2655 headerDescription.minimumWidth = m_width;
2656 headerDescription.maximumWidth = m_width;
e86edab0 2657 }
de40d736
VZ
2658 verify_noerr(macDataViewListCtrlPtr->SetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription));
2659 macDataViewListCtrlPtr->SetSortProperty(GetNativeData()->GetPropertyID());
e86edab0
RR
2660 }
2661 }
2662}
2663
2664void wxDataViewColumn::SetSortable(bool sortable)
2665{
2666 // first set the internal flag of the column:
2667 if (sortable)
2668 m_flags |= wxDATAVIEW_COL_SORTABLE;
2669 else
2670 m_flags &= ~wxDATAVIEW_COL_SORTABLE;
2671 // if the column is associated with a control change also immediately the flags of the control:
de40d736 2672 wxDataViewCtrl* dataViewCtrlPtr(GetOwner());
e86edab0
RR
2673
2674 if (dataViewCtrlPtr != NULL)
2675 {
2676 DataBrowserPropertyFlags flags;
2677 wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
2678
2679 wxCHECK_RET(macDataViewListCtrlPtr != NULL, _("Valid pointer to native data view control does not exist"));
de40d736 2680 wxCHECK_RET(macDataViewListCtrlPtr->GetPropertyFlags(GetNativeData()->GetPropertyID(),&flags) == noErr,_("Could not get property flags."));
e86edab0
RR
2681 if (sortable)
2682 flags |= kDataBrowserListViewSortableColumn;
2683 else
2684 flags &= ~kDataBrowserListViewSortableColumn;
de40d736 2685 wxCHECK_RET(macDataViewListCtrlPtr->SetPropertyFlags(GetNativeData()->GetPropertyID(),flags) == noErr,_("Could not set property flags."));
e86edab0
RR
2686 }
2687}
2688
2689void wxDataViewColumn::SetSortOrder(bool ascending)
2690{
de40d736 2691 wxDataViewCtrl* dataViewCtrlPtr(GetOwner());
e86edab0
RR
2692
2693
2694 m_ascending = ascending;
2695 if (dataViewCtrlPtr != NULL)
2696 {
2697 wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
2698
2699 if (macDataViewListCtrlPtr != NULL)
2700 {
2701 DataBrowserListViewHeaderDesc headerDescription;
2702
de40d736 2703 verify_noerr(macDataViewListCtrlPtr->GetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription));
e86edab0
RR
2704 if (ascending)
2705 headerDescription.initialOrder = kDataBrowserOrderIncreasing;
2706 else
2707 headerDescription.initialOrder = kDataBrowserOrderDecreasing;
de40d736
VZ
2708 verify_noerr(macDataViewListCtrlPtr->SetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription));
2709 macDataViewListCtrlPtr->SetSortProperty(GetNativeData()->GetPropertyID());
e86edab0
RR
2710 }
2711 }
2712}
2713
2714void wxDataViewColumn::SetTitle(wxString const& title)
2715{
de40d736 2716 wxDataViewCtrl* dataViewCtrlPtr(GetOwner());
e86edab0
RR
2717
2718
2719 m_title = title;
2720 if (dataViewCtrlPtr != NULL)
2721 {
2722 wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
2723
2724 if (macDataViewListCtrlPtr != NULL)
2725 {
2726 DataBrowserListViewHeaderDesc headerDescription;
2727 wxCFStringRef cfTitle(title,(dataViewCtrlPtr->GetFont().Ok() ? dataViewCtrlPtr->GetFont().GetEncoding() : wxLocale::GetSystemEncoding()));
2728
de40d736 2729 wxCHECK_RET(macDataViewListCtrlPtr->GetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription) == noErr,_("Could not get header description."));
e86edab0 2730 headerDescription.titleString = cfTitle;
de40d736 2731 wxCHECK_RET(macDataViewListCtrlPtr->SetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription) == noErr,_("Could not set header description."));
e86edab0
RR
2732 }
2733 }
2734}
2735
2736void wxDataViewColumn::SetWidth(int width)
2737{
de40d736 2738 wxDataViewCtrl* dataViewCtrlPtr(GetOwner());
e86edab0
RR
2739
2740
2741 if ((width >= m_minWidth) && (width <= m_maxWidth))
2742 {
2743 m_width = width;
2744 if (dataViewCtrlPtr != NULL)
2745 {
2746 wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
2747
2748 if (macDataViewListCtrlPtr != NULL)
de40d736 2749 wxCHECK_RET(macDataViewListCtrlPtr->SetColumnWidth(GetNativeData()->GetPropertyID(),static_cast<UInt16>(width)) == noErr,_("Could not set column width."));
e86edab0
RR
2750 }
2751 }
2752}
2753
2754void wxDataViewColumn::SetAsSortKey(bool WXUNUSED(sort))
2755{
2756 // see wxGTK native wxDataViewColumn implementation
2757 wxFAIL_MSG( "not implemented" );
2758}
2759
2760void wxDataViewColumn::SetNativeData(wxDataViewColumnNativeData* newNativeDataPtr)
2761{
de40d736
VZ
2762 delete m_NativeDataPtr;
2763 m_NativeDataPtr = newNativeDataPtr;
e86edab0 2764}
489468fe 2765
e86edab0 2766#endif // wxUSE_DATAVIEWCTRL && !wxUSE_GENERICDATAVIEWCTRL