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