1 ///////////////////////////////////////////////////////////////////////////// 
   3 // Purpose:     wxWindowMac 
   4 // Author:      Stefan Csomor 
   8 // Copyright:   (c) Stefan Csomor 
   9 // Licence:     wxWindows licence 
  10 ///////////////////////////////////////////////////////////////////////////// 
  12 #if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) 
  13 #pragma implementation "window.h" 
  16 #include "wx/wxprec.h" 
  19 #include "wx/window.h" 
  21 #include "wx/dcclient.h" 
  25 #include "wx/layout.h" 
  26 #include "wx/dialog.h" 
  27 #include "wx/scrolbar.h" 
  28 #include "wx/statbox.h" 
  29 #include "wx/button.h" 
  30 #include "wx/settings.h" 
  31 #include "wx/msgdlg.h" 
  33 #include "wx/tooltip.h" 
  34 #include "wx/statusbr.h" 
  35 #include "wx/menuitem.h" 
  36 #include "wx/spinctrl.h" 
  38 #include "wx/geometry.h" 
  39 #include "wx/textctrl.h" 
  41 #include "wx/toolbar.h" 
  48 #define MAC_SCROLLBAR_SIZE 15 
  49 #define MAC_SMALL_SCROLLBAR_SIZE 11 
  51 #include "wx/mac/uma.h" 
  54 #include <ToolUtils.h> 
  56 #include <MacTextEditor.h> 
  59 #if TARGET_API_MAC_OSX 
  61     #include <HIToolbox/HIView.h> 
  65 #if  wxUSE_DRAG_AND_DROP 
  71 extern wxList wxPendingDelete
; 
  73 #ifdef __WXUNIVERSAL__ 
  74     IMPLEMENT_ABSTRACT_CLASS(wxWindowMac
, wxWindowBase
) 
  76     IMPLEMENT_DYNAMIC_CLASS(wxWindow
, wxWindowBase
) 
  77 #endif // __WXUNIVERSAL__/__WXMAC__ 
  79 #if !USE_SHARED_LIBRARY 
  81 BEGIN_EVENT_TABLE(wxWindowMac
, wxWindowBase
) 
  82     EVT_NC_PAINT(wxWindowMac::OnNcPaint
) 
  83     EVT_ERASE_BACKGROUND(wxWindowMac::OnEraseBackground
) 
  84 #if TARGET_API_MAC_OSX 
  85     EVT_PAINT(wxWindowMac::OnPaint
) 
  87     EVT_SET_FOCUS(wxWindowMac::OnSetFocus
) 
  88     EVT_KILL_FOCUS(wxWindowMac::OnSetFocus
) 
  89     EVT_MOUSE_EVENTS(wxWindowMac::OnMouseEvent
) 
  94 #define wxMAC_DEBUG_REDRAW 0 
  95 #ifndef wxMAC_DEBUG_REDRAW 
  96 #define wxMAC_DEBUG_REDRAW 0 
  99 #define wxMAC_USE_THEME_BORDER 1 
 101 // --------------------------------------------------------------------------- 
 102 // Utility Routines to move between different coordinate systems 
 103 // --------------------------------------------------------------------------- 
 106  * Right now we have the following setup : 
 107  * a border that is not part of the native control is always outside the 
 108  * control's border (otherwise we loose all native intelligence, future ways 
 109  * may be to have a second embedding control responsible for drawing borders 
 110  * and backgrounds eventually) 
 111  * so all this border calculations have to be taken into account when calling 
 112  * native methods or getting native oriented data 
 113  * so we have three coordinate systems here 
 114  * wx client coordinates 
 115  * wx window coordinates (including window frames) 
 120 // originating from native control 
 124 void wxMacNativeToWindow( const wxWindow
* window 
, RgnHandle handle 
) 
 126     OffsetRgn( handle 
, window
->MacGetLeftBorderSize() , window
->MacGetTopBorderSize() ) ; 
 129 void wxMacNativeToWindow( const wxWindow
* window 
, Rect 
*rect 
) 
 131     OffsetRect( rect 
, window
->MacGetLeftBorderSize() , window
->MacGetTopBorderSize() ) ; 
 135 // directed towards native control 
 138 void wxMacWindowToNative( const wxWindow
* window 
, RgnHandle handle 
) 
 140     OffsetRgn( handle 
, -window
->MacGetLeftBorderSize() , -window
->MacGetTopBorderSize() ); 
 143 void wxMacWindowToNative( const wxWindow
* window 
, Rect 
*rect 
) 
 145     OffsetRect( rect 
, -window
->MacGetLeftBorderSize() , -window
->MacGetTopBorderSize() ) ; 
 149 // --------------------------------------------------------------------------- 
 151 // --------------------------------------------------------------------------- 
 153 extern long wxMacTranslateKey(unsigned char key
, unsigned char code
) ; 
 154 pascal OSStatus 
wxMacSetupControlBackground( ControlRef iControl 
, SInt16 iMessage 
, SInt16 iDepth 
, Boolean iIsColor 
) ; 
 156 #if TARGET_API_MAC_OSX 
 158 #if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_3 
 160   kEventControlVisibilityChanged 
= 157 
 166 static const EventTypeSpec eventList
[] = 
 168     { kEventClassControl 
, kEventControlHit 
} , 
 169 #if TARGET_API_MAC_OSX 
 170     { kEventClassControl 
, kEventControlDraw 
} , 
 171     { kEventClassControl 
, kEventControlVisibilityChanged 
} , 
 172     { kEventClassControl 
, kEventControlEnabledStateChanged 
} , 
 173     { kEventClassControl 
, kEventControlHiliteChanged 
} , 
 174     { kEventClassControl 
, kEventControlSetFocusPart 
} , 
 176     { kEventClassService 
, kEventServiceGetTypes 
}, 
 177     { kEventClassService 
, kEventServiceCopy 
}, 
 178     { kEventClassService 
, kEventServicePaste 
}, 
 180  //    { kEventClassControl , kEventControlInvalidateForSizeChange } , // 10.3 only 
 181 //  { kEventClassControl , kEventControlBoundsChanged } , 
 185 static pascal OSStatus 
wxMacWindowControlEventHandler( EventHandlerCallRef handler 
, EventRef event 
, void *data 
) 
 187     OSStatus result 
= eventNotHandledErr 
; 
 189     wxMacCarbonEvent 
cEvent( event 
) ; 
 191     ControlRef controlRef 
; 
 192     wxWindowMac
* thisWindow 
= (wxWindowMac
*) data 
; 
 194     cEvent
.GetParameter( kEventParamDirectObject 
, &controlRef 
) ; 
 196     switch( GetEventKind( event 
) ) 
 198 #if TARGET_API_MAC_OSX 
 199         case kEventControlDraw 
: 
 201                 RgnHandle updateRgn 
= NULL 
; 
 202                 RgnHandle allocatedRgn 
= NULL 
; 
 203                 wxRegion visRegion 
= thisWindow
->MacGetVisibleRegion() ; 
 205                 if ( thisWindow
->GetPeer()->IsCompositing() == false ) 
 207                     if ( thisWindow
->GetPeer()->IsRootControl() == false ) 
 209                         GetControlBounds( thisWindow
->GetPeer()->GetControlRef() , &controlBounds 
) ; 
 213                         thisWindow
->GetPeer()->GetRect( &controlBounds 
) ; 
 217                 if ( cEvent
.GetParameter
<RgnHandle
>(kEventParamRgnHandle
, &updateRgn
) != noErr 
) 
 219                     updateRgn 
= (RgnHandle
) visRegion
.GetWXHRGN() ; 
 223                     if ( thisWindow
->GetPeer()->IsCompositing() == false ) 
 225                         if ( thisWindow
->GetPeer()->IsRootControl() == false ) 
 227                             GetControlBounds( thisWindow
->GetPeer()->GetControlRef() , &controlBounds 
) ; 
 231                             thisWindow
->GetPeer()->GetRect( &controlBounds 
) ; 
 233                         allocatedRgn 
= NewRgn() ; 
 234                         CopyRgn( updateRgn 
, allocatedRgn 
) ; 
 235                         OffsetRgn( allocatedRgn 
, -controlBounds
.left 
, -controlBounds
.top 
) ; 
 236                         // hide the given region by the new region that must be shifted 
 237                         wxMacNativeToWindow( thisWindow 
, allocatedRgn 
) ; 
 238                         updateRgn 
= allocatedRgn 
;                             
 242                         if ( thisWindow
->MacGetLeftBorderSize() != 0 || thisWindow
->MacGetTopBorderSize() != 0 ) 
 244                             // as this update region is in native window locals we must adapt it to wx window local 
 245                             allocatedRgn 
= NewRgn() ; 
 246                             CopyRgn( updateRgn 
, allocatedRgn 
) ; 
 247                             // hide the given region by the new region that must be shifted 
 248                             wxMacNativeToWindow( thisWindow 
, allocatedRgn 
) ; 
 249                             updateRgn 
= allocatedRgn 
; 
 254                 GetRegionBounds( updateRgn 
, &rgnBounds 
) ; 
 255 #if wxMAC_DEBUG_REDRAW 
 256                 if ( thisWindow
->MacIsUserPane() ) 
 258                     CGContextRef cgContext 
= cEvent
.GetParameter
<CGContextRef
>(kEventParamCGContextRef
) ; 
 259                     static float color 
= 0.5 ; 
 262                        HIViewGetBounds( controlRef
, &bounds 
); 
 263                     CGContextSetRGBFillColor( cgContext
, channel 
== 0 ? color 
: 0.5 , 
 264                         channel 
== 1 ? color 
: 0.5 , channel 
== 2 ? color 
: 0.5 , 1 ); 
 265                     CGContextFillRect( cgContext
, bounds 
); 
 277 #if wxMAC_USE_CORE_GRAPHICS 
 278                     bool created 
= false ; 
 279                     CGContextRef cgContext 
= 0 ; 
 280                     if ( cEvent
.GetParameter
<CGContextRef
>(kEventParamCGContextRef
, &cgContext
) != noErr 
) 
 282                         wxASSERT( thisWindow
->GetPeer()->IsCompositing() == false ) ; 
 284                         // this parameter is not provided on non-composited windows 
 286                         // rest of the code expects this to be already transformed and clipped for local  
 287                         CGrafPtr port 
= GetWindowPort( (WindowRef
) thisWindow
->MacGetTopLevelWindowRef() ) ; 
 289                         GetPortBounds( port 
, &bounds 
) ; 
 290                         CreateCGContextForPort( port 
, &cgContext 
) ; 
 292                         wxMacWindowToNative( thisWindow 
, updateRgn 
) ; 
 293                         OffsetRgn( updateRgn 
, controlBounds
.left 
, controlBounds
.top 
) ; 
 294                         ClipCGContextToRegion( cgContext 
, &bounds 
, updateRgn 
) ; 
 295                         wxMacNativeToWindow( thisWindow 
, updateRgn 
) ; 
 296                         OffsetRgn( updateRgn 
, -controlBounds
.left 
, -controlBounds
.top 
) ; 
 298                         CGContextTranslateCTM( cgContext 
, 0 , bounds
.bottom 
- bounds
.top 
) ; 
 299                         CGContextScaleCTM( cgContext 
, 1 , -1 ) ; 
 301                         CGContextTranslateCTM( cgContext 
, controlBounds
.left 
, controlBounds
.top 
) ; 
 304                         CGContextSetRGBFillColor( cgContext , 1.0 , 1.0 , 1.0 , 1.0 ) ; 
 305                         CGContextFillRect(cgContext , CGRectMake( 0 , 0 ,  
 306                             controlBounds.right - controlBounds.left ,  
 307                             controlBounds.bottom - controlBounds.top ) ); 
 311                     thisWindow
->MacSetCGContextRef( cgContext 
) ; 
 313                         wxMacCGContextStateSaver 
sg( cgContext 
) ; 
 315                         if ( thisWindow
->MacDoRedraw( updateRgn 
, cEvent
.GetTicks() ) ) 
 317 #if wxMAC_USE_CORE_GRAPHICS 
 318                         thisWindow
->MacSetCGContextRef( NULL 
) ; 
 322                         CGContextRelease( cgContext 
) ; 
 327                     DisposeRgn( allocatedRgn 
) ; 
 330         case kEventControlVisibilityChanged 
: 
 331                 thisWindow
->MacVisibilityChanged() ; 
 333         case kEventControlEnabledStateChanged 
: 
 334                 thisWindow
->MacEnabledStateChanged() ; 
 336         case kEventControlHiliteChanged 
: 
 337                 thisWindow
->MacHiliteChanged() ; 
 340         // we emulate this event under Carbon CFM 
 341         case kEventControlSetFocusPart 
: 
 343                 Boolean focusEverything 
= false ; 
 344                 ControlPartCode controlPart 
= cEvent
.GetParameter
<ControlPartCode
>(kEventParamControlPart 
, typeControlPartCode 
); 
 346                 if ( cEvent
.GetParameter
<Boolean
>(kEventParamControlFocusEverything 
, &focusEverything 
) == noErr 
) 
 350                 if ( controlPart 
== kControlFocusNoPart 
) 
 353                     if ( thisWindow
->GetCaret() ) 
 355                         thisWindow
->GetCaret()->OnKillFocus(); 
 357         #endif // wxUSE_CARET 
 358                     wxFocusEvent 
event( wxEVT_KILL_FOCUS
, thisWindow
->GetId()); 
 359                     event
.SetEventObject(thisWindow
); 
 360                     thisWindow
->GetEventHandler()->ProcessEvent(event
) ; 
 364                     // panel wants to track the window which was the last to have focus in it 
 365                     wxChildFocusEvent 
eventFocus(thisWindow
); 
 366                     thisWindow
->GetEventHandler()->ProcessEvent(eventFocus
); 
 369                     if ( thisWindow
->GetCaret() ) 
 371                         thisWindow
->GetCaret()->OnSetFocus(); 
 373         #endif // wxUSE_CARET 
 375                     wxFocusEvent 
event(wxEVT_SET_FOCUS
, thisWindow
->GetId()); 
 376                     event
.SetEventObject(thisWindow
); 
 377                     thisWindow
->GetEventHandler()->ProcessEvent(event
) ; 
 379                 if ( thisWindow
->MacIsUserPane() ) 
 383         case kEventControlHit 
: 
 385                 result 
= thisWindow
->MacControlHit( handler 
, event 
) ; 
 394 static pascal OSStatus 
wxMacWindowServiceEventHandler( EventHandlerCallRef handler 
, EventRef event 
, void *data 
) 
 396     OSStatus result 
= eventNotHandledErr 
; 
 398     wxMacCarbonEvent 
cEvent( event 
) ; 
 400     ControlRef controlRef 
; 
 401     wxWindowMac
* thisWindow 
= (wxWindowMac
*) data 
; 
 402     wxTextCtrl
* textCtrl 
= wxDynamicCast( thisWindow 
, wxTextCtrl 
) ; 
 403     cEvent
.GetParameter( kEventParamDirectObject 
, &controlRef 
) ; 
 405     switch( GetEventKind( event 
) ) 
 407         case kEventServiceGetTypes 
: 
 411                 textCtrl
->GetSelection( &from 
, &to 
) ; 
 413                 CFMutableArrayRef copyTypes 
= 0 , pasteTypes 
= 0; 
 415                     copyTypes 
= cEvent
.GetParameter
< CFMutableArrayRef 
>( kEventParamServiceCopyTypes 
, typeCFMutableArrayRef 
) ; 
 416                 if ( textCtrl
->IsEditable() ) 
 417                     pasteTypes 
= cEvent
.GetParameter
< CFMutableArrayRef 
>( kEventParamServicePasteTypes 
, typeCFMutableArrayRef 
) ; 
 419                 static const OSType textDataTypes
[] = { kTXNTextData 
/* , 'utxt' ,  'PICT', 'MooV',     'AIFF' */  }; 
 420                 for ( size_t i 
= 0 ; i 
< WXSIZEOF(textDataTypes
) ; ++i 
) 
 422                     CFStringRef typestring 
= CreateTypeStringWithOSType(textDataTypes
[i
]); 
 426                             CFArrayAppendValue (copyTypes
, typestring
) ; 
 428                             CFArrayAppendValue (pasteTypes
, typestring
) ; 
 429                         CFRelease( typestring 
) ; 
 435         case kEventServiceCopy 
: 
 439                 textCtrl
->GetSelection( &from 
, &to 
) ; 
 440                 wxString val 
= textCtrl
->GetValue() ; 
 441                 val 
= val
.Mid( from 
, to 
- from 
) ; 
 442                 ScrapRef scrapRef 
= cEvent
.GetParameter
< ScrapRef 
> ( kEventParamScrapRef 
, typeScrapRef 
) ; 
 443                 verify_noerr( ClearScrap( &scrapRef 
) ) ; 
 444                 verify_noerr( PutScrapFlavor( scrapRef 
, kTXNTextData 
, 0 , val
.Length() , val
.c_str() ) ) ; 
 448         case kEventServicePaste 
: 
 451                 ScrapRef scrapRef 
= cEvent
.GetParameter
< ScrapRef 
> ( kEventParamScrapRef 
, typeScrapRef 
) ; 
 452                 Size textSize
, pastedSize 
; 
 453                 verify_noerr( GetScrapFlavorSize (scrapRef
, kTXNTextData
, &textSize
) ) ; 
 455                 char *content 
= new char[textSize
] ; 
 456                 GetScrapFlavorData (scrapRef
, kTXNTextData
, &pastedSize
, content 
); 
 457                 content
[textSize
-1] = 0 ; 
 459                 textCtrl
->WriteText( wxString( content 
, wxConvLocal 
)  ); 
 461                 textCtrl
->WriteText( wxString( content 
) ) ; 
 472 pascal OSStatus 
wxMacWindowEventHandler( EventHandlerCallRef handler 
, EventRef event 
, void *data 
) 
 474     EventRef formerEvent 
= (EventRef
) wxTheApp
->MacGetCurrentEvent() ; 
 475     EventHandlerCallRef formerEventHandlerCallRef 
= (EventHandlerCallRef
) wxTheApp
->MacGetCurrentEventHandlerCallRef() ; 
 476     wxTheApp
->MacSetCurrentEvent( event 
, handler 
) ; 
 477     OSStatus result 
= eventNotHandledErr 
; 
 479     switch ( GetEventClass( event 
) ) 
 481         case kEventClassControl 
: 
 482             result 
= wxMacWindowControlEventHandler( handler
, event
, data 
) ; 
 484         case kEventClassService 
: 
 485             result 
= wxMacWindowServiceEventHandler( handler
, event 
, data 
) ; 
 489     wxTheApp
->MacSetCurrentEvent( formerEvent
, formerEventHandlerCallRef 
) ; 
 493 DEFINE_ONE_SHOT_HANDLER_GETTER( wxMacWindowEventHandler 
) 
 495 #if !TARGET_API_MAC_OSX 
 497 // --------------------------------------------------------------------------- 
 498 // UserPane events for non OSX builds 
 499 // --------------------------------------------------------------------------- 
 501 static pascal void wxMacControlUserPaneDrawProc(ControlRef control
, SInt16 part
) 
 503     wxWindow 
* win 
= wxFindControlFromMacControl(control
) ; 
 505         win
->MacControlUserPaneDrawProc(part
) ; 
 507 wxMAC_DEFINE_PROC_GETTER( ControlUserPaneDrawUPP 
, wxMacControlUserPaneDrawProc 
) ; 
 509 static pascal ControlPartCode 
wxMacControlUserPaneHitTestProc(ControlRef control
, Point where
) 
 511     wxWindow 
* win 
= wxFindControlFromMacControl(control
) ; 
 513         return win
->MacControlUserPaneHitTestProc(where
.h 
, where
.v
) ; 
 515         return kControlNoPart 
; 
 517 wxMAC_DEFINE_PROC_GETTER( ControlUserPaneHitTestUPP 
, wxMacControlUserPaneHitTestProc 
) ; 
 519 static pascal ControlPartCode 
wxMacControlUserPaneTrackingProc(ControlRef control
, Point startPt
, ControlActionUPP actionProc
) 
 521     wxWindow 
* win 
= wxFindControlFromMacControl(control
) ; 
 523         return win
->MacControlUserPaneTrackingProc( startPt
.h 
, startPt
.v 
, (void*) actionProc
) ; 
 525         return kControlNoPart 
; 
 527 wxMAC_DEFINE_PROC_GETTER( ControlUserPaneTrackingUPP 
, wxMacControlUserPaneTrackingProc 
) ; 
 529 static pascal void wxMacControlUserPaneIdleProc(ControlRef control
) 
 531     wxWindow 
* win 
= wxFindControlFromMacControl(control
) ; 
 533         win
->MacControlUserPaneIdleProc() ; 
 535 wxMAC_DEFINE_PROC_GETTER( ControlUserPaneIdleUPP 
, wxMacControlUserPaneIdleProc 
) ; 
 537 static pascal ControlPartCode 
wxMacControlUserPaneKeyDownProc(ControlRef control
, SInt16 keyCode
, SInt16 charCode
, SInt16 modifiers
) 
 539     wxWindow 
* win 
= wxFindControlFromMacControl(control
) ; 
 541         return win
->MacControlUserPaneKeyDownProc(keyCode
,charCode
,modifiers
) ; 
 543         return kControlNoPart 
; 
 545 wxMAC_DEFINE_PROC_GETTER( ControlUserPaneKeyDownUPP 
, wxMacControlUserPaneKeyDownProc 
) ; 
 547 static pascal void wxMacControlUserPaneActivateProc(ControlRef control
, Boolean activating
) 
 549     wxWindow 
* win 
= wxFindControlFromMacControl(control
) ; 
 551         win
->MacControlUserPaneActivateProc(activating
) ; 
 553 wxMAC_DEFINE_PROC_GETTER( ControlUserPaneActivateUPP 
, wxMacControlUserPaneActivateProc 
) ; 
 555 static pascal ControlPartCode 
wxMacControlUserPaneFocusProc(ControlRef control
, ControlFocusPart action
) 
 557     wxWindow 
* win 
= wxFindControlFromMacControl(control
) ; 
 559         return win
->MacControlUserPaneFocusProc(action
) ; 
 561         return kControlNoPart 
; 
 563 wxMAC_DEFINE_PROC_GETTER( ControlUserPaneFocusUPP 
, wxMacControlUserPaneFocusProc 
) ; 
 565 static pascal void wxMacControlUserPaneBackgroundProc(ControlRef control
, ControlBackgroundPtr info
) 
 567     wxWindow 
* win 
= wxFindControlFromMacControl(control
) ; 
 569         win
->MacControlUserPaneBackgroundProc(info
) ; 
 571 wxMAC_DEFINE_PROC_GETTER( ControlUserPaneBackgroundUPP 
, wxMacControlUserPaneBackgroundProc 
) ; 
 573 void wxWindowMac::MacControlUserPaneDrawProc(wxInt16 part
) 
 575     RgnHandle rgn 
= NewRgn() ; 
 577     wxMacWindowStateSaver 
sv( this ) ; 
 578     SectRgn( rgn 
, (RgnHandle
) MacGetVisibleRegion().GetWXHRGN() , rgn 
) ; 
 579     MacDoRedraw( rgn 
, 0 ) ; 
 583 wxInt16 
wxWindowMac::MacControlUserPaneHitTestProc(wxInt16 x
, wxInt16 y
) 
 585     return kControlNoPart 
; 
 588 wxInt16 
wxWindowMac::MacControlUserPaneTrackingProc(wxInt16 x
, wxInt16 y
, void* actionProc
) 
 590     return kControlNoPart 
; 
 593 void wxWindowMac::MacControlUserPaneIdleProc() 
 597 wxInt16 
wxWindowMac::MacControlUserPaneKeyDownProc(wxInt16 keyCode
, wxInt16 charCode
, wxInt16 modifiers
) 
 599     return kControlNoPart 
; 
 602 void wxWindowMac::MacControlUserPaneActivateProc(bool activating
) 
 606 wxInt16 
wxWindowMac::MacControlUserPaneFocusProc(wxInt16 action
) 
 608     return kControlNoPart 
; 
 611 void wxWindowMac::MacControlUserPaneBackgroundProc(void* info
) 
 617 // --------------------------------------------------------------------------- 
 618 // Scrollbar Tracking for all 
 619 // --------------------------------------------------------------------------- 
 621 pascal void wxMacLiveScrollbarActionProc( ControlRef control 
, ControlPartCode partCode 
) ; 
 622 pascal void wxMacLiveScrollbarActionProc( ControlRef control 
, ControlPartCode partCode 
) 
 626         wxWindow
*  wx 
= wxFindControlFromMacControl( control 
) ; 
 629             wx
->MacHandleControlClick( (WXWidget
) control 
, partCode 
, true /* stillDown */ ) ; 
 633 wxMAC_DEFINE_PROC_GETTER( ControlActionUPP 
, wxMacLiveScrollbarActionProc 
) ; 
 635 // =========================================================================== 
 637 // =========================================================================== 
 639 #if KEY_wxList_DEPRECATED 
 640 wxList 
wxWinMacControlList(wxKEY_INTEGER
); 
 642 wxWindow 
*wxFindControlFromMacControl(ControlRef inControl 
) 
 644     wxNode 
*node 
= wxWinMacControlList
.Find((long)inControl
); 
 647     return (wxControl 
*)node
->GetData(); 
 650 void wxAssociateControlWithMacControl(ControlRef inControl
, wxWindow 
*control
) 
 652     // adding NULL ControlRef is (first) surely a result of an error and 
 653     // (secondly) breaks native event processing 
 654     wxCHECK_RET( inControl 
!= (ControlRef
) NULL
, wxT("attempt to add a NULL WindowRef to window list") ); 
 656     if ( !wxWinMacControlList
.Find((long)inControl
) ) 
 657         wxWinMacControlList
.Append((long)inControl
, control
); 
 660 void wxRemoveMacControlAssociation(wxWindow 
*control
) 
 662     wxWinMacControlList
.DeleteObject(control
); 
 666 WX_DECLARE_HASH_MAP(ControlRef
, wxWindow
*, wxPointerHash
, wxPointerEqual
, MacControlMap
); 
 668 static MacControlMap wxWinMacControlList
; 
 670 wxWindow 
*wxFindControlFromMacControl(ControlRef inControl 
) 
 672     MacControlMap::iterator node 
= wxWinMacControlList
.find(inControl
); 
 674     return (node 
== wxWinMacControlList
.end()) ? NULL 
: node
->second
; 
 677 void wxAssociateControlWithMacControl(ControlRef inControl
, wxWindow 
*control
) 
 679     // adding NULL ControlRef is (first) surely a result of an error and 
 680     // (secondly) breaks native event processing 
 681     wxCHECK_RET( inControl 
!= (ControlRef
) NULL
, wxT("attempt to add a NULL WindowRef to window list") ); 
 683     wxWinMacControlList
[inControl
] = control
; 
 686 void wxRemoveMacControlAssociation(wxWindow 
*control
) 
 688    // iterate over all the elements in the class 
 689     MacControlMap::iterator it
; 
 690     for ( it 
= wxWinMacControlList
.begin(); it 
!= wxWinMacControlList
.end(); ++it 
) 
 692         if ( it
->second 
== control 
) 
 694             wxWinMacControlList
.erase(it
); 
 699 #endif // deprecated wxList 
 701 // ---------------------------------------------------------------------------- 
 702  // constructors and such 
 703 // ---------------------------------------------------------------------------- 
 705 wxWindowMac::wxWindowMac() 
 710 wxWindowMac::wxWindowMac(wxWindowMac 
*parent
, 
 715             const wxString
& name 
) 
 718     Create(parent
, id
, pos
, size
, style
, name
); 
 721 void wxWindowMac::Init() 
 725 #if WXWIN_COMPATIBILITY_2_4 
 726     m_backgroundTransparent 
= FALSE
; 
 729     // as all windows are created with WS_VISIBLE style... 
 732     m_hScrollBar 
= NULL 
; 
 733     m_vScrollBar 
= NULL 
; 
 734     m_macBackgroundBrush 
= wxNullBrush 
; 
 736     m_macIsUserPane 
= TRUE
; 
 737 #if wxMAC_USE_CORE_GRAPHICS 
 738     m_cgContextRef 
= NULL 
; 
 740     // we need a valid font for the encodings 
 741     wxWindowBase::SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT
)); 
 745 wxWindowMac::~wxWindowMac() 
 749     m_isBeingDeleted 
= TRUE
; 
 751     MacInvalidateBorders() ; 
 753 #ifndef __WXUNIVERSAL__ 
 754     // VS: make sure there's no wxFrame with last focus set to us: 
 755     for ( wxWindow 
*win 
= GetParent(); win
; win 
= win
->GetParent() ) 
 757         wxFrame 
*frame 
= wxDynamicCast(win
, wxFrame
); 
 760             if ( frame
->GetLastFocus() == this ) 
 762                 frame
->SetLastFocus((wxWindow
*)NULL
); 
 767 #endif // __WXUNIVERSAL__ 
 769     // destroy children before destroying this window itself 
 772     // wxRemoveMacControlAssociation( this ) ; 
 773     // If we delete an item, we should initialize the parent panel, 
 774     // because it could now be invalid. 
 775     wxWindow 
*parent 
= GetParent() ; 
 778         if (parent
->GetDefaultItem() == (wxButton
*) this) 
 779             parent
->SetDefaultItem(NULL
); 
 781     if ( m_peer 
&& m_peer
->Ok() ) 
 783         // in case the callback might be called during destruction 
 784         wxRemoveMacControlAssociation( this) ; 
 785         // we currently are not using this hook 
 786         // ::SetControlColorProc( *m_peer , NULL ) ; 
 790     if ( g_MacLastWindow 
== this ) 
 792         g_MacLastWindow 
= NULL 
; 
 795     wxFrame
* frame 
= wxDynamicCast( wxGetTopLevelParent( this ) , wxFrame 
) ; 
 798         if ( frame
->GetLastFocus() == this ) 
 799             frame
->SetLastFocus( NULL 
) ; 
 802     // delete our drop target if we've got one 
 803 #if wxUSE_DRAG_AND_DROP 
 804     if ( m_dropTarget 
!= NULL 
) 
 809 #endif // wxUSE_DRAG_AND_DROP 
 813 WXWidget 
wxWindowMac::GetHandle() const 
 815     return (WXWidget
) m_peer
->GetControlRef() ; 
 819 void wxWindowMac::MacInstallEventHandler( WXWidget control 
) 
 821     wxAssociateControlWithMacControl( (ControlRef
) control  
, this ) ; 
 822     InstallControlEventHandler( (ControlRef
)  control 
, GetwxMacWindowEventHandlerUPP(), 
 823         GetEventTypeCount(eventList
), eventList
, this, 
 824         (EventHandlerRef 
*)&m_macControlEventHandler
); 
 825 #if !TARGET_API_MAC_OSX 
 826     if ( (ControlRef
) control 
== m_peer
->GetControlRef() ) 
 828         m_peer
->SetData
<ControlUserPaneDrawUPP
>(kControlEntireControl
,kControlUserPaneDrawProcTag
,GetwxMacControlUserPaneDrawProc()) ; 
 829         m_peer
->SetData
<ControlUserPaneHitTestUPP
>(kControlEntireControl
,kControlUserPaneHitTestProcTag
,GetwxMacControlUserPaneHitTestProc()) ; 
 830         m_peer
->SetData
<ControlUserPaneTrackingUPP
>(kControlEntireControl
,kControlUserPaneTrackingProcTag
,GetwxMacControlUserPaneTrackingProc()) ; 
 831         m_peer
->SetData
<ControlUserPaneIdleUPP
>(kControlEntireControl
,kControlUserPaneIdleProcTag
,GetwxMacControlUserPaneIdleProc()) ; 
 832         m_peer
->SetData
<ControlUserPaneKeyDownUPP
>(kControlEntireControl
,kControlUserPaneKeyDownProcTag
,GetwxMacControlUserPaneKeyDownProc()) ; 
 833         m_peer
->SetData
<ControlUserPaneActivateUPP
>(kControlEntireControl
,kControlUserPaneActivateProcTag
,GetwxMacControlUserPaneActivateProc()) ; 
 834         m_peer
->SetData
<ControlUserPaneFocusUPP
>(kControlEntireControl
,kControlUserPaneFocusProcTag
,GetwxMacControlUserPaneFocusProc()) ; 
 835         m_peer
->SetData
<ControlUserPaneBackgroundUPP
>(kControlEntireControl
,kControlUserPaneBackgroundProcTag
,GetwxMacControlUserPaneBackgroundProc()) ; 
 842 bool wxWindowMac::Create(wxWindowMac 
*parent
, wxWindowID id
, 
 846            const wxString
& name
) 
 848     wxCHECK_MSG( parent
, FALSE
, wxT("can't create wxWindowMac without parent") ); 
 850     if ( !CreateBase(parent
, id
, pos
, size
, style
, wxDefaultValidator
, name
) ) 
 853     m_windowVariant 
= parent
->GetWindowVariant() ; 
 855     if ( m_macIsUserPane 
) 
 857         Rect bounds 
= wxMacGetBoundsForControl( this , pos 
, size 
) ; 
 860             | kControlSupportsEmbedding
 
 861             | kControlSupportsLiveFeedback
 
 862             | kControlGetsFocusOnClick
 
 863 //            | kControlHasSpecialBackground 
 864 //            | kControlSupportsCalcBestRect 
 865             | kControlHandlesTracking
 
 866             | kControlSupportsFocus
 
 867             | kControlWantsActivate
 
 871         m_peer 
= new wxMacControl(this) ; 
 872         ::CreateUserPaneControl( MAC_WXHWND(GetParent()->MacGetTopLevelWindowRef()) , &bounds
, features 
, m_peer
->GetControlRefAddr() ); 
 875         MacPostControlCreate(pos
,size
) ; 
 877 #ifndef __WXUNIVERSAL__ 
 878     // Don't give scrollbars to wxControls unless they ask for them 
 879     if ( (! IsKindOf(CLASSINFO(wxControl
)) && ! IsKindOf(CLASSINFO(wxStatusBar
))) || 
 880          (IsKindOf(CLASSINFO(wxControl
)) && ( style 
& wxHSCROLL 
|| style 
& wxVSCROLL
))) 
 882         MacCreateScrollBars( style 
) ; 
 886     wxWindowCreateEvent 
event(this); 
 887     GetEventHandler()->AddPendingEvent(event
); 
 892 void wxWindowMac::MacChildAdded()  
 896         m_vScrollBar
->Raise() ; 
 900         m_hScrollBar
->Raise() ; 
 905 void wxWindowMac::MacPostControlCreate(const wxPoint
& pos
, const wxSize
& size
) 
 907     wxASSERT_MSG( m_peer 
!= NULL 
&& m_peer
->Ok() , wxT("No valid mac control") ) ; 
 909     m_peer
->SetReference( (long) this ) ; 
 910     GetParent()->AddChild(this); 
 912     MacInstallEventHandler( (WXWidget
) m_peer
->GetControlRef() ); 
 914     ControlRef container 
= (ControlRef
) GetParent()->GetHandle() ; 
 915     wxASSERT_MSG( container 
!= NULL 
, wxT("No valid mac container control") ) ; 
 916     ::EmbedControl( m_peer
->GetControlRef() , container 
) ; 
 917     GetParent()->MacChildAdded() ; 
 919     // adjust font, controlsize etc 
 920     DoSetWindowVariant( m_windowVariant 
) ; 
 922     m_peer
->SetTitle( wxStripMenuCodes(m_label
) ) ; 
 924     if (!m_macIsUserPane
) 
 926         SetInitialBestSize(size
); 
 929     SetCursor( *wxSTANDARD_CURSOR 
) ; 
 932 void wxWindowMac::DoSetWindowVariant( wxWindowVariant variant 
) 
 934     // Don't assert, in case we set the window variant before 
 935     // the window is created 
 936     // wxASSERT( m_peer->Ok() ) ; 
 938     m_windowVariant 
= variant 
; 
 940     if (m_peer 
== NULL 
|| !m_peer
->Ok()) 
 944     ThemeFontID themeFont 
= kThemeSystemFont 
; 
 946     // we will get that from the settings later 
 947     // and make this NORMAL later, but first 
 948     // we have a few calculations that we must fix 
 952         case wxWINDOW_VARIANT_NORMAL 
: 
 953             size 
= kControlSizeNormal
; 
 954             themeFont 
= kThemeSystemFont 
; 
 956         case wxWINDOW_VARIANT_SMALL 
: 
 957             size 
= kControlSizeSmall
; 
 958             themeFont 
= kThemeSmallSystemFont 
; 
 960         case wxWINDOW_VARIANT_MINI 
: 
 961            if (UMAGetSystemVersion() >= 0x1030 ) 
 963                 // not always defined in the headers 
 969                 size 
= kControlSizeSmall
; 
 970                 themeFont 
= kThemeSmallSystemFont 
; 
 973         case wxWINDOW_VARIANT_LARGE 
: 
 974             size 
= kControlSizeLarge
; 
 975             themeFont 
= kThemeSystemFont 
; 
 978             wxFAIL_MSG(_T("unexpected window variant")); 
 981     m_peer
->SetData
<ControlSize
>(kControlEntireControl
, kControlSizeTag
,&size 
) ; 
 984     font
.MacCreateThemeFont( themeFont 
) ; 
 988 void wxWindowMac::MacUpdateControlFont() 
 990     m_peer
->SetFont( GetFont() , GetForegroundColour() , GetWindowStyle() ) ; 
 994 bool wxWindowMac::SetFont(const wxFont
& font
) 
 996     bool retval 
= wxWindowBase::SetFont( font 
) ; 
 998     MacUpdateControlFont() ; 
1003 bool wxWindowMac::SetForegroundColour(const wxColour
& col 
) 
1005     if ( !wxWindowBase::SetForegroundColour(col
) ) 
1008     MacUpdateControlFont() ; 
1013 bool wxWindowMac::SetBackgroundColour(const wxColour
& col 
) 
1015     if ( !wxWindowBase::SetBackgroundColour(col
) && m_hasBgCol 
) 
1019     wxColour 
newCol(GetBackgroundColour()); 
1020     if ( newCol 
== wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE
) ) 
1022         brush
.MacSetTheme( kThemeBrushDocumentWindowBackground 
) ; 
1024     else if (  newCol 
== wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE 
) ) 
1026         brush
.MacSetTheme( kThemeBrushDialogBackgroundActive 
) ; 
1030         brush
.SetColour( newCol 
) ; 
1032     MacSetBackgroundBrush( brush 
) ; 
1034     MacUpdateControlFont() ; 
1039 void wxWindowMac::MacSetBackgroundBrush( const wxBrush 
&brush 
) 
1041     m_macBackgroundBrush 
= brush 
; 
1042     m_peer
->SetBackground( brush 
) ; 
1045 bool wxWindowMac::MacCanFocus() const 
1047     // there is currently no way to determine whether the window is running in full keyboard 
1048     // access mode, therefore we cannot rely on these features, yet the only other way would be 
1049     // to issue a SetKeyboardFocus event and verify after whether it succeeded, this would risk problems 
1050     // in event handlers... 
1051     UInt32 features 
= 0 ; 
1052     m_peer
->GetFeatures( & features 
) ; 
1053     return features 
& ( kControlSupportsFocus 
| kControlGetsFocusOnClick 
) ; 
1057 void wxWindowMac::SetFocus() 
1059     if ( AcceptsFocus() ) 
1062         wxWindow
* former 
= FindFocus() ; 
1063         if ( former 
== this ) 
1066         OSStatus err 
= m_peer
->SetFocus( kControlFocusNextPart 
) ; 
1067         // as we cannot rely on the control features to find out whether we are in full keyboard mode, we can only 
1068         // leave in case of an error 
1069         if ( err 
== errCouldntSetFocus 
) 
1072 #if !TARGET_API_MAC_OSX 
1073         // emulate carbon events when running under carbonlib where they are not natively available 
1076             EventRef evRef 
= NULL 
; 
1077             verify_noerr( MacCreateEvent( NULL 
, kEventClassControl 
, kEventControlSetFocusPart 
, TicksToEventTime( TickCount() ) , kEventAttributeUserEvent 
, 
1080             wxMacCarbonEvent 
cEvent( evRef 
) ; 
1081             cEvent
.SetParameter
<ControlRef
>( kEventParamDirectObject 
, (ControlRef
) former
->GetHandle() ) ; 
1082             cEvent
.SetParameter
<ControlPartCode
>(kEventParamControlPart 
, typeControlPartCode 
, kControlFocusNoPart 
) ; 
1084             wxMacWindowEventHandler( NULL 
, evRef 
, former 
) ; 
1085             ReleaseEvent(evRef
) ; 
1087         // send new focus event 
1089             EventRef evRef 
= NULL 
; 
1090             verify_noerr( MacCreateEvent( NULL 
, kEventClassControl 
, kEventControlSetFocusPart 
, TicksToEventTime( TickCount() ) , kEventAttributeUserEvent 
, 
1093             wxMacCarbonEvent 
cEvent( evRef 
) ; 
1094             cEvent
.SetParameter
<ControlRef
>( kEventParamDirectObject 
, (ControlRef
) GetHandle() ) ; 
1095             cEvent
.SetParameter
<ControlPartCode
>(kEventParamControlPart 
, typeControlPartCode 
, kControlFocusNextPart 
) ; 
1097             wxMacWindowEventHandler( NULL 
, evRef 
, this ) ; 
1098             ReleaseEvent(evRef
) ; 
1105 void wxWindowMac::DoCaptureMouse() 
1107     wxTheApp
->s_captureWindow 
= this ; 
1110 wxWindow
* wxWindowBase::GetCapture() 
1112     return wxTheApp
->s_captureWindow 
; 
1115 void wxWindowMac::DoReleaseMouse() 
1117     wxTheApp
->s_captureWindow 
= NULL 
; 
1120 #if    wxUSE_DRAG_AND_DROP 
1122 void wxWindowMac::SetDropTarget(wxDropTarget 
*pDropTarget
) 
1124     if ( m_dropTarget 
!= 0 ) { 
1125         delete m_dropTarget
; 
1128     m_dropTarget 
= pDropTarget
; 
1129     if ( m_dropTarget 
!= 0 ) 
1137 // Old style file-manager drag&drop 
1138 void wxWindowMac::DragAcceptFiles(bool accept
) 
1143 // Returns the size of the native control. In the case of the toplevel window 
1144 // this is the content area root control 
1146 void wxWindowMac::MacGetPositionAndSizeFromControl(int& x
, int& y
, 
1147                                            int& w
, int& h
) const 
1149     wxFAIL_MSG( wxT("Not supported anymore") ) ; 
1152 // From a wx position / size calculate the appropriate size of the native control 
1154 bool wxWindowMac::MacGetBoundsForControl(const wxPoint
& pos
, 
1157                                        int& w
, int& h 
, bool adjustOrigin 
) const 
1159     bool isCompositing 
= MacGetTopLevelWindow()->MacUsesCompositing() ; 
1161     // the desired size, minus the border pixels gives the correct size of the control 
1165     // todo the default calls may be used as soon as PostCreateControl Is moved here 
1166     w 
= wxMax(size
.x
,0) ; // WidthDefault( size.x ); 
1167     h 
= wxMax(size
.y
,0) ; // HeightDefault( size.y ) ; 
1169     if ( !isCompositing 
) 
1170         GetParent()->MacWindowToRootWindow( &x 
, &y 
) ; 
1172     x 
+= MacGetLeftBorderSize() ; 
1173     y 
+= MacGetTopBorderSize() ; 
1174     w 
-= MacGetLeftBorderSize() + MacGetRightBorderSize() ; 
1175     h 
-= MacGetTopBorderSize() + MacGetBottomBorderSize() ; 
1178         AdjustForParentClientOrigin( x 
, y 
) ; 
1180     // this is in window relative coordinate, as this parent may have a border, its physical position is offset by this border 
1181     if ( !GetParent()->IsTopLevel() ) 
1183         x 
-= GetParent()->MacGetLeftBorderSize() ; 
1184         y 
-= GetParent()->MacGetTopBorderSize() ; 
1190 // Get window size (not client size) 
1191 void wxWindowMac::DoGetSize(int *x
, int *y
) const 
1194     m_peer
->GetRect( &bounds 
) ; 
1196     if(x
)   *x 
= bounds
.right 
- bounds
.left 
+ MacGetLeftBorderSize() + MacGetRightBorderSize() ; 
1197     if(y
)   *y 
= bounds
.bottom 
- bounds
.top 
+ MacGetTopBorderSize() + MacGetBottomBorderSize() ; 
1200 // get the position of the bounds of this window in client coordinates of its parent 
1201 void wxWindowMac::DoGetPosition(int *x
, int *y
) const 
1204     m_peer
->GetRect( &bounds 
) ; 
1206     int x1 
= bounds
.left 
; 
1207     int y1 
= bounds
.top 
; 
1209     if ( !IsTopLevel() ) 
1211         wxWindow 
*parent 
= GetParent(); 
1214             // we must first adjust it to be in window coordinates of the parent, as otherwise it gets lost by the clientareaorigin fix 
1215             x1 
+= parent
->MacGetLeftBorderSize() ; 
1216             y1 
+= parent
->MacGetTopBorderSize() ; 
1217             // and now to client coordinates 
1218             wxPoint 
pt(parent
->GetClientAreaOrigin()); 
1227 void wxWindowMac::DoScreenToClient(int *x
, int *y
) const 
1229     WindowRef window 
= (WindowRef
) MacGetTopLevelWindowRef() ; 
1231     wxCHECK_RET( window 
, wxT("TopLevel Window Missing") ) ; 
1234         Point localwhere 
= {0,0} ; 
1236         if(x
) localwhere
.h 
= * x 
; 
1237         if(y
) localwhere
.v 
= * y 
; 
1239         QDGlobalToLocalPoint( GetWindowPort( window 
) , &localwhere 
) ; 
1240         if(x
)   *x 
= localwhere
.h 
; 
1241         if(y
)   *y 
= localwhere
.v 
; 
1244     MacRootWindowToWindow( x 
, y 
) ; 
1246     wxPoint origin 
= GetClientAreaOrigin() ; 
1247     if(x
)   *x 
-= origin
.x 
; 
1248     if(y
)   *y 
-= origin
.y 
; 
1251 void wxWindowMac::DoClientToScreen(int *x
, int *y
) const 
1253     WindowRef window 
= (WindowRef
) MacGetTopLevelWindowRef() ; 
1254     wxCHECK_RET( window 
, wxT("TopLevel Window Missing") ) ; 
1256     wxPoint origin 
= GetClientAreaOrigin() ; 
1257     if(x
)   *x 
+= origin
.x 
; 
1258     if(y
)   *y 
+= origin
.y 
; 
1260     MacWindowToRootWindow( x 
, y 
) ; 
1263         Point localwhere 
= { 0,0 }; 
1264         if(x
)   localwhere
.h 
= * x 
; 
1265         if(y
)   localwhere
.v 
= * y 
; 
1266         QDLocalToGlobalPoint( GetWindowPort( window 
) , &localwhere 
) ; 
1267         if(x
)   *x 
= localwhere
.h 
; 
1268         if(y
)   *y 
= localwhere
.v 
; 
1272 void wxWindowMac::MacClientToRootWindow( int *x 
, int *y 
) const 
1274     wxPoint origin 
= GetClientAreaOrigin() ; 
1275     if(x
)   *x 
+= origin
.x 
; 
1276     if(y
)   *y 
+= origin
.y 
; 
1278     MacWindowToRootWindow( x 
, y 
) ; 
1281 void wxWindowMac::MacRootWindowToClient( int *x 
, int *y 
) const 
1283     MacRootWindowToWindow( x 
, y 
) ; 
1285     wxPoint origin 
= GetClientAreaOrigin() ; 
1286     if(x
)   *x 
-= origin
.x 
; 
1287     if(y
)   *y 
-= origin
.y 
; 
1290 void wxWindowMac::MacWindowToRootWindow( int *x 
, int *y 
) const 
1293     if ( x 
) pt
.x 
= *x 
; 
1294     if ( y 
) pt
.y 
= *y 
; 
1296     if ( !IsTopLevel() ) 
1298         wxTopLevelWindowMac
* top 
= MacGetTopLevelWindow(); 
1301             pt
.x 
-= MacGetLeftBorderSize() ; 
1302             pt
.y 
-= MacGetTopBorderSize() ; 
1303             wxMacControl::Convert( &pt 
, m_peer 
, top
->m_peer 
) ; 
1307     if ( x 
) *x 
= (int) pt
.x 
; 
1308     if ( y 
) *y 
= (int) pt
.y 
; 
1311 void wxWindowMac::MacWindowToRootWindow( short *x 
, short *y 
) const 
1316     MacWindowToRootWindow( &x1 
, &y1 
) ; 
1321 void wxWindowMac::MacRootWindowToWindow( int *x 
, int *y 
) const 
1324     if ( x 
) pt
.x 
= *x 
; 
1325     if ( y 
) pt
.y 
= *y 
; 
1327     if ( !IsTopLevel() ) 
1329         wxMacControl::Convert( &pt 
, MacGetTopLevelWindow()->m_peer 
, m_peer 
) ; 
1330         pt
.x 
+= MacGetLeftBorderSize() ; 
1331         pt
.y 
+= MacGetTopBorderSize() ; 
1334     if ( x 
) *x 
= (int) pt
.x 
; 
1335     if ( y 
) *y 
= (int) pt
.y 
; 
1338 void wxWindowMac::MacRootWindowToWindow( short *x 
, short *y 
) const 
1343     MacRootWindowToWindow( &x1 
, &y1 
) ; 
1348 void wxWindowMac::MacGetContentAreaInset( int &left 
, int &top 
, int &right 
, int &bottom 
) 
1350     RgnHandle rgn 
= NewRgn() ; 
1351     if ( m_peer
->GetRegion( kControlContentMetaPart 
, rgn 
) == noErr 
) 
1355         GetRegionBounds( rgn 
, &content 
) ; 
1356         m_peer
->GetRect( &structure 
) ; 
1357         OffsetRect( &structure
, -structure
.left 
, -structure
.top 
) ; 
1359         left 
= content
.left 
- structure
.left 
; 
1360         top 
= content
.top  
- structure
.top 
; 
1361         right 
= structure
.right 
- content
.right 
; 
1362         bottom 
= structure
.bottom 
- content
.bottom 
; 
1366         left 
= top 
= right 
= bottom 
= 0 ; 
1371 wxSize 
wxWindowMac::DoGetSizeFromClientSize( const wxSize 
& size 
)  const 
1373     wxSize sizeTotal 
= size
; 
1375     RgnHandle rgn 
= NewRgn() ; 
1377     if ( m_peer
->GetRegion( kControlContentMetaPart 
, rgn 
) == noErr 
) 
1381         GetRegionBounds( rgn 
, &content 
) ; 
1383         m_peer
->GetRect( &structure 
) ; 
1384         // structure is in parent coordinates, but we only need width and height, so it's ok 
1386         sizeTotal
.x 
+= (structure
.right 
- structure
.left
) - (content
.right 
- content
.left
) ; 
1387         sizeTotal
.y 
+= (structure
.bottom 
- structure
.top
) - (content
.bottom 
- content
.top 
) ; 
1391     sizeTotal
.x 
+= MacGetLeftBorderSize(  ) + MacGetRightBorderSize( ) ; 
1392     sizeTotal
.y 
+= MacGetTopBorderSize(  ) + MacGetBottomBorderSize( ) ; 
1398 // Get size *available for subwindows* i.e. excluding menu bar etc. 
1399 void wxWindowMac::DoGetClientSize(int *x
, int *y
) const 
1403     RgnHandle rgn 
= NewRgn() ; 
1405     if ( m_peer
->GetRegion( kControlContentMetaPart 
, rgn 
) == noErr 
) 
1407         GetRegionBounds( rgn 
, &content 
) ; 
1411         m_peer
->GetRect( &content 
) ; 
1415     ww 
= content
.right 
- content
.left 
; 
1416     hh 
= content
.bottom 
- content
.top 
; 
1418     if (m_hScrollBar  
&& m_hScrollBar
->IsShown() ) 
1420         hh 
-= m_hScrollBar
->GetSize().y 
; // MAC_SCROLLBAR_SIZE ; 
1422     if (m_vScrollBar  
&& m_vScrollBar
->IsShown() ) 
1424         ww 
-= m_vScrollBar
->GetSize().x 
; // MAC_SCROLLBAR_SIZE; 
1431 bool wxWindowMac::SetCursor(const wxCursor
& cursor
) 
1433     if (m_cursor 
== cursor
) 
1436     if (wxNullCursor 
== cursor
) 
1438         if ( ! wxWindowBase::SetCursor( *wxSTANDARD_CURSOR 
) ) 
1443         if ( ! wxWindowBase::SetCursor( cursor 
) ) 
1447     wxASSERT_MSG( m_cursor
.Ok(), 
1448         wxT("cursor must be valid after call to the base version")); 
1451     wxWindowMac 
*mouseWin 
= 0 ; 
1453         wxTopLevelWindowMac 
*tlw 
= MacGetTopLevelWindow() ; 
1454         WindowRef window 
= (WindowRef
) ( tlw 
? tlw
->MacGetWindowRef() : 0 ) ; 
1456         Boolean swapped 
= QDSwapPort( GetWindowPort( window 
) , &savePort 
) ; 
1458         // TODO If we ever get a GetCurrentEvent.. replacement for the mouse 
1459         // position, use it... 
1463         ControlPartCode part 
; 
1464         ControlRef control 
; 
1465         control 
= wxMacFindControlUnderMouse( tlw 
, pt 
, window 
, &part 
) ; 
1467             mouseWin 
= wxFindControlFromMacControl( control 
) ; 
1470             QDSwapPort( savePort 
, NULL 
) ; 
1473     if ( mouseWin 
== this && !wxIsBusy() ) 
1475         m_cursor
.MacInstall() ; 
1482 bool wxWindowMac::DoPopupMenu(wxMenu 
*menu
, int x
, int y
) 
1484     menu
->SetInvokingWindow(this); 
1487     if ( x 
== -1 && y 
== -1 ) 
1489         wxPoint mouse 
= wxGetMousePosition(); 
1490         x 
= mouse
.x
; y 
= mouse
.y
; 
1494         ClientToScreen( &x 
, &y 
) ; 
1497     menu
->MacBeforeDisplay( true ) ; 
1498     long menuResult 
= ::PopUpMenuSelect((MenuHandle
) menu
->GetHMenu() ,y
,x
, 0) ; 
1499     if ( HiWord(menuResult
) != 0 ) 
1502         GetMenuItemCommandID( GetMenuHandle(HiWord(menuResult
)) , LoWord(menuResult
) , &id 
) ; 
1503         wxMenuItem
* item 
= NULL 
; 
1505         item 
= menu
->FindItem(id
, &realmenu
) ; 
1506         if (item
->IsCheckable()) 
1508             item
->Check( !item
->IsChecked() ) ; 
1510         menu
->SendEvent( id 
, item
->IsCheckable() ? item
->IsChecked() : -1 ) ; 
1512     menu
->MacAfterDisplay( true ) ; 
1514     menu
->SetInvokingWindow(NULL
); 
1520 // ---------------------------------------------------------------------------- 
1522 // ---------------------------------------------------------------------------- 
1526 void wxWindowMac::DoSetToolTip(wxToolTip 
*tooltip
) 
1528     wxWindowBase::DoSetToolTip(tooltip
); 
1531         m_tooltip
->SetWindow(this); 
1534 #endif // wxUSE_TOOLTIPS 
1536 void wxWindowMac::MacInvalidateBorders()  
1538     if ( m_peer 
== NULL 
) 
1541     bool vis 
= MacIsReallyShown() ; 
1545     int outerBorder 
= MacGetLeftBorderSize() ; 
1546     if ( m_peer
->NeedsFocusRect() && m_peer
->HasFocus() ) 
1549     if ( outerBorder 
== 0 ) 
1552     // now we know that we have something to do at all     
1554     // as the borders are drawn on the parent we have to properly invalidate all these areas 
1555     RgnHandle   updateInner 
= NewRgn() ,  
1556                 updateOuter 
= NewRgn() ; 
1558     // this rectangle is in HIViewCoordinates under OSX and in Window Coordinates under Carbon 
1560     m_peer
->GetRect( &rect 
) ; 
1561     RectRgn( updateInner 
, &rect 
) ; 
1562     InsetRect( &rect 
, -outerBorder 
, -outerBorder 
) ; 
1563     RectRgn( updateOuter 
, &rect 
) ; 
1564     DiffRgn( updateOuter 
, updateInner 
,updateOuter 
) ; 
1565 #ifdef __WXMAC_OSX__ 
1566     GetParent()->m_peer
->SetNeedsDisplay( updateOuter 
) ; 
1568     WindowRef tlw 
= (WindowRef
) MacGetTopLevelWindowRef() ; 
1570         InvalWindowRgn( tlw 
, updateOuter 
) ; 
1572     DisposeRgn(updateOuter
) ; 
1573     DisposeRgn(updateInner
) ; 
1575             RgnHandle updateInner = NewRgn() , updateOuter = NewRgn() ; 
1576             RectRgn( updateInner , &rect ) ; 
1577             InsetRect( &rect , -4 , -4 ) ; 
1578             RectRgn( updateOuter , &rect ) ; 
1579             DiffRgn( updateOuter , updateInner ,updateOuter ) ; 
1580             wxPoint parent(0,0); 
1581             GetParent()->MacWindowToRootWindow( &parent.x , &parent.y ) ; 
1582             parent -= GetParent()->GetClientAreaOrigin() ; 
1583             OffsetRgn( updateOuter , -parent.x , -parent.y ) ; 
1584             GetParent()->m_peer->SetNeedsDisplay( true , updateOuter ) ; 
1585             DisposeRgn(updateOuter) ; 
1586             DisposeRgn(updateInner) ; 
1591         // deleting a window while it is shown invalidates the region occupied by border or 
1594         if ( IsShown() && ( outerBorder > 0 ) ) 
1596             // as the borders are drawn on the parent we have to properly invalidate all these areas 
1597             RgnHandle updateInner = NewRgn() , updateOuter = NewRgn() , updateTotal = NewRgn() ; 
1601             m_peer->GetRect( &rect ) ; 
1602             RectRgn( updateInner , &rect ) ; 
1603             InsetRect( &rect , -outerBorder , -outerBorder ) ; 
1604             RectRgn( updateOuter , &rect ) ; 
1605             DiffRgn( updateOuter , updateInner ,updateOuter ) ; 
1606             wxPoint parent(0,0); 
1607             GetParent()->MacWindowToRootWindow( &parent.x , &parent.y ) ; 
1608             parent -= GetParent()->GetClientAreaOrigin() ; 
1609             OffsetRgn( updateOuter , -parent.x , -parent.y ) ; 
1610             CopyRgn( updateOuter , updateTotal ) ; 
1612             GetParent()->m_peer->SetNeedsDisplay( true , updateTotal ) ; 
1613             DisposeRgn(updateOuter) ; 
1614             DisposeRgn(updateInner) ; 
1615             DisposeRgn(updateTotal) ; 
1620     Rect r 
= wxMacGetBoundsForControl(this , wxPoint( actualX
,actualY
), wxSize( actualWidth
, actualHeight 
) , false ) ; 
1622     int outerBorder 
= MacGetLeftBorderSize() ; 
1623     if ( m_peer
->NeedsFocusRect() && m_peer
->HasFocus() ) 
1626     if ( vis 
&& ( outerBorder 
> 0 ) ) 
1628         // as the borders are drawn on the parent we have to properly invalidate all these areas 
1629         RgnHandle updateInner 
= NewRgn() , updateOuter 
= NewRgn() , updateTotal 
= NewRgn() ; 
1633         m_peer
->GetRect( &rect 
) ; 
1634         RectRgn( updateInner 
, &rect 
) ; 
1635         InsetRect( &rect 
, -outerBorder 
, -outerBorder 
) ; 
1636         RectRgn( updateOuter 
, &rect 
) ; 
1637         DiffRgn( updateOuter 
, updateInner 
,updateOuter 
) ; 
1639         wxPoint parent(0,0); 
1640 #if TARGET_API_MAC_OSX 
1641         // no offsetting needed when compositing 
1643         GetParent()->MacWindowToRootWindow( &parent.x , &parent.y ) ; 
1644         parent -= GetParent()->GetClientAreaOrigin() ; 
1645         OffsetRgn( updateOuter , -parent.x , -parent.y ) ; 
1648         CopyRgn( updateOuter 
, updateTotal 
) ; 
1651         RectRgn( updateInner 
, &rect 
) ; 
1652         InsetRect( &rect 
, -outerBorder 
, -outerBorder 
) ; 
1653         RectRgn( updateOuter 
, &rect 
) ; 
1654         DiffRgn( updateOuter 
, updateInner 
,updateOuter 
) ; 
1656         OffsetRgn( updateOuter , -parent.x , -parent.y ) ; 
1658         UnionRgn( updateOuter 
, updateTotal 
, updateTotal 
) ; 
1660         GetParent()->m_peer
->SetNeedsDisplay( updateTotal  
) ; 
1661         DisposeRgn(updateOuter
) ; 
1662         DisposeRgn(updateInner
) ; 
1663         DisposeRgn(updateTotal
) ; 
1668 void wxWindowMac::DoMoveWindow(int x
, int y
, int width
, int height
) 
1670     // this is never called for a toplevel window, so we know we have a parent 
1671     int former_x 
, former_y 
, former_w
, former_h 
; 
1673     // Get true coordinates of former position 
1674     DoGetPosition( &former_x 
, &former_y 
) ; 
1675     DoGetSize( &former_w 
, &former_h 
) ; 
1677     wxWindow 
*parent 
= GetParent(); 
1680         wxPoint 
pt(parent
->GetClientAreaOrigin()); 
1685     int actualWidth 
= width 
; 
1686     int actualHeight 
= height 
; 
1690     if ((m_minWidth 
!= -1) && (actualWidth 
< m_minWidth
)) 
1691         actualWidth 
= m_minWidth
; 
1692     if ((m_minHeight 
!= -1) && (actualHeight 
< m_minHeight
)) 
1693         actualHeight 
= m_minHeight
; 
1694     if ((m_maxWidth 
!= -1) && (actualWidth 
> m_maxWidth
)) 
1695         actualWidth 
= m_maxWidth
; 
1696     if ((m_maxHeight 
!= -1) && (actualHeight 
> m_maxHeight
)) 
1697         actualHeight 
= m_maxHeight
;     
1699     bool doMove 
= false ; 
1700     bool doResize 
= false ; 
1702     if ( actualX 
!= former_x 
|| actualY 
!= former_y 
) 
1706     if ( actualWidth 
!= former_w 
|| actualHeight 
!= former_h 
) 
1711     if ( doMove 
|| doResize 
) 
1713         // as the borders are drawn outside the native control, we adjust now     
1715         wxRect 
bounds( wxPoint( actualX 
+ MacGetLeftBorderSize() ,actualY 
+ MacGetTopBorderSize() ),  
1716             wxSize( actualWidth 
- (MacGetLeftBorderSize() + MacGetRightBorderSize()) ,  
1717                 actualHeight 
- (MacGetTopBorderSize() + MacGetBottomBorderSize()) ) ) ; 
1720         wxMacRectToNative( &bounds 
, &r 
) ; 
1722         if ( !GetParent()->IsTopLevel() ) 
1724             wxMacWindowToNative( GetParent() , &r 
) ; 
1727         MacInvalidateBorders() ; 
1729         m_peer
->SetRect( &r 
) ; 
1732             wxWindowMac::MacSuperChangedPosition() ; // like this only children will be notified 
1734         MacInvalidateBorders() ; 
1736         MacRepositionScrollBars() ; 
1739             wxPoint 
point(actualX
,actualY
); 
1740             wxMoveEvent 
event(point
, m_windowId
); 
1741             event
.SetEventObject(this); 
1742             GetEventHandler()->ProcessEvent(event
) ; 
1746             MacRepositionScrollBars() ; 
1747             wxSize 
size(actualWidth
, actualHeight
); 
1748             wxSizeEvent 
event(size
, m_windowId
); 
1749             event
.SetEventObject(this); 
1750             GetEventHandler()->ProcessEvent(event
); 
1756 wxSize 
wxWindowMac::DoGetBestSize() const 
1758     if ( m_macIsUserPane 
|| IsTopLevel() ) 
1759         return wxWindowBase::DoGetBestSize() ; 
1761     Rect    bestsize 
= { 0 , 0 , 0 , 0 } ; 
1762     int bestWidth
, bestHeight 
; 
1763     m_peer
->GetBestRect( &bestsize 
) ; 
1765     if ( EmptyRect( &bestsize 
) ) 
1767         bestsize
.left 
= bestsize
.top 
= 0 ; 
1768         bestsize
.right 
= 16 ; 
1769         bestsize
.bottom 
= 16 ; 
1770         if ( IsKindOf( CLASSINFO( wxScrollBar 
) ) ) 
1772             bestsize
.bottom 
= 16 ; 
1775         else if ( IsKindOf( CLASSINFO( wxSpinButton 
) ) ) 
1777             bestsize
.bottom 
= 24 ; 
1779 #endif // wxUSE_SPINBTN  
1782             // return wxWindowBase::DoGetBestSize() ; 
1786     bestWidth 
= bestsize
.right 
- bestsize
.left 
; 
1787     bestHeight 
= bestsize
.bottom 
- bestsize
.top 
; 
1788     if ( bestHeight 
< 10 ) 
1791     return wxSize(bestWidth
, bestHeight
); 
1795 // set the size of the window: if the dimensions are positive, just use them, 
1796 // but if any of them is equal to -1, it means that we must find the value for 
1797 // it ourselves (unless sizeFlags contains wxSIZE_ALLOW_MINUS_ONE flag, in 
1798 // which case -1 is a valid value for x and y) 
1800 // If sizeFlags contains wxSIZE_AUTO_WIDTH/HEIGHT flags (default), we calculate 
1801 // the width/height to best suit our contents, otherwise we reuse the current 
1803 void wxWindowMac::DoSetSize(int x
, int y
, int width
, int height
, int sizeFlags
) 
1805     // get the current size and position... 
1806     int currentX
, currentY
; 
1807     GetPosition(¤tX
, ¤tY
); 
1809     int currentW
,currentH
; 
1810     GetSize(¤tW
, ¤tH
); 
1812     // ... and don't do anything (avoiding flicker) if it's already ok 
1813     if ( x 
== currentX 
&& y 
== currentY 
&& 
1814         width 
== currentW 
&& height 
== currentH 
&& ( height 
!= -1 && width 
!= -1 ) ) 
1817         MacRepositionScrollBars() ; // we might have a real position shift 
1821     if ( x 
== -1 && !(sizeFlags 
& wxSIZE_ALLOW_MINUS_ONE
) ) 
1823     if ( y 
== -1 && !(sizeFlags 
& wxSIZE_ALLOW_MINUS_ONE
) ) 
1826     AdjustForParentClientOrigin(x
, y
, sizeFlags
); 
1828     wxSize 
size(-1, -1); 
1831         if ( sizeFlags 
& wxSIZE_AUTO_WIDTH 
) 
1833             size 
= DoGetBestSize(); 
1838             // just take the current one 
1845         if ( sizeFlags 
& wxSIZE_AUTO_HEIGHT 
) 
1849                 size 
= DoGetBestSize(); 
1851             //else: already called DoGetBestSize() above 
1857             // just take the current one 
1862     DoMoveWindow(x
, y
, width
, height
); 
1866 wxPoint 
wxWindowMac::GetClientAreaOrigin() const 
1868     RgnHandle rgn 
= NewRgn() ; 
1870     if ( m_peer
->GetRegion( kControlContentMetaPart 
, rgn 
) == noErr 
) 
1872         GetRegionBounds( rgn 
, &content 
) ; 
1876         content
.left 
= content
.top 
= 0 ; 
1879     return wxPoint( content
.left 
+ MacGetLeftBorderSize(  ) , content
.top 
+ MacGetTopBorderSize(  ) ); 
1882 void wxWindowMac::DoSetClientSize(int clientwidth
, int clientheight
) 
1884     if ( clientheight 
!= -1 || clientheight 
!= -1 ) 
1886         int currentclientwidth 
, currentclientheight 
; 
1887         int currentwidth 
, currentheight 
; 
1889         GetClientSize( ¤tclientwidth 
, ¤tclientheight 
) ; 
1890         GetSize( ¤twidth 
, ¤theight 
) ; 
1892         DoSetSize( -1 , -1 , currentwidth 
+ clientwidth 
- currentclientwidth 
, 
1893             currentheight 
+ clientheight 
- currentclientheight 
, wxSIZE_USE_EXISTING 
) ; 
1897 void wxWindowMac::SetTitle(const wxString
& title
) 
1899     m_label 
= wxStripMenuCodes(title
) ; 
1901     if ( m_peer 
&& m_peer
->Ok() ) 
1903         m_peer
->SetTitle( m_label 
) ; 
1908 wxString 
wxWindowMac::GetTitle() const 
1913 bool wxWindowMac::Show(bool show
) 
1915     bool former 
= MacIsReallyShown() ; 
1916     if ( !wxWindowBase::Show(show
) ) 
1919     // TODO use visibilityChanged Carbon Event for OSX 
1922         m_peer
->SetVisibility( show 
, true ) ; 
1924     if ( former 
!= MacIsReallyShown() ) 
1925         MacPropagateVisibilityChanged() ; 
1929 bool wxWindowMac::Enable(bool enable
) 
1931     wxASSERT( m_peer
->Ok() ) ; 
1932     bool former 
= MacIsReallyEnabled() ; 
1933     if ( !wxWindowBase::Enable(enable
) ) 
1936     m_peer
->Enable( enable 
) ; 
1938     if ( former 
!= MacIsReallyEnabled() ) 
1939         MacPropagateEnabledStateChanged() ; 
1944 // status change propagations (will be not necessary for OSX later ) 
1947 void wxWindowMac::MacPropagateVisibilityChanged() 
1949 #if !TARGET_API_MAC_OSX 
1950     MacVisibilityChanged() ; 
1952     wxWindowList::compatibility_iterator node 
= GetChildren().GetFirst(); 
1955         wxWindowMac 
*child 
= node
->GetData(); 
1956         if ( child
->IsShown() ) 
1957             child
->MacPropagateVisibilityChanged(  ) ; 
1958         node 
= node
->GetNext(); 
1963 void wxWindowMac::MacPropagateEnabledStateChanged( ) 
1965 #if !TARGET_API_MAC_OSX 
1966     MacEnabledStateChanged() ; 
1968     wxWindowList::compatibility_iterator node 
= GetChildren().GetFirst(); 
1971         wxWindowMac 
*child 
= node
->GetData(); 
1972         if ( child
->IsEnabled() ) 
1973             child
->MacPropagateEnabledStateChanged() ; 
1974         node 
= node
->GetNext(); 
1979 void wxWindowMac::MacPropagateHiliteChanged( ) 
1981 #if !TARGET_API_MAC_OSX 
1982     MacHiliteChanged() ; 
1984     wxWindowList::compatibility_iterator node 
= GetChildren().GetFirst(); 
1987         wxWindowMac 
*child 
= node
->GetData(); 
1988         // if ( child->IsEnabled() ) 
1989             child
->MacPropagateHiliteChanged() ; 
1990         node 
= node
->GetNext(); 
1996 // status change notifications 
1999 void wxWindowMac::MacVisibilityChanged() 
2003 void wxWindowMac::MacHiliteChanged() 
2007 void wxWindowMac::MacEnabledStateChanged() 
2012 // status queries on the inherited window's state 
2015 bool wxWindowMac::MacIsReallyShown() 
2017     // only under OSX the visibility of the TLW is taken into account 
2018     if ( m_isBeingDeleted 
) 
2021 #if TARGET_API_MAC_OSX 
2022     if ( m_peer 
&& m_peer
->Ok() ) 
2023         return m_peer
->IsVisible(); 
2025     wxWindow
* win 
= this ; 
2026     while( win
->IsShown()  ) 
2028         if ( win
->IsTopLevel() ) 
2031         win 
= win
->GetParent() ; 
2039 bool wxWindowMac::MacIsReallyEnabled() 
2041     return m_peer
->IsEnabled() ; 
2044 bool wxWindowMac::MacIsReallyHilited() 
2046     return m_peer
->IsActive(); 
2049 void wxWindowMac::MacFlashInvalidAreas() 
2051 #if TARGET_API_MAC_OSX 
2052     HIViewFlashDirtyArea( (WindowRef
) MacGetTopLevelWindowRef() ) ; 
2060 int wxWindowMac::GetCharHeight() const 
2062     wxClientDC 
dc ( (wxWindowMac
*)this ) ; 
2063     return dc
.GetCharHeight() ; 
2066 int wxWindowMac::GetCharWidth() const 
2068     wxClientDC 
dc ( (wxWindowMac
*)this ) ; 
2069     return dc
.GetCharWidth() ; 
2072 void wxWindowMac::GetTextExtent(const wxString
& string
, int *x
, int *y
, 
2073                            int *descent
, int *externalLeading
, const wxFont 
*theFont 
) const 
2075     const wxFont 
*fontToUse 
= theFont
; 
2077         fontToUse 
= &m_font
; 
2079     wxClientDC 
dc( (wxWindowMac
*) this ) ; 
2081     dc
.GetTextExtent( string 
, &lx 
, &ly 
, &ld
, &le
, (wxFont 
*)fontToUse 
) ; 
2082     if ( externalLeading 
) 
2083         *externalLeading 
= le 
; 
2093  * Rect is given in client coordinates, for further reading, read wxTopLevelWindowMac::InvalidateRect 
2094  * we always intersect with the entire window, not only with the client area 
2097 void wxWindowMac::Refresh(bool eraseBack
, const wxRect 
*rect
) 
2099     if ( m_peer 
== NULL 
) 
2102     if ( !MacIsReallyShown() ) 
2108         wxMacRectToNative( rect 
, &r 
) ; 
2109         m_peer
->SetNeedsDisplay( &r 
) ; 
2113         m_peer
->SetNeedsDisplay() ; 
2117 void wxWindowMac::Freeze() 
2119 #if TARGET_API_MAC_OSX 
2120     if ( !m_frozenness
++ ) 
2122         if ( m_peer 
&& m_peer
->Ok() ) 
2123             m_peer
->SetDrawingEnabled( false ) ; 
2129 void wxWindowMac::Thaw() 
2131 #if TARGET_API_MAC_OSX 
2132     wxASSERT_MSG( m_frozenness 
> 0, _T("Thaw() without matching Freeze()") ); 
2134     if ( !--m_frozenness 
) 
2136         if ( m_peer 
&& m_peer
->Ok() ) 
2138             m_peer
->SetDrawingEnabled( true ) ; 
2139             m_peer
->InvalidateWithChildren() ; 
2145 wxWindowMac 
*wxGetActiveWindow() 
2147     // actually this is a windows-only concept 
2151 // Coordinates relative to the window 
2152 void wxWindowMac::WarpPointer (int x_pos
, int y_pos
) 
2154     // We really don't move the mouse programmatically under Mac. 
2157 void wxWindowMac::OnEraseBackground(wxEraseEvent
& event
) 
2159 #if TARGET_API_MAC_OSX 
2160     if ( MacGetTopLevelWindow()->MacUsesCompositing() && (m_macBackgroundBrush
.Ok() == false || m_macBackgroundBrush
.GetStyle() == wxTRANSPARENT 
) ) 
2167         event
.GetDC()->Clear() ; 
2171 void wxWindowMac::OnNcPaint( wxNcPaintEvent
& event 
) 
2176 int wxWindowMac::GetScrollPos(int orient
) const 
2178     if ( orient 
== wxHORIZONTAL 
) 
2181            return m_hScrollBar
->GetThumbPosition() ; 
2186            return m_vScrollBar
->GetThumbPosition() ; 
2191 // This now returns the whole range, not just the number 
2192 // of positions that we can scroll. 
2193 int wxWindowMac::GetScrollRange(int orient
) const 
2195     if ( orient 
== wxHORIZONTAL 
) 
2198            return m_hScrollBar
->GetRange() ; 
2203            return m_vScrollBar
->GetRange() ; 
2208 int wxWindowMac::GetScrollThumb(int orient
) const 
2210     if ( orient 
== wxHORIZONTAL 
) 
2213            return m_hScrollBar
->GetThumbSize() ; 
2218            return m_vScrollBar
->GetThumbSize() ; 
2223 void wxWindowMac::SetScrollPos(int orient
, int pos
, bool refresh
) 
2225     if ( orient 
== wxHORIZONTAL 
) 
2228            m_hScrollBar
->SetThumbPosition( pos 
) ; 
2233            m_vScrollBar
->SetThumbPosition( pos 
) ; 
2238 // we draw borders and grow boxes, are already set up and clipped in the current port / cgContextRef 
2239 // our own window origin is at leftOrigin/rightOrigin 
2242 void wxWindowMac::MacPaintBorders( int leftOrigin 
, int rightOrigin 
) 
2248     bool hasFocus 
= m_peer
->NeedsFocusRect() && m_peer
->HasFocus() ; 
2249     bool hasBothScrollbars 
= ( m_hScrollBar 
&& m_hScrollBar
->IsShown()) && ( m_vScrollBar 
&& m_vScrollBar
->IsShown()) ; 
2251     m_peer
->GetRect( &rect 
) ; 
2252     InsetRect( &rect
, -MacGetLeftBorderSize() , -MacGetTopBorderSize() ) ; 
2254 #if wxMAC_USE_CORE_GRAPHICS && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3 
2255     if ( UMAGetSystemVersion() >= 0x1030  ) 
2258         HIThemeFrameDrawInfo info 
; 
2259         memset( &info
, 0 , sizeof( info 
) ) ; 
2263         info
.state 
= IsEnabled() ? kThemeStateActive 
: kThemeStateInactive 
; 
2264         info
.isFocused 
= hasFocus 
; 
2267         CGContextRef cgContext 
= (CGContextRef
) GetParent()->MacGetCGContextRef() ; 
2268         wxASSERT( cgContext 
) ; 
2270         if (HasFlag(wxRAISED_BORDER
) || HasFlag( wxSUNKEN_BORDER
) || HasFlag(wxDOUBLE_BORDER
) ) 
2273             GetThemeMetric( kThemeMetricEditTextFrameOutset 
, &border 
) ; 
2274             InsetRect( &srect 
, border 
, border 
); 
2275             info
.kind 
= kHIThemeFrameTextFieldSquare 
; 
2278         else if (HasFlag(wxSIMPLE_BORDER
)) 
2281             GetThemeMetric( kThemeMetricListBoxFrameOutset 
, &border 
) ; 
2282             InsetRect( &srect 
, border 
, border 
); 
2283             info
.kind 
= kHIThemeFrameListBox 
; 
2289             CGRect cgrect 
= CGRectMake( srect
.left 
, srect
.top 
, srect
.right 
- srect
.left 
, 
2290                 srect
.bottom 
- srect
.top 
) ; 
2291             HIThemeDrawFrame( &cgrect 
, &info 
, cgContext 
, kHIThemeOrientationNormal 
) ; 
2293         else if ( hasFocus 
) 
2296             CGRect cgrect 
= CGRectMake( srect
.left 
, srect
.top 
, srect
.right 
- srect
.left 
, 
2297                 srect
.bottom 
- srect
.top 
) ; 
2298             HIThemeDrawFocusRect( &cgrect 
, true , cgContext 
, kHIThemeOrientationNormal 
) ; 
2301         m_peer
->GetRect( &rect 
) ; 
2302         if ( hasBothScrollbars 
) 
2305             int size 
= m_hScrollBar
->GetWindowVariant() == wxWINDOW_VARIANT_NORMAL 
? 16 : 12 ; 
2306             CGRect cgrect 
= CGRectMake( srect
.right 
- size 
, srect
.bottom 
- size 
, size 
, size 
) ; 
2307             CGPoint cgpoint 
= CGPointMake( srect
.right 
- size 
, srect
.bottom 
- size 
) ; 
2308             HIThemeGrowBoxDrawInfo info 
;  
2309             memset( &info
, 0 , sizeof( info 
) ) ; 
2311             info
.state 
= IsEnabled() ? kThemeStateActive 
: kThemeStateInactive 
; 
2312             info
.kind 
= kHIThemeGrowBoxKindNone 
; 
2313             info
.size 
= kHIThemeGrowBoxSizeNormal 
; 
2314             info
.direction 
= kThemeGrowRight 
| kThemeGrowDown 
; 
2315             HIThemeDrawGrowBox( &cgpoint 
, &info 
, cgContext 
, kHIThemeOrientationNormal 
) ; 
2321         wxTopLevelWindowMac
* top 
= MacGetTopLevelWindow(); 
2325             wxMacControl::Convert( &pt 
, GetParent()->m_peer 
, top
->m_peer 
) ; 
2326             OffsetRect( &rect 
, pt
.x 
, pt
.y 
) ; 
2329         if (HasFlag(wxRAISED_BORDER
) || HasFlag( wxSUNKEN_BORDER
) || HasFlag(wxDOUBLE_BORDER
) ) 
2333             GetThemeMetric( kThemeMetricEditTextFrameOutset 
, &border 
) ; 
2334             InsetRect( &srect 
, border 
, border 
); 
2335             DrawThemeEditTextFrame(&srect
,IsEnabled() ? kThemeStateActive 
: kThemeStateInactive
) ; 
2337         else if (HasFlag(wxSIMPLE_BORDER
)) 
2341             GetThemeMetric( kThemeMetricListBoxFrameOutset 
, &border 
) ; 
2342             InsetRect( &srect 
, border 
, border 
); 
2343             DrawThemeListBoxFrame(&rect
,IsEnabled() ? kThemeStateActive 
: kThemeStateInactive
) ; 
2349             DrawThemeFocusRect( &srect 
, true ) ; 
2351         if ( hasBothScrollbars 
) 
2353             // GetThemeStandaloneGrowBoxBounds     
2354                         //DrawThemeStandaloneNoGrowBox 
2359 void wxWindowMac::RemoveChild( wxWindowBase 
*child 
) 
2361     if ( child 
== m_hScrollBar 
) 
2362         m_hScrollBar 
= NULL 
; 
2363     if ( child 
== m_vScrollBar 
) 
2364         m_vScrollBar 
= NULL 
; 
2366     wxWindowBase::RemoveChild( child 
) ; 
2369 // New function that will replace some of the above. 
2370 void wxWindowMac::SetScrollbar(int orient
, int pos
, int thumbVisible
, 
2371     int range
, bool refresh
) 
2373     if ( orient 
== wxHORIZONTAL 
) 
2377             if ( range 
== 0 || thumbVisible 
>= range 
) 
2379                 if ( m_hScrollBar
->IsShown() ) 
2380                     m_hScrollBar
->Show(false) ; 
2384                 if ( !m_hScrollBar
->IsShown() ) 
2385                     m_hScrollBar
->Show(true) ; 
2387             m_hScrollBar
->SetScrollbar( pos 
, thumbVisible 
, range 
, thumbVisible 
, refresh 
) ; 
2394             if ( range 
== 0 || thumbVisible 
>= range 
) 
2396                 if ( m_vScrollBar
->IsShown() ) 
2397                     m_vScrollBar
->Show(false) ; 
2401                 if ( !m_vScrollBar
->IsShown() ) 
2402                     m_vScrollBar
->Show(true) ; 
2404             m_vScrollBar
->SetScrollbar( pos 
, thumbVisible 
, range 
, thumbVisible 
, refresh 
) ; 
2407     MacRepositionScrollBars() ; 
2410 // Does a physical scroll 
2411 void wxWindowMac::ScrollWindow(int dx
, int dy
, const wxRect 
*rect
) 
2413     if( dx 
== 0 && dy 
==0 ) 
2419         int width 
, height 
; 
2420         GetClientSize( &width 
, &height 
) ; 
2421 #if TARGET_API_MAC_OSX 
2422         // note there currently is a bug in OSX which makes inefficient refreshes in case an entire control 
2423         // area is scrolled, this does not occur if width and height are 2 pixels less, 
2424         // TODO write optimal workaround 
2425         wxRect 
scrollrect( MacGetLeftBorderSize() , MacGetTopBorderSize()  , width 
, height 
) ; 
2428             scrollrect
.Intersect( *rect 
) ; 
2430         if ( m_peer
->GetNeedsDisplay() ) 
2432             // becuase HIViewScrollRect does not scroll the already invalidated area we have two options 
2433             // either immediate redraw or full invalidate 
2435             // is the better overall solution, as it does not slow down scrolling 
2436             m_peer
->SetNeedsDisplay() ; 
2438             // this would be the preferred version for fast drawing controls 
2439             if( UMAGetSystemVersion() < 0x1030 ) 
2442                 HIViewRender(m_peer
->GetControlRef()) ; 
2445         // as the native control might be not a 0/0 wx window coordinates, we have to offset 
2446         scrollrect
.Offset( -MacGetLeftBorderSize() , -MacGetTopBorderSize() ) ; 
2447         m_peer
->ScrollRect( scrollrect 
, dx 
, dy 
) ; 
2454         RgnHandle updateRgn 
= NewRgn() ; 
2457             wxClientDC 
dc(this) ; 
2458             wxMacPortSetter 
helper(&dc
) ; 
2460             m_peer
->GetRect( &scrollrect 
) ; 
2461             scrollrect
.top 
+= MacGetTopBorderSize() ; 
2462             scrollrect
.left 
+= MacGetLeftBorderSize() ; 
2463             scrollrect
.bottom 
= scrollrect
.top 
+ height 
; 
2464             scrollrect
.right 
= scrollrect
.left 
+ width 
; 
2468                 Rect r 
= { dc
.YLOG2DEVMAC(rect
->y
) , dc
.XLOG2DEVMAC(rect
->x
) , dc
.YLOG2DEVMAC(rect
->y 
+ rect
->height
) , 
2469                     dc
.XLOG2DEVMAC(rect
->x 
+ rect
->width
) } ; 
2470                 SectRect( &scrollrect 
, &r 
, &scrollrect 
) ; 
2472             ScrollRect( &scrollrect 
, dx 
, dy 
, updateRgn 
) ; 
2474             // now scroll the former update region as well and add the new update region 
2476             WindowRef rootWindow 
= (WindowRef
) MacGetTopLevelWindowRef() ; 
2477             RgnHandle formerUpdateRgn 
= NewRgn() ; 
2478             RgnHandle scrollRgn 
= NewRgn() ; 
2479             RectRgn( scrollRgn 
, &scrollrect 
) ; 
2480             GetWindowUpdateRgn( rootWindow 
, formerUpdateRgn 
) ; 
2482             LocalToGlobal( &pt 
) ; 
2483             OffsetRgn( formerUpdateRgn 
, -pt
.h 
, -pt
.v 
) ; 
2484             SectRgn( formerUpdateRgn 
, scrollRgn 
, formerUpdateRgn 
) ; 
2485             if ( !EmptyRgn( formerUpdateRgn 
) ) 
2487                 MacOffsetRgn( formerUpdateRgn 
, dx 
, dy 
) ; 
2488                 SectRgn( formerUpdateRgn 
, scrollRgn 
, formerUpdateRgn 
) ; 
2489                 InvalWindowRgn(rootWindow  
,  formerUpdateRgn 
) ; 
2491             InvalWindowRgn(rootWindow  
,  updateRgn 
) ; 
2492             DisposeRgn( updateRgn 
) ; 
2493             DisposeRgn( formerUpdateRgn 
) ; 
2494             DisposeRgn( scrollRgn 
) ; 
2499     for (wxWindowList::compatibility_iterator node 
= GetChildren().GetFirst(); node
; node 
= node
->GetNext()) 
2501         wxWindowMac 
*child 
= node
->GetData(); 
2502         if (child 
== m_vScrollBar
) continue; 
2503         if (child 
== m_hScrollBar
) continue; 
2504         if (child
->IsTopLevel()) continue; 
2507         child
->GetPosition( &x
, &y 
); 
2509         child
->GetSize( &w
, &h 
); 
2513             if (rect
->Intersects(rc
)) 
2514                 child
->SetSize( x
+dx
, y
+dy
, w
, h 
); 
2518             child
->SetSize( x
+dx
, y
+dy
, w
, h 
); 
2523 void wxWindowMac::MacOnScroll(wxScrollEvent 
&event 
) 
2525     if ( event
.GetEventObject() == m_vScrollBar 
|| event
.GetEventObject() == m_hScrollBar 
) 
2527         wxScrollWinEvent wevent
; 
2528         wevent
.SetPosition(event
.GetPosition()); 
2529         wevent
.SetOrientation(event
.GetOrientation()); 
2530         wevent
.SetEventObject(this); 
2532         if (event
.GetEventType() == wxEVT_SCROLL_TOP
) 
2533             wevent
.SetEventType( wxEVT_SCROLLWIN_TOP 
); 
2534         else if (event
.GetEventType() == wxEVT_SCROLL_BOTTOM
) 
2535             wevent
.SetEventType( wxEVT_SCROLLWIN_BOTTOM 
); 
2536         else if (event
.GetEventType() == wxEVT_SCROLL_LINEUP
) 
2537             wevent
.SetEventType( wxEVT_SCROLLWIN_LINEUP 
); 
2538         else if (event
.GetEventType() == wxEVT_SCROLL_LINEDOWN
) 
2539             wevent
.SetEventType( wxEVT_SCROLLWIN_LINEDOWN 
); 
2540         else if (event
.GetEventType() == wxEVT_SCROLL_PAGEUP
) 
2541             wevent
.SetEventType( wxEVT_SCROLLWIN_PAGEUP 
); 
2542         else if (event
.GetEventType() == wxEVT_SCROLL_PAGEDOWN
) 
2543             wevent
.SetEventType( wxEVT_SCROLLWIN_PAGEDOWN 
); 
2544         else if (event
.GetEventType() == wxEVT_SCROLL_THUMBTRACK
) 
2545             wevent
.SetEventType( wxEVT_SCROLLWIN_THUMBTRACK 
); 
2546         else if (event
.GetEventType() == wxEVT_SCROLL_THUMBRELEASE
) 
2547             wevent
.SetEventType( wxEVT_SCROLLWIN_THUMBRELEASE 
); 
2549         GetEventHandler()->ProcessEvent(wevent
); 
2553 // Get the window with the focus 
2554 wxWindowMac 
*wxWindowBase::DoFindFocus() 
2556     ControlRef control 
; 
2557     GetKeyboardFocus( GetUserFocusWindow() , &control 
) ; 
2558     return wxFindControlFromMacControl( control 
) ; 
2561 void wxWindowMac::OnSetFocus(wxFocusEvent
& event
) 
2563     // panel wants to track the window which was the last to have focus in it, 
2564     // so we want to set ourselves as the window which last had focus 
2566     // notice that it's also important to do it upwards the tree becaus 
2567     // otherwise when the top level panel gets focus, it won't set it back to 
2568     // us, but to some other sibling 
2570     // CS:don't know if this is still needed: 
2571     //wxChildFocusEvent eventFocus(this); 
2572     //(void)GetEventHandler()->ProcessEvent(eventFocus); 
2574     if ( MacGetTopLevelWindow() && m_peer
->NeedsFocusRect() ) 
2576  #if !wxMAC_USE_CORE_GRAPHICS 
2577         wxMacWindowStateSaver 
sv( this ) ; 
2579         m_peer
->GetRect( &rect 
) ; 
2580         InsetRect( &rect
, -MacGetLeftBorderSize() , -MacGetTopBorderSize() ) ; 
2582         wxTopLevelWindowMac
* top 
= MacGetTopLevelWindow(); 
2586             wxMacControl::Convert( &pt 
, GetParent()->m_peer 
, top
->m_peer 
) ; 
2588             rect
.right 
+= pt
.x 
; 
2590             rect
.bottom 
+= pt
.y 
; 
2593         if ( event
.GetEventType() == wxEVT_SET_FOCUS 
) 
2594             DrawThemeFocusRect( &rect 
, true ) ; 
2597             DrawThemeFocusRect( &rect 
, false ) ; 
2599             // as this erases part of the frame we have to redraw borders 
2600             // and because our z-ordering is not always correct (staticboxes) 
2601             // we have to invalidate things, we cannot simple redraw 
2602             MacInvalidateBorders() ; 
2605         GetParent()->Refresh() ; 
2612 void wxWindowMac::OnInternalIdle() 
2614     // This calls the UI-update mechanism (querying windows for 
2615     // menu/toolbar/control state information) 
2616     if (wxUpdateUIEvent::CanUpdate(this)) 
2617         UpdateWindowUI(wxUPDATE_UI_FROMIDLE
); 
2620 // Raise the window to the top of the Z order 
2621 void wxWindowMac::Raise() 
2623     m_peer
->SetZOrder( true , NULL 
) ; 
2626 // Lower the window to the bottom of the Z order 
2627 void wxWindowMac::Lower() 
2629     m_peer
->SetZOrder( false , NULL 
) ; 
2633 // static wxWindow *gs_lastWhich = NULL; 
2635 bool wxWindowMac::MacSetupCursor( const wxPoint
& pt
) 
2637     // first trigger a set cursor event 
2639     wxPoint clientorigin 
= GetClientAreaOrigin() ; 
2640     wxSize clientsize 
= GetClientSize() ; 
2642     if ( wxRect2DInt( clientorigin
.x 
, clientorigin
.y 
, clientsize
.x 
, clientsize
.y 
).Contains( wxPoint2DInt( pt 
) ) ) 
2644         wxSetCursorEvent 
event( pt
.x 
, pt
.y 
); 
2646         bool processedEvtSetCursor 
= GetEventHandler()->ProcessEvent(event
); 
2647         if ( processedEvtSetCursor 
&& event
.HasCursor() ) 
2649             cursor 
= event
.GetCursor() ; 
2654             // the test for processedEvtSetCursor is here to prevent using m_cursor 
2655             // if the user code caught EVT_SET_CURSOR() and returned nothing from 
2656             // it - this is a way to say that our cursor shouldn't be used for this 
2658             if ( !processedEvtSetCursor 
&& m_cursor
.Ok() ) 
2668                     cursor 
= *wxSTANDARD_CURSOR  
; 
2672             cursor
.MacInstall() ; 
2674     return cursor
.Ok() ; 
2677 wxString 
wxWindowMac::MacGetToolTipString( wxPoint 
&pt 
) 
2682         return m_tooltip
->GetTip() ; 
2685     return wxEmptyString 
; 
2688 void wxWindowMac::ClearBackground() 
2694 void wxWindowMac::Update() 
2696 #if TARGET_API_MAC_OSX 
2698 #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3 
2699     WindowRef window 
= (WindowRef
)MacGetTopLevelWindowRef() ; 
2701     // for composited windows this also triggers a redraw of all 
2702     // invalid views in the window 
2703     if( UMAGetSystemVersion() >= 0x1030 ) 
2704         HIWindowFlush(window
) ; 
2708         // the only way to trigger the redrawing on earlier systems is to call 
2711         EventRef currentEvent 
= (EventRef
) wxTheApp
->MacGetCurrentEvent() ; 
2712         UInt32 currentEventClass 
= 0 ; 
2713         UInt32 currentEventKind 
= 0 ; 
2714         if ( currentEvent 
!= NULL 
) 
2716             currentEventClass 
= ::GetEventClass( currentEvent 
) ; 
2717             currentEventKind 
= ::GetEventKind( currentEvent 
) ; 
2719         if ( currentEventClass 
!= kEventClassMenu 
) 
2721             // when tracking a menu, strange redraw errors occur if we flush now, so leave.. 
2724             OSStatus status 
= noErr 
; 
2725             status 
= ReceiveNextEvent( 0 , NULL 
, kEventDurationNoWait 
, false , &theEvent 
) ; 
2728             m_peer
->SetNeedsDisplay() ; 
2731     ::Draw1Control( m_peer
->GetControlRef() ) ; 
2735 wxTopLevelWindowMac
* wxWindowMac::MacGetTopLevelWindow() const 
2737     wxTopLevelWindowMac
* win 
= NULL 
; 
2738     WindowRef window 
= (WindowRef
) MacGetTopLevelWindowRef() ; 
2741         win 
= wxFindWinFromMacWindow( window 
) ; 
2745 wxRegion 
wxWindowMac::MacGetVisibleRegion( bool includeOuterStructures 
) 
2747     // includeOuterStructures is true if we try to draw somthing like a focus ring etc. 
2748     // also a window dc uses this, in this case we only clip in the hierarchy for hard 
2749     // borders like a scrollwindow, splitter etc otherwise we end up in a paranoia having 
2750     // to add focus borders everywhere 
2753     RgnHandle visRgn 
= NewRgn() ; 
2754     RgnHandle tempRgn 
= NewRgn() ; 
2755     if ( !m_isBeingDeleted 
&& MacIsReallyShown() /*m_peer->IsVisible() */ ) 
2757         m_peer
->GetRect( &r 
) ; 
2758         r
.left 
-= MacGetLeftBorderSize() ; 
2759         r
.top 
-= MacGetTopBorderSize() ; 
2760         r
.bottom 
+= MacGetBottomBorderSize() ; 
2761         r
.right 
+= MacGetRightBorderSize() ; 
2768         if ( includeOuterStructures 
) 
2769             InsetRect( &r 
, -4 , -4 ) ; 
2770         RectRgn( visRgn 
, &r 
) ; 
2772         if ( !IsTopLevel() ) 
2774             wxWindow
* child 
= this ; 
2775             wxWindow
* parent 
= child
->GetParent() ; 
2780                 // we have to find a better clipping algorithm here, in order not to clip things 
2781                 // positioned like status and toolbar 
2782                 if ( 1 /* parent->IsTopLevel() && child->IsKindOf( CLASSINFO( wxToolBar ) ) */ ) 
2784                     size 
= parent
->GetSize() ; 
2789                     size 
= parent
->GetClientSize() ; 
2790                     wxPoint origin 
= parent
->GetClientAreaOrigin() ; 
2794                 parent
->MacWindowToRootWindow( &x
, &y 
) ; 
2795                 MacRootWindowToWindow( &x 
, &y 
) ; 
2797                 if ( !includeOuterStructures 
|| ( 
2798                     parent
->MacClipChildren() || 
2799                     ( parent
->GetParent() && parent
->GetParent()->MacClipGrandChildren() ) 
2802                     SetRectRgn( tempRgn 
, 
2803                         x 
+ parent
->MacGetLeftBorderSize() , y 
+ parent
->MacGetTopBorderSize() , 
2804                         x 
+ size
.x 
- parent
->MacGetRightBorderSize(), 
2805                         y 
+ size
.y 
- parent
->MacGetBottomBorderSize()) ; 
2807                     SectRgn( visRgn 
, tempRgn 
, visRgn 
) ; 
2809                 if ( parent
->IsTopLevel() ) 
2812                 parent 
= child
->GetParent() ; 
2817     wxRegion vis 
= visRgn 
; 
2818     DisposeRgn( visRgn 
) ; 
2819     DisposeRgn( tempRgn 
) ; 
2824     This function must not change the updatergn ! 
2826 bool wxWindowMac::MacDoRedraw( WXHRGN updatergnr 
, long time 
) 
2828     RgnHandle updatergn 
= (RgnHandle
) updatergnr 
; 
2829     bool handled 
= false ; 
2831     GetRegionBounds( updatergn 
, &updatebounds 
) ; 
2833     // wxLogDebug(wxT("update for %s bounds %d , %d , %d , %d"),wxString(GetClassInfo()->GetClassName()).c_str(), updatebounds.left , updatebounds.top , updatebounds.right , updatebounds.bottom ) ; 
2835     if ( !EmptyRgn(updatergn
) )   
2837         RgnHandle newupdate 
= NewRgn() ; 
2838         wxSize point 
= GetClientSize() ; 
2839         wxPoint origin 
= GetClientAreaOrigin() ; 
2840         SetRectRgn( newupdate 
, origin
.x 
, origin
.y 
, origin
.x 
+ point
.x 
, origin
.y
+point
.y 
) ; 
2841         SectRgn( newupdate 
, updatergn 
, newupdate 
) ; 
2843         // first send an erase event to the entire update area 
2845             // for the toplevel window this really is the entire area 
2846             // for all the others only their client area, otherwise they 
2847             // might be drawing with full alpha and eg put blue into 
2848             // the grow-box area of a scrolled window (scroll sample) 
2851                 dc 
= new wxWindowDC(this); 
2853                 dc 
= new wxClientDC(this); 
2854             dc
->SetClippingRegion(wxRegion(updatergn
)); 
2855             wxEraseEvent 
eevent( GetId(), dc 
); 
2856             eevent
.SetEventObject( this ); 
2857             GetEventHandler()->ProcessEvent( eevent 
); 
2861         // calculate a client-origin version of the update rgn and set m_updateRegion to that 
2862         OffsetRgn( newupdate 
, -origin
.x 
, -origin
.y 
) ; 
2863         m_updateRegion 
= newupdate 
; 
2864         DisposeRgn( newupdate 
) ; 
2866         if ( !m_updateRegion
.Empty() ) 
2868             // paint the window itself 
2871             event
.SetTimestamp(time
); 
2872             event
.SetEventObject(this); 
2873             GetEventHandler()->ProcessEvent(event
); 
2877         // now we cannot rely on having its borders drawn by a window itself, as it does not 
2878         // get the updateRgn wide enough to always do so, so we do it from the parent 
2879         // this would also be the place to draw any custom backgrounds for native controls 
2880         // in Composited windowing 
2881         wxPoint clientOrigin 
= GetClientAreaOrigin() ; 
2883         for (wxWindowList::compatibility_iterator node 
= GetChildren().GetFirst(); node
; node 
= node
->GetNext()) 
2885             wxWindowMac 
*child 
= node
->GetData(); 
2886             if (child 
== m_vScrollBar
) continue; 
2887             if (child 
== m_hScrollBar
) continue; 
2888             if (child
->IsTopLevel()) continue; 
2889             if (!child
->IsShown()) continue; 
2891             // only draw those in the update region (add a safety margin of 10 pixels for shadow effects 
2894             child
->GetPosition( &x
, &y 
); 
2896             child
->GetSize( &w
, &h 
); 
2897             Rect childRect 
= { y 
, x 
, y 
+ h 
, x 
+ w 
} ; 
2898             OffsetRect( &childRect 
, clientOrigin
.x 
, clientOrigin
.y 
) ; 
2899             InsetRect( &childRect 
, -10 , -10) ; 
2901             if ( RectInRgn( &childRect 
, updatergn 
) ) 
2904                 // paint custom borders 
2905                 wxNcPaintEvent 
eventNc( child
->GetId() ); 
2906                 eventNc
.SetEventObject( child 
); 
2907                 if ( !child
->GetEventHandler()->ProcessEvent( eventNc 
) ) 
2909 #if wxMAC_USE_CORE_GRAPHICS && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3 
2910                     if ( UMAGetSystemVersion() >= 0x1030 ) 
2912                         child
->MacPaintBorders(0,0) ; 
2917                         wxWindowDC 
dc(this) ; 
2918                         dc
.SetClippingRegion(wxRegion(updatergn
)); 
2919                         wxMacPortSetter 
helper(&dc
) ; 
2920                         child
->MacPaintBorders(0,0)  ; 
2930 WXWindow 
wxWindowMac::MacGetTopLevelWindowRef() const 
2932     wxWindowMac 
*iter 
= (wxWindowMac
*)this ; 
2936         if ( iter
->IsTopLevel() ) 
2937             return ((wxTopLevelWindow
*)iter
)->MacGetWindowRef() ; 
2939         iter 
= iter
->GetParent() ; 
2941     wxASSERT_MSG( 1 , wxT("No valid mac root window") ) ; 
2945 void wxWindowMac::MacCreateScrollBars( long style 
) 
2947     wxASSERT_MSG( m_vScrollBar 
== NULL 
&& m_hScrollBar 
== NULL 
, wxT("attempt to create window twice") ) ; 
2949     if ( style 
& ( wxVSCROLL 
| wxHSCROLL 
) ) 
2951         bool hasBoth 
= ( style 
& wxVSCROLL 
) && ( style 
& wxHSCROLL 
) ; 
2952         int scrlsize 
= MAC_SCROLLBAR_SIZE 
; 
2953         wxWindowVariant variant 
= wxWINDOW_VARIANT_NORMAL 
; 
2954         if ( GetWindowVariant() == wxWINDOW_VARIANT_SMALL 
|| GetWindowVariant() == wxWINDOW_VARIANT_MINI 
) 
2956             scrlsize 
= MAC_SMALL_SCROLLBAR_SIZE 
; 
2957             variant 
= wxWINDOW_VARIANT_SMALL 
; 
2960         int adjust 
= hasBoth 
? scrlsize 
- 1: 0 ; 
2962         GetClientSize( &width 
, &height 
) ; 
2964         wxPoint 
vPoint(width
-scrlsize
, 0) ; 
2965         wxSize 
vSize(scrlsize
, height 
- adjust
) ; 
2966         wxPoint 
hPoint(0 , height
-scrlsize 
) ; 
2967         wxSize 
hSize( width 
- adjust
, scrlsize
) ; 
2970         if ( style 
& wxVSCROLL 
) 
2972             m_vScrollBar 
= new wxScrollBar(this, wxID_ANY
, vPoint
, 
2973                 vSize 
, wxVERTICAL
); 
2976         if ( style  
& wxHSCROLL 
) 
2978             m_hScrollBar 
= new wxScrollBar(this, wxID_ANY
, hPoint
, 
2979                 hSize 
, wxHORIZONTAL
); 
2984     // because the create does not take into account the client area origin 
2985     MacRepositionScrollBars() ; // we might have a real position shift 
2988 void wxWindowMac::MacRepositionScrollBars() 
2990     if ( !m_hScrollBar 
&& !m_vScrollBar 
) 
2993     bool hasBoth 
= ( m_hScrollBar 
&& m_hScrollBar
->IsShown()) && ( m_vScrollBar 
&& m_vScrollBar
->IsShown()) ; 
2994     int scrlsize 
= m_hScrollBar 
? m_hScrollBar
->GetSize().y 
: ( m_vScrollBar 
? m_vScrollBar
->GetSize().x 
: MAC_SCROLLBAR_SIZE 
) ; 
2995     int adjust 
= hasBoth 
? scrlsize 
- 1 : 0 ; 
2997     // get real client area 
3001     GetSize( &width 
, &height 
) ; 
3003     width 
-= MacGetLeftBorderSize() + MacGetRightBorderSize(); 
3004     height 
-= MacGetTopBorderSize() + MacGetBottomBorderSize(); 
3006     wxPoint 
vPoint(width
-MAC_SCROLLBAR_SIZE
, 0) ; 
3007     wxSize 
vSize(MAC_SCROLLBAR_SIZE
, height 
- adjust
) ; 
3008     wxPoint 
hPoint(0 , height
-MAC_SCROLLBAR_SIZE 
) ; 
3009     wxSize 
hSize( width 
- adjust
, MAC_SCROLLBAR_SIZE
) ; 
3015     GetSize( &w , &h ) ; 
3017     MacClientToRootWindow( &x , &y ) ; 
3018     MacClientToRootWindow( &w , &h ) ; 
3020     wxWindowMac *iter = (wxWindowMac*)this ; 
3022     int totW = 10000 , totH = 10000; 
3025         if ( iter->IsTopLevel() ) 
3027             iter->GetSize( &totW , &totH ) ; 
3031         iter = iter->GetParent() ; 
3059         m_vScrollBar
->SetSize( vPoint
.x 
, vPoint
.y
, vSize
.x
, vSize
.y 
, wxSIZE_ALLOW_MINUS_ONE
); 
3063         m_hScrollBar
->SetSize( hPoint
.x 
, hPoint
.y
, hSize
.x
, hSize
.y
, wxSIZE_ALLOW_MINUS_ONE
); 
3067 bool wxWindowMac::AcceptsFocus() const 
3069     return MacCanFocus() && wxWindowBase::AcceptsFocus(); 
3072 void wxWindowMac::MacSuperChangedPosition() 
3074     // only window-absolute structures have to be moved i.e. controls 
3076     wxWindowList::compatibility_iterator node 
= GetChildren().GetFirst(); 
3079         wxWindowMac 
*child 
= node
->GetData(); 
3080         child
->MacSuperChangedPosition() ; 
3081         node 
= node
->GetNext(); 
3085 void wxWindowMac::MacTopLevelWindowChangedPosition() 
3087     // only screen-absolute structures have to be moved i.e. glcanvas 
3089     wxWindowList::compatibility_iterator node 
= GetChildren().GetFirst(); 
3092         wxWindowMac 
*child 
= node
->GetData(); 
3093         child
->MacTopLevelWindowChangedPosition() ; 
3094         node 
= node
->GetNext(); 
3098 long wxWindowMac::MacGetLeftBorderSize( ) const 
3103     if (m_windowStyle 
& wxRAISED_BORDER 
|| m_windowStyle 
& wxSUNKEN_BORDER 
) 
3108     else if (  m_windowStyle 
&wxDOUBLE_BORDER
) 
3113     else if (m_windowStyle 
&wxSIMPLE_BORDER
) 
3120 long wxWindowMac::MacGetRightBorderSize( ) const 
3122     // they are all symmetric in mac themes 
3123     return MacGetLeftBorderSize() ; 
3126 long wxWindowMac::MacGetTopBorderSize( ) const 
3128     // they are all symmetric in mac themes 
3129     return MacGetLeftBorderSize() ; 
3132 long wxWindowMac::MacGetBottomBorderSize( ) const 
3134     // they are all symmetric in mac themes 
3135     return MacGetLeftBorderSize() ; 
3138 long wxWindowMac::MacRemoveBordersFromStyle( long style 
) 
3140     return style 
& ~wxBORDER_MASK 
; 
3143 // Find the wxWindowMac at the current mouse position, returning the mouse 
3145 wxWindowMac
* wxFindWindowAtPointer(wxPoint
& pt
) 
3147     pt 
= wxGetMousePosition(); 
3148     wxWindowMac
* found 
= wxFindWindowAtPoint(pt
); 
3152 // Get the current mouse position. 
3153 wxPoint 
wxGetMousePosition() 
3156     wxGetMousePosition(& x
, & y
); 
3157     return wxPoint(x
, y
); 
3160 void wxWindowMac::OnMouseEvent( wxMouseEvent 
&event 
) 
3162     if ( event
.GetEventType() == wxEVT_RIGHT_DOWN 
) 
3164         // copied from wxGTK : CS 
3165         // generate a "context menu" event: this is similar to wxEVT_RIGHT_DOWN 
3168         // (a) it's a command event and so is propagated to the parent 
3169         // (b) under MSW it can be generated from kbd too 
3170         // (c) it uses screen coords (because of (a)) 
3171         wxContextMenuEvent 
evtCtx(wxEVT_CONTEXT_MENU
, 
3173                                   this->ClientToScreen(event
.GetPosition())); 
3174         if ( ! GetEventHandler()->ProcessEvent(evtCtx
) ) 
3183 void wxWindowMac::OnPaint( wxPaintEvent 
& event 
) 
3185     if ( wxTheApp
->MacGetCurrentEvent() != NULL 
&& wxTheApp
->MacGetCurrentEventHandlerCallRef() != NULL 
) 
3187         CallNextEventHandler((EventHandlerCallRef
)wxTheApp
->MacGetCurrentEventHandlerCallRef() , (EventRef
) wxTheApp
->MacGetCurrentEvent() ) ; 
3191 void wxWindowMac::MacHandleControlClick( WXWidget control 
, wxInt16 controlpart 
, bool WXUNUSED( mouseStillDown 
) ) 
3195 Rect 
wxMacGetBoundsForControl( wxWindow
* window 
, const wxPoint
& pos 
, const wxSize 
&size 
, bool adjustForOrigin 
) 
3199     window
->MacGetBoundsForControl( pos 
, size 
, x 
, y
, w
, h 
, adjustForOrigin
) ; 
3200     Rect bounds 
=  { y 
, x 
, y
+h 
, x
+w  
}; 
3204 wxInt32 
wxWindowMac::MacControlHit(WXEVENTHANDLERREF 
WXUNUSED(handler
) , WXEVENTREF 
WXUNUSED(event
) ) 
3206     return eventNotHandledErr 
;