1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/osx/carbon/utils.cpp
3 // Purpose: Various utilities
4 // Author: Stefan Csomor
5 // Modified by:
6 // Created: 1998-01-01
7 // Copyright: (c) Stefan Csomor
8 // Licence: wxWindows licence
9 /////////////////////////////////////////////////////////////////////////////
10
11
12 #include "wx/wxprec.h"
13
14 #include "wx/utils.h"
15
16 #ifndef WX_PRECOMP
17 #include "wx/intl.h"
18 #include "wx/app.h"
19 #if wxUSE_GUI
20 #include "wx/toplevel.h"
21 #include "wx/font.h"
22 #endif
23 #endif
24
25 #include "wx/apptrait.h"
26
27 #include <ctype.h>
28
29 #include <stdio.h>
30 #include <stdlib.h>
31 #include <string.h>
32 #include <stdarg.h>
33
34 // #include "MoreFilesX.h"
35
36 #include <AudioToolbox/AudioServices.h>
37
38 #include "wx/osx/private.h"
39 #if wxUSE_GUI
40 #include "wx/osx/private/timer.h"
41 #endif // wxUSE_GUI
42
43 #include "wx/evtloop.h"
44
45 #if wxUSE_GUI
46
47 // Emit a beeeeeep
wxBell()48 void wxBell()
49 {
50 if ( AudioServicesPlayAlertSound != NULL )
51 AudioServicesPlayAlertSound(kUserPreferredAlert);
52 }
53
CreateTimerImpl(wxTimer * timer)54 wxTimerImpl* wxGUIAppTraits::CreateTimerImpl(wxTimer *timer)
55 {
56 return new wxOSXTimerImpl(timer);
57 }
58
59 int gs_wxBusyCursorCount = 0;
60 extern wxCursor gMacCurrentCursor;
61 wxCursor gMacStoredActiveCursor;
62
63 // Set the cursor to the busy cursor for all windows
wxBeginBusyCursor(const wxCursor * cursor)64 void wxBeginBusyCursor(const wxCursor *cursor)
65 {
66 if (gs_wxBusyCursorCount++ == 0)
67 {
68 gMacStoredActiveCursor = gMacCurrentCursor;
69 cursor->MacInstall();
70
71 wxSetCursor(*cursor);
72 }
73 //else: nothing to do, already set
74 }
75
76 // Restore cursor to normal
wxEndBusyCursor()77 void wxEndBusyCursor()
78 {
79 wxCHECK_RET( gs_wxBusyCursorCount > 0,
80 wxT("no matching wxBeginBusyCursor() for wxEndBusyCursor()") );
81
82 if (--gs_wxBusyCursorCount == 0)
83 {
84 gMacStoredActiveCursor.MacInstall();
85 gMacStoredActiveCursor = wxNullCursor;
86
87 wxSetCursor(wxNullCursor);
88 }
89 }
90
91 // true if we're between the above two calls
wxIsBusy()92 bool wxIsBusy()
93 {
94 return (gs_wxBusyCursorCount > 0);
95 }
96
97 #endif // wxUSE_GUI
98
99 #if wxUSE_BASE
100
wxMacFindFolderNoSeparator(short vol,OSType folderType,Boolean createFolder)101 wxString wxMacFindFolderNoSeparator( short vol,
102 OSType folderType,
103 Boolean createFolder)
104 {
105 FSRef fsRef;
106 wxString strDir;
107
108 if ( FSFindFolder( vol, folderType, createFolder, &fsRef) == noErr)
109 {
110 strDir = wxMacFSRefToPath( &fsRef );
111 }
112
113 return strDir;
114 }
115
wxMacFindFolder(short vol,OSType folderType,Boolean createFolder)116 wxString wxMacFindFolder( short vol,
117 OSType folderType,
118 Boolean createFolder)
119 {
120 return wxMacFindFolderNoSeparator(vol, folderType, createFolder) + wxFILE_SEP_PATH;
121 }
122
123 #endif // wxUSE_BASE
124
125
126 // ============================================================================
127 // GUI-only functions from now on
128 // ============================================================================
129
130 #if wxUSE_GUI
131
132 // ----------------------------------------------------------------------------
133 // Miscellaneous functions
134 // ----------------------------------------------------------------------------
135
wxGetMousePosition(int * x,int * y)136 void wxGetMousePosition( int* x, int* y )
137 {
138 Point pt;
139 GetGlobalMouse(&pt);
140 if ( x )
141 *x = pt.h;
142 if ( y )
143 *y = pt.v;
144 };
145
wxClientDisplayRect(int * x,int * y,int * width,int * height)146 void wxClientDisplayRect(int *x, int *y, int *width, int *height)
147 {
148 HIRect bounds ;
149 HIWindowGetAvailablePositioningBounds(kCGNullDirectDisplay,kHICoordSpace72DPIGlobal,
150 &bounds);
151 if ( x )
152 *x = bounds.origin.x;
153 if ( y )
154 *y = bounds.origin.y;
155 if ( width )
156 *width = bounds.size.width;
157 if ( height )
158 *height = bounds.size.height;
159 }
160
161 #endif // wxUSE_GUI
162
163 #if wxUSE_GUI
164
165 // ----------------------------------------------------------------------------
166 // Native Struct Conversions
167 // ----------------------------------------------------------------------------
168
wxMacRectToNative(const wxRect * wx,Rect * n)169 void wxMacRectToNative( const wxRect *wx , Rect *n )
170 {
171 n->left = wx->x;
172 n->top = wx->y;
173 n->right = wx->x + wx->width;
174 n->bottom = wx->y + wx->height;
175 }
176
wxMacNativeToRect(const Rect * n,wxRect * wx)177 void wxMacNativeToRect( const Rect *n , wxRect* wx )
178 {
179 wx->x = n->left;
180 wx->y = n->top;
181 wx->width = n->right - n->left;
182 wx->height = n->bottom - n->top;
183 }
184
wxMacPointToNative(const wxPoint * wx,Point * n)185 void wxMacPointToNative( const wxPoint* wx , Point *n )
186 {
187 n->h = wx->x;
188 n->v = wx->y;
189 }
190
wxMacNativeToPoint(const Point * n,wxPoint * wx)191 void wxMacNativeToPoint( const Point *n , wxPoint* wx )
192 {
193 wx->x = n->h;
194 wx->y = n->v;
195 }
196
197 // ----------------------------------------------------------------------------
198 // Carbon Event Support
199 // ----------------------------------------------------------------------------
200
GetParameter(EventParamName inName,EventParamType inDesiredType,UInt32 inBufferSize,void * outData)201 OSStatus wxMacCarbonEvent::GetParameter(EventParamName inName, EventParamType inDesiredType, UInt32 inBufferSize, void * outData)
202 {
203 return ::GetEventParameter( m_eventRef , inName , inDesiredType , NULL , inBufferSize , NULL , outData );
204 }
205
SetParameter(EventParamName inName,EventParamType inType,UInt32 inBufferSize,const void * inData)206 OSStatus wxMacCarbonEvent::SetParameter(EventParamName inName, EventParamType inType, UInt32 inBufferSize, const void * inData)
207 {
208 return ::SetEventParameter( m_eventRef , inName , inType , inBufferSize , inData );
209 }
210
211 // ----------------------------------------------------------------------------
212 // Control Access Support
213 // ----------------------------------------------------------------------------
214
215
216 // ============================================================================
217 // DataBrowser Wrapper
218 // ============================================================================
219 //
220 // basing on DataBrowserItemIDs
221 //
222
IMPLEMENT_ABSTRACT_CLASS(wxMacDataBrowserControl,wxMacControl)223 IMPLEMENT_ABSTRACT_CLASS( wxMacDataBrowserControl , wxMacControl )
224
225 pascal void wxMacDataBrowserControl::DataBrowserItemNotificationProc(
226 ControlRef browser,
227 DataBrowserItemID itemID,
228 DataBrowserItemNotification message,
229 DataBrowserItemDataRef itemData )
230 {
231 wxMacDataBrowserControl* ctl = wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser ), wxMacDataBrowserControl);
232 if ( ctl != 0 )
233 {
234 ctl->ItemNotification(itemID, message, itemData);
235 }
236 }
237
DataBrowserGetSetItemDataProc(ControlRef browser,DataBrowserItemID itemID,DataBrowserPropertyID property,DataBrowserItemDataRef itemData,Boolean changeValue)238 pascal OSStatus wxMacDataBrowserControl::DataBrowserGetSetItemDataProc(
239 ControlRef browser,
240 DataBrowserItemID itemID,
241 DataBrowserPropertyID property,
242 DataBrowserItemDataRef itemData,
243 Boolean changeValue )
244 {
245 OSStatus err = errDataBrowserPropertyNotSupported;
246 wxMacDataBrowserControl* ctl = wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser ), wxMacDataBrowserControl);
247 if ( ctl != 0 )
248 {
249 err = ctl->GetSetItemData(itemID, property, itemData, changeValue);
250 }
251 return err;
252 }
253
DataBrowserCompareProc(ControlRef browser,DataBrowserItemID itemOneID,DataBrowserItemID itemTwoID,DataBrowserPropertyID sortProperty)254 pascal Boolean wxMacDataBrowserControl::DataBrowserCompareProc(
255 ControlRef browser,
256 DataBrowserItemID itemOneID,
257 DataBrowserItemID itemTwoID,
258 DataBrowserPropertyID sortProperty)
259 {
260 wxMacDataBrowserControl* ctl = wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser ), wxMacDataBrowserControl);
261 if ( ctl != 0 )
262 {
263 return ctl->CompareItems(itemOneID, itemTwoID, sortProperty);
264 }
265 return false;
266 }
267
268 DataBrowserItemDataUPP gDataBrowserItemDataUPP = NULL;
269 DataBrowserItemNotificationUPP gDataBrowserItemNotificationUPP = NULL;
270 DataBrowserItemCompareUPP gDataBrowserItemCompareUPP = NULL;
271
wxMacDataBrowserControl(wxWindow * peer,const wxPoint & pos,const wxSize & size,long WXUNUSED (style))272 wxMacDataBrowserControl::wxMacDataBrowserControl( wxWindow* peer,
273 const wxPoint& pos,
274 const wxSize& size,
275 long WXUNUSED(style))
276 : wxMacControl( peer )
277 {
278 Rect bounds = wxMacGetBoundsForControl( peer, pos, size );
279 OSStatus err = ::CreateDataBrowserControl(
280 MAC_WXHWND(peer->MacGetTopLevelWindowRef()),
281 &bounds, kDataBrowserListView, &m_controlRef );
282 SetReferenceInNativeControl();
283 verify_noerr( err );
284 if ( gDataBrowserItemCompareUPP == NULL )
285 gDataBrowserItemCompareUPP = NewDataBrowserItemCompareUPP(DataBrowserCompareProc);
286 if ( gDataBrowserItemDataUPP == NULL )
287 gDataBrowserItemDataUPP = NewDataBrowserItemDataUPP(DataBrowserGetSetItemDataProc);
288 if ( gDataBrowserItemNotificationUPP == NULL )
289 {
290 gDataBrowserItemNotificationUPP =
291 (DataBrowserItemNotificationUPP) NewDataBrowserItemNotificationWithItemUPP(DataBrowserItemNotificationProc);
292 }
293
294 DataBrowserCallbacks callbacks;
295 InitializeDataBrowserCallbacks( &callbacks, kDataBrowserLatestCallbacks );
296
297 callbacks.u.v1.itemDataCallback = gDataBrowserItemDataUPP;
298 callbacks.u.v1.itemCompareCallback = gDataBrowserItemCompareUPP;
299 callbacks.u.v1.itemNotificationCallback = gDataBrowserItemNotificationUPP;
300 SetCallbacks( &callbacks );
301
302 }
303
GetItemCount(DataBrowserItemID container,Boolean recurse,DataBrowserItemState state,ItemCount * numItems) const304 OSStatus wxMacDataBrowserControl::GetItemCount( DataBrowserItemID container,
305 Boolean recurse,
306 DataBrowserItemState state,
307 ItemCount *numItems) const
308 {
309 return GetDataBrowserItemCount( m_controlRef, container, recurse, state, numItems );
310 }
311
GetItems(DataBrowserItemID container,Boolean recurse,DataBrowserItemState state,Handle items) const312 OSStatus wxMacDataBrowserControl::GetItems( DataBrowserItemID container,
313 Boolean recurse,
314 DataBrowserItemState state,
315 Handle items) const
316 {
317 return GetDataBrowserItems( m_controlRef, container, recurse, state, items );
318 }
319
SetSelectionFlags(DataBrowserSelectionFlags options)320 OSStatus wxMacDataBrowserControl::SetSelectionFlags( DataBrowserSelectionFlags options )
321 {
322 return SetDataBrowserSelectionFlags( m_controlRef, options );
323 }
324
AddColumn(DataBrowserListViewColumnDesc * columnDesc,DataBrowserTableViewColumnIndex position)325 OSStatus wxMacDataBrowserControl::AddColumn( DataBrowserListViewColumnDesc *columnDesc,
326 DataBrowserTableViewColumnIndex position )
327 {
328 return AddDataBrowserListViewColumn( m_controlRef, columnDesc, position );
329 }
330
GetColumnIDFromIndex(DataBrowserTableViewColumnIndex position,DataBrowserTableViewColumnID * id)331 OSStatus wxMacDataBrowserControl::GetColumnIDFromIndex( DataBrowserTableViewColumnIndex position, DataBrowserTableViewColumnID* id )
332 {
333 return GetDataBrowserTableViewColumnProperty( m_controlRef, position, id );
334 }
335
RemoveColumn(DataBrowserTableViewColumnIndex position)336 OSStatus wxMacDataBrowserControl::RemoveColumn( DataBrowserTableViewColumnIndex position )
337 {
338 DataBrowserTableViewColumnID id;
339 GetColumnIDFromIndex( position, &id );
340 return RemoveDataBrowserTableViewColumn( m_controlRef, id );
341 }
342
AutoSizeColumns()343 OSStatus wxMacDataBrowserControl::AutoSizeColumns()
344 {
345 return AutoSizeDataBrowserListViewColumns(m_controlRef);
346 }
347
SetHasScrollBars(bool horiz,bool vert)348 OSStatus wxMacDataBrowserControl::SetHasScrollBars( bool horiz, bool vert )
349 {
350 return SetDataBrowserHasScrollBars( m_controlRef, horiz, vert );
351 }
352
SetHiliteStyle(DataBrowserTableViewHiliteStyle hiliteStyle)353 OSStatus wxMacDataBrowserControl::SetHiliteStyle( DataBrowserTableViewHiliteStyle hiliteStyle )
354 {
355 return SetDataBrowserTableViewHiliteStyle( m_controlRef, hiliteStyle );
356 }
357
SetHeaderButtonHeight(UInt16 height)358 OSStatus wxMacDataBrowserControl::SetHeaderButtonHeight(UInt16 height)
359 {
360 return SetDataBrowserListViewHeaderBtnHeight( m_controlRef, height );
361 }
362
GetHeaderButtonHeight(UInt16 * height)363 OSStatus wxMacDataBrowserControl::GetHeaderButtonHeight(UInt16 *height)
364 {
365 return GetDataBrowserListViewHeaderBtnHeight( m_controlRef, height );
366 }
367
SetCallbacks(const DataBrowserCallbacks * callbacks)368 OSStatus wxMacDataBrowserControl::SetCallbacks(const DataBrowserCallbacks *callbacks)
369 {
370 return SetDataBrowserCallbacks( m_controlRef, callbacks );
371 }
372
UpdateItems(DataBrowserItemID container,UInt32 numItems,const DataBrowserItemID * items,DataBrowserPropertyID preSortProperty,DataBrowserPropertyID propertyID) const373 OSStatus wxMacDataBrowserControl::UpdateItems(
374 DataBrowserItemID container,
375 UInt32 numItems,
376 const DataBrowserItemID *items,
377 DataBrowserPropertyID preSortProperty,
378 DataBrowserPropertyID propertyID ) const
379 {
380 return UpdateDataBrowserItems( m_controlRef, container, numItems, items, preSortProperty, propertyID );
381 }
382
IsItemSelected(DataBrowserItemID item) const383 bool wxMacDataBrowserControl::IsItemSelected( DataBrowserItemID item ) const
384 {
385 return IsDataBrowserItemSelected( m_controlRef, item );
386 }
387
AddItems(DataBrowserItemID container,UInt32 numItems,const DataBrowserItemID * items,DataBrowserPropertyID preSortProperty)388 OSStatus wxMacDataBrowserControl::AddItems(
389 DataBrowserItemID container,
390 UInt32 numItems,
391 const DataBrowserItemID *items,
392 DataBrowserPropertyID preSortProperty )
393 {
394 return AddDataBrowserItems( m_controlRef, container, numItems, items, preSortProperty );
395 }
396
RemoveItems(DataBrowserItemID container,UInt32 numItems,const DataBrowserItemID * items,DataBrowserPropertyID preSortProperty)397 OSStatus wxMacDataBrowserControl::RemoveItems(
398 DataBrowserItemID container,
399 UInt32 numItems,
400 const DataBrowserItemID *items,
401 DataBrowserPropertyID preSortProperty )
402 {
403 return RemoveDataBrowserItems( m_controlRef, container, numItems, items, preSortProperty );
404 }
405
RevealItem(DataBrowserItemID item,DataBrowserPropertyID propertyID,DataBrowserRevealOptions options) const406 OSStatus wxMacDataBrowserControl::RevealItem(
407 DataBrowserItemID item,
408 DataBrowserPropertyID propertyID,
409 DataBrowserRevealOptions options ) const
410 {
411 return RevealDataBrowserItem( m_controlRef, item, propertyID, options );
412 }
413
SetSelectedItems(UInt32 numItems,const DataBrowserItemID * items,DataBrowserSetOption operation)414 OSStatus wxMacDataBrowserControl::SetSelectedItems(
415 UInt32 numItems,
416 const DataBrowserItemID *items,
417 DataBrowserSetOption operation )
418 {
419 return SetDataBrowserSelectedItems( m_controlRef, numItems, items, operation );
420 }
421
GetSelectionAnchor(DataBrowserItemID * first,DataBrowserItemID * last) const422 OSStatus wxMacDataBrowserControl::GetSelectionAnchor( DataBrowserItemID *first, DataBrowserItemID *last ) const
423 {
424 return GetDataBrowserSelectionAnchor( m_controlRef, first, last );
425 }
426
GetItemID(DataBrowserTableViewRowIndex row,DataBrowserItemID * item) const427 OSStatus wxMacDataBrowserControl::GetItemID( DataBrowserTableViewRowIndex row, DataBrowserItemID * item ) const
428 {
429 return GetDataBrowserTableViewItemID( m_controlRef, row, item );
430 }
431
GetItemRow(DataBrowserItemID item,DataBrowserTableViewRowIndex * row) const432 OSStatus wxMacDataBrowserControl::GetItemRow( DataBrowserItemID item, DataBrowserTableViewRowIndex * row ) const
433 {
434 return GetDataBrowserTableViewItemRow( m_controlRef, item, row );
435 }
436
SetDefaultRowHeight(UInt16 height)437 OSStatus wxMacDataBrowserControl::SetDefaultRowHeight( UInt16 height )
438 {
439 return SetDataBrowserTableViewRowHeight( m_controlRef , height );
440 }
441
GetDefaultRowHeight(UInt16 * height) const442 OSStatus wxMacDataBrowserControl::GetDefaultRowHeight( UInt16 * height ) const
443 {
444 return GetDataBrowserTableViewRowHeight( m_controlRef, height );
445 }
446
SetRowHeight(DataBrowserItemID item,UInt16 height)447 OSStatus wxMacDataBrowserControl::SetRowHeight( DataBrowserItemID item , UInt16 height)
448 {
449 return SetDataBrowserTableViewItemRowHeight( m_controlRef, item , height );
450 }
451
GetRowHeight(DataBrowserItemID item,UInt16 * height) const452 OSStatus wxMacDataBrowserControl::GetRowHeight( DataBrowserItemID item , UInt16 *height) const
453 {
454 return GetDataBrowserTableViewItemRowHeight( m_controlRef, item , height);
455 }
456
GetColumnWidth(DataBrowserPropertyID column,UInt16 * width) const457 OSStatus wxMacDataBrowserControl::GetColumnWidth( DataBrowserPropertyID column , UInt16 *width ) const
458 {
459 return GetDataBrowserTableViewNamedColumnWidth( m_controlRef , column , width );
460 }
461
SetColumnWidth(DataBrowserPropertyID column,UInt16 width)462 OSStatus wxMacDataBrowserControl::SetColumnWidth( DataBrowserPropertyID column , UInt16 width )
463 {
464 return SetDataBrowserTableViewNamedColumnWidth( m_controlRef , column , width );
465 }
466
GetDefaultColumnWidth(UInt16 * width) const467 OSStatus wxMacDataBrowserControl::GetDefaultColumnWidth( UInt16 *width ) const
468 {
469 return GetDataBrowserTableViewColumnWidth( m_controlRef , width );
470 }
471
SetDefaultColumnWidth(UInt16 width)472 OSStatus wxMacDataBrowserControl::SetDefaultColumnWidth( UInt16 width )
473 {
474 return SetDataBrowserTableViewColumnWidth( m_controlRef , width );
475 }
476
GetColumnCount(UInt32 * numColumns) const477 OSStatus wxMacDataBrowserControl::GetColumnCount(UInt32* numColumns) const
478 {
479 return GetDataBrowserTableViewColumnCount( m_controlRef, numColumns);
480 }
481
GetColumnPosition(DataBrowserPropertyID column,DataBrowserTableViewColumnIndex * position) const482 OSStatus wxMacDataBrowserControl::GetColumnPosition( DataBrowserPropertyID column,
483 DataBrowserTableViewColumnIndex *position) const
484 {
485 return GetDataBrowserTableViewColumnPosition( m_controlRef , column , position);
486 }
487
SetColumnPosition(DataBrowserPropertyID column,DataBrowserTableViewColumnIndex position)488 OSStatus wxMacDataBrowserControl::SetColumnPosition( DataBrowserPropertyID column, DataBrowserTableViewColumnIndex position)
489 {
490 return SetDataBrowserTableViewColumnPosition( m_controlRef , column , position);
491 }
492
GetScrollPosition(UInt32 * top,UInt32 * left) const493 OSStatus wxMacDataBrowserControl::GetScrollPosition( UInt32 *top , UInt32 *left ) const
494 {
495 return GetDataBrowserScrollPosition( m_controlRef , top , left );
496 }
497
SetScrollPosition(UInt32 top,UInt32 left)498 OSStatus wxMacDataBrowserControl::SetScrollPosition( UInt32 top , UInt32 left )
499 {
500 return SetDataBrowserScrollPosition( m_controlRef , top , left );
501 }
502
GetSortProperty(DataBrowserPropertyID * column) const503 OSStatus wxMacDataBrowserControl::GetSortProperty( DataBrowserPropertyID *column ) const
504 {
505 return GetDataBrowserSortProperty( m_controlRef , column );
506 }
507
SetSortProperty(DataBrowserPropertyID column)508 OSStatus wxMacDataBrowserControl::SetSortProperty( DataBrowserPropertyID column )
509 {
510 return SetDataBrowserSortProperty( m_controlRef , column );
511 }
512
GetSortOrder(DataBrowserSortOrder * order) const513 OSStatus wxMacDataBrowserControl::GetSortOrder( DataBrowserSortOrder *order ) const
514 {
515 return GetDataBrowserSortOrder( m_controlRef , order );
516 }
517
SetSortOrder(DataBrowserSortOrder order)518 OSStatus wxMacDataBrowserControl::SetSortOrder( DataBrowserSortOrder order )
519 {
520 return SetDataBrowserSortOrder( m_controlRef , order );
521 }
522
GetPropertyFlags(DataBrowserPropertyID property,DataBrowserPropertyFlags * flags) const523 OSStatus wxMacDataBrowserControl::GetPropertyFlags( DataBrowserPropertyID property,
524 DataBrowserPropertyFlags *flags ) const
525 {
526 return GetDataBrowserPropertyFlags( m_controlRef , property , flags );
527 }
528
SetPropertyFlags(DataBrowserPropertyID property,DataBrowserPropertyFlags flags)529 OSStatus wxMacDataBrowserControl::SetPropertyFlags( DataBrowserPropertyID property,
530 DataBrowserPropertyFlags flags )
531 {
532 return SetDataBrowserPropertyFlags( m_controlRef , property , flags );
533 }
534
GetHeaderDesc(DataBrowserPropertyID property,DataBrowserListViewHeaderDesc * desc) const535 OSStatus wxMacDataBrowserControl::GetHeaderDesc( DataBrowserPropertyID property,
536 DataBrowserListViewHeaderDesc *desc ) const
537 {
538 return GetDataBrowserListViewHeaderDesc( m_controlRef , property , desc );
539 }
540
SetHeaderDesc(DataBrowserPropertyID property,DataBrowserListViewHeaderDesc * desc)541 OSStatus wxMacDataBrowserControl::SetHeaderDesc( DataBrowserPropertyID property,
542 DataBrowserListViewHeaderDesc *desc )
543 {
544 return SetDataBrowserListViewHeaderDesc( m_controlRef , property , desc );
545 }
546
SetDisclosureColumn(DataBrowserPropertyID property,Boolean expandableRows)547 OSStatus wxMacDataBrowserControl::SetDisclosureColumn( DataBrowserPropertyID property ,
548 Boolean expandableRows )
549 {
550 return SetDataBrowserListViewDisclosureColumn( m_controlRef, property, expandableRows);
551 }
552
GetItemPartBounds(DataBrowserItemID item,DataBrowserPropertyID property,DataBrowserPropertyPart part,Rect * bounds)553 OSStatus wxMacDataBrowserControl::GetItemPartBounds( DataBrowserItemID item, DataBrowserPropertyID property, DataBrowserPropertyPart part, Rect * bounds )
554 {
555 return GetDataBrowserItemPartBounds( m_controlRef, item, property, part, bounds);
556 }
557
558 // ============================================================================
559 // Higher-level Databrowser
560 // ============================================================================
561 //
562 // basing on data item objects
563 //
564
wxMacDataItem()565 wxMacDataItem::wxMacDataItem()
566 {
567 // m_data = NULL;
568
569 m_order = 0;
570 // m_colId = kTextColumnId; // for compat with existing wx*ListBox impls.
571 }
572
~wxMacDataItem()573 wxMacDataItem::~wxMacDataItem()
574 {
575 }
576
SetOrder(SInt32 order)577 void wxMacDataItem::SetOrder( SInt32 order )
578 {
579 m_order = order;
580 }
581
GetOrder() const582 SInt32 wxMacDataItem::GetOrder() const
583 {
584 return m_order;
585 }
586 /*
587 void wxMacDataItem::SetData( void* data)
588 {
589 m_data = data;
590 }
591
592 void* wxMacDataItem::GetData() const
593 {
594 return m_data;
595 }
596
597 short wxMacDataItem::GetColumn()
598 {
599 return m_colId;
600 }
601
602 void wxMacDataItem::SetColumn( short col )
603 {
604 m_colId = col;
605 }
606
607 void wxMacDataItem::SetLabel( const wxString& str)
608 {
609 m_label = str;
610 m_cfLabel = wxCFStringRef( str , wxLocale::GetSystemEncoding());
611 }
612
613 const wxString& wxMacDataItem::GetLabel() const
614 {
615 return m_label;
616 }
617 */
618
IsLessThan(wxMacDataItemBrowserControl * WXUNUSED (owner),const wxMacDataItem * rhs,DataBrowserPropertyID sortProperty) const619 bool wxMacDataItem::IsLessThan(wxMacDataItemBrowserControl *WXUNUSED(owner) ,
620 const wxMacDataItem* rhs,
621 DataBrowserPropertyID sortProperty) const
622 {
623 bool retval = false;
624
625 if ( sortProperty == kNumericOrderColumnId )
626 retval = m_order < rhs->m_order;
627
628 return retval;
629 }
630
GetSetData(wxMacDataItemBrowserControl * WXUNUSED (owner),DataBrowserPropertyID property,DataBrowserItemDataRef itemData,bool changeValue)631 OSStatus wxMacDataItem::GetSetData( wxMacDataItemBrowserControl *WXUNUSED(owner) ,
632 DataBrowserPropertyID property,
633 DataBrowserItemDataRef itemData,
634 bool changeValue )
635 {
636 OSStatus err = errDataBrowserPropertyNotSupported;
637 if ( !changeValue )
638 {
639 if ( property == kNumericOrderColumnId )
640 {
641 err = ::SetDataBrowserItemDataValue( itemData, m_order );
642 err = noErr;
643 }
644 }
645
646 return err;
647 }
648
Notification(wxMacDataItemBrowserControl * WXUNUSED (owner),DataBrowserItemNotification WXUNUSED (message),DataBrowserItemDataRef WXUNUSED (itemData)) const649 void wxMacDataItem::Notification(wxMacDataItemBrowserControl *WXUNUSED(owner) ,
650 DataBrowserItemNotification WXUNUSED(message),
651 DataBrowserItemDataRef WXUNUSED(itemData) ) const
652 {
653 }
654
IMPLEMENT_DYNAMIC_CLASS(wxMacDataItemBrowserControl,wxMacDataBrowserControl)655 IMPLEMENT_DYNAMIC_CLASS( wxMacDataItemBrowserControl , wxMacDataBrowserControl )
656
657 wxMacDataItemBrowserControl::wxMacDataItemBrowserControl( wxWindow* peer , const wxPoint& pos, const wxSize& size, long style) :
658 wxMacDataBrowserControl( peer, pos, size, style )
659 {
660 m_suppressSelection = false;
661 m_sortOrder = SortOrder_None;
662 m_clientDataItemsType = wxClientData_None;
663 }
664
wxMacDataItemBrowserSelectionSuppressor(wxMacDataItemBrowserControl * browser)665 wxMacDataItemBrowserSelectionSuppressor::wxMacDataItemBrowserSelectionSuppressor(wxMacDataItemBrowserControl *browser)
666 {
667 m_former = browser->SuppressSelection(true);
668 m_browser = browser;
669 }
670
~wxMacDataItemBrowserSelectionSuppressor()671 wxMacDataItemBrowserSelectionSuppressor::~wxMacDataItemBrowserSelectionSuppressor()
672 {
673 m_browser->SuppressSelection(m_former);
674 }
675
SuppressSelection(bool suppress)676 bool wxMacDataItemBrowserControl::SuppressSelection( bool suppress )
677 {
678 bool former = m_suppressSelection;
679 m_suppressSelection = suppress;
680
681 return former;
682 }
683
CompareItems(DataBrowserItemID itemOneID,DataBrowserItemID itemTwoID,DataBrowserPropertyID sortProperty)684 Boolean wxMacDataItemBrowserControl::CompareItems(DataBrowserItemID itemOneID,
685 DataBrowserItemID itemTwoID,
686 DataBrowserPropertyID sortProperty)
687 {
688 wxMacDataItem* itemOne = (wxMacDataItem*) itemOneID;
689 wxMacDataItem* itemTwo = (wxMacDataItem*) itemTwoID;
690
691 Boolean retval = false;
692 if ( itemOne != NULL )
693 retval = itemOne->IsLessThan( this , itemTwo , sortProperty);
694 return retval;
695 }
696
GetSetItemData(DataBrowserItemID itemID,DataBrowserPropertyID property,DataBrowserItemDataRef itemData,Boolean changeValue)697 OSStatus wxMacDataItemBrowserControl::GetSetItemData(
698 DataBrowserItemID itemID,
699 DataBrowserPropertyID property,
700 DataBrowserItemDataRef itemData,
701 Boolean changeValue )
702 {
703 wxMacDataItem* item = (wxMacDataItem*) itemID;
704 OSStatus err = errDataBrowserPropertyNotSupported;
705 switch( property )
706 {
707 case kDataBrowserContainerIsClosableProperty :
708 case kDataBrowserContainerIsSortableProperty :
709 case kDataBrowserContainerIsOpenableProperty :
710 // right now default behaviour on these
711 break;
712 default :
713
714 if ( item != NULL ){
715 err = item->GetSetData( this, property , itemData , changeValue );
716 }
717 break;
718
719 }
720 return err;
721 }
722
ItemNotification(DataBrowserItemID itemID,DataBrowserItemNotification message,DataBrowserItemDataRef itemData)723 void wxMacDataItemBrowserControl::ItemNotification(
724 DataBrowserItemID itemID,
725 DataBrowserItemNotification message,
726 DataBrowserItemDataRef itemData)
727 {
728 wxMacDataItem* item = (wxMacDataItem*) itemID;
729 if (item != NULL)
730 item->Notification( this, message, itemData);
731 }
732
GetItemCount(const wxMacDataItem * container,bool recurse,DataBrowserItemState state) const733 unsigned int wxMacDataItemBrowserControl::GetItemCount(const wxMacDataItem* container,
734 bool recurse , DataBrowserItemState state) const
735 {
736 ItemCount numItems = 0;
737 verify_noerr( wxMacDataBrowserControl::GetItemCount( (DataBrowserItemID)container,
738 recurse, state, &numItems ) );
739 return numItems;
740 }
741
GetSelectedItemCount(const wxMacDataItem * container,bool recurse) const742 unsigned int wxMacDataItemBrowserControl::GetSelectedItemCount( const wxMacDataItem* container,
743 bool recurse ) const
744 {
745 return GetItemCount( container, recurse, kDataBrowserItemIsSelected );
746
747 }
748
GetItems(const wxMacDataItem * container,bool recurse,DataBrowserItemState state,wxArrayMacDataItemPtr & items) const749 void wxMacDataItemBrowserControl::GetItems(const wxMacDataItem* container,
750 bool recurse , DataBrowserItemState state, wxArrayMacDataItemPtr &items) const
751 {
752 Handle handle = NewHandle(0);
753 verify_noerr( wxMacDataBrowserControl::GetItems( (DataBrowserItemID)container ,
754 recurse , state, handle) );
755
756 int itemCount = GetHandleSize(handle)/sizeof(DataBrowserItemID);
757 HLock( handle );
758 wxMacDataItemPtr* itemsArray = (wxMacDataItemPtr*) *handle;
759 for ( int i = 0; i < itemCount; ++i)
760 {
761 items.Add(itemsArray[i]);
762 }
763 HUnlock( handle );
764 DisposeHandle( handle );
765 }
766
GetLineFromItem(const wxMacDataItem * item) const767 unsigned int wxMacDataItemBrowserControl::GetLineFromItem(const wxMacDataItem* item) const
768 {
769 DataBrowserTableViewRowIndex row;
770 OSStatus err = GetItemRow( (DataBrowserItemID) item , &row);
771 wxCHECK( err == noErr, (unsigned)-1 );
772 return row;
773 }
774
GetItemFromLine(unsigned int n) const775 wxMacDataItem* wxMacDataItemBrowserControl::GetItemFromLine(unsigned int n) const
776 {
777 DataBrowserItemID id;
778 OSStatus err = GetItemID( (DataBrowserTableViewRowIndex) n , &id);
779 wxCHECK( err == noErr, NULL );
780 return (wxMacDataItem*) id;
781 }
782
UpdateItem(const wxMacDataItem * container,const wxMacDataItem * item,DataBrowserPropertyID property) const783 void wxMacDataItemBrowserControl::UpdateItem(const wxMacDataItem *container,
784 const wxMacDataItem *item , DataBrowserPropertyID property) const
785 {
786 verify_noerr( wxMacDataBrowserControl::UpdateItems((DataBrowserItemID)container, 1,
787 (DataBrowserItemID*) &item, kDataBrowserItemNoProperty /* notSorted */, property ) );
788 }
789
UpdateItems(const wxMacDataItem * container,wxArrayMacDataItemPtr & itemArray,DataBrowserPropertyID property) const790 void wxMacDataItemBrowserControl::UpdateItems(const wxMacDataItem *container,
791 wxArrayMacDataItemPtr &itemArray , DataBrowserPropertyID property) const
792 {
793 unsigned int noItems = itemArray.GetCount();
794 DataBrowserItemID *items = new DataBrowserItemID[noItems];
795 for ( unsigned int i = 0; i < noItems; ++i )
796 items[i] = (DataBrowserItemID) itemArray[i];
797
798 verify_noerr( wxMacDataBrowserControl::UpdateItems((DataBrowserItemID)container, noItems,
799 items, kDataBrowserItemNoProperty /* notSorted */, property ) );
800 delete [] items;
801 }
802
803 static int column_id_counter = 0;
804
InsertColumn(int col,DataBrowserPropertyType colType,const wxString & title,SInt16 just,int defaultWidth)805 void wxMacDataItemBrowserControl::InsertColumn(int col, DataBrowserPropertyType colType,
806 const wxString& title, SInt16 just, int defaultWidth)
807 {
808 DataBrowserListViewColumnDesc columnDesc;
809 columnDesc.headerBtnDesc.titleOffset = 0;
810 columnDesc.headerBtnDesc.version = kDataBrowserListViewLatestHeaderDesc;
811
812 columnDesc.headerBtnDesc.btnFontStyle.flags =
813 kControlUseFontMask | kControlUseJustMask;
814
815 columnDesc.headerBtnDesc.btnContentInfo.contentType = kControlContentTextOnly;
816 columnDesc.headerBtnDesc.btnFontStyle.just = just;
817 columnDesc.headerBtnDesc.btnFontStyle.font = kControlFontViewSystemFont;
818 columnDesc.headerBtnDesc.btnFontStyle.style = normal;
819
820 // TODO: Why is m_font not defined when we enter wxLC_LIST mode, but is
821 // defined for other modes?
822 wxFontEncoding enc;
823 if ( m_font.IsOk() )
824 enc = m_font.GetEncoding();
825 else
826 enc = wxLocale::GetSystemEncoding();
827 wxCFStringRef cfTitle( title, enc );
828 columnDesc.headerBtnDesc.titleString = cfTitle;
829
830 columnDesc.headerBtnDesc.minimumWidth = 0;
831 columnDesc.headerBtnDesc.maximumWidth = 30000;
832
833 DataBrowserPropertyID id = kMinColumnId + column_id_counter;
834 column_id_counter++;
835
836 columnDesc.propertyDesc.propertyID = id;
837 columnDesc.propertyDesc.propertyType = colType;
838 columnDesc.propertyDesc.propertyFlags = kDataBrowserListViewSortableColumn;
839 columnDesc.propertyDesc.propertyFlags |= kDataBrowserListViewTypeSelectColumn;
840 columnDesc.propertyDesc.propertyFlags |= kDataBrowserListViewNoGapForIconInHeaderButton;
841
842 verify_noerr( AddColumn( &columnDesc, col ) );
843
844 if (defaultWidth > 0){
845 SetColumnWidth(col, defaultWidth);
846 }
847 }
848
SetColumnWidth(int colId,int width)849 void wxMacDataItemBrowserControl::SetColumnWidth(int colId, int width)
850 {
851 DataBrowserPropertyID id;
852 GetColumnIDFromIndex(colId, &id);
853 verify_noerr( wxMacDataBrowserControl::SetColumnWidth(id, width));
854 }
855
GetColumnWidth(int colId)856 int wxMacDataItemBrowserControl::GetColumnWidth(int colId)
857 {
858 DataBrowserPropertyID id;
859 GetColumnIDFromIndex(colId, &id);
860 UInt16 result;
861 verify_noerr( wxMacDataBrowserControl::GetColumnWidth(id, &result));
862 return result;
863 }
864
AddItem(wxMacDataItem * container,wxMacDataItem * item)865 void wxMacDataItemBrowserControl::AddItem(wxMacDataItem *container, wxMacDataItem *item)
866 {
867 verify_noerr( wxMacDataBrowserControl::AddItems( (DataBrowserItemID)container, 1,
868 (DataBrowserItemID*) &item, kDataBrowserItemNoProperty ) );
869 }
870
AddItems(wxMacDataItem * container,wxArrayMacDataItemPtr & itemArray)871 void wxMacDataItemBrowserControl::AddItems(wxMacDataItem *container, wxArrayMacDataItemPtr &itemArray )
872 {
873 unsigned int noItems = itemArray.GetCount();
874 DataBrowserItemID *items = new DataBrowserItemID[noItems];
875 for ( unsigned int i = 0; i < noItems; ++i )
876 items[i] = (DataBrowserItemID) itemArray[i];
877
878 verify_noerr( wxMacDataBrowserControl::AddItems( (DataBrowserItemID)container, noItems,
879 (DataBrowserItemID*) items, kDataBrowserItemNoProperty ) );
880 delete [] items;
881 }
882
RemoveItem(wxMacDataItem * container,wxMacDataItem * item)883 void wxMacDataItemBrowserControl::RemoveItem(wxMacDataItem *container, wxMacDataItem* item)
884 {
885 OSStatus err = wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID)container, 1,
886 (DataBrowserItemID*) &item, kDataBrowserItemNoProperty );
887 verify_noerr( err );
888 }
889
RemoveItems(wxMacDataItem * container,wxArrayMacDataItemPtr & itemArray)890 void wxMacDataItemBrowserControl::RemoveItems(wxMacDataItem *container, wxArrayMacDataItemPtr &itemArray)
891 {
892 unsigned int noItems = itemArray.GetCount();
893 DataBrowserItemID *items = new DataBrowserItemID[noItems];
894 for ( unsigned int i = 0; i < noItems; ++i )
895 items[i] = (DataBrowserItemID) itemArray[i];
896
897 OSStatus err = wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID)container, noItems,
898 (DataBrowserItemID*) items, kDataBrowserItemNoProperty );
899 verify_noerr( err );
900 delete [] items;
901 }
902
RemoveAllItems(wxMacDataItem * container)903 void wxMacDataItemBrowserControl::RemoveAllItems(wxMacDataItem *container)
904 {
905 SetScrollPosition(0, 0);
906 OSStatus err = wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID)container, 0 , NULL , kDataBrowserItemNoProperty );
907 verify_noerr( err );
908 }
909
SetSelectedItem(wxMacDataItem * item,DataBrowserSetOption option)910 void wxMacDataItemBrowserControl::SetSelectedItem(wxMacDataItem* item , DataBrowserSetOption option)
911 {
912 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( 1, (DataBrowserItemID*) &item, option ));
913 }
914
SetSelectedAllItems(DataBrowserSetOption option)915 void wxMacDataItemBrowserControl::SetSelectedAllItems(DataBrowserSetOption option)
916 {
917 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( 0 , NULL , option ));
918 }
919
SetSelectedItems(wxArrayMacDataItemPtr & itemArray,DataBrowserSetOption option)920 void wxMacDataItemBrowserControl::SetSelectedItems(wxArrayMacDataItemPtr &itemArray , DataBrowserSetOption option)
921 {
922 unsigned int noItems = itemArray.GetCount();
923 DataBrowserItemID *items = new DataBrowserItemID[noItems];
924 for ( unsigned int i = 0; i < noItems; ++i )
925 items[i] = (DataBrowserItemID) itemArray[i];
926
927 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( noItems, (DataBrowserItemID*) items, option ));
928 delete [] items;
929 }
930
IsItemSelected(const wxMacDataItem * item) const931 Boolean wxMacDataItemBrowserControl::IsItemSelected( const wxMacDataItem* item) const
932 {
933 return wxMacDataBrowserControl::IsItemSelected( (DataBrowserItemID) item);
934 }
935
RevealItem(wxMacDataItem * item,DataBrowserRevealOptions options)936 void wxMacDataItemBrowserControl::RevealItem( wxMacDataItem* item, DataBrowserRevealOptions options)
937 {
938 verify_noerr(wxMacDataBrowserControl::RevealItem( (DataBrowserItemID) item, kDataBrowserNoItem , options ) );
939 }
940
GetSelectionAnchor(wxMacDataItemPtr * first,wxMacDataItemPtr * last) const941 void wxMacDataItemBrowserControl::GetSelectionAnchor( wxMacDataItemPtr* first , wxMacDataItemPtr* last) const
942 {
943 verify_noerr(wxMacDataBrowserControl::GetSelectionAnchor( (DataBrowserItemID*) first, (DataBrowserItemID*) last) );
944 }
945
GetClientDataType() const946 wxClientDataType wxMacDataItemBrowserControl::GetClientDataType() const
947 {
948 return m_clientDataItemsType;
949 }
SetClientDataType(wxClientDataType clientDataItemsType)950 void wxMacDataItemBrowserControl::SetClientDataType(wxClientDataType clientDataItemsType)
951 {
952 m_clientDataItemsType = clientDataItemsType;
953 }
954
MacDelete(unsigned int n)955 void wxMacDataItemBrowserControl::MacDelete( unsigned int n )
956 {
957 wxMacDataItem* item = (wxMacDataItem*)GetItemFromLine( n );
958 RemoveItem( wxMacDataBrowserRootContainer, item );
959 }
960
MacInsert(unsigned int n,wxMacDataItem * item)961 void wxMacDataItemBrowserControl::MacInsert( unsigned int n, wxMacDataItem* item)
962 {
963 if ( m_sortOrder == SortOrder_None )
964 {
965
966 // increase the order of the lines to be shifted
967 unsigned int lines = MacGetCount();
968 for ( unsigned int i = n; i < lines; ++i)
969 {
970 wxMacDataItem* iter = (wxMacDataItem*) GetItemFromLine(i);
971 iter->SetOrder( iter->GetOrder() + 1 );
972 }
973
974 #if 0
975 // I don't understand what this code is supposed to do, RR.
976 SInt32 frontLineOrder = 0;
977 if ( n > 0 )
978 {
979 wxMacDataItem* iter = (wxMacDataItem*) GetItemFromLine(n-1);
980 frontLineOrder = iter->GetOrder()+1;
981 }
982 #else
983 item->SetOrder( n );
984 #endif
985 }
986
987 AddItem( wxMacDataBrowserRootContainer, item );
988 }
989
MacClear()990 void wxMacDataItemBrowserControl::MacClear()
991 {
992 wxMacDataItemBrowserSelectionSuppressor suppressor(this);
993 RemoveAllItems(wxMacDataBrowserRootContainer);
994 }
995
MacGetCount() const996 unsigned int wxMacDataItemBrowserControl::MacGetCount() const
997 {
998 return GetItemCount(wxMacDataBrowserRootContainer,false,kDataBrowserItemAnyState);
999 }
1000
1001 #endif // wxUSE_GUI
1002
1003