1 ///////////////////////////////////////////////////////////////////////////// 
   2 // Name:        src/mac/carbon/window.cpp 
   3 // Purpose:     wxWindowMac 
   4 // Author:      Stefan Csomor 
   8 // Copyright:   (c) Stefan Csomor 
   9 // Licence:     wxWindows licence 
  10 ///////////////////////////////////////////////////////////////////////////// 
  12 #include "wx/wxprec.h" 
  15 #include "wx/window.h" 
  17 #include "wx/dcclient.h" 
  21 #include "wx/layout.h" 
  22 #include "wx/dialog.h" 
  23 #include "wx/scrolbar.h" 
  24 #include "wx/statbox.h" 
  25 #include "wx/button.h" 
  26 #include "wx/settings.h" 
  27 #include "wx/msgdlg.h" 
  29 #include "wx/tooltip.h" 
  30 #include "wx/statusbr.h" 
  31 #include "wx/menuitem.h" 
  32 #include "wx/spinctrl.h" 
  34 #include "wx/geometry.h" 
  35 #include "wx/textctrl.h" 
  37 #include "wx/toolbar.h" 
  44 #if wxUSE_DRAG_AND_DROP 
  48 #include "wx/mac/uma.h" 
  50 #define MAC_SCROLLBAR_SIZE 15 
  51 #define MAC_SMALL_SCROLLBAR_SIZE 11 
  55 #include <ToolUtils.h> 
  57 #include <MacTextEditor.h> 
  60 #if TARGET_API_MAC_OSX 
  62     #include <HIToolbox/HIView.h> 
  68 extern wxList wxPendingDelete
; 
  70 #ifdef __WXUNIVERSAL__ 
  71     IMPLEMENT_ABSTRACT_CLASS(wxWindowMac
, wxWindowBase
) 
  73     IMPLEMENT_DYNAMIC_CLASS(wxWindow
, wxWindowBase
) 
  76 BEGIN_EVENT_TABLE(wxWindowMac
, wxWindowBase
) 
  77     EVT_NC_PAINT(wxWindowMac::OnNcPaint
) 
  78     EVT_ERASE_BACKGROUND(wxWindowMac::OnEraseBackground
) 
  79 #if TARGET_API_MAC_OSX 
  80     EVT_PAINT(wxWindowMac::OnPaint
) 
  82     EVT_SET_FOCUS(wxWindowMac::OnSetFocus
) 
  83     EVT_KILL_FOCUS(wxWindowMac::OnSetFocus
) 
  84     EVT_MOUSE_EVENTS(wxWindowMac::OnMouseEvent
) 
  87 #define wxMAC_DEBUG_REDRAW 0 
  88 #ifndef wxMAC_DEBUG_REDRAW 
  89 #define wxMAC_DEBUG_REDRAW 0 
  92 #define wxMAC_USE_THEME_BORDER 1 
  94 // --------------------------------------------------------------------------- 
  95 // Utility Routines to move between different coordinate systems 
  96 // --------------------------------------------------------------------------- 
  99  * Right now we have the following setup : 
 100  * a border that is not part of the native control is always outside the 
 101  * control's border (otherwise we loose all native intelligence, future ways 
 102  * may be to have a second embedding control responsible for drawing borders 
 103  * and backgrounds eventually) 
 104  * so all this border calculations have to be taken into account when calling 
 105  * native methods or getting native oriented data 
 106  * so we have three coordinate systems here 
 107  * wx client coordinates 
 108  * wx window coordinates (including window frames) 
 113 // originating from native control 
 117 void wxMacNativeToWindow( const wxWindow
* window 
, RgnHandle handle 
) 
 119     OffsetRgn( handle 
, window
->MacGetLeftBorderSize() , window
->MacGetTopBorderSize() ) ; 
 122 void wxMacNativeToWindow( const wxWindow
* window 
, Rect 
*rect 
) 
 124     OffsetRect( rect 
, window
->MacGetLeftBorderSize() , window
->MacGetTopBorderSize() ) ; 
 128 // directed towards native control 
 131 void wxMacWindowToNative( const wxWindow
* window 
, RgnHandle handle 
) 
 133     OffsetRgn( handle 
, -window
->MacGetLeftBorderSize() , -window
->MacGetTopBorderSize() ); 
 136 void wxMacWindowToNative( const wxWindow
* window 
, Rect 
*rect 
) 
 138     OffsetRect( rect 
, -window
->MacGetLeftBorderSize() , -window
->MacGetTopBorderSize() ) ; 
 141 // --------------------------------------------------------------------------- 
 143 // --------------------------------------------------------------------------- 
 145 extern long wxMacTranslateKey(unsigned char key
, unsigned char code
) ; 
 146 pascal OSStatus 
wxMacSetupControlBackground( ControlRef iControl 
, SInt16 iMessage 
, SInt16 iDepth 
, Boolean iIsColor 
) ; 
 148 #if TARGET_API_MAC_OSX 
 150 #if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_3 
 153     kEventControlVisibilityChanged 
= 157 
 159 static const EventTypeSpec eventList
[] = 
 161     { kEventClassCommand
, kEventProcessCommand 
} , 
 162     { kEventClassCommand
, kEventCommandUpdateStatus 
} , 
 164     { kEventClassControl 
, kEventControlHit 
} , 
 166     { kEventClassTextInput
, kEventTextInputUnicodeForKeyEvent 
} , 
 167     { kEventClassTextInput
, kEventTextInputUpdateActiveInputArea 
} , 
 169     { kEventClassControl 
, kEventControlDraw 
} , 
 170     { kEventClassControl 
, kEventControlVisibilityChanged 
} , 
 171     { kEventClassControl 
, kEventControlEnabledStateChanged 
} , 
 172     { kEventClassControl 
, kEventControlHiliteChanged 
} , 
 173     { kEventClassControl 
, kEventControlSetFocusPart 
} , 
 175     { kEventClassService 
, kEventServiceGetTypes 
}, 
 176     { kEventClassService 
, kEventServiceCopy 
}, 
 177     { kEventClassService 
, kEventServicePaste 
}, 
 179 //    { kEventClassControl , kEventControlInvalidateForSizeChange } , // 10.3 only 
 180 //    { kEventClassControl , kEventControlBoundsChanged } , 
 183 static pascal OSStatus 
wxMacWindowControlEventHandler( EventHandlerCallRef handler 
, EventRef event 
, void *data 
) 
 185     OSStatus result 
= eventNotHandledErr 
; 
 187     wxMacCarbonEvent 
cEvent( event 
) ; 
 189     ControlRef controlRef 
; 
 190     wxWindowMac
* thisWindow 
= (wxWindowMac
*) data 
; 
 192     cEvent
.GetParameter( kEventParamDirectObject 
, &controlRef 
) ; 
 194     switch ( GetEventKind( event 
) ) 
 196 #if TARGET_API_MAC_OSX 
 197         case kEventControlDraw 
: 
 199                 RgnHandle updateRgn 
= NULL 
; 
 200                 RgnHandle allocatedRgn 
= NULL 
; 
 201                 wxRegion visRegion 
= thisWindow
->MacGetVisibleRegion() ; 
 204                 if ( ! thisWindow
->GetPeer()->IsCompositing() ) 
 206                     if ( thisWindow
->GetPeer()->IsRootControl() ) 
 207                         thisWindow
->GetPeer()->GetRect( &controlBounds 
) ; 
 209                         GetControlBounds( thisWindow
->GetPeer()->GetControlRef() , &controlBounds 
) ; 
 212                 if ( cEvent
.GetParameter
<RgnHandle
>(kEventParamRgnHandle
, &updateRgn
) != noErr 
) 
 214                     updateRgn 
= (RgnHandle
) visRegion
.GetWXHRGN() ; 
 218                     if ( ! thisWindow
->GetPeer()->IsCompositing() ) 
 220                         allocatedRgn 
= NewRgn() ; 
 221                         CopyRgn( updateRgn 
, allocatedRgn 
) ; 
 222                         OffsetRgn( allocatedRgn 
, -controlBounds
.left 
, -controlBounds
.top 
) ; 
 224                         // hide the given region by the new region that must be shifted 
 225                         wxMacNativeToWindow( thisWindow 
, allocatedRgn 
) ; 
 226                         updateRgn 
= allocatedRgn 
; 
 230                         if ( thisWindow
->MacGetLeftBorderSize() != 0 || thisWindow
->MacGetTopBorderSize() != 0 ) 
 232                             // as this update region is in native window locals we must adapt it to wx window local 
 233                             allocatedRgn 
= NewRgn() ; 
 234                             CopyRgn( updateRgn 
, allocatedRgn 
) ; 
 236                             // hide the given region by the new region that must be shifted 
 237                             wxMacNativeToWindow( thisWindow 
, allocatedRgn 
) ; 
 238                             updateRgn 
= allocatedRgn 
; 
 244                 GetRegionBounds( updateRgn 
, &rgnBounds 
) ; 
 246 #if wxMAC_DEBUG_REDRAW 
 247                 if ( thisWindow
->MacIsUserPane() ) 
 249                     static float color 
= 0.5 ; 
 252                     CGContextRef cgContext 
= cEvent
.GetParameter
<CGContextRef
>(kEventParamCGContextRef
) ; 
 254                     HIViewGetBounds( controlRef
, &bounds 
); 
 255                     CGContextSetRGBFillColor( cgContext
, channel 
== 0 ? color 
: 0.5 , 
 256                         channel 
== 1 ? color 
: 0.5 , channel 
== 2 ? color 
: 0.5 , 1 ); 
 257                     CGContextFillRect( cgContext
, bounds 
); 
 270 #if wxMAC_USE_CORE_GRAPHICS 
 271                     bool created 
= false ; 
 272                     CGContextRef cgContext 
= NULL 
; 
 273                     if ( cEvent
.GetParameter
<CGContextRef
>(kEventParamCGContextRef
, &cgContext
) != noErr 
) 
 275                         wxASSERT( thisWindow
->GetPeer()->IsCompositing() == false ) ; 
 277                         // this parameter is not provided on non-composited windows 
 280                         // rest of the code expects this to be already transformed and clipped for local 
 281                         CGrafPtr port 
= GetWindowPort( (WindowRef
) thisWindow
->MacGetTopLevelWindowRef() ) ; 
 283                         GetPortBounds( port 
, &bounds 
) ; 
 284                         CreateCGContextForPort( port 
, &cgContext 
) ; 
 286                         wxMacWindowToNative( thisWindow 
, updateRgn 
) ; 
 287                         OffsetRgn( updateRgn 
, controlBounds
.left 
, controlBounds
.top 
) ; 
 288                         ClipCGContextToRegion( cgContext 
, &bounds 
, updateRgn 
) ; 
 289                         wxMacNativeToWindow( thisWindow 
, updateRgn 
) ; 
 290                         OffsetRgn( updateRgn 
, -controlBounds
.left 
, -controlBounds
.top 
) ; 
 292                         CGContextTranslateCTM( cgContext 
, 0 , bounds
.bottom 
- bounds
.top 
) ; 
 293                         CGContextScaleCTM( cgContext 
, 1 , -1 ) ; 
 295                         CGContextTranslateCTM( cgContext 
, controlBounds
.left 
, controlBounds
.top 
) ; 
 298                         CGContextSetRGBFillColor( cgContext 
, 1.0 , 1.0 , 1.0 , 1.0 ) ; 
 299                         CGContextFillRect( cgContext 
, 
 301                                 controlBounds
.right 
- controlBounds
.left 
, 
 302                                 controlBounds
.bottom 
- controlBounds
.top 
) ); 
 306                     thisWindow
->MacSetCGContextRef( cgContext 
) ; 
 309                         wxMacCGContextStateSaver 
sg( cgContext 
) ; 
 311                         if ( thisWindow
->MacDoRedraw( updateRgn 
, cEvent
.GetTicks() ) ) 
 314 #if wxMAC_USE_CORE_GRAPHICS 
 315                         thisWindow
->MacSetCGContextRef( NULL 
) ; 
 319                         CGContextRelease( cgContext 
) ; 
 324                     DisposeRgn( allocatedRgn 
) ; 
 328         case kEventControlVisibilityChanged 
: 
 329             thisWindow
->MacVisibilityChanged() ; 
 332         case kEventControlEnabledStateChanged 
: 
 333             thisWindow
->MacEnabledStateChanged() ; 
 336         case kEventControlHiliteChanged 
: 
 337             thisWindow
->MacHiliteChanged() ; 
 341         // we emulate this event under Carbon CFM 
 342         case kEventControlSetFocusPart 
: 
 344                 Boolean focusEverything 
= false ; 
 345                 ControlPartCode controlPart 
= cEvent
.GetParameter
<ControlPartCode
>(kEventParamControlPart 
, typeControlPartCode 
); 
 348                 if ( cEvent
.GetParameter
<Boolean
>(kEventParamControlFocusEverything 
, &focusEverything 
) == noErr 
) 
 353                 if ( controlPart 
== kControlFocusNoPart 
) 
 356                     if ( thisWindow
->GetCaret() ) 
 357                         thisWindow
->GetCaret()->OnKillFocus(); 
 360                     static bool inKillFocusEvent 
= false ; 
 362                     if ( !inKillFocusEvent 
) 
 364                         inKillFocusEvent 
= true ; 
 365                         wxFocusEvent 
event( wxEVT_KILL_FOCUS
, thisWindow
->GetId()); 
 366                         event
.SetEventObject(thisWindow
); 
 367                         thisWindow
->GetEventHandler()->ProcessEvent(event
) ; 
 368                         inKillFocusEvent 
= false ; 
 373                     // panel wants to track the window which was the last to have focus in it 
 374                     wxChildFocusEvent 
eventFocus(thisWindow
); 
 375                     thisWindow
->GetEventHandler()->ProcessEvent(eventFocus
); 
 378                     if ( thisWindow
->GetCaret() ) 
 379                         thisWindow
->GetCaret()->OnSetFocus(); 
 382                     wxFocusEvent 
event(wxEVT_SET_FOCUS
, thisWindow
->GetId()); 
 383                     event
.SetEventObject(thisWindow
); 
 384                     thisWindow
->GetEventHandler()->ProcessEvent(event
) ; 
 387                 if ( thisWindow
->MacIsUserPane() ) 
 392         case kEventControlHit 
: 
 393             result 
= thisWindow
->MacControlHit( handler 
, event 
) ; 
 403 static pascal OSStatus 
wxMacWindowServiceEventHandler( EventHandlerCallRef handler 
, EventRef event 
, void *data 
) 
 405     OSStatus result 
= eventNotHandledErr 
; 
 407     wxMacCarbonEvent 
cEvent( event 
) ; 
 409     ControlRef controlRef 
; 
 410     wxWindowMac
* thisWindow 
= (wxWindowMac
*) data 
; 
 411     wxTextCtrl
* textCtrl 
= wxDynamicCast( thisWindow 
, wxTextCtrl 
) ; 
 412     cEvent
.GetParameter( kEventParamDirectObject 
, &controlRef 
) ; 
 414     switch ( GetEventKind( event 
) ) 
 416         case kEventServiceGetTypes 
: 
 420                 textCtrl
->GetSelection( &from 
, &to 
) ; 
 422                 CFMutableArrayRef copyTypes 
= 0 , pasteTypes 
= 0; 
 424                     copyTypes 
= cEvent
.GetParameter
< CFMutableArrayRef 
>( kEventParamServiceCopyTypes 
, typeCFMutableArrayRef 
) ; 
 425                 if ( textCtrl
->IsEditable() ) 
 426                     pasteTypes 
= cEvent
.GetParameter
< CFMutableArrayRef 
>( kEventParamServicePasteTypes 
, typeCFMutableArrayRef 
) ; 
 428                 static const OSType textDataTypes
[] = { kTXNTextData 
/* , 'utxt', 'PICT', 'MooV', 'AIFF' */  }; 
 429                 for ( size_t i 
= 0 ; i 
< WXSIZEOF(textDataTypes
) ; ++i 
) 
 431                     CFStringRef typestring 
= CreateTypeStringWithOSType(textDataTypes
[i
]); 
 435                             CFArrayAppendValue(copyTypes
, typestring
) ; 
 437                             CFArrayAppendValue(pasteTypes
, typestring
) ; 
 439                         CFRelease( typestring 
) ; 
 447         case kEventServiceCopy 
: 
 452                 textCtrl
->GetSelection( &from 
, &to 
) ; 
 453                 wxString val 
= textCtrl
->GetValue() ; 
 454                 val 
= val
.Mid( from 
, to 
- from 
) ; 
 455                 ScrapRef scrapRef 
= cEvent
.GetParameter
< ScrapRef 
> ( kEventParamScrapRef 
, typeScrapRef 
) ; 
 456                 verify_noerr( ClearScrap( &scrapRef 
) ) ; 
 457                 verify_noerr( PutScrapFlavor( scrapRef 
, kTXNTextData 
, 0 , val
.length() , val
.c_str() ) ) ; 
 462         case kEventServicePaste 
: 
 465                 ScrapRef scrapRef 
= cEvent
.GetParameter
< ScrapRef 
> ( kEventParamScrapRef 
, typeScrapRef 
) ; 
 466                 Size textSize
, pastedSize 
; 
 467                 verify_noerr( GetScrapFlavorSize(scrapRef
, kTXNTextData
, &textSize
) ) ; 
 469                 char *content 
= new char[textSize
] ; 
 470                 GetScrapFlavorData(scrapRef
, kTXNTextData
, &pastedSize
, content 
); 
 471                 content
[textSize 
- 1] = 0 ; 
 474                 textCtrl
->WriteText( wxString( content 
, wxConvLocal 
) ); 
 476                 textCtrl
->WriteText( wxString( content 
) ) ; 
 491 pascal OSStatus 
wxMacUnicodeTextEventHandler( EventHandlerCallRef handler 
, EventRef event 
, void *data 
) 
 493     OSStatus result 
= eventNotHandledErr 
; 
 494     wxWindowMac
* focus 
= (wxWindowMac
*) data 
; 
 496     wchar_t* uniChars 
= NULL 
; 
 497     UInt32 when 
= EventTimeToTicks( GetEventTime( event 
) ) ; 
 500     UInt32 dataSize 
= 0 ; 
 503     if ( GetEventParameter( event
, kEventParamTextInputSendText
, typeUnicodeText
, NULL
, 0 , &dataSize
, NULL 
) == noErr 
) 
 505         numChars 
= dataSize 
/ sizeof( UniChar
) ; 
 508         if ( dataSize 
> sizeof(buf
) ) 
 509             charBuf 
= new UniChar
[ numChars 
] ; 
 513         uniChars 
= new wchar_t[ numChars 
] ; 
 514         GetEventParameter( event
, kEventParamTextInputSendText
, typeUnicodeText
, NULL
, dataSize 
, NULL 
, charBuf 
) ; 
 515 #if SIZEOF_WCHAR_T == 2 
 517         memcpy( uniChars 
, charBuf 
, dataSize 
) ; 
 519         // the resulting string will never have more chars than the utf16 version, so this is safe 
 520         wxMBConvUTF16 converter 
; 
 521         numChars 
= converter
.MB2WC( uniChars 
, (const char*)charBuf 
, numChars 
) ; 
 525     switch ( GetEventKind( event 
) ) 
 527         case kEventTextInputUpdateActiveInputArea 
: 
 529                 // An IME input event may return several characters, but we need to send one char at a time to 
 531                 for (int pos
=0 ; pos 
< numChars 
; pos
++) 
 533                     WXEVENTREF formerEvent 
= wxTheApp
->MacGetCurrentEvent() ; 
 534                     WXEVENTHANDLERCALLREF formerHandler 
= wxTheApp
->MacGetCurrentEventHandlerCallRef() ; 
 535                     wxTheApp
->MacSetCurrentEvent( event 
, handler 
) ; 
 537                     UInt32 message 
= (0  << 8) + ((char)uniChars
[pos
] ); 
 538                     if ( wxTheApp
->MacSendCharEvent( 
 539                                                     focus 
, message 
, 0 , when 
, 0 , 0 , uniChars
[pos
] ) ) 
 544                     wxTheApp
->MacSetCurrentEvent( formerEvent 
, formerHandler 
) ; 
 548         case kEventTextInputUnicodeForKeyEvent 
: 
 550                 UInt32 keyCode
, modifiers 
; 
 553                 unsigned char charCode 
; 
 555                 GetEventParameter( event
, kEventParamTextInputSendKeyboardEvent
, typeEventRef
, NULL
, sizeof(rawEvent
), NULL
, &rawEvent 
) ; 
 556                 GetEventParameter( rawEvent
, kEventParamKeyMacCharCodes
, typeChar
, NULL
, sizeof(char), NULL
, &charCode 
); 
 557                 GetEventParameter( rawEvent
, kEventParamKeyCode
, typeUInt32
, NULL
, sizeof(UInt32
), NULL
, &keyCode 
); 
 558                 GetEventParameter( rawEvent
, kEventParamKeyModifiers
, typeUInt32
, NULL
, sizeof(UInt32
), NULL
, &modifiers 
); 
 559                 GetEventParameter( rawEvent
, kEventParamMouseLocation
, typeQDPoint
, NULL
, sizeof(Point
), NULL
, &point 
); 
 561                 UInt32 message 
= (keyCode 
<< 8) + charCode
; 
 563                 // An IME input event may return several characters, but we need to send one char at a time to 
 565                 for (int pos
=0 ; pos 
< numChars 
; pos
++) 
 567                     WXEVENTREF formerEvent 
= wxTheApp
->MacGetCurrentEvent() ; 
 568                     WXEVENTHANDLERCALLREF formerHandler 
= wxTheApp
->MacGetCurrentEventHandlerCallRef() ; 
 569                     wxTheApp
->MacSetCurrentEvent( event 
, handler 
) ; 
 571                     if ( wxTheApp
->MacSendCharEvent( 
 572                         focus 
, message 
, modifiers 
, when 
, point
.h 
, point
.v 
, uniChars
[pos
] ) ) 
 577                     wxTheApp
->MacSetCurrentEvent( formerEvent 
, formerHandler 
) ; 
 586     if ( charBuf 
!= buf 
) 
 592 static pascal OSStatus 
wxMacWindowCommandEventHandler( EventHandlerCallRef handler 
, EventRef event 
, void *data 
) 
 594     OSStatus result 
= eventNotHandledErr 
; 
 595     wxWindowMac
* focus 
= (wxWindowMac
*) data 
; 
 599     wxMacCarbonEvent 
cEvent( event 
) ; 
 600     cEvent
.GetParameter
<HICommand
>(kEventParamDirectObject
,typeHICommand
,&command
) ; 
 602     wxMenuItem
* item 
= NULL 
; 
 603     wxMenu
* itemMenu 
= wxFindMenuFromMacCommand( command 
, item 
) ; 
 604     int id 
= wxMacCommandToId( command
.commandID 
) ; 
 608         wxASSERT( itemMenu 
!= NULL 
) ; 
 610         switch ( cEvent
.GetKind() ) 
 612             case kEventProcessCommand 
: 
 614                     if (item
->IsCheckable()) 
 615                         item
->Check( !item
->IsChecked() ) ; 
 617                     if ( itemMenu
->SendEvent( id 
, item
->IsCheckable() ? item
->IsChecked() : -1 ) ) 
 621                         wxCommandEvent 
event(wxEVT_COMMAND_MENU_SELECTED 
, id
); 
 622                         event
.SetEventObject(focus
); 
 623                         event
.SetInt(item
->IsCheckable() ? item
->IsChecked() : -1); 
 625                         if ( focus
->GetEventHandler()->ProcessEvent(event
) ) 
 631             case kEventCommandUpdateStatus
: 
 633                     wxUpdateUIEvent 
event(id
); 
 634                     event
.SetEventObject( itemMenu 
); 
 636                     bool processed 
= false; 
 638                     // Try the menu's event handler 
 640                         wxEvtHandler 
*handler 
= itemMenu
->GetEventHandler(); 
 642                             processed 
= handler
->ProcessEvent(event
); 
 645                     // Try the window the menu was popped up from 
 646                     // (and up through the hierarchy) 
 649                         const wxMenuBase 
*menu 
= itemMenu
; 
 652                             wxWindow 
*win 
= menu
->GetInvokingWindow(); 
 655                                 processed 
= win
->GetEventHandler()->ProcessEvent(event
); 
 659                             menu 
= menu
->GetParent(); 
 665                         processed 
= focus
->GetEventHandler()->ProcessEvent(event
); 
 670                         // if anything changed, update the changed attribute 
 671                         if (event
.GetSetText()) 
 672                             itemMenu
->SetLabel(id
, event
.GetText()); 
 673                         if (event
.GetSetChecked()) 
 674                             itemMenu
->Check(id
, event
.GetChecked()); 
 675                         if (event
.GetSetEnabled()) 
 676                             itemMenu
->Enable(id
, event
.GetEnabled()); 
 690 pascal OSStatus 
wxMacWindowEventHandler( EventHandlerCallRef handler 
, EventRef event 
, void *data 
) 
 692     EventRef formerEvent 
= (EventRef
) wxTheApp
->MacGetCurrentEvent() ; 
 693     EventHandlerCallRef formerEventHandlerCallRef 
= (EventHandlerCallRef
) wxTheApp
->MacGetCurrentEventHandlerCallRef() ; 
 694     wxTheApp
->MacSetCurrentEvent( event 
, handler 
) ; 
 695     OSStatus result 
= eventNotHandledErr 
; 
 697     switch ( GetEventClass( event 
) ) 
 699         case kEventClassCommand 
: 
 700             result 
= wxMacWindowCommandEventHandler( handler 
, event 
, data 
) ; 
 703         case kEventClassControl 
: 
 704             result 
= wxMacWindowControlEventHandler( handler
, event
, data 
) ; 
 707         case kEventClassService 
: 
 708             result 
= wxMacWindowServiceEventHandler( handler
, event 
, data 
) ; 
 711         case kEventClassTextInput 
: 
 712             result 
= wxMacUnicodeTextEventHandler( handler 
, event 
, data 
) ; 
 719     wxTheApp
->MacSetCurrentEvent( formerEvent
, formerEventHandlerCallRef 
) ; 
 724 DEFINE_ONE_SHOT_HANDLER_GETTER( wxMacWindowEventHandler 
) 
 726 #if !TARGET_API_MAC_OSX 
 728 // --------------------------------------------------------------------------- 
 729 // UserPane events for non OSX builds 
 730 // --------------------------------------------------------------------------- 
 732 static pascal void wxMacControlUserPaneDrawProc(ControlRef control
, SInt16 part
) 
 734     wxWindow 
* win 
= wxFindControlFromMacControl(control
) ; 
 736         win
->MacControlUserPaneDrawProc(part
) ; 
 738 wxMAC_DEFINE_PROC_GETTER( ControlUserPaneDrawUPP 
, wxMacControlUserPaneDrawProc 
) ; 
 740 static pascal ControlPartCode 
wxMacControlUserPaneHitTestProc(ControlRef control
, Point where
) 
 742     wxWindow 
* win 
= wxFindControlFromMacControl(control
) ; 
 744         return win
->MacControlUserPaneHitTestProc(where
.h 
, where
.v
) ; 
 746         return kControlNoPart 
; 
 748 wxMAC_DEFINE_PROC_GETTER( ControlUserPaneHitTestUPP 
, wxMacControlUserPaneHitTestProc 
) ; 
 750 static pascal ControlPartCode 
wxMacControlUserPaneTrackingProc(ControlRef control
, Point startPt
, ControlActionUPP actionProc
) 
 752     wxWindow 
* win 
= wxFindControlFromMacControl(control
) ; 
 754         return win
->MacControlUserPaneTrackingProc( startPt
.h 
, startPt
.v 
, (void*) actionProc
) ; 
 756         return kControlNoPart 
; 
 758 wxMAC_DEFINE_PROC_GETTER( ControlUserPaneTrackingUPP 
, wxMacControlUserPaneTrackingProc 
) ; 
 760 static pascal void wxMacControlUserPaneIdleProc(ControlRef control
) 
 762     wxWindow 
* win 
= wxFindControlFromMacControl(control
) ; 
 764         win
->MacControlUserPaneIdleProc() ; 
 766 wxMAC_DEFINE_PROC_GETTER( ControlUserPaneIdleUPP 
, wxMacControlUserPaneIdleProc 
) ; 
 768 static pascal ControlPartCode 
wxMacControlUserPaneKeyDownProc(ControlRef control
, SInt16 keyCode
, SInt16 charCode
, SInt16 modifiers
) 
 770     wxWindow 
* win 
= wxFindControlFromMacControl(control
) ; 
 772         return win
->MacControlUserPaneKeyDownProc(keyCode
,charCode
,modifiers
) ; 
 774         return kControlNoPart 
; 
 776 wxMAC_DEFINE_PROC_GETTER( ControlUserPaneKeyDownUPP 
, wxMacControlUserPaneKeyDownProc 
) ; 
 778 static pascal void wxMacControlUserPaneActivateProc(ControlRef control
, Boolean activating
) 
 780     wxWindow 
* win 
= wxFindControlFromMacControl(control
) ; 
 782         win
->MacControlUserPaneActivateProc(activating
) ; 
 784 wxMAC_DEFINE_PROC_GETTER( ControlUserPaneActivateUPP 
, wxMacControlUserPaneActivateProc 
) ; 
 786 static pascal ControlPartCode 
wxMacControlUserPaneFocusProc(ControlRef control
, ControlFocusPart action
) 
 788     wxWindow 
* win 
= wxFindControlFromMacControl(control
) ; 
 790         return win
->MacControlUserPaneFocusProc(action
) ; 
 792         return kControlNoPart 
; 
 794 wxMAC_DEFINE_PROC_GETTER( ControlUserPaneFocusUPP 
, wxMacControlUserPaneFocusProc 
) ; 
 796 static pascal void wxMacControlUserPaneBackgroundProc(ControlRef control
, ControlBackgroundPtr info
) 
 798     wxWindow 
* win 
= wxFindControlFromMacControl(control
) ; 
 800         win
->MacControlUserPaneBackgroundProc(info
) ; 
 802 wxMAC_DEFINE_PROC_GETTER( ControlUserPaneBackgroundUPP 
, wxMacControlUserPaneBackgroundProc 
) ; 
 804 void wxWindowMac::MacControlUserPaneDrawProc(wxInt16 part
) 
 807     RgnHandle rgn 
= NewRgn() ; 
 809     MacWindowToRootWindow( &x
, &y 
) ; 
 810     OffsetRgn( rgn 
, -x 
, -y 
) ; 
 811     wxMacWindowStateSaver 
sv( this ) ; 
 812     SectRgn( rgn 
, (RgnHandle
) MacGetVisibleRegion().GetWXHRGN() , rgn 
) ; 
 813     MacDoRedraw( rgn 
, 0 ) ; 
 817 wxInt16 
wxWindowMac::MacControlUserPaneHitTestProc(wxInt16 x
, wxInt16 y
) 
 819     return kControlNoPart 
; 
 822 wxInt16 
wxWindowMac::MacControlUserPaneTrackingProc(wxInt16 x
, wxInt16 y
, void* actionProc
) 
 824     return kControlNoPart 
; 
 827 void wxWindowMac::MacControlUserPaneIdleProc() 
 831 wxInt16 
wxWindowMac::MacControlUserPaneKeyDownProc(wxInt16 keyCode
, wxInt16 charCode
, wxInt16 modifiers
) 
 833     return kControlNoPart 
; 
 836 void wxWindowMac::MacControlUserPaneActivateProc(bool activating
) 
 840 wxInt16 
wxWindowMac::MacControlUserPaneFocusProc(wxInt16 action
) 
 842     if ( AcceptsFocus() ) 
 845         return kControlNoPart 
; 
 848 void wxWindowMac::MacControlUserPaneBackgroundProc(void* info
) 
 854 // --------------------------------------------------------------------------- 
 855 // Scrollbar Tracking for all 
 856 // --------------------------------------------------------------------------- 
 858 pascal void wxMacLiveScrollbarActionProc( ControlRef control 
, ControlPartCode partCode 
) ; 
 859 pascal void wxMacLiveScrollbarActionProc( ControlRef control 
, ControlPartCode partCode 
) 
 863         wxWindow
*  wx 
= wxFindControlFromMacControl( control 
) ; 
 865             wx
->MacHandleControlClick( (WXWidget
) control 
, partCode 
, true /* stillDown */ ) ; 
 868 wxMAC_DEFINE_PROC_GETTER( ControlActionUPP 
, wxMacLiveScrollbarActionProc 
) ; 
 870 // =========================================================================== 
 872 // =========================================================================== 
 874 WX_DECLARE_HASH_MAP(ControlRef
, wxWindow
*, wxPointerHash
, wxPointerEqual
, MacControlMap
); 
 876 static MacControlMap wxWinMacControlList
; 
 878 wxWindow 
*wxFindControlFromMacControl(ControlRef inControl 
) 
 880     MacControlMap::iterator node 
= wxWinMacControlList
.find(inControl
); 
 882     return (node 
== wxWinMacControlList
.end()) ? NULL 
: node
->second
; 
 885 void wxAssociateControlWithMacControl(ControlRef inControl
, wxWindow 
*control
) 
 887     // adding NULL ControlRef is (first) surely a result of an error and 
 888     // (secondly) breaks native event processing 
 889     wxCHECK_RET( inControl 
!= (ControlRef
) NULL
, wxT("attempt to add a NULL WindowRef to window list") ); 
 891     wxWinMacControlList
[inControl
] = control
; 
 894 void wxRemoveMacControlAssociation(wxWindow 
*control
) 
 896    // iterate over all the elements in the class 
 897     // is the iterator stable ? as we might have two associations pointing to the same wxWindow 
 898     // we should go on... 
 904         MacControlMap::iterator it
; 
 905         for ( it 
= wxWinMacControlList
.begin(); it 
!= wxWinMacControlList
.end(); ++it 
) 
 907             if ( it
->second 
== control 
) 
 909                 wxWinMacControlList
.erase(it
); 
 917 // ---------------------------------------------------------------------------- 
 918  // constructors and such 
 919 // ---------------------------------------------------------------------------- 
 921 wxWindowMac::wxWindowMac() 
 926 wxWindowMac::wxWindowMac(wxWindowMac 
*parent
, 
 931             const wxString
& name 
) 
 934     Create(parent
, id
, pos
, size
, style
, name
); 
 937 void wxWindowMac::Init() 
 942 #if WXWIN_COMPATIBILITY_2_4 
 943     m_backgroundTransparent 
= false; 
 946 #if wxMAC_USE_CORE_GRAPHICS 
 947     m_cgContextRef 
= NULL 
; 
 950     // as all windows are created with WS_VISIBLE style... 
 953     m_hScrollBar 
= NULL 
; 
 954     m_vScrollBar 
= NULL 
; 
 955     m_macBackgroundBrush 
= wxNullBrush 
; 
 957     m_macIsUserPane 
= true; 
 958     m_clipChildren 
= false ; 
 959     m_cachedClippedRectValid 
= false ; 
 961     // we need a valid font for the encodings 
 962     wxWindowBase::SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT
)); 
 965 wxWindowMac::~wxWindowMac() 
 969     m_isBeingDeleted 
= true; 
 971     MacInvalidateBorders() ; 
 973 #ifndef __WXUNIVERSAL__ 
 974     // VS: make sure there's no wxFrame with last focus set to us: 
 975     for ( wxWindow 
*win 
= GetParent(); win
; win 
= win
->GetParent() ) 
 977         wxFrame 
*frame 
= wxDynamicCast(win
, wxFrame
); 
 980             if ( frame
->GetLastFocus() == this ) 
 981                 frame
->SetLastFocus((wxWindow
*)NULL
); 
 987     // destroy children before destroying this window itself 
 990     // wxRemoveMacControlAssociation( this ) ; 
 991     // If we delete an item, we should initialize the parent panel, 
 992     // because it could now be invalid. 
 993     wxWindow 
*parent 
= GetParent() ; 
 996         if (parent
->GetDefaultItem() == (wxButton
*) this) 
 997             parent
->SetDefaultItem(NULL
); 
1000     if ( m_peer 
&& m_peer
->Ok() ) 
1002         // in case the callback might be called during destruction 
1003         wxRemoveMacControlAssociation( this) ; 
1004         ::RemoveEventHandler( (EventHandlerRef 
) m_macControlEventHandler 
) ; 
1005         // we currently are not using this hook 
1006         // ::SetControlColorProc( *m_peer , NULL ) ; 
1010     if ( g_MacLastWindow 
== this ) 
1011         g_MacLastWindow 
= NULL 
; 
1013     wxFrame
* frame 
= wxDynamicCast( wxGetTopLevelParent( this ) , wxFrame 
) ; 
1016         if ( frame
->GetLastFocus() == this ) 
1017             frame
->SetLastFocus( NULL 
) ; 
1020     // delete our drop target if we've got one 
1021 #if wxUSE_DRAG_AND_DROP 
1022     if ( m_dropTarget 
!= NULL 
) 
1024         delete m_dropTarget
; 
1025         m_dropTarget 
= NULL
; 
1032 WXWidget 
wxWindowMac::GetHandle() const 
1034     return (WXWidget
) m_peer
->GetControlRef() ; 
1037 void wxWindowMac::MacInstallEventHandler( WXWidget control 
) 
1039     wxAssociateControlWithMacControl( (ControlRef
) control 
, this ) ; 
1040     InstallControlEventHandler( (ControlRef
)control 
, GetwxMacWindowEventHandlerUPP(), 
1041         GetEventTypeCount(eventList
), eventList
, this, 
1042         (EventHandlerRef 
*)&m_macControlEventHandler
); 
1044 #if !TARGET_API_MAC_OSX 
1045     if ( (ControlRef
) control 
== m_peer
->GetControlRef() ) 
1047         m_peer
->SetData
<ControlUserPaneDrawUPP
>(kControlEntireControl
, kControlUserPaneDrawProcTag
, GetwxMacControlUserPaneDrawProc()) ; 
1048         m_peer
->SetData
<ControlUserPaneHitTestUPP
>(kControlEntireControl
, kControlUserPaneHitTestProcTag
, GetwxMacControlUserPaneHitTestProc()) ; 
1049         m_peer
->SetData
<ControlUserPaneTrackingUPP
>(kControlEntireControl
, kControlUserPaneTrackingProcTag
, GetwxMacControlUserPaneTrackingProc()) ; 
1050         m_peer
->SetData
<ControlUserPaneIdleUPP
>(kControlEntireControl
, kControlUserPaneIdleProcTag
, GetwxMacControlUserPaneIdleProc()) ; 
1051         m_peer
->SetData
<ControlUserPaneKeyDownUPP
>(kControlEntireControl
, kControlUserPaneKeyDownProcTag
, GetwxMacControlUserPaneKeyDownProc()) ; 
1052         m_peer
->SetData
<ControlUserPaneActivateUPP
>(kControlEntireControl
, kControlUserPaneActivateProcTag
, GetwxMacControlUserPaneActivateProc()) ; 
1053         m_peer
->SetData
<ControlUserPaneFocusUPP
>(kControlEntireControl
, kControlUserPaneFocusProcTag
, GetwxMacControlUserPaneFocusProc()) ; 
1054         m_peer
->SetData
<ControlUserPaneBackgroundUPP
>(kControlEntireControl
, kControlUserPaneBackgroundProcTag
, GetwxMacControlUserPaneBackgroundProc()) ; 
1060 bool wxWindowMac::Create(wxWindowMac 
*parent
, 
1065     const wxString
& name
) 
1067     wxCHECK_MSG( parent
, false, wxT("can't create wxWindowMac without parent") ); 
1069     if ( !CreateBase(parent
, id
, pos
, size
, style
, wxDefaultValidator
, name
) ) 
1072     m_windowVariant 
= parent
->GetWindowVariant() ; 
1074     if ( m_macIsUserPane 
) 
1076         Rect bounds 
= wxMacGetBoundsForControl( this , pos 
, size 
) ; 
1079             | kControlSupportsEmbedding
 
1080             | kControlSupportsLiveFeedback
 
1081             | kControlGetsFocusOnClick
 
1082 //            | kControlHasSpecialBackground 
1083 //            | kControlSupportsCalcBestRect 
1084             | kControlHandlesTracking
 
1085             | kControlSupportsFocus
 
1086             | kControlWantsActivate
 
1087             | kControlWantsIdle 
; 
1089         m_peer 
= new wxMacControl(this) ; 
1090         OSStatus err 
=::CreateUserPaneControl( MAC_WXHWND(GetParent()->MacGetTopLevelWindowRef()) , &bounds
, features 
, m_peer
->GetControlRefAddr() ); 
1091         verify_noerr( err 
); 
1093         MacPostControlCreate(pos
, size
) ; 
1096 #ifndef __WXUNIVERSAL__ 
1097     // Don't give scrollbars to wxControls unless they ask for them 
1098     if ( (! IsKindOf(CLASSINFO(wxControl
)) && ! IsKindOf(CLASSINFO(wxStatusBar
))) 
1099          || (IsKindOf(CLASSINFO(wxControl
)) && ((style 
& wxHSCROLL
) || (style 
& wxVSCROLL
)))) 
1101         MacCreateScrollBars( style 
) ; 
1105     wxWindowCreateEvent 
event(this); 
1106     GetEventHandler()->AddPendingEvent(event
); 
1111 void wxWindowMac::MacChildAdded() 
1114         m_vScrollBar
->Raise() ; 
1116         m_hScrollBar
->Raise() ; 
1119 void wxWindowMac::MacPostControlCreate(const wxPoint
& pos
, const wxSize
& size
) 
1121     wxASSERT_MSG( m_peer 
!= NULL 
&& m_peer
->Ok() , wxT("No valid mac control") ) ; 
1123     m_peer
->SetReference( (long)this ) ; 
1124     GetParent()->AddChild( this ); 
1126     MacInstallEventHandler( (WXWidget
) m_peer
->GetControlRef() ); 
1128     ControlRef container 
= (ControlRef
) GetParent()->GetHandle() ; 
1129     wxASSERT_MSG( container 
!= NULL 
, wxT("No valid mac container control") ) ; 
1130     ::EmbedControl( m_peer
->GetControlRef() , container 
) ; 
1131     GetParent()->MacChildAdded() ; 
1133     // adjust font, controlsize etc 
1134     DoSetWindowVariant( m_windowVariant 
) ; 
1136     m_peer
->SetLabel( wxStripMenuCodes(m_label
) ) ; 
1138     if (!m_macIsUserPane
) 
1139         SetInitialBestSize(size
); 
1141     SetCursor( *wxSTANDARD_CURSOR 
) ; 
1144 void wxWindowMac::DoSetWindowVariant( wxWindowVariant variant 
) 
1146     // Don't assert, in case we set the window variant before 
1147     // the window is created 
1148     // wxASSERT( m_peer->Ok() ) ; 
1150     m_windowVariant 
= variant 
; 
1152     if (m_peer 
== NULL 
|| !m_peer
->Ok()) 
1156     ThemeFontID themeFont 
= kThemeSystemFont 
; 
1158     // we will get that from the settings later 
1159     // and make this NORMAL later, but first 
1160     // we have a few calculations that we must fix 
1164         case wxWINDOW_VARIANT_NORMAL 
: 
1165             size 
= kControlSizeNormal
; 
1166             themeFont 
= kThemeSystemFont 
; 
1169         case wxWINDOW_VARIANT_SMALL 
: 
1170             size 
= kControlSizeSmall
; 
1171             themeFont 
= kThemeSmallSystemFont 
; 
1174         case wxWINDOW_VARIANT_MINI 
: 
1175            if (UMAGetSystemVersion() >= 0x1030 ) 
1177                 // not always defined in the headers 
1183                 size 
= kControlSizeSmall
; 
1184                 themeFont 
= kThemeSmallSystemFont 
; 
1188         case wxWINDOW_VARIANT_LARGE 
: 
1189             size 
= kControlSizeLarge
; 
1190             themeFont 
= kThemeSystemFont 
; 
1194             wxFAIL_MSG(_T("unexpected window variant")); 
1198     m_peer
->SetData
<ControlSize
>(kControlEntireControl
, kControlSizeTag
, &size 
) ; 
1201     font
.MacCreateThemeFont( themeFont 
) ; 
1205 void wxWindowMac::MacUpdateControlFont() 
1207     m_peer
->SetFont( GetFont() , GetForegroundColour() , GetWindowStyle() ) ; 
1211 bool wxWindowMac::SetFont(const wxFont
& font
) 
1213     bool retval 
= wxWindowBase::SetFont( font 
); 
1215     MacUpdateControlFont() ; 
1220 bool wxWindowMac::SetForegroundColour(const wxColour
& col 
) 
1222     bool retval 
= wxWindowBase::SetForegroundColour( col 
); 
1225         MacUpdateControlFont(); 
1230 bool wxWindowMac::SetBackgroundColour(const wxColour
& col 
) 
1232     if ( !wxWindowBase::SetBackgroundColour(col
) && m_hasBgCol 
) 
1236     wxColour 
newCol(GetBackgroundColour()); 
1238     if ( newCol 
== wxSystemSettings::GetColour( wxSYS_COLOUR_APPWORKSPACE 
) ) 
1239         brush
.MacSetTheme( kThemeBrushDocumentWindowBackground 
) ; 
1240     else if ( newCol 
== wxSystemSettings::GetColour( wxSYS_COLOUR_3DFACE 
) ) 
1241         brush
.MacSetTheme( kThemeBrushDialogBackgroundActive 
) ; 
1243         brush
.SetColour( newCol 
) ; 
1245     MacSetBackgroundBrush( brush 
) ; 
1246     MacUpdateControlFont() ; 
1251 void wxWindowMac::MacSetBackgroundBrush( const wxBrush 
&brush 
) 
1253     m_macBackgroundBrush 
= brush 
; 
1254     m_peer
->SetBackground( brush 
) ; 
1257 bool wxWindowMac::MacCanFocus() const 
1259     // TODO : evaluate performance hits by looking up this value, eventually cache the results for a 1 sec or so 
1260     // CAUTION : the value returned currently is 0 or 2, I've also found values of 1 having the same meaning, but the value range 
1261     // is nowhere documented 
1262     Boolean keyExistsAndHasValidFormat 
; 
1263     CFIndex fullKeyboardAccess 
= CFPreferencesGetAppIntegerValue ( CFSTR("AppleKeyboardUIMode" ) , 
1264         kCFPreferencesCurrentApplication
, &keyExistsAndHasValidFormat
);   
1266     if ( keyExistsAndHasValidFormat 
&& fullKeyboardAccess 
> 0 ) 
1270         UInt32 features 
= 0 ; 
1271         m_peer
->GetFeatures( &features 
) ; 
1273         return features 
& ( kControlSupportsFocus 
| kControlGetsFocusOnClick 
) ; 
1277 void wxWindowMac::SetFocus() 
1279     if ( !AcceptsFocus() ) 
1282     wxWindow
* former 
= FindFocus() ; 
1283     if ( former 
== this ) 
1286     // as we cannot rely on the control features to find out whether we are in full keyboard mode, 
1287     // we can only leave in case of an error 
1288     OSStatus err 
= m_peer
->SetFocus( kControlFocusNextPart 
) ; 
1289     if ( err 
== errCouldntSetFocus 
) 
1292     SetUserFocusWindow( (WindowRef
)MacGetTopLevelWindowRef() ); 
1294 #if !TARGET_API_MAC_OSX 
1295     // emulate carbon events when running under CarbonLib where they are not natively available 
1298         EventRef evRef 
= NULL 
; 
1300         err 
= MacCreateEvent( 
1301             NULL 
, kEventClassControl 
, kEventControlSetFocusPart 
, TicksToEventTime( TickCount() ) , 
1302             kEventAttributeUserEvent 
, &evRef 
); 
1303         verify_noerr( err 
); 
1305         wxMacCarbonEvent 
cEvent( evRef 
) ; 
1306         cEvent
.SetParameter
<ControlRef
>( kEventParamDirectObject 
, (ControlRef
) former
->GetHandle() ) ; 
1307         cEvent
.SetParameter
<ControlPartCode
>(kEventParamControlPart 
, typeControlPartCode 
, kControlFocusNoPart 
) ; 
1309         wxMacWindowEventHandler( NULL 
, evRef 
, former 
) ; 
1310         ReleaseEvent( evRef 
) ; 
1313     // send new focus event 
1315         EventRef evRef 
= NULL 
; 
1317         err 
= MacCreateEvent( 
1318             NULL 
, kEventClassControl 
, kEventControlSetFocusPart 
, TicksToEventTime( TickCount() ) , 
1319             kEventAttributeUserEvent 
, &evRef 
); 
1320         verify_noerr( err 
); 
1322         wxMacCarbonEvent 
cEvent( evRef 
) ; 
1323         cEvent
.SetParameter
<ControlRef
>( kEventParamDirectObject 
, (ControlRef
) GetHandle() ) ; 
1324         cEvent
.SetParameter
<ControlPartCode
>(kEventParamControlPart 
, typeControlPartCode 
, kControlFocusNextPart 
) ; 
1326         wxMacWindowEventHandler( NULL 
, evRef 
, this ) ; 
1327         ReleaseEvent( evRef 
) ; 
1332 void wxWindowMac::DoCaptureMouse() 
1334     wxApp::s_captureWindow 
= this ; 
1337 wxWindow
* wxWindowBase::GetCapture() 
1339     return wxApp::s_captureWindow 
; 
1342 void wxWindowMac::DoReleaseMouse() 
1344     wxApp::s_captureWindow 
= NULL 
; 
1347 #if wxUSE_DRAG_AND_DROP 
1349 void wxWindowMac::SetDropTarget(wxDropTarget 
*pDropTarget
) 
1351     if ( m_dropTarget 
!= NULL 
) 
1352         delete m_dropTarget
; 
1354     m_dropTarget 
= pDropTarget
; 
1355     if ( m_dropTarget 
!= NULL 
) 
1363 // Old style file-manager drag&drop 
1364 void wxWindowMac::DragAcceptFiles(bool accept
) 
1369 // Returns the size of the native control. In the case of the toplevel window 
1370 // this is the content area root control 
1372 void wxWindowMac::MacGetPositionAndSizeFromControl(int& x
, int& y
, 
1373                                            int& w
, int& h
) const 
1375     wxFAIL_MSG( wxT("Not currently supported") ) ; 
1378 // From a wx position / size calculate the appropriate size of the native control 
1380 bool wxWindowMac::MacGetBoundsForControl( 
1384     int& w
, int& h 
, bool adjustOrigin 
) const 
1386     bool isCompositing 
= MacGetTopLevelWindow()->MacUsesCompositing() ; 
1388     // the desired size, minus the border pixels gives the correct size of the control 
1393     // TODO: the default calls may be used as soon as PostCreateControl Is moved here 
1394     w 
= wxMax(size
.x
, 0) ; // WidthDefault( size.x ); 
1395     h 
= wxMax(size
.y
, 0) ; // HeightDefault( size.y ) ; 
1397     if ( !isCompositing 
) 
1398         GetParent()->MacWindowToRootWindow( &x 
, &y 
) ; 
1400     x 
+= MacGetLeftBorderSize() ; 
1401     y 
+= MacGetTopBorderSize() ; 
1402     w 
-= MacGetLeftBorderSize() + MacGetRightBorderSize() ; 
1403     h 
-= MacGetTopBorderSize() + MacGetBottomBorderSize() ; 
1406         AdjustForParentClientOrigin( x 
, y 
) ; 
1408     // this is in window relative coordinate, as this parent may have a border, its physical position is offset by this border 
1409     if ( !GetParent()->IsTopLevel() ) 
1411         x 
-= GetParent()->MacGetLeftBorderSize() ; 
1412         y 
-= GetParent()->MacGetTopBorderSize() ; 
1418 // Get window size (not client size) 
1419 void wxWindowMac::DoGetSize(int *x
, int *y
) const 
1422     m_peer
->GetRect( &bounds 
) ; 
1425        *x 
= bounds
.right 
- bounds
.left 
+ MacGetLeftBorderSize() + MacGetRightBorderSize() ; 
1427        *y 
= bounds
.bottom 
- bounds
.top 
+ MacGetTopBorderSize() + MacGetBottomBorderSize() ; 
1430 // get the position of the bounds of this window in client coordinates of its parent 
1431 void wxWindowMac::DoGetPosition(int *x
, int *y
) const 
1434     m_peer
->GetRect( &bounds 
) ; 
1436     int x1 
= bounds
.left 
; 
1437     int y1 
= bounds
.top 
; 
1439     // get the wx window position from the native one 
1440     x1 
-= MacGetLeftBorderSize() ; 
1441     y1 
-= MacGetTopBorderSize() ; 
1443     if ( !IsTopLevel() ) 
1445         wxWindow 
*parent 
= GetParent(); 
1448             // we must first adjust it to be in window coordinates of the parent, 
1449             // as otherwise it gets lost by the ClientAreaOrigin fix 
1450             x1 
+= parent
->MacGetLeftBorderSize() ; 
1451             y1 
+= parent
->MacGetTopBorderSize() ; 
1453             // and now to client coordinates 
1454             wxPoint 
pt(parent
->GetClientAreaOrigin()); 
1466 void wxWindowMac::DoScreenToClient(int *x
, int *y
) const 
1468     WindowRef window 
= (WindowRef
) MacGetTopLevelWindowRef() ; 
1469     wxCHECK_RET( window 
, wxT("TopLevel Window missing") ) ; 
1471     Point localwhere 
= { 0, 0 } ; 
1478     QDGlobalToLocalPoint( GetWindowPort( window 
) , &localwhere 
) ; 
1485     MacRootWindowToWindow( x 
, y 
) ; 
1487     wxPoint origin 
= GetClientAreaOrigin() ; 
1494 void wxWindowMac::DoClientToScreen(int *x
, int *y
) const 
1496     WindowRef window 
= (WindowRef
) MacGetTopLevelWindowRef() ; 
1497     wxCHECK_RET( window 
, wxT("TopLevel window missing") ) ; 
1499     wxPoint origin 
= GetClientAreaOrigin() ; 
1505     MacWindowToRootWindow( x 
, y 
) ; 
1507     Point localwhere 
= { 0, 0 }; 
1513     QDLocalToGlobalPoint( GetWindowPort( window 
) , &localwhere 
) ; 
1521 void wxWindowMac::MacClientToRootWindow( int *x 
, int *y 
) const 
1523     wxPoint origin 
= GetClientAreaOrigin() ; 
1529     MacWindowToRootWindow( x 
, y 
) ; 
1532 void wxWindowMac::MacRootWindowToClient( int *x 
, int *y 
) const 
1534     MacRootWindowToWindow( x 
, y 
) ; 
1536     wxPoint origin 
= GetClientAreaOrigin() ; 
1543 void wxWindowMac::MacWindowToRootWindow( int *x 
, int *y 
) const 
1552     if ( !IsTopLevel() ) 
1554         wxTopLevelWindowMac
* top 
= MacGetTopLevelWindow(); 
1557             pt
.x 
-= MacGetLeftBorderSize() ; 
1558             pt
.y 
-= MacGetTopBorderSize() ; 
1559             wxMacControl::Convert( &pt 
, m_peer 
, top
->m_peer 
) ; 
1569 void wxWindowMac::MacWindowToRootWindow( short *x 
, short *y 
) const 
1578     MacWindowToRootWindow( &x1 
, &y1 
) ; 
1586 void wxWindowMac::MacRootWindowToWindow( int *x 
, int *y 
) const 
1595     if ( !IsTopLevel() ) 
1597         wxTopLevelWindowMac
* top 
= MacGetTopLevelWindow(); 
1600             wxMacControl::Convert( &pt 
, top
->m_peer 
, m_peer 
) ; 
1601             pt
.x 
+= MacGetLeftBorderSize() ; 
1602             pt
.y 
+= MacGetTopBorderSize() ; 
1612 void wxWindowMac::MacRootWindowToWindow( short *x 
, short *y 
) const 
1621     MacRootWindowToWindow( &x1 
, &y1 
) ; 
1629 void wxWindowMac::MacGetContentAreaInset( int &left 
, int &top 
, int &right 
, int &bottom 
) 
1631     RgnHandle rgn 
= NewRgn() ; 
1633     if ( m_peer
->GetRegion( kControlContentMetaPart 
, rgn 
) == noErr 
) 
1635         Rect structure
, content 
; 
1637         GetRegionBounds( rgn 
, &content 
) ; 
1638         m_peer
->GetRect( &structure 
) ; 
1639         OffsetRect( &structure
, -structure
.left 
, -structure
.top 
) ; 
1641         left 
= content
.left 
- structure
.left 
; 
1642         top 
= content
.top 
- structure
.top 
; 
1643         right 
= structure
.right 
- content
.right 
; 
1644         bottom 
= structure
.bottom 
- content
.bottom 
; 
1648         left 
= top 
= right 
= bottom 
= 0 ; 
1654 wxSize 
wxWindowMac::DoGetSizeFromClientSize( const wxSize 
& size 
)  const 
1656     wxSize sizeTotal 
= size
; 
1658     RgnHandle rgn 
= NewRgn() ; 
1659     if ( m_peer
->GetRegion( kControlContentMetaPart 
, rgn 
) == noErr 
) 
1661         Rect content
, structure 
; 
1662         GetRegionBounds( rgn 
, &content 
) ; 
1663         m_peer
->GetRect( &structure 
) ; 
1665         // structure is in parent coordinates, but we only need width and height, so it's ok 
1667         sizeTotal
.x 
+= (structure
.right 
- structure
.left
) - (content
.right 
- content
.left
) ; 
1668         sizeTotal
.y 
+= (structure
.bottom 
- structure
.top
) - (content
.bottom 
- content
.top
) ; 
1673     sizeTotal
.x 
+= MacGetLeftBorderSize() + MacGetRightBorderSize() ; 
1674     sizeTotal
.y 
+= MacGetTopBorderSize() + MacGetBottomBorderSize() ; 
1679 // Get size *available for subwindows* i.e. excluding menu bar etc. 
1680 void wxWindowMac::DoGetClientSize( int *x
, int *y 
) const 
1684     RgnHandle rgn 
= NewRgn() ; 
1686     if ( m_peer
->GetRegion( kControlContentMetaPart 
, rgn 
) == noErr 
) 
1687         GetRegionBounds( rgn 
, &content 
) ; 
1689         m_peer
->GetRect( &content 
) ; 
1692     ww 
= content
.right 
- content
.left 
; 
1693     hh 
= content
.bottom 
- content
.top 
; 
1695     if (m_hScrollBar  
&& m_hScrollBar
->IsShown() ) 
1696         hh 
-= m_hScrollBar
->GetSize().y 
; 
1698     if (m_vScrollBar  
&& m_vScrollBar
->IsShown() ) 
1699         ww 
-= m_vScrollBar
->GetSize().x 
; 
1707 bool wxWindowMac::SetCursor(const wxCursor
& cursor
) 
1709     if (m_cursor 
== cursor
) 
1712     if (wxNullCursor 
== cursor
) 
1714         if ( ! wxWindowBase::SetCursor( *wxSTANDARD_CURSOR 
) ) 
1719         if ( ! wxWindowBase::SetCursor( cursor 
) ) 
1723     wxASSERT_MSG( m_cursor
.Ok(), 
1724         wxT("cursor must be valid after call to the base version")); 
1726     wxWindowMac 
*mouseWin 
= 0 ; 
1728         wxTopLevelWindowMac 
*tlw 
= MacGetTopLevelWindow() ; 
1729         WindowRef window 
= (WindowRef
) ( tlw 
? tlw
->MacGetWindowRef() : 0 ) ; 
1731         Boolean swapped 
= QDSwapPort( GetWindowPort( window 
) , &savePort 
) ; 
1733         // TODO: If we ever get a GetCurrentEvent... replacement 
1734         // for the mouse position, use it... 
1737         ControlPartCode part 
; 
1738         ControlRef control 
; 
1741         control 
= wxMacFindControlUnderMouse( tlw 
, pt 
, window 
, &part 
) ; 
1743             mouseWin 
= wxFindControlFromMacControl( control 
) ; 
1746             QDSwapPort( savePort 
, NULL 
) ; 
1749     if ( mouseWin 
== this && !wxIsBusy() ) 
1750         m_cursor
.MacInstall() ; 
1756 bool wxWindowMac::DoPopupMenu(wxMenu 
*menu
, int x
, int y
) 
1758     menu
->SetInvokingWindow(this); 
1761     if ( x 
== -1 && y 
== -1 ) 
1763         wxPoint mouse 
= wxGetMousePosition(); 
1769         ClientToScreen( &x 
, &y 
) ; 
1772     menu
->MacBeforeDisplay( true ) ; 
1773     long menuResult 
= ::PopUpMenuSelect((MenuHandle
) menu
->GetHMenu() , y
, x
, 0) ; 
1774     if ( HiWord(menuResult
) != 0 ) 
1777         GetMenuItemCommandID( GetMenuHandle(HiWord(menuResult
)) , LoWord(menuResult
) , &macid 
); 
1778         int id 
= wxMacCommandToId( macid 
); 
1779         wxMenuItem
* item 
= NULL 
; 
1781         item 
= menu
->FindItem( id
, &realmenu 
) ; 
1784             if (item
->IsCheckable()) 
1785                 item
->Check( !item
->IsChecked() ) ; 
1787             menu
->SendEvent( id 
, item
->IsCheckable() ? item
->IsChecked() : -1 ) ; 
1791     menu
->MacAfterDisplay( true ) ; 
1792     menu
->SetInvokingWindow( NULL 
); 
1798 // ---------------------------------------------------------------------------- 
1800 // ---------------------------------------------------------------------------- 
1804 void wxWindowMac::DoSetToolTip(wxToolTip 
*tooltip
) 
1806     wxWindowBase::DoSetToolTip(tooltip
); 
1809         m_tooltip
->SetWindow(this); 
1814 void wxWindowMac::MacInvalidateBorders() 
1816     if ( m_peer 
== NULL 
) 
1819     bool vis 
= MacIsReallyShown() ; 
1823     int outerBorder 
= MacGetLeftBorderSize() ; 
1824     if ( m_peer
->NeedsFocusRect() && m_peer
->HasFocus() ) 
1827     if ( outerBorder 
== 0 ) 
1830     // now we know that we have something to do at all 
1832     // as the borders are drawn on the parent we have to properly invalidate all these areas 
1833     RgnHandle updateInner 
, updateOuter
; 
1836     // this rectangle is in HIViewCoordinates under OSX and in Window Coordinates under Carbon 
1837     updateInner 
= NewRgn() ; 
1838     updateOuter 
= NewRgn() ; 
1840     m_peer
->GetRect( &rect 
) ; 
1841     RectRgn( updateInner
, &rect 
) ; 
1842     InsetRect( &rect 
, -outerBorder 
, -outerBorder 
) ; 
1843     RectRgn( updateOuter
, &rect 
) ; 
1844     DiffRgn( updateOuter
, updateInner 
, updateOuter 
) ; 
1846 #ifdef __WXMAC_OSX__ 
1847     GetParent()->m_peer
->SetNeedsDisplay( updateOuter 
) ; 
1849     WindowRef tlw 
= (WindowRef
) MacGetTopLevelWindowRef() ; 
1851         InvalWindowRgn( tlw 
, updateOuter 
) ; 
1854     DisposeRgn( updateOuter 
) ; 
1855     DisposeRgn( updateInner 
) ; 
1858 void wxWindowMac::DoMoveWindow(int x
, int y
, int width
, int height
) 
1860     // this is never called for a toplevel window, so we know we have a parent 
1861     int former_x 
, former_y 
, former_w
, former_h 
; 
1863     // Get true coordinates of former position 
1864     DoGetPosition( &former_x 
, &former_y 
) ; 
1865     DoGetSize( &former_w 
, &former_h 
) ; 
1867     wxWindow 
*parent 
= GetParent(); 
1870         wxPoint 
pt(parent
->GetClientAreaOrigin()); 
1875     int actualWidth 
= width 
; 
1876     int actualHeight 
= height 
; 
1880     if ((m_minWidth 
!= -1) && (actualWidth 
< m_minWidth
)) 
1881         actualWidth 
= m_minWidth
; 
1882     if ((m_minHeight 
!= -1) && (actualHeight 
< m_minHeight
)) 
1883         actualHeight 
= m_minHeight
; 
1884     if ((m_maxWidth 
!= -1) && (actualWidth 
> m_maxWidth
)) 
1885         actualWidth 
= m_maxWidth
; 
1886     if ((m_maxHeight 
!= -1) && (actualHeight 
> m_maxHeight
)) 
1887         actualHeight 
= m_maxHeight
; 
1889     bool doMove 
= false, doResize 
= false ; 
1891     if ( actualX 
!= former_x 
|| actualY 
!= former_y 
) 
1894     if ( actualWidth 
!= former_w 
|| actualHeight 
!= former_h 
) 
1897     if ( doMove 
|| doResize 
) 
1899         // as the borders are drawn outside the native control, we adjust now 
1901         wxRect 
bounds( wxPoint( actualX 
+ MacGetLeftBorderSize() ,actualY 
+ MacGetTopBorderSize() ), 
1902             wxSize( actualWidth 
- (MacGetLeftBorderSize() + MacGetRightBorderSize()) , 
1903                 actualHeight 
- (MacGetTopBorderSize() + MacGetBottomBorderSize()) ) ) ; 
1906         wxMacRectToNative( &bounds 
, &r 
) ; 
1908         if ( !GetParent()->IsTopLevel() ) 
1909             wxMacWindowToNative( GetParent() , &r 
) ; 
1911         MacInvalidateBorders() ; 
1913         m_cachedClippedRectValid 
= false ; 
1914         m_peer
->SetRect( &r 
) ; 
1916         wxWindowMac::MacSuperChangedPosition() ; // like this only children will be notified 
1918         MacInvalidateBorders() ; 
1920         MacRepositionScrollBars() ; 
1923             wxPoint 
point(actualX
, actualY
); 
1924             wxMoveEvent 
event(point
, m_windowId
); 
1925             event
.SetEventObject(this); 
1926             GetEventHandler()->ProcessEvent(event
) ; 
1931             MacRepositionScrollBars() ; 
1932             wxSize 
size(actualWidth
, actualHeight
); 
1933             wxSizeEvent 
event(size
, m_windowId
); 
1934             event
.SetEventObject(this); 
1935             GetEventHandler()->ProcessEvent(event
); 
1940 wxSize 
wxWindowMac::DoGetBestSize() const 
1942     if ( m_macIsUserPane 
|| IsTopLevel() ) 
1943         return wxWindowBase::DoGetBestSize() ; 
1945     Rect    bestsize 
= { 0 , 0 , 0 , 0 } ; 
1946     int bestWidth
, bestHeight 
; 
1948     m_peer
->GetBestRect( &bestsize 
) ; 
1949     if ( EmptyRect( &bestsize 
) ) 
1954         bestsize
.bottom 
= 16 ; 
1956         if ( IsKindOf( CLASSINFO( wxScrollBar 
) ) ) 
1958             bestsize
.bottom 
= 16 ; 
1961         else if ( IsKindOf( CLASSINFO( wxSpinButton 
) ) ) 
1963             bestsize
.bottom 
= 24 ; 
1968             // return wxWindowBase::DoGetBestSize() ; 
1972     bestWidth 
= bestsize
.right 
- bestsize
.left 
; 
1973     bestHeight 
= bestsize
.bottom 
- bestsize
.top 
; 
1974     if ( bestHeight 
< 10 ) 
1977     return wxSize(bestWidth
, bestHeight
); 
1980 // set the size of the window: if the dimensions are positive, just use them, 
1981 // but if any of them is equal to -1, it means that we must find the value for 
1982 // it ourselves (unless sizeFlags contains wxSIZE_ALLOW_MINUS_ONE flag, in 
1983 // which case -1 is a valid value for x and y) 
1985 // If sizeFlags contains wxSIZE_AUTO_WIDTH/HEIGHT flags (default), we calculate 
1986 // the width/height to best suit our contents, otherwise we reuse the current 
1988 void wxWindowMac::DoSetSize(int x
, int y
, int width
, int height
, int sizeFlags
) 
1990     // get the current size and position... 
1991     int currentX
, currentY
; 
1992     int currentW
, currentH
; 
1994     GetPosition(¤tX
, ¤tY
); 
1995     GetSize(¤tW
, ¤tH
); 
1997     // ... and don't do anything (avoiding flicker) if it's already ok 
1998     if ( x 
== currentX 
&& y 
== currentY 
&& 
1999         width 
== currentW 
&& height 
== currentH 
&& ( height 
!= -1 && width 
!= -1 ) ) 
2002         MacRepositionScrollBars() ; // we might have a real position shift 
2007     if ( !(sizeFlags 
& wxSIZE_ALLOW_MINUS_ONE
) ) 
2009         if ( x 
== wxDefaultCoord 
) 
2011         if ( y 
== wxDefaultCoord 
) 
2015     AdjustForParentClientOrigin( x
, y
, sizeFlags 
); 
2017     wxSize size 
= wxDefaultSize
; 
2018     if ( width 
== wxDefaultCoord 
) 
2020         if ( sizeFlags 
& wxSIZE_AUTO_WIDTH 
) 
2022             size 
= DoGetBestSize(); 
2027             // just take the current one 
2032     if ( height 
== wxDefaultCoord 
) 
2034         if ( sizeFlags 
& wxSIZE_AUTO_HEIGHT 
) 
2036             if ( size
.x 
== wxDefaultCoord 
) 
2037                 size 
= DoGetBestSize(); 
2038             // else: already called DoGetBestSize() above 
2044             // just take the current one 
2049     DoMoveWindow( x
, y
, width
, height 
); 
2052 wxPoint 
wxWindowMac::GetClientAreaOrigin() const 
2054     RgnHandle rgn 
= NewRgn() ; 
2056     if ( m_peer
->GetRegion( kControlContentMetaPart 
, rgn 
) == noErr 
) 
2058         GetRegionBounds( rgn 
, &content 
) ; 
2068     return wxPoint( content
.left 
+ MacGetLeftBorderSize() , content
.top 
+ MacGetTopBorderSize() ); 
2071 void wxWindowMac::DoSetClientSize(int clientwidth
, int clientheight
) 
2073     if ( clientheight 
!= wxDefaultCoord 
|| clientheight 
!= wxDefaultCoord 
) 
2075         int currentclientwidth 
, currentclientheight 
; 
2076         int currentwidth 
, currentheight 
; 
2078         GetClientSize( ¤tclientwidth 
, ¤tclientheight 
) ; 
2079         GetSize( ¤twidth 
, ¤theight 
) ; 
2081         DoSetSize( wxDefaultCoord 
, wxDefaultCoord 
, currentwidth 
+ clientwidth 
- currentclientwidth 
, 
2082             currentheight 
+ clientheight 
- currentclientheight 
, wxSIZE_USE_EXISTING 
) ; 
2086 void wxWindowMac::SetLabel(const wxString
& title
) 
2088     m_label 
= wxStripMenuCodes(title
) ; 
2090     if ( m_peer 
&& m_peer
->Ok() ) 
2091         m_peer
->SetLabel( m_label 
) ; 
2096 wxString 
wxWindowMac::GetLabel() const 
2101 bool wxWindowMac::Show(bool show
) 
2103     bool former 
= MacIsReallyShown() ; 
2104     if ( !wxWindowBase::Show(show
) ) 
2107     // TODO: use visibilityChanged Carbon Event for OSX 
2109         m_peer
->SetVisibility( show 
, true ) ; 
2111     if ( former 
!= MacIsReallyShown() ) 
2112         MacPropagateVisibilityChanged() ; 
2117 bool wxWindowMac::Enable(bool enable
) 
2119     wxASSERT( m_peer
->Ok() ) ; 
2120     bool former 
= MacIsReallyEnabled() ; 
2121     if ( !wxWindowBase::Enable(enable
) ) 
2124     m_peer
->Enable( enable 
) ; 
2126     if ( former 
!= MacIsReallyEnabled() ) 
2127         MacPropagateEnabledStateChanged() ; 
2133 // status change propagations (will be not necessary for OSX later ) 
2136 void wxWindowMac::MacPropagateVisibilityChanged() 
2138 #if !TARGET_API_MAC_OSX 
2139     MacVisibilityChanged() ; 
2142     wxWindowList::compatibility_iterator node 
= GetChildren().GetFirst(); 
2145         child 
= node
->GetData(); 
2146         if ( child
->IsShown() ) 
2147             child
->MacPropagateVisibilityChanged() ; 
2149         node 
= node
->GetNext(); 
2154 void wxWindowMac::MacPropagateEnabledStateChanged() 
2156 #if !TARGET_API_MAC_OSX 
2157     MacEnabledStateChanged() ; 
2160     wxWindowList::compatibility_iterator node 
= GetChildren().GetFirst(); 
2163         child 
= node
->GetData(); 
2164         if ( child
->IsEnabled() ) 
2165             child
->MacPropagateEnabledStateChanged() ; 
2167         node 
= node
->GetNext(); 
2172 void wxWindowMac::MacPropagateHiliteChanged() 
2174 #if !TARGET_API_MAC_OSX 
2175     MacHiliteChanged() ; 
2178     wxWindowList::compatibility_iterator node 
= GetChildren().GetFirst(); 
2181         child 
= node
->GetData(); 
2182         if (child 
/* && child->IsEnabled() */) 
2183             child
->MacPropagateHiliteChanged() ; 
2185         node 
= node
->GetNext(); 
2191 // status change notifications 
2194 void wxWindowMac::MacVisibilityChanged() 
2198 void wxWindowMac::MacHiliteChanged() 
2202 void wxWindowMac::MacEnabledStateChanged() 
2207 // status queries on the inherited window's state 
2210 bool wxWindowMac::MacIsReallyShown() 
2212     // only under OSX the visibility of the TLW is taken into account 
2213     if ( m_isBeingDeleted 
) 
2216 #if TARGET_API_MAC_OSX 
2217     if ( m_peer 
&& m_peer
->Ok() ) 
2218         return m_peer
->IsVisible(); 
2221     wxWindow
* win 
= this ; 
2222     while ( win
->IsShown() ) 
2224         if ( win
->IsTopLevel() ) 
2227         win 
= win
->GetParent() ; 
2235 bool wxWindowMac::MacIsReallyEnabled() 
2237     return m_peer
->IsEnabled() ; 
2240 bool wxWindowMac::MacIsReallyHilited() 
2242     return m_peer
->IsActive(); 
2245 void wxWindowMac::MacFlashInvalidAreas() 
2247 #if TARGET_API_MAC_OSX 
2248     HIViewFlashDirtyArea( (WindowRef
) MacGetTopLevelWindowRef() ) ; 
2252 int wxWindowMac::GetCharHeight() const 
2254     wxClientDC 
dc( (wxWindowMac
*)this ) ; 
2256     return dc
.GetCharHeight() ; 
2259 int wxWindowMac::GetCharWidth() const 
2261     wxClientDC 
dc( (wxWindowMac
*)this ) ; 
2263     return dc
.GetCharWidth() ; 
2266 void wxWindowMac::GetTextExtent(const wxString
& string
, int *x
, int *y
, 
2267                            int *descent
, int *externalLeading
, const wxFont 
*theFont 
) const 
2269     const wxFont 
*fontToUse 
= theFont
; 
2271         fontToUse 
= &m_font
; 
2273     wxClientDC 
dc( (wxWindowMac
*) this ) ; 
2275     dc
.GetTextExtent( string 
, &lx 
, &ly 
, &ld
, &le
, (wxFont 
*)fontToUse 
) ; 
2276     if ( externalLeading 
) 
2277         *externalLeading 
= le 
; 
2287  * Rect is given in client coordinates, for further reading, read wxTopLevelWindowMac::InvalidateRect 
2288  * we always intersect with the entire window, not only with the client area 
2291 void wxWindowMac::Refresh(bool eraseBack
, const wxRect 
*rect
) 
2293     if ( m_peer 
== NULL 
) 
2296     if ( !MacIsReallyShown() ) 
2303         wxMacRectToNative( rect 
, &r 
) ; 
2304         m_peer
->SetNeedsDisplay( &r 
) ; 
2308         m_peer
->SetNeedsDisplay() ; 
2312 void wxWindowMac::Freeze() 
2314 #if TARGET_API_MAC_OSX 
2315     if ( !m_frozenness
++ ) 
2317         if ( m_peer 
&& m_peer
->Ok() ) 
2318             m_peer
->SetDrawingEnabled( false ) ; 
2323 void wxWindowMac::Thaw() 
2325 #if TARGET_API_MAC_OSX 
2326     wxASSERT_MSG( m_frozenness 
> 0, wxT("Thaw() without matching Freeze()") ); 
2328     if ( !--m_frozenness 
) 
2330         if ( m_peer 
&& m_peer
->Ok() ) 
2332             m_peer
->SetDrawingEnabled( true ) ; 
2333             m_peer
->InvalidateWithChildren() ; 
2339 wxWindowMac 
*wxGetActiveWindow() 
2341     // actually this is a windows-only concept 
2345 // Coordinates relative to the window 
2346 void wxWindowMac::WarpPointer(int x_pos
, int y_pos
) 
2348     // We really don't move the mouse programmatically under Mac. 
2351 void wxWindowMac::OnEraseBackground(wxEraseEvent
& event
) 
2353     if ( MacGetTopLevelWindow() == NULL 
) 
2356 #if TARGET_API_MAC_OSX 
2357     if ( MacGetTopLevelWindow()->MacUsesCompositing() && (!m_macBackgroundBrush
.Ok() || m_macBackgroundBrush
.GetStyle() == wxTRANSPARENT 
) ) 
2364         event
.GetDC()->Clear() ; 
2368 void wxWindowMac::OnNcPaint( wxNcPaintEvent
& event 
) 
2373 int wxWindowMac::GetScrollPos(int orient
) const 
2375     if ( orient 
== wxHORIZONTAL 
) 
2378            return m_hScrollBar
->GetThumbPosition() ; 
2383            return m_vScrollBar
->GetThumbPosition() ; 
2389 // This now returns the whole range, not just the number 
2390 // of positions that we can scroll. 
2391 int wxWindowMac::GetScrollRange(int orient
) const 
2393     if ( orient 
== wxHORIZONTAL 
) 
2396            return m_hScrollBar
->GetRange() ; 
2401            return m_vScrollBar
->GetRange() ; 
2407 int wxWindowMac::GetScrollThumb(int orient
) const 
2409     if ( orient 
== wxHORIZONTAL 
) 
2412            return m_hScrollBar
->GetThumbSize() ; 
2417            return m_vScrollBar
->GetThumbSize() ; 
2423 void wxWindowMac::SetScrollPos(int orient
, int pos
, bool refresh
) 
2425     if ( orient 
== wxHORIZONTAL 
) 
2428            m_hScrollBar
->SetThumbPosition( pos 
) ; 
2433            m_vScrollBar
->SetThumbPosition( pos 
) ; 
2438 // we draw borders and grow boxes, are already set up and clipped in the current port / cgContextRef 
2439 // our own window origin is at leftOrigin/rightOrigin 
2442 void wxWindowMac::MacPaintBorders( int leftOrigin 
, int rightOrigin 
) 
2448     bool hasFocus 
= m_peer
->NeedsFocusRect() && m_peer
->HasFocus() ; 
2449     bool hasBothScrollbars 
= (m_hScrollBar 
&& m_hScrollBar
->IsShown()) && (m_vScrollBar 
&& m_vScrollBar
->IsShown()) ; 
2451     // back to the surrounding frame rectangle 
2452     m_peer
->GetRect( &rect 
) ; 
2453     InsetRect( &rect
, -1 , -1 ) ; 
2455 #if wxMAC_USE_CORE_GRAPHICS && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3 
2456     if ( UMAGetSystemVersion() >= 0x1030 ) 
2458         CGRect cgrect 
= CGRectMake( rect
.left 
, rect
.top 
, rect
.right 
- rect
.left 
, 
2459             rect
.bottom 
- rect
.top 
) ; 
2461         HIThemeFrameDrawInfo info 
; 
2462         memset( &info
, 0 , sizeof(info
) ) ; 
2466         info
.state 
= IsEnabled() ? kThemeStateActive 
: kThemeStateInactive 
; 
2467         info
.isFocused 
= hasFocus 
; 
2469         CGContextRef cgContext 
= (CGContextRef
) GetParent()->MacGetCGContextRef() ; 
2470         wxASSERT( cgContext 
) ; 
2472         if ( HasFlag(wxRAISED_BORDER
) || HasFlag(wxSUNKEN_BORDER
) || HasFlag(wxDOUBLE_BORDER
) ) 
2474             info
.kind 
= kHIThemeFrameTextFieldSquare 
; 
2475             HIThemeDrawFrame( &cgrect 
, &info 
, cgContext 
, kHIThemeOrientationNormal 
) ; 
2477         else if ( HasFlag(wxSIMPLE_BORDER
) ) 
2479             info
.kind 
= kHIThemeFrameListBox 
; 
2480             HIThemeDrawFrame( &cgrect 
, &info 
, cgContext 
, kHIThemeOrientationNormal 
) ; 
2482         else if ( hasFocus 
) 
2484             HIThemeDrawFocusRect( &cgrect 
, true , cgContext 
, kHIThemeOrientationNormal 
) ; 
2487         m_peer
->GetRect( &rect 
) ; 
2488         if ( hasBothScrollbars 
) 
2490             int size 
= m_hScrollBar
->GetWindowVariant() == wxWINDOW_VARIANT_NORMAL 
? 16 : 12 ; 
2491             CGRect cgrect 
= CGRectMake( rect
.right 
- size 
, rect
.bottom 
- size 
, size 
, size 
) ; 
2492             CGPoint cgpoint 
= CGPointMake( rect
.right 
- size 
, rect
.bottom 
- size 
) ; 
2493             HIThemeGrowBoxDrawInfo info 
; 
2494             memset( &info
, 0, sizeof(info
) ) ; 
2496             info
.state 
= IsEnabled() ? kThemeStateActive 
: kThemeStateInactive 
; 
2497             info
.kind 
= kHIThemeGrowBoxKindNone 
; 
2498             info
.size 
= kHIThemeGrowBoxSizeNormal 
; 
2499             info
.direction 
= kThemeGrowRight 
| kThemeGrowDown 
; 
2500             HIThemeDrawGrowBox( &cgpoint 
, &info 
, cgContext 
, kHIThemeOrientationNormal 
) ; 
2506         wxTopLevelWindowMac
* top 
= MacGetTopLevelWindow(); 
2510             wxMacControl::Convert( &pt 
, GetParent()->m_peer 
, top
->m_peer 
) ; 
2511             OffsetRect( &rect 
, pt
.x 
, pt
.y 
) ; 
2514         if ( HasFlag(wxRAISED_BORDER
) || HasFlag( wxSUNKEN_BORDER
) || HasFlag(wxDOUBLE_BORDER
) ) 
2515             DrawThemeEditTextFrame( &rect
, IsEnabled() ? kThemeStateActive 
: kThemeStateInactive 
) ; 
2516         else if ( HasFlag(wxSIMPLE_BORDER
) ) 
2517             DrawThemeListBoxFrame( &rect
, IsEnabled() ? kThemeStateActive 
: kThemeStateInactive 
) ; 
2520             DrawThemeFocusRect( &rect 
, true ) ; 
2522         if ( hasBothScrollbars 
) 
2524             // GetThemeStandaloneGrowBoxBounds 
2525             // DrawThemeStandaloneNoGrowBox 
2530 void wxWindowMac::RemoveChild( wxWindowBase 
*child 
) 
2532     if ( child 
== m_hScrollBar 
) 
2533         m_hScrollBar 
= NULL 
; 
2534     if ( child 
== m_vScrollBar 
) 
2535         m_vScrollBar 
= NULL 
; 
2537     wxWindowBase::RemoveChild( child 
) ; 
2540 // New function that will replace some of the above. 
2541 void wxWindowMac::SetScrollbar(int orient
, int pos
, int thumbVisible
, 
2542     int range
, bool refresh
) 
2546     if ( orient 
== wxHORIZONTAL 
) 
2550             showScroller 
= ((range 
!= 0) && (range 
> thumbVisible
)); 
2551             if ( m_hScrollBar
->IsShown() != showScroller 
) 
2552                 m_hScrollBar
->Show( showScroller 
) ; 
2554             m_hScrollBar
->SetScrollbar( pos 
, thumbVisible 
, range 
, thumbVisible 
, refresh 
) ; 
2561             showScroller 
= ((range 
!= 0) && (range 
> thumbVisible
)); 
2562             if ( m_vScrollBar
->IsShown() != showScroller 
) 
2563                 m_vScrollBar
->Show( showScroller 
) ; 
2565             m_vScrollBar
->SetScrollbar( pos 
, thumbVisible 
, range 
, thumbVisible 
, refresh 
) ; 
2569     MacRepositionScrollBars() ; 
2572 // Does a physical scroll 
2573 void wxWindowMac::ScrollWindow(int dx
, int dy
, const wxRect 
*rect
) 
2575     if ( dx 
== 0 && dy 
== 0 ) 
2578     int width 
, height 
; 
2579     GetClientSize( &width 
, &height 
) ; 
2581 #if TARGET_API_MAC_OSX 
2582     if ( true /* m_peer->IsCompositing() */ ) 
2584         // note there currently is a bug in OSX which makes inefficient refreshes in case an entire control 
2585         // area is scrolled, this does not occur if width and height are 2 pixels less, 
2586         // TODO: write optimal workaround 
2587         wxRect 
scrollrect( MacGetLeftBorderSize() , MacGetTopBorderSize() , width 
, height 
) ; 
2589             scrollrect
.Intersect( *rect 
) ; 
2591         if ( m_peer
->GetNeedsDisplay() ) 
2593             // because HIViewScrollRect does not scroll the already invalidated area we have two options: 
2594             // either immediate redraw or full invalidate 
2596             // is the better overall solution, as it does not slow down scrolling 
2597             m_peer
->SetNeedsDisplay() ; 
2599             // this would be the preferred version for fast drawing controls 
2601 #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3 
2602             if ( UMAGetSystemVersion() >= 0x1030 && m_peer
->IsCompositing() ) 
2603                 HIViewRender(m_peer
->GetControlRef()) ; 
2610         // as the native control might be not a 0/0 wx window coordinates, we have to offset 
2611         scrollrect
.Offset( -MacGetLeftBorderSize() , -MacGetTopBorderSize() ) ; 
2612         m_peer
->ScrollRect( &scrollrect 
, dx 
, dy 
) ; 
2614         // becuase HIViewScrollRect does not scroll the already invalidated area we have two options 
2615         // either immediate redraw or full invalidate 
2617         // is the better overall solution, as it does not slow down scrolling 
2618         m_peer
->SetNeedsDisplay() ; 
2620         // this would be the preferred version for fast drawing controls 
2622 #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3 
2623             if ( UMAGetSystemVersion() >= 0x1030 && m_peer
->IsCompositing() ) 
2624                 HIViewRender(m_peer
->GetControlRef()) ; 
2638         RgnHandle updateRgn 
= NewRgn() ; 
2641             wxClientDC 
dc(this) ; 
2642             wxMacPortSetter 
helper(&dc
) ; 
2644             m_peer
->GetRectInWindowCoords( &scrollrect 
) ; 
2645             //scrollrect.top += MacGetTopBorderSize() ; 
2646             //scrollrect.left += MacGetLeftBorderSize() ; 
2647             scrollrect
.bottom 
= scrollrect
.top 
+ height 
; 
2648             scrollrect
.right 
= scrollrect
.left 
+ width 
; 
2652                 Rect r 
= { dc
.YLOG2DEVMAC(rect
->y
) , dc
.XLOG2DEVMAC(rect
->x
) , dc
.YLOG2DEVMAC(rect
->y 
+ rect
->height
) , 
2653                     dc
.XLOG2DEVMAC(rect
->x 
+ rect
->width
) } ; 
2654                 SectRect( &scrollrect 
, &r 
, &scrollrect 
) ; 
2657             ScrollRect( &scrollrect 
, dx 
, dy 
, updateRgn 
) ; 
2659             // now scroll the former update region as well and add the new update region 
2660             WindowRef rootWindow 
= (WindowRef
) MacGetTopLevelWindowRef() ; 
2661             RgnHandle formerUpdateRgn 
= NewRgn() ; 
2662             RgnHandle scrollRgn 
= NewRgn() ; 
2663             RectRgn( scrollRgn 
, &scrollrect 
) ; 
2664             GetWindowUpdateRgn( rootWindow 
, formerUpdateRgn 
) ; 
2666             LocalToGlobal( &pt 
) ; 
2667             OffsetRgn( formerUpdateRgn 
, -pt
.h 
, -pt
.v 
) ; 
2668             SectRgn( formerUpdateRgn 
, scrollRgn 
, formerUpdateRgn 
) ; 
2670             if ( !EmptyRgn( formerUpdateRgn 
) ) 
2672                 MacOffsetRgn( formerUpdateRgn 
, dx 
, dy 
) ; 
2673                 SectRgn( formerUpdateRgn 
, scrollRgn 
, formerUpdateRgn 
) ; 
2674                 InvalWindowRgn( rootWindow
, formerUpdateRgn 
) ; 
2677             InvalWindowRgn(rootWindow
, updateRgn 
) ; 
2678             DisposeRgn( updateRgn 
) ; 
2679             DisposeRgn( formerUpdateRgn 
) ; 
2680             DisposeRgn( scrollRgn 
) ; 
2688     for (wxWindowList::compatibility_iterator node 
= GetChildren().GetFirst(); node
; node 
= node
->GetNext()) 
2690         child 
= node
->GetData(); 
2693         if (child 
== m_vScrollBar
) 
2695         if (child 
== m_hScrollBar
) 
2697         if (child
->IsTopLevel()) 
2700         child
->GetPosition( &x
, &y 
); 
2701         child
->GetSize( &w
, &h 
); 
2704             wxRect 
rc( x
, y
, w
, h 
); 
2705             if (rect
->Intersects( rc 
)) 
2706                 child
->SetSize( x 
+ dx
, y 
+ dy
, w
, h 
); 
2710             child
->SetSize( x 
+ dx
, y 
+ dy
, w
, h 
); 
2715 void wxWindowMac::MacOnScroll( wxScrollEvent 
&event 
) 
2717     if ( event
.GetEventObject() == m_vScrollBar 
|| event
.GetEventObject() == m_hScrollBar 
) 
2719         wxScrollWinEvent wevent
; 
2720         wevent
.SetPosition(event
.GetPosition()); 
2721         wevent
.SetOrientation(event
.GetOrientation()); 
2722         wevent
.SetEventObject(this); 
2724         if (event
.GetEventType() == wxEVT_SCROLL_TOP
) 
2725             wevent
.SetEventType( wxEVT_SCROLLWIN_TOP 
); 
2726         else if (event
.GetEventType() == wxEVT_SCROLL_BOTTOM
) 
2727             wevent
.SetEventType( wxEVT_SCROLLWIN_BOTTOM 
); 
2728         else if (event
.GetEventType() == wxEVT_SCROLL_LINEUP
) 
2729             wevent
.SetEventType( wxEVT_SCROLLWIN_LINEUP 
); 
2730         else if (event
.GetEventType() == wxEVT_SCROLL_LINEDOWN
) 
2731             wevent
.SetEventType( wxEVT_SCROLLWIN_LINEDOWN 
); 
2732         else if (event
.GetEventType() == wxEVT_SCROLL_PAGEUP
) 
2733             wevent
.SetEventType( wxEVT_SCROLLWIN_PAGEUP 
); 
2734         else if (event
.GetEventType() == wxEVT_SCROLL_PAGEDOWN
) 
2735             wevent
.SetEventType( wxEVT_SCROLLWIN_PAGEDOWN 
); 
2736         else if (event
.GetEventType() == wxEVT_SCROLL_THUMBTRACK
) 
2737             wevent
.SetEventType( wxEVT_SCROLLWIN_THUMBTRACK 
); 
2738         else if (event
.GetEventType() == wxEVT_SCROLL_THUMBRELEASE
) 
2739             wevent
.SetEventType( wxEVT_SCROLLWIN_THUMBRELEASE 
); 
2741         GetEventHandler()->ProcessEvent(wevent
); 
2745 // Get the window with the focus 
2746 wxWindowMac 
*wxWindowBase::DoFindFocus() 
2748     ControlRef control 
; 
2749     GetKeyboardFocus( GetUserFocusWindow() , &control 
) ; 
2750     return wxFindControlFromMacControl( control 
) ; 
2753 void wxWindowMac::OnSetFocus( wxFocusEvent
& event 
) 
2755     // panel wants to track the window which was the last to have focus in it, 
2756     // so we want to set ourselves as the window which last had focus 
2758     // notice that it's also important to do it upwards the tree because 
2759     // otherwise when the top level panel gets focus, it won't set it back to 
2760     // us, but to some other sibling 
2762     // CS: don't know if this is still needed: 
2763     //wxChildFocusEvent eventFocus(this); 
2764     //(void)GetEventHandler()->ProcessEvent(eventFocus); 
2766     if ( MacGetTopLevelWindow() && m_peer
->NeedsFocusRect() ) 
2768 #if wxMAC_USE_CORE_GRAPHICS 
2769         GetParent()->Refresh() ; 
2771         wxMacWindowStateSaver 
sv( this ) ; 
2774         m_peer
->GetRect( &rect 
) ; 
2775         // auf den umgebenden Rahmen zur\9fck 
2776         InsetRect( &rect
, -1 , -1 ) ; 
2778         wxTopLevelWindowMac
* top 
= MacGetTopLevelWindow(); 
2782             wxMacControl::Convert( &pt 
, GetParent()->m_peer 
, top
->m_peer 
) ; 
2784             rect
.right 
+= pt
.x 
; 
2786             rect
.bottom 
+= pt
.y 
; 
2789         bool bIsFocusEvent 
= (event
.GetEventType() == wxEVT_SET_FOCUS
); 
2790         DrawThemeFocusRect( &rect 
, bIsFocusEvent 
) ; 
2791         if ( !bIsFocusEvent 
) 
2793             // as this erases part of the frame we have to redraw borders 
2794             // and because our z-ordering is not always correct (staticboxes) 
2795             // we have to invalidate things, we cannot simple redraw 
2796             MacInvalidateBorders() ; 
2804 void wxWindowMac::OnInternalIdle() 
2806     // This calls the UI-update mechanism (querying windows for 
2807     // menu/toolbar/control state information) 
2808     if (wxUpdateUIEvent::CanUpdate(this)) 
2809         UpdateWindowUI(wxUPDATE_UI_FROMIDLE
); 
2812 // Raise the window to the top of the Z order 
2813 void wxWindowMac::Raise() 
2815     m_peer
->SetZOrder( true , NULL 
) ; 
2818 // Lower the window to the bottom of the Z order 
2819 void wxWindowMac::Lower() 
2821     m_peer
->SetZOrder( false , NULL 
) ; 
2824 // static wxWindow *gs_lastWhich = NULL; 
2826 bool wxWindowMac::MacSetupCursor( const wxPoint
& pt 
) 
2828     // first trigger a set cursor event 
2830     wxPoint clientorigin 
= GetClientAreaOrigin() ; 
2831     wxSize clientsize 
= GetClientSize() ; 
2833     if ( wxRect2DInt( clientorigin
.x 
, clientorigin
.y 
, clientsize
.x 
, clientsize
.y 
).Contains( wxPoint2DInt( pt 
) ) ) 
2835         wxSetCursorEvent 
event( pt
.x 
, pt
.y 
); 
2837         bool processedEvtSetCursor 
= GetEventHandler()->ProcessEvent(event
); 
2838         if ( processedEvtSetCursor 
&& event
.HasCursor() ) 
2840             cursor 
= event
.GetCursor() ; 
2844             // the test for processedEvtSetCursor is here to prevent using m_cursor 
2845             // if the user code caught EVT_SET_CURSOR() and returned nothing from 
2846             // it - this is a way to say that our cursor shouldn't be used for this 
2848             if ( !processedEvtSetCursor 
&& m_cursor
.Ok() ) 
2851             if ( !wxIsBusy() && !GetParent() ) 
2852                 cursor 
= *wxSTANDARD_CURSOR 
; 
2856             cursor
.MacInstall() ; 
2859     return cursor
.Ok() ; 
2862 wxString 
wxWindowMac::MacGetToolTipString( wxPoint 
&pt 
) 
2866         return m_tooltip
->GetTip() ; 
2869     return wxEmptyString 
; 
2872 void wxWindowMac::ClearBackground() 
2878 void wxWindowMac::Update() 
2880 #if TARGET_API_MAC_OSX 
2881     MacGetTopLevelWindow()->MacPerformUpdates() ; 
2883     ::Draw1Control( m_peer
->GetControlRef() ) ; 
2887 wxTopLevelWindowMac
* wxWindowMac::MacGetTopLevelWindow() const 
2889     wxTopLevelWindowMac
* win 
= NULL 
; 
2890     WindowRef window 
= (WindowRef
) MacGetTopLevelWindowRef() ; 
2892         win 
= wxFindWinFromMacWindow( window 
) ; 
2897 const wxRect
& wxWindowMac::MacGetClippedClientRect() const 
2899     MacUpdateClippedRects() ; 
2901     return m_cachedClippedClientRect 
; 
2904 const wxRect
& wxWindowMac::MacGetClippedRect() const 
2906     MacUpdateClippedRects() ; 
2908     return m_cachedClippedRect 
; 
2911 const wxRect
&wxWindowMac:: MacGetClippedRectWithOuterStructure() const 
2913     MacUpdateClippedRects() ; 
2915     return m_cachedClippedRectWithOuterStructure 
; 
2918 const wxRegion
& wxWindowMac::MacGetVisibleRegion( bool includeOuterStructures 
) 
2920     static wxRegion emptyrgn 
; 
2922     if ( !m_isBeingDeleted 
&& MacIsReallyShown() /*m_peer->IsVisible() */ ) 
2924         MacUpdateClippedRects() ; 
2925         if ( includeOuterStructures 
) 
2926             return m_cachedClippedRegionWithOuterStructure 
; 
2928             return m_cachedClippedRegion 
; 
2936 void wxWindowMac::MacUpdateClippedRects() const 
2938     if ( m_cachedClippedRectValid 
) 
2941     // includeOuterStructures is true if we try to draw somthing like a focus ring etc. 
2942     // also a window dc uses this, in this case we only clip in the hierarchy for hard 
2943     // borders like a scrollwindow, splitter etc otherwise we end up in a paranoia having 
2944     // to add focus borders everywhere 
2946     Rect r
, rIncludingOuterStructures 
; 
2948     m_peer
->GetRect( &r 
) ; 
2949     r
.left 
-= MacGetLeftBorderSize() ; 
2950     r
.top 
-= MacGetTopBorderSize() ; 
2951     r
.bottom 
+= MacGetBottomBorderSize() ; 
2952     r
.right 
+= MacGetRightBorderSize() ; 
2959     rIncludingOuterStructures 
= r 
; 
2960     InsetRect( &rIncludingOuterStructures 
, -4 , -4 ) ; 
2962     wxRect cl 
= GetClientRect() ; 
2963     Rect rClient 
= { cl
.y 
, cl
.x 
, cl
.y 
+ cl
.height 
, cl
.x 
+ cl
.width 
} ; 
2967     const wxWindow
* child 
= this ; 
2968     const wxWindow
* parent 
= NULL 
; 
2970     while ( !child
->IsTopLevel() && ( parent 
= child
->GetParent() ) != NULL 
) 
2972         if ( parent
->MacIsChildOfClientArea(child
) ) 
2974             size 
= parent
->GetClientSize() ; 
2975             wxPoint origin 
= parent
->GetClientAreaOrigin() ; 
2981             // this will be true for scrollbars, toolbars etc. 
2982             size 
= parent
->GetSize() ; 
2983             y 
= parent
->MacGetTopBorderSize() ; 
2984             x 
= parent
->MacGetLeftBorderSize() ; 
2985             size
.x 
-= parent
->MacGetLeftBorderSize() + parent
->MacGetRightBorderSize() ; 
2986             size
.y 
-= parent
->MacGetTopBorderSize() + parent
->MacGetBottomBorderSize() ; 
2989         parent
->MacWindowToRootWindow( &x
, &y 
) ; 
2990         MacRootWindowToWindow( &x 
, &y 
) ; 
2992         Rect rparent 
= { y 
, x 
, y 
+ size
.y 
, x 
+ size
.x 
} ; 
2994         // the wxwindow and client rects will always be clipped 
2995         SectRect( &r 
, &rparent 
, &r 
) ; 
2996         SectRect( &rClient 
, &rparent 
, &rClient 
) ; 
2998         // the structure only at 'hard' borders 
2999         if ( parent
->MacClipChildren() || 
3000             ( parent
->GetParent() && parent
->GetParent()->MacClipGrandChildren() ) ) 
3002             SectRect( &rIncludingOuterStructures 
, &rparent 
, &rIncludingOuterStructures 
) ; 
3008     m_cachedClippedRect 
= wxRect( r
.left 
, r
.top 
, r
.right 
- r
.left 
, r
.bottom 
- r
.top 
) ; 
3009     m_cachedClippedClientRect 
= wxRect( rClient
.left 
, rClient
.top 
, 
3010         rClient
.right 
- rClient
.left 
, rClient
.bottom 
- rClient
.top 
) ; 
3011     m_cachedClippedRectWithOuterStructure 
= wxRect( 
3012         rIncludingOuterStructures
.left 
, rIncludingOuterStructures
.top 
, 
3013         rIncludingOuterStructures
.right 
- rIncludingOuterStructures
.left 
, 
3014         rIncludingOuterStructures
.bottom 
- rIncludingOuterStructures
.top 
) ; 
3016     m_cachedClippedRegionWithOuterStructure 
= wxRegion( m_cachedClippedRectWithOuterStructure 
) ; 
3017     m_cachedClippedRegion 
= wxRegion( m_cachedClippedRect 
) ; 
3018     m_cachedClippedClientRegion 
= wxRegion( m_cachedClippedClientRect 
) ; 
3020     m_cachedClippedRectValid 
= true ; 
3024     This function must not change the updatergn ! 
3026 bool wxWindowMac::MacDoRedraw( WXHRGN updatergnr 
, long time 
) 
3028     bool handled 
= false ; 
3030     RgnHandle updatergn 
= (RgnHandle
) updatergnr 
; 
3031     GetRegionBounds( updatergn 
, &updatebounds 
) ; 
3033     // wxLogDebug(wxT("update for %s bounds %d, %d, %d, %d"), wxString(GetClassInfo()->GetClassName()).c_str(), updatebounds.left, updatebounds.top , updatebounds.right , updatebounds.bottom ) ; 
3035     if ( !EmptyRgn(updatergn
) ) 
3037         RgnHandle newupdate 
= NewRgn() ; 
3038         wxSize point 
= GetClientSize() ; 
3039         wxPoint origin 
= GetClientAreaOrigin() ; 
3040         SetRectRgn( newupdate 
, origin
.x 
, origin
.y 
, origin
.x 
+ point
.x 
, origin
.y 
+ point
.y 
) ; 
3041         SectRgn( newupdate 
, updatergn 
, newupdate 
) ; 
3043         // first send an erase event to the entire update area 
3045             // for the toplevel window this really is the entire area 
3046             // for all the others only their client area, otherwise they 
3047             // might be drawing with full alpha and eg put blue into 
3048             // the grow-box area of a scrolled window (scroll sample) 
3049             wxDC
* dc 
= new wxWindowDC(this); 
3051                 dc
->SetClippingRegion(wxRegion(updatergn
)); 
3053                 dc
->SetClippingRegion(wxRegion(newupdate
)); 
3055             wxEraseEvent 
eevent( GetId(), dc 
); 
3056             eevent
.SetEventObject( this ); 
3057             GetEventHandler()->ProcessEvent( eevent 
); 
3061         // calculate a client-origin version of the update rgn and set m_updateRegion to that 
3062         OffsetRgn( newupdate 
, -origin
.x 
, -origin
.y 
) ; 
3063         m_updateRegion 
= newupdate 
; 
3064         DisposeRgn( newupdate 
) ; 
3066         if ( !m_updateRegion
.Empty() ) 
3068             // paint the window itself 
3071             event
.SetTimestamp(time
); 
3072             event
.SetEventObject(this); 
3073             GetEventHandler()->ProcessEvent(event
); 
3077         // now we cannot rely on having its borders drawn by a window itself, as it does not 
3078         // get the updateRgn wide enough to always do so, so we do it from the parent 
3079         // this would also be the place to draw any custom backgrounds for native controls 
3080         // in Composited windowing 
3081         wxPoint clientOrigin 
= GetClientAreaOrigin() ; 
3085         for (wxWindowList::compatibility_iterator node 
= GetChildren().GetFirst(); node
; node 
= node
->GetNext()) 
3087             child 
= node
->GetData(); 
3090             if (child 
== m_vScrollBar
) 
3092             if (child 
== m_hScrollBar
) 
3094             if (child
->IsTopLevel()) 
3096             if (!child
->IsShown()) 
3099             // only draw those in the update region (add a safety margin of 10 pixels for shadow effects 
3101             child
->GetPosition( &x
, &y 
); 
3102             child
->GetSize( &w
, &h 
); 
3103             Rect childRect 
= { y 
, x 
, y 
+ h 
, x 
+ w 
} ; 
3104             OffsetRect( &childRect 
, clientOrigin
.x 
, clientOrigin
.y 
) ; 
3105             InsetRect( &childRect 
, -10 , -10) ; 
3107             if ( RectInRgn( &childRect 
, updatergn 
) ) 
3109                 // paint custom borders 
3110                 wxNcPaintEvent 
eventNc( child
->GetId() ); 
3111                 eventNc
.SetEventObject( child 
); 
3112                 if ( !child
->GetEventHandler()->ProcessEvent( eventNc 
) ) 
3114 #if wxMAC_USE_CORE_GRAPHICS && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3 
3115                     if ( UMAGetSystemVersion() >= 0x1030 ) 
3117                         child
->MacPaintBorders(0, 0) ; 
3122                         wxWindowDC 
dc(this) ; 
3123                         dc
.SetClippingRegion(wxRegion(updatergn
)); 
3124                         wxMacPortSetter 
helper(&dc
) ; 
3125                         child
->MacPaintBorders(0, 0) ; 
3136 WXWindow 
wxWindowMac::MacGetTopLevelWindowRef() const 
3138     wxWindowMac 
*iter 
= (wxWindowMac
*)this ; 
3142         if ( iter
->IsTopLevel() ) 
3143             return ((wxTopLevelWindow
*)iter
)->MacGetWindowRef() ; 
3145         iter 
= iter
->GetParent() ; 
3148     wxASSERT_MSG( 1 , wxT("No valid mac root window") ) ; 
3153 void wxWindowMac::MacCreateScrollBars( long style 
) 
3155     wxASSERT_MSG( m_vScrollBar 
== NULL 
&& m_hScrollBar 
== NULL 
, wxT("attempt to create window twice") ) ; 
3157     if ( style 
& ( wxVSCROLL 
| wxHSCROLL 
) ) 
3159         bool hasBoth 
= ( style 
& wxVSCROLL 
) && ( style 
& wxHSCROLL 
) ; 
3160         int scrlsize 
= MAC_SCROLLBAR_SIZE 
; 
3161         wxWindowVariant variant 
= wxWINDOW_VARIANT_NORMAL 
; 
3162         if ( GetWindowVariant() == wxWINDOW_VARIANT_SMALL 
|| GetWindowVariant() == wxWINDOW_VARIANT_MINI 
) 
3164             scrlsize 
= MAC_SMALL_SCROLLBAR_SIZE 
; 
3165             variant 
= wxWINDOW_VARIANT_SMALL 
; 
3168         int adjust 
= hasBoth 
? scrlsize 
- 1: 0 ; 
3170         GetClientSize( &width 
, &height 
) ; 
3172         wxPoint 
vPoint(width 
- scrlsize
, 0) ; 
3173         wxSize 
vSize(scrlsize
, height 
- adjust
) ; 
3174         wxPoint 
hPoint(0, height 
- scrlsize
) ; 
3175         wxSize 
hSize(width 
- adjust
, scrlsize
) ; 
3177         if ( style 
& wxVSCROLL 
) 
3178             m_vScrollBar 
= new wxScrollBar(this, wxID_ANY
, vPoint
, vSize 
, wxVERTICAL
); 
3180         if ( style  
& wxHSCROLL 
) 
3181             m_hScrollBar 
= new wxScrollBar(this, wxID_ANY
, hPoint
, hSize 
, wxHORIZONTAL
); 
3184     // because the create does not take into account the client area origin 
3185     // we might have a real position shift 
3186     MacRepositionScrollBars() ; 
3189 bool wxWindowMac::MacIsChildOfClientArea( const wxWindow
* child 
) const 
3191     bool result 
= ((child 
== NULL
) || ((child 
!= m_hScrollBar
) && (child 
!= m_vScrollBar
))); 
3196 void wxWindowMac::MacRepositionScrollBars() 
3198     if ( !m_hScrollBar 
&& !m_vScrollBar 
) 
3201     bool hasBoth 
= (m_hScrollBar 
&& m_hScrollBar
->IsShown()) && ( m_vScrollBar 
&& m_vScrollBar
->IsShown()) ; 
3202     int scrlsize 
= m_hScrollBar 
? m_hScrollBar
->GetSize().y 
: ( m_vScrollBar 
? m_vScrollBar
->GetSize().x 
: MAC_SCROLLBAR_SIZE 
) ; 
3203     int adjust 
= hasBoth 
? scrlsize 
- 1 : 0 ; 
3205     // get real client area 
3207     GetSize( &width 
, &height 
); 
3209     width 
-= MacGetLeftBorderSize() + MacGetRightBorderSize(); 
3210     height 
-= MacGetTopBorderSize() + MacGetBottomBorderSize(); 
3212     wxPoint 
vPoint( width 
- scrlsize
, 0 ) ; 
3213     wxSize 
vSize( scrlsize
, height 
- adjust 
) ; 
3214     wxPoint 
hPoint( 0 , height 
- scrlsize 
) ; 
3215     wxSize 
hSize( width 
- adjust
, scrlsize 
) ; 
3218     int x 
= 0, y 
= 0, w
, h 
; 
3219     GetSize( &w 
, &h 
) ; 
3221     MacClientToRootWindow( &x 
, &y 
) ; 
3222     MacClientToRootWindow( &w 
, &h 
) ; 
3224     wxWindowMac 
*iter 
= (wxWindowMac
*)this ; 
3226     int totW 
= 10000 , totH 
= 10000; 
3229         if ( iter
->IsTopLevel() ) 
3231             iter
->GetSize( &totW 
, &totH 
) ; 
3235         iter 
= iter
->GetParent() ; 
3249     if ( w 
- x 
>= totW 
) 
3254     if ( h 
- y 
>= totH 
) 
3262         m_vScrollBar
->SetSize( vPoint
.x 
, vPoint
.y
, vSize
.x
, vSize
.y 
, wxSIZE_ALLOW_MINUS_ONE 
); 
3264         m_hScrollBar
->SetSize( hPoint
.x 
, hPoint
.y
, hSize
.x
, hSize
.y
, wxSIZE_ALLOW_MINUS_ONE 
); 
3267 bool wxWindowMac::AcceptsFocus() const 
3269     return MacCanFocus() && wxWindowBase::AcceptsFocus(); 
3272 void wxWindowMac::MacSuperChangedPosition() 
3274     // only window-absolute structures have to be moved i.e. controls 
3276     m_cachedClippedRectValid 
= false ; 
3279     wxWindowList::compatibility_iterator node 
= GetChildren().GetFirst(); 
3282         child 
= node
->GetData(); 
3283         child
->MacSuperChangedPosition() ; 
3285         node 
= node
->GetNext(); 
3289 void wxWindowMac::MacTopLevelWindowChangedPosition() 
3291     // only screen-absolute structures have to be moved i.e. glcanvas 
3294     wxWindowList::compatibility_iterator node 
= GetChildren().GetFirst(); 
3297         child 
= node
->GetData(); 
3298         child
->MacTopLevelWindowChangedPosition() ; 
3300         node 
= node
->GetNext(); 
3304 long wxWindowMac::MacGetLeftBorderSize() const 
3311     if (HasFlag(wxRAISED_BORDER
) || HasFlag( wxSUNKEN_BORDER
) || HasFlag(wxDOUBLE_BORDER
)) 
3313         // this metric is only the 'outset' outside the simple frame rect 
3314         GetThemeMetric( kThemeMetricEditTextFrameOutset 
, &border 
) ; 
3317     else if (HasFlag(wxSIMPLE_BORDER
)) 
3319         // this metric is only the 'outset' outside the simple frame rect 
3320         GetThemeMetric( kThemeMetricListBoxFrameOutset 
, &border 
) ; 
3327 long wxWindowMac::MacGetRightBorderSize() const 
3329     // they are all symmetric in mac themes 
3330     return MacGetLeftBorderSize() ; 
3333 long wxWindowMac::MacGetTopBorderSize() const 
3335     // they are all symmetric in mac themes 
3336     return MacGetLeftBorderSize() ; 
3339 long wxWindowMac::MacGetBottomBorderSize() const 
3341     // they are all symmetric in mac themes 
3342     return MacGetLeftBorderSize() ; 
3345 long wxWindowMac::MacRemoveBordersFromStyle( long style 
) 
3347     return style 
& ~wxBORDER_MASK 
; 
3350 // Find the wxWindowMac at the current mouse position, returning the mouse 
3352 wxWindowMac 
* wxFindWindowAtPointer( wxPoint
& pt 
) 
3354     pt 
= wxGetMousePosition(); 
3355     wxWindowMac
* found 
= wxFindWindowAtPoint(pt
); 
3360 // Get the current mouse position. 
3361 wxPoint 
wxGetMousePosition() 
3365     wxGetMousePosition( &x
, &y 
); 
3367     return wxPoint(x
, y
); 
3370 void wxWindowMac::OnMouseEvent( wxMouseEvent 
&event 
) 
3372     if ( event
.GetEventType() == wxEVT_RIGHT_DOWN 
) 
3374         // copied from wxGTK : CS 
3375         // VZ: shouldn't we move this to base class then? 
3377         // generate a "context menu" event: this is similar to wxEVT_RIGHT_DOWN 
3380         // (a) it's a command event and so is propagated to the parent 
3381         // (b) under MSW it can be generated from kbd too 
3382         // (c) it uses screen coords (because of (a)) 
3383         wxContextMenuEvent 
evtCtx(wxEVT_CONTEXT_MENU
, 
3385                                   this->ClientToScreen(event
.GetPosition())); 
3386         if ( ! GetEventHandler()->ProcessEvent(evtCtx
) ) 
3395 void wxWindowMac::OnPaint( wxPaintEvent 
& event 
) 
3397     if ( wxTheApp
->MacGetCurrentEvent() != NULL 
&& wxTheApp
->MacGetCurrentEventHandlerCallRef() != NULL 
) 
3398         CallNextEventHandler( 
3399             (EventHandlerCallRef
)wxTheApp
->MacGetCurrentEventHandlerCallRef() , 
3400             (EventRef
) wxTheApp
->MacGetCurrentEvent() ) ; 
3403 void wxWindowMac::MacHandleControlClick( WXWidget control 
, wxInt16 controlpart 
, bool WXUNUSED( mouseStillDown 
) ) 
3407 Rect 
wxMacGetBoundsForControl( wxWindow
* window 
, const wxPoint
& pos 
, const wxSize 
&size 
, bool adjustForOrigin 
) 
3411     window
->MacGetBoundsForControl( pos 
, size 
, x 
, y
, w
, h 
, adjustForOrigin 
) ; 
3412     Rect bounds 
= { y
, x
, y 
+ h
, x 
+ w 
}; 
3417 wxInt32 
wxWindowMac::MacControlHit(WXEVENTHANDLERREF 
WXUNUSED(handler
) , WXEVENTREF 
WXUNUSED(event
) ) 
3419     return eventNotHandledErr 
; 
3422 bool wxWindowMac::Reparent(wxWindowBase 
*newParentBase
) 
3424     wxWindowMac 
*newParent 
= (wxWindowMac 
*)newParentBase
; 
3425     if ( !wxWindowBase::Reparent(newParent
) ) 
3428     // copied from MacPostControlCreate 
3429     ControlRef container 
= (ControlRef
) GetParent()->GetHandle() ; 
3431     wxASSERT_MSG( container 
!= NULL 
, wxT("No valid mac container control") ) ; 
3433     ::EmbedControl( m_peer
->GetControlRef() , container 
) ;