]> git.saurik.com Git - wxWidgets.git/blob - src/mac/carbon/databrow.cpp
non-pch build fix
[wxWidgets.git] / src / mac / carbon / databrow.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/mac/carbon/databrow.cpp
3 // Purpose: Classes and functions for the Carbon data browser
4 // Author:
5 // Modified by:
6 // Created: 2007-05-18
7 // RCS-ID: $Id$
8 // Copyright: (c)
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
11
12 #include "wx/wxprec.h"
13
14 #ifndef wxUSE_GENERICDATAVIEWCTRL
15
16 #ifndef WX_PRECOMP
17 #include "wx/app.h"
18 #include "wx/toplevel.h"
19 #include "wx/font.h"
20 #include "wx/settings.h"
21 #include "wx/utils.h"
22 #endif
23
24 #include "wx/dataview.h"
25 #include "wx/mac/carbon/databrow.h"
26 #include "wx/mac/private.h"
27 #include "wx/mac/uma.h"
28
29 #include <limits>
30
31 // ============================================================================
32 // Variables used globally in databrow.cpp
33 // ============================================================================
34 DataBrowserGetContextualMenuUPP gDataBrowserTableViewGetContextualMenuUPP = NULL;
35 DataBrowserItemCompareUPP gDataBrowserTableViewItemCompareUPP = NULL;
36 DataBrowserItemDataUPP gDataBrowserTableViewItemDataUPP = NULL;
37 DataBrowserItemNotificationUPP gDataBrowserTableViewItemNotificationUPP = NULL;
38
39 DataBrowserDrawItemUPP gDataBrowserTableViewDrawItemUPP = NULL;
40 DataBrowserEditItemUPP gDataBrowserTableViewEditItemUPP = NULL;
41 DataBrowserHitTestUPP gDataBrowserTableViewHitTestUPP = NULL;
42 DataBrowserTrackingUPP gDataBrowserTableViewTrackingUPP = NULL;
43
44 // ============================================================================
45 // wxMacDataBrowserTableViewControl
46 // ============================================================================
47
48 pascal Boolean wxMacDataBrowserTableViewControl::DataBrowserCompareProc(ControlRef browser, DataBrowserItemID itemOneID, DataBrowserItemID itemTwoID, DataBrowserPropertyID sortProperty)
49 {
50 wxMacDataBrowserTableViewControl* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl*>(wxMacControl::GetReferenceFromNativeControl(browser)));
51
52
53 if (ControlPtr != NULL)
54 return ControlPtr->DataBrowserCompareProc(itemOneID,itemTwoID,sortProperty);
55 else
56 return errDataBrowserPropertyNotSupported;
57 } /* wxMacDataBrowserTableViewControl::DataBrowserCompareProc(ControlRef, DataBrowserItemID, DataBrowserItemID, DataBrowserPropertyID) */
58
59 pascal void wxMacDataBrowserTableViewControl::DataBrowserGetContextualMenuProc(ControlRef browser, MenuRef* menu, UInt32* helpType, CFStringRef* helpItemString, AEDesc* selection)
60 {
61 wxMacDataBrowserTableViewControl* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl*>(wxMacControl::GetReferenceFromNativeControl(browser)));
62
63
64 if (ControlPtr != NULL)
65 ControlPtr->DataBrowserGetContextualMenuProc(menu,helpType,helpItemString,selection);
66 } /* wxMacDataBrowserTableViewControl::DataBrowserGetContextualMenuProc(ControlRef, MenuRef*, UInt32*, CFStringRef*, AEDesc*) */
67
68 pascal OSStatus wxMacDataBrowserTableViewControl::DataBrowserGetSetItemDataProc(ControlRef browser, DataBrowserItemID itemID, DataBrowserPropertyID propertyID, DataBrowserItemDataRef itemData, Boolean getValue)
69 {
70 wxMacDataBrowserTableViewControl* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl*>(wxMacControl::GetReferenceFromNativeControl(browser)));
71
72
73 if (ControlPtr != NULL)
74 return ControlPtr->DataBrowserGetSetItemDataProc(itemID,propertyID,itemData,getValue);
75 else
76 return errDataBrowserPropertyNotSupported;
77 } /* wxMacDataBrowserTableViewControl::DataBrowserGetSetItemDataProc(ControlRef, DataBrowserItemID, DataBrowserPropertyID, DataBrowserItemDataRef, Boolean) */
78
79 pascal void wxMacDataBrowserTableViewControl::DataBrowserItemNotificationProc(ControlRef browser, DataBrowserItemID itemID, DataBrowserItemNotification message, DataBrowserItemDataRef itemData)
80 {
81 wxMacDataBrowserTableViewControl* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl*>(wxMacControl::GetReferenceFromNativeControl(browser)));
82
83
84 if (ControlPtr != NULL)
85 ControlPtr->DataBrowserItemNotificationProc(itemID,message,itemData);
86 } /* wxMacDataBrowserTableViewControl::DataBrowserItemNotificationProc(ControlRef, DataBrowserItemID, DataBrowserItemNotification, DataBrowserItemDataRef) */
87
88 pascal void wxMacDataBrowserTableViewControl::DataBrowserDrawItemProc(ControlRef browser, DataBrowserItemID itemID, DataBrowserPropertyID propertyID, DataBrowserItemState state, Rect const* rectangle, SInt16 bitDepth, Boolean colorDevice)
89 {
90 wxMacDataBrowserTableViewControl* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl*>(wxMacControl::GetReferenceFromNativeControl(browser)));
91
92
93 if (ControlPtr != NULL)
94 ControlPtr->DataBrowserDrawItemProc(itemID,propertyID,state,rectangle,bitDepth,colorDevice);
95 } /* wxMacDataBrowserTableViewControl::DataBrowserDrawItemProc(ControlRef, DataBrowserItemID, DataBrowserPropertyID, DataBrowserItemState, Rect const*, SInt16, Boolean) */
96
97 pascal Boolean wxMacDataBrowserTableViewControl::DataBrowserEditItemProc(ControlRef browser, DataBrowserItemID itemID, DataBrowserPropertyID propertyID, CFStringRef theString, Rect* maxEditTextRect, Boolean* shrinkToFit)
98 {
99 wxMacDataBrowserTableViewControl* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl*>(wxMacControl::GetReferenceFromNativeControl(browser)));
100
101
102 return ((ControlPtr != NULL) && ControlPtr->DataBrowserEditItemProc(itemID,propertyID,theString,maxEditTextRect,shrinkToFit));
103 } /* wxMacDataBrowserTableViewControl::DataBrowserEditItemProc(ControlRef, DataBrowserItemID, DataBrowserPropertyID, CFStringRef, Rect*, Boolean*) */
104
105 pascal Boolean wxMacDataBrowserTableViewControl::DataBrowserHitTestProc(ControlRef browser, DataBrowserItemID itemID, DataBrowserPropertyID propertyID, Rect const* theRect, Rect const* mouseRect)
106 {
107 wxMacDataBrowserTableViewControl* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl*>(wxMacControl::GetReferenceFromNativeControl(browser)));
108
109
110 return ((ControlPtr != NULL) && ControlPtr->DataBrowserHitTestProc(itemID,propertyID,theRect,mouseRect));
111 } /* wxMacDataBrowserTableViewControl::DataBrowserHitTestProc(ControlRef, DataBrowserItemID, DataBrowserPropertyID, Rect const*, Rect const*) */
112
113 pascal DataBrowserTrackingResult wxMacDataBrowserTableViewControl::DataBrowserTrackingProc(ControlRef browser, DataBrowserItemID itemID, DataBrowserPropertyID propertyID, Rect const* theRect, Point startPt, EventModifiers modifiers)
114 {
115 wxMacDataBrowserTableViewControl* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl*>(wxMacControl::GetReferenceFromNativeControl(browser)));
116
117
118 if (ControlPtr != NULL)
119 return ControlPtr->DataBrowserTrackingProc(itemID,propertyID,theRect,startPt,modifiers);
120 else
121 return kDataBrowserNothingHit;
122 } /* wxMacDataBrowserTableViewControl::DataBrowserTrackingProc(ControlRef, DataBrowserItemID, DataBrowserPropertyID, Rect const*, Point, EventModifiers) */
123
124 wxMacDataBrowserTableViewControl::wxMacDataBrowserTableViewControl(wxWindow* peer, wxPoint const& pos, wxSize const& size, long style)
125 :wxMacControl(peer)
126 {
127 Rect bounds = wxMacGetBoundsForControl(peer,pos,size);
128 OSStatus err = ::CreateDataBrowserControl(MAC_WXHWND(peer->MacGetTopLevelWindowRef()),&bounds,kDataBrowserListView,&(this->m_controlRef));
129
130
131 SetReferenceInNativeControl();
132 verify_noerr(err);
133 // setup standard callbacks:
134 if (gDataBrowserTableViewGetContextualMenuUPP == NULL) gDataBrowserTableViewGetContextualMenuUPP = NewDataBrowserGetContextualMenuUPP(wxMacDataBrowserTableViewControl::DataBrowserGetContextualMenuProc);
135 if (gDataBrowserTableViewItemCompareUPP == NULL) gDataBrowserTableViewItemCompareUPP = NewDataBrowserItemCompareUPP (wxMacDataBrowserTableViewControl::DataBrowserCompareProc);
136 if (gDataBrowserTableViewItemDataUPP == NULL) gDataBrowserTableViewItemDataUPP = NewDataBrowserItemDataUPP (wxMacDataBrowserTableViewControl::DataBrowserGetSetItemDataProc);
137 if (gDataBrowserTableViewItemNotificationUPP == NULL)
138 {
139 gDataBrowserTableViewItemNotificationUPP =
140 #if TARGET_API_MAC_OSX
141 (DataBrowserItemNotificationUPP) NewDataBrowserItemNotificationWithItemUPP(wxMacDataBrowserTableViewControl::DataBrowserItemNotificationProc);
142 #else
143 NewDataBrowserItemNotificationUPP(wxMacDataBrowserTableViewControl::DataBrowserItemNotificationProc);
144 #endif
145 }
146 DataBrowserCallbacks callbacks; // variable definition
147
148 InitializeDataBrowserCallbacks(&callbacks,kDataBrowserLatestCallbacks);
149 callbacks.u.v1.getContextualMenuCallback = gDataBrowserTableViewGetContextualMenuUPP;
150 callbacks.u.v1.itemDataCallback = gDataBrowserTableViewItemDataUPP;
151 callbacks.u.v1.itemCompareCallback = gDataBrowserTableViewItemCompareUPP;
152 callbacks.u.v1.itemNotificationCallback = gDataBrowserTableViewItemNotificationUPP;
153 this->SetCallbacks(&callbacks);
154
155 // setup callbacks for customized items:
156 if (gDataBrowserTableViewDrawItemUPP == NULL) gDataBrowserTableViewDrawItemUPP = NewDataBrowserDrawItemUPP(wxMacDataBrowserTableViewControl::DataBrowserDrawItemProc);
157 if (gDataBrowserTableViewEditItemUPP == NULL) gDataBrowserTableViewEditItemUPP = NewDataBrowserEditItemUPP(wxMacDataBrowserTableViewControl::DataBrowserEditItemProc);
158 if (gDataBrowserTableViewHitTestUPP == NULL) gDataBrowserTableViewHitTestUPP = NewDataBrowserHitTestUPP (wxMacDataBrowserTableViewControl::DataBrowserHitTestProc);
159 if (gDataBrowserTableViewTrackingUPP == NULL) gDataBrowserTableViewTrackingUPP = NewDataBrowserTrackingUPP(wxMacDataBrowserTableViewControl::DataBrowserTrackingProc);
160
161 DataBrowserCustomCallbacks customCallbacks; // variable definition
162
163 InitializeDataBrowserCustomCallbacks(&customCallbacks,kDataBrowserLatestCallbacks);
164 customCallbacks.u.v1.drawItemCallback = gDataBrowserTableViewDrawItemUPP;
165 customCallbacks.u.v1.editTextCallback = gDataBrowserTableViewEditItemUPP;
166 customCallbacks.u.v1.hitTestCallback = gDataBrowserTableViewHitTestUPP;
167 customCallbacks.u.v1.trackingCallback = gDataBrowserTableViewTrackingUPP;
168 this->SetCustomCallbacks(&customCallbacks);
169
170 // style setting:
171 this->EnableCellSizeModification();
172
173 DataBrowserSelectionFlags flags; // variable definition
174
175 if (this->GetSelectionFlags(&flags) == noErr) // get default settings
176 {
177 if ((style & wxDV_MULTIPLE) != 0)
178 flags &= ~kDataBrowserSelectOnlyOne;
179 else
180 flags |= kDataBrowserSelectOnlyOne;
181 (void) this->SetSelectionFlags(flags);
182 } /* if */
183
184 OptionBits attributes; // variable definition
185
186 if (this->GetAttributes(&attributes) == noErr) // get default settings
187 {
188 if ((style & wxDV_VERT_RULES) != 0)
189 attributes |= kDataBrowserAttributeListViewDrawColumnDividers;
190 else
191 attributes &= ~kDataBrowserAttributeListViewDrawColumnDividers;
192 if ((style & wxDV_ROW_LINES) != 0)
193 attributes |= kDataBrowserAttributeListViewAlternatingRowColors;
194 else
195 attributes &= ~kDataBrowserAttributeListViewAlternatingRowColors;
196 (void) this->SetAttributes(attributes);
197 } /* if */
198
199 if ((style & wxDV_NO_HEADER) != 0)
200 this->SetHeaderButtonHeight(0);
201 } /* wxMacDataBrowserTableViewControl::wxMacDataBrowserTableViewControl(wxWindow*, wxPoint const&, wxSize const&, long) */
202
203 //
204 // callback handling
205 //
206 OSStatus wxMacDataBrowserTableViewControl::SetCallbacks(DataBrowserCallbacks const* callbacks)
207 {
208 return ::SetDataBrowserCallbacks(this->m_controlRef,callbacks);
209 } /* wxMacDataBrowserTableViewControl::SetCallbacks(DataBrowserCallbacks const*) */
210
211 OSStatus wxMacDataBrowserTableViewControl::SetCustomCallbacks(DataBrowserCustomCallbacks const* customCallbacks)
212 {
213 return ::SetDataBrowserCustomCallbacks(this->m_controlRef,customCallbacks);
214 } /* xMacDataBrowserTableViewControl::SetCustomCallbacks(DataBrowserCustomCallbacks const*) */
215
216 //
217 // header handling
218 //
219 OSStatus wxMacDataBrowserTableViewControl::GetHeaderDesc(DataBrowserPropertyID propertyID, DataBrowserListViewHeaderDesc* desc) const
220 {
221 desc->version = kDataBrowserListViewLatestHeaderDesc; // if this statement is missing the next call will fail (NOT DOCUMENTED!!)
222 return ::GetDataBrowserListViewHeaderDesc(this->m_controlRef,propertyID,desc);
223 }
224
225 OSStatus wxMacDataBrowserTableViewControl::SetHeaderDesc(DataBrowserPropertyID propertyID, DataBrowserListViewHeaderDesc* desc)
226 {
227 return ::SetDataBrowserListViewHeaderDesc(this->m_controlRef,propertyID,desc);
228 }
229
230 //
231 // layout handling
232 //
233 OSStatus wxMacDataBrowserTableViewControl::AutoSizeColumns()
234 {
235 return AutoSizeDataBrowserListViewColumns(this->m_controlRef);
236 }
237
238 OSStatus wxMacDataBrowserTableViewControl::EnableCellSizeModification(bool enableHeight, bool enableWidth)
239 {
240 return ::SetDataBrowserTableViewGeometry(this->GetControlRef(),enableWidth,enableHeight);
241 } /* wxMacDataBrowserTableViewControl::EnableCellSizeModification(bool, bool) */
242
243 OSStatus wxMacDataBrowserTableViewControl::GetAttributes(OptionBits* attributes)
244 {
245 return ::DataBrowserGetAttributes(this->GetControlRef(),attributes);
246 } /* wxMacDataBrowserTableViewControl::GetAttributes(OptionBits*) */
247
248 OSStatus wxMacDataBrowserTableViewControl::GetColumnWidth(DataBrowserPropertyID propertyID, UInt16* width) const
249 {
250 return ::GetDataBrowserTableViewNamedColumnWidth(this->m_controlRef,propertyID,width);
251 }
252
253 OSStatus wxMacDataBrowserTableViewControl::GetDefaultColumnWidth( UInt16 *width ) const
254 {
255 return GetDataBrowserTableViewColumnWidth(this->m_controlRef, width );
256 }
257
258 OSStatus wxMacDataBrowserTableViewControl::GetDefaultRowHeight(UInt16* height) const
259 {
260 return ::GetDataBrowserTableViewRowHeight(this->m_controlRef,height);
261 }
262
263 OSStatus wxMacDataBrowserTableViewControl::GetHeaderButtonHeight(UInt16 *height)
264 {
265 return ::GetDataBrowserListViewHeaderBtnHeight(this->m_controlRef,height);
266 }
267
268 OSStatus wxMacDataBrowserTableViewControl::GetPartBounds(DataBrowserItemID item, DataBrowserPropertyID propertyID, DataBrowserPropertyPart part, Rect* bounds)
269 {
270 return ::GetDataBrowserItemPartBounds(this->m_controlRef,item,propertyID,part,bounds);
271 } /* wxMacDataBrowserTableViewControl::GetPartBounds(DataBrowserItemID, DataBrowswerPropertyID, DataBrowserPropertyPart, Rect*) */
272
273 OSStatus wxMacDataBrowserTableViewControl::GetRowHeight(DataBrowserItemID item, UInt16* height) const
274 {
275 return ::GetDataBrowserTableViewItemRowHeight(this->m_controlRef,item,height);
276 } /* wxMacDataBrowserTableViewControl::GetRowHeight(DataBrowserItemID, UInt16*) const */
277
278 OSStatus wxMacDataBrowserTableViewControl::GetScrollPosition( UInt32 *top , UInt32 *left ) const
279 {
280 return GetDataBrowserScrollPosition(this->m_controlRef, top , left );
281 }
282
283 OSStatus wxMacDataBrowserTableViewControl::SetAttributes(OptionBits attributes)
284 {
285 return ::DataBrowserChangeAttributes(this->GetControlRef(),attributes,~attributes);
286 } /* wxMacDataBrowserTableViewControl::SetAttributes(OptionBits) */
287
288 OSStatus wxMacDataBrowserTableViewControl::SetColumnWidth(DataBrowserPropertyID propertyID, UInt16 width)
289 {
290 return ::SetDataBrowserTableViewNamedColumnWidth(this->m_controlRef,propertyID,width);
291 }
292
293 OSStatus wxMacDataBrowserTableViewControl::SetDefaultColumnWidth(UInt16 width)
294 {
295 return ::SetDataBrowserTableViewColumnWidth(this->m_controlRef,width);
296 }
297
298 OSStatus wxMacDataBrowserTableViewControl::SetDefaultRowHeight(UInt16 height)
299 {
300 return ::SetDataBrowserTableViewRowHeight(this->m_controlRef,height);
301 }
302
303 OSStatus wxMacDataBrowserTableViewControl::SetHasScrollBars(bool horiz, bool vert)
304 {
305 return ::SetDataBrowserHasScrollBars(this->m_controlRef,horiz,vert);
306 } /* wxMacDataBrowserTableViewControl::SetHasScrollBars(bool, bool) */
307
308 OSStatus wxMacDataBrowserTableViewControl::SetHeaderButtonHeight(UInt16 height)
309 {
310 return ::SetDataBrowserListViewHeaderBtnHeight(this->m_controlRef,height);
311 } /* wxMacDataBrowserTableViewControl::SetHeaderButtonHeight(UInt16) */
312
313 OSStatus wxMacDataBrowserTableViewControl::SetHiliteStyle(DataBrowserTableViewHiliteStyle hiliteStyle)
314 {
315 return ::SetDataBrowserTableViewHiliteStyle(this->m_controlRef,hiliteStyle);
316 } /*wxMacDataBrowserTableViewControl::SetHiliteStyle(DataBrowserTableViewHiliteStyle) */
317
318 OSStatus wxMacDataBrowserTableViewControl::SetIndent(float Indent)
319 {
320 return ::DataBrowserSetMetric(this->m_controlRef,kDataBrowserMetricDisclosureColumnPerDepthGap,true,Indent);
321 } /* wxMacDataBrowserTableViewControl::SetIndent(float* Indent) */
322
323 OSStatus wxMacDataBrowserTableViewControl::SetRowHeight(DataBrowserItemID item, UInt16 height)
324 {
325 return ::SetDataBrowserTableViewItemRowHeight(this->m_controlRef,item,height);
326 }
327
328 OSStatus wxMacDataBrowserTableViewControl::SetScrollPosition(UInt32 top, UInt32 left)
329 {
330 return ::SetDataBrowserScrollPosition(this->m_controlRef,top,left);
331 }
332
333 //
334 // column handling
335 //
336 OSStatus wxMacDataBrowserTableViewControl::GetColumnCount(UInt32* numColumns) const
337 {
338 return ::GetDataBrowserTableViewColumnCount(this->m_controlRef,numColumns);
339 }
340
341 OSStatus wxMacDataBrowserTableViewControl::GetColumnIndex(DataBrowserPropertyID propertyID, DataBrowserTableViewColumnIndex* index) const
342 {
343 return ::GetDataBrowserTableViewColumnPosition(this->m_controlRef,propertyID,index);
344 } /* wxMacDataBrowserTableViewControl::GetColumnIndex(DataBrowserPropertyID, DataBrowserTableViewColumnIndex*) const */
345
346 OSStatus wxMacDataBrowserTableViewControl::GetFreePropertyID(DataBrowserPropertyID* propertyID) const
347 {
348 for (*propertyID=kMinPropertyID; *propertyID<std::numeric_limits<DataBrowserPropertyID>::max(); ++(*propertyID))
349 if (this->IsUsedPropertyID(*propertyID) == errDataBrowserPropertyNotFound)
350 return noErr;
351 return errDataBrowserPropertyNotSupported;
352 } /* wxMacDataBrowserTableViewControl::GetFreePropertyID(DataBrowserPropertyID*) const */
353
354 OSStatus wxMacDataBrowserTableViewControl::GetPropertyFlags(DataBrowserPropertyID propertyID, DataBrowserPropertyFlags *flags) const
355 {
356 return ::GetDataBrowserPropertyFlags(this->m_controlRef,propertyID,flags);
357 }
358
359 OSStatus wxMacDataBrowserTableViewControl::GetPropertyID(DataBrowserItemDataRef itemData, DataBrowserPropertyID* propertyID)
360 {
361 return ::GetDataBrowserItemDataProperty(itemData,propertyID);
362 } /* wxMacDataBrowserTableViewControl::GetPropertyID(DataBrowserItemDataRef, DataBrowserPropertyID*) */
363
364 OSStatus wxMacDataBrowserTableViewControl::GetPropertyID(DataBrowserTableViewColumnIndex index, DataBrowserTableViewColumnID* propertyID)
365 {
366 return ::GetDataBrowserTableViewColumnProperty(this->m_controlRef,index,propertyID);
367 } /* wxMacDataBrowserTableViewControl::GetPropertyID(DataBrowserTableViewColumnIndex, DataBrowserTableViewColumnID*) */
368
369 OSStatus wxMacDataBrowserTableViewControl::IsUsedPropertyID(DataBrowserPropertyID propertyID) const
370 {
371 // 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
372 // 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
373 // the column position for the property id:
374 DataBrowserTableViewColumnIndex index;
375
376 return ::GetDataBrowserTableViewColumnPosition(this->m_controlRef,propertyID,&index);
377 } /* wxMacDataBrowserTableViewControl::IsUsedPropertyId(DataBrowserPropertyID) const */
378
379 OSStatus wxMacDataBrowserTableViewControl::RemoveColumnByProperty(DataBrowserTableViewColumnID propertyID)
380 {
381 return ::RemoveDataBrowserTableViewColumn(this->m_controlRef,propertyID);
382 } /* wxMacDataBrowserTableViewControl::RemoveColumnByProperty(DataBrowserTableViewColumnID) */
383
384 OSStatus wxMacDataBrowserTableViewControl::RemoveColumnByIndex(DataBrowserTableViewColumnIndex index)
385 {
386 DataBrowserTableViewColumnID propertyID;
387
388
389 this->GetPropertyID(index,&propertyID);
390 return ::RemoveDataBrowserTableViewColumn(this->m_controlRef,propertyID);
391 } /* wxMacDataBrowserTableViewControl::RemoveColumnByIndex(DataBrowserTableViewColumnIndex) */
392
393 OSStatus wxMacDataBrowserTableViewControl::SetColumnIndex(DataBrowserPropertyID propertyID, DataBrowserTableViewColumnIndex index)
394 {
395 return ::SetDataBrowserTableViewColumnPosition(this->m_controlRef,propertyID,index);
396 } /* wxMacDataBrowserTableViewControl::SetColumnIndex(DataBrowserPropertyID, DataBrowserTableViewColumnIndex) */
397
398 OSStatus wxMacDataBrowserTableViewControl::SetDisclosureColumn(DataBrowserPropertyID propertyID, Boolean expandableRows)
399 {
400 return ::SetDataBrowserListViewDisclosureColumn(this->m_controlRef,propertyID,expandableRows);
401 }
402
403 OSStatus wxMacDataBrowserTableViewControl::SetPropertyFlags(DataBrowserPropertyID propertyID, DataBrowserPropertyFlags flags)
404 {
405 return ::SetDataBrowserPropertyFlags(this->m_controlRef,propertyID,flags);
406 } /* wxMacDataBrowserTableViewControl::SetPropertyFlags(DataBrowserPropertyID, DataBrowserPropertyFlags) */
407
408 //
409 // item handling
410 //
411 OSStatus wxMacDataBrowserTableViewControl::AddItems(DataBrowserItemID container, UInt32 numItems, DataBrowserItemID const* items, DataBrowserPropertyID preSortProperty)
412 {
413 return ::AddDataBrowserItems(this->m_controlRef,container,numItems,items,preSortProperty);
414 } /* wxMacDataBrowserTableViewControl::AddItems(DataBrowserItemID, UInt32, DataBrowserItemID const*, DataBrowserPropertyID) */
415
416 OSStatus wxMacDataBrowserTableViewControl::GetFreeItemID(DataBrowserItemID* id) const
417 {
418 ItemCount NoOfItems;
419
420 OSStatus status;
421
422
423 status = this->GetItemCount(&NoOfItems);
424 wxCHECK_MSG(status == noErr,status,_("Could not retrieve number of items"));
425 if (NoOfItems == 0)
426 {
427 *id = 1;
428 return noErr;
429 } /* if */
430 else
431 {
432 // 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
433 // as the number of items; therefore, start from the number of items to look for a new ID:
434 for (*id=NoOfItems; *id<std::numeric_limits<DataBrowserItemID>::max(); ++(*id))
435 if (this->IsUsedItemID(*id) == errDataBrowserItemNotFound)
436 return noErr;
437 // as the first approach was not successful, try from the beginning:
438 for (*id=0; *id<NoOfItems; ++(*id))
439 if (this->IsUsedItemID(*id) == errDataBrowserItemNotFound)
440 return noErr;
441 // sorry, data browser is full:
442 return errDataBrowserItemNotAdded;
443 } /* if */
444 } /* wxMacDataBrowserTableViewControl::GetFreeItemID(DataBrowserItemID*) const */
445
446 OSStatus wxMacDataBrowserTableViewControl::GetItemCount(DataBrowserItemID container, Boolean recurse, DataBrowserItemState state, ItemCount* numItems) const
447 {
448 return GetDataBrowserItemCount(this->m_controlRef,container,recurse,state,numItems);
449 } /* wxMacDataBrowserTableViewControl::GetItemCount(DataBrowserItemID, Boolean, DataBrowserItemState, ItemCount*) const */
450
451 OSStatus wxMacDataBrowserTableViewControl::GetItemID( DataBrowserTableViewRowIndex row, DataBrowserItemID * item ) const
452 {
453 return GetDataBrowserTableViewItemID(this->m_controlRef,row,item);
454 }
455
456 OSStatus wxMacDataBrowserTableViewControl::GetItems(DataBrowserItemID container, Boolean recurse, DataBrowserItemState state, Handle items) const
457 {
458 return GetDataBrowserItems(this->m_controlRef,container,recurse,state,items);
459 } /* wxMacDataBrowserTableViewControl::GetItems(DataBrowserItemID, Boolean, DataBrowserItemState, Handle) const */
460
461 OSStatus wxMacDataBrowserTableViewControl::GetItemRow(DataBrowserItemID item, DataBrowserTableViewRowIndex* row) const
462 {
463 return GetDataBrowserTableViewItemRow(this->m_controlRef,item,row);
464 }
465
466 OSStatus wxMacDataBrowserTableViewControl::IsUsedItemID(DataBrowserItemID itemID) const
467 {
468 // 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
469 // 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
470 // the column position for the property id:
471 DataBrowserTableViewColumnIndex index;
472
473 return ::GetDataBrowserTableViewItemRow(this->m_controlRef,itemID,&index);
474 } /* wxMacDataBrowserTableViewControl::IsUsedItemID(DataBrowserItemID) const */
475
476 OSStatus wxMacDataBrowserTableViewControl::RemoveItems(DataBrowserItemID container, UInt32 numItems, DataBrowserItemID const* items, DataBrowserPropertyID preSortProperty)
477 {
478 return ::RemoveDataBrowserItems(this->m_controlRef,container,numItems,items,preSortProperty);
479 }
480
481 OSStatus wxMacDataBrowserTableViewControl::RevealItem(DataBrowserItemID item, DataBrowserPropertyID propertyID, DataBrowserRevealOptions options) const
482 {
483 return ::RevealDataBrowserItem(this->m_controlRef,item,propertyID,options);
484 } /* wxMacDataBrowserTableViewControl::RevealItem(DataBrowserItemID item, DataBrowserPropertyID propertyID, DataBrowserRevealOptions options) const */
485
486 OSStatus wxMacDataBrowserTableViewControl::UpdateItems(DataBrowserItemID container, UInt32 numItems, DataBrowserItemID const* items, DataBrowserPropertyID preSortProperty,
487 DataBrowserPropertyID propertyID) const
488 {
489 return UpdateDataBrowserItems(this->m_controlRef,container,numItems,items,preSortProperty,propertyID);
490 }
491
492 //
493 // item selection
494 //
495 size_t wxMacDataBrowserTableViewControl::GetSelectedItemIDs(wxArrayDataBrowserItemID& itemIDs) const
496 {
497 DataBrowserItemID* itemIDPtr;
498 Handle handle(::NewHandle(0));
499
500 size_t NoOfItems;
501
502
503 wxCHECK_MSG(this->GetItems(kDataBrowserNoItem,true,kDataBrowserItemIsSelected,handle) == noErr,0,_("Could not get selected items."));
504 NoOfItems = static_cast<size_t>(::GetHandleSize(handle)/sizeof(DataBrowserItemID));
505 itemIDs.Empty();
506 itemIDs.Alloc(NoOfItems);
507 HLock(handle);
508 itemIDPtr = (DataBrowserItemID*) (*handle);
509 for (size_t i=0; i<NoOfItems; ++i)
510 {
511 itemIDs.Add(*itemIDPtr);
512 ++itemIDPtr;
513 } /* for */
514 HUnlock(handle);
515 DisposeHandle(handle);
516 return NoOfItems;
517 } /* wxMacDataBrowserTableViewControl::GetSelectedItemIDs(wxArrayDataBrowserItemID&) const*/
518
519 OSStatus wxMacDataBrowserTableViewControl::GetSelectionAnchor(DataBrowserItemID* first, DataBrowserItemID* last) const
520 {
521 return ::GetDataBrowserSelectionAnchor(this->m_controlRef,first,last);
522 } /* wxMacDataBrowserTableViewControl::GetSelectionAnchor(DataBrowserItemID*, DataBrowserItemID*) const */
523
524 OSStatus wxMacDataBrowserTableViewControl::GetSelectionFlags(DataBrowserSelectionFlags* flags) const
525 {
526 return ::GetDataBrowserSelectionFlags(this->m_controlRef,flags);
527 } /* wxMacDataBrowserTableViewControl::GetSelectionFlags(DataBrowserSelectionFlags*) const */
528
529 bool wxMacDataBrowserTableViewControl::IsItemSelected(DataBrowserItemID item) const
530 {
531 return ::IsDataBrowserItemSelected(this->m_controlRef,item);
532 } /* wxMacDataBrowserTableViewControl::IsItemSelected(DataBrowserItemID) const */
533
534 OSStatus wxMacDataBrowserTableViewControl::SetSelectionFlags(DataBrowserSelectionFlags flags)
535 {
536 return ::SetDataBrowserSelectionFlags(this->m_controlRef,flags);
537 } /* wxMacDataBrowserTableViewControl::SetSelectionFlags(DataBrowserSelectionFlags) */
538
539 OSStatus wxMacDataBrowserTableViewControl::SetSelectedItems(UInt32 numItems, DataBrowserItemID const* items, DataBrowserSetOption operation)
540 {
541 return ::SetDataBrowserSelectedItems(this->m_controlRef, numItems, items, operation );
542 } /* wxMacDataBrowserTableViewControl::SetSelectedItems(UInt32, DataBrowserItemID const*, DataBrowserSetOption) */
543
544 OSStatus wxMacDataBrowserTableViewControl::GetSortOrder(DataBrowserSortOrder* order) const
545 {
546 return ::GetDataBrowserSortOrder(this->m_controlRef,order);
547 }
548
549 OSStatus wxMacDataBrowserTableViewControl::GetSortProperty(DataBrowserPropertyID* propertyID) const
550 {
551 return ::GetDataBrowserSortProperty(this->m_controlRef,propertyID);
552 }
553
554 OSStatus wxMacDataBrowserTableViewControl::Resort(DataBrowserItemID container, Boolean sortChildren)
555 {
556 return ::SortDataBrowserContainer(this->m_controlRef,container,sortChildren);
557 } /* wxMacDataBrowserTableViewControl::Resort(DataBrowserItemID, Boolean) */
558
559 OSStatus wxMacDataBrowserTableViewControl::SetSortOrder(DataBrowserSortOrder order)
560 {
561 return ::SetDataBrowserSortOrder(this->m_controlRef,order);
562 }
563
564 OSStatus wxMacDataBrowserTableViewControl::SetSortProperty(DataBrowserPropertyID propertyID)
565 {
566 return ::SetDataBrowserSortProperty(this->m_controlRef,propertyID);
567 }
568
569 //
570 // container handling
571 //
572 OSStatus wxMacDataBrowserTableViewControl::CloseContainer(DataBrowserItemID containerID)
573 {
574 return ::CloseDataBrowserContainer(this->m_controlRef,containerID);
575 } /* wxMacDataBrowserTableViewControl::CloseContainer(DataBrowserItemID) */
576
577 OSStatus wxMacDataBrowserTableViewControl::OpenContainer(DataBrowserItemID containerID)
578 {
579 return ::OpenDataBrowserContainer(this->m_controlRef,containerID);
580 } /* wxMacDataBrowserTableViewControl::OpenContainer(DataBrowserItemID) */
581
582 IMPLEMENT_ABSTRACT_CLASS(wxMacDataBrowserTableViewControl,wxMacControl)
583
584 // ============================================================================
585 // wxMacDataBrowserListViewControl
586 // ============================================================================
587 #pragma mark -
588 //
589 // column handling
590 //
591 OSStatus wxMacDataBrowserListViewControl::AddColumn(DataBrowserListViewColumnDesc *columnDesc, DataBrowserTableViewColumnIndex position)
592 {
593 return AddDataBrowserListViewColumn(this->m_controlRef,columnDesc,position);
594 } /* wxMacDataBrowserListViewControl::AddColumn(DataBrowserListViewColumnDesc*, DataBrowserTableViewColumnIndex) */
595
596 // ============================================================================
597 // wxMacDataViewDataBrowserListViewControl
598 // ============================================================================
599 #pragma mark -
600 //
601 // constructors / destructor
602 //
603 wxMacDataViewDataBrowserListViewControl::wxMacDataViewDataBrowserListViewControl(wxWindow* peer, wxPoint const& pos, wxSize const& size, long style)
604 :wxMacDataBrowserListViewControl(peer,pos,size,style)
605 {
606 } /* wxMacDataViewDataBrowserListViewControl::wxMacDataViewDataBrowserListViewControl(wxWindow* , const wxPoint&, const wxSize&, long) */
607
608 //
609 // callback functions (inherited from wxMacDataBrowserTableViewControl)
610 //
611 Boolean wxMacDataViewDataBrowserListViewControl::DataBrowserCompareProc(DataBrowserItemID itemOneID, DataBrowserItemID itemTwoID, DataBrowserPropertyID sortProperty)
612 {
613 DataBrowserSortOrder sortOrder;
614
615 DataBrowserTableViewColumnIndex modelColumnIndex;
616
617 wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->GetPeer()));
618
619
620 wxCHECK_MSG(dataViewCtrlPtr != NULL, false,_("Pointer to data view control not set correctly."));
621 wxCHECK_MSG(dataViewCtrlPtr->GetModel() != NULL,false,_("Pointer to model not set correctly."));
622 if (sortProperty >= kMinPropertyID)
623 {
624 // variable definition and initialization:
625 wxDataViewColumn* ColumnPtr(dataViewCtrlPtr->GetColumnPtr(sortProperty));
626
627 wxCHECK_MSG(ColumnPtr != NULL,false,_("Could not determine column index."));
628 modelColumnIndex = ColumnPtr->GetModelColumn();
629 } /* if */
630 else
631 modelColumnIndex = 0;
632 this->GetSortOrder(&sortOrder);
633 return static_cast<Boolean>(dataViewCtrlPtr->GetModel()->Compare(wxDataViewItem(reinterpret_cast<void*>(itemOneID)),wxDataViewItem(reinterpret_cast<void*>(itemTwoID)),
634 modelColumnIndex,sortOrder != kDataBrowserOrderDecreasing) < 0);
635 } /* wxMacDataViewDataBrowserListViewControl::DataBrowserCompareProc(DataBrowserItemID, DataBrowserItemID, DataBrowserPropertyID) */
636
637 void wxMacDataViewDataBrowserListViewControl::DataBrowserGetContextualMenuProc(MenuRef* menu, UInt32* helpType, CFStringRef* helpItemString, AEDesc* WXUNUSED(selection))
638 // In this method we do not supply a contextual menu handler at all but only send a wxEVT_COMMAND_DATAVIEW_ITEM_CONTEXT_MENU.
639 {
640 wxArrayDataBrowserItemID itemIDs;
641
642 wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->GetPeer()));
643
644
645 wxCHECK_RET(dataViewCtrlPtr != NULL,_("wxWidget control pointer is not a data view pointer"));
646 // initialize parameters so that no context menu will be displayed automatically by the native data browser:
647 *menu = NULL;
648 *helpType = kCMHelpItemNoHelp;
649 *helpItemString = NULL;
650 // create information for a context menu event:
651 wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_CONTEXT_MENU,dataViewCtrlPtr->GetId());
652
653 dataViewEvent.SetModel(dataViewCtrlPtr->GetModel());
654 // get the item information;
655 // 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:
656 if (this->GetSelectedItemIDs(itemIDs) > 0)
657 dataViewEvent.SetItem(wxDataViewItem(reinterpret_cast<void*>(itemIDs[0])));
658 // finally send the equivalent wxWidget event:
659 dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
660 } /* wxMacDataViewDataBrowserListViewControl::DataBrowserGetContextualMenuProc(MenuRef*, UInt32*, CFStringRef*, AEDesc*) */
661
662 OSStatus wxMacDataViewDataBrowserListViewControl::DataBrowserGetSetItemDataProc(DataBrowserItemID itemID, DataBrowserPropertyID propertyID, DataBrowserItemDataRef itemData, Boolean getValue)
663 {
664 if (getValue)
665 {
666 // variable definitions:
667 wxDataViewCtrl* dataViewCtrlPtr;
668
669 dataViewCtrlPtr = dynamic_cast<wxDataViewCtrl*>(this->GetPeer());
670 wxCHECK_MSG(dataViewCtrlPtr != NULL,errDataBrowserNotConfigured,_("Pointer to data view control not set correctly."));
671 if (dataViewCtrlPtr->IsDeleting())
672 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
673 else
674 {
675 // variable definitions:
676 OSStatus errorStatus;
677 wxDataViewColumn* dataViewColumnPtr;
678
679 wxCHECK_MSG(dataViewCtrlPtr->GetModel() != NULL,errDataBrowserNotConfigured,_("Pointer to model not set correctly."));
680 dataViewColumnPtr = dataViewCtrlPtr->GetColumnPtr(propertyID);
681 wxCHECK_MSG((dataViewColumnPtr != NULL) && (dataViewColumnPtr->GetRenderer() != NULL),errDataBrowserNotConfigured,_("There is no column or renderer for the specified column index."));
682 switch (dataViewColumnPtr->GetRenderer()->GetPropertyType())
683 {
684 case kDataBrowserCheckboxType:
685 {
686 // variable definition:
687 ThemeButtonValue buttonValue;
688
689 errorStatus = ::GetDataBrowserItemDataButtonValue(itemData,&buttonValue);
690 if (errorStatus == noErr)
691 {
692 if (buttonValue == kThemeButtonOn)
693 {
694 // variable definition and initialization:
695 wxVariant modifiedData(true);
696
697 return (dataViewCtrlPtr->GetModel()->SetValue(modifiedData,wxDataViewItem(reinterpret_cast<void*>(itemID)),dataViewColumnPtr->GetModelColumn()) ? OSStatus(noErr) : OSStatus(errDataBrowserNotConfigured));
698 } /* if */
699 else if (buttonValue == kThemeButtonOff)
700 {
701 // variable definition and initialization:
702 wxVariant modifiedData(false);
703
704 return (dataViewCtrlPtr->GetModel()->SetValue(modifiedData,wxDataViewItem(reinterpret_cast<void*>(itemID)),dataViewColumnPtr->GetModelColumn()) ? OSStatus(noErr) : OSStatus(errDataBrowserNotConfigured));
705 } /* if */
706 else
707 return errDataBrowserInvalidPropertyData;
708 } /* if */
709 else
710 return errorStatus;
711 } /* block */
712 case kDataBrowserTextType:
713 {
714 // variable definitions:
715 CFStringRef stringReference;
716
717 errorStatus = ::GetDataBrowserItemDataText(itemData,&stringReference);
718 if (errorStatus == noErr)
719 {
720 // variable definitions and initializations:
721 #if wxCHECK_VERSION(2,9,0)
722 wxCFStringRef modifiedString(stringReference);
723 #else
724 wxMacCFStringHolder modifiedString(stringReference);
725 #endif
726 wxVariant modifiedData(modifiedString.AsString());
727
728 if (dataViewCtrlPtr->GetModel()->SetValue(modifiedData,wxDataViewItem(reinterpret_cast<void*>(itemID)),dataViewColumnPtr->GetModelColumn()))
729 return noErr;
730 else
731 return errDataBrowserNotConfigured;
732 } /* if */
733 else
734 return errorStatus;
735 } /* block */
736 default:
737 return errDataBrowserPropertyNotSupported;
738 } /* switch */
739 } /* if */
740 } /* if */
741 else
742 {
743 if (propertyID >= kMinPropertyID) // in case data columns set the data
744 {
745 // variable definitions:
746 wxVariant variant;
747 wxDataViewColumn* dataViewColumnPtr;
748 wxDataViewCtrl* dataViewCtrlPtr;
749
750 dataViewCtrlPtr = dynamic_cast<wxDataViewCtrl*>(this->GetPeer());
751 wxCHECK_MSG(dataViewCtrlPtr != NULL,errDataBrowserNotConfigured,_("Pointer to data view control not set correctly."));
752 wxCHECK_MSG(dataViewCtrlPtr->GetModel() != NULL,errDataBrowserNotConfigured,_("Pointer to model not set correctly."));
753 dataViewColumnPtr = dataViewCtrlPtr->GetColumnPtr(propertyID);
754 wxCHECK_MSG(dataViewColumnPtr != NULL,errDataBrowserNotConfigured,_("No column for the specified column position existing."));
755 wxCHECK_MSG(dataViewColumnPtr->GetRenderer() != NULL,errDataBrowserNotConfigured,_("No renderer specified for column."));
756 dataViewCtrlPtr->GetModel()->GetValue(variant,wxDataViewItem(reinterpret_cast<void*>(itemID)),dataViewColumnPtr->GetModelColumn());
757 if (!(variant.IsNull()))
758 {
759 dataViewColumnPtr->GetRenderer()->SetDataReference(itemData);
760 dataViewColumnPtr->GetRenderer()->SetValue(variant);
761 wxCHECK_MSG(dataViewColumnPtr->GetRenderer()->Render(),errDataBrowserNotConfigured,_("Rendering failed."));
762 } /* if */
763 return noErr;
764 } /* if */
765 else // react on special system requests
766 {
767 switch (propertyID)
768 {
769 case kDataBrowserContainerIsClosableProperty:
770 {
771 // variable definitions:
772 wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->GetPeer()));
773
774 wxCHECK_MSG(dataViewCtrlPtr != NULL,errDataBrowserNotConfigured,_("Pointer to data view control not set correctly."));
775 // initialize wxWidget event:
776 wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSING,dataViewCtrlPtr->GetId()); // variable definition
777
778 dataViewEvent.SetEventObject(dataViewCtrlPtr);
779 dataViewEvent.SetItem (wxDataViewItem(reinterpret_cast<void*>(itemID)));
780 dataViewEvent.SetModel (dataViewCtrlPtr->GetModel());
781 // finally send the equivalent wxWidget event:
782 dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
783 // opening the container is allowed if not vetoed:
784 return ::SetDataBrowserItemDataBooleanValue(itemData,dataViewEvent.IsAllowed());
785 } /* block */
786 case kDataBrowserContainerIsOpenableProperty:
787 {
788 // variable definitions:
789 wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->GetPeer()));
790
791 wxCHECK_MSG(dataViewCtrlPtr != NULL,errDataBrowserNotConfigured,_("Pointer to data view control not set correctly."));
792 // initialize wxWidget event:
793 wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDING,dataViewCtrlPtr->GetId()); // variable definition
794
795 dataViewEvent.SetEventObject(dataViewCtrlPtr);
796 dataViewEvent.SetItem (wxDataViewItem(reinterpret_cast<void*>(itemID)));
797 dataViewEvent.SetModel (dataViewCtrlPtr->GetModel());
798 // finally send the equivalent wxWidget event:
799 dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
800 // opening the container is allowed if not vetoed:
801 return ::SetDataBrowserItemDataBooleanValue(itemData,dataViewEvent.IsAllowed());
802 } /* block */
803 case kDataBrowserItemIsContainerProperty:
804 {
805 // variable definition:
806 wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->GetPeer()));
807
808 wxCHECK_MSG(dataViewCtrlPtr != NULL,errDataBrowserNotConfigured,_("Pointer to data view control not set correctly."));
809 wxCHECK_MSG(dataViewCtrlPtr->GetModel() != NULL,errDataBrowserNotConfigured,_("Pointer to model not set correctly."));
810 return ::SetDataBrowserItemDataBooleanValue(itemData,dataViewCtrlPtr->GetModel()->IsContainer(wxDataViewItem(reinterpret_cast<void*>(itemID))));
811 } /* block */
812 case kDataBrowserItemIsEditableProperty:
813 return ::SetDataBrowserItemDataBooleanValue(itemData,true);
814 } /* switch */
815 } /* if */
816 } /* if */
817 return errDataBrowserPropertyNotSupported;
818 } /* wxMacDataViewDataBrowserListViewControl::DataBrowserGetSetItemDataProc(DataBrowserItemID, DataBrowserPropertyID, DataBrowserItemDataRef, Boolean) */
819
820 void wxMacDataViewDataBrowserListViewControl::DataBrowserItemNotificationProc(DataBrowserItemID itemID, DataBrowserItemNotification message, DataBrowserItemDataRef itemData)
821 {
822 wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->GetPeer()));
823
824
825 // 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:
826 if (dataViewCtrlPtr != NULL)
827 switch (message)
828 {
829 case kDataBrowserContainerClosed:
830 dataViewCtrlPtr->FinishCustomItemEditing(); // stop editing of a custom item first (if necessary)
831 {
832 // initialize wxWidget event:
833 wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSED,dataViewCtrlPtr->GetId()); // variable definition
834
835 dataViewEvent.SetEventObject(dataViewCtrlPtr);
836 dataViewEvent.SetItem(wxDataViewItem(reinterpret_cast<void*>(itemID)));
837 // finally send the equivalent wxWidget event:
838 dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
839 } /* block */
840 break;
841 case kDataBrowserContainerOpened:
842 dataViewCtrlPtr->FinishCustomItemEditing(); // stop editing of a custom item first (if necessary)
843 {
844 // initialize wxWidget event:
845 wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDED,dataViewCtrlPtr->GetId()); // variable definition
846
847 dataViewEvent.SetEventObject(dataViewCtrlPtr);
848 dataViewEvent.SetItem(wxDataViewItem(reinterpret_cast<void*>(itemID)));
849 // finally send the equivalent wxWidget event:
850 dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
851 // add children to the expanded container:
852 dataViewCtrlPtr->AddChildrenLevel(wxDataViewItem(reinterpret_cast<void*>(itemID)));
853 } /* block */
854 break;
855 case kDataBrowserEditStarted:
856 dataViewCtrlPtr->FinishCustomItemEditing(); // stop editing of a custom item first (if necessary)
857 {
858 // initialize wxWidget event:
859 DataBrowserPropertyID propertyID;
860 wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_STARTED,dataViewCtrlPtr->GetId()); // variable definition
861
862 dataViewEvent.SetEventObject(dataViewCtrlPtr);
863 dataViewEvent.SetItem(wxDataViewItem(reinterpret_cast<void*>(itemID)));
864 if (this->GetPropertyID(itemData,&propertyID) == noErr)
865 {
866 // variable definition and initialization:
867 DataBrowserTableViewColumnIndex columnIndex;
868
869 wxCHECK_RET(this->GetColumnIndex(propertyID,&columnIndex),_("Column index not found."));
870 dataViewEvent.SetColumn(columnIndex);
871 dataViewEvent.SetDataViewColumn(dataViewCtrlPtr->GetColumnPtr(propertyID));
872 } /* if */
873 // finally send the equivalent wxWidget event:
874 dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
875 } /* block */
876 break;
877 case kDataBrowserEditStopped:
878 {
879 // initialize wxWidget event:
880 DataBrowserPropertyID propertyID;
881 wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE,dataViewCtrlPtr->GetId()); // variable definition
882
883 dataViewEvent.SetEventObject(dataViewCtrlPtr);
884 dataViewEvent.SetItem(wxDataViewItem(reinterpret_cast<void*>(itemID)));
885 if (this->GetPropertyID(itemData,&propertyID) == noErr)
886 {
887 // variable definition and initialization:
888 DataBrowserTableViewColumnIndex columnIndex;
889
890 wxCHECK_RET(this->GetColumnIndex(propertyID,&columnIndex),_("Column index not found."));
891 dataViewEvent.SetColumn(columnIndex);
892 dataViewEvent.SetDataViewColumn(dataViewCtrlPtr->GetColumnPtr(propertyID));
893 } /* if */
894 // finally send the equivalent wxWidget event:
895 dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
896 } /* block */
897 break;
898 case kDataBrowserItemAdded:
899 dataViewCtrlPtr->FinishCustomItemEditing();
900 break;
901 case kDataBrowserItemDeselected:
902 dataViewCtrlPtr->FinishCustomItemEditing();
903 break;
904 case kDataBrowserItemDoubleClicked:
905 {
906 // initialize wxWidget event:
907 wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_ACTIVATED,dataViewCtrlPtr->GetId()); // variable definition
908
909 dataViewEvent.SetEventObject(dataViewCtrlPtr);
910 dataViewEvent.SetItem(wxDataViewItem(reinterpret_cast<void*>(itemID)));
911 // finally send the equivalent wxWidget event:
912 dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
913 } /* block */
914 break;
915 case kDataBrowserItemRemoved:
916 dataViewCtrlPtr->FinishCustomItemEditing(); // stop editing of a custom item first (if necessary)
917 break;
918 case kDataBrowserItemSelected:
919 break; // not implemented by wxWidgets; see kDataBrowserSelectionSetChanged
920 case kDataBrowserSelectionSetChanged:
921 {
922 // initialize wxWidget event:
923 wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_SELECTION_CHANGED,dataViewCtrlPtr->GetId()); // variable definition
924
925 dataViewEvent.SetEventObject(dataViewCtrlPtr);
926 dataViewEvent.SetModel (dataViewCtrlPtr->GetModel());
927 // finally send the equivalent wxWidget event:
928 dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
929 } /* block */
930 break;
931 case kDataBrowserTargetChanged: // no idea if this notification is ever sent
932 break;
933 case kDataBrowserUserStateChanged:
934 {
935 // finish custom item editing if necessary:
936 dataViewCtrlPtr->FinishCustomItemEditing();
937 // update column widths:
938 for (size_t i=0; i<dataViewCtrlPtr->GetColumnCount(); ++i)
939 {
940 // constant definition for abbreviational purposes:
941 wxDataViewColumn* const columnPtr = dataViewCtrlPtr->GetColumn(i);
942 // variable definition:
943 UInt16 columnWidth;
944
945 wxCHECK_RET(this->GetColumnWidth(columnPtr->GetPropertyID(),&columnWidth) == noErr,_("Column width could not be determined"));
946 columnPtr->SetWidthVariable(columnWidth);
947 } /* for */
948 // update sorting orders:
949 DataBrowserPropertyID propertyID; // variable definition
950
951 if ((this->GetSortProperty(&propertyID) == noErr) && (propertyID >= kMinPropertyID))
952 {
953 DataBrowserSortOrder sortOrder;
954 DataBrowserTableViewColumnIndex columnIndex;
955
956 if ((this->GetSortOrder(&sortOrder) == noErr) && (this->GetColumnIndex(propertyID,&columnIndex) == noErr))
957 {
958 // variable definition and initialization:
959 wxDataViewColumn* columnPtr;
960 columnPtr = dataViewCtrlPtr->GetColumn(columnIndex);
961 // check if the sort order has changed:
962 if ( columnPtr->IsSortOrderAscending() && (sortOrder == kDataBrowserOrderDecreasing) ||
963 !(columnPtr->IsSortOrderAscending()) && (sortOrder == kDataBrowserOrderIncreasing))
964 {
965 columnPtr->SetSortOrder(!(columnPtr->IsSortOrderAscending()));
966 // initialize wxWidget event:
967 wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_COLUMN_SORTED,dataViewCtrlPtr->GetId()); // variable defintion
968
969 dataViewEvent.SetEventObject(dataViewCtrlPtr);
970 dataViewEvent.SetColumn(columnIndex);
971 dataViewEvent.SetDataViewColumn(columnPtr);
972 // finally send the equivalent wxWidget event:
973 dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
974 } /* if */
975 } /* if */
976 } /* if */
977 } /* block */
978 break;
979 } /* switch */
980 } /* wxMacDataViewDataBrowserListViewControl::DataBrowserItemNotificationProc(DataBrowserItemID, DataBrowserItemNotification, DataBrowserItemDataRef) */
981
982 void wxMacDataViewDataBrowserListViewControl::DataBrowserDrawItemProc(DataBrowserItemID itemID, DataBrowserPropertyID propertyID, DataBrowserItemState state, Rect const* rectangle, SInt16 bitDepth, Boolean colorDevice)
983 {
984 wxDataViewColumn* dataViewColumnPtr;
985
986 wxDataViewCtrl* dataViewCtrlPtr;
987
988 wxDataViewCustomRenderer* dataViewCustomRendererPtr;
989
990 wxVariant dataToRender;
991
992
993 dataViewCtrlPtr = dynamic_cast<wxDataViewCtrl*>(this->GetPeer());
994 wxCHECK_RET(dataViewCtrlPtr != NULL, _("Pointer to data view control not set correctly."));
995 wxCHECK_RET(dataViewCtrlPtr->GetModel() != NULL,_("Pointer to model not set correctly."));
996 dataViewColumnPtr = dataViewCtrlPtr->GetColumnPtr(propertyID);
997 wxCHECK_RET(dataViewColumnPtr != NULL,_("No column for the specified column index existing."));
998 dataViewCustomRendererPtr = dynamic_cast<wxDataViewCustomRenderer*>(dataViewColumnPtr->GetRenderer());
999 wxCHECK_RET(dataViewCustomRendererPtr != NULL,_("No renderer or invalid renderer type specified for custom data column."));
1000 dataViewCtrlPtr->GetModel()->GetValue(dataToRender,wxDataViewItem(reinterpret_cast<void*>(itemID)),dataViewColumnPtr->GetModelColumn());
1001 dataViewCustomRendererPtr->SetValue(dataToRender);
1002
1003 // try to determine the content's size (drawable part):
1004 Rect content;
1005 RgnHandle rgn(NewRgn());
1006 UInt16 headerHeight;
1007
1008 if (this->GetRegion(kControlContentMetaPart,rgn) == noErr)
1009 GetRegionBounds(rgn,&content);
1010 else
1011 this->GetRect(&content);
1012 ::DisposeRgn(rgn);
1013 // space for the header
1014 this->GetHeaderButtonHeight(&headerHeight);
1015 content.top += headerHeight;
1016 // extra space for the frame (todo: do not how to determine the space automatically from the control)
1017 content.top += 5;
1018 content.left += 5;
1019 content.right -= 3;
1020 content.bottom -= 3;
1021 // extra space for the scrollbars:
1022 content.bottom -= wxSystemSettings::GetMetric(wxSYS_HSCROLL_Y);
1023 content.right -= wxSystemSettings::GetMetric(wxSYS_VSCROLL_X);
1024
1025 // make sure that 'Render' can draw only in the allowed area:
1026 dataViewCustomRendererPtr->GetDC()->SetClippingRegion(content.left,content.top,content.right-content.left+1,content.bottom-content.top+1);
1027 (void) (dataViewCustomRendererPtr->Render(wxRect(static_cast<int>(rectangle->left),static_cast<int>(rectangle->top),
1028 static_cast<int>(1+rectangle->right-rectangle->left),static_cast<int>(1+rectangle->bottom-rectangle->top)),
1029 dataViewCustomRendererPtr->GetDC(),((state == kDataBrowserItemIsSelected) ? wxDATAVIEW_CELL_SELECTED : 0)));
1030 dataViewCustomRendererPtr->GetDC()->DestroyClippingRegion(); // probably not necessary
1031 } /* wxMacDataViewDataBrowserListViewControl::DataBrowserDrawItemProc(DataBrowserItemID, DataBrowserPropertyID, DataBrowserItemState, Rect const*, SInt16, Boolean) */
1032
1033 Boolean wxMacDataViewDataBrowserListViewControl::DataBrowserEditItemProc(DataBrowserItemID itemID, DataBrowserPropertyID propertyID, CFStringRef theString, Rect* maxEditTextRect, Boolean* shrinkToFit)
1034 {
1035 return false;
1036 } /* wxMacDataViewDataBrowserListViewControl::DataBrowserEditItemProc(DataBrowserItemID, DataBrowserPropertyID, CFStringRef, Rect*, Boolean*) */
1037
1038 Boolean wxMacDataViewDataBrowserListViewControl::DataBrowserHitTestProc(DataBrowserItemID WXUNUSED(itemID), DataBrowserPropertyID WXUNUSED(property), Rect const* WXUNUSED(theRect), Rect const* WXUNUSED(mouseRect))
1039 {
1040 return true;
1041 } /* wxMacDataViewDataBrowserListViewControl::DataBrowserHitTestProc(DataBrowserItemID, DataBrowserPropertyID, Rect const*, Rect const*) */
1042
1043 DataBrowserTrackingResult wxMacDataViewDataBrowserListViewControl::DataBrowserTrackingProc(DataBrowserItemID itemID, DataBrowserPropertyID propertyID, Rect const* theRect, Point WXUNUSED(startPt), EventModifiers WXUNUSED(modifiers))
1044 {
1045 wxDataViewColumn* dataViewColumnPtr;
1046
1047 wxDataViewCtrl* dataViewCtrlPtr;
1048
1049 wxDataViewCustomRenderer* dataViewCustomRendererPtr;
1050
1051 wxDataViewItem dataViewCustomRendererItem;
1052
1053
1054 dataViewCustomRendererItem = reinterpret_cast<void*>(itemID);
1055 wxCHECK_MSG(dataViewCustomRendererItem.IsOk(),kDataBrowserNothingHit,_("Invalid data view item"));
1056 dataViewCtrlPtr = dynamic_cast<wxDataViewCtrl*>(this->GetPeer());
1057 wxCHECK_MSG(dataViewCtrlPtr != NULL,kDataBrowserNothingHit,_("Pointer to data view control not set correctly."));
1058 dataViewColumnPtr = dataViewCtrlPtr->GetColumnPtr(propertyID);
1059 wxCHECK_MSG(dataViewColumnPtr != NULL,kDataBrowserNothingHit,_("No column existing."));
1060 dataViewCustomRendererPtr = dynamic_cast<wxDataViewCustomRenderer*>(dataViewColumnPtr->GetRenderer());
1061 wxCHECK_MSG(dataViewCustomRendererPtr != NULL,kDataBrowserNothingHit,_("No renderer or invalid renderer type specified for custom data column."));
1062 // 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):
1063 if (dataViewCtrlPtr->GetCustomRendererItem() == dataViewCustomRendererItem)
1064 return kDataBrowserContentHit;
1065 // an(other) item is going to be edited and therefore the current editing - if existing - has to be finished:
1066 if (dataViewCtrlPtr->GetCustomRendererPtr() != NULL)
1067 {
1068 dataViewCtrlPtr->GetCustomRendererPtr()->FinishEditing();
1069 dataViewCtrlPtr->SetCustomRendererItem(wxDataViewItem());
1070 dataViewCtrlPtr->SetCustomRendererPtr (NULL);
1071 } /* if */
1072 // check if renderer has got a valid editor control for editing; if this is the case start editing of the new item:
1073 if (dataViewCustomRendererPtr->HasEditorCtrl())
1074 {
1075 // variable definition:
1076 wxRect wxRectangle;
1077
1078 ::wxMacNativeToRect(theRect,&wxRectangle);
1079 dataViewCustomRendererPtr->StartEditing(dataViewCustomRendererItem,wxRectangle);
1080 dataViewCtrlPtr->SetCustomRendererItem(dataViewCustomRendererItem);
1081 dataViewCtrlPtr->SetCustomRendererPtr (dataViewCustomRendererPtr);
1082 } /* if */
1083 return kDataBrowserContentHit;
1084 } /* wxMacDataViewDataBrowserListViewControl::DataBrowserTrackingProc(DataBrowserItemID, DataBrowserPropertyID, Rect const*, Point, EventModifiers) */
1085
1086 #endif // wxUSE_GENERICDATAVIEWCTRL