]> git.saurik.com Git - wxWidgets.git/blame_incremental - src/mac/carbon/uma.cpp
Applied DnD patch, adding a field for setting a default action.
[wxWidgets.git] / src / mac / carbon / uma.cpp
... / ...
CommitLineData
1/////////////////////////////////////////////////////////////////////////////
2// Name: uma.cpp
3// Purpose: UMA support
4// Author: Stefan Csomor
5// Modified by:
6// Created: 04/01/98
7// RCS-ID: $Id$
8// Copyright: (c) Stefan Csomor
9// Licence: The wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12#include "wx/wxprec.h"
13
14#if wxUSE_GUI
15
16#include "wx/dc.h"
17#include <MacTextEditor.h>
18
19#ifndef __DARWIN__
20# include <Navigation.h>
21# if defined(TARGET_CARBON)
22# if PM_USE_SESSION_APIS
23# include <PMCore.h>
24# endif
25# include <PMApplication.h>
26# else
27# include <Printing.h>
28# endif
29#endif
30
31#ifndef __DARWIN__
32#include <Scrap.h>
33#endif
34#include "wx/mac/uma.h"
35
36#if TARGET_API_MAC_OSX
37#include "wx/toplevel.h"
38#endif
39
40// since we have decided that we only support 8.6 upwards we are
41// checking for these minimum requirements in the startup code of
42// the application so all wxWidgets code can safely assume that appearance 1.1
43// windows manager, control manager, navigation services etc. are
44// present
45
46static bool sUMAHasAppearance = false ;
47static long sUMAAppearanceVersion = 0 ;
48static long sUMASystemVersion = 0 ;
49static bool sUMAHasAquaLayout = false ;
50
51static bool sUMAHasInittedAppearance = false;
52
53extern int gAGABackgroundColor ;
54bool UMAHasAppearance() { return sUMAHasAppearance ; }
55long UMAGetAppearanceVersion() { return sUMAAppearanceVersion ; }
56long UMAGetSystemVersion() { return sUMASystemVersion ; }
57
58static bool sUMAHasWindowManager = false ;
59static long sUMAWindowManagerAttr = 0 ;
60
61bool UMAHasWindowManager() { return sUMAHasWindowManager ; }
62long UMAGetWindowManagerAttr() { return sUMAWindowManagerAttr ; }
63bool UMAHasAquaLayout() { return sUMAHasAquaLayout ; }
64
65
66void UMACleanupToolbox()
67{
68 if (sUMAHasInittedAppearance)
69 {
70 UnregisterAppearanceClient() ;
71 }
72 if ( NavServicesAvailable() )
73 {
74 NavUnload() ;
75 }
76 if ( TXNTerminateTextension != (void*) kUnresolvedCFragSymbolAddress )
77 TXNTerminateTextension( ) ;
78}
79void UMAInitToolbox( UInt16 inMoreMastersCalls, bool isEmbedded )
80{
81#if !TARGET_CARBON
82 ::MaxApplZone();
83 for (long i = 1; i <= inMoreMastersCalls; i++)
84 ::MoreMasters();
85
86 if (!isEmbedded)
87 {
88 ::InitGraf(&qd.thePort);
89 ::InitFonts();
90 ::InitMenus();
91 ::TEInit();
92 ::InitDialogs(0L);
93 ::FlushEvents(everyEvent, 0);
94 }
95
96 long total,contig;
97 PurgeSpace(&total, &contig);
98#endif
99
100 ::InitCursor();
101
102 if ( Gestalt(gestaltSystemVersion, &sUMASystemVersion) != noErr)
103 sUMASystemVersion = 0x0000 ;
104
105 long theAppearance ;
106 if ( Gestalt( gestaltAppearanceAttr, &theAppearance ) == noErr )
107 {
108 sUMAHasAppearance = true ;
109 OSStatus status = RegisterAppearanceClient();
110 // If status equals appearanceProcessRegisteredErr it means the
111 // appearance client already was registered (For example if we run
112 // embedded, the host might have registered it). In such a case
113 // we don't unregister it later on.
114 if (status != appearanceProcessRegisteredErr)
115 {
116 // Appearance client wasn't registered yet.
117 sUMAHasInittedAppearance = true;
118 }
119
120 if ( Gestalt( gestaltAppearanceVersion, &theAppearance ) == noErr )
121 {
122 sUMAAppearanceVersion = theAppearance ;
123 }
124 else
125 {
126 sUMAAppearanceVersion = 0x0100 ;
127 }
128 }
129 if ( Gestalt( gestaltWindowMgrAttr, &sUMAWindowManagerAttr ) == noErr )
130 {
131 sUMAHasWindowManager = sUMAWindowManagerAttr & gestaltWindowMgrPresent ;
132 }
133
134#if TARGET_CARBON
135// Call currently implicitely done : InitFloatingWindows() ;
136#else
137 if (!isEmbedded)
138 {
139 if ( sUMAHasWindowManager )
140 InitFloatingWindows() ;
141 else
142 InitWindows();
143 }
144#endif
145
146 if ( NavServicesAvailable() )
147 {
148 NavLoad() ;
149 }
150
151 long menuMgrAttr ;
152 Gestalt( gestaltMenuMgrAttr , &menuMgrAttr ) ;
153 if ( menuMgrAttr & gestaltMenuMgrAquaLayoutMask )
154 sUMAHasAquaLayout = true ;
155
156 if ( TXNInitTextension != (void*) kUnresolvedCFragSymbolAddress )
157 {
158 FontFamilyID fontId ;
159 Str255 fontName ;
160 SInt16 fontSize ;
161 Style fontStyle ;
162 GetThemeFont(kThemeSmallSystemFont , GetApplicationScript() , fontName , &fontSize , &fontStyle ) ;
163 GetFNum( fontName, &fontId );
164
165 TXNMacOSPreferredFontDescription fontDescriptions[] =
166 {
167 { fontId , (fontSize << 16) ,kTXNDefaultFontStyle, kTXNSystemDefaultEncoding }
168 } ;
169 int noOfFontDescriptions = sizeof( fontDescriptions ) / sizeof(TXNMacOSPreferredFontDescription) ;
170
171 OptionBits options = 0 ;
172
173 if ( UMAGetSystemVersion() < 0x1000 )
174 {
175 options |= kTXNAlwaysUseQuickDrawTextMask ;
176 }
177 TXNInitTextension(fontDescriptions, noOfFontDescriptions, options );
178 }
179
180
181 UMASetSystemIsInitialized(true);
182
183}
184
185/*
186Boolean CanUseATSUI()
187 {
188 long result;
189 OSErr err = Gestalt(gestaltATSUVersion, &result);
190 return (err == noErr);
191 }
192*/
193// process manager
194long UMAGetProcessMode()
195{
196 OSErr err ;
197 ProcessInfoRec processinfo;
198 ProcessSerialNumber procno ;
199
200 procno.highLongOfPSN = 0 ;
201 procno.lowLongOfPSN = kCurrentProcess ;
202 processinfo.processInfoLength = sizeof(ProcessInfoRec);
203 processinfo.processName = NULL;
204 processinfo.processAppSpec = NULL;
205
206 err = ::GetProcessInformation( &procno , &processinfo ) ;
207 wxASSERT( err == noErr ) ;
208 return processinfo.processMode ;
209}
210
211bool UMAGetProcessModeDoesActivateOnFGSwitch()
212{
213 return UMAGetProcessMode() & modeDoesActivateOnFGSwitch ;
214}
215
216// menu manager
217
218MenuRef UMANewMenu( SInt16 id , const wxString& title , wxFontEncoding encoding )
219{
220 wxString str = wxStripMenuCodes( title ) ;
221 MenuRef menu ;
222#if TARGET_CARBON
223 CreateNewMenu( id , 0 , &menu ) ;
224 SetMenuTitleWithCFString( menu , wxMacCFStringHolder(str , encoding ) ) ;
225#else
226 Str255 ptitle ;
227 wxMacStringToPascal( str , ptitle ) ;
228 menu = ::NewMenu( id , ptitle ) ;
229#endif
230 return menu ;
231}
232
233void UMASetMenuTitle( MenuRef menu , const wxString& title , wxFontEncoding encoding)
234{
235 wxString str = wxStripMenuCodes( title ) ;
236#if TARGET_CARBON
237 SetMenuTitleWithCFString( menu , wxMacCFStringHolder(str , encoding) ) ;
238#else
239 Str255 ptitle ;
240 wxMacStringToPascal( str , ptitle ) ;
241 SetMenuTitle( menu , ptitle ) ;
242#endif
243}
244
245void UMASetMenuItemText( MenuRef menu, MenuItemIndex item, const wxString& title , wxFontEncoding encoding)
246{
247 wxString str = wxStripMenuCodes( title ) ;
248#if TARGET_CARBON
249 SetMenuItemTextWithCFString( menu , item , wxMacCFStringHolder(str , encoding) ) ;
250#else
251 Str255 ptitle ;
252 wxMacStringToPascal( str , ptitle ) ;
253 SetMenuItemText( menu , item , ptitle ) ;
254#endif
255}
256
257
258UInt32 UMAMenuEvent( EventRecord *inEvent )
259{
260 return MenuEvent( inEvent ) ;
261}
262
263void UMAEnableMenuItem( MenuRef inMenu , MenuItemIndex inItem , bool enable)
264{
265 if ( enable )
266 EnableMenuItem( inMenu , inItem ) ;
267 else
268 DisableMenuItem( inMenu , inItem ) ;
269}
270
271void UMAAppendSubMenuItem( MenuRef menu , const wxString& title, wxFontEncoding encoding , SInt16 id )
272{
273 MacAppendMenu(menu, "\pA");
274 UMASetMenuItemText(menu, (SInt16) ::CountMenuItems(menu), title , encoding );
275 SetMenuItemHierarchicalID( menu , CountMenuItems( menu ) , id ) ;
276}
277
278void UMAInsertSubMenuItem( MenuRef menu , const wxString& title, wxFontEncoding encoding , MenuItemIndex item , SInt16 id )
279{
280 MacInsertMenuItem(menu, "\pA" , item);
281 UMASetMenuItemText(menu, item+1, title , encoding);
282 SetMenuItemHierarchicalID( menu , item+1 , id ) ;
283}
284
285void UMASetMenuItemShortcut( MenuRef menu , MenuItemIndex item , wxAcceleratorEntry *entry )
286{
287 if ( !entry )
288 return ;
289
290 UInt8 modifiers = 0 ;
291 SInt16 key = entry->GetKeyCode() ;
292 if ( key )
293 {
294 bool explicitCommandKey = false ;
295
296 if ( entry->GetFlags() & wxACCEL_CTRL )
297 {
298 explicitCommandKey = true ;
299 }
300
301 if (entry->GetFlags() & wxACCEL_ALT )
302 {
303 modifiers |= kMenuOptionModifier ;
304 }
305
306 if (entry->GetFlags() & wxACCEL_SHIFT)
307 {
308 modifiers |= kMenuShiftModifier ;
309 }
310
311 SInt16 glyph = 0 ;
312 SInt16 macKey = key ;
313 if ( key >= WXK_F1 && key <= WXK_F15 )
314 {
315 // for some reasons this must be 0 right now
316 // everything else leads to just the first function key item
317 // to be selected. Thanks to Ryan Wilcox for finding out.
318 macKey = 0 ;
319 glyph = kMenuF1Glyph + ( key - WXK_F1 ) ;
320 if ( key >= WXK_F13 )
321 glyph += 13 ;
322 if ( !explicitCommandKey )
323 modifiers |= kMenuNoCommandModifier ;
324 }
325 else
326 {
327 switch( key )
328 {
329 case WXK_BACK :
330 macKey = kBackspaceCharCode ;
331 glyph = kMenuDeleteLeftGlyph ;
332 break ;
333 case WXK_TAB :
334 macKey = kTabCharCode ;
335 glyph = kMenuTabRightGlyph ;
336 break ;
337 case kEnterCharCode :
338 macKey = kEnterCharCode ;
339 glyph = kMenuEnterGlyph ;
340 break ;
341 case WXK_RETURN :
342 macKey = kReturnCharCode ;
343 glyph = kMenuReturnGlyph ;
344 break ;
345 case WXK_ESCAPE :
346 macKey = kEscapeCharCode ;
347 glyph = kMenuEscapeGlyph ;
348 break ;
349 case WXK_SPACE :
350 macKey = ' ' ;
351 glyph = kMenuSpaceGlyph ;
352 break ;
353 case WXK_DELETE :
354 macKey = kDeleteCharCode ;
355 glyph = kMenuDeleteRightGlyph ;
356 break ;
357 case WXK_CLEAR :
358 macKey = kClearCharCode ;
359 glyph = kMenuClearGlyph ;
360 break ;
361 case WXK_PRIOR : // PAGE UP
362 macKey = kPageUpCharCode ;
363 glyph = kMenuPageUpGlyph ;
364 break ;
365 case WXK_NEXT :
366 macKey = kPageDownCharCode ;
367 glyph = kMenuPageDownGlyph ;
368 break ;
369 case WXK_LEFT :
370 macKey = kLeftArrowCharCode ;
371 glyph = kMenuLeftArrowGlyph ;
372 break ;
373 case WXK_UP :
374 macKey = kUpArrowCharCode ;
375 glyph = kMenuUpArrowGlyph ;
376 break ;
377 case WXK_RIGHT :
378 macKey = kRightArrowCharCode ;
379 glyph = kMenuRightArrowGlyph ;
380 break ;
381 case WXK_DOWN :
382 macKey = kDownArrowCharCode ;
383 glyph = kMenuDownArrowGlyph ;
384 break ;
385 default :
386 macKey = toupper( key ) ;
387 break ;
388 }
389 // we now allow non command key shortcuts
390 // remove in case this gives problems
391 if ( !explicitCommandKey )
392 modifiers |= kMenuNoCommandModifier ;
393 }
394
395 // 1d and 1e have special meaning to SetItemCmd, so
396 // do not use for these character codes.
397 if (key != WXK_UP && key != WXK_RIGHT)
398 SetItemCmd( menu, item , macKey );
399
400 SetMenuItemModifiers(menu, item , modifiers ) ;
401
402 if ( glyph )
403 SetMenuItemKeyGlyph(menu, item , glyph ) ;
404 }
405}
406
407void UMAAppendMenuItem( MenuRef menu , const wxString& title, wxFontEncoding encoding , wxAcceleratorEntry *entry )
408{
409 MacAppendMenu(menu, "\pA");
410 // don't attempt to interpret metacharacters like a '-' at the beginning (would become a separator otherwise)
411 ChangeMenuItemAttributes( menu , ::CountMenuItems(menu), kMenuItemAttrIgnoreMeta , 0 ) ;
412 UMASetMenuItemText(menu, (SInt16) ::CountMenuItems(menu), title , encoding );
413 UMASetMenuItemShortcut( menu , (SInt16) ::CountMenuItems(menu), entry ) ;
414}
415
416void UMAInsertMenuItem( MenuRef menu , const wxString& title, wxFontEncoding encoding , MenuItemIndex item , wxAcceleratorEntry *entry )
417{
418 MacInsertMenuItem( menu , "\pA" , item) ;
419 // don't attempt to interpret metacharacters like a '-' at the beginning (would become a separator otherwise)
420 ChangeMenuItemAttributes( menu , item+1, kMenuItemAttrIgnoreMeta , 0 ) ;
421 UMASetMenuItemText(menu, item+1 , title , encoding );
422 UMASetMenuItemShortcut( menu , item+1 , entry ) ;
423}
424
425// quickdraw
426
427#if !TARGET_CARBON
428
429int gPrOpenCounter = 0 ;
430
431OSStatus UMAPrOpen()
432{
433 OSErr err = noErr ;
434 ++gPrOpenCounter ;
435 if ( gPrOpenCounter == 1 )
436 {
437 PrOpen() ;
438 err = PrError() ;
439 wxASSERT( err == noErr ) ;
440 }
441 return err ;
442}
443
444OSStatus UMAPrClose()
445{
446 OSErr err = noErr ;
447 wxASSERT( gPrOpenCounter >= 1 ) ;
448 if ( gPrOpenCounter == 1 )
449 {
450 PrClose() ;
451 err = PrError() ;
452 wxASSERT( err == noErr ) ;
453 }
454 --gPrOpenCounter ;
455 return err ;
456}
457
458pascal QDGlobalsPtr GetQDGlobalsPtr (void) ;
459pascal QDGlobalsPtr GetQDGlobalsPtr (void)
460{
461 return QDGlobalsPtr (* (Ptr*) LMGetCurrentA5 ( ) - 0xCA);
462}
463
464#endif
465
466void UMAShowWatchCursor()
467{
468 OSErr err = noErr;
469
470 CursHandle watchFob = GetCursor (watchCursor);
471
472 if (!watchFob)
473 err = nilHandleErr;
474 else
475 {
476 #if TARGET_CARBON
477// Cursor preservedArrow;
478// GetQDGlobalsArrow (&preservedArrow);
479// SetQDGlobalsArrow (*watchFob);
480// InitCursor ( );
481// SetQDGlobalsArrow (&preservedArrow);
482 SetCursor (*watchFob);
483 #else
484 SetCursor (*watchFob);
485 #endif
486 }
487}
488
489void UMAShowArrowCursor()
490{
491#if TARGET_CARBON
492 Cursor arrow;
493 SetCursor (GetQDGlobalsArrow (&arrow));
494#else
495 SetCursor (&(qd.arrow));
496#endif
497}
498
499// window manager
500
501GrafPtr UMAGetWindowPort( WindowRef inWindowRef )
502{
503 wxASSERT( inWindowRef != NULL ) ;
504#if TARGET_CARBON
505 return (GrafPtr) GetWindowPort( inWindowRef ) ;
506#else
507 return (GrafPtr) inWindowRef ;
508#endif
509}
510
511void UMADisposeWindow( WindowRef inWindowRef )
512{
513 wxASSERT( inWindowRef != NULL ) ;
514 DisposeWindow( inWindowRef ) ;
515}
516
517void UMASetWTitle( WindowRef inWindowRef , const wxString& title , wxFontEncoding encoding)
518{
519#if TARGET_CARBON
520 SetWindowTitleWithCFString( inWindowRef , wxMacCFStringHolder(title , encoding) ) ;
521#else
522 Str255 ptitle ;
523 wxMacStringToPascal( title , ptitle ) ;
524 SetWTitle( inWindowRef , ptitle ) ;
525#endif
526}
527
528// appearance additions
529
530void UMASetControlTitle( ControlRef inControl , const wxString& title , wxFontEncoding encoding)
531{
532#if TARGET_CARBON
533 SetControlTitleWithCFString( inControl , wxMacCFStringHolder(title , encoding) ) ;
534#else
535 Str255 ptitle ;
536 wxMacStringToPascal( title , ptitle ) ;
537 SetControlTitle( inControl , ptitle ) ;
538#endif
539}
540
541void UMAActivateControl( ControlRef inControl )
542{
543#if !TARGET_API_MAC_OSX
544 // we have to add the control after again to the update rgn
545 // otherwise updates get lost
546 if ( !IsControlActive( inControl ) )
547 {
548 bool visible = IsControlVisible( inControl ) ;
549 if ( visible )
550 SetControlVisibility( inControl , false , false ) ;
551#endif
552 ::ActivateControl( inControl ) ;
553#if !TARGET_API_MAC_OSX
554 if ( visible ) {
555 SetControlVisibility( inControl , true , false ) ;
556
557 Rect ctrlBounds ;
558 InvalWindowRect(GetControlOwner(inControl),UMAGetControlBoundsInWindowCoords(inControl,&ctrlBounds) ) ;
559 }
560 }
561#endif
562}
563
564void UMAMoveControl( ControlRef inControl , short x , short y )
565{
566#if !TARGET_API_MAC_OSX
567 bool visible = IsControlVisible( inControl ) ;
568 if ( visible ) {
569 SetControlVisibility( inControl , false , false ) ;
570 Rect ctrlBounds ;
571 InvalWindowRect(GetControlOwner(inControl),GetControlBounds(inControl,&ctrlBounds) ) ;
572 }
573#endif
574 ::MoveControl( inControl , x , y ) ;
575#if !TARGET_API_MAC_OSX
576 if ( visible ) {
577 SetControlVisibility( inControl , true , false ) ;
578 Rect ctrlBounds ;
579 InvalWindowRect(GetControlOwner(inControl),GetControlBounds(inControl,&ctrlBounds) ) ;
580 }
581#endif
582}
583
584void UMASizeControl( ControlRef inControl , short x , short y )
585{
586#if !TARGET_API_MAC_OSX
587 bool visible = IsControlVisible( inControl ) ;
588 if ( visible ) {
589 SetControlVisibility( inControl , false , false ) ;
590 Rect ctrlBounds ;
591 InvalWindowRect(GetControlOwner(inControl),GetControlBounds(inControl,&ctrlBounds) ) ;
592 }
593#endif
594 ::SizeControl( inControl , x , y ) ;
595#if !TARGET_API_MAC_OSX
596 if ( visible ) {
597 SetControlVisibility( inControl , true , false ) ;
598 Rect ctrlBounds ;
599 InvalWindowRect(GetControlOwner(inControl),GetControlBounds(inControl,&ctrlBounds) ) ;
600 }
601#endif
602}
603
604void UMADeactivateControl( ControlRef inControl )
605{
606#if !TARGET_API_MAC_OSX
607 // we have to add the control after again to the update rgn
608 // otherwise updates get lost
609 bool visible = IsControlVisible( inControl ) ;
610 if ( visible )
611 SetControlVisibility( inControl , false , false ) ;
612#endif
613 ::DeactivateControl( inControl ) ;
614#if !TARGET_API_MAC_OSX
615 if ( visible ) {
616 SetControlVisibility( inControl , true , false ) ;
617 Rect ctrlBounds ;
618 InvalWindowRect(GetControlOwner(inControl),UMAGetControlBoundsInWindowCoords(inControl,&ctrlBounds) ) ;
619 }
620#endif
621}
622// shows the control and adds the region to the update region
623void UMAShowControl (ControlRef inControl)
624{
625 SetControlVisibility( inControl , true , false ) ;
626 Rect ctrlBounds ;
627 InvalWindowRect(GetControlOwner(inControl),UMAGetControlBoundsInWindowCoords(inControl,&ctrlBounds) ) ;
628}
629
630// hides the control and adds the region to the update region
631void UMAHideControl (ControlRef inControl)
632{
633 SetControlVisibility( inControl , false , false ) ;
634 Rect ctrlBounds ;
635 InvalWindowRect(GetControlOwner(inControl),UMAGetControlBoundsInWindowCoords(inControl,&ctrlBounds) ) ;
636}
637// keyboard focus
638OSErr UMASetKeyboardFocus (WindowPtr inWindow,
639 ControlRef inControl,
640 ControlFocusPart inPart)
641{
642 OSErr err = noErr;
643 GrafPtr port ;
644 GetPort( &port ) ;
645
646 SetPortWindowPort( inWindow ) ;
647
648 err = SetKeyboardFocus( inWindow , inControl , inPart ) ;
649 SetPort( port ) ;
650 return err ;
651}
652
653bool UMAIsWindowFloating( WindowRef inWindow )
654{
655 WindowClass cl ;
656
657 GetWindowClass( inWindow , &cl ) ;
658 return cl == kFloatingWindowClass ;
659}
660
661bool UMAIsWindowModal( WindowRef inWindow )
662{
663 WindowClass cl ;
664
665 GetWindowClass( inWindow , &cl ) ;
666 return cl < kFloatingWindowClass ;
667}
668
669// others
670
671void UMAHighlightAndActivateWindow( WindowRef inWindowRef , bool inActivate )
672{
673 if ( inWindowRef )
674 {
675// bool isHighlighted = IsWindowHighlited( inWindowRef ) ;
676// if ( inActivate != isHightlited )
677 GrafPtr port ;
678 GetPort( &port ) ;
679 SetPortWindowPort( inWindowRef ) ;
680 HiliteWindow( inWindowRef , inActivate ) ;
681 ControlRef control = NULL ;
682 ::GetRootControl( inWindowRef , & control ) ;
683 if ( control )
684 {
685 if ( inActivate )
686 UMAActivateControl( control ) ;
687 else
688 UMADeactivateControl( control ) ;
689 }
690 SetPort( port ) ;
691 }
692}
693
694OSStatus UMADrawThemePlacard( const Rect *inRect , ThemeDrawState inState )
695{
696 return ::DrawThemePlacard( inRect , inState ) ;
697}
698
699#if !TARGET_CARBON
700static OSStatus helpMenuStatus = noErr ;
701static MenuItemIndex firstCustomItemIndex = 0 ;
702#endif
703
704OSStatus UMAGetHelpMenu(
705 MenuRef * outHelpMenu,
706 MenuItemIndex * outFirstCustomItemIndex)
707{
708#if TARGET_CARBON
709 return HMGetHelpMenu( outHelpMenu , outFirstCustomItemIndex ) ;
710#else
711 MenuRef helpMenuHandle ;
712 helpMenuStatus = HMGetHelpMenuHandle( &helpMenuHandle ) ;
713 if ( firstCustomItemIndex == 0 && helpMenuStatus == noErr )
714 {
715 firstCustomItemIndex = CountMenuItems( helpMenuHandle ) + 1 ;
716 }
717 if ( outFirstCustomItemIndex )
718 {
719 *outFirstCustomItemIndex = firstCustomItemIndex ;
720 }
721 *outHelpMenu = helpMenuHandle ;
722 return helpMenuStatus ;
723#endif
724}
725
726wxMacPortStateHelper::wxMacPortStateHelper( GrafPtr newport)
727{
728 m_clip = NULL ;
729 Setup( newport ) ;
730}
731
732wxMacPortStateHelper::wxMacPortStateHelper()
733{
734 m_clip = NULL ;
735}
736
737void wxMacPortStateHelper::Setup( GrafPtr newport )
738{
739 GetPort( &m_oldPort ) ;
740 SetPort( newport ) ;
741 SetOrigin(0,0);
742 wxASSERT_MSG( m_clip == NULL , wxT("Cannot call setup twice") ) ;
743 m_clip = NewRgn() ;
744 GetClip( m_clip );
745 m_textFont = GetPortTextFont( (CGrafPtr) newport);
746 m_textSize = GetPortTextSize( (CGrafPtr) newport);
747 m_textStyle = GetPortTextFace( (CGrafPtr) newport);
748 m_textMode = GetPortTextMode( (CGrafPtr) newport);
749 GetThemeDrawingState( &m_drawingState ) ;
750 m_currentPort = newport ;
751}
752void wxMacPortStateHelper::Clear()
753{
754 if ( m_clip )
755 {
756 DisposeRgn( m_clip ) ;
757 DisposeThemeDrawingState( m_drawingState ) ;
758 m_clip = NULL ;
759 }
760}
761
762wxMacPortStateHelper::~wxMacPortStateHelper()
763{
764 if ( m_clip )
765 {
766 SetPort( m_currentPort ) ;
767 SetClip( m_clip ) ;
768 DisposeRgn( m_clip ) ;
769 TextFont( m_textFont );
770 TextSize( m_textSize );
771 TextFace( m_textStyle );
772 TextMode( m_textMode );
773 SetThemeDrawingState( m_drawingState , true ) ;
774 SetPort( m_oldPort ) ;
775 }
776}
777
778OSStatus UMAPutScrap( Size size , OSType type , void *data )
779{
780 OSStatus err = noErr ;
781#if !TARGET_CARBON
782 err = PutScrap( size , type , data ) ;
783#else
784 ScrapRef scrap;
785 err = GetCurrentScrap (&scrap);
786 if ( !err )
787 {
788 err = PutScrapFlavor (scrap, type , 0, size, data);
789 }
790#endif
791 return err ;
792}
793
794Rect* UMAGetControlBoundsInWindowCoords(ControlRef theControl, Rect *bounds)
795{
796 GetControlBounds( theControl , bounds ) ;
797#if TARGET_API_MAC_OSX
798 WindowRef tlwref = GetControlOwner( theControl ) ;
799
800 wxTopLevelWindowMac* tlwwx = wxFindWinFromMacWindow( tlwref ) ;
801 if ( tlwwx->MacUsesCompositing() )
802 {
803 ControlRef rootControl = tlwwx->GetPeer()->GetControlRef() ;
804 HIPoint hiPoint = CGPointMake( 0 , 0 ) ;
805 HIViewConvertPoint( &hiPoint , HIViewGetSuperview(theControl) , rootControl ) ;
806 OffsetRect( bounds , (short) hiPoint.x , (short) hiPoint.y ) ;
807 }
808#endif
809 return bounds ;
810}
811
812
813#endif // wxUSE_GUI
814
815#if wxUSE_BASE
816
817static bool sUMASystemInitialized = false ;
818
819bool UMASystemIsInitialized()
820{
821 return sUMASystemInitialized ;
822}
823
824void UMASetSystemIsInitialized(bool val)
825{
826 sUMASystemInitialized = val;
827}
828
829
830#endif // wxUSE_BASE