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