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