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