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