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