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