1 ///////////////////////////////////////////////////////////////////////////// 
   3 // Purpose:     wxWindowMac 
   8 // Copyright:   (c) AUTHOR 
   9 // Licence:     wxWindows licence 
  10 ///////////////////////////////////////////////////////////////////////////// 
  13 #pragma implementation "window.h" 
  18 #include "wx/window.h" 
  20 #include "wx/dcclient.h" 
  24 #include "wx/layout.h" 
  25 #include "wx/dialog.h" 
  26 #include "wx/listbox.h" 
  27 #include "wx/scrolbar.h" 
  28 #include "wx/statbox.h" 
  29 #include "wx/button.h" 
  30 #include "wx/settings.h" 
  31 #include "wx/msgdlg.h" 
  33 #include "wx/notebook.h" 
  34 #include "wx/tabctrl.h" 
  35 #include "wx/tooltip.h" 
  36 #include "wx/statusbr.h" 
  37 #include "wx/menuitem.h" 
  38 #include "wx/spinctrl.h" 
  45 #define wxWINDOW_HSCROLL 5998 
  46 #define wxWINDOW_VSCROLL 5997 
  47 #define MAC_SCROLLBAR_SIZE 16 
  49 #include "wx/mac/uma.h" 
  52 #include <ToolUtils.h> 
  55 #if  wxUSE_DRAG_AND_DROP 
  61 extern wxList wxPendingDelete
; 
  62 wxWindowMac
* gFocusWindow 
= NULL 
; 
  64 #ifdef __WXUNIVERSAL__ 
  65     IMPLEMENT_ABSTRACT_CLASS(wxWindowMac
, wxWindowBase
) 
  67     IMPLEMENT_DYNAMIC_CLASS(wxWindow
, wxWindowBase
) 
  68 #endif // __WXUNIVERSAL__/__WXMAC__ 
  70 #if !USE_SHARED_LIBRARY 
  72 BEGIN_EVENT_TABLE(wxWindowMac
, wxWindowBase
) 
  73   EVT_NC_PAINT(wxWindowMac::OnNcPaint
) 
  74   EVT_ERASE_BACKGROUND(wxWindowMac::OnEraseBackground
) 
  75   EVT_SYS_COLOUR_CHANGED(wxWindowMac::OnSysColourChanged
) 
  76   EVT_INIT_DIALOG(wxWindowMac::OnInitDialog
) 
  77   EVT_IDLE(wxWindowMac::OnIdle
) 
  78   EVT_SET_FOCUS(wxWindowMac::OnSetFocus
) 
  83 #define wxMAC_DEBUG_REDRAW 0 
  84 #ifndef wxMAC_DEBUG_REDRAW 
  85 #define wxMAC_DEBUG_REDRAW 0 
  88 #define wxMAC_USE_THEME_BORDER 0 
  91 // =========================================================================== 
  93 // =========================================================================== 
  96 // ---------------------------------------------------------------------------- 
  97 // constructors and such 
  98 // ---------------------------------------------------------------------------- 
 100 void wxWindowMac::Init() 
 106     m_doubleClickAllowed 
= 0; 
 107     m_winCaptured 
= FALSE
; 
 109     m_isBeingDeleted 
= FALSE
; 
 112     m_mouseInWindow 
= FALSE
; 
 116     m_backgroundTransparent 
= FALSE
; 
 118     // as all windows are created with WS_VISIBLE style... 
 126     m_hScrollBar 
= NULL 
; 
 127     m_vScrollBar 
= NULL 
; 
 129     m_label 
= wxEmptyString
; 
 133 wxWindowMac::~wxWindowMac() 
 135     // deleting a window while it is shown invalidates the region 
 137         wxWindowMac
* iter 
= this ; 
 139             if ( iter
->IsTopLevel() ) 
 144             iter 
= iter
->GetParent() ; 
 149     m_isBeingDeleted 
= TRUE
; 
 151     if ( s_lastMouseWindow 
== this ) 
 153         s_lastMouseWindow 
= NULL 
; 
 156     if ( gFocusWindow 
== this ) 
 158         gFocusWindow 
= NULL 
; 
 162         m_parent
->RemoveChild(this); 
 168 bool wxWindowMac::Create(wxWindowMac 
*parent
, wxWindowID id
, 
 172            const wxString
& name
) 
 174     wxCHECK_MSG( parent
, FALSE
, wxT("can't create wxWindowMac without parent") ); 
 176     if ( !CreateBase(parent
, id
, pos
, size
, style
, wxDefaultValidator
, name
) ) 
 179     parent
->AddChild(this); 
 183     AdjustForParentClientOrigin(m_x
, m_y
, wxSIZE_USE_EXISTING
); 
 184     m_width 
= WidthDefault( size
.x 
); 
 185     m_height 
= HeightDefault( size
.y 
) ; 
 186 #ifndef __WXUNIVERSAL__ 
 187     if ( ! IsKindOf( CLASSINFO ( wxControl 
) ) && ! IsKindOf( CLASSINFO( wxStatusBar 
) ) ) 
 189         MacCreateScrollBars( style 
) ; 
 195 void wxWindowMac::SetFocus() 
 197     if ( gFocusWindow 
== this ) 
 200     if ( AcceptsFocus() ) 
 206                 if ( gFocusWindow
->m_caret 
) 
 208                       gFocusWindow
->m_caret
->OnKillFocus(); 
 210             #endif // wxUSE_CARET 
 211       #ifndef __WXUNIVERSAL__ 
 212             wxControl
* control 
= wxDynamicCast( gFocusWindow 
, wxControl 
) ; 
 213             if ( control 
&& control
->GetMacControl() ) 
 215                 UMASetKeyboardFocus( (WindowRef
) gFocusWindow
->MacGetRootWindow() , (ControlHandle
) control
->GetMacControl()  , kControlFocusNoPart 
) ; 
 216                 control
->MacRedrawControl() ; 
 219             wxFocusEvent 
event(wxEVT_KILL_FOCUS
, gFocusWindow
->m_windowId
); 
 220             event
.SetEventObject(gFocusWindow
); 
 221             gFocusWindow
->GetEventHandler()->ProcessEvent(event
) ; 
 223         gFocusWindow 
= this ; 
 229                 m_caret
->OnSetFocus(); 
 231             #endif // wxUSE_CARET 
 232             // panel wants to track the window which was the last to have focus in it 
 233             wxChildFocusEvent 
eventFocus(this); 
 234             GetEventHandler()->ProcessEvent(eventFocus
); 
 236       #ifndef __WXUNIVERSAL__ 
 237             wxControl
* control 
= wxDynamicCast( gFocusWindow 
, wxControl 
) ; 
 238             if ( control 
&& control
->GetMacControl() ) 
 240                 UMASetKeyboardFocus( (WindowRef
) gFocusWindow
->MacGetRootWindow() , (ControlHandle
) control
->GetMacControl()  , kControlFocusNextPart 
) ; 
 243             wxFocusEvent 
event(wxEVT_SET_FOCUS
, m_windowId
); 
 244             event
.SetEventObject(this); 
 245             GetEventHandler()->ProcessEvent(event
) ; 
 250 bool wxWindowMac::Enable(bool enable
) 
 252     if ( !wxWindowBase::Enable(enable
) ) 
 255     MacSuperEnabled( enable 
) ; 
 260 void wxWindowMac::DoCaptureMouse() 
 262     wxTheApp
->s_captureWindow 
= this ; 
 265 wxWindow
* wxWindowBase::GetCapture() 
 267     return wxTheApp
->s_captureWindow 
; 
 270 void wxWindowMac::DoReleaseMouse() 
 272     wxTheApp
->s_captureWindow 
= NULL 
; 
 275 #if    wxUSE_DRAG_AND_DROP 
 277 void wxWindowMac::SetDropTarget(wxDropTarget 
*pDropTarget
) 
 279   if ( m_dropTarget 
!= 0 ) { 
 283   m_dropTarget 
= pDropTarget
; 
 284   if ( m_dropTarget 
!= 0 ) 
 292 // Old style file-manager drag&drop 
 293 void wxWindowMac::DragAcceptFiles(bool accept
) 
 299 void wxWindowMac::DoGetSize(int *x
, int *y
) const 
 302      if(y
)   *y 
= m_height 
; 
 305 void wxWindowMac::DoGetPosition(int *x
, int *y
) const 
 311     if ( !IsTopLevel() && GetParent()) 
 313         wxPoint 
pt(GetParent()->GetClientAreaOrigin()); 
 322 bool wxWindowMac::DoPopupMenu(wxMenu 
*menu
, int x
, int y
) 
 324     menu
->SetInvokingWindow(this); 
 326     ClientToScreen( &x 
, &y 
) ; 
 328     ::InsertMenu( (MenuHandle
) menu
->GetHMenu() , -1 ) ; 
 329     long menuResult 
= ::PopUpMenuSelect((MenuHandle
) menu
->GetHMenu() ,y
,x
, 0) ; 
 330     menu
->MacMenuSelect( this , TickCount() , HiWord(menuResult
) , LoWord(menuResult
) ) ; 
 331     ::DeleteMenu( menu
->MacGetMenuId() ) ; 
 332     menu
->SetInvokingWindow(NULL
); 
 338 void wxWindowMac::DoScreenToClient(int *x
, int *y
) const 
 340     WindowRef window 
= (WindowRef
) MacGetRootWindow() ; 
 342     Point       localwhere 
= {0,0} ; 
 344     if(x
)   localwhere
.h 
= * x 
; 
 345     if(y
)   localwhere
.v 
= * y 
; 
 349     ::SetPort( UMAGetWindowPort( window 
) ) ; 
 350     ::GlobalToLocal( &localwhere 
) ; 
 353     if(x
)   *x 
= localwhere
.h 
; 
 354     if(y
)   *y 
= localwhere
.v 
; 
 356     MacRootWindowToWindow( x 
, y 
) ; 
 358             x 
-= MacGetLeftBorderSize() ; 
 360             y 
-= MacGetTopBorderSize() ; 
 363 void wxWindowMac::DoClientToScreen(int *x
, int *y
) const 
 365     WindowRef window 
= (WindowRef
) MacGetRootWindow() ; 
 368             x 
+= MacGetLeftBorderSize() ; 
 370             y 
+= MacGetTopBorderSize() ; 
 372     MacWindowToRootWindow( x 
, y 
) ; 
 374     Point       localwhere 
= { 0,0 }; 
 375     if(x
)   localwhere
.h 
= * x 
; 
 376     if(y
)   localwhere
.v 
= * y 
; 
 380     ::SetPort( UMAGetWindowPort( window 
) ) ; 
 382     ::LocalToGlobal( &localwhere 
) ; 
 384     if(x
)   *x 
= localwhere
.h 
; 
 385     if(y
)   *y 
= localwhere
.v 
; 
 388 void wxWindowMac::MacClientToRootWindow( int *x 
, int *y 
) const 
 390     wxPoint origin 
= GetClientAreaOrigin() ; 
 391     if(x
)   *x 
+= origin
.x 
; 
 392     if(y
)   *y 
+= origin
.y 
; 
 394     MacWindowToRootWindow( x 
, y 
) ; 
 397 void wxWindowMac::MacRootWindowToClient( int *x 
, int *y 
) const 
 399     wxPoint origin 
= GetClientAreaOrigin() ; 
 400     MacRootWindowToWindow( x 
, y 
) ; 
 401     if(x
)   *x 
-= origin
.x 
; 
 402     if(y
)   *y 
-= origin
.y 
; 
 405 void wxWindowMac::MacWindowToRootWindow( int *x 
, int *y 
) const 
 411         GetParent()->MacWindowToRootWindow( x 
, y 
) ; 
 415 void wxWindowMac::MacRootWindowToWindow( int *x 
, int *y 
) const 
 421         GetParent()->MacRootWindowToWindow( x 
, y 
) ; 
 425 bool wxWindowMac::SetCursor(const wxCursor
& cursor
) 
 427     if (m_cursor 
== cursor
) 
 430     if (wxNullCursor 
== cursor
) 
 432        if ( ! wxWindowBase::SetCursor( *wxSTANDARD_CURSOR 
) ) 
 437        if ( ! wxWindowBase::SetCursor( cursor 
) ) 
 441   wxASSERT_MSG( m_cursor
.Ok(), 
 442                   wxT("cursor must be valid after call to the base version")); 
 445   wxWindowMac 
*mouseWin 
; 
 448   // Change the cursor NOW if we're within the correct window 
 450   if ( MacGetWindowFromPoint( wxPoint( pt
.h 
, pt
.v 
) , &mouseWin 
) ) 
 452     if ( mouseWin 
== this && !wxIsBusy() ) 
 454         m_cursor
.MacInstall() ; 
 462 // Get size *available for subwindows* i.e. excluding menu bar etc. 
 463 void wxWindowMac::DoGetClientSize(int *x
, int *y
) const 
 469     ww 
-= MacGetLeftBorderSize(  )  + MacGetRightBorderSize(  ) ; 
 470     hh 
-= MacGetTopBorderSize(  ) + MacGetBottomBorderSize( ); 
 472   if ( (m_vScrollBar 
&& m_vScrollBar
->IsShown()) || (m_hScrollBar  
&& m_hScrollBar
->IsShown()) ) 
 479     MacClientToRootWindow( &x1 
, &y1 
) ; 
 480     MacClientToRootWindow( &w 
, &h 
) ; 
 482     wxWindowMac 
*iter 
= (wxWindowMac
*)this ; 
 484     int totW 
= 10000 , totH 
= 10000; 
 487         if ( iter
->IsTopLevel() ) 
 489             totW 
= iter
->m_width 
; 
 490             totH 
= iter
->m_height 
; 
 494         iter 
= iter
->GetParent() ; 
 497     if (m_hScrollBar  
&& m_hScrollBar
->IsShown() ) 
 499         hh 
-= MAC_SCROLLBAR_SIZE
; 
 505     if (m_vScrollBar  
&& m_vScrollBar
->IsShown() ) 
 507         ww 
-= MAC_SCROLLBAR_SIZE
; 
 519 // ---------------------------------------------------------------------------- 
 521 // ---------------------------------------------------------------------------- 
 525 void wxWindowMac::DoSetToolTip(wxToolTip 
*tooltip
) 
 527     wxWindowBase::DoSetToolTip(tooltip
); 
 530         m_tooltip
->SetWindow(this); 
 533 #endif // wxUSE_TOOLTIPS 
 535 void wxWindowMac::DoMoveWindow(int x
, int y
, int width
, int height
) 
 539     int former_w 
= m_width 
; 
 540     int former_h 
= m_height 
; 
 542   int actualWidth 
= width
; 
 543   int actualHeight 
= height
; 
 547     if ((m_minWidth 
!= -1) && (actualWidth 
< m_minWidth
))  
 548         actualWidth 
= m_minWidth
; 
 549     if ((m_minHeight 
!= -1) && (actualHeight 
< m_minHeight
))  
 550         actualHeight 
= m_minHeight
; 
 551     if ((m_maxWidth 
!= -1) && (actualWidth 
> m_maxWidth
))  
 552         actualWidth 
= m_maxWidth
; 
 553     if ((m_maxHeight 
!= -1) && (actualHeight 
> m_maxHeight
))  
 554         actualHeight 
= m_maxHeight
; 
 556     bool doMove 
= false ; 
 557     bool doResize 
= false ; 
 559     if ( actualX 
!= former_x 
|| actualY 
!= former_y 
) 
 563     if ( actualWidth 
!= former_w 
|| actualHeight 
!= former_h 
) 
 568     if ( doMove 
|| doResize 
) 
 570         // erase former position 
 576         m_width 
= actualWidth 
; 
 577         m_height 
= actualHeight 
; 
 579         // erase new position 
 583             wxWindowMac::MacSuperChangedPosition() ; // like this only children will be notified 
 585         MacRepositionScrollBars() ; 
 588             wxPoint 
point(m_x
, m_y
); 
 589             wxMoveEvent 
event(point
, m_windowId
); 
 590             event
.SetEventObject(this); 
 591             GetEventHandler()->ProcessEvent(event
) ; 
 595              MacRepositionScrollBars() ; 
 596              wxSize 
size(m_width
, m_height
); 
 597              wxSizeEvent 
event(size
, m_windowId
); 
 598              event
.SetEventObject(this); 
 599              GetEventHandler()->ProcessEvent(event
); 
 605 // set the size of the window: if the dimensions are positive, just use them, 
 606 // but if any of them is equal to -1, it means that we must find the value for 
 607 // it ourselves (unless sizeFlags contains wxSIZE_ALLOW_MINUS_ONE flag, in 
 608 // which case -1 is a valid value for x and y) 
 610 // If sizeFlags contains wxSIZE_AUTO_WIDTH/HEIGHT flags (default), we calculate 
 611 // the width/height to best suit our contents, otherwise we reuse the current 
 613 void wxWindowMac::DoSetSize(int x
, int y
, int width
, int height
, int sizeFlags
) 
 615     // get the current size and position... 
 616     int currentX
, currentY
; 
 617     GetPosition(¤tX
, ¤tY
); 
 619     int currentW
,currentH
; 
 620     GetSize(¤tW
, ¤tH
); 
 622     // ... and don't do anything (avoiding flicker) if it's already ok 
 623     if ( x 
== currentX 
&& y 
== currentY 
&& 
 624          width 
== currentW 
&& height 
== currentH 
) 
 626         MacRepositionScrollBars() ; // we might have a real position shift 
 630     if ( x 
== -1 && !(sizeFlags 
& wxSIZE_ALLOW_MINUS_ONE
) ) 
 632     if ( y 
== -1 && !(sizeFlags 
& wxSIZE_ALLOW_MINUS_ONE
) ) 
 635     AdjustForParentClientOrigin(x
, y
, sizeFlags
); 
 640         if ( sizeFlags 
& wxSIZE_AUTO_WIDTH 
) 
 642             size 
= DoGetBestSize(); 
 647             // just take the current one 
 654         if ( sizeFlags 
& wxSIZE_AUTO_HEIGHT 
) 
 658                 size 
= DoGetBestSize(); 
 660             //else: already called DoGetBestSize() above 
 666             // just take the current one 
 671     DoMoveWindow(x
, y
, width
, height
); 
 674 // For implementation purposes - sometimes decorations make the client area 
 677 wxPoint 
wxWindowMac::GetClientAreaOrigin() const 
 679     return wxPoint(MacGetLeftBorderSize(  ) , MacGetTopBorderSize(  ) ); 
 682 void wxWindowMac::SetTitle(const wxString
& title
) 
 687 wxString 
wxWindowMac::GetTitle() const 
 692 bool wxWindowMac::Show(bool show
) 
 694     if ( !wxWindowBase::Show(show
) ) 
 698     WindowRef window = (WindowRef) MacGetRootWindow() ; 
 699     wxWindowMac* win = wxFindWinFromMacWindow( window ) ; 
 700     if ( win == NULL && win->m_isBeingDeleted ) 
 703     MacSuperShown( show 
) ; 
 708         if ( win && !win->m_isBeingDeleted ) 
 719 void wxWindowMac::MacSuperShown( bool show 
)  
 721     wxNode 
*node 
= GetChildren().First(); 
 724         wxWindowMac 
*child 
= (wxWindowMac 
*)node
->Data(); 
 725         if ( child
->m_isShown 
) 
 726             child
->MacSuperShown( show 
) ; 
 731 void wxWindowMac::MacSuperEnabled( bool enabled 
)  
 735       // to be absolutely correct we'd have to invalidate (with eraseBkground  
 736       // because unter MacOSX the frames are drawn with an addXXX mode) 
 739     wxNode 
*node 
= GetChildren().First(); 
 742         wxWindowMac 
*child 
= (wxWindowMac 
*)node
->Data(); 
 743         if ( child
->m_isShown 
) 
 744             child
->MacSuperEnabled( enabled 
) ; 
 749 bool wxWindowMac::MacIsReallyShown() const  
 751     if ( m_isShown 
&& (m_parent 
!= NULL
) ) { 
 752         return m_parent
->MacIsReallyShown(); 
 756     bool status = m_isShown ; 
 757     wxWindowMac * win = this ; 
 758     while ( status && win->m_parent != NULL ) 
 760         win = win->m_parent ; 
 761         status = win->m_isShown ; 
 767 int wxWindowMac::GetCharHeight() const 
 769     wxClientDC 
dc ( (wxWindowMac
*)this ) ; 
 770     return dc
.GetCharHeight() ; 
 773 int wxWindowMac::GetCharWidth() const 
 775     wxClientDC 
dc ( (wxWindowMac
*)this ) ; 
 776     return dc
.GetCharWidth() ; 
 779 void wxWindowMac::GetTextExtent(const wxString
& string
, int *x
, int *y
, 
 780                            int *descent
, int *externalLeading
, const wxFont 
*theFont 
) const 
 782     const wxFont 
*fontToUse 
= theFont
; 
 786     wxClientDC 
dc( (wxWindowMac
*) this ) ; 
 788     dc
.GetTextExtent( string 
, &lx 
, &ly 
, &ld
, &le
, (wxFont 
*)fontToUse 
) ; 
 789     if ( externalLeading 
) 
 790         *externalLeading 
= le 
; 
 800  * Rect is given in client coordinates, for further reading, read wxTopLevelWindowMac::InvalidateRect  
 801  * we always intersect with the entire window, not only with the client area 
 804 void wxWindowMac::Refresh(bool eraseBack
, const wxRect 
*rect
) 
 806     if ( MacGetTopLevelWindow() == NULL 
) 
 809     wxPoint client 
= GetClientAreaOrigin(); 
 812     int x2 
= m_width 
- client
.x
; 
 813     int y2 
= m_height 
- client
.y
; 
 815     if (IsKindOf( CLASSINFO(wxButton
))) 
 817         // buttons have an "aura" 
 824     Rect clientrect 
= { y1
, x1
, y2
, x2 
}; 
 828         Rect r 
= { rect
->y 
, rect
->x 
, rect
->y 
+ rect
->height 
, rect
->x 
+ rect
->width 
} ; 
 829         SectRect( &clientrect 
, &r 
, &clientrect 
) ;         
 832     if ( !EmptyRect( &clientrect 
) ) 
 834       int top 
= 0 , left 
= 0 ; 
 836       MacClientToRootWindow( &left 
, &top 
) ; 
 837       OffsetRect( &clientrect 
, left 
, top 
) ; 
 839       MacGetTopLevelWindow()->MacInvalidate( &clientrect 
, eraseBack 
) ; 
 843 #if wxUSE_CARET && WXWIN_COMPATIBILITY 
 844 // --------------------------------------------------------------------------- 
 845 // Caret manipulation 
 846 // --------------------------------------------------------------------------- 
 848 void wxWindowMac::CreateCaret(int w
, int h
) 
 850     SetCaret(new wxCaret(this, w
, h
)); 
 853 void wxWindowMac::CreateCaret(const wxBitmap 
*WXUNUSED(bitmap
)) 
 855     wxFAIL_MSG("not implemented"); 
 858 void wxWindowMac::ShowCaret(bool show
) 
 860     wxCHECK_RET( m_caret
, "no caret to show" ); 
 865 void wxWindowMac::DestroyCaret() 
 870 void wxWindowMac::SetCaretPos(int x
, int y
) 
 872     wxCHECK_RET( m_caret
, "no caret to move" ); 
 877 void wxWindowMac::GetCaretPos(int *x
, int *y
) const 
 879     wxCHECK_RET( m_caret
, "no caret to get position of" ); 
 881     m_caret
->GetPosition(x
, y
); 
 883 #endif // wxUSE_CARET 
 885 wxWindowMac 
*wxGetActiveWindow() 
 887     // actually this is a windows-only concept 
 891 // Coordinates relative to the window 
 892 void wxWindowMac::WarpPointer (int x_pos
, int y_pos
) 
 894     // We really dont move the mouse programmatically under mac 
 897 const wxBrush
& wxWindowMac::MacGetBackgroundBrush()  
 899     if ( m_backgroundColour 
== wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE
) ) 
 901         m_macBackgroundBrush
.SetMacTheme( kThemeBrushDocumentWindowBackground 
) ; 
 903     else if (  m_backgroundColour 
== wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE 
) ) 
 905         // on mac we have the difficult situation, that 3dface gray can be different colours, depending whether 
 906         // it is on a notebook panel or not, in order to take care of that we walk up the hierarchy until we have 
 907         // either a non gray background color or a non control window 
 909             WindowRef window 
= (WindowRef
) MacGetRootWindow() ; 
 911             wxWindowMac
* parent 
= GetParent() ; 
 914                 if ( parent
->MacGetRootWindow() != window 
) 
 916                     // we are in a different window on the mac system 
 922                     if ( parent
->m_backgroundColour 
!= wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE 
)  
 923                       && parent
->m_backgroundColour 
!= wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE
) ) 
 925                         // if we have any other colours in the hierarchy 
 926                         m_macBackgroundBrush
.SetColour( parent
->m_backgroundColour 
) ; 
 929                     // if we have the normal colours in the hierarchy but another control etc. -> use it's background 
 930                     if ( parent
->IsKindOf( CLASSINFO( wxNotebook 
) ) || parent
->IsKindOf( CLASSINFO( wxTabCtrl 
) )) 
 932                         Rect extent 
= { 0 , 0 , 0 , 0 } ; 
 935                         wxSize size 
= parent
->GetSize() ; 
 936                         parent
->MacClientToRootWindow( &x 
, &y 
) ; 
 940                         extent
.right 
= x 
+ size
.x 
; 
 941                         extent
.bottom 
= y 
+ size
.y 
; 
 942                         m_macBackgroundBrush
.SetMacThemeBackground( kThemeBackgroundTabPane 
, (WXRECTPTR
) &extent 
) ; // todo eventually change for inactive 
 946                 parent 
= parent
->GetParent() ; 
 950               m_macBackgroundBrush
.SetMacTheme( kThemeBrushDialogBackgroundActive 
) ; // todo eventually change for inactive 
 955         m_macBackgroundBrush
.SetColour( m_backgroundColour 
) ; 
 958     return m_macBackgroundBrush 
; 
 962 void wxWindowMac::OnEraseBackground(wxEraseEvent
& event
) 
 964     event
.GetDC()->Clear() ; 
 967 void wxWindowMac::OnNcPaint( wxNcPaintEvent
& event 
) 
 969     wxWindowDC 
dc(this) ; 
 970     wxMacPortSetter 
helper(&dc
) ; 
 972     MacPaintBorders( dc
.m_macLocalOrigin
.x 
, dc
.m_macLocalOrigin
.y
) ; 
 975 int wxWindowMac::GetScrollPos(int orient
) const 
 977     if ( orient 
== wxHORIZONTAL 
) 
 980            return m_hScrollBar
->GetThumbPosition() ; 
 985            return m_vScrollBar
->GetThumbPosition() ; 
 990 // This now returns the whole range, not just the number 
 991 // of positions that we can scroll. 
 992 int wxWindowMac::GetScrollRange(int orient
) const 
 994     if ( orient 
== wxHORIZONTAL 
) 
 997            return m_hScrollBar
->GetRange() ; 
1002            return m_vScrollBar
->GetRange() ; 
1007 int wxWindowMac::GetScrollThumb(int orient
) const 
1009     if ( orient 
== wxHORIZONTAL 
) 
1012            return m_hScrollBar
->GetThumbSize() ; 
1017            return m_vScrollBar
->GetThumbSize() ; 
1022 void wxWindowMac::SetScrollPos(int orient
, int pos
, bool refresh
) 
1024     if ( orient 
== wxHORIZONTAL 
) 
1027            m_hScrollBar
->SetThumbPosition( pos 
) ; 
1032            m_vScrollBar
->SetThumbPosition( pos 
) ; 
1036 void wxWindowMac::MacPaintBorders( int left 
, int top 
)  
1041     RGBColor white 
= { 0xFFFF, 0xFFFF , 0xFFFF } ; 
1042     RGBColor black 
= { 0x0000, 0x0000 , 0x0000 } ; 
1043     RGBColor face 
= { 0xDDDD, 0xDDDD , 0xDDDD } ; 
1044     RGBColor shadow 
= { 0x4444, 0x4444 , 0x4444 } ; 
1047     if (HasFlag(wxRAISED_BORDER
) || HasFlag( wxSUNKEN_BORDER
) || HasFlag(wxDOUBLE_BORDER
) ) 
1049 #if wxMAC_USE_THEME_BORDER 
1050           Rect rect 
= { top 
, left 
, m_height 
+ top 
, m_width 
+ left 
} ; 
1053           GetThemeMetric( kThemeMetricListBoxFrameOutset , &border ) ; 
1054           InsetRect( &rect , border , border ); 
1055       DrawThemeListBoxFrame(&rect,IsEnabled() ? kThemeStateActive : kThemeStateInactive) ; 
1058         DrawThemePrimaryGroup(&rect  
,IsEnabled() ? kThemeStateActive 
: kThemeStateInactive
) ; 
1060         bool sunken 
= HasFlag( wxSUNKEN_BORDER 
) ; 
1061         RGBForeColor( &face 
); 
1062         MoveTo( left 
+ 0 , top 
+ m_height 
- 2 ); 
1063         LineTo( left 
+ 0 , top 
+ 0 ); 
1064         LineTo( left 
+ m_width 
- 2 , top 
+ 0 ); 
1066         MoveTo( left 
+ 2 , top 
+ m_height 
- 3 ); 
1067         LineTo( left 
+ m_width 
- 3 , top 
+ m_height 
- 3 ); 
1068         LineTo( left 
+ m_width 
- 3 , top 
+ 2 ); 
1070         RGBForeColor( sunken 
? &face 
: &black 
); 
1071         MoveTo( left 
+ 0 , top 
+ m_height 
- 1 ); 
1072         LineTo( left 
+ m_width 
- 1 , top 
+ m_height 
- 1 ); 
1073         LineTo( left 
+ m_width 
- 1 , top 
+ 0 ); 
1075         RGBForeColor( sunken 
? &shadow 
: &white 
); 
1076         MoveTo( left 
+ 1 , top 
+ m_height 
- 3 ); 
1077         LineTo( left 
+ 1, top 
+ 1 ); 
1078         LineTo( left 
+ m_width 
- 3 , top 
+ 1 ); 
1080         RGBForeColor( sunken 
? &white 
: &shadow 
); 
1081         MoveTo( left 
+ 1 , top 
+ m_height 
- 2 ); 
1082         LineTo( left 
+ m_width 
- 2 , top 
+ m_height 
- 2 ); 
1083         LineTo( left 
+ m_width 
- 2 , top 
+ 1 ); 
1085         RGBForeColor( sunken 
? &black 
: &face 
); 
1086         MoveTo( left 
+ 2 , top 
+ m_height 
- 4 ); 
1087         LineTo( left 
+ 2 , top 
+ 2 ); 
1088         LineTo( left 
+ m_width 
- 4 , top 
+ 2 ); 
1091     else if (HasFlag(wxSIMPLE_BORDER
)) 
1093             Rect rect 
= { top 
, left 
, m_height 
+ top 
, m_width 
+ left 
} ; 
1094         RGBForeColor( &black 
) ; 
1095         FrameRect( &rect 
) ; 
1099 void wxWindowMac::RemoveChild( wxWindowBase 
*child 
) 
1101     if ( child 
== m_hScrollBar 
) 
1102         m_hScrollBar 
= NULL 
; 
1103     if ( child 
== m_vScrollBar 
) 
1104         m_vScrollBar 
= NULL 
; 
1106     wxWindowBase::RemoveChild( child 
) ; 
1109 // New function that will replace some of the above. 
1110 void wxWindowMac::SetScrollbar(int orient
, int pos
, int thumbVisible
, 
1111     int range
, bool refresh
) 
1113         if ( orient 
== wxHORIZONTAL 
) 
1117                 if ( range 
== 0 || thumbVisible 
>= range 
) 
1119                     if ( m_hScrollBar
->IsShown() ) 
1120                         m_hScrollBar
->Show(false) ; 
1124                     if ( !m_hScrollBar
->IsShown() ) 
1125                         m_hScrollBar
->Show(true) ; 
1126                     m_hScrollBar
->SetScrollbar( pos 
, thumbVisible 
, range 
, thumbVisible 
, refresh 
) ; 
1134                 if ( range 
== 0 || thumbVisible 
>= range 
) 
1136                     if ( m_vScrollBar
->IsShown() ) 
1137                         m_vScrollBar
->Show(false) ; 
1141                     if ( !m_vScrollBar
->IsShown() ) 
1142                         m_vScrollBar
->Show(true) ; 
1143                     m_vScrollBar
->SetScrollbar( pos 
, thumbVisible 
, range 
, thumbVisible 
, refresh 
) ; 
1147         MacRepositionScrollBars() ; 
1150 // Does a physical scroll 
1151 void wxWindowMac::ScrollWindow(int dx
, int dy
, const wxRect 
*rect
) 
1153     wxClientDC 
dc(this) ; 
1154     wxMacPortSetter 
helper(&dc
) ; 
1157         int width 
, height 
; 
1158         GetClientSize( &width 
, &height 
) ; 
1160         Rect scrollrect 
= { dc
.YLOG2DEVMAC(0) , dc
.XLOG2DEVMAC(0) , dc
.YLOG2DEVMAC(height
) , dc
.XLOG2DEVMAC(width
) } ; 
1161         RgnHandle updateRgn 
= NewRgn() ; 
1162         ClipRect( &scrollrect 
) ; 
1165             Rect r 
= { dc
.YLOG2DEVMAC(rect
->y
) , dc
.XLOG2DEVMAC(rect
->x
) , dc
.YLOG2DEVMAC(rect
->y 
+ rect
->height
) ,  
1166               dc
.XLOG2DEVMAC(rect
->x 
+ rect
->width
) } ; 
1167             SectRect( &scrollrect 
, &r 
, &scrollrect 
) ;         
1169         ScrollRect( &scrollrect 
, dx 
, dy 
, updateRgn 
) ; 
1170         InvalWindowRgn( (WindowRef
) MacGetRootWindow() ,  updateRgn 
) ; 
1171         DisposeRgn( updateRgn 
) ; 
1174     for (wxNode 
*node 
= GetChildren().First(); node
; node 
= node
->Next()) 
1176         wxWindowMac 
*child 
= (wxWindowMac
*)node
->Data(); 
1177         if (child 
== m_vScrollBar
) continue; 
1178         if (child 
== m_hScrollBar
) continue; 
1179         if (child
->IsTopLevel()) continue; 
1181         child
->GetPosition( &x
, &y 
); 
1183         child
->GetSize( &w
, &h 
); 
1184         child
->SetSize( x
+dx
, y
+dy
, w
, h 
); 
1189 void wxWindowMac::MacOnScroll(wxScrollEvent 
&event 
) 
1191     if ( event
.m_eventObject 
== m_vScrollBar 
|| event
.m_eventObject 
== m_hScrollBar 
) 
1193         wxScrollWinEvent wevent
; 
1194         wevent
.SetPosition(event
.GetPosition()); 
1195         wevent
.SetOrientation(event
.GetOrientation()); 
1196         wevent
.m_eventObject 
= this; 
1198         if (event
.m_eventType 
== wxEVT_SCROLL_TOP
) { 
1199             wevent
.m_eventType 
= wxEVT_SCROLLWIN_TOP
; 
1201         if (event
.m_eventType 
== wxEVT_SCROLL_BOTTOM
) { 
1202             wevent
.m_eventType 
= wxEVT_SCROLLWIN_BOTTOM
; 
1204         if (event
.m_eventType 
== wxEVT_SCROLL_LINEUP
) { 
1205             wevent
.m_eventType 
= wxEVT_SCROLLWIN_LINEUP
; 
1207         if (event
.m_eventType 
== wxEVT_SCROLL_LINEDOWN
) { 
1208             wevent
.m_eventType 
= wxEVT_SCROLLWIN_LINEDOWN
; 
1210         if (event
.m_eventType 
== wxEVT_SCROLL_PAGEUP
) { 
1211             wevent
.m_eventType 
= wxEVT_SCROLLWIN_PAGEUP
; 
1213         if (event
.m_eventType 
== wxEVT_SCROLL_PAGEDOWN
) { 
1214             wevent
.m_eventType 
= wxEVT_SCROLLWIN_PAGEDOWN
; 
1216         if (event
.m_eventType 
== wxEVT_SCROLL_THUMBTRACK
) { 
1217             wevent
.m_eventType 
= wxEVT_SCROLLWIN_THUMBTRACK
; 
1220         GetEventHandler()->ProcessEvent(wevent
); 
1224 // Get the window with the focus 
1225 wxWindowMac 
*wxWindowBase::FindFocus() 
1227     return gFocusWindow 
; 
1230 #if WXWIN_COMPATIBILITY 
1231 // If nothing defined for this, try the parent. 
1232 // E.g. we may be a button loaded from a resource, with no callback function 
1234 void wxWindowMac::OnCommand(wxWindowMac
& win
, wxCommandEvent
& event
) 
1236     if ( GetEventHandler()->ProcessEvent(event
)  ) 
1239         m_parent
->GetEventHandler()->OnCommand(win
, event
); 
1241 #endif // WXWIN_COMPATIBILITY_2 
1243 #if WXWIN_COMPATIBILITY 
1244 wxObject
* wxWindowMac::GetChild(int number
) const 
1246     // Return a pointer to the Nth object in the Panel 
1247     wxNode 
*node 
= GetChildren().First(); 
1250         node 
= node
->Next(); 
1253         wxObject 
*obj 
= (wxObject 
*)node
->Data(); 
1259 #endif // WXWIN_COMPATIBILITY 
1261 void wxWindowMac::OnSetFocus(wxFocusEvent
& event
) 
1263     // panel wants to track the window which was the last to have focus in it, 
1264     // so we want to set ourselves as the window which last had focus 
1266     // notice that it's also important to do it upwards the tree becaus 
1267     // otherwise when the top level panel gets focus, it won't set it back to 
1268     // us, but to some other sibling 
1270     // CS:don't know if this is still needed: 
1271     //wxChildFocusEvent eventFocus(this); 
1272     //(void)GetEventHandler()->ProcessEvent(eventFocus); 
1277 void wxWindowMac::Clear() 
1279     wxClientDC 
dc(this); 
1280     wxBrush 
brush(GetBackgroundColour(), wxSOLID
); 
1281     dc
.SetBackground(brush
); 
1285 // Setup background and foreground colours correctly 
1286 void wxWindowMac::SetupColours() 
1289         SetBackgroundColour(GetParent()->GetBackgroundColour()); 
1292 void wxWindowMac::OnIdle(wxIdleEvent
& event
) 
1295    // Check if we need to send a LEAVE event 
1296    if (m_mouseInWindow) 
1299        ::GetCursorPos(&pt); 
1300        if (::WindowFromPoint(pt) != (HWND) GetHWND()) 
1302            // Generate a LEAVE event 
1303            m_mouseInWindow = FALSE; 
1304            MSWOnMouseLeave(pt.x, pt.y, 0); 
1309     // This calls the UI-update mechanism (querying windows for 
1310     // menu/toolbar/control state information) 
1314 // Raise the window to the top of the Z order 
1315 void wxWindowMac::Raise() 
1319 // Lower the window to the bottom of the Z order 
1320 void wxWindowMac::Lower() 
1324 void wxWindowMac::DoSetClientSize(int width
, int height
) 
1326     if ( width 
!= -1 || height 
!= -1 ) 
1329         if ( width 
!= -1 && m_vScrollBar 
) 
1330             width 
+= MAC_SCROLLBAR_SIZE 
; 
1331         if ( height 
!= -1 && m_vScrollBar 
) 
1332             height 
+= MAC_SCROLLBAR_SIZE 
; 
1334         width 
+= MacGetLeftBorderSize(  ) + MacGetRightBorderSize( ) ; 
1335         height 
+= MacGetTopBorderSize(  ) + MacGetBottomBorderSize( ) ; 
1337         DoSetSize( -1 , -1 , width 
, height 
) ; 
1342 wxWindowMac
* wxWindowMac::s_lastMouseWindow 
= NULL 
; 
1344 bool wxWindowMac::MacGetWindowFromPointSub( const wxPoint 
&point 
, wxWindowMac
** outWin 
)  
1348       if ((point
.x 
< 0) || (point
.y 
< 0) || 
1349           (point
.x 
> (m_width
)) || (point
.y 
> (m_height
))) 
1354       if ((point
.x 
< m_x
) || (point
.y 
< m_y
) || 
1355           (point
.x 
> (m_x 
+ m_width
)) || (point
.y 
> (m_y 
+ m_height
))) 
1359     WindowRef window 
= (WindowRef
) MacGetRootWindow() ; 
1361     wxPoint 
newPoint( point 
) ; 
1363     if ( !IsTopLevel() ) 
1369     for (wxNode 
*node 
= GetChildren().First(); node
; node 
= node
->Next()) 
1371         wxWindowMac 
*child 
= (wxWindowMac
*)node
->Data(); 
1372         // added the m_isShown test --dmazzoni 
1373         if ( child
->MacGetRootWindow() == window 
&& child
->m_isShown 
) 
1375             if (child
->MacGetWindowFromPointSub(newPoint 
, outWin 
)) 
1384 bool wxWindowMac::MacGetWindowFromPoint( const wxPoint 
&screenpoint 
, wxWindowMac
** outWin 
)  
1388     Point pt 
= { screenpoint
.y 
, screenpoint
.x 
} ; 
1389     if ( ::FindWindow( pt 
, &window 
) == 3 ) 
1392         wxWindowMac
* win 
= wxFindWinFromMacWindow( window 
) ; 
1395             // No, this yields the CLIENT are, we need the whole frame. RR. 
1396             // point = win->ScreenToClient( point ) ; 
1399             ::GetPort( &port 
) ; 
1400             ::SetPort( UMAGetWindowPort( window 
) ) ; 
1401             ::GlobalToLocal( &pt 
) ; 
1404             wxPoint 
point( pt
.h
, pt
.v 
) ; 
1406             return win
->MacGetWindowFromPointSub( point 
, outWin 
) ; 
1412 extern int wxBusyCursorCount 
; 
1413 static wxWindow 
*gs_lastWhich 
= NULL
; 
1415 bool wxWindowMac::MacDispatchMouseEvent(wxMouseEvent
& event
) 
1417     if ((event
.m_x 
< m_x
) || (event
.m_y 
< m_y
) || 
1418         (event
.m_x 
> (m_x 
+ m_width
)) || (event
.m_y 
> (m_y 
+ m_height
))) 
1422     if ( IsKindOf( CLASSINFO ( wxStaticBox 
) ) || IsKindOf( CLASSINFO( wxSpinCtrl 
) )) 
1425     WindowRef window 
= (WindowRef
) MacGetRootWindow() ; 
1433     for (wxNode 
*node 
= GetChildren().First(); node
; node 
= node
->Next()) 
1435         wxWindowMac 
*child 
= (wxWindowMac
*)node
->Data(); 
1436         if ( child
->MacGetRootWindow() == window 
&& child
->IsShown() && child
->IsEnabled() ) 
1438             if (child
->MacDispatchMouseEvent(event
)) 
1445     event
.SetEventObject( this ) ; 
1447     if ( wxBusyCursorCount 
== 0 ) 
1449         m_cursor
.MacInstall() ; 
1452     if ( event
.GetEventType() == wxEVT_LEFT_DOWN 
) 
1454         // set focus to this window 
1455         if (AcceptsFocus() && FindFocus()!=this) 
1460     if ( event
.GetEventType() == wxEVT_MOTION 
 
1461             || event
.GetEventType() == wxEVT_ENTER_WINDOW
 
1462             || event
.GetEventType() == wxEVT_LEAVE_WINDOW 
) 
1463         wxToolTip::RelayEvent( this , event
); 
1464 #endif // wxUSE_TOOLTIPS 
1466     if (gs_lastWhich 
!= this) 
1468         gs_lastWhich 
= this; 
1470         // Double clicks must always occur on the same window 
1471         if (event
.GetEventType() == wxEVT_LEFT_DCLICK
) 
1472             event
.SetEventType( wxEVT_LEFT_DOWN 
); 
1473         if (event
.GetEventType() == wxEVT_RIGHT_DCLICK
) 
1474             event
.SetEventType( wxEVT_RIGHT_DOWN 
); 
1476         // Same for mouse up events 
1477         if (event
.GetEventType() == wxEVT_LEFT_UP
) 
1479         if (event
.GetEventType() == wxEVT_RIGHT_UP
) 
1483     GetEventHandler()->ProcessEvent( event 
) ; 
1488 wxString 
wxWindowMac::MacGetToolTipString( wxPoint 
&pt 
) 
1492         return m_tooltip
->GetTip() ; 
1497 void wxWindowMac::Update() 
1499     wxTopLevelWindowMac
* win 
= MacGetTopLevelWindow(  ) ; 
1502       win
->MacUpdate( 0 ) ; 
1503 #if TARGET_API_MAC_CARBON 
1504         if ( QDIsPortBuffered( GetWindowPort( (WindowRef
) win
->MacGetWindowRef() ) ) ) 
1506                 QDFlushPortBuffer( GetWindowPort( (WindowRef
) win
->MacGetWindowRef() ) , NULL 
) ; 
1512 wxTopLevelWindowMac
* wxWindowMac::MacGetTopLevelWindow() const  
1514     wxTopLevelWindowMac
* win 
= NULL 
; 
1515     WindowRef window 
= (WindowRef
) MacGetRootWindow() ; 
1518         win 
= wxFindWinFromMacWindow( window 
) ; 
1523 const wxRegion
& wxWindowMac::MacGetVisibleRegion() 
1525   RgnHandle visRgn 
= NewRgn() ; 
1526   RgnHandle tempRgn 
= NewRgn() ; 
1528   SetRectRgn( visRgn 
, 0 , 0 , m_width 
, m_height 
) ; 
1530   //TODO : as soon as the new scheme has proven to work correctly, move this to wxStaticBox 
1531   if ( IsKindOf( CLASSINFO( wxStaticBox 
) ) ) 
1533     int borderTop 
= 14 ; 
1534     int borderOther 
= 4 ; 
1536     SetRectRgn( tempRgn 
, borderOther 
, borderTop 
, m_width 
- borderOther 
, m_height 
- borderOther 
) ; 
1537     DiffRgn( visRgn 
, tempRgn 
, visRgn 
) ; 
1540   if ( !IsTopLevel() ) 
1542     wxWindow
* parent 
= GetParent() ; 
1545       wxSize size 
= parent
->GetSize() ; 
1548       parent
->MacWindowToRootWindow( &x
, &y 
) ; 
1549       MacRootWindowToWindow( &x 
, &y 
) ; 
1550       SetRectRgn( tempRgn 
, x 
, y 
, x 
+ size
.x 
, y 
+ size
.y 
) ; 
1551       SectRgn( visRgn 
, tempRgn 
, visRgn 
) ; 
1552       if ( parent
->IsTopLevel() ) 
1554       parent 
= parent
->GetParent() ; 
1557   if ( GetWindowStyle() & wxCLIP_CHILDREN 
) 
1559     for (wxNode 
*node 
= GetChildren().First(); node
; node 
= node
->Next()) 
1561         wxWindowMac 
*child 
= (wxWindowMac
*)node
->Data(); 
1563         if ( !child
->IsTopLevel() && child
->IsShown() ) 
1565             SetRectRgn( tempRgn 
, child
->m_x 
, child
->m_y 
, child
->m_x 
+ child
->m_width 
,  child
->m_y 
+ child
->m_height 
) ; 
1566             DiffRgn( visRgn 
, tempRgn 
, visRgn 
) ; 
1571   if ( (GetWindowStyle() & wxCLIP_SIBLINGS
) && GetParent() ) 
1573     bool thisWindowThrough 
= false ; 
1574     for (wxNode 
*node 
= GetParent()->GetChildren().First(); node
; node 
= node
->Next()) 
1576         wxWindowMac 
*sibling 
= (wxWindowMac
*)node
->Data(); 
1577         if ( sibling 
== this ) 
1579           thisWindowThrough 
= true ; 
1582         if( !thisWindowThrough 
) 
1587         if ( !sibling
->IsTopLevel() && sibling
->IsShown() ) 
1589             SetRectRgn( tempRgn 
, sibling
->m_x 
- m_x 
, sibling
->m_y 
- m_y 
, sibling
->m_x 
+ sibling
->m_width 
- m_x 
,  sibling
->m_y 
+ sibling
->m_height 
- m_y 
) ; 
1590             DiffRgn( visRgn 
, tempRgn 
, visRgn 
) ; 
1594   m_macVisibleRegion 
= visRgn 
; 
1595   DisposeRgn( visRgn 
) ; 
1596   DisposeRgn( tempRgn 
) ; 
1597   return m_macVisibleRegion 
; 
1600 void wxWindowMac::MacRedraw( WXHRGN updatergnr 
, long time
, bool erase
) 
1602     RgnHandle updatergn 
= (RgnHandle
) updatergnr 
; 
1603     // updatergn is always already clipped to our boundaries 
1604     // it is in window coordinates, not in client coordinates 
1606     WindowRef window 
= (WindowRef
) MacGetRootWindow() ; 
1609         // ownUpdateRgn is the area that this window has to repaint, it is in window coordinates 
1610         RgnHandle ownUpdateRgn 
= NewRgn() ; 
1611         CopyRgn( updatergn 
, ownUpdateRgn 
) ; 
1613         SectRgn( ownUpdateRgn 
, (RgnHandle
) MacGetVisibleRegion().GetWXHRGN() , ownUpdateRgn 
) ; 
1615         // newupdate is the update region in client coordinates 
1616         RgnHandle newupdate 
= NewRgn() ; 
1617         wxSize point 
= GetClientSize() ; 
1618         wxPoint origin 
= GetClientAreaOrigin() ; 
1619         SetRectRgn( newupdate 
, origin
.x 
, origin
.y 
, origin
.x 
+ point
.x 
, origin
.y
+point
.y 
) ; 
1620         SectRgn( newupdate 
, ownUpdateRgn 
, newupdate 
) ; 
1621         OffsetRgn( newupdate 
, -origin
.x 
, -origin
.y 
) ; 
1622         m_updateRegion 
= newupdate 
; 
1623         DisposeRgn( newupdate 
) ; // it's been cloned to m_updateRegion 
1625         if ( erase 
&& !EmptyRgn(ownUpdateRgn
) ) 
1627           wxWindowDC 
dc(this); 
1628           dc
.SetClippingRegion(wxRegion(ownUpdateRgn
)); 
1629           wxEraseEvent 
eevent( GetId(), &dc 
); 
1630           eevent
.SetEventObject( this ); 
1631           GetEventHandler()->ProcessEvent( eevent 
); 
1633           wxNcPaintEvent 
eventNc( GetId() ); 
1634           eventNc
.SetEventObject( this ); 
1635           GetEventHandler()->ProcessEvent( eventNc 
); 
1637         DisposeRgn( ownUpdateRgn 
) ;  
1638         if ( !m_updateRegion
.Empty() ) 
1641           event
.m_timeStamp 
= time 
; 
1642           event
.SetEventObject(this); 
1643           GetEventHandler()->ProcessEvent(event
);  
1647     // now intersect for each of the children their rect with the updateRgn and call MacRedraw recursively 
1649     RgnHandle childupdate 
= NewRgn() ;             
1650     for (wxNode 
*node 
= GetChildren().First(); node
; node 
= node
->Next()) 
1652         // calculate the update region for the child windows by intersecting the window rectangle with our own 
1653         // passed in update region and then offset it to be client-wise window coordinates again 
1654         wxWindowMac 
*child 
= (wxWindowMac
*)node
->Data(); 
1655         SetRectRgn( childupdate 
, child
->m_x 
, child
->m_y 
, child
->m_x 
+ child
->m_width 
,  child
->m_y 
+ child
->m_height 
) ; 
1656         SectRgn( childupdate 
, updatergn 
, childupdate 
) ; 
1657         OffsetRgn( childupdate 
, -child
->m_x 
, -child
->m_y 
) ; 
1658         if ( child
->MacGetRootWindow() == window 
&& child
->IsShown() && !EmptyRgn( childupdate 
) ) 
1660             // because dialogs may also be children 
1661             child
->MacRedraw( childupdate 
, time 
, erase 
) ; 
1664     DisposeRgn( childupdate 
) ; 
1665     // eventually a draw grow box here 
1669 WXHWND 
wxWindowMac::MacGetRootWindow() const 
1671     wxWindowMac 
*iter 
= (wxWindowMac
*)this ; 
1675         if ( iter
->IsTopLevel() ) 
1676             return ((wxTopLevelWindow
*)iter
)->MacGetWindowRef() ; 
1678         iter 
= iter
->GetParent() ; 
1680     wxASSERT_MSG( 1 , "No valid mac root window" ) ; 
1684 void wxWindowMac::MacCreateScrollBars( long style 
)  
1686     wxASSERT_MSG( m_vScrollBar 
== NULL 
&& m_hScrollBar 
== NULL 
, "attempt to create window twice" ) ; 
1688     bool hasBoth 
= ( style 
& wxVSCROLL 
) && ( style 
& wxHSCROLL 
) ; 
1689     int adjust 
= hasBoth 
? MAC_SCROLLBAR_SIZE 
- 1: 0 ; 
1691     GetClientSize( &width 
, &height 
) ; 
1693     wxPoint 
vPoint(width
-MAC_SCROLLBAR_SIZE
, 0) ; 
1694     wxSize 
vSize(MAC_SCROLLBAR_SIZE
, height 
- adjust
) ; 
1695     wxPoint 
hPoint(0 , height
-MAC_SCROLLBAR_SIZE 
) ; 
1696     wxSize 
hSize( width 
- adjust
, MAC_SCROLLBAR_SIZE
) ; 
1698     m_vScrollBar 
= new wxScrollBar(this, wxWINDOW_VSCROLL
, vPoint
,  
1699         vSize 
, wxVERTICAL
); 
1701     if ( style 
& wxVSCROLL 
) 
1707         m_vScrollBar
->Show(false) ; 
1709     m_hScrollBar 
= new wxScrollBar(this, wxWINDOW_HSCROLL
, hPoint
,  
1710         hSize 
, wxHORIZONTAL
); 
1711     if ( style  
& wxHSCROLL 
) 
1716         m_hScrollBar
->Show(false) ; 
1719     // because the create does not take into account the client area origin 
1720     MacRepositionScrollBars() ; // we might have a real position shift 
1723 void wxWindowMac::MacRepositionScrollBars() 
1725     bool hasBoth 
= ( m_hScrollBar 
&& m_hScrollBar
->IsShown()) && ( m_vScrollBar 
&& m_vScrollBar
->IsShown()) ; 
1726     int adjust 
= hasBoth 
? MAC_SCROLLBAR_SIZE 
- 1 : 0 ; 
1728     // get real client area 
1730     int width 
= m_width 
;  
1731     int height 
= m_height 
; 
1733     width 
-= MacGetLeftBorderSize() + MacGetRightBorderSize(); 
1734     height 
-= MacGetTopBorderSize() + MacGetBottomBorderSize(); 
1736     wxPoint 
vPoint(width
-MAC_SCROLLBAR_SIZE
, 0) ; 
1737     wxSize 
vSize(MAC_SCROLLBAR_SIZE
, height 
- adjust
) ; 
1738     wxPoint 
hPoint(0 , height
-MAC_SCROLLBAR_SIZE 
) ; 
1739     wxSize 
hSize( width 
- adjust
, MAC_SCROLLBAR_SIZE
) ; 
1746     MacClientToRootWindow( &x 
, &y 
) ; 
1747     MacClientToRootWindow( &w 
, &h 
) ; 
1749     wxWindowMac 
*iter 
= (wxWindowMac
*)this ; 
1751     int totW 
= 10000 , totH 
= 10000; 
1754         if ( iter
->IsTopLevel() ) 
1756             totW 
= iter
->m_width 
; 
1757             totH 
= iter
->m_height 
; 
1761         iter 
= iter
->GetParent() ; 
1789         m_vScrollBar
->SetSize( vPoint
.x 
, vPoint
.y
, vSize
.x
, vSize
.y 
, wxSIZE_ALLOW_MINUS_ONE
); 
1793         m_hScrollBar
->SetSize( hPoint
.x 
, hPoint
.y
, hSize
.x
, hSize
.y
, wxSIZE_ALLOW_MINUS_ONE
); 
1797 bool wxWindowMac::AcceptsFocus() const 
1799     return MacCanFocus() && wxWindowBase::AcceptsFocus(); 
1802 WXWidget 
wxWindowMac::MacGetContainerForEmbedding()  
1804     return GetParent()->MacGetContainerForEmbedding() ; 
1807 void wxWindowMac::MacSuperChangedPosition()  
1809     // only window-absolute structures have to be moved i.e. controls 
1811     wxNode 
*node 
= GetChildren().First(); 
1814         wxWindowMac 
*child 
= (wxWindowMac 
*)node
->Data(); 
1815         child
->MacSuperChangedPosition() ; 
1816         node 
= node
->Next(); 
1820 void wxWindowMac::MacTopLevelWindowChangedPosition()  
1822     // only screen-absolute structures have to be moved i.e. glcanvas 
1824     wxNode 
*node 
= GetChildren().First(); 
1827         wxWindowMac 
*child 
= (wxWindowMac 
*)node
->Data(); 
1828         child
->MacTopLevelWindowChangedPosition() ; 
1829         node 
= node
->Next(); 
1832 long wxWindowMac::MacGetLeftBorderSize( ) const 
1837     if (m_windowStyle 
& wxRAISED_BORDER 
|| m_windowStyle 
& wxSUNKEN_BORDER 
) 
1840 #if wxMAC_USE_THEME_BORDER 
1842           GetThemeMetric( kThemeMetricListBoxFrameOutset 
, &border 
) ; 
1847     else if (  m_windowStyle 
&wxDOUBLE_BORDER
) 
1850 #if wxMAC_USE_THEME_BORDER 
1852           GetThemeMetric( kThemeMetricListBoxFrameOutset 
, &border 
) ; 
1857     else if (m_windowStyle 
&wxSIMPLE_BORDER
) 
1864 long wxWindowMac::MacGetRightBorderSize( ) const 
1866     // they are all symmetric in mac themes 
1867     return MacGetLeftBorderSize() ; 
1870 long wxWindowMac::MacGetTopBorderSize( ) const 
1872     // they are all symmetric in mac themes 
1873     return MacGetLeftBorderSize() ; 
1876 long wxWindowMac::MacGetBottomBorderSize( ) const 
1878     // they are all symmetric in mac themes 
1879     return MacGetLeftBorderSize() ; 
1882 long wxWindowMac::MacRemoveBordersFromStyle( long style 
)  
1884     return style 
& ~( wxDOUBLE_BORDER 
| wxSUNKEN_BORDER 
| wxRAISED_BORDER 
| wxBORDER 
| wxSTATIC_BORDER 
) ; 
1887 // Find the wxWindowMac at the current mouse position, returning the mouse 
1889 wxWindowMac
* wxFindWindowAtPointer(wxPoint
& pt
) 
1891     pt 
= wxGetMousePosition(); 
1892     wxWindowMac
* found 
= wxFindWindowAtPoint(pt
); 
1896 // Get the current mouse position. 
1897 wxPoint 
wxGetMousePosition() 
1900     wxGetMousePosition(& x
, & y
); 
1901     return wxPoint(x
, y
);