]> git.saurik.com Git - wxWidgets.git/blame_incremental - src/mac/carbon/utils.cpp
fixing switches
[wxWidgets.git] / src / mac / carbon / utils.cpp
... / ...
CommitLineData
1/////////////////////////////////////////////////////////////////////////////
2// Name: src/mac/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#include "wx/wxprec.h"
13
14#include "wx/utils.h"
15
16#ifndef WX_PRECOMP
17 #include "wx/intl.h"
18 #include "wx/app.h"
19 #if wxUSE_GUI
20 #include "wx/toplevel.h"
21 #include "wx/font.h"
22 #endif
23#endif
24
25#include "wx/apptrait.h"
26
27#if wxUSE_GUI
28 #include "wx/mac/uma.h"
29#endif
30
31#include <ctype.h>
32
33#include <stdio.h>
34#include <stdlib.h>
35#include <string.h>
36#include <stdarg.h>
37
38// #include "MoreFilesX.h"
39
40#ifndef __DARWIN__
41 #include <Threads.h>
42 #include <Sound.h>
43#endif
44
45#if wxUSE_GUI
46 #include <CoreServices/CoreServices.h>
47 #include <Carbon/Carbon.h>
48 #include "wx/mac/private/timer.h"
49#endif // wxUSE_GUI
50
51#include "wx/evtloop.h"
52#include "wx/mac/private.h"
53
54#if defined(__MWERKS__) && wxUSE_UNICODE
55#if __MWERKS__ < 0x4100
56 #include <wtime.h>
57#endif
58#endif
59
60#if wxUSE_BASE
61
62// our OS version is the same in non GUI and GUI cases
63wxOperatingSystemId wxGetOsVersion(int *majorVsn, int *minorVsn)
64{
65 SInt32 theSystem;
66 Gestalt(gestaltSystemVersion, &theSystem);
67
68 if ( majorVsn != NULL )
69 *majorVsn = (theSystem >> 8);
70
71 if ( minorVsn != NULL )
72 *minorVsn = (theSystem & 0xFF);
73
74#if defined( __DARWIN__ )
75 return wxOS_MAC_OSX_DARWIN;
76#else
77 return wxOS_MAC_OS;
78#endif
79}
80
81extern bool WXDLLEXPORT wxIsDebuggerRunning()
82{
83 // TODO : try to find out ...
84 return false;
85}
86
87// Emit a beeeeeep
88void wxBell()
89{
90#ifndef __LP64__
91 SysBeep(30);
92#endif
93}
94
95
96#endif // wxUSE_BASE
97
98#if wxUSE_GUI
99
100wxPortId wxGUIAppTraits::GetToolkitVersion(int *verMaj, int *verMin) const
101{
102 // We suppose that toolkit version is the same as OS version under Mac
103 wxGetOsVersion(verMaj, verMin);
104
105 return wxPORT_MAC;
106}
107
108wxEventLoopBase* wxGUIAppTraits::CreateEventLoop()
109{
110 return new wxEventLoop;
111}
112
113wxTimerImpl* wxGUIAppTraits::CreateTimerImpl(wxTimer *timer)
114{
115 return new wxCarbonTimerImpl(timer);
116}
117
118int gs_wxBusyCursorCount = 0;
119extern wxCursor gMacCurrentCursor;
120wxCursor gMacStoredActiveCursor;
121
122// Set the cursor to the busy cursor for all windows
123void wxBeginBusyCursor(const wxCursor *cursor)
124{
125 if (gs_wxBusyCursorCount++ == 0)
126 {
127 gMacStoredActiveCursor = gMacCurrentCursor;
128 cursor->MacInstall();
129 }
130 //else: nothing to do, already set
131}
132
133// Restore cursor to normal
134void wxEndBusyCursor()
135{
136 wxCHECK_RET( gs_wxBusyCursorCount > 0,
137 wxT("no matching wxBeginBusyCursor() for wxEndBusyCursor()") );
138
139 if (--gs_wxBusyCursorCount == 0)
140 {
141 gMacStoredActiveCursor.MacInstall();
142 gMacStoredActiveCursor = wxNullCursor;
143 }
144}
145
146// true if we're between the above two calls
147bool wxIsBusy()
148{
149 return (gs_wxBusyCursorCount > 0);
150}
151
152#endif // wxUSE_GUI
153
154#if wxUSE_BASE
155
156wxString wxMacFindFolderNoSeparator( short vol,
157 OSType folderType,
158 Boolean createFolder)
159{
160 FSRef fsRef;
161 wxString strDir;
162
163 if ( FSFindFolder( vol, folderType, createFolder, &fsRef) == noErr)
164 {
165 strDir = wxMacFSRefToPath( &fsRef );
166 }
167
168 return strDir;
169}
170
171wxString wxMacFindFolder( short vol,
172 OSType folderType,
173 Boolean createFolder)
174{
175 return wxMacFindFolderNoSeparator(vol, folderType, createFolder) + wxFILE_SEP_PATH;
176}
177
178#endif // wxUSE_BASE
179
180#if wxUSE_GUI
181
182// Check whether this window wants to process messages, e.g. Stop button
183// in long calculations.
184bool wxCheckForInterrupt(wxWindow *WXUNUSED(wnd))
185{
186 // TODO
187 return false;
188}
189
190void wxGetMousePosition( int* x, int* y )
191{
192#if wxMAC_USE_QUICKDRAW
193 Point pt;
194 GetGlobalMouse(&pt);
195 *x = pt.h;
196 *y = pt.v;
197#endif
198};
199
200// Return true if we have a colour display
201bool wxColourDisplay()
202{
203 return true;
204}
205
206// Returns depth of screen
207int wxDisplayDepth()
208{
209#if wxMAC_USE_QUICKDRAW
210 int theDepth = (int) CGDisplayBitsPerPixel(CGMainDisplayID());
211 Rect globRect;
212 SetRect(&globRect, -32760, -32760, 32760, 32760);
213 GDHandle theMaxDevice;
214
215 theMaxDevice = GetMaxDevice(&globRect);
216 if (theMaxDevice != NULL)
217 theDepth = (**(**theMaxDevice).gdPMap).pixelSize;
218
219 return theDepth;
220#else
221 return 32;
222#endif
223}
224
225// Get size of display
226void wxDisplaySize(int *width, int *height)
227{
228 // TODO adapt for multi-displays
229 CGRect bounds = CGDisplayBounds(CGMainDisplayID());
230 if ( width )
231 *width = (int)bounds.size.width ;
232 if ( height )
233 *height = (int)bounds.size.height;
234}
235
236void wxDisplaySizeMM(int *width, int *height)
237{
238 wxDisplaySize(width, height);
239 // on mac 72 is fixed (at least now;-)
240 float cvPt2Mm = 25.4 / 72;
241
242 if (width != NULL)
243 *width = int( *width * cvPt2Mm );
244
245 if (height != NULL)
246 *height = int( *height * cvPt2Mm );
247}
248
249void wxClientDisplayRect(int *x, int *y, int *width, int *height)
250{
251#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
252#if wxMAC_USE_QUICKDRAW
253
254 HIRect bounds ;
255 HIWindowGetAvailablePositioningBounds(kCGNullDirectDisplay,kHICoordSpace72DPIGlobal,
256 &bounds);
257 if ( x )
258 *x = bounds.origin.x;
259 if ( y )
260 *y = bounds.origin.y;
261 if ( width )
262 *width = bounds.size.width;
263 if ( height )
264 *height = bounds.size.height;
265#else
266 int w, h;
267 wxDisplaySize(&w,&h);
268 if ( x )
269 *x = 0;
270 if ( y )
271 *y = 24;
272 if ( width )
273 *width = w;
274 if ( height )
275 *height = h-24;
276#endif
277#else
278 Rect r;
279 GetAvailableWindowPositioningBounds( GetMainDevice() , &r );
280 if ( x )
281 *x = r.left;
282 if ( y )
283 *y = r.top;
284 if ( width )
285 *width = r.right - r.left;
286 if ( height )
287 *height = r.bottom - r.top;
288#endif
289}
290
291wxWindow* wxFindWindowAtPoint(const wxPoint& pt)
292{
293 return wxGenericFindWindowAtPoint(pt);
294}
295
296#endif // wxUSE_GUI
297
298#if wxUSE_BASE
299
300wxString wxGetOsDescription()
301{
302#ifdef WXWIN_OS_DESCRIPTION
303 // use configure generated description if available
304 return wxString(wxT("MacOS (")) + wxT(WXWIN_OS_DESCRIPTION) + wxString(wxT(")"));
305#else
306 return wxT("MacOS"); //TODO:define further
307#endif
308}
309
310#ifndef __DARWIN__
311wxString wxGetUserHome (const wxString& user)
312{
313 // TODO
314 return wxString();
315}
316
317bool wxGetDiskSpace(const wxString& path, wxDiskspaceSize_t *pTotal, wxDiskspaceSize_t *pFree)
318{
319 if ( path.empty() )
320 return false;
321
322 wxString p = path;
323 if (p[0u] == ':' )
324 p = wxGetCwd() + p;
325
326 int pos = p.Find(':');
327 if ( pos != wxNOT_FOUND )
328 p = p.Mid(1,pos);
329
330 p = p + wxT(":");
331
332 OSErr err = noErr;
333
334 FSRef fsRef;
335 err = wxMacPathToFSRef( p , &fsRef );
336 if ( noErr == err )
337 {
338 FSVolumeRefNum vRefNum;
339 err = FSGetVRefNum( &fsRef , &vRefNum );
340 if ( noErr == err )
341 {
342 UInt64 freeBytes , totalBytes;
343 err = FSGetVInfo( vRefNum , NULL , &freeBytes , &totalBytes );
344 if ( noErr == err )
345 {
346 if ( pTotal )
347 *pTotal = wxDiskspaceSize_t( totalBytes );
348 if ( pFree )
349 *pFree = wxDiskspaceSize_t( freeBytes );
350 }
351 }
352 }
353
354 return err == noErr;
355}
356#endif // !__DARWIN__
357
358//---------------------------------------------------------------------------
359// wxMac Specific utility functions
360//---------------------------------------------------------------------------
361
362void wxMacStringToPascal( const wxString&from , StringPtr to )
363{
364 wxCharBuffer buf = from.mb_str( wxConvLocal );
365 int len = strlen(buf);
366
367 if ( len > 255 )
368 len = 255;
369 to[0] = len;
370 memcpy( (char*) &to[1] , buf , len );
371}
372
373wxString wxMacMakeStringFromPascal( ConstStringPtr from )
374{
375 return wxString( (char*) &from[1] , wxConvLocal , from[0] );
376}
377
378// ----------------------------------------------------------------------------
379// Common Event Support
380// ----------------------------------------------------------------------------
381
382extern ProcessSerialNumber gAppProcess;
383
384void wxMacWakeUp()
385{
386 ProcessSerialNumber psn;
387 Boolean isSame;
388 psn.highLongOfPSN = 0;
389 psn.lowLongOfPSN = kCurrentProcess;
390 SameProcess( &gAppProcess , &psn , &isSame );
391 if ( isSame )
392 {
393 OSStatus err = noErr;
394
395#if 0
396 // lead sometimes to race conditions, although all calls used should be thread safe ...
397 static wxMacCarbonEvent s_wakeupEvent;
398 if ( !s_wakeupEvent.IsValid() )
399 {
400 err = s_wakeupEvent.Create( 'WXMC', 'WXMC', GetCurrentEventTime(),
401 kEventAttributeNone );
402 }
403 if ( err == noErr )
404 {
405
406 if ( IsEventInQueue( GetMainEventQueue() , s_wakeupEvent ) )
407 return;
408 s_wakeupEvent.SetCurrentTime();
409 err = PostEventToQueue(GetMainEventQueue(), s_wakeupEvent,
410 kEventPriorityHigh );
411 }
412#else
413 wxMacCarbonEvent wakeupEvent;
414 wakeupEvent.Create( 'WXMC', 'WXMC', GetCurrentEventTime(),
415 kEventAttributeNone );
416 err = PostEventToQueue(GetMainEventQueue(), wakeupEvent,
417 kEventPriorityHigh );
418#endif
419 }
420 else
421 {
422 WakeUpProcess( &gAppProcess );
423 }
424}
425
426#endif // wxUSE_BASE
427
428#if wxUSE_GUI
429
430// ----------------------------------------------------------------------------
431// Native Struct Conversions
432// ----------------------------------------------------------------------------
433
434void wxMacRectToNative( const wxRect *wx , Rect *n )
435{
436 n->left = wx->x;
437 n->top = wx->y;
438 n->right = wx->x + wx->width;
439 n->bottom = wx->y + wx->height;
440}
441
442void wxMacNativeToRect( const Rect *n , wxRect* wx )
443{
444 wx->x = n->left;
445 wx->y = n->top;
446 wx->width = n->right - n->left;
447 wx->height = n->bottom - n->top;
448}
449
450void wxMacPointToNative( const wxPoint* wx , Point *n )
451{
452 n->h = wx->x;
453 n->v = wx->y;
454}
455
456void wxMacNativeToPoint( const Point *n , wxPoint* wx )
457{
458 wx->x = n->h;
459 wx->y = n->v;
460}
461
462// ----------------------------------------------------------------------------
463// Carbon Event Support
464// ----------------------------------------------------------------------------
465
466OSStatus wxMacCarbonEvent::GetParameter(EventParamName inName, EventParamType inDesiredType, UInt32 inBufferSize, void * outData)
467{
468 return ::GetEventParameter( m_eventRef , inName , inDesiredType , NULL , inBufferSize , NULL , outData );
469}
470
471OSStatus wxMacCarbonEvent::SetParameter(EventParamName inName, EventParamType inType, UInt32 inBufferSize, const void * inData)
472{
473 return ::SetEventParameter( m_eventRef , inName , inType , inBufferSize , inData );
474}
475
476// ----------------------------------------------------------------------------
477// Control Access Support
478// ----------------------------------------------------------------------------
479
480#if wxMAC_USE_QUICKDRAW
481
482IMPLEMENT_DYNAMIC_CLASS( wxMacControl , wxObject )
483
484wxMacControl::wxMacControl()
485{
486 Init();
487}
488
489wxMacControl::wxMacControl(wxWindow* peer , bool isRootControl )
490{
491 Init();
492 m_peer = peer;
493 m_isRootControl = isRootControl;
494}
495
496wxMacControl::wxMacControl( wxWindow* peer , ControlRef control )
497{
498 Init();
499 m_peer = peer;
500 m_controlRef = control;
501}
502
503wxMacControl::wxMacControl( wxWindow* peer , WXWidget control )
504{
505 Init();
506 m_peer = peer;
507 m_controlRef = (ControlRef) control;
508}
509
510wxMacControl::~wxMacControl()
511{
512}
513
514void wxMacControl::Init()
515{
516 m_peer = NULL;
517 m_controlRef = NULL;
518 m_needsFocusRect = false;
519 m_isRootControl = false;
520}
521
522void wxMacControl::Dispose()
523{
524 wxASSERT_MSG( m_controlRef != NULL , wxT("Control Handle already NULL, Dispose called twice ?") );
525 wxASSERT_MSG( IsValidControlHandle(m_controlRef) , wxT("Invalid Control Handle (maybe already released) in Dispose") );
526
527 // we cannot check the ref count here anymore, as autorelease objects might delete their refs later
528 // we can have situations when being embedded, where the control gets deleted behind our back, so only
529 // CFRelease if we are safe
530 if ( IsValidControlHandle(m_controlRef) )
531 CFRelease(m_controlRef);
532 m_controlRef = NULL;
533}
534
535void wxMacControl::SetReference( URefCon data )
536{
537 SetControlReference( m_controlRef , data );
538}
539
540OSStatus wxMacControl::GetData(ControlPartCode inPartCode , ResType inTag , Size inBufferSize , void * inOutBuffer , Size * outActualSize ) const
541{
542 return ::GetControlData( m_controlRef , inPartCode , inTag , inBufferSize , inOutBuffer , outActualSize );
543}
544
545OSStatus wxMacControl::GetDataSize(ControlPartCode inPartCode , ResType inTag , Size * outActualSize ) const
546{
547 return ::GetControlDataSize( m_controlRef , inPartCode , inTag , outActualSize );
548}
549
550OSStatus wxMacControl::SetData(ControlPartCode inPartCode , ResType inTag , Size inSize , const void * inData)
551{
552 return ::SetControlData( m_controlRef , inPartCode , inTag , inSize , inData );
553}
554
555OSStatus wxMacControl::SendEvent( EventRef event , OptionBits inOptions )
556{
557 return SendEventToEventTargetWithOptions( event,
558 HIObjectGetEventTarget( (HIObjectRef) m_controlRef ), inOptions );
559}
560
561OSStatus wxMacControl::SendHICommand( HICommand &command , OptionBits inOptions )
562{
563 wxMacCarbonEvent event( kEventClassCommand , kEventCommandProcess );
564
565 event.SetParameter<HICommand>(kEventParamDirectObject,command);
566
567 return SendEvent( event , inOptions );
568}
569
570OSStatus wxMacControl::SendHICommand( UInt32 commandID , OptionBits inOptions )
571{
572 HICommand command;
573
574 memset( &command, 0 , sizeof(command) );
575 command.commandID = commandID;
576 return SendHICommand( command , inOptions );
577}
578
579void wxMacControl::Flash( ControlPartCode part , UInt32 ticks )
580{
581 unsigned long finalTicks;
582
583 HiliteControl( m_controlRef , part );
584 Delay( ticks , &finalTicks );
585 HiliteControl( m_controlRef , kControlNoPart );
586}
587
588SInt32 wxMacControl::GetValue() const
589{
590 return ::GetControl32BitValue( m_controlRef );
591}
592
593SInt32 wxMacControl::GetMaximum() const
594{
595 return ::GetControl32BitMaximum( m_controlRef );
596}
597
598SInt32 wxMacControl::GetMinimum() const
599{
600 return ::GetControl32BitMinimum( m_controlRef );
601}
602
603void wxMacControl::SetValue( SInt32 v )
604{
605 ::SetControl32BitValue( m_controlRef , v );
606}
607
608void wxMacControl::SetMinimum( SInt32 v )
609{
610 ::SetControl32BitMinimum( m_controlRef , v );
611}
612
613void wxMacControl::SetMaximum( SInt32 v )
614{
615 ::SetControl32BitMaximum( m_controlRef , v );
616}
617
618void wxMacControl::SetValueAndRange( SInt32 value , SInt32 minimum , SInt32 maximum )
619{
620 ::SetControl32BitMinimum( m_controlRef , minimum );
621 ::SetControl32BitMaximum( m_controlRef , maximum );
622 ::SetControl32BitValue( m_controlRef , value );
623}
624
625OSStatus wxMacControl::SetFocus( ControlFocusPart focusPart )
626{
627 return SetKeyboardFocus( GetControlOwner( m_controlRef ), m_controlRef, focusPart );
628}
629
630bool wxMacControl::HasFocus() const
631{
632 ControlRef control;
633 GetKeyboardFocus( GetUserFocusWindow() , &control );
634 return control == m_controlRef;
635}
636
637void wxMacControl::SetNeedsFocusRect( bool needs )
638{
639 m_needsFocusRect = needs;
640}
641
642bool wxMacControl::NeedsFocusRect() const
643{
644 return m_needsFocusRect;
645}
646
647void wxMacControl::VisibilityChanged(bool WXUNUSED(shown))
648{
649}
650
651void wxMacControl::SuperChangedPosition()
652{
653}
654
655void wxMacControl::SetFont( const wxFont & font , const wxColour& foreground , long windowStyle )
656{
657 m_font = font;
658#ifndef __LP64__
659 ControlFontStyleRec fontStyle;
660 if ( font.MacGetThemeFontID() != kThemeCurrentPortFont )
661 {
662 switch ( font.MacGetThemeFontID() )
663 {
664 case kThemeSmallSystemFont :
665 fontStyle.font = kControlFontSmallSystemFont;
666 break;
667
668 case 109 : // mini font
669 fontStyle.font = -5;
670 break;
671
672 case kThemeSystemFont :
673 fontStyle.font = kControlFontBigSystemFont;
674 break;
675
676 default :
677 fontStyle.font = kControlFontBigSystemFont;
678 break;
679 }
680
681 fontStyle.flags = kControlUseFontMask;
682 }
683 else
684 {
685 fontStyle.font = font.MacGetFontNum();
686 fontStyle.style = font.MacGetFontStyle();
687 fontStyle.size = font.MacGetFontSize();
688 fontStyle.flags = kControlUseFontMask | kControlUseFaceMask | kControlUseSizeMask;
689 }
690
691 fontStyle.just = teJustLeft;
692 fontStyle.flags |= kControlUseJustMask;
693 if ( ( windowStyle & wxALIGN_MASK ) & wxALIGN_CENTER_HORIZONTAL )
694 fontStyle.just = teJustCenter;
695 else if ( ( windowStyle & wxALIGN_MASK ) & wxALIGN_RIGHT )
696 fontStyle.just = teJustRight;
697
698
699 // we only should do this in case of a non-standard color, as otherwise 'disabled' controls
700 // won't get grayed out by the system anymore
701
702 if ( foreground != *wxBLACK )
703 {
704 foreground.GetRGBColor( &fontStyle.foreColor );
705 fontStyle.flags |= kControlUseForeColorMask;
706 }
707
708 ::SetControlFontStyle( m_controlRef , &fontStyle );
709#endif
710}
711
712void wxMacControl::SetBackgroundColour( const wxColour &WXUNUSED(col) )
713{
714 // TODO
715 // setting up a color proc is not recommended anymore
716}
717
718void wxMacControl::SetRange( SInt32 minimum , SInt32 maximum )
719{
720 ::SetControl32BitMinimum( m_controlRef , minimum );
721 ::SetControl32BitMaximum( m_controlRef , maximum );
722}
723
724short wxMacControl::HandleKey( SInt16 keyCode, SInt16 charCode, EventModifiers modifiers )
725{
726#ifndef __LP64__
727 return HandleControlKey( m_controlRef , keyCode , charCode , modifiers );
728#else
729 return 0;
730#endif
731}
732
733void wxMacControl::SetActionProc( ControlActionUPP actionProc )
734{
735 SetControlAction( m_controlRef , actionProc );
736}
737
738void wxMacControl::SetViewSize( SInt32 viewSize )
739{
740 SetControlViewSize(m_controlRef , viewSize );
741}
742
743SInt32 wxMacControl::GetViewSize() const
744{
745 return GetControlViewSize( m_controlRef );
746}
747
748bool wxMacControl::IsVisible() const
749{
750 return IsControlVisible( m_controlRef );
751}
752
753void wxMacControl::SetVisibility( bool visible , bool redraw )
754{
755 SetControlVisibility( m_controlRef , visible , redraw );
756}
757
758bool wxMacControl::IsEnabled() const
759{
760 return IsControlEnabled( m_controlRef );
761}
762
763bool wxMacControl::IsActive() const
764{
765 return IsControlActive( m_controlRef );
766}
767
768void wxMacControl::Enable( bool enable )
769{
770 if ( enable )
771 EnableControl( m_controlRef );
772 else
773 DisableControl( m_controlRef );
774}
775
776void wxMacControl::SetDrawingEnabled( bool enable )
777{
778 HIViewSetDrawingEnabled( m_controlRef , enable );
779}
780
781bool wxMacControl::GetNeedsDisplay() const
782{
783 return HIViewGetNeedsDisplay( m_controlRef );
784}
785
786void wxMacControl::SetNeedsDisplay( RgnHandle where )
787{
788 if ( !IsVisible() )
789 return;
790
791 HIViewSetNeedsDisplayInRegion( m_controlRef , where , true );
792}
793
794void wxMacControl::SetNeedsDisplay( Rect* where )
795{
796 if ( !IsVisible() )
797 return;
798
799 if ( where != NULL )
800 {
801 RgnHandle update = NewRgn();
802 RectRgn( update , where );
803 HIViewSetNeedsDisplayInRegion( m_controlRef , update , true );
804 DisposeRgn( update );
805 }
806 else
807 HIViewSetNeedsDisplay( m_controlRef , true );
808}
809
810void wxMacControl::Convert( wxPoint *pt , wxMacControl *from , wxMacControl *to )
811{
812 HIPoint hiPoint;
813
814 hiPoint.x = pt->x;
815 hiPoint.y = pt->y;
816 HIViewConvertPoint( &hiPoint , from->m_controlRef , to->m_controlRef );
817 pt->x = (int)hiPoint.x;
818 pt->y = (int)hiPoint.y;
819}
820
821void wxMacControl::SetRect( Rect *r )
822{
823 //A HIRect is actually a CGRect on OSX - which consists of two structures -
824 //CGPoint and CGSize, which have two floats each
825 HIRect hir = { { r->left , r->top }, { r->right - r->left , r->bottom - r->top } };
826 HIViewSetFrame ( m_controlRef , &hir );
827 // eventuall we might have to do a SetVisibility( false , true );
828 // before and a SetVisibility( true , true ); after
829}
830
831void wxMacControl::GetRect( Rect *r )
832{
833 GetControlBounds( m_controlRef , r );
834}
835
836void wxMacControl::GetRectInWindowCoords( Rect *r )
837{
838 UMAGetControlBoundsInWindowCoords( m_controlRef , r );
839}
840
841void wxMacControl::GetBestRect( Rect *r )
842{
843 short baselineoffset;
844
845 GetBestControlRect( m_controlRef , r , &baselineoffset );
846}
847
848void wxMacControl::SetLabel( const wxString &title )
849{
850 wxFontEncoding encoding;
851
852 if ( m_font.Ok() )
853 encoding = m_font.GetEncoding();
854 else
855 encoding = wxFont::GetDefaultEncoding();
856
857 UMASetControlTitle( m_controlRef , title , encoding );
858}
859
860void wxMacControl::GetFeatures( UInt32 * features )
861{
862 GetControlFeatures( m_controlRef , features );
863}
864
865OSStatus wxMacControl::GetRegion( ControlPartCode partCode , RgnHandle region )
866{
867 OSStatus err = GetControlRegion( m_controlRef , partCode , region );
868 return err;
869}
870
871OSStatus wxMacControl::SetZOrder( bool above , wxMacControl* other )
872{
873 return HIViewSetZOrder( m_controlRef,above ? kHIViewZOrderAbove : kHIViewZOrderBelow,
874 (other != NULL) ? other->m_controlRef : NULL);
875}
876
877// SetNeedsDisplay would not invalidate the children
878static void InvalidateControlAndChildren( HIViewRef control )
879{
880 HIViewSetNeedsDisplay( control , true );
881 UInt16 childrenCount = 0;
882 OSStatus err = CountSubControls( control , &childrenCount );
883 if ( err == errControlIsNotEmbedder )
884 return;
885
886 wxASSERT_MSG( err == noErr , wxT("Unexpected error when accessing subcontrols") );
887
888 for ( UInt16 i = childrenCount; i >=1; --i )
889 {
890 HIViewRef child;
891
892 err = GetIndexedSubControl( control , i , & child );
893 if ( err == errControlIsNotEmbedder )
894 return;
895
896 InvalidateControlAndChildren( child );
897 }
898}
899
900void wxMacControl::InvalidateWithChildren()
901{
902 InvalidateControlAndChildren( m_controlRef );
903}
904
905void wxMacControl::ScrollRect( wxRect *r , int dx , int dy )
906{
907 wxASSERT( r != NULL );
908
909 HIRect scrollarea = CGRectMake( r->x , r->y , r->width , r->height);
910 HIViewScrollRect ( m_controlRef , &scrollarea , dx ,dy );
911}
912
913OSType wxMacCreator = 'WXMC';
914OSType wxMacControlProperty = 'MCCT';
915
916void wxMacControl::SetReferenceInNativeControl()
917{
918 void * data = this;
919 verify_noerr( SetControlProperty ( m_controlRef ,
920 wxMacCreator,wxMacControlProperty, sizeof(data), &data ) );
921}
922
923wxMacControl* wxMacControl::GetReferenceFromNativeControl(ControlRef control)
924{
925 wxMacControl* ctl = NULL;
926 ByteCount actualSize;
927 if ( GetControlProperty( control ,wxMacCreator,wxMacControlProperty, sizeof(ctl) ,
928 &actualSize , &ctl ) == noErr )
929 {
930 return ctl;
931 }
932 return NULL;
933}
934
935// ============================================================================
936// DataBrowser Wrapper
937// ============================================================================
938//
939// basing on DataBrowserItemIDs
940//
941
942IMPLEMENT_ABSTRACT_CLASS( wxMacDataBrowserControl , wxMacControl )
943
944pascal void wxMacDataBrowserControl::DataBrowserItemNotificationProc(
945 ControlRef browser,
946 DataBrowserItemID itemID,
947 DataBrowserItemNotification message,
948 DataBrowserItemDataRef itemData )
949{
950 wxMacDataBrowserControl* ctl = wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser ), wxMacDataBrowserControl);
951 if ( ctl != 0 )
952 {
953 ctl->ItemNotification(itemID, message, itemData);
954 }
955}
956
957pascal OSStatus wxMacDataBrowserControl::DataBrowserGetSetItemDataProc(
958 ControlRef browser,
959 DataBrowserItemID itemID,
960 DataBrowserPropertyID property,
961 DataBrowserItemDataRef itemData,
962 Boolean changeValue )
963{
964 OSStatus err = errDataBrowserPropertyNotSupported;
965 wxMacDataBrowserControl* ctl = wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser ), wxMacDataBrowserControl);
966 if ( ctl != 0 )
967 {
968 err = ctl->GetSetItemData(itemID, property, itemData, changeValue);
969 }
970 return err;
971}
972
973pascal Boolean wxMacDataBrowserControl::DataBrowserCompareProc(
974 ControlRef browser,
975 DataBrowserItemID itemOneID,
976 DataBrowserItemID itemTwoID,
977 DataBrowserPropertyID sortProperty)
978{
979 wxMacDataBrowserControl* ctl = wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser ), wxMacDataBrowserControl);
980 if ( ctl != 0 )
981 {
982 return ctl->CompareItems(itemOneID, itemTwoID, sortProperty);
983 }
984 return false;
985}
986
987DataBrowserItemDataUPP gDataBrowserItemDataUPP = NULL;
988DataBrowserItemNotificationUPP gDataBrowserItemNotificationUPP = NULL;
989DataBrowserItemCompareUPP gDataBrowserItemCompareUPP = NULL;
990
991wxMacDataBrowserControl::wxMacDataBrowserControl( wxWindow* peer,
992 const wxPoint& pos,
993 const wxSize& size,
994 long WXUNUSED(style))
995 : wxMacControl( peer )
996{
997 Rect bounds = wxMacGetBoundsForControl( peer, pos, size );
998 OSStatus err = ::CreateDataBrowserControl(
999 MAC_WXHWND(peer->MacGetTopLevelWindowRef()),
1000 &bounds, kDataBrowserListView, &m_controlRef );
1001 SetReferenceInNativeControl();
1002 verify_noerr( err );
1003 if ( gDataBrowserItemCompareUPP == NULL )
1004 gDataBrowserItemCompareUPP = NewDataBrowserItemCompareUPP(DataBrowserCompareProc);
1005 if ( gDataBrowserItemDataUPP == NULL )
1006 gDataBrowserItemDataUPP = NewDataBrowserItemDataUPP(DataBrowserGetSetItemDataProc);
1007 if ( gDataBrowserItemNotificationUPP == NULL )
1008 {
1009 gDataBrowserItemNotificationUPP =
1010 (DataBrowserItemNotificationUPP) NewDataBrowserItemNotificationWithItemUPP(DataBrowserItemNotificationProc);
1011 }
1012
1013 DataBrowserCallbacks callbacks;
1014 InitializeDataBrowserCallbacks( &callbacks, kDataBrowserLatestCallbacks );
1015
1016 callbacks.u.v1.itemDataCallback = gDataBrowserItemDataUPP;
1017 callbacks.u.v1.itemCompareCallback = gDataBrowserItemCompareUPP;
1018 callbacks.u.v1.itemNotificationCallback = gDataBrowserItemNotificationUPP;
1019 SetCallbacks( &callbacks );
1020
1021}
1022
1023OSStatus wxMacDataBrowserControl::GetItemCount( DataBrowserItemID container,
1024 Boolean recurse,
1025 DataBrowserItemState state,
1026 ItemCount *numItems) const
1027{
1028 return GetDataBrowserItemCount( m_controlRef, container, recurse, state, numItems );
1029}
1030
1031OSStatus wxMacDataBrowserControl::GetItems( DataBrowserItemID container,
1032 Boolean recurse,
1033 DataBrowserItemState state,
1034 Handle items) const
1035{
1036 return GetDataBrowserItems( m_controlRef, container, recurse, state, items );
1037}
1038
1039OSStatus wxMacDataBrowserControl::SetSelectionFlags( DataBrowserSelectionFlags options )
1040{
1041 return SetDataBrowserSelectionFlags( m_controlRef, options );
1042}
1043
1044OSStatus wxMacDataBrowserControl::AddColumn( DataBrowserListViewColumnDesc *columnDesc,
1045 DataBrowserTableViewColumnIndex position )
1046{
1047 return AddDataBrowserListViewColumn( m_controlRef, columnDesc, position );
1048}
1049
1050OSStatus wxMacDataBrowserControl::GetColumnIDFromIndex( DataBrowserTableViewColumnIndex position, DataBrowserTableViewColumnID* id ){
1051 return GetDataBrowserTableViewColumnProperty( m_controlRef, position, id );
1052}
1053
1054OSStatus wxMacDataBrowserControl::RemoveColumn( DataBrowserTableViewColumnIndex position )
1055{
1056 DataBrowserTableViewColumnID id;
1057 GetColumnIDFromIndex( position, &id );
1058 return RemoveDataBrowserTableViewColumn( m_controlRef, id );
1059}
1060
1061OSStatus wxMacDataBrowserControl::AutoSizeColumns()
1062{
1063 return AutoSizeDataBrowserListViewColumns(m_controlRef);
1064}
1065
1066OSStatus wxMacDataBrowserControl::SetHasScrollBars( bool horiz, bool vert )
1067{
1068 return SetDataBrowserHasScrollBars( m_controlRef, horiz, vert );
1069}
1070
1071OSStatus wxMacDataBrowserControl::SetHiliteStyle( DataBrowserTableViewHiliteStyle hiliteStyle )
1072{
1073 return SetDataBrowserTableViewHiliteStyle( m_controlRef, hiliteStyle );
1074}
1075
1076OSStatus wxMacDataBrowserControl::SetHeaderButtonHeight(UInt16 height)
1077{
1078 return SetDataBrowserListViewHeaderBtnHeight( m_controlRef, height );
1079}
1080
1081OSStatus wxMacDataBrowserControl::GetHeaderButtonHeight(UInt16 *height)
1082{
1083 return GetDataBrowserListViewHeaderBtnHeight( m_controlRef, height );
1084}
1085
1086OSStatus wxMacDataBrowserControl::SetCallbacks(const DataBrowserCallbacks *callbacks)
1087{
1088 return SetDataBrowserCallbacks( m_controlRef, callbacks );
1089}
1090
1091OSStatus wxMacDataBrowserControl::UpdateItems(
1092 DataBrowserItemID container,
1093 UInt32 numItems,
1094 const DataBrowserItemID *items,
1095 DataBrowserPropertyID preSortProperty,
1096 DataBrowserPropertyID propertyID ) const
1097{
1098 return UpdateDataBrowserItems( m_controlRef, container, numItems, items, preSortProperty, propertyID );
1099}
1100
1101bool wxMacDataBrowserControl::IsItemSelected( DataBrowserItemID item ) const
1102{
1103 return IsDataBrowserItemSelected( m_controlRef, item );
1104}
1105
1106OSStatus wxMacDataBrowserControl::AddItems(
1107 DataBrowserItemID container,
1108 UInt32 numItems,
1109 const DataBrowserItemID *items,
1110 DataBrowserPropertyID preSortProperty )
1111{
1112 return AddDataBrowserItems( m_controlRef, container, numItems, items, preSortProperty );
1113}
1114
1115OSStatus wxMacDataBrowserControl::RemoveItems(
1116 DataBrowserItemID container,
1117 UInt32 numItems,
1118 const DataBrowserItemID *items,
1119 DataBrowserPropertyID preSortProperty )
1120{
1121 return RemoveDataBrowserItems( m_controlRef, container, numItems, items, preSortProperty );
1122}
1123
1124OSStatus wxMacDataBrowserControl::RevealItem(
1125 DataBrowserItemID item,
1126 DataBrowserPropertyID propertyID,
1127 DataBrowserRevealOptions options ) const
1128{
1129 return RevealDataBrowserItem( m_controlRef, item, propertyID, options );
1130}
1131
1132OSStatus wxMacDataBrowserControl::SetSelectedItems(
1133 UInt32 numItems,
1134 const DataBrowserItemID *items,
1135 DataBrowserSetOption operation )
1136{
1137 return SetDataBrowserSelectedItems( m_controlRef, numItems, items, operation );
1138}
1139
1140OSStatus wxMacDataBrowserControl::GetSelectionAnchor( DataBrowserItemID *first, DataBrowserItemID *last ) const
1141{
1142 return GetDataBrowserSelectionAnchor( m_controlRef, first, last );
1143}
1144
1145OSStatus wxMacDataBrowserControl::GetItemID( DataBrowserTableViewRowIndex row, DataBrowserItemID * item ) const
1146{
1147 return GetDataBrowserTableViewItemID( m_controlRef, row, item );
1148}
1149
1150OSStatus wxMacDataBrowserControl::GetItemRow( DataBrowserItemID item, DataBrowserTableViewRowIndex * row ) const
1151{
1152 return GetDataBrowserTableViewItemRow( m_controlRef, item, row );
1153}
1154
1155OSStatus wxMacDataBrowserControl::SetDefaultRowHeight( UInt16 height )
1156{
1157 return SetDataBrowserTableViewRowHeight( m_controlRef , height );
1158}
1159
1160OSStatus wxMacDataBrowserControl::GetDefaultRowHeight( UInt16 * height ) const
1161{
1162 return GetDataBrowserTableViewRowHeight( m_controlRef, height );
1163}
1164
1165OSStatus wxMacDataBrowserControl::SetRowHeight( DataBrowserItemID item , UInt16 height)
1166{
1167 return SetDataBrowserTableViewItemRowHeight( m_controlRef, item , height );
1168}
1169
1170OSStatus wxMacDataBrowserControl::GetRowHeight( DataBrowserItemID item , UInt16 *height) const
1171{
1172 return GetDataBrowserTableViewItemRowHeight( m_controlRef, item , height);
1173}
1174
1175OSStatus wxMacDataBrowserControl::GetColumnWidth( DataBrowserPropertyID column , UInt16 *width ) const
1176{
1177 return GetDataBrowserTableViewNamedColumnWidth( m_controlRef , column , width );
1178}
1179
1180OSStatus wxMacDataBrowserControl::SetColumnWidth( DataBrowserPropertyID column , UInt16 width )
1181{
1182 return SetDataBrowserTableViewNamedColumnWidth( m_controlRef , column , width );
1183}
1184
1185OSStatus wxMacDataBrowserControl::GetDefaultColumnWidth( UInt16 *width ) const
1186{
1187 return GetDataBrowserTableViewColumnWidth( m_controlRef , width );
1188}
1189
1190OSStatus wxMacDataBrowserControl::SetDefaultColumnWidth( UInt16 width )
1191{
1192 return SetDataBrowserTableViewColumnWidth( m_controlRef , width );
1193}
1194
1195OSStatus wxMacDataBrowserControl::GetColumnCount(UInt32* numColumns) const
1196{
1197 return GetDataBrowserTableViewColumnCount( m_controlRef, numColumns);
1198}
1199
1200OSStatus wxMacDataBrowserControl::GetColumnPosition( DataBrowserPropertyID column,
1201 DataBrowserTableViewColumnIndex *position) const
1202{
1203 return GetDataBrowserTableViewColumnPosition( m_controlRef , column , position);
1204}
1205
1206OSStatus wxMacDataBrowserControl::SetColumnPosition( DataBrowserPropertyID column, DataBrowserTableViewColumnIndex position)
1207{
1208 return SetDataBrowserTableViewColumnPosition( m_controlRef , column , position);
1209}
1210
1211OSStatus wxMacDataBrowserControl::GetScrollPosition( UInt32 *top , UInt32 *left ) const
1212{
1213 return GetDataBrowserScrollPosition( m_controlRef , top , left );
1214}
1215
1216OSStatus wxMacDataBrowserControl::SetScrollPosition( UInt32 top , UInt32 left )
1217{
1218 return SetDataBrowserScrollPosition( m_controlRef , top , left );
1219}
1220
1221OSStatus wxMacDataBrowserControl::GetSortProperty( DataBrowserPropertyID *column ) const
1222{
1223 return GetDataBrowserSortProperty( m_controlRef , column );
1224}
1225
1226OSStatus wxMacDataBrowserControl::SetSortProperty( DataBrowserPropertyID column )
1227{
1228 return SetDataBrowserSortProperty( m_controlRef , column );
1229}
1230
1231OSStatus wxMacDataBrowserControl::GetSortOrder( DataBrowserSortOrder *order ) const
1232{
1233 return GetDataBrowserSortOrder( m_controlRef , order );
1234}
1235
1236OSStatus wxMacDataBrowserControl::SetSortOrder( DataBrowserSortOrder order )
1237{
1238 return SetDataBrowserSortOrder( m_controlRef , order );
1239}
1240
1241OSStatus wxMacDataBrowserControl::GetPropertyFlags( DataBrowserPropertyID property,
1242 DataBrowserPropertyFlags *flags ) const
1243{
1244 return GetDataBrowserPropertyFlags( m_controlRef , property , flags );
1245}
1246
1247OSStatus wxMacDataBrowserControl::SetPropertyFlags( DataBrowserPropertyID property,
1248 DataBrowserPropertyFlags flags )
1249{
1250 return SetDataBrowserPropertyFlags( m_controlRef , property , flags );
1251}
1252
1253OSStatus wxMacDataBrowserControl::GetHeaderDesc( DataBrowserPropertyID property,
1254 DataBrowserListViewHeaderDesc *desc ) const
1255{
1256 return GetDataBrowserListViewHeaderDesc( m_controlRef , property , desc );
1257}
1258
1259OSStatus wxMacDataBrowserControl::SetHeaderDesc( DataBrowserPropertyID property,
1260 DataBrowserListViewHeaderDesc *desc )
1261{
1262 return SetDataBrowserListViewHeaderDesc( m_controlRef , property , desc );
1263}
1264
1265OSStatus wxMacDataBrowserControl::SetDisclosureColumn( DataBrowserPropertyID property ,
1266 Boolean expandableRows )
1267{
1268 return SetDataBrowserListViewDisclosureColumn( m_controlRef, property, expandableRows);
1269}
1270
1271// ============================================================================
1272// Higher-level Databrowser
1273// ============================================================================
1274//
1275// basing on data item objects
1276//
1277
1278wxMacDataItem::wxMacDataItem()
1279{
1280 m_data = NULL;
1281
1282 m_order = 0;
1283 m_colId = kTextColumnId; // for compat with existing wx*ListBox impls.
1284}
1285
1286wxMacDataItem::~wxMacDataItem()
1287{
1288}
1289
1290void wxMacDataItem::SetOrder( SInt32 order )
1291{
1292 m_order = order;
1293}
1294
1295SInt32 wxMacDataItem::GetOrder() const
1296{
1297 return m_order;
1298}
1299
1300void wxMacDataItem::SetData( void* data)
1301{
1302 m_data = data;
1303}
1304
1305void* wxMacDataItem::GetData() const
1306{
1307 return m_data;
1308}
1309
1310short wxMacDataItem::GetColumn()
1311{
1312 return m_colId;
1313}
1314
1315void wxMacDataItem::SetColumn( short col )
1316{
1317 m_colId = col;
1318}
1319
1320void wxMacDataItem::SetLabel( const wxString& str)
1321{
1322 m_label = str;
1323 m_cfLabel.Assign( str , wxLocale::GetSystemEncoding());
1324}
1325
1326const wxString& wxMacDataItem::GetLabel() const
1327{
1328 return m_label;
1329}
1330
1331bool wxMacDataItem::IsLessThan(wxMacDataItemBrowserControl *WXUNUSED(owner) ,
1332 const wxMacDataItem* rhs,
1333 DataBrowserPropertyID sortProperty) const
1334{
1335 const wxMacDataItem* otherItem = wx_const_cast(wxMacDataItem*,rhs);
1336 bool retval = false;
1337
1338 if ( sortProperty == m_colId ){
1339 retval = m_label.CmpNoCase( otherItem->m_label) < 0;
1340 }
1341
1342 else if ( sortProperty == kNumericOrderColumnId )
1343 retval = m_order < otherItem->m_order;
1344
1345 return retval;
1346}
1347
1348OSStatus wxMacDataItem::GetSetData( wxMacDataItemBrowserControl *WXUNUSED(owner) ,
1349 DataBrowserPropertyID property,
1350 DataBrowserItemDataRef itemData,
1351 bool changeValue )
1352{
1353 OSStatus err = errDataBrowserPropertyNotSupported;
1354 if ( !changeValue )
1355 {
1356 if ( property == m_colId ){
1357 err = ::SetDataBrowserItemDataText( itemData, m_cfLabel );
1358 err = noErr;
1359 }
1360 else if ( property == kNumericOrderColumnId ){
1361 err = ::SetDataBrowserItemDataValue( itemData, m_order );
1362 err = noErr;
1363 }
1364 else{
1365 }
1366 }
1367 else
1368 {
1369 switch (property)
1370 {
1371 // no editable props here
1372 default:
1373 break;
1374 }
1375 }
1376
1377 return err;
1378}
1379
1380void wxMacDataItem::Notification(wxMacDataItemBrowserControl *WXUNUSED(owner) ,
1381 DataBrowserItemNotification WXUNUSED(message),
1382 DataBrowserItemDataRef WXUNUSED(itemData) ) const
1383{
1384}
1385
1386IMPLEMENT_DYNAMIC_CLASS( wxMacDataItemBrowserControl , wxMacDataBrowserControl )
1387
1388wxMacDataItemBrowserControl::wxMacDataItemBrowserControl( wxWindow* peer , const wxPoint& pos, const wxSize& size, long style) :
1389 wxMacDataBrowserControl( peer, pos, size, style )
1390{
1391 m_suppressSelection = false;
1392 m_sortOrder = SortOrder_None;
1393 m_clientDataItemsType = wxClientData_None;
1394}
1395
1396wxMacDataItem* wxMacDataItemBrowserControl::CreateItem()
1397{
1398 return new wxMacDataItem();
1399}
1400
1401wxMacDataItemBrowserSelectionSuppressor::wxMacDataItemBrowserSelectionSuppressor(wxMacDataItemBrowserControl *browser)
1402{
1403 m_former = browser->SuppressSelection(true);
1404 m_browser = browser;
1405}
1406
1407wxMacDataItemBrowserSelectionSuppressor::~wxMacDataItemBrowserSelectionSuppressor()
1408{
1409 m_browser->SuppressSelection(m_former);
1410}
1411
1412bool wxMacDataItemBrowserControl::SuppressSelection( bool suppress )
1413{
1414 bool former = m_suppressSelection;
1415 m_suppressSelection = suppress;
1416
1417 return former;
1418}
1419
1420Boolean wxMacDataItemBrowserControl::CompareItems(DataBrowserItemID itemOneID,
1421 DataBrowserItemID itemTwoID,
1422 DataBrowserPropertyID sortProperty)
1423{
1424 wxMacDataItem* itemOne = (wxMacDataItem*) itemOneID;
1425 wxMacDataItem* itemTwo = (wxMacDataItem*) itemTwoID;
1426 return CompareItems( itemOne , itemTwo , sortProperty );
1427}
1428
1429Boolean wxMacDataItemBrowserControl::CompareItems(const wxMacDataItem* itemOne,
1430 const wxMacDataItem* itemTwo,
1431 DataBrowserPropertyID sortProperty)
1432{
1433 Boolean retval = false;
1434 if ( itemOne != NULL )
1435 retval = itemOne->IsLessThan( this , itemTwo , sortProperty);
1436 return retval;
1437}
1438
1439OSStatus wxMacDataItemBrowserControl::GetSetItemData(
1440 DataBrowserItemID itemID,
1441 DataBrowserPropertyID property,
1442 DataBrowserItemDataRef itemData,
1443 Boolean changeValue )
1444{
1445 wxMacDataItem* item = (wxMacDataItem*) itemID;
1446 return GetSetItemData(item, property, itemData , changeValue );
1447}
1448
1449OSStatus wxMacDataItemBrowserControl::GetSetItemData(
1450 wxMacDataItem* item,
1451 DataBrowserPropertyID property,
1452 DataBrowserItemDataRef itemData,
1453 Boolean changeValue )
1454{
1455 OSStatus err = errDataBrowserPropertyNotSupported;
1456 switch( property )
1457 {
1458 case kDataBrowserContainerIsClosableProperty :
1459 case kDataBrowserContainerIsSortableProperty :
1460 case kDataBrowserContainerIsOpenableProperty :
1461 // right now default behaviour on these
1462 break;
1463 default :
1464
1465 if ( item != NULL ){
1466 err = item->GetSetData( this, property , itemData , changeValue );
1467 }
1468 break;
1469
1470 }
1471 return err;
1472}
1473
1474void wxMacDataItemBrowserControl::ItemNotification(
1475 DataBrowserItemID itemID,
1476 DataBrowserItemNotification message,
1477 DataBrowserItemDataRef itemData)
1478{
1479 wxMacDataItem* item = (wxMacDataItem*) itemID;
1480 ItemNotification( item , message, itemData);
1481}
1482
1483void wxMacDataItemBrowserControl::ItemNotification(
1484 const wxMacDataItem* item,
1485 DataBrowserItemNotification message,
1486 DataBrowserItemDataRef itemData)
1487{
1488 if (item != NULL)
1489 item->Notification( this, message, itemData);
1490}
1491
1492unsigned int wxMacDataItemBrowserControl::GetItemCount(const wxMacDataItem* container,
1493 bool recurse , DataBrowserItemState state) const
1494{
1495 ItemCount numItems = 0;
1496 verify_noerr( wxMacDataBrowserControl::GetItemCount( (DataBrowserItemID)container,
1497 recurse, state, &numItems ) );
1498 return numItems;
1499}
1500
1501unsigned int wxMacDataItemBrowserControl::GetSelectedItemCount( const wxMacDataItem* container,
1502 bool recurse ) const
1503{
1504 return GetItemCount( container, recurse, kDataBrowserItemIsSelected );
1505
1506}
1507
1508void wxMacDataItemBrowserControl::GetItems(const wxMacDataItem* container,
1509 bool recurse , DataBrowserItemState state, wxArrayMacDataItemPtr &items) const
1510{
1511 Handle handle = NewHandle(0);
1512 verify_noerr( wxMacDataBrowserControl::GetItems( (DataBrowserItemID)container ,
1513 recurse , state, handle) );
1514
1515 int itemCount = GetHandleSize(handle)/sizeof(DataBrowserItemID);
1516 HLock( handle );
1517 wxMacDataItemPtr* itemsArray = (wxMacDataItemPtr*) *handle;
1518 for ( int i = 0; i < itemCount; ++i)
1519 {
1520 items.Add(itemsArray[i]);
1521 }
1522 HUnlock( handle );
1523 DisposeHandle( handle );
1524}
1525
1526unsigned int wxMacDataItemBrowserControl::GetLineFromItem(const wxMacDataItem* item) const
1527{
1528 DataBrowserTableViewRowIndex row;
1529 OSStatus err = GetItemRow( (DataBrowserItemID) item , &row);
1530 wxASSERT( err == noErr);
1531 return row;
1532}
1533
1534wxMacDataItem* wxMacDataItemBrowserControl::GetItemFromLine(unsigned int n) const
1535{
1536 DataBrowserItemID id;
1537 OSStatus err = GetItemID( (DataBrowserTableViewRowIndex) n , &id);
1538 wxASSERT( err == noErr);
1539 return (wxMacDataItem*) id;
1540}
1541
1542void wxMacDataItemBrowserControl::UpdateItem(const wxMacDataItem *container,
1543 const wxMacDataItem *item , DataBrowserPropertyID property) const
1544{
1545 verify_noerr( wxMacDataBrowserControl::UpdateItems((DataBrowserItemID)container, 1,
1546 (DataBrowserItemID*) &item, kDataBrowserItemNoProperty /* notSorted */, property ) );
1547}
1548
1549void wxMacDataItemBrowserControl::UpdateItems(const wxMacDataItem *container,
1550 wxArrayMacDataItemPtr &itemArray , DataBrowserPropertyID property) const
1551{
1552 unsigned int noItems = itemArray.GetCount();
1553 DataBrowserItemID *items = new DataBrowserItemID[noItems];
1554 for ( unsigned int i = 0; i < noItems; ++i )
1555 items[i] = (DataBrowserItemID) itemArray[i];
1556
1557 verify_noerr( wxMacDataBrowserControl::UpdateItems((DataBrowserItemID)container, noItems,
1558 items, kDataBrowserItemNoProperty /* notSorted */, property ) );
1559 delete [] items;
1560}
1561
1562void wxMacDataItemBrowserControl::InsertColumn(int colId, DataBrowserPropertyType colType,
1563 const wxString& title, SInt16 just, int defaultWidth)
1564{
1565 DataBrowserListViewColumnDesc columnDesc;
1566 columnDesc.headerBtnDesc.titleOffset = 0;
1567 columnDesc.headerBtnDesc.version = kDataBrowserListViewLatestHeaderDesc;
1568
1569 columnDesc.headerBtnDesc.btnFontStyle.flags =
1570 kControlUseFontMask | kControlUseJustMask;
1571
1572 columnDesc.headerBtnDesc.btnContentInfo.contentType = kControlContentTextOnly;
1573 columnDesc.headerBtnDesc.btnFontStyle.just = just;
1574 columnDesc.headerBtnDesc.btnFontStyle.font = kControlFontViewSystemFont;
1575 columnDesc.headerBtnDesc.btnFontStyle.style = normal;
1576
1577 // TODO: Why is m_font not defined when we enter wxLC_LIST mode, but is
1578 // defined for other modes?
1579 wxFontEncoding enc;
1580 if ( m_font.Ok() )
1581 enc = m_font.GetEncoding();
1582 else
1583 enc = wxLocale::GetSystemEncoding();
1584 wxMacCFStringHolder cfTitle;
1585 cfTitle.Assign( title, enc );
1586 columnDesc.headerBtnDesc.titleString = cfTitle;
1587
1588 columnDesc.headerBtnDesc.minimumWidth = 0;
1589 columnDesc.headerBtnDesc.maximumWidth = 30000;
1590
1591 columnDesc.propertyDesc.propertyID = (kMinColumnId + colId);
1592 columnDesc.propertyDesc.propertyType = colType;
1593 columnDesc.propertyDesc.propertyFlags = kDataBrowserListViewSortableColumn;
1594 columnDesc.propertyDesc.propertyFlags |= kDataBrowserListViewTypeSelectColumn;
1595 columnDesc.propertyDesc.propertyFlags |= kDataBrowserListViewNoGapForIconInHeaderButton;
1596
1597 verify_noerr( AddColumn( &columnDesc, kDataBrowserListViewAppendColumn ) );
1598
1599 if (defaultWidth > 0){
1600 SetColumnWidth(colId, defaultWidth);
1601 }
1602
1603}
1604
1605void wxMacDataItemBrowserControl::SetColumnWidth(int colId, int width)
1606{
1607 DataBrowserPropertyID id;
1608 GetColumnIDFromIndex(colId, &id);
1609 verify_noerr( wxMacDataBrowserControl::SetColumnWidth(id, width));
1610}
1611
1612int wxMacDataItemBrowserControl::GetColumnWidth(int colId)
1613{
1614 DataBrowserPropertyID id;
1615 GetColumnIDFromIndex(colId, &id);
1616 UInt16 result;
1617 verify_noerr( wxMacDataBrowserControl::GetColumnWidth(id, &result));
1618 return result;
1619}
1620
1621void wxMacDataItemBrowserControl::AddItem(wxMacDataItem *container, wxMacDataItem *item)
1622{
1623 verify_noerr( wxMacDataBrowserControl::AddItems( (DataBrowserItemID)container, 1,
1624 (DataBrowserItemID*) &item, kDataBrowserItemNoProperty ) );
1625}
1626
1627void wxMacDataItemBrowserControl::AddItems(wxMacDataItem *container, wxArrayMacDataItemPtr &itemArray )
1628{
1629 unsigned int noItems = itemArray.GetCount();
1630 DataBrowserItemID *items = new DataBrowserItemID[noItems];
1631 for ( unsigned int i = 0; i < noItems; ++i )
1632 items[i] = (DataBrowserItemID) itemArray[i];
1633
1634 verify_noerr( wxMacDataBrowserControl::AddItems( (DataBrowserItemID)container, noItems,
1635 (DataBrowserItemID*) items, kDataBrowserItemNoProperty ) );
1636 delete [] items;
1637}
1638
1639void wxMacDataItemBrowserControl::RemoveItem(wxMacDataItem *container, wxMacDataItem* item)
1640{
1641 OSStatus err = wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID)container, 1,
1642 (DataBrowserItemID*) &item, kDataBrowserItemNoProperty );
1643 verify_noerr( err );
1644}
1645
1646void wxMacDataItemBrowserControl::RemoveItems(wxMacDataItem *container, wxArrayMacDataItemPtr &itemArray)
1647{
1648 unsigned int noItems = itemArray.GetCount();
1649 DataBrowserItemID *items = new DataBrowserItemID[noItems];
1650 for ( unsigned int i = 0; i < noItems; ++i )
1651 items[i] = (DataBrowserItemID) itemArray[i];
1652
1653 OSStatus err = wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID)container, noItems,
1654 (DataBrowserItemID*) items, kDataBrowserItemNoProperty );
1655 verify_noerr( err );
1656 delete [] items;
1657}
1658
1659void wxMacDataItemBrowserControl::RemoveAllItems(wxMacDataItem *container)
1660{
1661 OSStatus err = wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID)container, 0 , NULL , kDataBrowserItemNoProperty );
1662 verify_noerr( err );
1663}
1664
1665void wxMacDataItemBrowserControl::SetSelectedItem(wxMacDataItem* item , DataBrowserSetOption option)
1666{
1667 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( 1, (DataBrowserItemID*) &item, option ));
1668}
1669
1670void wxMacDataItemBrowserControl::SetSelectedAllItems(DataBrowserSetOption option)
1671{
1672 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( 0 , NULL , option ));
1673}
1674
1675void wxMacDataItemBrowserControl::SetSelectedItems(wxArrayMacDataItemPtr &itemArray , DataBrowserSetOption option)
1676{
1677 unsigned int noItems = itemArray.GetCount();
1678 DataBrowserItemID *items = new DataBrowserItemID[noItems];
1679 for ( unsigned int i = 0; i < noItems; ++i )
1680 items[i] = (DataBrowserItemID) itemArray[i];
1681
1682 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( noItems, (DataBrowserItemID*) items, option ));
1683 delete [] items;
1684}
1685
1686Boolean wxMacDataItemBrowserControl::IsItemSelected( const wxMacDataItem* item) const
1687{
1688 return wxMacDataBrowserControl::IsItemSelected( (DataBrowserItemID) item);
1689}
1690
1691void wxMacDataItemBrowserControl::RevealItem( wxMacDataItem* item, DataBrowserRevealOptions options)
1692{
1693 verify_noerr(wxMacDataBrowserControl::RevealItem( (DataBrowserItemID) item, kDataBrowserNoItem , options ) );
1694}
1695
1696void wxMacDataItemBrowserControl::GetSelectionAnchor( wxMacDataItemPtr* first , wxMacDataItemPtr* last) const
1697{
1698 verify_noerr(wxMacDataBrowserControl::GetSelectionAnchor( (DataBrowserItemID*) first, (DataBrowserItemID*) last) );
1699}
1700
1701wxClientDataType wxMacDataItemBrowserControl::GetClientDataType() const
1702{
1703 return m_clientDataItemsType;
1704}
1705void wxMacDataItemBrowserControl::SetClientDataType(wxClientDataType clientDataItemsType)
1706{
1707 m_clientDataItemsType = clientDataItemsType;
1708}
1709
1710unsigned int wxMacDataItemBrowserControl::MacGetCount() const
1711{
1712 return GetItemCount(wxMacDataBrowserRootContainer,false,kDataBrowserItemAnyState);
1713}
1714
1715void wxMacDataItemBrowserControl::MacDelete( unsigned int n )
1716{
1717 wxMacDataItem* item = (wxMacDataItem*)GetItemFromLine( n );
1718 RemoveItem( wxMacDataBrowserRootContainer, item );
1719}
1720
1721void wxMacDataItemBrowserControl::MacInsert( unsigned int n,
1722 const wxArrayStringsAdapter& items,
1723 int column )
1724{
1725 size_t itemsCount = items.GetCount();
1726 if ( itemsCount == 0 )
1727 return;
1728
1729 SInt32 frontLineOrder = 0;
1730
1731 if ( m_sortOrder == SortOrder_None )
1732 {
1733 // increase the order of the lines to be shifted
1734 unsigned int lines = MacGetCount();
1735 for ( unsigned int i = n; i < lines; ++i)
1736 {
1737 wxMacDataItem* iter = (wxMacDataItem*) GetItemFromLine(i);
1738 iter->SetOrder( iter->GetOrder() + itemsCount );
1739 }
1740 if ( n > 0 )
1741 {
1742 wxMacDataItem* iter = (wxMacDataItem*) GetItemFromLine(n-1);
1743 frontLineOrder = iter->GetOrder();
1744 }
1745 }
1746
1747 wxArrayMacDataItemPtr ids;
1748 ids.SetCount( itemsCount );
1749
1750 for ( unsigned int i = 0; i < itemsCount; ++i )
1751 {
1752 wxMacDataItem* item = CreateItem();
1753 item->SetLabel( items[i]);
1754 if ( column != -1 )
1755 item->SetColumn( kMinColumnId + column );
1756
1757 if ( m_sortOrder == SortOrder_None )
1758 item->SetOrder( frontLineOrder + 1 + i );
1759
1760 ids[i] = item;
1761 }
1762
1763 AddItems( wxMacDataBrowserRootContainer, ids );
1764}
1765
1766int wxMacDataItemBrowserControl::MacAppend( const wxString& text)
1767{
1768 wxMacDataItem* item = CreateItem();
1769 item->SetLabel( text );
1770 if ( m_sortOrder == SortOrder_None )
1771 {
1772 unsigned int lines = MacGetCount();
1773 if ( lines == 0 )
1774 item->SetOrder( 1 );
1775 else
1776 {
1777 wxMacDataItem* frontItem = (wxMacDataItem*) GetItemFromLine(lines-1);
1778 item->SetOrder( frontItem->GetOrder() + 1 );
1779 }
1780 }
1781 AddItem( wxMacDataBrowserRootContainer, item );
1782
1783 return GetLineFromItem(item);
1784}
1785
1786void wxMacDataItemBrowserControl::MacClear()
1787{
1788 wxMacDataItemBrowserSelectionSuppressor suppressor(this);
1789 RemoveAllItems(wxMacDataBrowserRootContainer);
1790}
1791
1792void wxMacDataItemBrowserControl::MacDeselectAll()
1793{
1794 wxMacDataItemBrowserSelectionSuppressor suppressor(this);
1795 SetSelectedAllItems( kDataBrowserItemsRemove );
1796}
1797
1798void wxMacDataItemBrowserControl::MacSetSelection( unsigned int n, bool select, bool multi )
1799{
1800 wxMacDataItem* item = (wxMacDataItem*) GetItemFromLine(n);
1801 wxMacDataItemBrowserSelectionSuppressor suppressor(this);
1802
1803 if ( IsItemSelected( item ) != select )
1804 {
1805 if ( select )
1806 SetSelectedItem( item, multi ? kDataBrowserItemsAdd : kDataBrowserItemsAssign );
1807 else
1808 SetSelectedItem( item, kDataBrowserItemsRemove );
1809 }
1810
1811 MacScrollTo( n );
1812}
1813
1814bool wxMacDataItemBrowserControl::MacIsSelected( unsigned int n ) const
1815{
1816 wxMacDataItem* item = (wxMacDataItem*) GetItemFromLine(n);
1817 return IsItemSelected( item );
1818}
1819
1820int wxMacDataItemBrowserControl::MacGetSelection() const
1821{
1822 wxMacDataItemPtr first, last;
1823 GetSelectionAnchor( &first, &last );
1824
1825 if ( first != NULL )
1826 {
1827 return GetLineFromItem( first );
1828 }
1829
1830 return -1;
1831}
1832
1833int wxMacDataItemBrowserControl::MacGetSelections( wxArrayInt& aSelections ) const
1834{
1835 aSelections.Empty();
1836 wxArrayMacDataItemPtr selectedItems;
1837 GetItems( wxMacDataBrowserRootContainer, false , kDataBrowserItemIsSelected, selectedItems);
1838
1839 int count = selectedItems.GetCount();
1840
1841 for ( int i = 0; i < count; ++i)
1842 {
1843 aSelections.Add(GetLineFromItem(selectedItems[i]));
1844 }
1845
1846 return count;
1847}
1848
1849void wxMacDataItemBrowserControl::MacSetString( unsigned int n, const wxString& text )
1850{
1851 // as we don't store the strings we only have to issue a redraw
1852 wxMacDataItem* item = (wxMacDataItem*) GetItemFromLine( n);
1853 item->SetLabel( text );
1854 UpdateItem( wxMacDataBrowserRootContainer, item , kTextColumnId );
1855}
1856
1857wxString wxMacDataItemBrowserControl::MacGetString( unsigned int n ) const
1858{
1859 wxMacDataItem * item = (wxMacDataItem*) GetItemFromLine( n );
1860 return item->GetLabel();
1861}
1862
1863void wxMacDataItemBrowserControl::MacSetClientData( unsigned int n, void * data)
1864{
1865 wxMacDataItem* item = (wxMacDataItem*) GetItemFromLine( n);
1866 item->SetData( data );
1867 // not displayed, therefore no Update infos to DataBrowser
1868}
1869
1870void * wxMacDataItemBrowserControl::MacGetClientData( unsigned int n) const
1871{
1872 wxMacDataItem * item = (wxMacDataItem*) GetItemFromLine( n );
1873 return item->GetData();
1874}
1875
1876void wxMacDataItemBrowserControl::MacScrollTo( unsigned int n )
1877{
1878 UInt32 top , left ;
1879 GetScrollPosition( &top , &left ) ;
1880 wxMacDataItem * item = (wxMacDataItem*) GetItemFromLine( n );
1881
1882 UInt16 height ;
1883 GetRowHeight( (DataBrowserItemID) item , &height ) ;
1884 SetScrollPosition( n * ((UInt32)height) , left ) ;
1885
1886 RevealItem( item , kDataBrowserRevealWithoutSelecting );
1887}
1888
1889
1890
1891//
1892// Tab Control
1893//
1894
1895OSStatus wxMacControl::SetTabEnabled( SInt16 tabNo , bool enable )
1896{
1897 return ::SetTabEnabled( m_controlRef , tabNo , enable );
1898}
1899
1900#endif
1901
1902//
1903// Quartz Support
1904//
1905
1906/*
1907 Return the generic RGB color space. This is a 'get' function and the caller should
1908 not release the returned value unless the caller retains it first. Usually callers
1909 of this routine will immediately use the returned colorspace with CoreGraphics
1910 so they typically do not need to retain it themselves.
1911
1912 This function creates the generic RGB color space once and hangs onto it so it can
1913 return it whenever this function is called.
1914*/
1915
1916CGColorSpaceRef wxMacGetGenericRGBColorSpace()
1917{
1918 static wxMacCFRefHolder<CGColorSpaceRef> genericRGBColorSpace;
1919
1920 if (genericRGBColorSpace == NULL)
1921 {
1922 genericRGBColorSpace.Set( CGColorSpaceCreateWithName( kCGColorSpaceGenericRGB ) );
1923 }
1924
1925 return genericRGBColorSpace;
1926}
1927
1928CGColorRef wxMacCreateCGColorFromHITheme( ThemeBrush brush )
1929{
1930 CGColorRef color ;
1931 HIThemeBrushCreateCGColor( brush, &color );
1932 return color;
1933}
1934
1935#ifndef __LP64__
1936
1937wxMacPortSaver::wxMacPortSaver( GrafPtr port )
1938{
1939 ::GetPort( &m_port );
1940 ::SetPort( port );
1941}
1942
1943wxMacPortSaver::~wxMacPortSaver()
1944{
1945 ::SetPort( m_port );
1946}
1947#endif
1948
1949#if wxMAC_USE_QUICKDRAW
1950
1951void wxMacGlobalToLocal( WindowRef window , Point*pt )
1952{
1953 HIPoint p = CGPointMake( pt->h, pt->v );
1954 HIViewRef contentView ;
1955 // TODO check toolbar offset
1956 HIViewFindByID( HIViewGetRoot( window ), kHIViewWindowContentID , &contentView) ;
1957 HIPointConvert( &p, kHICoordSpace72DPIGlobal, NULL, kHICoordSpaceView, contentView );
1958 pt->h = p.x;
1959 pt->v = p.y;
1960}
1961
1962void wxMacLocalToGlobal( WindowRef window , Point*pt )
1963{
1964 HIPoint p = CGPointMake( pt->h, pt->v );
1965 HIViewRef contentView ;
1966 // TODO check toolbar offset
1967 HIViewFindByID( HIViewGetRoot( window ), kHIViewWindowContentID , &contentView) ;
1968 HIPointConvert( &p, kHICoordSpaceView, contentView, kHICoordSpace72DPIGlobal, NULL );
1969 pt->h = p.x;
1970 pt->v = p.y;
1971}
1972#endif
1973
1974#endif // wxUSE_GUI