1 ///////////////////////////////////////////////////////////////////////////// 
   2 // Name:        src/mac/carbon/window.cpp 
   3 // Purpose:     wxWindowMac 
   4 // Author:      Stefan Csomor 
   8 // Copyright:   (c) Stefan Csomor 
   9 // Licence:     wxWindows licence 
  10 ///////////////////////////////////////////////////////////////////////////// 
  12 #include "wx/wxprec.h" 
  14 #include "wx/window.h" 
  23     #include "wx/dcclient.h" 
  24     #include "wx/button.h" 
  26     #include "wx/dialog.h" 
  27     #include "wx/settings.h" 
  28     #include "wx/msgdlg.h" 
  29     #include "wx/scrolbar.h" 
  30     #include "wx/statbox.h" 
  31     #include "wx/textctrl.h" 
  32     #include "wx/toolbar.h" 
  33     #include "wx/layout.h" 
  34     #include "wx/statusbr.h" 
  35     #include "wx/menuitem.h" 
  36     #include "wx/treectrl.h" 
  37     #include "wx/listctrl.h" 
  40 #include "wx/tooltip.h" 
  41 #include "wx/spinctrl.h" 
  42 #include "wx/geometry.h" 
  45     #include "wx/listctrl.h" 
  49     #include "wx/treectrl.h" 
  57     #include "wx/popupwin.h" 
  60 #if wxUSE_DRAG_AND_DROP 
  64 #include "wx/mac/uma.h" 
  66 #define MAC_SCROLLBAR_SIZE 15 
  67 #define MAC_SMALL_SCROLLBAR_SIZE 11 
  71 #ifdef __WXUNIVERSAL__ 
  72     IMPLEMENT_ABSTRACT_CLASS(wxWindowMac
, wxWindowBase
) 
  74     IMPLEMENT_DYNAMIC_CLASS(wxWindow
, wxWindowBase
) 
  77 BEGIN_EVENT_TABLE(wxWindowMac
, wxWindowBase
) 
  78     EVT_NC_PAINT(wxWindowMac::OnNcPaint
) 
  79     EVT_ERASE_BACKGROUND(wxWindowMac::OnEraseBackground
) 
  80     EVT_PAINT(wxWindowMac::OnPaint
) 
  81     EVT_MOUSE_EVENTS(wxWindowMac::OnMouseEvent
) 
  84 #define wxMAC_DEBUG_REDRAW 0 
  85 #ifndef wxMAC_DEBUG_REDRAW 
  86 #define wxMAC_DEBUG_REDRAW 0 
  89 // --------------------------------------------------------------------------- 
  90 // Utility Routines to move between different coordinate systems 
  91 // --------------------------------------------------------------------------- 
  94  * Right now we have the following setup : 
  95  * a border that is not part of the native control is always outside the 
  96  * control's border (otherwise we loose all native intelligence, future ways 
  97  * may be to have a second embedding control responsible for drawing borders 
  98  * and backgrounds eventually) 
  99  * so all this border calculations have to be taken into account when calling 
 100  * native methods or getting native oriented data 
 101  * so we have three coordinate systems here 
 102  * wx client coordinates 
 103  * wx window coordinates (including window frames) 
 108 // originating from native control 
 112 void wxMacNativeToWindow( const wxWindow
* window 
, RgnHandle handle 
) 
 114     OffsetRgn( handle 
, window
->MacGetLeftBorderSize() , window
->MacGetTopBorderSize() ) ; 
 117 void wxMacNativeToWindow( const wxWindow
* window 
, Rect 
*rect 
) 
 119     OffsetRect( rect 
, window
->MacGetLeftBorderSize() , window
->MacGetTopBorderSize() ) ; 
 123 // directed towards native control 
 126 void wxMacWindowToNative( const wxWindow
* window 
, RgnHandle handle 
) 
 128     OffsetRgn( handle 
, -window
->MacGetLeftBorderSize() , -window
->MacGetTopBorderSize() ); 
 131 void wxMacWindowToNative( const wxWindow
* window 
, Rect 
*rect 
) 
 133     OffsetRect( rect 
, -window
->MacGetLeftBorderSize() , -window
->MacGetTopBorderSize() ) ; 
 136 // --------------------------------------------------------------------------- 
 138 // --------------------------------------------------------------------------- 
 140 static const EventTypeSpec eventList
[] = 
 142     { kEventClassCommand
, kEventProcessCommand 
} , 
 143     { kEventClassCommand
, kEventCommandUpdateStatus 
} , 
 145     { kEventClassControl 
, kEventControlGetClickActivation 
} , 
 146     { kEventClassControl 
, kEventControlHit 
} , 
 148     { kEventClassTextInput
, kEventTextInputUnicodeForKeyEvent 
} , 
 149     { kEventClassTextInput
, kEventTextInputUpdateActiveInputArea 
} , 
 151     { kEventClassControl 
, kEventControlDraw 
} , 
 153     { kEventClassControl 
, kEventControlVisibilityChanged 
} , 
 154     { kEventClassControl 
, kEventControlEnabledStateChanged 
} , 
 155     { kEventClassControl 
, kEventControlHiliteChanged 
} , 
 157     { kEventClassControl 
, kEventControlActivate 
} , 
 158     { kEventClassControl 
, kEventControlDeactivate 
} , 
 160     { kEventClassControl 
, kEventControlSetFocusPart 
} , 
 161     { kEventClassControl 
, kEventControlFocusPartChanged 
} , 
 163     { kEventClassService 
, kEventServiceGetTypes 
}, 
 164     { kEventClassService 
, kEventServiceCopy 
}, 
 165     { kEventClassService 
, kEventServicePaste 
}, 
 167 //    { kEventClassControl , kEventControlInvalidateForSizeChange } , // 10.3 only 
 168 //    { kEventClassControl , kEventControlBoundsChanged } , 
 171 static pascal OSStatus 
wxMacWindowControlEventHandler( EventHandlerCallRef handler 
, EventRef event 
, void *data 
) 
 173     OSStatus result 
= eventNotHandledErr 
; 
 175     wxMacCarbonEvent 
cEvent( event 
) ; 
 177     ControlRef controlRef 
; 
 178     wxWindowMac
* thisWindow 
= (wxWindowMac
*) data 
; 
 180     cEvent
.GetParameter( kEventParamDirectObject 
, &controlRef 
) ; 
 182     switch ( GetEventKind( event 
) ) 
 184         case kEventControlDraw 
: 
 186                 RgnHandle updateRgn 
= NULL 
; 
 187                 RgnHandle allocatedRgn 
= NULL 
; 
 188                 wxRegion visRegion 
= thisWindow
->MacGetVisibleRegion() ; 
 190                 if ( cEvent
.GetParameter
<RgnHandle
>(kEventParamRgnHandle
, &updateRgn
) != noErr 
) 
 192                     HIShapeGetAsQDRgn( visRegion
.GetWXHRGN(), updateRgn 
); 
 196                     if ( thisWindow
->MacGetLeftBorderSize() != 0 || thisWindow
->MacGetTopBorderSize() != 0 ) 
 198                         // as this update region is in native window locals we must adapt it to wx window local 
 199                         allocatedRgn 
= NewRgn() ; 
 200                         CopyRgn( updateRgn 
, allocatedRgn 
) ; 
 202                         // hide the given region by the new region that must be shifted 
 203                         wxMacNativeToWindow( thisWindow 
, allocatedRgn 
) ; 
 204                         updateRgn 
= allocatedRgn 
; 
 208 #if wxMAC_DEBUG_REDRAW 
 209                 if ( thisWindow
->MacIsUserPane() ) 
 211                     static float color 
= 0.5 ; 
 214                     CGContextRef cgContext 
= cEvent
.GetParameter
<CGContextRef
>(kEventParamCGContextRef
) ; 
 216                     HIViewGetBounds( controlRef
, &bounds 
); 
 217                     CGContextSetRGBFillColor( cgContext
, channel 
== 0 ? color 
: 0.5 , 
 218                         channel 
== 1 ? color 
: 0.5 , channel 
== 2 ? color 
: 0.5 , 1 ); 
 219                     CGContextFillRect( cgContext
, bounds 
); 
 232                     bool created 
= false ; 
 233                     CGContextRef cgContext 
= NULL 
; 
 234                     OSStatus err 
= cEvent
.GetParameter
<CGContextRef
>(kEventParamCGContextRef
, &cgContext
) ; 
 235                     wxASSERT_MSG( err 
== noErr 
, wxT("Unable to retrieve CGContextRef") ) ; 
 236                     thisWindow
->MacSetCGContextRef( cgContext 
) ; 
 239                         wxMacCGContextStateSaver 
sg( cgContext 
) ; 
 242                             wxWindow
* iter 
= thisWindow 
; 
 245                                 alpha 
*= (float) iter
->GetTransparent()/255.0 ; 
 246                                 if ( iter
->IsTopLevel() ) 
 249                                     iter 
= iter
->GetParent() ; 
 252                         CGContextSetAlpha( cgContext 
, alpha 
) ; 
 254                         if ( thisWindow
->GetBackgroundStyle() == wxBG_STYLE_TRANSPARENT 
) 
 257                             HIViewGetBounds( controlRef
, &bounds 
); 
 258                             CGContextClearRect( cgContext
, bounds 
); 
 263                         if ( thisWindow
->MacDoRedraw( updateRgn 
, cEvent
.GetTicks() ) ) 
 266                         thisWindow
->MacSetCGContextRef( NULL 
) ; 
 270                         CGContextRelease( cgContext 
) ; 
 274                     DisposeRgn( allocatedRgn 
) ; 
 278         case kEventControlVisibilityChanged 
: 
 279             // we might have two native controls attributed to the same wxWindow instance 
 280             // eg a scrollview and an embedded textview, make sure we only fire for the 'outer' 
 281             // control, as otherwise native and wx visibility are different 
 282             if ( thisWindow
->GetPeer() != NULL 
&& thisWindow
->GetPeer()->GetControlRef() == controlRef 
) 
 284                 thisWindow
->MacVisibilityChanged() ; 
 288         case kEventControlEnabledStateChanged 
: 
 289             thisWindow
->MacEnabledStateChanged(); 
 292         case kEventControlHiliteChanged 
: 
 293             thisWindow
->MacHiliteChanged() ; 
 296         case kEventControlActivate 
: 
 297         case kEventControlDeactivate 
: 
 298             // FIXME: we should have a virtual function for this! 
 300             if ( thisWindow
->IsKindOf( CLASSINFO( wxTreeCtrl 
) ) ) 
 301                 thisWindow
->Refresh(); 
 304             if ( thisWindow
->IsKindOf( CLASSINFO( wxListCtrl 
) ) ) 
 305                 thisWindow
->Refresh(); 
 311         // different handling on OS X 
 314         case kEventControlFocusPartChanged 
: 
 315             // the event is emulated by wxmac for systems lower than 10.5 
 317                 ControlPartCode previousControlPart 
= cEvent
.GetParameter
<ControlPartCode
>(kEventParamControlPreviousPart 
, typeControlPartCode 
); 
 318                 ControlPartCode currentControlPart 
= cEvent
.GetParameter
<ControlPartCode
>(kEventParamControlCurrentPart 
, typeControlPartCode 
); 
 320                 if ( thisWindow
->MacGetTopLevelWindow() && thisWindow
->GetPeer()->NeedsFocusRect() ) 
 322                     thisWindow
->MacInvalidateBorders(); 
 325                 if ( currentControlPart 
== 0 ) 
 329                     if ( thisWindow
->GetCaret() ) 
 330                         thisWindow
->GetCaret()->OnKillFocus(); 
 333                     wxLogTrace(_T("Focus"), _T("focus lost(%p)"), wx_static_cast(void*, thisWindow
)); 
 335                     // remove this as soon as posting the synthesized event works properly 
 336                     static bool inKillFocusEvent 
= false ; 
 338                     if ( !inKillFocusEvent 
) 
 340                         inKillFocusEvent 
= true ; 
 341                         wxFocusEvent 
event( wxEVT_KILL_FOCUS
, thisWindow
->GetId()); 
 342                         event
.SetEventObject(thisWindow
); 
 343                         thisWindow
->HandleWindowEvent(event
) ; 
 344                         inKillFocusEvent 
= false ; 
 347                 else if ( previousControlPart 
== 0 ) 
 350                     // panel wants to track the window which was the last to have focus in it 
 351                     wxLogTrace(_T("Focus"), _T("focus set(%p)"), wx_static_cast(void*, thisWindow
)); 
 352                     wxChildFocusEvent 
eventFocus((wxWindow
*)thisWindow
); 
 353                     thisWindow
->HandleWindowEvent(eventFocus
); 
 356                     if ( thisWindow
->GetCaret() ) 
 357                         thisWindow
->GetCaret()->OnSetFocus(); 
 360                     wxFocusEvent 
event(wxEVT_SET_FOCUS
, thisWindow
->GetId()); 
 361                     event
.SetEventObject(thisWindow
); 
 362                     thisWindow
->HandleWindowEvent(event
) ; 
 366         case kEventControlSetFocusPart 
: 
 369                 Boolean focusEverything 
= false ; 
 370                 if ( cEvent
.GetParameter
<Boolean
>(kEventParamControlFocusEverything 
, &focusEverything 
) == noErr 
) 
 372                     // put a breakpoint here to catch focus everything events 
 375                 ControlPartCode controlPart 
= cEvent
.GetParameter
<ControlPartCode
>(kEventParamControlPart 
, typeControlPartCode 
); 
 377                 ControlPartCode previousControlPart 
= 0; 
 378                 verify_noerr( HIViewGetFocusPart(controlRef
, &previousControlPart
)); 
 380                 if ( thisWindow
->MacIsUserPane() ) 
 382                     if ( controlPart 
!= kControlFocusNoPart 
) 
 383                         cEvent
.SetParameter
<ControlPartCode
>( kEventParamControlPart
, typeControlPartCode
, 1 ) ; 
 387                     result 
= CallNextEventHandler(handler
, event
); 
 389                 if ( UMAGetSystemVersion() < 0x1050 ) 
 391 // set back to 0 if problems arise 
 393                     ControlPartCode currentControlPart 
= cEvent
.GetParameter
<ControlPartCode
>(kEventParamControlPart 
, typeControlPartCode 
); 
 394                     // synthesize the event focus changed event 
 395                     EventRef evRef 
= NULL 
; 
 397                     OSStatus err 
= MacCreateEvent( 
 398                                          NULL 
, kEventClassControl 
, kEventControlFocusPartChanged 
, TicksToEventTime( TickCount() ) , 
 399                                          kEventAttributeUserEvent 
, &evRef 
); 
 402                     wxMacCarbonEvent 
iEvent( evRef 
) ; 
 403                     iEvent
.SetParameter
<ControlRef
>( kEventParamDirectObject 
, controlRef 
) ; 
 404                     iEvent
.SetParameter
<ControlPartCode
>( kEventParamControlPreviousPart
, typeControlPartCode
, previousControlPart 
) ; 
 405                     iEvent
.SetParameter
<ControlPartCode
>( kEventParamControlCurrentPart
, typeControlPartCode
, currentControlPart 
) ; 
 408                     // TODO test this first, avoid double posts etc... 
 409                     PostEventToQueue( GetMainEventQueue(), evRef 
, kEventPriorityHigh 
); 
 411                     wxMacWindowControlEventHandler( NULL 
, evRef 
, data 
) ; 
 413                     ReleaseEvent( evRef 
) ; 
 415                     // old implementation, to be removed if the new one works 
 416                     if ( controlPart 
== kControlFocusNoPart 
) 
 419                         if ( thisWindow
->GetCaret() ) 
 420                             thisWindow
->GetCaret()->OnKillFocus(); 
 423                         wxLogTrace(_T("Focus"), _T("focus lost(%p)"), wx_static_cast(void*, thisWindow
)); 
 425                         static bool inKillFocusEvent 
= false ; 
 427                         if ( !inKillFocusEvent 
) 
 429                             inKillFocusEvent 
= true ; 
 430                             wxFocusEvent 
event( wxEVT_KILL_FOCUS
, thisWindow
->GetId()); 
 431                             event
.SetEventObject(thisWindow
); 
 432                             thisWindow
->HandleWindowEvent(event
) ; 
 433                             inKillFocusEvent 
= false ; 
 438                         // panel wants to track the window which was the last to have focus in it 
 439                         wxLogTrace(_T("Focus"), _T("focus set(%p)"), wx_static_cast(void*, thisWindow
)); 
 440                         wxChildFocusEvent 
eventFocus((wxWindow
*)thisWindow
); 
 441                         thisWindow
->HandleWindowEvent(eventFocus
); 
 444                         if ( thisWindow
->GetCaret() ) 
 445                             thisWindow
->GetCaret()->OnSetFocus(); 
 448                         wxFocusEvent 
event(wxEVT_SET_FOCUS
, thisWindow
->GetId()); 
 449                         event
.SetEventObject(thisWindow
); 
 450                         thisWindow
->HandleWindowEvent(event
) ; 
 457         case kEventControlHit 
: 
 458             result 
= thisWindow
->MacControlHit( handler 
, event 
) ; 
 461         case kEventControlGetClickActivation 
: 
 463                 // fix to always have a proper activation for DataBrowser controls (stay in bkgnd otherwise) 
 464                 WindowRef owner 
= cEvent
.GetParameter
<WindowRef
>(kEventParamWindowRef
); 
 465                 if ( !IsWindowActive(owner
) ) 
 467                     cEvent
.SetParameter(kEventParamClickActivation
,(UInt32
) kActivateAndIgnoreClick
) ; 
 480 static pascal OSStatus
 
 481 wxMacWindowServiceEventHandler(EventHandlerCallRef 
WXUNUSED(handler
), 
 485     OSStatus result 
= eventNotHandledErr 
; 
 487     wxMacCarbonEvent 
cEvent( event 
) ; 
 489     ControlRef controlRef 
; 
 490     wxWindowMac
* thisWindow 
= (wxWindowMac
*) data 
; 
 491     wxTextCtrl
* textCtrl 
= wxDynamicCast( thisWindow 
, wxTextCtrl 
) ; 
 492     cEvent
.GetParameter( kEventParamDirectObject 
, &controlRef 
) ; 
 494     switch ( GetEventKind( event 
) ) 
 496         case kEventServiceGetTypes 
: 
 500                 textCtrl
->GetSelection( &from 
, &to 
) ; 
 502                 CFMutableArrayRef copyTypes 
= 0 , pasteTypes 
= 0; 
 504                     copyTypes 
= cEvent
.GetParameter
< CFMutableArrayRef 
>( kEventParamServiceCopyTypes 
, typeCFMutableArrayRef 
) ; 
 505                 if ( textCtrl
->IsEditable() ) 
 506                     pasteTypes 
= cEvent
.GetParameter
< CFMutableArrayRef 
>( kEventParamServicePasteTypes 
, typeCFMutableArrayRef 
) ; 
 508                 static const OSType textDataTypes
[] = { kTXNTextData 
/* , 'utxt', 'PICT', 'MooV', 'AIFF' */  }; 
 509                 for ( size_t i 
= 0 ; i 
< WXSIZEOF(textDataTypes
) ; ++i 
) 
 511                     CFStringRef typestring 
= CreateTypeStringWithOSType(textDataTypes
[i
]); 
 515                             CFArrayAppendValue(copyTypes
, typestring
) ; 
 517                             CFArrayAppendValue(pasteTypes
, typestring
) ; 
 519                         CFRelease( typestring 
) ; 
 527         case kEventServiceCopy 
: 
 532                 textCtrl
->GetSelection( &from 
, &to 
) ; 
 533                 wxString val 
= textCtrl
->GetValue() ; 
 534                 val 
= val
.Mid( from 
, to 
- from 
) ; 
 535                 PasteboardRef pasteboard 
= cEvent
.GetParameter
<PasteboardRef
>( kEventParamPasteboardRef
, typePasteboardRef 
); 
 536                 verify_noerr( PasteboardClear( pasteboard 
) ) ; 
 537                 PasteboardSynchronize( pasteboard 
); 
 538                 // TODO add proper conversion 
 539                 CFDataRef data 
= CFDataCreate( kCFAllocatorDefault
, (const UInt8
*)val
.c_str(), val
.length() ); 
 540                 PasteboardPutItemFlavor( pasteboard
, (PasteboardItemID
) 1, CFSTR("com.apple.traditional-mac-plain-text"), data
, 0); 
 546         case kEventServicePaste 
: 
 549                 PasteboardRef pasteboard 
= cEvent
.GetParameter
<PasteboardRef
>( kEventParamPasteboardRef
, typePasteboardRef 
); 
 550                 PasteboardSynchronize( pasteboard 
); 
 552                 verify_noerr( PasteboardGetItemCount( pasteboard
, &itemCount 
) ); 
 553                 for( UInt32 itemIndex 
= 1; itemIndex 
<= itemCount
; itemIndex
++ ) 
 555                     PasteboardItemID itemID
; 
 556                     if ( PasteboardGetItemIdentifier( pasteboard
, itemIndex
, &itemID 
) == noErr 
) 
 558                         CFDataRef flavorData 
= NULL
; 
 559                         if ( PasteboardCopyItemFlavorData( pasteboard
, itemID
, CFSTR("com.apple.traditional-mac-plain-text"), &flavorData 
) == noErr 
) 
 561                             CFIndex flavorDataSize 
= CFDataGetLength( flavorData 
); 
 562                             char *content 
= new char[flavorDataSize
+1] ; 
 563                             memcpy( content
, CFDataGetBytePtr( flavorData 
), flavorDataSize 
); 
 564                             content
[flavorDataSize
]=0; 
 565                             CFRelease( flavorData 
); 
 567                             textCtrl
->WriteText( wxString( content 
, wxConvLocal 
) ); 
 569                             textCtrl
->WriteText( wxString( content 
) ) ; 
 587 pascal OSStatus 
wxMacUnicodeTextEventHandler( EventHandlerCallRef handler 
, EventRef event 
, void *data 
) 
 589     OSStatus result 
= eventNotHandledErr 
; 
 590     wxWindowMac
* focus 
= (wxWindowMac
*) data 
; 
 592     wchar_t* uniChars 
= NULL 
; 
 593     UInt32 when 
= EventTimeToTicks( GetEventTime( event 
) ) ; 
 595     UniChar
* charBuf 
= NULL
; 
 596     ByteCount dataSize 
= 0 ; 
 599     if ( GetEventParameter( event
, kEventParamTextInputSendText
, typeUnicodeText
, NULL
, 0 , &dataSize
, NULL 
) == noErr 
) 
 601         numChars 
= dataSize 
/ sizeof( UniChar
) + 1; 
 604         if ( (size_t) numChars 
* 2 > sizeof(buf
) ) 
 605             charBuf 
= new UniChar
[ numChars 
] ; 
 609         uniChars 
= new wchar_t[ numChars 
] ; 
 610         GetEventParameter( event
, kEventParamTextInputSendText
, typeUnicodeText
, NULL
, dataSize 
, NULL 
, charBuf 
) ; 
 611         charBuf
[ numChars 
- 1 ] = 0; 
 612 #if SIZEOF_WCHAR_T == 2 
 613         uniChars 
= (wchar_t*) charBuf 
; 
 614 /*        memcpy( uniChars , charBuf , numChars * 2 ) ;*/   // is there any point in copying charBuf over itself? (in fact, memcpy isn't even guaranteed to work correctly if the source and destination ranges overlap...) 
 616         // the resulting string will never have more chars than the utf16 version, so this is safe 
 617         wxMBConvUTF16 converter 
; 
 618         numChars 
= converter
.MB2WC( uniChars 
, (const char*)charBuf 
, numChars 
) ; 
 622     switch ( GetEventKind( event 
) ) 
 624         case kEventTextInputUpdateActiveInputArea 
: 
 626                 // An IME input event may return several characters, but we need to send one char at a time to 
 628                 for (int pos
=0 ; pos 
< numChars 
; pos
++) 
 630                     WXEVENTREF formerEvent 
= wxTheApp
->MacGetCurrentEvent() ; 
 631                     WXEVENTHANDLERCALLREF formerHandler 
= wxTheApp
->MacGetCurrentEventHandlerCallRef() ; 
 632                     wxTheApp
->MacSetCurrentEvent( event 
, handler 
) ; 
 634                     UInt32 message 
= uniChars
[pos
] < 128 ? (char)uniChars
[pos
] : '?'; 
 636     NB: faking a charcode here is problematic. The kEventTextInputUpdateActiveInputArea event is sent 
 637     multiple times to update the active range during inline input, so this handler will often receive 
 638     uncommited text, which should usually not trigger side effects. It might be a good idea to check the 
 639     kEventParamTextInputSendFixLen parameter and verify if input is being confirmed (see CarbonEvents.h). 
 640     On the other hand, it can be useful for some applications to react to uncommitted text (for example, 
 641     to update a status display), as long as it does not disrupt the inline input session. Ideally, wx 
 642     should add new event types to support advanced text input. For now, I would keep things as they are. 
 644     However, the code that was being used caused additional problems: 
 645                     UInt32 message = (0  << 8) + ((char)uniChars[pos] ); 
 646     Since it simply truncated the unichar to the last byte, it ended up causing weird bugs with inline 
 647     input, such as switching to another field when one attempted to insert the character U+4E09 (the kanji 
 648     for "three"), because it was truncated to 09 (kTabCharCode), which was later "converted" to WXK_TAB 
 649     (still 09) in wxMacTranslateKey; or triggering the default button when one attempted to insert U+840D 
 650     (the kanji for "name"), which got truncated to 0D and interpreted as a carriage return keypress. 
 651     Note that even single-byte characters could have been misinterpreted, since MacRoman charcodes only 
 652     overlap with Unicode within the (7-bit) ASCII range. 
 653     But simply passing a NUL charcode would disable text updated events, because wxTextCtrl::OnChar checks 
 654     for codes within a specific range. Therefore I went for the solution seen above, which keeps ASCII 
 655     characters as they are and replaces the rest with '?', ensuring that update events are triggered. 
 656     It would be better to change wxTextCtrl::OnChar to look at the actual unicode character instead, but 
 657     I don't have time to look into that right now. 
 660                     if ( wxTheApp
->MacSendCharEvent( 
 661                                                     focus 
, message 
, 0 , when 
, 0 , 0 , uniChars
[pos
] ) ) 
 666                     wxTheApp
->MacSetCurrentEvent( formerEvent 
, formerHandler 
) ; 
 670         case kEventTextInputUnicodeForKeyEvent 
: 
 672                 UInt32 keyCode
, modifiers 
; 
 675                 unsigned char charCode 
; 
 677                 GetEventParameter( event
, kEventParamTextInputSendKeyboardEvent
, typeEventRef
, NULL
, sizeof(rawEvent
), NULL
, &rawEvent 
) ; 
 678                 GetEventParameter( rawEvent
, kEventParamKeyMacCharCodes
, typeChar
, NULL
, sizeof(char), NULL
, &charCode 
); 
 679                 GetEventParameter( rawEvent
, kEventParamKeyCode
, typeUInt32
, NULL
, sizeof(UInt32
), NULL
, &keyCode 
); 
 680                 GetEventParameter( rawEvent
, kEventParamKeyModifiers
, typeUInt32
, NULL
, sizeof(UInt32
), NULL
, &modifiers 
); 
 681                 GetEventParameter( rawEvent
, kEventParamMouseLocation
, typeQDPoint
, NULL
, sizeof(Point
), NULL
, &point 
); 
 683                 UInt32 message 
= (keyCode 
<< 8) + charCode
; 
 685                 // An IME input event may return several characters, but we need to send one char at a time to 
 687                 for (int pos
=0 ; pos 
< numChars 
; pos
++) 
 689                     WXEVENTREF formerEvent 
= wxTheApp
->MacGetCurrentEvent() ; 
 690                     WXEVENTHANDLERCALLREF formerHandler 
= wxTheApp
->MacGetCurrentEventHandlerCallRef() ; 
 691                     wxTheApp
->MacSetCurrentEvent( event 
, handler 
) ; 
 693                     if ( wxTheApp
->MacSendCharEvent( 
 694                         focus 
, message 
, modifiers 
, when 
, point
.h 
, point
.v 
, uniChars
[pos
] ) ) 
 699                     wxTheApp
->MacSetCurrentEvent( formerEvent 
, formerHandler 
) ; 
 708     if ( charBuf 
!= buf 
) 
 714 static pascal OSStatus
 
 715 wxMacWindowCommandEventHandler(EventHandlerCallRef 
WXUNUSED(handler
), 
 719     OSStatus result 
= eventNotHandledErr 
; 
 720     wxWindowMac
* focus 
= (wxWindowMac
*) data 
; 
 724     wxMacCarbonEvent 
cEvent( event 
) ; 
 725     cEvent
.GetParameter
<HICommand
>(kEventParamDirectObject
,typeHICommand
,&command
) ; 
 727     wxMenuItem
* item 
= NULL 
; 
 728     wxMenu
* itemMenu 
= wxFindMenuFromMacCommand( command 
, item 
) ; 
 729     int id 
= wxMacCommandToId( command
.commandID 
) ; 
 733         wxASSERT( itemMenu 
!= NULL 
) ; 
 735         switch ( cEvent
.GetKind() ) 
 737             case kEventProcessCommand 
: 
 738                 result 
= itemMenu
->MacHandleCommandProcess( item
, id
, focus 
); 
 741             case kEventCommandUpdateStatus
: 
 742                 result 
= itemMenu
->MacHandleCommandUpdateStatus( item
, id
, focus 
); 
 752 pascal OSStatus 
wxMacWindowEventHandler( EventHandlerCallRef handler 
, EventRef event 
, void *data 
) 
 754     EventRef formerEvent 
= (EventRef
) wxTheApp
->MacGetCurrentEvent() ; 
 755     EventHandlerCallRef formerEventHandlerCallRef 
= (EventHandlerCallRef
) wxTheApp
->MacGetCurrentEventHandlerCallRef() ; 
 756     wxTheApp
->MacSetCurrentEvent( event 
, handler 
) ; 
 757     OSStatus result 
= eventNotHandledErr 
; 
 759     switch ( GetEventClass( event 
) ) 
 761         case kEventClassCommand 
: 
 762             result 
= wxMacWindowCommandEventHandler( handler 
, event 
, data 
) ; 
 765         case kEventClassControl 
: 
 766             result 
= wxMacWindowControlEventHandler( handler
, event
, data 
) ; 
 769         case kEventClassService 
: 
 770             result 
= wxMacWindowServiceEventHandler( handler
, event 
, data 
) ; 
 773         case kEventClassTextInput 
: 
 774             result 
= wxMacUnicodeTextEventHandler( handler 
, event 
, data 
) ; 
 781     wxTheApp
->MacSetCurrentEvent( formerEvent
, formerEventHandlerCallRef 
) ; 
 786 DEFINE_ONE_SHOT_HANDLER_GETTER( wxMacWindowEventHandler 
) 
 788 // --------------------------------------------------------------------------- 
 789 // Scrollbar Tracking for all 
 790 // --------------------------------------------------------------------------- 
 792 pascal void wxMacLiveScrollbarActionProc( ControlRef control 
, ControlPartCode partCode 
) ; 
 793 pascal void wxMacLiveScrollbarActionProc( ControlRef control 
, ControlPartCode partCode 
) 
 797         wxWindow
*  wx 
= wxFindControlFromMacControl( control 
) ; 
 799             wx
->MacHandleControlClick( (WXWidget
) control 
, partCode 
, true /* stillDown */ ) ; 
 802 wxMAC_DEFINE_PROC_GETTER( ControlActionUPP 
, wxMacLiveScrollbarActionProc 
) ; 
 804 // =========================================================================== 
 806 // =========================================================================== 
 808 WX_DECLARE_HASH_MAP(ControlRef
, wxWindow
*, wxPointerHash
, wxPointerEqual
, MacControlMap
); 
 810 static MacControlMap wxWinMacControlList
; 
 812 wxWindow 
*wxFindControlFromMacControl(ControlRef inControl 
) 
 814     MacControlMap::iterator node 
= wxWinMacControlList
.find(inControl
); 
 816     return (node 
== wxWinMacControlList
.end()) ? NULL 
: node
->second
; 
 819 void wxAssociateControlWithMacControl(ControlRef inControl
, wxWindow 
*control
) 
 821     // adding NULL ControlRef is (first) surely a result of an error and 
 822     // (secondly) breaks native event processing 
 823     wxCHECK_RET( inControl 
!= (ControlRef
) NULL
, wxT("attempt to add a NULL WindowRef to window list") ); 
 825     wxWinMacControlList
[inControl
] = control
; 
 828 void wxRemoveMacControlAssociation(wxWindow 
*control
) 
 830    // iterate over all the elements in the class 
 831     // is the iterator stable ? as we might have two associations pointing to the same wxWindow 
 832     // we should go on... 
 838         MacControlMap::iterator it
; 
 839         for ( it 
= wxWinMacControlList
.begin(); it 
!= wxWinMacControlList
.end(); ++it 
) 
 841             if ( it
->second 
== control 
) 
 843                 wxWinMacControlList
.erase(it
); 
 851 // ---------------------------------------------------------------------------- 
 852  // constructors and such 
 853 // ---------------------------------------------------------------------------- 
 855 wxWindowMac::wxWindowMac() 
 860 wxWindowMac::wxWindowMac(wxWindowMac 
*parent
, 
 865             const wxString
& name 
) 
 868     Create(parent
, id
, pos
, size
, style
, name
); 
 871 void wxWindowMac::Init() 
 875     m_cgContextRef 
= NULL 
; 
 877     // as all windows are created with WS_VISIBLE style... 
 880     m_hScrollBar 
= NULL 
; 
 881     m_vScrollBar 
= NULL 
; 
 882     m_hScrollBarAlwaysShown 
= false; 
 883     m_vScrollBarAlwaysShown 
= false; 
 885     m_macIsUserPane 
= true; 
 886     m_clipChildren 
= false ; 
 887     m_cachedClippedRectValid 
= false ; 
 889     // we need a valid font for the encodings 
 890     wxWindowBase::SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT
)); 
 893 wxWindowMac::~wxWindowMac() 
 897     m_isBeingDeleted 
= true; 
 899     MacInvalidateBorders() ; 
 901 #ifndef __WXUNIVERSAL__ 
 902     // VS: make sure there's no wxFrame with last focus set to us: 
 903     for ( wxWindow 
*win 
= GetParent(); win
; win 
= win
->GetParent() ) 
 905         wxFrame 
*frame 
= wxDynamicCast(win
, wxFrame
); 
 908             if ( frame
->GetLastFocus() == this ) 
 909                 frame
->SetLastFocus((wxWindow
*)NULL
); 
 915     // destroy children before destroying this window itself 
 918     // wxRemoveMacControlAssociation( this ) ; 
 919     // If we delete an item, we should initialize the parent panel, 
 920     // because it could now be invalid. 
 921     wxTopLevelWindow 
*tlw 
= wxDynamicCast(wxGetTopLevelParent(this), wxTopLevelWindow
); 
 924         if ( tlw
->GetDefaultItem() == (wxButton
*) this) 
 925             tlw
->SetDefaultItem(NULL
); 
 928     if ( m_peer 
&& m_peer
->Ok() ) 
 930         // in case the callback might be called during destruction 
 931         wxRemoveMacControlAssociation( this) ; 
 932         ::RemoveEventHandler( (EventHandlerRef 
) m_macControlEventHandler 
) ; 
 933         // we currently are not using this hook 
 934         // ::SetControlColorProc( *m_peer , NULL ) ; 
 938     if ( g_MacLastWindow 
== this ) 
 939         g_MacLastWindow 
= NULL 
; 
 941 #ifndef __WXUNIVERSAL__ 
 942     wxFrame
* frame 
= wxDynamicCast( wxGetTopLevelParent( (wxWindow
*)this ) , wxFrame 
) ; 
 945         if ( frame
->GetLastFocus() == this ) 
 946             frame
->SetLastFocus( NULL 
) ; 
 950     // delete our drop target if we've got one 
 951 #if wxUSE_DRAG_AND_DROP 
 952     if ( m_dropTarget 
!= NULL 
) 
 962 WXWidget 
wxWindowMac::GetHandle() const 
 964     return (WXWidget
) m_peer
->GetControlRef() ; 
 967 void wxWindowMac::MacInstallEventHandler( WXWidget control 
) 
 969     wxAssociateControlWithMacControl( (ControlRef
) control 
, this ) ; 
 970     InstallControlEventHandler( (ControlRef
)control 
, GetwxMacWindowEventHandlerUPP(), 
 971         GetEventTypeCount(eventList
), eventList
, this, 
 972         (EventHandlerRef 
*)&m_macControlEventHandler
); 
 976 bool wxWindowMac::Create(wxWindowMac 
*parent
, 
 981     const wxString
& name
) 
 983     wxCHECK_MSG( parent
, false, wxT("can't create wxWindowMac without parent") ); 
 985     if ( !CreateBase(parent
, id
, pos
, size
, style
, wxDefaultValidator
, name
) ) 
 988     m_windowVariant 
= parent
->GetWindowVariant() ; 
 990     if ( m_macIsUserPane 
) 
 992         Rect bounds 
= wxMacGetBoundsForControl( this , pos 
, size 
) ; 
 995             | kControlSupportsEmbedding
 
 996             | kControlSupportsLiveFeedback
 
 997             | kControlGetsFocusOnClick
 
 998 //            | kControlHasSpecialBackground 
 999 //            | kControlSupportsCalcBestRect 
1000             | kControlHandlesTracking
 
1001             | kControlSupportsFocus
 
1002             | kControlWantsActivate
 
1003             | kControlWantsIdle 
; 
1005         m_peer 
= new wxMacControl(this) ; 
1006         OSStatus err 
=::CreateUserPaneControl( MAC_WXHWND(GetParent()->MacGetTopLevelWindowRef()) , &bounds
, features 
, m_peer
->GetControlRefAddr() ); 
1007         verify_noerr( err 
); 
1009         MacPostControlCreate(pos
, size
) ; 
1012 #ifndef __WXUNIVERSAL__ 
1013     // Don't give scrollbars to wxControls unless they ask for them 
1014     if ( (! IsKindOf(CLASSINFO(wxControl
)) && ! IsKindOf(CLASSINFO(wxStatusBar
))) 
1015          || (IsKindOf(CLASSINFO(wxControl
)) && ((style 
& wxHSCROLL
) || (style 
& wxVSCROLL
)))) 
1017         MacCreateScrollBars( style 
) ; 
1021     wxWindowCreateEvent 
event(this); 
1022     GetEventHandler()->AddPendingEvent(event
); 
1027 void wxWindowMac::MacChildAdded() 
1030         m_vScrollBar
->Raise() ; 
1032         m_hScrollBar
->Raise() ; 
1035 void wxWindowMac::MacPostControlCreate(const wxPoint
& WXUNUSED(pos
), const wxSize
& size
) 
1037     wxASSERT_MSG( m_peer 
!= NULL 
&& m_peer
->Ok() , wxT("No valid mac control") ) ; 
1039     m_peer
->SetReference( (URefCon
) this ) ; 
1040     GetParent()->AddChild( this ); 
1042     MacInstallEventHandler( (WXWidget
) m_peer
->GetControlRef() ); 
1044     ControlRef container 
= (ControlRef
) GetParent()->GetHandle() ; 
1045     wxASSERT_MSG( container 
!= NULL 
, wxT("No valid mac container control") ) ; 
1046     ::EmbedControl( m_peer
->GetControlRef() , container 
) ; 
1047     GetParent()->MacChildAdded() ; 
1049     // adjust font, controlsize etc 
1050     DoSetWindowVariant( m_windowVariant 
) ; 
1052     m_peer
->SetLabel( wxStripMenuCodes(m_label
, wxStrip_Mnemonics
) ) ; 
1054     if (!m_macIsUserPane
) 
1055         SetInitialSize(size
); 
1057     SetCursor( *wxSTANDARD_CURSOR 
) ; 
1060 void wxWindowMac::DoSetWindowVariant( wxWindowVariant variant 
) 
1062     // Don't assert, in case we set the window variant before 
1063     // the window is created 
1064     // wxASSERT( m_peer->Ok() ) ; 
1066     m_windowVariant 
= variant 
; 
1068     if (m_peer 
== NULL 
|| !m_peer
->Ok()) 
1072     ThemeFontID themeFont 
= kThemeSystemFont 
; 
1074     // we will get that from the settings later 
1075     // and make this NORMAL later, but first 
1076     // we have a few calculations that we must fix 
1080         case wxWINDOW_VARIANT_NORMAL 
: 
1081             size 
= kControlSizeNormal
; 
1082             themeFont 
= kThemeSystemFont 
; 
1085         case wxWINDOW_VARIANT_SMALL 
: 
1086             size 
= kControlSizeSmall
; 
1087             themeFont 
= kThemeSmallSystemFont 
; 
1090         case wxWINDOW_VARIANT_MINI 
: 
1091             // not always defined in the headers 
1096         case wxWINDOW_VARIANT_LARGE 
: 
1097             size 
= kControlSizeLarge
; 
1098             themeFont 
= kThemeSystemFont 
; 
1102             wxFAIL_MSG(_T("unexpected window variant")); 
1106     m_peer
->SetData
<ControlSize
>(kControlEntireControl
, kControlSizeTag
, &size 
) ; 
1109     font
.MacCreateFromThemeFont( themeFont 
) ; 
1113 void wxWindowMac::MacUpdateControlFont() 
1115     m_peer
->SetFont( GetFont() , GetForegroundColour() , GetWindowStyle() ) ; 
1116     // do not trigger refreshes upon invisible and possible partly created objects 
1117     if ( IsShownOnScreen() ) 
1121 bool wxWindowMac::SetFont(const wxFont
& font
) 
1123     bool retval 
= wxWindowBase::SetFont( font 
); 
1125     MacUpdateControlFont() ; 
1130 bool wxWindowMac::SetForegroundColour(const wxColour
& col 
) 
1132     bool retval 
= wxWindowBase::SetForegroundColour( col 
); 
1135         MacUpdateControlFont(); 
1140 bool wxWindowMac::SetBackgroundColour(const wxColour
& col 
) 
1142     if ( !wxWindowBase::SetBackgroundColour(col
) && m_hasBgCol 
) 
1145     m_peer
->SetBackgroundColour( col 
) ; 
1150 bool wxWindowMac::MacCanFocus() const 
1152     // TODO : evaluate performance hits by looking up this value, eventually cache the results for a 1 sec or so 
1153     // CAUTION : the value returned currently is 0 or 2, I've also found values of 1 having the same meaning, 
1154     // but the value range is nowhere documented 
1155     Boolean keyExistsAndHasValidFormat 
; 
1156     CFIndex fullKeyboardAccess 
= CFPreferencesGetAppIntegerValue( CFSTR("AppleKeyboardUIMode" ) , 
1157         kCFPreferencesCurrentApplication
, &keyExistsAndHasValidFormat 
); 
1159     if ( keyExistsAndHasValidFormat 
&& fullKeyboardAccess 
> 0 ) 
1165         UInt32 features 
= 0 ; 
1166         m_peer
->GetFeatures( &features 
) ; 
1168         return features 
& ( kControlSupportsFocus 
| kControlGetsFocusOnClick 
) ; 
1172 void wxWindowMac::SetFocus() 
1174     if ( !AcceptsFocus() ) 
1177     wxWindow
* former 
= FindFocus() ; 
1178     if ( former 
== this ) 
1181     // as we cannot rely on the control features to find out whether we are in full keyboard mode, 
1182     // we can only leave in case of an error 
1183     OSStatus err 
= m_peer
->SetFocus( kControlFocusNextPart 
) ; 
1184     if ( err 
== errCouldntSetFocus 
) 
1187     SetUserFocusWindow( (WindowRef
)MacGetTopLevelWindowRef() ); 
1190 void wxWindowMac::DoCaptureMouse() 
1192     wxApp::s_captureWindow 
= this ; 
1195 wxWindow 
* wxWindowBase::GetCapture() 
1197     return wxApp::s_captureWindow 
; 
1200 void wxWindowMac::DoReleaseMouse() 
1202     wxApp::s_captureWindow 
= NULL 
; 
1205 #if wxUSE_DRAG_AND_DROP 
1207 void wxWindowMac::SetDropTarget(wxDropTarget 
*pDropTarget
) 
1209     if ( m_dropTarget 
!= NULL 
) 
1210         delete m_dropTarget
; 
1212     m_dropTarget 
= pDropTarget
; 
1213     if ( m_dropTarget 
!= NULL 
) 
1221 // Old-style File Manager Drag & Drop 
1222 void wxWindowMac::DragAcceptFiles(bool WXUNUSED(accept
)) 
1227 // Returns the size of the native control. In the case of the toplevel window 
1228 // this is the content area root control 
1230 void wxWindowMac::MacGetPositionAndSizeFromControl(int& WXUNUSED(x
), 
1233                                                    int& WXUNUSED(h
)) const 
1235     wxFAIL_MSG( wxT("Not currently supported") ) ; 
1238 // From a wx position / size calculate the appropriate size of the native control 
1240 bool wxWindowMac::MacGetBoundsForControl( 
1244     int& w
, int& h 
, bool adjustOrigin 
) const 
1246     // the desired size, minus the border pixels gives the correct size of the control 
1250     // TODO: the default calls may be used as soon as PostCreateControl Is moved here 
1251     w 
= wxMax(size
.x
, 0) ; // WidthDefault( size.x ); 
1252     h 
= wxMax(size
.y
, 0) ; // HeightDefault( size.y ) ; 
1254     x 
+= MacGetLeftBorderSize() ; 
1255     y 
+= MacGetTopBorderSize() ; 
1256     w 
-= MacGetLeftBorderSize() + MacGetRightBorderSize() ; 
1257     h 
-= MacGetTopBorderSize() + MacGetBottomBorderSize() ; 
1260         AdjustForParentClientOrigin( x 
, y 
) ; 
1262     // this is in window relative coordinate, as this parent may have a border, its physical position is offset by this border 
1263     if ( !GetParent()->IsTopLevel() ) 
1265         x 
-= GetParent()->MacGetLeftBorderSize() ; 
1266         y 
-= GetParent()->MacGetTopBorderSize() ; 
1272 // Get window size (not client size) 
1273 void wxWindowMac::DoGetSize(int *x
, int *y
) const 
1276     m_peer
->GetRect( &bounds 
) ; 
1279        *x 
= bounds
.right 
- bounds
.left 
+ MacGetLeftBorderSize() + MacGetRightBorderSize() ; 
1281        *y 
= bounds
.bottom 
- bounds
.top 
+ MacGetTopBorderSize() + MacGetBottomBorderSize() ; 
1284 // get the position of the bounds of this window in client coordinates of its parent 
1285 void wxWindowMac::DoGetPosition(int *x
, int *y
) const 
1288     m_peer
->GetRect( &bounds 
) ; 
1290     int x1 
= bounds
.left 
; 
1291     int y1 
= bounds
.top 
; 
1293     // get the wx window position from the native one 
1294     x1 
-= MacGetLeftBorderSize() ; 
1295     y1 
-= MacGetTopBorderSize() ; 
1297     if ( !IsTopLevel() ) 
1299         wxWindow 
*parent 
= GetParent(); 
1302             // we must first adjust it to be in window coordinates of the parent, 
1303             // as otherwise it gets lost by the ClientAreaOrigin fix 
1304             x1 
+= parent
->MacGetLeftBorderSize() ; 
1305             y1 
+= parent
->MacGetTopBorderSize() ; 
1307             // and now to client coordinates 
1308             wxPoint 
pt(parent
->GetClientAreaOrigin()); 
1320 void wxWindowMac::DoScreenToClient(int *x
, int *y
) const 
1322     WindowRef window 
= (WindowRef
) MacGetTopLevelWindowRef() ; 
1323     wxCHECK_RET( window 
, wxT("TopLevel Window missing") ) ; 
1325     Point localwhere 
= { 0, 0 } ; 
1332     wxMacGlobalToLocal( window 
, &localwhere 
) ; 
1339     MacRootWindowToWindow( x 
, y 
) ; 
1341     wxPoint origin 
= GetClientAreaOrigin() ; 
1348 void wxWindowMac::DoClientToScreen(int *x
, int *y
) const 
1350     WindowRef window 
= (WindowRef
) MacGetTopLevelWindowRef() ; 
1351     wxCHECK_RET( window 
, wxT("TopLevel window missing") ) ; 
1353     wxPoint origin 
= GetClientAreaOrigin() ; 
1359     MacWindowToRootWindow( x 
, y 
) ; 
1361     Point localwhere 
= { 0, 0 }; 
1367     wxMacLocalToGlobal( window
, &localwhere 
) ; 
1375 void wxWindowMac::MacClientToRootWindow( int *x 
, int *y 
) const 
1377     wxPoint origin 
= GetClientAreaOrigin() ; 
1383     MacWindowToRootWindow( x 
, y 
) ; 
1386 void wxWindowMac::MacRootWindowToClient( int *x 
, int *y 
) const 
1388     MacRootWindowToWindow( x 
, y 
) ; 
1390     wxPoint origin 
= GetClientAreaOrigin() ; 
1397 void wxWindowMac::MacWindowToRootWindow( int *x 
, int *y 
) const 
1406     if ( !IsTopLevel() ) 
1408         wxTopLevelWindowMac
* top 
= MacGetTopLevelWindow(); 
1411             pt
.x 
-= MacGetLeftBorderSize() ; 
1412             pt
.y 
-= MacGetTopBorderSize() ; 
1413             wxMacControl::Convert( &pt 
, m_peer 
, top
->m_peer 
) ; 
1423 void wxWindowMac::MacWindowToRootWindow( short *x 
, short *y 
) const 
1432     MacWindowToRootWindow( &x1 
, &y1 
) ; 
1440 void wxWindowMac::MacRootWindowToWindow( int *x 
, int *y 
) const 
1449     if ( !IsTopLevel() ) 
1451         wxTopLevelWindowMac
* top 
= MacGetTopLevelWindow(); 
1454             wxMacControl::Convert( &pt 
, top
->m_peer 
, m_peer 
) ; 
1455             pt
.x 
+= MacGetLeftBorderSize() ; 
1456             pt
.y 
+= MacGetTopBorderSize() ; 
1466 void wxWindowMac::MacRootWindowToWindow( short *x 
, short *y 
) const 
1475     MacRootWindowToWindow( &x1 
, &y1 
) ; 
1483 void wxWindowMac::MacGetContentAreaInset( int &left 
, int &top 
, int &right 
, int &bottom 
) 
1485     RgnHandle rgn 
= NewRgn() ; 
1487     if ( m_peer
->GetRegion( kControlContentMetaPart 
, rgn 
) == noErr 
) 
1489         Rect structure
, content 
; 
1491         GetRegionBounds( rgn 
, &content 
) ; 
1492         m_peer
->GetRect( &structure 
) ; 
1493         OffsetRect( &structure
, -structure
.left 
, -structure
.top 
) ; 
1495         left 
= content
.left 
- structure
.left 
; 
1496         top 
= content
.top 
- structure
.top 
; 
1497         right 
= structure
.right 
- content
.right 
; 
1498         bottom 
= structure
.bottom 
- content
.bottom 
; 
1502         left 
= top 
= right 
= bottom 
= 0 ; 
1508 wxSize 
wxWindowMac::DoGetSizeFromClientSize( const wxSize 
& size 
)  const 
1510     wxSize sizeTotal 
= size
; 
1512     RgnHandle rgn 
= NewRgn() ; 
1513     if ( m_peer
->GetRegion( kControlContentMetaPart 
, rgn 
) == noErr 
) 
1515         Rect content
, structure 
; 
1516         GetRegionBounds( rgn 
, &content 
) ; 
1517         m_peer
->GetRect( &structure 
) ; 
1519         // structure is in parent coordinates, but we only need width and height, so it's ok 
1521         sizeTotal
.x 
+= (structure
.right 
- structure
.left
) - (content
.right 
- content
.left
) ; 
1522         sizeTotal
.y 
+= (structure
.bottom 
- structure
.top
) - (content
.bottom 
- content
.top
) ; 
1527     sizeTotal
.x 
+= MacGetLeftBorderSize() + MacGetRightBorderSize() ; 
1528     sizeTotal
.y 
+= MacGetTopBorderSize() + MacGetBottomBorderSize() ; 
1533 // Get size *available for subwindows* i.e. excluding menu bar etc. 
1534 void wxWindowMac::DoGetClientSize( int *x
, int *y 
) const 
1538     RgnHandle rgn 
= NewRgn() ; 
1540     if ( m_peer
->GetRegion( kControlContentMetaPart 
, rgn 
) == noErr 
) 
1541         GetRegionBounds( rgn 
, &content 
) ; 
1543         m_peer
->GetRect( &content 
) ; 
1546     ww 
= content
.right 
- content
.left 
; 
1547     hh 
= content
.bottom 
- content
.top 
; 
1549     if (m_hScrollBar  
&& m_hScrollBar
->IsShown() ) 
1550         hh 
-= m_hScrollBar
->GetSize().y 
; 
1552     if (m_vScrollBar  
&& m_vScrollBar
->IsShown() ) 
1553         ww 
-= m_vScrollBar
->GetSize().x 
; 
1561 bool wxWindowMac::SetCursor(const wxCursor
& cursor
) 
1563     if (m_cursor
.IsSameAs(cursor
)) 
1568         if ( ! wxWindowBase::SetCursor( *wxSTANDARD_CURSOR 
) ) 
1573         if ( ! wxWindowBase::SetCursor( cursor 
) ) 
1577     wxASSERT_MSG( m_cursor
.Ok(), 
1578         wxT("cursor must be valid after call to the base version")); 
1580     wxWindowMac 
*mouseWin 
= 0 ; 
1582         wxTopLevelWindowMac 
*tlw 
= MacGetTopLevelWindow() ; 
1583         WindowRef window 
= (WindowRef
) ( tlw 
? tlw
->MacGetWindowRef() : 0 ) ; 
1585         ControlPartCode part 
; 
1586         ControlRef control 
; 
1588  #if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 
1590         HIGetMousePosition(kHICoordSpaceWindow
, window
, &hiPoint
); 
1594         GetGlobalMouse( &pt 
); 
1597         ScreenToClient(&x
, &y
); 
1601         control 
= FindControlUnderMouse( pt 
, window 
, &part 
) ; 
1603             mouseWin 
= wxFindControlFromMacControl( control 
) ; 
1607     if ( mouseWin 
== this && !wxIsBusy() ) 
1608         m_cursor
.MacInstall() ; 
1614 bool wxWindowMac::DoPopupMenu(wxMenu 
*menu
, int x
, int y
) 
1616 #ifndef __WXUNIVERSAL__ 
1617     menu
->SetInvokingWindow((wxWindow
*)this); 
1620     if ( x 
== wxDefaultCoord 
&& y 
== wxDefaultCoord 
) 
1622         wxPoint mouse 
= wxGetMousePosition(); 
1628         ClientToScreen( &x 
, &y 
) ; 
1631     menu
->MacBeforeDisplay( true ) ; 
1632     long menuResult 
= ::PopUpMenuSelect((MenuHandle
) menu
->GetHMenu() , y
, x
, 0) ; 
1633     if ( HiWord(menuResult
) != 0 ) 
1636         GetMenuItemCommandID( GetMenuHandle(HiWord(menuResult
)) , LoWord(menuResult
) , &macid 
); 
1637         int id 
= wxMacCommandToId( macid 
); 
1638         wxMenuItem
* item 
= NULL 
; 
1640         item 
= menu
->FindItem( id
, &realmenu 
) ; 
1643             if (item
->IsCheckable()) 
1644                 item
->Check( !item
->IsChecked() ) ; 
1646             menu
->SendEvent( id 
, item
->IsCheckable() ? item
->IsChecked() : -1 ) ; 
1650     menu
->MacAfterDisplay( true ) ; 
1651     menu
->SetInvokingWindow( NULL 
); 
1655     // actually this shouldn't be called, because universal is having its own implementation 
1661 // ---------------------------------------------------------------------------- 
1663 // ---------------------------------------------------------------------------- 
1667 void wxWindowMac::DoSetToolTip(wxToolTip 
*tooltip
) 
1669     wxWindowBase::DoSetToolTip(tooltip
); 
1672         m_tooltip
->SetWindow(this); 
1677 void wxWindowMac::MacInvalidateBorders() 
1679     if ( m_peer 
== NULL 
) 
1682     bool vis 
= IsShownOnScreen() ; 
1686     int outerBorder 
= MacGetLeftBorderSize() ; 
1687     if ( m_peer
->NeedsFocusRect() /* && m_peer->HasFocus() */ ) 
1690     if ( outerBorder 
== 0 ) 
1693     // now we know that we have something to do at all 
1695     // as the borders are drawn on the parent we have to properly invalidate all these areas 
1696     RgnHandle updateInner 
, updateOuter
; 
1699     // this rectangle is in HIViewCoordinates under OSX and in Window Coordinates under Carbon 
1700     updateInner 
= NewRgn() ; 
1701     updateOuter 
= NewRgn() ; 
1703     m_peer
->GetRect( &rect 
) ; 
1704     RectRgn( updateInner
, &rect 
) ; 
1705     InsetRect( &rect 
, -outerBorder 
, -outerBorder 
) ; 
1706     RectRgn( updateOuter
, &rect 
) ; 
1707     DiffRgn( updateOuter
, updateInner 
, updateOuter 
) ; 
1709     GetParent()->m_peer
->SetNeedsDisplay( updateOuter 
) ; 
1711     DisposeRgn( updateOuter 
) ; 
1712     DisposeRgn( updateInner 
) ; 
1715 void wxWindowMac::DoMoveWindow(int x
, int y
, int width
, int height
) 
1717     // this is never called for a toplevel window, so we know we have a parent 
1718     int former_x 
, former_y 
, former_w
, former_h 
; 
1720     // Get true coordinates of former position 
1721     DoGetPosition( &former_x 
, &former_y 
) ; 
1722     DoGetSize( &former_w 
, &former_h 
) ; 
1724     wxWindow 
*parent 
= GetParent(); 
1727         wxPoint 
pt(parent
->GetClientAreaOrigin()); 
1732     int actualWidth 
= width 
; 
1733     int actualHeight 
= height 
; 
1737     if ((m_minWidth 
!= -1) && (actualWidth 
< m_minWidth
)) 
1738         actualWidth 
= m_minWidth
; 
1739     if ((m_minHeight 
!= -1) && (actualHeight 
< m_minHeight
)) 
1740         actualHeight 
= m_minHeight
; 
1741     if ((m_maxWidth 
!= -1) && (actualWidth 
> m_maxWidth
)) 
1742         actualWidth 
= m_maxWidth
; 
1743     if ((m_maxHeight 
!= -1) && (actualHeight 
> m_maxHeight
)) 
1744         actualHeight 
= m_maxHeight
; 
1746     bool doMove 
= false, doResize 
= false ; 
1748     if ( actualX 
!= former_x 
|| actualY 
!= former_y 
) 
1751     if ( actualWidth 
!= former_w 
|| actualHeight 
!= former_h 
) 
1754     if ( doMove 
|| doResize 
) 
1756         // as the borders are drawn outside the native control, we adjust now 
1758         wxRect 
bounds( wxPoint( actualX 
+ MacGetLeftBorderSize() ,actualY 
+ MacGetTopBorderSize() ), 
1759             wxSize( actualWidth 
- (MacGetLeftBorderSize() + MacGetRightBorderSize()) , 
1760                 actualHeight 
- (MacGetTopBorderSize() + MacGetBottomBorderSize()) ) ) ; 
1763         wxMacRectToNative( &bounds 
, &r 
) ; 
1765         if ( !GetParent()->IsTopLevel() ) 
1766             wxMacWindowToNative( GetParent() , &r 
) ; 
1768         MacInvalidateBorders() ; 
1770         m_cachedClippedRectValid 
= false ; 
1771         m_peer
->SetRect( &r 
) ; 
1773         wxWindowMac::MacSuperChangedPosition() ; // like this only children will be notified 
1775         MacInvalidateBorders() ; 
1777         MacRepositionScrollBars() ; 
1780             wxPoint 
point(actualX
, actualY
); 
1781             wxMoveEvent 
event(point
, m_windowId
); 
1782             event
.SetEventObject(this); 
1783             HandleWindowEvent(event
) ; 
1788             MacRepositionScrollBars() ; 
1789             wxSize 
size(actualWidth
, actualHeight
); 
1790             wxSizeEvent 
event(size
, m_windowId
); 
1791             event
.SetEventObject(this); 
1792             HandleWindowEvent(event
); 
1797 wxSize 
wxWindowMac::DoGetBestSize() const 
1799     if ( m_macIsUserPane 
|| IsTopLevel() ) 
1800         return wxWindowBase::DoGetBestSize() ; 
1802     Rect    bestsize 
= { 0 , 0 , 0 , 0 } ; 
1803     int bestWidth
, bestHeight 
; 
1805     m_peer
->GetBestRect( &bestsize 
) ; 
1806     if ( EmptyRect( &bestsize 
) ) 
1811         bestsize
.bottom 
= 16 ; 
1813         if ( IsKindOf( CLASSINFO( wxScrollBar 
) ) ) 
1815             bestsize
.bottom 
= 16 ; 
1818         else if ( IsKindOf( CLASSINFO( wxSpinButton 
) ) ) 
1820             bestsize
.bottom 
= 24 ; 
1825             // return wxWindowBase::DoGetBestSize() ; 
1829     bestWidth 
= bestsize
.right 
- bestsize
.left 
; 
1830     bestHeight 
= bestsize
.bottom 
- bestsize
.top 
; 
1831     if ( bestHeight 
< 10 ) 
1834     return wxSize(bestWidth
, bestHeight
); 
1837 // set the size of the window: if the dimensions are positive, just use them, 
1838 // but if any of them is equal to -1, it means that we must find the value for 
1839 // it ourselves (unless sizeFlags contains wxSIZE_ALLOW_MINUS_ONE flag, in 
1840 // which case -1 is a valid value for x and y) 
1842 // If sizeFlags contains wxSIZE_AUTO_WIDTH/HEIGHT flags (default), we calculate 
1843 // the width/height to best suit our contents, otherwise we reuse the current 
1845 void wxWindowMac::DoSetSize(int x
, int y
, int width
, int height
, int sizeFlags
) 
1847     // get the current size and position... 
1848     int currentX
, currentY
; 
1849     int currentW
, currentH
; 
1851     GetPosition(¤tX
, ¤tY
); 
1852     GetSize(¤tW
, ¤tH
); 
1854     // ... and don't do anything (avoiding flicker) if it's already ok 
1855     if ( x 
== currentX 
&& y 
== currentY 
&& 
1856         width 
== currentW 
&& height 
== currentH 
&& ( height 
!= -1 && width 
!= -1 ) ) 
1859         MacRepositionScrollBars() ; // we might have a real position shift 
1864     if ( !(sizeFlags 
& wxSIZE_ALLOW_MINUS_ONE
) ) 
1866         if ( x 
== wxDefaultCoord 
) 
1868         if ( y 
== wxDefaultCoord 
) 
1872     AdjustForParentClientOrigin( x
, y
, sizeFlags 
); 
1874     wxSize size 
= wxDefaultSize
; 
1875     if ( width 
== wxDefaultCoord 
) 
1877         if ( sizeFlags 
& wxSIZE_AUTO_WIDTH 
) 
1879             size 
= DoGetBestSize(); 
1884             // just take the current one 
1889     if ( height 
== wxDefaultCoord 
) 
1891         if ( sizeFlags 
& wxSIZE_AUTO_HEIGHT 
) 
1893             if ( size
.x 
== wxDefaultCoord 
) 
1894                 size 
= DoGetBestSize(); 
1895             // else: already called DoGetBestSize() above 
1901             // just take the current one 
1906     DoMoveWindow( x
, y
, width
, height 
); 
1909 wxPoint 
wxWindowMac::GetClientAreaOrigin() const 
1911     RgnHandle rgn 
= NewRgn() ; 
1913     if ( m_peer
->GetRegion( kControlContentMetaPart 
, rgn 
) == noErr 
) 
1915         GetRegionBounds( rgn 
, &content 
) ; 
1925     return wxPoint( content
.left 
+ MacGetLeftBorderSize() , content
.top 
+ MacGetTopBorderSize() ); 
1928 void wxWindowMac::DoSetClientSize(int clientwidth
, int clientheight
) 
1930     if ( clientwidth 
!= wxDefaultCoord 
|| clientheight 
!= wxDefaultCoord 
) 
1932         int currentclientwidth 
, currentclientheight 
; 
1933         int currentwidth 
, currentheight 
; 
1935         GetClientSize( ¤tclientwidth 
, ¤tclientheight 
) ; 
1936         GetSize( ¤twidth 
, ¤theight 
) ; 
1938         DoSetSize( wxDefaultCoord 
, wxDefaultCoord 
, currentwidth 
+ clientwidth 
- currentclientwidth 
, 
1939             currentheight 
+ clientheight 
- currentclientheight 
, wxSIZE_USE_EXISTING 
) ; 
1943 void wxWindowMac::SetLabel(const wxString
& title
) 
1947     if ( m_peer 
&& m_peer
->Ok() ) 
1948         m_peer
->SetLabel( wxStripMenuCodes(m_label
, wxStrip_Mnemonics
) ) ; 
1950     // do not trigger refreshes upon invisible and possible partly created objects 
1951     if ( IsShownOnScreen() ) 
1955 wxString 
wxWindowMac::GetLabel() const 
1960 bool wxWindowMac::Show(bool show
) 
1962     if ( !wxWindowBase::Show(show
) ) 
1966         m_peer
->SetVisibility( show 
, true ) ; 
1971 void wxWindowMac::DoEnable(bool enable
) 
1973     m_peer
->Enable( enable 
) ; 
1977 // status change notifications 
1980 void wxWindowMac::MacVisibilityChanged() 
1984 void wxWindowMac::MacHiliteChanged() 
1988 void wxWindowMac::MacEnabledStateChanged() 
1990     OnEnabled( m_peer
->IsEnabled() ); 
1994 // status queries on the inherited window's state 
1997 bool wxWindowMac::MacIsReallyEnabled() 
1999     return m_peer
->IsEnabled() ; 
2002 bool wxWindowMac::MacIsReallyHilited() 
2004     return m_peer
->IsActive(); 
2007 void wxWindowMac::MacFlashInvalidAreas() 
2009 #if TARGET_API_MAC_OSX 
2010     HIViewFlashDirtyArea( (WindowRef
) MacGetTopLevelWindowRef() ) ; 
2014 int wxWindowMac::GetCharHeight() const 
2016     wxClientDC 
dc( (wxWindowMac
*)this ) ; 
2018     return dc
.GetCharHeight() ; 
2021 int wxWindowMac::GetCharWidth() const 
2023     wxClientDC 
dc( (wxWindowMac
*)this ) ; 
2025     return dc
.GetCharWidth() ; 
2028 void wxWindowMac::GetTextExtent(const wxString
& string
, int *x
, int *y
, 
2029                            int *descent
, int *externalLeading
, const wxFont 
*theFont 
) const 
2031     const wxFont 
*fontToUse 
= theFont
; 
2033         fontToUse 
= &m_font
; 
2035     wxClientDC 
dc( (wxWindowMac
*) this ) ; 
2036     wxCoord lx
,ly
,ld
,le 
; 
2037     dc
.GetTextExtent( string 
, &lx 
, &ly 
, &ld
, &le
, (wxFont 
*)fontToUse 
) ; 
2038     if ( externalLeading 
) 
2039         *externalLeading 
= le 
; 
2049  * Rect is given in client coordinates, for further reading, read wxTopLevelWindowMac::InvalidateRect 
2050  * we always intersect with the entire window, not only with the client area 
2053 void wxWindowMac::Refresh(bool WXUNUSED(eraseBack
), const wxRect 
*rect
) 
2055     if ( m_peer 
== NULL 
) 
2058     if ( !IsShownOnScreen() ) 
2065         wxMacRectToNative( rect 
, &r 
) ; 
2066         m_peer
->SetNeedsDisplay( &r 
) ; 
2070         m_peer
->SetNeedsDisplay() ; 
2074 void wxWindowMac::DoFreeze() 
2076 #if TARGET_API_MAC_OSX 
2077     if ( m_peer 
&& m_peer
->Ok() ) 
2078         m_peer
->SetDrawingEnabled( false ) ; 
2082 void wxWindowMac::DoThaw() 
2084 #if TARGET_API_MAC_OSX 
2085     if ( m_peer 
&& m_peer
->Ok() ) 
2087         m_peer
->SetDrawingEnabled( true ) ; 
2088         m_peer
->InvalidateWithChildren() ; 
2093 wxWindowMac 
*wxGetActiveWindow() 
2095     // actually this is a windows-only concept 
2099 // Coordinates relative to the window 
2100 void wxWindowMac::WarpPointer(int WXUNUSED(x_pos
), int WXUNUSED(y_pos
)) 
2102     // We really don't move the mouse programmatically under Mac. 
2105 void wxWindowMac::OnEraseBackground(wxEraseEvent
& event
) 
2107     if ( MacGetTopLevelWindow() == NULL 
) 
2110 #if TARGET_API_MAC_OSX 
2111     if ( !m_backgroundColour.Ok() || GetBackgroundStyle() == wxBG_STYLE_TRANSPARENT ) 
2117     if ( GetBackgroundStyle() == wxBG_STYLE_COLOUR 
) 
2119         event
.GetDC()->Clear() ; 
2127 void wxWindowMac::OnNcPaint( wxNcPaintEvent
& event 
) 
2132 int wxWindowMac::GetScrollPos(int orient
) const 
2134     if ( orient 
== wxHORIZONTAL 
) 
2137            return m_hScrollBar
->GetThumbPosition() ; 
2142            return m_vScrollBar
->GetThumbPosition() ; 
2148 // This now returns the whole range, not just the number 
2149 // of positions that we can scroll. 
2150 int wxWindowMac::GetScrollRange(int orient
) const 
2152     if ( orient 
== wxHORIZONTAL 
) 
2155            return m_hScrollBar
->GetRange() ; 
2160            return m_vScrollBar
->GetRange() ; 
2166 int wxWindowMac::GetScrollThumb(int orient
) const 
2168     if ( orient 
== wxHORIZONTAL 
) 
2171            return m_hScrollBar
->GetThumbSize() ; 
2176            return m_vScrollBar
->GetThumbSize() ; 
2182 void wxWindowMac::SetScrollPos(int orient
, int pos
, bool WXUNUSED(refresh
)) 
2184     if ( orient 
== wxHORIZONTAL 
) 
2187            m_hScrollBar
->SetThumbPosition( pos 
) ; 
2192            m_vScrollBar
->SetThumbPosition( pos 
) ; 
2197 wxWindowMac::AlwaysShowScrollbars(bool hflag
, bool vflag
) 
2199     bool needVisibilityUpdate 
= false; 
2201     if ( m_hScrollBarAlwaysShown 
!= hflag 
) 
2203         m_hScrollBarAlwaysShown 
= hflag
; 
2204         needVisibilityUpdate 
= true; 
2207     if ( m_vScrollBarAlwaysShown 
!= vflag 
) 
2209         m_vScrollBarAlwaysShown 
= vflag
; 
2210         needVisibilityUpdate 
= true; 
2213     if ( needVisibilityUpdate 
) 
2214         DoUpdateScrollbarVisibility(); 
2218 // we draw borders and grow boxes, are already set up and clipped in the current port / cgContextRef 
2219 // our own window origin is at leftOrigin/rightOrigin 
2222 void  wxWindowMac::MacPaintGrowBox() 
2227     if ( MacHasScrollBarCorner() ) 
2231         CGContextRef cgContext 
= (CGContextRef
) MacGetCGContextRef() ; 
2232         wxASSERT( cgContext 
) ; 
2234         m_peer
->GetRect( &rect 
) ; 
2236         int size 
= m_hScrollBar 
? m_hScrollBar
->GetSize().y 
: ( m_vScrollBar 
? m_vScrollBar
->GetSize().x 
: MAC_SCROLLBAR_SIZE 
) ; 
2237         CGRect cgrect 
= CGRectMake( rect
.right 
- size 
, rect
.bottom 
- size 
, size 
, size 
) ; 
2238         CGPoint cgpoint 
= CGPointMake( rect
.right 
- size 
, rect
.bottom 
- size 
) ; 
2239         CGContextSaveGState( cgContext 
); 
2241         if ( m_backgroundColour
.Ok() ) 
2243             CGContextSetFillColorWithColor( cgContext
, m_backgroundColour
.GetCGColor() ); 
2247             CGContextSetRGBFillColor( cgContext
, 1.0, 1.0 , 1.0 , 1.0 ); 
2249         CGContextFillRect( cgContext
, cgrect 
); 
2250         CGContextRestoreGState( cgContext 
); 
2254 void wxWindowMac::MacPaintBorders( int WXUNUSED(leftOrigin
) , int WXUNUSED(rightOrigin
) ) 
2260     bool hasFocus 
= m_peer
->NeedsFocusRect() && m_peer
->HasFocus() ; 
2262     // back to the surrounding frame rectangle 
2263     m_peer
->GetRect( &rect 
) ; 
2264     InsetRect( &rect
, -1 , -1 ) ; 
2267         CGRect cgrect 
= CGRectMake( rect
.left 
, rect
.top 
, rect
.right 
- rect
.left 
, 
2268             rect
.bottom 
- rect
.top 
) ; 
2270         HIThemeFrameDrawInfo info 
; 
2271         memset( &info
, 0 , sizeof(info
) ) ; 
2275         info
.state 
= IsEnabled() ? kThemeStateActive 
: kThemeStateInactive 
; 
2276         info
.isFocused 
= hasFocus 
; 
2278         CGContextRef cgContext 
= (CGContextRef
) GetParent()->MacGetCGContextRef() ; 
2279         wxASSERT( cgContext 
) ; 
2281         if ( HasFlag(wxRAISED_BORDER
) || HasFlag(wxSUNKEN_BORDER
) || HasFlag(wxDOUBLE_BORDER
) ) 
2283             info
.kind 
= kHIThemeFrameTextFieldSquare 
; 
2284             HIThemeDrawFrame( &cgrect 
, &info 
, cgContext 
, kHIThemeOrientationNormal 
) ; 
2286         else if ( HasFlag(wxSIMPLE_BORDER
) ) 
2288             info
.kind 
= kHIThemeFrameListBox 
; 
2289             HIThemeDrawFrame( &cgrect 
, &info 
, cgContext 
, kHIThemeOrientationNormal 
) ; 
2291         else if ( hasFocus 
) 
2293             HIThemeDrawFocusRect( &cgrect 
, true , cgContext 
, kHIThemeOrientationNormal 
) ; 
2295 #if 0 // TODO REMOVE now done in a separate call earlier in drawing the window itself 
2296         m_peer
->GetRect( &rect 
) ; 
2297         if ( MacHasScrollBarCorner() ) 
2299             int variant 
= (m_hScrollBar 
== NULL 
? m_vScrollBar 
: m_hScrollBar 
) ->GetWindowVariant(); 
2300             int size 
= m_hScrollBar 
? m_hScrollBar
->GetSize().y 
: ( m_vScrollBar 
? m_vScrollBar
->GetSize().x 
: MAC_SCROLLBAR_SIZE 
) ; 
2301             CGRect cgrect 
= CGRectMake( rect
.right 
- size 
, rect
.bottom 
- size 
, size 
, size 
) ; 
2302             CGPoint cgpoint 
= CGPointMake( rect
.right 
- size 
, rect
.bottom 
- size 
) ; 
2303             HIThemeGrowBoxDrawInfo info 
; 
2304             memset( &info
, 0, sizeof(info
) ) ; 
2306             info
.state 
= IsEnabled() ? kThemeStateActive 
: kThemeStateInactive 
; 
2307             info
.kind 
= kHIThemeGrowBoxKindNone 
; 
2308             // contrary to the docs ...SizeSmall does not work 
2309             info
.size 
= kHIThemeGrowBoxSizeNormal 
; 
2310             info
.direction 
= 0 ; 
2311             HIThemeDrawGrowBox( &cgpoint 
, &info 
, cgContext 
, kHIThemeOrientationNormal 
) ; 
2317 void wxWindowMac::RemoveChild( wxWindowBase 
*child 
) 
2319     if ( child 
== m_hScrollBar 
) 
2320         m_hScrollBar 
= NULL 
; 
2321     if ( child 
== m_vScrollBar 
) 
2322         m_vScrollBar 
= NULL 
; 
2324     wxWindowBase::RemoveChild( child 
) ; 
2327 void wxWindowMac::DoUpdateScrollbarVisibility() 
2329     bool triggerSizeEvent 
= false; 
2333         bool showHScrollBar 
= m_hScrollBarAlwaysShown 
|| m_hScrollBar
->IsNeeded(); 
2335         if ( m_hScrollBar
->IsShown() != showHScrollBar 
) 
2337             m_hScrollBar
->Show( showHScrollBar 
); 
2338             triggerSizeEvent 
= true; 
2344         bool showVScrollBar 
= m_vScrollBarAlwaysShown 
|| m_vScrollBar
->IsNeeded(); 
2346         if ( m_vScrollBar
->IsShown() != showVScrollBar 
) 
2348             m_vScrollBar
->Show( showVScrollBar 
) ; 
2349             triggerSizeEvent 
= true; 
2353     MacRepositionScrollBars() ; 
2354     if ( triggerSizeEvent 
) 
2356         wxSizeEvent 
event(GetSize(), m_windowId
); 
2357         event
.SetEventObject(this); 
2358         HandleWindowEvent(event
); 
2362 // New function that will replace some of the above. 
2363 void wxWindowMac::SetScrollbar(int orient
, int pos
, int thumb
, 
2364                                int range
, bool refresh
) 
2366     if ( orient 
== wxHORIZONTAL 
&& m_hScrollBar 
) 
2367         m_hScrollBar
->SetScrollbar(pos
, thumb
, range
, thumb
, refresh
); 
2368     else if ( orient 
== wxVERTICAL 
&& m_vScrollBar 
) 
2369         m_vScrollBar
->SetScrollbar(pos
, thumb
, range
, thumb
, refresh
); 
2371     DoUpdateScrollbarVisibility(); 
2374 // Does a physical scroll 
2375 void wxWindowMac::ScrollWindow(int dx
, int dy
, const wxRect 
*rect
) 
2377     if ( dx 
== 0 && dy 
== 0 ) 
2380     int width 
, height 
; 
2381     GetClientSize( &width 
, &height 
) ; 
2384         // note there currently is a bug in OSX which makes inefficient refreshes in case an entire control 
2385         // area is scrolled, this does not occur if width and height are 2 pixels less, 
2386         // TODO: write optimal workaround 
2387         wxRect 
scrollrect( MacGetLeftBorderSize() , MacGetTopBorderSize() , width 
, height 
) ; 
2389             scrollrect
.Intersect( *rect 
) ; 
2391         if ( m_peer
->GetNeedsDisplay() ) 
2393             // because HIViewScrollRect does not scroll the already invalidated area we have two options: 
2394             // in case there is already a pending redraw on that area 
2395             // either immediate redraw or full invalidate 
2397             // is the better overall solution, as it does not slow down scrolling 
2398             m_peer
->SetNeedsDisplay() ; 
2400             // this would be the preferred version for fast drawing controls 
2401             HIViewRender(m_peer
->GetControlRef()) ; 
2405         // as the native control might be not a 0/0 wx window coordinates, we have to offset 
2406         scrollrect
.Offset( -MacGetLeftBorderSize() , -MacGetTopBorderSize() ) ; 
2407         m_peer
->ScrollRect( &scrollrect 
, dx 
, dy 
) ; 
2410         // this would be the preferred version for fast drawing controls 
2411         HIViewRender(m_peer
->GetControlRef()) ; 
2417     for (wxWindowList::compatibility_iterator node 
= GetChildren().GetFirst(); node
; node 
= node
->GetNext()) 
2419         child 
= node
->GetData(); 
2422         if (child 
== m_vScrollBar
) 
2424         if (child 
== m_hScrollBar
) 
2426         if (child
->IsTopLevel()) 
2429         child
->GetPosition( &x
, &y 
); 
2430         child
->GetSize( &w
, &h 
); 
2433             wxRect 
rc( x
, y
, w
, h 
); 
2434             if (rect
->Intersects( rc 
)) 
2435                 child
->SetSize( x 
+ dx
, y 
+ dy
, w
, h
, wxSIZE_AUTO
|wxSIZE_ALLOW_MINUS_ONE 
); 
2439             child
->SetSize( x 
+ dx
, y 
+ dy
, w
, h
, wxSIZE_AUTO
|wxSIZE_ALLOW_MINUS_ONE 
); 
2444 void wxWindowMac::MacOnScroll( wxScrollEvent 
&event 
) 
2446     if ( event
.GetEventObject() == m_vScrollBar 
|| event
.GetEventObject() == m_hScrollBar 
) 
2448         wxScrollWinEvent wevent
; 
2449         wevent
.SetPosition(event
.GetPosition()); 
2450         wevent
.SetOrientation(event
.GetOrientation()); 
2451         wevent
.SetEventObject(this); 
2453         if (event
.GetEventType() == wxEVT_SCROLL_TOP
) 
2454             wevent
.SetEventType( wxEVT_SCROLLWIN_TOP 
); 
2455         else if (event
.GetEventType() == wxEVT_SCROLL_BOTTOM
) 
2456             wevent
.SetEventType( wxEVT_SCROLLWIN_BOTTOM 
); 
2457         else if (event
.GetEventType() == wxEVT_SCROLL_LINEUP
) 
2458             wevent
.SetEventType( wxEVT_SCROLLWIN_LINEUP 
); 
2459         else if (event
.GetEventType() == wxEVT_SCROLL_LINEDOWN
) 
2460             wevent
.SetEventType( wxEVT_SCROLLWIN_LINEDOWN 
); 
2461         else if (event
.GetEventType() == wxEVT_SCROLL_PAGEUP
) 
2462             wevent
.SetEventType( wxEVT_SCROLLWIN_PAGEUP 
); 
2463         else if (event
.GetEventType() == wxEVT_SCROLL_PAGEDOWN
) 
2464             wevent
.SetEventType( wxEVT_SCROLLWIN_PAGEDOWN 
); 
2465         else if (event
.GetEventType() == wxEVT_SCROLL_THUMBTRACK
) 
2466             wevent
.SetEventType( wxEVT_SCROLLWIN_THUMBTRACK 
); 
2467         else if (event
.GetEventType() == wxEVT_SCROLL_THUMBRELEASE
) 
2468             wevent
.SetEventType( wxEVT_SCROLLWIN_THUMBRELEASE 
); 
2470         HandleWindowEvent(wevent
); 
2474 // Get the window with the focus 
2475 wxWindowMac 
*wxWindowBase::DoFindFocus() 
2477     ControlRef control 
; 
2478     GetKeyboardFocus( GetUserFocusWindow() , &control 
) ; 
2479     return wxFindControlFromMacControl( control 
) ; 
2482 void wxWindowMac::OnInternalIdle() 
2484     // This calls the UI-update mechanism (querying windows for 
2485     // menu/toolbar/control state information) 
2486     if (wxUpdateUIEvent::CanUpdate(this) && IsShownOnScreen()) 
2487         UpdateWindowUI(wxUPDATE_UI_FROMIDLE
); 
2490 // Raise the window to the top of the Z order 
2491 void wxWindowMac::Raise() 
2493     m_peer
->SetZOrder( true , NULL 
) ; 
2496 // Lower the window to the bottom of the Z order 
2497 void wxWindowMac::Lower() 
2499     m_peer
->SetZOrder( false , NULL 
) ; 
2502 // static wxWindow *gs_lastWhich = NULL; 
2504 bool wxWindowMac::MacSetupCursor( const wxPoint
& pt 
) 
2506     // first trigger a set cursor event 
2508     wxPoint clientorigin 
= GetClientAreaOrigin() ; 
2509     wxSize clientsize 
= GetClientSize() ; 
2511     if ( wxRect2DInt( clientorigin
.x 
, clientorigin
.y 
, clientsize
.x 
, clientsize
.y 
).Contains( wxPoint2DInt( pt 
) ) ) 
2513         wxSetCursorEvent 
event( pt
.x 
, pt
.y 
); 
2515         bool processedEvtSetCursor 
= HandleWindowEvent(event
); 
2516         if ( processedEvtSetCursor 
&& event
.HasCursor() ) 
2518             cursor 
= event
.GetCursor() ; 
2522             // the test for processedEvtSetCursor is here to prevent using m_cursor 
2523             // if the user code caught EVT_SET_CURSOR() and returned nothing from 
2524             // it - this is a way to say that our cursor shouldn't be used for this 
2526             if ( !processedEvtSetCursor 
&& m_cursor
.Ok() ) 
2529             if ( !wxIsBusy() && !GetParent() ) 
2530                 cursor 
= *wxSTANDARD_CURSOR 
; 
2534             cursor
.MacInstall() ; 
2537     return cursor
.Ok() ; 
2540 wxString 
wxWindowMac::MacGetToolTipString( wxPoint 
&WXUNUSED(pt
) ) 
2544         return m_tooltip
->GetTip() ; 
2547     return wxEmptyString 
; 
2550 void wxWindowMac::ClearBackground() 
2556 void wxWindowMac::Update() 
2558     wxTopLevelWindowMac
* top 
= MacGetTopLevelWindow(); 
2560         top
->MacPerformUpdates() ; 
2563 wxTopLevelWindowMac
* wxWindowMac::MacGetTopLevelWindow() const 
2565     wxTopLevelWindowMac
* win 
= NULL 
; 
2566     WindowRef window 
= (WindowRef
) MacGetTopLevelWindowRef() ; 
2568         win 
= wxFindWinFromMacWindow( window 
) ; 
2573 const wxRect
& wxWindowMac::MacGetClippedClientRect() const 
2575     MacUpdateClippedRects() ; 
2577     return m_cachedClippedClientRect 
; 
2580 const wxRect
& wxWindowMac::MacGetClippedRect() const 
2582     MacUpdateClippedRects() ; 
2584     return m_cachedClippedRect 
; 
2587 const wxRect
&wxWindowMac:: MacGetClippedRectWithOuterStructure() const 
2589     MacUpdateClippedRects() ; 
2591     return m_cachedClippedRectWithOuterStructure 
; 
2594 const wxRegion
& wxWindowMac::MacGetVisibleRegion( bool includeOuterStructures 
) 
2596     static wxRegion emptyrgn 
; 
2598     if ( !m_isBeingDeleted 
&& IsShownOnScreen() ) 
2600         MacUpdateClippedRects() ; 
2601         if ( includeOuterStructures 
) 
2602             return m_cachedClippedRegionWithOuterStructure 
; 
2604             return m_cachedClippedRegion 
; 
2612 void wxWindowMac::MacUpdateClippedRects() const 
2614     if ( m_cachedClippedRectValid 
) 
2617     // includeOuterStructures is true if we try to draw somthing like a focus ring etc. 
2618     // also a window dc uses this, in this case we only clip in the hierarchy for hard 
2619     // borders like a scrollwindow, splitter etc otherwise we end up in a paranoia having 
2620     // to add focus borders everywhere 
2622     Rect r
, rIncludingOuterStructures 
; 
2624     m_peer
->GetRect( &r 
) ; 
2625     r
.left 
-= MacGetLeftBorderSize() ; 
2626     r
.top 
-= MacGetTopBorderSize() ; 
2627     r
.bottom 
+= MacGetBottomBorderSize() ; 
2628     r
.right 
+= MacGetRightBorderSize() ; 
2635     rIncludingOuterStructures 
= r 
; 
2636     InsetRect( &rIncludingOuterStructures 
, -4 , -4 ) ; 
2638     wxRect cl 
= GetClientRect() ; 
2639     Rect rClient 
= { cl
.y 
, cl
.x 
, cl
.y 
+ cl
.height 
, cl
.x 
+ cl
.width 
} ; 
2643     const wxWindow
* child 
= this ; 
2644     const wxWindow
* parent 
= NULL 
; 
2646     while ( !child
->IsTopLevel() && ( parent 
= child
->GetParent() ) != NULL 
) 
2648         if ( parent
->MacIsChildOfClientArea(child
) ) 
2650             size 
= parent
->GetClientSize() ; 
2651             wxPoint origin 
= parent
->GetClientAreaOrigin() ; 
2657             // this will be true for scrollbars, toolbars etc. 
2658             size 
= parent
->GetSize() ; 
2659             y 
= parent
->MacGetTopBorderSize() ; 
2660             x 
= parent
->MacGetLeftBorderSize() ; 
2661             size
.x 
-= parent
->MacGetLeftBorderSize() + parent
->MacGetRightBorderSize() ; 
2662             size
.y 
-= parent
->MacGetTopBorderSize() + parent
->MacGetBottomBorderSize() ; 
2665         parent
->MacWindowToRootWindow( &x
, &y 
) ; 
2666         MacRootWindowToWindow( &x 
, &y 
) ; 
2668         Rect rparent 
= { y 
, x 
, y 
+ size
.y 
, x 
+ size
.x 
} ; 
2670         // the wxwindow and client rects will always be clipped 
2671         SectRect( &r 
, &rparent 
, &r 
) ; 
2672         SectRect( &rClient 
, &rparent 
, &rClient 
) ; 
2674         // the structure only at 'hard' borders 
2675         if ( parent
->MacClipChildren() || 
2676             ( parent
->GetParent() && parent
->GetParent()->MacClipGrandChildren() ) ) 
2678             SectRect( &rIncludingOuterStructures 
, &rparent 
, &rIncludingOuterStructures 
) ; 
2684     m_cachedClippedRect 
= wxRect( r
.left 
, r
.top 
, r
.right 
- r
.left 
, r
.bottom 
- r
.top 
) ; 
2685     m_cachedClippedClientRect 
= wxRect( rClient
.left 
, rClient
.top 
, 
2686         rClient
.right 
- rClient
.left 
, rClient
.bottom 
- rClient
.top 
) ; 
2687     m_cachedClippedRectWithOuterStructure 
= wxRect( 
2688         rIncludingOuterStructures
.left 
, rIncludingOuterStructures
.top 
, 
2689         rIncludingOuterStructures
.right 
- rIncludingOuterStructures
.left 
, 
2690         rIncludingOuterStructures
.bottom 
- rIncludingOuterStructures
.top 
) ; 
2692     m_cachedClippedRegionWithOuterStructure 
= wxRegion( m_cachedClippedRectWithOuterStructure 
) ; 
2693     m_cachedClippedRegion 
= wxRegion( m_cachedClippedRect 
) ; 
2694     m_cachedClippedClientRegion 
= wxRegion( m_cachedClippedClientRect 
) ; 
2696     m_cachedClippedRectValid 
= true ; 
2700     This function must not change the updatergn ! 
2702 bool wxWindowMac::MacDoRedraw( void* updatergnr 
, long time 
) 
2704     bool handled 
= false ; 
2706     RgnHandle updatergn 
= (RgnHandle
) updatergnr 
; 
2707     GetRegionBounds( updatergn 
, &updatebounds 
) ; 
2709     // wxLogDebug(wxT("update for %s bounds %d, %d, %d, %d"), wxString(GetClassInfo()->GetClassName()).c_str(), updatebounds.left, updatebounds.top , updatebounds.right , updatebounds.bottom ) ; 
2711     if ( !EmptyRgn(updatergn
) ) 
2713         RgnHandle newupdate 
= NewRgn() ; 
2714         wxSize point 
= GetClientSize() ; 
2715         wxPoint origin 
= GetClientAreaOrigin() ; 
2716         SetRectRgn( newupdate 
, origin
.x 
, origin
.y 
, origin
.x 
+ point
.x 
, origin
.y 
+ point
.y 
) ; 
2717         SectRgn( newupdate 
, updatergn 
, newupdate 
) ; 
2719         // first send an erase event to the entire update area 
2721             // for the toplevel window this really is the entire area 
2722             // for all the others only their client area, otherwise they 
2723             // might be drawing with full alpha and eg put blue into 
2724             // the grow-box area of a scrolled window (scroll sample) 
2725             wxDC
* dc 
= new wxWindowDC(this); 
2727                 dc
->SetClippingRegion(wxRegion(HIShapeCreateWithQDRgn(updatergn
))); 
2729                 dc
->SetClippingRegion(wxRegion(HIShapeCreateWithQDRgn(newupdate
))); 
2731             wxEraseEvent 
eevent( GetId(), dc 
); 
2732             eevent
.SetEventObject( this ); 
2733             HandleWindowEvent( eevent 
); 
2739         // calculate a client-origin version of the update rgn and set m_updateRegion to that 
2740         OffsetRgn( newupdate 
, -origin
.x 
, -origin
.y 
) ; 
2741         m_updateRegion 
= wxRegion(HIShapeCreateWithQDRgn(newupdate
)) ; 
2742         DisposeRgn( newupdate 
) ; 
2744         if ( !m_updateRegion
.Empty() ) 
2746             // paint the window itself 
2749             event
.SetTimestamp(time
); 
2750             event
.SetEventObject(this); 
2751             HandleWindowEvent(event
); 
2755         // now we cannot rely on having its borders drawn by a window itself, as it does not 
2756         // get the updateRgn wide enough to always do so, so we do it from the parent 
2757         // this would also be the place to draw any custom backgrounds for native controls 
2758         // in Composited windowing 
2759         wxPoint clientOrigin 
= GetClientAreaOrigin() ; 
2763         for (wxWindowList::compatibility_iterator node 
= GetChildren().GetFirst(); node
; node 
= node
->GetNext()) 
2765             child 
= node
->GetData(); 
2768             if (child 
== m_vScrollBar
) 
2770             if (child 
== m_hScrollBar
) 
2772             if (child
->IsTopLevel()) 
2774             if (!child
->IsShown()) 
2777             // only draw those in the update region (add a safety margin of 10 pixels for shadow effects 
2779             child
->GetPosition( &x
, &y 
); 
2780             child
->GetSize( &w
, &h 
); 
2781             Rect childRect 
= { y 
, x 
, y 
+ h 
, x 
+ w 
} ; 
2782             OffsetRect( &childRect 
, clientOrigin
.x 
, clientOrigin
.y 
) ; 
2783             InsetRect( &childRect 
, -10 , -10) ; 
2785             if ( RectInRgn( &childRect 
, updatergn 
) ) 
2787                 // paint custom borders 
2788                 wxNcPaintEvent 
eventNc( child
->GetId() ); 
2789                 eventNc
.SetEventObject( child 
); 
2790                 if ( !child
->HandleWindowEvent( eventNc 
) ) 
2792                     child
->MacPaintBorders(0, 0) ; 
2802 WXWindow 
wxWindowMac::MacGetTopLevelWindowRef() const 
2804     wxWindowMac 
*iter 
= (wxWindowMac
*)this ; 
2808         if ( iter
->IsTopLevel() ) 
2810             wxTopLevelWindow
* toplevel 
= wxDynamicCast(iter
,wxTopLevelWindow
); 
2812                 return toplevel
->MacGetWindowRef(); 
2814             wxPopupWindow
* popupwin 
= wxDynamicCast(iter
,wxPopupWindow
); 
2816                 return popupwin
->MacGetPopupWindowRef(); 
2819         iter 
= iter
->GetParent() ; 
2825 bool wxWindowMac::MacHasScrollBarCorner() const 
2827     /* Returns whether the scroll bars in a wxScrolledWindow should be 
2828      * shortened. Scroll bars should be shortened if either: 
2830      * - both scroll bars are visible, or 
2832      * - there is a resize box in the parent frame's corner and this 
2833      *   window shares the bottom and right edge with the parent 
2837     if ( m_hScrollBar 
== NULL 
&& m_vScrollBar 
== NULL 
) 
2840     if ( ( m_hScrollBar 
&& m_hScrollBar
->IsShown() ) 
2841          && ( m_vScrollBar 
&& m_vScrollBar
->IsShown() ) ) 
2843         // Both scroll bars visible 
2848         wxPoint thisWindowBottomRight 
= GetScreenRect().GetBottomRight(); 
2850         for ( const wxWindow 
*win 
= this; win
; win 
= win
->GetParent() ) 
2852             const wxFrame 
*frame 
= wxDynamicCast( win
, wxFrame 
) ; 
2855                 if ( frame
->GetWindowStyleFlag() & wxRESIZE_BORDER 
) 
2857                     // Parent frame has resize handle 
2858                     wxPoint frameBottomRight 
= frame
->GetScreenRect().GetBottomRight(); 
2860                     // Note: allow for some wiggle room here as wxMac's 
2861                     // window rect calculations seem to be imprecise 
2862                     if ( abs( thisWindowBottomRight
.x 
- frameBottomRight
.x 
) <= 2 
2863                         && abs( thisWindowBottomRight
.y 
- frameBottomRight
.y 
) <= 2 ) 
2865                         // Parent frame has resize handle and shares 
2866                         // right bottom corner 
2871                         // Parent frame has resize handle but doesn't 
2872                         // share right bottom corner 
2878                     // Parent frame doesn't have resize handle 
2884         // No parent frame found 
2889 void wxWindowMac::MacCreateScrollBars( long style 
) 
2891     wxASSERT_MSG( m_vScrollBar 
== NULL 
&& m_hScrollBar 
== NULL 
, wxT("attempt to create window twice") ) ; 
2893     if ( style 
& ( wxVSCROLL 
| wxHSCROLL 
) ) 
2895         int scrlsize 
= MAC_SCROLLBAR_SIZE 
; 
2896         if ( GetWindowVariant() == wxWINDOW_VARIANT_SMALL 
|| GetWindowVariant() == wxWINDOW_VARIANT_MINI 
) 
2898             scrlsize 
= MAC_SMALL_SCROLLBAR_SIZE 
; 
2901         int adjust 
= MacHasScrollBarCorner() ? scrlsize 
- 1: 0 ; 
2903         GetClientSize( &width 
, &height 
) ; 
2905         wxPoint 
vPoint(width 
- scrlsize
, 0) ; 
2906         wxSize 
vSize(scrlsize
, height 
- adjust
) ; 
2907         wxPoint 
hPoint(0, height 
- scrlsize
) ; 
2908         wxSize 
hSize(width 
- adjust
, scrlsize
) ; 
2910         // we have to set the min size to a smaller value, otherwise they cannot get smaller (InitialSize sets MinSize) 
2911         if ( style 
& wxVSCROLL 
) 
2913             m_vScrollBar 
= new wxScrollBar((wxWindow
*)this, wxID_ANY
, vPoint
, vSize 
, wxVERTICAL
); 
2914             m_vScrollBar
->SetMinSize( wxDefaultSize 
); 
2917         if ( style  
& wxHSCROLL 
) 
2919             m_hScrollBar 
= new wxScrollBar((wxWindow
*)this, wxID_ANY
, hPoint
, hSize 
, wxHORIZONTAL
); 
2920             m_hScrollBar
->SetMinSize( wxDefaultSize 
); 
2924     // because the create does not take into account the client area origin 
2925     // we might have a real position shift 
2926     MacRepositionScrollBars() ; 
2929 bool wxWindowMac::MacIsChildOfClientArea( const wxWindow
* child 
) const 
2931     bool result 
= ((child 
== NULL
) || ((child 
!= m_hScrollBar
) && (child 
!= m_vScrollBar
))); 
2936 void wxWindowMac::MacRepositionScrollBars() 
2938     if ( !m_hScrollBar 
&& !m_vScrollBar 
) 
2941     int scrlsize 
= m_hScrollBar 
? m_hScrollBar
->GetSize().y 
: ( m_vScrollBar 
? m_vScrollBar
->GetSize().x 
: MAC_SCROLLBAR_SIZE 
) ; 
2942     int adjust 
= MacHasScrollBarCorner() ? scrlsize 
- 1 : 0 ; 
2944     // get real client area 
2946     GetSize( &width 
, &height 
); 
2948     width 
-= MacGetLeftBorderSize() + MacGetRightBorderSize(); 
2949     height 
-= MacGetTopBorderSize() + MacGetBottomBorderSize(); 
2951     wxPoint 
vPoint( width 
- scrlsize
, 0 ) ; 
2952     wxSize 
vSize( scrlsize
, height 
- adjust 
) ; 
2953     wxPoint 
hPoint( 0 , height 
- scrlsize 
) ; 
2954     wxSize 
hSize( width 
- adjust
, scrlsize 
) ; 
2957     int x 
= 0, y 
= 0, w
, h 
; 
2958     GetSize( &w 
, &h 
) ; 
2960     MacClientToRootWindow( &x 
, &y 
) ; 
2961     MacClientToRootWindow( &w 
, &h 
) ; 
2963     wxWindowMac 
*iter 
= (wxWindowMac
*)this ; 
2965     int totW 
= 10000 , totH 
= 10000; 
2968         if ( iter
->IsTopLevel() ) 
2970             iter
->GetSize( &totW 
, &totH 
) ; 
2974         iter 
= iter
->GetParent() ; 
2988     if ( w 
- x 
>= totW 
) 
2993     if ( h 
- y 
>= totH 
) 
3001         m_vScrollBar
->SetSize( vPoint
.x 
, vPoint
.y
, vSize
.x
, vSize
.y 
, wxSIZE_ALLOW_MINUS_ONE 
); 
3003         m_hScrollBar
->SetSize( hPoint
.x 
, hPoint
.y
, hSize
.x
, hSize
.y
, wxSIZE_ALLOW_MINUS_ONE 
); 
3006 bool wxWindowMac::AcceptsFocus() const 
3008     return MacCanFocus() && wxWindowBase::AcceptsFocus(); 
3011 void wxWindowMac::MacSuperChangedPosition() 
3013     // only window-absolute structures have to be moved i.e. controls 
3015     m_cachedClippedRectValid 
= false ; 
3018     wxWindowList::compatibility_iterator node 
= GetChildren().GetFirst(); 
3021         child 
= node
->GetData(); 
3022         child
->MacSuperChangedPosition() ; 
3024         node 
= node
->GetNext(); 
3028 void wxWindowMac::MacTopLevelWindowChangedPosition() 
3030     // only screen-absolute structures have to be moved i.e. glcanvas 
3033     wxWindowList::compatibility_iterator node 
= GetChildren().GetFirst(); 
3036         child 
= node
->GetData(); 
3037         child
->MacTopLevelWindowChangedPosition() ; 
3039         node 
= node
->GetNext(); 
3043 long wxWindowMac::MacGetLeftBorderSize() const 
3050     if (HasFlag(wxRAISED_BORDER
) || HasFlag( wxSUNKEN_BORDER
) || HasFlag(wxDOUBLE_BORDER
)) 
3052         // this metric is only the 'outset' outside the simple frame rect 
3053         GetThemeMetric( kThemeMetricEditTextFrameOutset 
, &border 
) ; 
3056     else if (HasFlag(wxSIMPLE_BORDER
)) 
3058         // this metric is only the 'outset' outside the simple frame rect 
3059         GetThemeMetric( kThemeMetricListBoxFrameOutset 
, &border 
) ; 
3066 long wxWindowMac::MacGetRightBorderSize() const 
3068     // they are all symmetric in mac themes 
3069     return MacGetLeftBorderSize() ; 
3072 long wxWindowMac::MacGetTopBorderSize() const 
3074     // they are all symmetric in mac themes 
3075     return MacGetLeftBorderSize() ; 
3078 long wxWindowMac::MacGetBottomBorderSize() const 
3080     // they are all symmetric in mac themes 
3081     return MacGetLeftBorderSize() ; 
3084 long wxWindowMac::MacRemoveBordersFromStyle( long style 
) 
3086     return style 
& ~wxBORDER_MASK 
; 
3089 // Find the wxWindowMac at the current mouse position, returning the mouse 
3091 wxWindowMac 
* wxFindWindowAtPointer( wxPoint
& pt 
) 
3093     pt 
= wxGetMousePosition(); 
3094     wxWindowMac
* found 
= wxFindWindowAtPoint(pt
); 
3099 // Get the current mouse position. 
3100 wxPoint 
wxGetMousePosition() 
3104     wxGetMousePosition( &x
, &y 
); 
3106     return wxPoint(x
, y
); 
3109 void wxWindowMac::OnMouseEvent( wxMouseEvent 
&event 
) 
3111     if ( event
.GetEventType() == wxEVT_RIGHT_DOWN 
) 
3113         // copied from wxGTK : CS 
3114         // VZ: shouldn't we move this to base class then? 
3116         // generate a "context menu" event: this is similar to wxEVT_RIGHT_DOWN 
3119         // (a) it's a command event and so is propagated to the parent 
3120         // (b) under MSW it can be generated from kbd too 
3121         // (c) it uses screen coords (because of (a)) 
3122         wxContextMenuEvent 
evtCtx(wxEVT_CONTEXT_MENU
, 
3124                                   this->ClientToScreen(event
.GetPosition())); 
3125         evtCtx
.SetEventObject(this); 
3126         if ( ! HandleWindowEvent(evtCtx
) ) 
3135 void wxWindowMac::OnPaint( wxPaintEvent 
& WXUNUSED(event
) ) 
3137     if ( wxTheApp
->MacGetCurrentEvent() != NULL 
&& wxTheApp
->MacGetCurrentEventHandlerCallRef() != NULL
 
3138          && GetBackgroundStyle() != wxBG_STYLE_TRANSPARENT 
) 
3139         CallNextEventHandler( 
3140             (EventHandlerCallRef
)wxTheApp
->MacGetCurrentEventHandlerCallRef() , 
3141             (EventRef
) wxTheApp
->MacGetCurrentEvent() ) ; 
3144 void wxWindowMac::MacHandleControlClick(WXWidget 
WXUNUSED(control
), 
3145                                         wxInt16 
WXUNUSED(controlpart
), 
3146                                         bool WXUNUSED(mouseStillDown
)) 
3150 Rect 
wxMacGetBoundsForControl( wxWindow
* window 
, const wxPoint
& pos 
, const wxSize 
&size 
, bool adjustForOrigin 
) 
3154     window
->MacGetBoundsForControl( pos 
, size 
, x 
, y
, w
, h 
, adjustForOrigin 
) ; 
3155     Rect bounds 
= { y
, x
, y 
+ h
, x 
+ w 
}; 
3160 wxInt32 
wxWindowMac::MacControlHit(WXEVENTHANDLERREF 
WXUNUSED(handler
) , WXEVENTREF 
WXUNUSED(event
) ) 
3162     return eventNotHandledErr 
; 
3165 bool wxWindowMac::Reparent(wxWindowBase 
*newParentBase
) 
3167     wxWindowMac 
*newParent 
= (wxWindowMac 
*)newParentBase
; 
3168     if ( !wxWindowBase::Reparent(newParent
) ) 
3171     // copied from MacPostControlCreate 
3172     ControlRef container 
= (ControlRef
) GetParent()->GetHandle() ; 
3174     wxASSERT_MSG( container 
!= NULL 
, wxT("No valid mac container control") ) ; 
3176     ::EmbedControl( m_peer
->GetControlRef() , container 
) ; 
3181 bool wxWindowMac::SetTransparent(wxByte alpha
) 
3183     SetBackgroundStyle(wxBG_STYLE_TRANSPARENT
); 
3185     if ( alpha 
!= m_macAlpha 
) 
3187         m_macAlpha 
= alpha 
; 
3194 bool wxWindowMac::CanSetTransparent() 
3199 wxByte 
wxWindowMac::GetTransparent() const 
3204 bool wxWindowMac::IsShownOnScreen() const 
3206 #if TARGET_API_MAC_OSX 
3207     if ( m_peer 
&& m_peer
->Ok() ) 
3209         bool peerVis 
= m_peer
->IsVisible(); 
3210         bool wxVis 
= wxWindowBase::IsShownOnScreen(); 
3211         if( peerVis 
!= wxVis 
) 
3213             // CS : put a breakpoint here to investigate differences 
3214             // between native an wx visibilities 
3215             // the only place where I've encountered them until now 
3216             // are the hiding/showing sequences where the vis-changed event is  
3217             // first sent to the innermost control, while wx does things 
3218             // from the outmost control 
3219             wxVis 
= wxWindowBase::IsShownOnScreen(); 
3223         return m_peer
->IsVisible(); 
3227     return wxWindowBase::IsShownOnScreen();