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