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