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