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