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