1 ///////////////////////////////////////////////////////////////////////////// 
   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" 
  44 #define wxWINDOW_HSCROLL 5998 
  45 #define wxWINDOW_VSCROLL 5997 
  46 #define MAC_SCROLLBAR_SIZE 16 
  48 #include <wx/mac/uma.h> 
  50 #if  wxUSE_DRAG_AND_DROP 
  56 extern wxList wxPendingDelete
; 
  57 wxWindow
* gFocusWindow 
= NULL 
; 
  59 #if !USE_SHARED_LIBRARY 
  60 IMPLEMENT_DYNAMIC_CLASS(wxWindow
, wxEvtHandler
) 
  61 BEGIN_EVENT_TABLE(wxWindow
, wxEvtHandler
) 
  62   EVT_ERASE_BACKGROUND(wxWindow::OnEraseBackground
) 
  63   EVT_SYS_COLOUR_CHANGED(wxWindow::OnSysColourChanged
) 
  64   EVT_INIT_DIALOG(wxWindow::OnInitDialog
) 
  65   EVT_IDLE(wxWindow::OnIdle
) 
  66   EVT_SET_FOCUS(wxWindow::OnSetFocus
) 
  73 // =========================================================================== 
  75 // =========================================================================== 
  77 // --------------------------------------------------------------------------- 
  78 // wxWindow utility functions 
  79 // --------------------------------------------------------------------------- 
  81 // Find an item given the Macintosh Window Reference 
  83 wxList 
*wxWinMacWindowList 
= NULL
; 
  84 wxWindow 
*wxFindWinFromMacWindow(WindowRef inWindowRef
) 
  86     wxNode 
*node 
= wxWinMacWindowList
->Find((long)inWindowRef
); 
  89     return (wxWindow 
*)node
->Data(); 
  92 void wxAssociateWinWithMacWindow(WindowRef inWindowRef
, wxWindow 
*win
) 
  94     // adding NULL WindowRef is (first) surely a result of an error and 
  95     // (secondly) breaks menu command processing 
  96     wxCHECK_RET( inWindowRef 
!= (WindowRef
) NULL
, "attempt to add a NULL WindowRef to window list" ); 
  98     if ( !wxWinMacWindowList
->Find((long)inWindowRef
) ) 
  99         wxWinMacWindowList
->Append((long)inWindowRef
, win
); 
 102 void wxRemoveMacWindowAssociation(wxWindow 
*win
) 
 104     wxWinMacWindowList
->DeleteObject(win
); 
 107 // ---------------------------------------------------------------------------- 
 108 // constructors and such 
 109 // ---------------------------------------------------------------------------- 
 111 WindowRef 
wxWindow::s_macWindowInUpdate 
= NULL
; 
 113 void wxWindow::Init() 
 118     m_macEraseOnRedraw 
= true ; 
 121     m_doubleClickAllowed 
= 0; 
 122     m_winCaptured 
= FALSE
; 
 124     m_isBeingDeleted 
= FALSE
; 
 127     m_mouseInWindow 
= FALSE
; 
 131     m_backgroundTransparent 
= FALSE
; 
 133     // as all windows are created with WS_VISIBLE style... 
 136         m_macWindowData 
= NULL 
; 
 137         m_macEraseOnRedraw 
= true ; 
 144         m_hScrollBar 
= NULL 
; 
 145         m_vScrollBar 
= NULL 
; 
 147 #if  wxUSE_DRAG_AND_DROP 
 148   m_pDropTarget 
= NULL
; 
 153 wxWindow::~wxWindow() 
 155     // deleting a window while it is shown invalidates the region 
 157         wxWindow
* iter 
= this ; 
 159             if ( iter
->m_macWindowData 
) 
 164             iter 
= iter
->GetParent() ; 
 169     m_isBeingDeleted 
= TRUE
; 
 171         if ( s_lastMouseWindow 
== this ) 
 173                 s_lastMouseWindow 
= NULL 
; 
 176     if ( gFocusWindow 
== this ) 
 178         gFocusWindow 
= NULL 
; 
 182         m_parent
->RemoveChild(this); 
 186         if ( m_macWindowData 
) 
 188                 wxToolTip::NotifyWindowDelete(m_macWindowData
->m_macWindow
) ; 
 189         UMADisposeWindow( m_macWindowData
->m_macWindow 
) ; 
 190         delete m_macWindowData 
; 
 191         wxRemoveMacWindowAssociation( this ) ; 
 196 bool wxWindow::Create(wxWindow 
*parent
, wxWindowID id
, 
 200            const wxString
& name
) 
 202     wxCHECK_MSG( parent
, FALSE
, wxT("can't create wxWindow without parent") ); 
 204     if ( !CreateBase(parent
, id
, pos
, size
, style
, wxDefaultValidator
, name
) ) 
 207     parent
->AddChild(this); 
 211         AdjustForParentClientOrigin(m_x
, m_y
, wxSIZE_USE_EXISTING
); 
 212         m_width 
= WidthDefault( size
.x 
); 
 213         m_height 
= HeightDefault( size
.y 
) ; 
 215         if ( ! IsKindOf( CLASSINFO ( wxControl 
) ) && ! IsKindOf( CLASSINFO( wxStatusBar 
) ) ) 
 217         MacCreateScrollBars( style 
) ; 
 223 void wxWindow::SetFocus() 
 225         if ( gFocusWindow 
== this ) 
 228         if ( AcceptsFocus() ) 
 234                             if ( gFocusWindow
->m_caret 
) 
 236                                   gFocusWindow
->m_caret
->OnKillFocus(); 
 238                         #endif // wxUSE_CARET 
 239                         wxControl
* control 
= wxDynamicCast( gFocusWindow 
, wxControl 
) ; 
 240                         if ( control 
&& control
->GetMacControl() ) 
 242                                 UMASetKeyboardFocus( gFocusWindow
->GetMacRootWindow() , control
->GetMacControl()  , kControlFocusNoPart 
) ; 
 243                                 control
->MacRedrawControl() ; 
 245                 wxFocusEvent 
event(wxEVT_KILL_FOCUS
, gFocusWindow
->m_windowId
); 
 246                 event
.SetEventObject(gFocusWindow
); 
 247                         gFocusWindow
->GetEventHandler()->ProcessEvent(event
) ; 
 249                 gFocusWindow 
= this ; 
 255                         m_caret
->OnSetFocus(); 
 257                         #endif // wxUSE_CARET 
 258                         // panel wants to track the window which was the last to have focus in it 
 259                 wxPanel 
*panel 
= wxDynamicCast(GetParent(), wxPanel
); 
 262                         panel
->SetLastFocus(this); 
 264                         wxControl
* control 
= wxDynamicCast( gFocusWindow 
, wxControl 
) ; 
 265                         if ( control 
&& control
->GetMacControl() ) 
 267                                 UMASetKeyboardFocus( gFocusWindow
->GetMacRootWindow() , control
->GetMacControl()  , kControlEditTextPart 
) ; 
 270                 wxFocusEvent 
event(wxEVT_SET_FOCUS
, m_windowId
); 
 271                 event
.SetEventObject(this); 
 272                         GetEventHandler()->ProcessEvent(event
) ; 
 277 bool wxWindow::Enable(bool enable
) 
 279     if ( !wxWindowBase::Enable(enable
) ) 
 282     wxWindowList::Node 
*node 
= GetChildren().GetFirst(); 
 285         wxWindow 
*child 
= node
->GetData(); 
 286         child
->Enable(enable
); 
 288         node 
= node
->GetNext(); 
 294 void wxWindow::CaptureMouse() 
 296     wxTheApp
->s_captureWindow 
= this ; 
 299 wxWindow
* wxWindowBase::GetCapture() 
 301     return wxTheApp
->s_captureWindow 
; 
 304 void wxWindow::ReleaseMouse() 
 306     wxTheApp
->s_captureWindow 
= NULL 
; 
 309 #if    wxUSE_DRAG_AND_DROP 
 311 void wxWindow::SetDropTarget(wxDropTarget 
*pDropTarget
) 
 313   if ( m_pDropTarget 
!= 0 ) { 
 314     delete m_pDropTarget
; 
 317   m_pDropTarget 
= pDropTarget
; 
 318   if ( m_pDropTarget 
!= 0 ) 
 326 // Old style file-manager drag&drop 
 327 void wxWindow::DragAcceptFiles(bool accept
) 
 333 void wxWindow::DoGetSize(int *x
, int *y
) const 
 339 void wxWindow::DoGetPosition(int *x
, int *y
) const 
 345         wxPoint 
pt(GetParent()->GetClientAreaOrigin()); 
 352 bool wxWindow::DoPopupMenu(wxMenu 
*menu
, int x
, int y
) 
 354         menu
->SetInvokingWindow(this); 
 356         ClientToScreen( &x 
, &y 
) ; 
 358         ::InsertMenu( menu
->GetHMenu() , -1 ) ; 
 359         long menuResult 
= ::PopUpMenuSelect(menu
->GetHMenu() ,y
,x
, 0) ; 
 360         menu
->MacMenuSelect( this , TickCount() , HiWord(menuResult
) , LoWord(menuResult
) ) ; 
 361         ::DeleteMenu( menu
->MacGetMenuId() ) ; 
 362         menu
->SetInvokingWindow(NULL
); 
 367 void wxWindow::DoScreenToClient(int *x
, int *y
) const 
 369         WindowRef window 
= GetMacRootWindow() ; 
 377         ::SetPort( UMAGetWindowPort( window 
) ) ; 
 378         ::GlobalToLocal( &localwhere 
) ; 
 384         MacRootWindowToClient( x 
, y 
) ; 
 387 void wxWindow::DoClientToScreen(int *x
, int *y
) const 
 389         WindowRef window 
= GetMacRootWindow() ; 
 391         MacClientToRootWindow( x 
, y 
) ; 
 399         ::SetPort( UMAGetWindowPort( window 
) ) ; 
 400         ::SetOrigin( 0 , 0 ) ; 
 401         ::LocalToGlobal( &localwhere 
) ; 
 407 void wxWindow::MacClientToRootWindow( int *x 
, int *y 
) const 
 409         if ( m_macWindowData 
) 
 416                 GetParent()->MacClientToRootWindow( x 
, y 
) ; 
 420 void wxWindow::MacRootWindowToClient( int *x 
, int *y 
) const 
 422         if ( m_macWindowData 
) 
 429                 GetParent()->MacRootWindowToClient( x 
, y 
) ; 
 433 bool wxWindow::SetCursor(const wxCursor
& cursor
) 
 435     if (m_cursor 
== cursor
) 
 438     if (wxNullCursor 
== cursor
) 
 440        if ( ! wxWindowBase::SetCursor( *wxSTANDARD_CURSOR 
) ) 
 445        if ( ! wxWindowBase::SetCursor( cursor 
) ) 
 449   wxASSERT_MSG( m_cursor
.Ok(), 
 450                   wxT("cursor must be valid after call to the base version")); 
 456   // Change the cursor NOW if we're within the correct window 
 458   if ( MacGetWindowFromPoint( wxPoint( pt
.h 
, pt
.v 
) , &mouseWin 
) ) 
 460         if ( mouseWin 
== this && !wxIsBusy() ) 
 462                 m_cursor
.MacInstall() ; 
 470 // Get size *available for subwindows* i.e. excluding menu bar etc. 
 471 void wxWindow::DoGetClientSize(int *x
, int *y
) const 
 476         *x 
-= MacGetLeftBorderSize(  )  + MacGetRightBorderSize(  ) ; 
 477         *y 
-= MacGetTopBorderSize(  ) + MacGetBottomBorderSize( ); 
 479   if ( (m_vScrollBar 
&& m_vScrollBar
->IsShown()) || (m_hScrollBar  
&& m_hScrollBar
->IsShown()) ) 
 486         MacClientToRootWindow( &x1 
, &y1 
) ; 
 487         MacClientToRootWindow( &w 
, &h 
) ; 
 489         WindowRef window 
= NULL 
; 
 490         wxWindow 
*iter 
= (wxWindow
*)this ; 
 492         int totW 
= 10000 , totH 
= 10000; 
 495                 if ( iter
->m_macWindowData 
) 
 497                         totW 
= iter
->m_width 
; 
 498                         totH 
= iter
->m_height 
; 
 502                 iter 
= iter
->GetParent() ; 
 505         if (m_hScrollBar  
&& m_hScrollBar
->IsShown() ) 
 507                 (*y
) -= MAC_SCROLLBAR_SIZE
; 
 513         if (m_vScrollBar  
&& m_vScrollBar
->IsShown() ) 
 515         (*x
) -= MAC_SCROLLBAR_SIZE
; 
 525 // ---------------------------------------------------------------------------- 
 527 // ---------------------------------------------------------------------------- 
 531 void wxWindow::DoSetToolTip(wxToolTip 
*tooltip
) 
 533     wxWindowBase::DoSetToolTip(tooltip
); 
 536                 m_tooltip
->SetWindow(this); 
 539 #endif // wxUSE_TOOLTIPS 
 541 void wxWindow::DoMoveWindow(int x
, int y
, int width
, int height
) 
 543         DoSetSize( x
,y
, width
, height 
) ; 
 546 // set the size of the window: if the dimensions are positive, just use them, 
 547 // but if any of them is equal to -1, it means that we must find the value for 
 548 // it ourselves (unless sizeFlags contains wxSIZE_ALLOW_MINUS_ONE flag, in 
 549 // which case -1 is a valid value for x and y) 
 551 // If sizeFlags contains wxSIZE_AUTO_WIDTH/HEIGHT flags (default), we calculate 
 552 // the width/height to best suit our contents, otherwise we reuse the current 
 554 void wxWindow::DoSetSize(int x
, int y
, int width
, int height
, int sizeFlags
) 
 559         int former_w 
= m_width 
; 
 560         int former_h 
= m_height 
; 
 562   int currentX
, currentY
; 
 563   GetPosition(¤tX
, ¤tY
); 
 564   int currentW
,currentH
; 
 565   GetSize(¤tW
, ¤tH
); 
 567   int actualWidth 
= width
; 
 568   int actualHeight 
= height
; 
 571   if (x 
== -1 && !(sizeFlags 
& wxSIZE_ALLOW_MINUS_ONE
)) 
 573   if (y 
== -1 && !(sizeFlags 
& wxSIZE_ALLOW_MINUS_ONE
)) 
 576   wxSize 
size( -1 , -1 ) ; 
 578   if (width 
== -1 || height 
== -1 ) 
 580         size 
= DoGetBestSize() ; 
 585         if ( sizeFlags 
& wxSIZE_AUTO_WIDTH 
) 
 587       actualWidth 
= size
.x 
;     
 588       if ( actualWidth 
== -1 ) 
 593       actualWidth 
= currentW 
; 
 598         if ( sizeFlags 
& wxSIZE_AUTO_HEIGHT 
) 
 600                 actualHeight 
= size
.y 
; 
 601                 if ( actualHeight 
== -1 ) 
 606       actualHeight 
= currentH 
; 
 610     if ((m_minWidth 
!= -1) && (actualWidth 
< m_minWidth
))  
 611         actualWidth 
= m_minWidth
; 
 612     if ((m_minHeight 
!= -1) && (actualHeight 
< m_minHeight
))  
 613         actualHeight 
= m_minHeight
; 
 614     if ((m_maxWidth 
!= -1) && (actualWidth 
> m_maxWidth
))  
 615         actualWidth 
= m_maxWidth
; 
 616     if ((m_maxHeight 
!= -1) && (actualHeight 
> m_maxHeight
))  
 617         actualHeight 
= m_maxHeight
; 
 618         if ( actualX 
== currentX 
&& actualY 
== currentY 
&& actualWidth 
== currentW 
&& actualHeight 
== currentH
) 
 620                 MacRepositionScrollBars() ; // we might have a real position shift 
 624         AdjustForParentClientOrigin(actualX
, actualY
, sizeFlags
); 
 627         bool doMove 
= false ; 
 628         bool doResize 
= false ; 
 630         if ( actualX 
!= former_x 
|| actualY 
!= former_y 
) 
 634         if ( actualWidth 
!= former_w 
|| actualHeight 
!= former_h 
) 
 639         if ( doMove 
|| doResize 
) 
 641                 if ( m_macWindowData 
) 
 646                         // erase former position 
 647                         wxMacDrawingHelper 
focus( this ) ; 
 650                                 Rect clientrect 
= { 0 , 0 , m_height 
, m_width 
} ; 
 651                                 // ClipRect( &clientrect ) ; 
 652                         InvalWindowRect( GetMacRootWindow() , &clientrect 
) ; 
 657                 m_width 
= actualWidth 
; 
 658                 m_height 
= actualHeight 
; 
 659                 if ( m_macWindowData 
) 
 662                                 ::MoveWindow(m_macWindowData
->m_macWindow
, m_x
, m_y  
, false); // don't make frontmost 
 665                                 ::SizeWindow(m_macWindowData
->m_macWindow
, m_width
, m_height  
, true);  
 667                         // the OS takes care of invalidating and erasing the new area 
 668                         // we have erased the old one    
 670                         if ( IsKindOf( CLASSINFO( wxFrame 
) ) ) 
 672                                 wxFrame
* frame 
= (wxFrame
*) this ; 
 673                                 frame
->PositionStatusBar(); 
 674                                 frame
->PositionToolBar(); 
 679                         // erase new position 
 682                                 wxMacDrawingHelper 
focus( this ) ; 
 685                                         Rect clientrect 
= { 0 , 0 , m_height 
, m_width 
} ; 
 686                                         // ClipRect( &clientrect ) ; 
 687                                 InvalWindowRect( GetMacRootWindow() , &clientrect 
) ; 
 692                                 wxWindow::MacSuperChangedPosition() ; // like this only children will be notified 
 694                 MacRepositionScrollBars() ; 
 697                 wxPoint 
point(m_x
, m_y
); 
 698                 wxMoveEvent 
event(point
, m_windowId
); 
 699                 event
.SetEventObject(this); 
 700                 GetEventHandler()->ProcessEvent(event
) ; 
 704             MacRepositionScrollBars() ; 
 705             wxSize 
size(m_width
, m_height
); 
 706             wxSizeEvent 
event(size
, m_windowId
); 
 707             event
.SetEventObject(this); 
 708             GetEventHandler()->ProcessEvent(event
); 
 712 // For implementation purposes - sometimes decorations make the client area 
 715 wxPoint 
wxWindow::GetClientAreaOrigin() const 
 717     return wxPoint(MacGetLeftBorderSize(  ) , MacGetTopBorderSize(  ) ); 
 720 // Makes an adjustment to the window position (for example, a frame that has 
 721 // a toolbar that it manages itself). 
 722 void wxWindow::AdjustForParentClientOrigin(int& x
, int& y
, int sizeFlags
) 
 724         if( !m_macWindowData 
) 
 726     if (((sizeFlags 
& wxSIZE_NO_ADJUSTMENTS
) == 0) && GetParent()) 
 728         wxPoint 
pt(GetParent()->GetClientAreaOrigin()); 
 729         x 
+= pt
.x
; y 
+= pt
.y
; 
 734 void wxWindow::SetTitle(const wxString
& title
) 
 740         if( wxApp::s_macDefaultEncodingIsPC 
) 
 741                 label 
= wxMacMakeMacStringFromPC( title 
) ; 
 745         if ( m_macWindowData 
) 
 746         UMASetWTitleC( m_macWindowData
->m_macWindow 
, label 
) ; 
 749 wxString 
wxWindow::GetTitle() const 
 754 bool wxWindow::Show(bool show
) 
 756     if ( !wxWindowBase::Show(show
) ) 
 759         if ( m_macWindowData 
) 
 763                 UMAShowWindow( m_macWindowData
->m_macWindow 
) ; 
 764                 UMASelectWindow( m_macWindowData
->m_macWindow 
) ; 
 765                 // no need to generate events here, they will get them triggered by macos 
 766                 // actually they should be , but apparently they are not 
 767             wxSize 
size(m_width
, m_height
); 
 768             wxSizeEvent 
event(size
, m_windowId
); 
 769             event
.SetEventObject(this); 
 770             GetEventHandler()->ProcessEvent(event
); 
 774                 UMAHideWindow( m_macWindowData
->m_macWindow 
) ; 
 777         MacSuperShown( show 
) ; 
 780             WindowRef window 
= GetMacRootWindow() ; 
 781             wxWindow
* win 
= wxFindWinFromMacWindow( window 
) ; 
 782             if ( !win
->m_isBeingDeleted 
) 
 793 void wxWindow::MacSuperShown( bool show 
)  
 795         wxNode 
*node 
= GetChildren().First(); 
 798                 wxWindow 
*child 
= (wxWindow 
*)node
->Data(); 
 799                 if ( child
->m_isShown 
) 
 800                         child
->MacSuperShown( show 
) ; 
 805 bool wxWindow::MacIsReallyShown() const  
 807         if ( m_isShown 
&& (m_parent 
!= NULL
) ) { 
 808                 return m_parent
->MacIsReallyShown(); 
 812         bool status = m_isShown ; 
 813         wxWindow * win = this ; 
 814         while ( status && win->m_parent != NULL ) 
 816                 win = win->m_parent ; 
 817                 status = win->m_isShown ; 
 823 int wxWindow::GetCharHeight() const 
 825         wxClientDC 
dc ( (wxWindow
*)this ) ; 
 826         return dc
.GetCharHeight() ; 
 829 int wxWindow::GetCharWidth() const 
 831         wxClientDC 
dc ( (wxWindow
*)this ) ; 
 832         return dc
.GetCharWidth() ; 
 835 void wxWindow::GetTextExtent(const wxString
& string
, int *x
, int *y
, 
 836                            int *descent
, int *externalLeading
, const wxFont 
*theFont 
) const 
 838     const wxFont 
*fontToUse 
= theFont
; 
 842     wxClientDC 
dc( (wxWindow
*) this ) ; 
 844     dc
.GetTextExtent( string 
, &lx 
, &ly 
, &ld
, &le
, (wxFont 
*)fontToUse 
) ; 
 845     if ( externalLeading 
) 
 846         *externalLeading 
= le 
; 
 855 void wxWindow::MacEraseBackground( Rect 
*rect 
) 
 858         WindowRef window = GetMacRootWindow() ; 
 859         if ( m_backgroundColour == wxSystemSettings::GetSystemColour(wxSYS_COLOUR_APPWORKSPACE) ) 
 861                         UMASetThemeWindowBackground( window , kThemeBrushDocumentWindowBackground , false ) ; 
 863         else if (  m_backgroundColour == wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE ) ) 
 865                 // on mac we have the difficult situation, that 3dface gray can be different colours, depending whether 
 866                 // it is on a notebook panel or not, in order to take care of that we walk up the hierarchy until we have 
 867                 // either a non gray background color or a non control window 
 869                         wxWindow* parent = GetParent() ; 
 872                                 if ( parent->m_backgroundColour != wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE ) ) 
 874                                         // if we have any other colours in the hierarchy 
 875                                 RGBBackColor( &parent->m_backgroundColour.GetPixel()) ; 
 878                                 if( parent->IsKindOf( CLASSINFO( wxControl ) ) && ((wxControl*)parent)->GetMacControl() ) 
 880                                         // if we have the normal colours in the hierarchy but another control etc. -> use it's background 
 881                                         if ( parent->IsKindOf( CLASSINFO( wxNotebook ) ) || parent->IsKindOf( CLASSINFO( wxTabCtrl ) )) 
 883                                                 UMAApplyThemeBackground(kThemeBackgroundTabPane, rect, kThemeStateActive,8,true); 
 889                                         // we have arrived at a non control item 
 893                                 parent = parent->GetParent() ; 
 897                                 // if there is nothing special -> use default 
 898                                 UMASetThemeWindowBackground( window , kThemeBrushDialogBackgroundActive , false ) ; 
 903                 RGBBackColor( &m_backgroundColour.GetPixel()) ; 
 908         for (wxNode *node = GetChildren().First(); node; node = node->Next()) 
 910                 wxWindow *child = (wxWindow*)node->Data(); 
 912                 Rect clientrect = { child->m_x , child->m_y , child->m_x +child->m_width , child->m_y + child->m_height } ; 
 913                 SectRect( &clientrect , rect , &clientrect ) ;           
 915                 OffsetRect( &clientrect , -child->m_x , -child->m_y ) ; 
 916                 if ( child->GetMacRootWindow() == window && child->IsShown() ) 
 918                         wxMacDrawingClientHelper focus( this ) ; 
 921                                 child->MacEraseBackground( &clientrect ) ; 
 928 void wxWindow::Refresh(bool eraseBack
, const wxRect 
*rect
) 
 933         wxMacDrawingHelper 
focus( this ) ; 
 936                 Rect clientrect 
= { 0 , 0 , m_height 
, m_width 
} ; 
 937                 // ClipRect( &clientrect ) ; 
 941                 Rect r 
= { rect
->y 
, rect
->x 
, rect
->y 
+ rect
->height 
, rect
->x 
+ rect
->width 
} ; 
 942                         SectRect( &clientrect 
, &r 
, &clientrect 
) ;             
 944         InvalWindowRect( GetMacRootWindow() , &clientrect 
) ; 
 947                 m_macEraseOnRedraw 
= false ; 
 949                 m_macEraseOnRedraw 
= true ; 
 952 // Responds to colour changes: passes event on to children. 
 953 void wxWindow::OnSysColourChanged(wxSysColourChangedEvent
& event
) 
 955     wxNode 
*node 
= GetChildren().First(); 
 958         // Only propagate to non-top-level windows 
 959         wxWindow 
*win 
= (wxWindow 
*)node
->Data(); 
 960         if ( win
->GetParent() ) 
 962             wxSysColourChangedEvent event2
; 
 963             event
.m_eventObject 
= win
; 
 964             win
->GetEventHandler()->ProcessEvent(event2
); 
 971 #if wxUSE_CARET && WXWIN_COMPATIBILITY 
 972 // --------------------------------------------------------------------------- 
 973 // Caret manipulation 
 974 // --------------------------------------------------------------------------- 
 976 void wxWindow::CreateCaret(int w
, int h
) 
 978     SetCaret(new wxCaret(this, w
, h
)); 
 981 void wxWindow::CreateCaret(const wxBitmap 
*WXUNUSED(bitmap
)) 
 983     wxFAIL_MSG("not implemented"); 
 986 void wxWindow::ShowCaret(bool show
) 
 988     wxCHECK_RET( m_caret
, "no caret to show" ); 
 993 void wxWindow::DestroyCaret() 
 998 void wxWindow::SetCaretPos(int x
, int y
) 
1000     wxCHECK_RET( m_caret
, "no caret to move" ); 
1002     m_caret
->Move(x
, y
); 
1005 void wxWindow::GetCaretPos(int *x
, int *y
) const 
1007     wxCHECK_RET( m_caret
, "no caret to get position of" ); 
1009     m_caret
->GetPosition(x
, y
); 
1011 #endif // wxUSE_CARET 
1013 wxWindow 
*wxGetActiveWindow() 
1015     // actually this is a windows-only concept 
1019 // Coordinates relative to the window 
1020 void wxWindow::WarpPointer (int x_pos
, int y_pos
) 
1022     // We really dont move the mouse programmatically under mac 
1025 void wxWindow::OnEraseBackground(wxEraseEvent
& event
) 
1027     // TODO : probably we would adopt the EraseEvent structure 
1030 int wxWindow::GetScrollPos(int orient
) const 
1032                 if ( orient 
== wxHORIZONTAL 
) 
1035                                 return m_hScrollBar
->GetThumbPosition() ; 
1040                                 return m_vScrollBar
->GetThumbPosition() ; 
1045 // This now returns the whole range, not just the number 
1046 // of positions that we can scroll. 
1047 int wxWindow::GetScrollRange(int orient
) const 
1049                 if ( orient 
== wxHORIZONTAL 
) 
1052                                 return m_hScrollBar
->GetRange() ; 
1057                                 return m_vScrollBar
->GetRange() ; 
1062 int wxWindow::GetScrollThumb(int orient
) const 
1064                 if ( orient 
== wxHORIZONTAL 
) 
1067                                 return m_hScrollBar
->GetThumbSize() ; 
1072                                 return m_vScrollBar
->GetThumbSize() ; 
1077 void wxWindow::SetScrollPos(int orient
, int pos
, bool refresh
) 
1079                 if ( orient 
== wxHORIZONTAL 
) 
1082                                 m_hScrollBar
->SetThumbPosition( pos 
) ; 
1087                                 m_vScrollBar
->SetThumbPosition( pos 
) ; 
1091 void  wxWindow::MacCreateRealWindow( const wxString
& title
, 
1095            const wxString
& name 
)  
1098   m_windowStyle 
= style
; 
1119         m_macWindowData 
= new MacWindowData() ; 
1121         ::SetRect(&theBoundsRect
, m_x
, m_y 
, m_x 
+ m_width
, m_y 
+ m_height
); 
1123         // translate the window attributes in the appropriate window class and attributes 
1125         WindowClass wclass 
= 0; 
1126         WindowAttributes attr 
= kWindowNoAttributes 
; 
1128         if ( HasFlag(wxTINY_CAPTION_HORIZ
) ||  HasFlag(wxTINY_CAPTION_VERT
) ) 
1130                 wclass 
= kFloatingWindowClass 
; 
1131                 if ( HasFlag(wxTINY_CAPTION_VERT
) ) 
1133                         attr 
|= kWindowSideTitlebarAttribute 
; 
1136         else if ( HasFlag( wxCAPTION 
) ) 
1138                 if ( HasFlag( wxDIALOG_MODAL 
) ) 
1140                         wclass 
= kMovableModalWindowClass 
; 
1144                         wclass 
= kDocumentWindowClass 
; 
1149                 wclass 
= kModalWindowClass 
; 
1152         if ( HasFlag( wxMINIMIZE_BOX 
) || HasFlag( wxMAXIMIZE_BOX 
) ) 
1154                 attr 
|= kWindowFullZoomAttribute 
; 
1155                 attr 
|= kWindowCollapseBoxAttribute 
; 
1157         if ( HasFlag( wxRESIZE_BORDER 
) ) 
1159                 attr 
|= kWindowResizableAttribute 
; 
1161         if ( HasFlag( wxSYSTEM_MENU 
) ) 
1163                 attr 
|= kWindowCloseBoxAttribute 
; 
1166         UMACreateNewWindow( wclass 
, attr 
, &theBoundsRect 
, &m_macWindowData
->m_macWindow 
) ; 
1167         wxAssociateWinWithMacWindow( m_macWindowData
->m_macWindow 
, this ) ; 
1169         if( wxApp::s_macDefaultEncodingIsPC 
) 
1170                 label 
= wxMacMakeMacStringFromPC( title 
) ; 
1173         UMASetWTitleC( m_macWindowData
->m_macWindow 
, label 
) ; 
1174         UMACreateRootControl( m_macWindowData
->m_macWindow 
, &m_macWindowData
->m_macRootControl 
) ; 
1176         m_macWindowData
->m_macFocus 
= NULL 
; 
1177         m_macWindowData
->m_macHasReceivedFirstActivate 
= true ; 
1180 void wxWindow::MacPaint( wxPaintEvent 
&event 
)  
1184 void wxWindow::MacPaintBorders( )  
1186         if( m_macWindowData 
) 
1189         RGBColor white 
= { 0xFFFF, 0xFFFF , 0xFFFF } ; 
1190         RGBColor black 
= { 0x0000, 0x0000 , 0x0000 } ; 
1191         RGBColor face 
= { 0xDDDD, 0xDDDD , 0xDDDD } ; 
1192         RGBColor shadow 
= { 0x4444, 0x4444 , 0x4444 } ; 
1195     if (HasFlag(wxRAISED_BORDER
) || HasFlag( wxSUNKEN_BORDER
) || HasFlag(wxDOUBLE_BORDER
) ) 
1197         bool sunken 
= HasFlag( wxSUNKEN_BORDER 
) ; 
1198         RGBColor pen1 
= sunken 
? white 
: black 
; 
1199         RGBColor pen2 
= sunken 
? shadow 
: face 
; 
1200         RGBColor pen3 
= sunken 
? face 
: shadow 
; 
1201         RGBColor pen4 
= sunken 
? black 
: white 
; 
1203         RGBForeColor( &pen1 
) ; 
1205                         Rect rect 
= { 0 , 0 , m_height 
, m_width 
} ; 
1206                 FrameRect( &rect 
) ; 
1208         RGBForeColor( &pen2 
) ; 
1210                         Rect rect 
= { 1 , 1 , m_height 
-1 , m_width 
-1} ; 
1211                 FrameRect( &rect 
) ; 
1213         RGBForeColor( &pen3 
) ; 
1215                         Rect rect 
= { 0 , 0 , m_height 
-2 , m_width 
-2} ; 
1216                 FrameRect( &rect 
) ; 
1218         RGBForeColor( &pen4 
) ; 
1221                 LineTo( m_width 
- 3 , 0 ) ; 
1223                 LineTo( 0 , m_height 
- 3 ) ; 
1226     else if (HasFlag(wxSIMPLE_BORDER
)) 
1228                 Rect rect 
= { 0 , 0 , m_height 
, m_width 
} ; 
1229                 RGBForeColor( &black 
) ; 
1230         FrameRect( &rect 
) ; 
1233         if ( this->GetParent() ) 
1235             wxPaintDC dc(GetParent()); 
1236             GetParent()->PrepareDC(dc); 
1238             if (HasFlag(wxRAISED_BORDER) || HasFlag( wxSUNKEN_BORDER) ) 
1240                 bool sunken = HasFlag( wxSUNKEN_BORDER ) ; 
1242                         wxPen m_penButton3DShadow( wxSystemSettings::GetSystemColour( wxSYS_COLOUR_3DSHADOW ), 1, wxSOLID ) ; 
1243                         wxPen m_penButton3DFace( wxSystemSettings::GetSystemColour( wxSYS_COLOUR_3DFACE ), 1, wxSOLID ) ; 
1245                         wxPen wxPen1 = sunken ? *wxWHITE_PEN : *wxBLACK_PEN; 
1246                         wxPen wxPen2 = sunken ? m_penButton3DShadow : m_penButton3DShadow; 
1247                         wxPen wxPen3 = sunken ? m_penButton3DFace : m_penButton3DShadow; 
1248                         wxPen wxPen4 = sunken ? *wxBLACK_PEN : *wxWHITE_PEN; 
1251                         dc.DrawRectangle(m_x, m_y, m_width, m_height);          // outer - right and button 
1254                         dc.DrawRectangle(m_x+1, m_y+1, m_width-1, m_height-1);      // outer - left and top 
1257                         dc.DrawRectangle(m_x, m_y, m_width-2, m_height-2);          // inner - right and button 
1260                         dc.DrawLine(m_x, m_y, m_x + m_width-3, m_y);                 // inner - left and top 
1261                         dc.DrawLine(m_x, m_y, m_x, m_y + m_height-3); 
1263             else if (HasFlag(wxDOUBLE_BORDER)) 
1265                 bool sunken = HasFlag( wxSUNKEN_BORDER ) ; 
1267                         wxPen m_penButton3DShadow( wxSystemSettings::GetSystemColour( wxSYS_COLOUR_3DSHADOW ), 1, wxSOLID ) ; 
1268                         wxPen m_penButton3DFace( wxSystemSettings::GetSystemColour( wxSYS_COLOUR_3DFACE ), 1, wxSOLID ) ; 
1270                         wxPen wxPen1 = sunken ? *wxWHITE_PEN : *wxBLACK_PEN; 
1271                         wxPen wxPen2 = sunken ? m_penButton3DShadow : m_penButton3DShadow; 
1272                         wxPen wxPen3 = sunken ? m_penButton3DFace : m_penButton3DShadow; 
1273                         wxPen wxPen4 = sunken ? *wxBLACK_PEN : *wxWHITE_PEN; 
1276                         dc.DrawRectangle(m_x, m_y, m_width, m_height);          // outer - right and button 
1279                         dc.DrawRectangle(m_x+1, m_y+1, m_width-1, m_height-1);      // outer - left and top 
1282                         dc.DrawRectangle(m_x, m_y, m_width-2, m_height-2);          // inner - right and button 
1285                         dc.DrawLine(m_x, m_y, m_x + m_width-3, m_y);                 // inner - left and top 
1286                         dc.DrawLine(m_x, m_y, m_x, m_y + m_height-3); 
1288             else if (HasFlag(wxSIMPLE_BORDER)) 
1290                         dc.SetPen(*wxBLACK_PEN); 
1291                         dc.DrawRectangle(m_x, m_y, m_width, m_height);          
1297 // New function that will replace some of the above. 
1298 void wxWindow::SetScrollbar(int orient
, int pos
, int thumbVisible
, 
1299     int range
, bool refresh
) 
1301                 if ( orient 
== wxHORIZONTAL 
) 
1305                                 if ( range 
== 0 || thumbVisible 
>= range 
) 
1307                                         if ( m_hScrollBar
->IsShown() ) 
1308                                                 m_hScrollBar
->Show(false) ; 
1312                                         if ( !m_hScrollBar
->IsShown() ) 
1313                                                 m_hScrollBar
->Show(true) ; 
1314                                         m_hScrollBar
->SetScrollbar( pos 
, thumbVisible 
, range 
, thumbVisible 
, refresh 
) ; 
1322                                 if ( range 
== 0 || thumbVisible 
>= range 
) 
1324                                         if ( m_vScrollBar
->IsShown() ) 
1325                                                 m_vScrollBar
->Show(false) ; 
1329                                         if ( !m_vScrollBar
->IsShown() ) 
1330                                                 m_vScrollBar
->Show(true) ; 
1331                                         m_vScrollBar
->SetScrollbar( pos 
, thumbVisible 
, range 
, thumbVisible 
, refresh 
) ; 
1335                 MacRepositionScrollBars() ; 
1338 // Does a physical scroll 
1339 void wxWindow::ScrollWindow(int dx
, int dy
, const wxRect 
*rect
) 
1341         wxMacDrawingClientHelper 
focus( this ) ; 
1344                 int width 
, height 
; 
1345                 GetClientSize( &width 
, &height 
) ; 
1347                 Rect scrollrect 
= { 0 , 0 , height 
, width 
} ; 
1349                 RgnHandle updateRgn 
= NewRgn() ; 
1350                 ClipRect( &scrollrect 
) ; 
1353                 Rect r 
= { rect
->y 
, rect
->x 
, rect
->y 
+ rect
->height 
, rect
->x 
+ rect
->width 
} ; 
1354                         SectRect( &scrollrect 
, &r 
, &scrollrect 
) ;             
1356                 ScrollRect( &scrollrect 
, dx 
, dy 
, updateRgn 
) ; 
1357         InvalWindowRgn( GetMacRootWindow() ,  updateRgn 
) ; 
1358         DisposeRgn( updateRgn 
) ; 
1361         for (wxNode 
*node 
= GetChildren().First(); node
; node 
= node
->Next()) 
1363                 wxWindow 
*child 
= (wxWindow
*)node
->Data(); 
1364                 if (child 
== m_vScrollBar
) continue; 
1365                 if (child 
== m_hScrollBar
) continue; 
1366                 if (child
->IsTopLevel()) continue; 
1368                 child
->GetPosition( &x
, &y 
); 
1370                 child
->GetSize( &w
, &h 
); 
1371                 child
->SetSize( x
+dx
, y
+dy
, w
, h 
); 
1376 void wxWindow::MacOnScroll(wxScrollEvent 
&event 
) 
1378         if ( event
.m_eventObject 
== m_vScrollBar 
|| event
.m_eventObject 
== m_hScrollBar 
) 
1380             wxScrollWinEvent wevent
; 
1381             wevent
.SetPosition(event
.GetPosition()); 
1382             wevent
.SetOrientation(event
.GetOrientation()); 
1383             wevent
.m_eventObject 
= this; 
1385         if (event
.m_eventType 
== wxEVT_SCROLL_TOP
) { 
1386                 wevent
.m_eventType 
= wxEVT_SCROLLWIN_TOP
; 
1388         if (event
.m_eventType 
== wxEVT_SCROLL_BOTTOM
) { 
1389                 wevent
.m_eventType 
= wxEVT_SCROLLWIN_BOTTOM
; 
1391         if (event
.m_eventType 
== wxEVT_SCROLL_LINEUP
) { 
1392                 wevent
.m_eventType 
= wxEVT_SCROLLWIN_LINEUP
; 
1394         if (event
.m_eventType 
== wxEVT_SCROLL_LINEDOWN
) { 
1395                 wevent
.m_eventType 
= wxEVT_SCROLLWIN_LINEDOWN
; 
1397         if (event
.m_eventType 
== wxEVT_SCROLL_PAGEUP
) { 
1398                 wevent
.m_eventType 
= wxEVT_SCROLLWIN_PAGEUP
; 
1400         if (event
.m_eventType 
== wxEVT_SCROLL_PAGEDOWN
) { 
1401                 wevent
.m_eventType 
= wxEVT_SCROLLWIN_PAGEDOWN
; 
1403         if (event
.m_eventType 
== wxEVT_SCROLL_THUMBTRACK
) { 
1404                 wevent
.m_eventType 
= wxEVT_SCROLLWIN_THUMBTRACK
; 
1407             GetEventHandler()->ProcessEvent(wevent
); 
1411 bool wxWindow::SetFont(const wxFont
& font
) 
1413     if ( !wxWindowBase::SetFont(font
) ) 
1422 // Get the window with the focus 
1423 wxWindow 
*wxWindowBase::FindFocus() 
1425         return gFocusWindow 
; 
1428 #if WXWIN_COMPATIBILITY 
1429 // If nothing defined for this, try the parent. 
1430 // E.g. we may be a button loaded from a resource, with no callback function 
1432 void wxWindow::OnCommand(wxWindow
& win
, wxCommandEvent
& event
) 
1434     if ( GetEventHandler()->ProcessEvent(event
)  ) 
1437         m_parent
->GetEventHandler()->OnCommand(win
, event
); 
1439 #endif // WXWIN_COMPATIBILITY_2 
1441 #if WXWIN_COMPATIBILITY 
1442 wxObject
* wxWindow::GetChild(int number
) const 
1444     // Return a pointer to the Nth object in the Panel 
1445     wxNode 
*node 
= GetChildren().First(); 
1448         node 
= node
->Next(); 
1451         wxObject 
*obj 
= (wxObject 
*)node
->Data(); 
1457 #endif // WXWIN_COMPATIBILITY 
1459 void wxWindow::OnSetFocus(wxFocusEvent
& event
) 
1461     // panel wants to track the window which was the last to have focus in it, 
1462     // so we want to set ourselves as the window which last had focus 
1464     // notice that it's also important to do it upwards the tree becaus 
1465     // otherwise when the top level panel gets focus, it won't set it back to 
1466     // us, but to some other sibling 
1467     wxWindow 
*win 
= this; 
1470         wxWindow 
*parent 
= win
->GetParent(); 
1471         wxPanel 
*panel 
= wxDynamicCast(parent
, wxPanel
); 
1474             panel
->SetLastFocus(win
); 
1483 void wxWindow::Clear() 
1485         if ( m_macWindowData 
) 
1487                 wxMacDrawingClientHelper 
helper ( this ) ; 
1489                 wxPoint origin 
= GetClientAreaOrigin() ; 
1490                 GetClientSize( &w 
, &h 
) ; 
1491                 UMASetThemeWindowBackground( m_macWindowData
->m_macWindow 
, m_macWindowData
->m_macWindowBackgroundTheme 
, false ) ; 
1492                 Rect r 
= { origin
.y 
, origin
.x
, origin
.y
+h 
, origin
.x
+w 
} ; 
1497                 wxClientDC 
dc(this); 
1498         wxBrush 
brush(GetBackgroundColour(), wxSOLID
); 
1499         dc
.SetBackground(brush
); 
1504 // Setup background and foreground colours correctly 
1505 void wxWindow::SetupColours() 
1508         SetBackgroundColour(GetParent()->GetBackgroundColour()); 
1511 void wxWindow::OnIdle(wxIdleEvent
& event
) 
1514    // Check if we need to send a LEAVE event 
1515    if (m_mouseInWindow) 
1518        ::GetCursorPos(&pt); 
1519        if (::WindowFromPoint(pt) != (HWND) GetHWND()) 
1521            // Generate a LEAVE event 
1522            m_mouseInWindow = FALSE; 
1523            MSWOnMouseLeave(pt.x, pt.y, 0); 
1528     // This calls the UI-update mechanism (querying windows for 
1529     // menu/toolbar/control state information) 
1533 // Raise the window to the top of the Z order 
1534 void wxWindow::Raise() 
1536     if ( m_macWindowData 
) 
1538         UMABringToFront( m_macWindowData
->m_macWindow 
) ; 
1542 // Lower the window to the bottom of the Z order 
1543 void wxWindow::Lower() 
1545     if ( m_macWindowData 
) 
1547         UMASendBehind( m_macWindowData
->m_macWindow 
, NULL 
) ; 
1551 void wxWindow::DoSetClientSize(int width
, int height
) 
1553         if ( width 
!= -1 || height 
!= -1 ) 
1556                 if ( width 
!= -1 && m_vScrollBar 
) 
1557                         width 
+= MAC_SCROLLBAR_SIZE 
; 
1558                 if ( height 
!= -1 && m_vScrollBar 
) 
1559                         height 
+= MAC_SCROLLBAR_SIZE 
; 
1561                 width 
+= MacGetLeftBorderSize(  ) + MacGetRightBorderSize( ) ; 
1562                 height 
+= MacGetTopBorderSize(  ) + MacGetBottomBorderSize( ) ; 
1564                 DoSetSize( -1 , -1 , width 
, height 
) ; 
1569 wxWindow
* wxWindow::s_lastMouseWindow 
= NULL 
; 
1571 bool wxWindow::MacGetWindowFromPointSub( const wxPoint 
&point 
, wxWindow
** outWin 
)  
1573         if ((point
.x 
< m_x
) || (point
.y 
< m_y
) || 
1574                 (point
.x 
> (m_x 
+ m_width
)) || (point
.y 
> (m_y 
+ m_height
))) 
1577         WindowRef window 
= GetMacRootWindow() ; 
1579         wxPoint 
newPoint( point 
) ; 
1584         for (wxNode 
*node 
= GetChildren().First(); node
; node 
= node
->Next()) 
1586                 wxWindow 
*child 
= (wxWindow
*)node
->Data(); 
1587                 // added the m_isShown test --dmazzoni 
1588                 if ( child
->GetMacRootWindow() == window 
&& child
->m_isShown 
) 
1590                         if (child
->MacGetWindowFromPointSub(newPoint 
, outWin 
)) 
1599 bool wxWindow::MacGetWindowFromPoint( const wxPoint 
&screenpoint 
, wxWindow
** outWin 
)  
1602         Point pt 
= { screenpoint
.y 
, screenpoint
.x 
} ; 
1603         if ( ::FindWindow( pt 
, &window 
) == 3 ) 
1605                         wxPoint 
point( screenpoint 
) ; 
1606                         wxWindow
* win 
= wxFindWinFromMacWindow( window 
) ; 
1609                         win
->ScreenToClient( point 
) ; 
1610                         return win
->MacGetWindowFromPointSub( point 
, outWin 
) ; 
1616 extern int wxBusyCursorCount 
; 
1618 bool wxWindow::MacDispatchMouseEvent(wxMouseEvent
& event
) 
1620         if ((event
.m_x 
< m_x
) || (event
.m_y 
< m_y
) || 
1621                 (event
.m_x 
> (m_x 
+ m_width
)) || (event
.m_y 
> (m_y 
+ m_height
))) 
1625         if ( IsKindOf( CLASSINFO ( wxStaticBox 
) ) ) 
1628         WindowRef window 
= GetMacRootWindow() ; 
1636         for (wxNode 
*node 
= GetChildren().First(); node
; node 
= node
->Next()) 
1638                 wxWindow 
*child 
= (wxWindow
*)node
->Data(); 
1639                 if ( child
->GetMacRootWindow() == window 
&& child
->IsShown() && child
->IsEnabled() ) 
1641                         if (child
->MacDispatchMouseEvent(event
)) 
1649         if ( wxBusyCursorCount 
== 0 ) 
1651                 m_cursor
.MacInstall() ; 
1654         if ( event
.GetEventType() == wxEVT_LEFT_DOWN 
) 
1656         // set focus to this window 
1657         if (AcceptsFocus() && FindFocus()!=this) 
1662     if ( event
.GetEventType() == wxEVT_MOTION 
 
1663                 || event
.GetEventType() == wxEVT_ENTER_WINDOW
 
1664                 || event
.GetEventType() == wxEVT_LEAVE_WINDOW 
) 
1665         wxToolTip::RelayEvent( this , event
); 
1666 #endif // wxUSE_TOOLTIPS 
1667         GetEventHandler()->ProcessEvent( event 
) ; 
1674 wxString 
wxWindow::MacGetToolTipString( wxPoint 
&pt 
) 
1678                 return m_tooltip
->GetTip() ; 
1682 void wxWindow::MacFireMouseEvent( EventRecord 
*ev 
) 
1684         wxMouseEvent 
event(wxEVT_LEFT_DOWN
); 
1685         bool isDown 
= !(ev
->modifiers 
& btnState
) ; // 1 is for up 
1686         bool controlDown 
= ev
->modifiers 
& controlKey 
; // for simulating right mouse 
1688         event
.m_leftDown 
= isDown 
&& !controlDown
; 
1689         event
.m_middleDown 
= FALSE
; 
1690         event
.m_rightDown 
= isDown 
&& controlDown
; 
1692         if ( ev
->what 
== mouseDown 
) 
1695                         event
.SetEventType(wxEVT_RIGHT_DOWN 
) ; 
1697                         event
.SetEventType(wxEVT_LEFT_DOWN 
) ; 
1699         else if ( ev
->what 
== mouseUp 
) 
1702                         event
.SetEventType(wxEVT_RIGHT_UP 
) ; 
1704                         event
.SetEventType(wxEVT_LEFT_UP 
) ; 
1708                 event
.SetEventType(wxEVT_MOTION 
) ; 
1711         event
.m_shiftDown 
= ev
->modifiers 
& shiftKey
; 
1712         event
.m_controlDown 
= ev
->modifiers 
& controlKey
; 
1713         event
.m_altDown 
= ev
->modifiers 
& optionKey
; 
1714         event
.m_metaDown 
= ev
->modifiers 
& cmdKey
; 
1716         Point           localwhere 
= ev
->where 
; 
1719         ::GetPort( &port 
) ; 
1720         ::SetPort( UMAGetWindowPort( m_macWindowData
->m_macWindow 
) ) ; 
1721         ::GlobalToLocal( &localwhere 
) ; 
1724         if ( ev
->what 
== mouseDown 
) 
1726                 if ( ev
->when 
- lastWhen 
<= GetDblTime() ) 
1728                         if ( abs( localwhere
.h 
- lastWhere
.h 
) < 3 || abs( localwhere
.v 
- lastWhere
.v 
) < 3 ) 
1731                                         event
.SetEventType(wxEVT_RIGHT_DCLICK 
) ; 
1733                                         event
.SetEventType(wxEVT_LEFT_DCLICK 
) ; 
1739                     lastWhen 
= ev
->when 
; 
1741                 lastWhere 
= localwhere 
; 
1744         event
.m_x 
= localwhere
.h
; 
1745         event
.m_y 
= localwhere
.v
; 
1750         wxPoint origin = GetClientAreaOrigin() ; 
1752         event.m_x += origin.x ; 
1753         event.m_y += origin.y ; 
1756         event
.m_timeStamp 
= ev
->when
; 
1757         event
.SetEventObject(this); 
1758         if ( wxTheApp
->s_captureWindow 
) 
1762                 wxTheApp
->s_captureWindow
->ScreenToClient( &x 
, &y 
) ; 
1765                 wxTheApp
->s_captureWindow
->GetEventHandler()->ProcessEvent( event 
) ; 
1766                 if ( ev
->what 
== mouseUp 
) 
1768                         wxTheApp
->s_captureWindow 
= NULL 
; 
1769                         if ( wxBusyCursorCount 
== 0 ) 
1771                                 m_cursor
.MacInstall() ; 
1777                 MacDispatchMouseEvent( event 
) ; 
1781 void wxWindow::MacMouseDown( EventRecord 
*ev 
, short part
) 
1783         MacFireMouseEvent( ev 
) ; 
1786 void wxWindow::MacMouseUp( EventRecord 
*ev 
, short part
) 
1788         WindowPtr frontWindow 
; 
1793                                 MacFireMouseEvent( ev 
) ; 
1799 void wxWindow::MacMouseMoved( EventRecord 
*ev 
, short part
) 
1801         WindowPtr frontWindow 
; 
1806                                 MacFireMouseEvent( ev 
) ; 
1811 void wxWindow::MacActivate( EventRecord 
*ev 
, bool inIsActivating 
) 
1813     if ( !m_macWindowData
->m_macHasReceivedFirstActivate 
) 
1814         m_macWindowData
->m_macHasReceivedFirstActivate 
= true ; 
1816         wxActivateEvent 
event(wxEVT_ACTIVATE
, inIsActivating 
, m_windowId
); 
1817         event
.m_timeStamp 
= ev
->when 
; 
1818         event
.SetEventObject(this); 
1820         GetEventHandler()->ProcessEvent(event
); 
1823         UMAHighlightAndActivateWindow( m_macWindowData
->m_macWindow 
, inIsActivating 
) ; 
1824 //      MacUpdateImmediately() ; 
1827 void wxWindow::MacRedraw( RgnHandle updatergn 
, long time
) 
1829         // updatergn is always already clipped to our boundaries 
1830         WindowRef window 
= GetMacRootWindow() ; 
1831         // ownUpdateRgn is the area that this window has to invalidate i.e. its own area without its children 
1832         RgnHandle ownUpdateRgn 
= NewRgn() ; 
1833         CopyRgn( updatergn 
, ownUpdateRgn 
) ; 
1834         wxWindow
* win 
= wxFindWinFromMacWindow( window 
) ; 
1836                 wxMacDrawingHelper 
focus( this ) ; // was client 
1839                         WindowRef window 
= GetMacRootWindow() ; 
1840                         bool eraseBackground 
= false ; 
1841                         if ( m_macWindowData 
) 
1842                                 eraseBackground 
= true ; 
1843                         if ( m_backgroundColour 
== wxSystemSettings::GetSystemColour(wxSYS_COLOUR_APPWORKSPACE
) ) 
1845                                         UMASetThemeWindowBackground( window 
, kThemeBrushDocumentWindowBackground 
, false ) ; 
1847                         else if (  m_backgroundColour 
== wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE 
) ) 
1849                                         // on mac we have the difficult situation, that 3dface gray can be different colours, depending whether 
1850                                         // it is on a notebook panel or not, in order to take care of that we walk up the hierarchy until we have 
1851                                         // either a non gray background color or a non control window 
1854                                         wxWindow
* parent 
= GetParent() ; 
1857                                                 if ( parent
->GetMacRootWindow() != window 
) 
1859                                                         // we are in a different window on the mac system 
1864                                                 if( parent
->IsKindOf( CLASSINFO( wxControl 
) ) && ((wxControl
*)parent
)->GetMacControl() ) 
1866                                                         if ( parent
->m_backgroundColour 
!= wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE 
) ) 
1868                                                                 // if we have any other colours in the hierarchy 
1869                                                                 RGBBackColor( &parent
->m_backgroundColour
.GetPixel()) ; 
1872                                                         // if we have the normal colours in the hierarchy but another control etc. -> use it's background 
1873                                                         if ( parent
->IsKindOf( CLASSINFO( wxNotebook 
) ) || parent
->IsKindOf( CLASSINFO( wxTabCtrl 
) )) 
1876                                                                 GetRegionBounds( updatergn 
, &box
) ; 
1877                                                                 UMAApplyThemeBackground(kThemeBackgroundTabPane
, &box 
, kThemeStateActive
,8,true); 
1886                                                 parent 
= parent
->GetParent() ; 
1890                                                 // if there is nothing special -> use default 
1891                                                 UMASetThemeWindowBackground( window 
, kThemeBrushDialogBackgroundActive 
, false ) ; 
1896                                 RGBBackColor( &m_backgroundColour
.GetPixel()) ; 
1898             // subtract all non transparent children from updatergn 
1900             RgnHandle childarea 
= NewRgn() ; 
1901                 for (wxNode 
*node 
= GetChildren().First(); node
; node 
= node
->Next()) 
1903                         wxWindow 
*child 
= (wxWindow
*)node
->Data(); 
1904                         // eventually test for transparent windows 
1905                         if ( child
->GetMacRootWindow() == window 
&& child
->IsShown() ) 
1907                             if ( child
->GetBackgroundColour() != m_backgroundColour 
&& !child
->IsKindOf( CLASSINFO( wxControl 
) ) && ((wxControl
*)child
)->GetMacControl() ) 
1909                                 SetRectRgn( childarea 
, child
->m_x 
, child
->m_y 
, child
->m_x 
+ child
->m_width 
,  child
->m_y 
+ child
->m_height 
) ; 
1910                                 DiffRgn( ownUpdateRgn 
, childarea 
, ownUpdateRgn 
) ; 
1914                 DisposeRgn( childarea 
) ; 
1916                         if ( GetParent() && m_backgroundColour 
!= GetParent()->GetBackgroundColour() ) 
1917                                 eraseBackground 
= true ; 
1918                         SetClip( ownUpdateRgn 
) ; 
1919                         if ( m_macEraseOnRedraw 
) { 
1920                         if ( eraseBackground  
) 
1922                                 EraseRgn( ownUpdateRgn 
) ;       
1926                     m_macEraseOnRedraw 
= true ; 
1931                         RgnHandle newupdate 
= NewRgn() ; 
1932                         wxSize point 
= GetClientSize() ; 
1933                         wxPoint origin 
= GetClientAreaOrigin() ; 
1935                         SetRectRgn( newupdate 
, origin
.x 
, origin
.y 
, origin
.x 
+ point
.x 
, origin
.y
+point
.y 
) ; 
1936                         SectRgn( newupdate 
, ownUpdateRgn 
, newupdate 
) ; 
1937                         OffsetRgn( newupdate 
, -origin
.x 
, -origin
.y 
) ; 
1938                         m_updateRegion 
= newupdate 
; 
1939                         DisposeRgn( newupdate 
) ; 
1944                 event
.m_timeStamp 
= time 
; 
1945                 event
.SetEventObject(this); 
1946                 GetEventHandler()->ProcessEvent(event
); 
1950         RgnHandle childupdate 
= NewRgn() ; 
1952         for (wxNode 
*node 
= GetChildren().First(); node
; node 
= node
->Next()) 
1954                 wxWindow 
*child 
= (wxWindow
*)node
->Data(); 
1955                 SetRectRgn( childupdate 
, child
->m_x 
, child
->m_y 
, child
->m_x 
+ child
->m_width 
,  child
->m_y 
+ child
->m_height 
) ; 
1956                 SectRgn( childupdate 
, updatergn 
, childupdate 
) ; 
1957                 OffsetRgn( childupdate 
, -child
->m_x 
, -child
->m_y 
) ; 
1958                 if ( child
->GetMacRootWindow() == window 
&& child
->IsShown() && !EmptyRgn( childupdate 
) ) 
1960                         // because dialogs may also be children 
1961                         child
->MacRedraw( childupdate 
, time 
) ; 
1964         DisposeRgn( childupdate 
) ; 
1965         // eventually a draw grow box here 
1968 void wxWindow::MacUpdateImmediately() 
1970         WindowRef window 
= GetMacRootWindow() ; 
1973                 wxWindow
* win 
= wxFindWinFromMacWindow( window 
) ; 
1975                 AGAPortHelper 
help( GetWindowPort(window
) ) ; 
1977                 AGAPortHelper 
help( (window
) ) ; 
1979                 SetOrigin( 0 , 0 ) ; 
1980                 BeginUpdate( window 
) ; 
1983                         RgnHandle               region 
= NewRgn(); 
1987                     GetPortVisibleRegion( GetWindowPort( window 
), region 
); 
1989                                 // if windowshade gives incompatibility , take the follwing out 
1990                     if ( !EmptyRgn( region 
) && win
->m_macWindowData
->m_macHasReceivedFirstActivate 
) 
1992                                         win
->MacRedraw( region 
, wxTheApp
->sm_lastMessageTime 
) ; 
1994                     DisposeRgn( region 
); 
1997                 EndUpdate( window 
) ; 
2001 void wxWindow::MacUpdate( EventRecord 
*ev 
) 
2003         WindowRef window 
= (WindowRef
) ev
->message 
; 
2004         wxWindow 
* win 
= wxFindWinFromMacWindow( window 
) ; 
2006         AGAPortHelper 
help( GetWindowPort(window
) ) ; 
2008         AGAPortHelper 
help( (window
) ) ; 
2010         SetOrigin( 0 , 0 ) ; 
2011         BeginUpdate( window 
) ; 
2014                 RgnHandle               region 
= NewRgn(); 
2018             GetPortVisibleRegion( GetWindowPort( window 
), region 
); 
2020                         // if windowshade gives incompatibility , take the follwing out 
2021             if ( !EmptyRgn( region 
) && win
->m_macWindowData
->m_macHasReceivedFirstActivate 
) 
2023                                 MacRedraw( region 
, ev
->when 
) ; 
2025             DisposeRgn( region 
); 
2028         EndUpdate( window 
) ; 
2031 WindowRef 
wxWindow::GetMacRootWindow() const 
2033         WindowRef window 
= NULL 
; 
2034         wxWindow 
*iter 
= (wxWindow
*)this ; 
2038                 if ( iter
->m_macWindowData 
) 
2039                         return iter
->m_macWindowData
->m_macWindow 
; 
2041                 iter 
= iter
->GetParent() ; 
2043         wxASSERT_MSG( 1 , "No valid mac root window" ) ; 
2047 void wxWindow::MacCreateScrollBars( long style 
)  
2049         wxASSERT_MSG( m_vScrollBar 
== NULL 
&& m_hScrollBar 
== NULL 
, "attempt to create window twice" ) ; 
2051         bool hasBoth 
= ( style 
& wxVSCROLL 
) && ( style 
& wxHSCROLL 
) ; 
2052         int adjust 
= hasBoth 
? MAC_SCROLLBAR_SIZE 
- 1: 0 ; 
2054         GetClientSize( &width 
, &height 
) ; 
2056         wxPoint 
vPoint(width
-MAC_SCROLLBAR_SIZE
, 0) ; 
2057         wxSize 
vSize(MAC_SCROLLBAR_SIZE
, height 
- adjust
) ; 
2058         wxPoint 
hPoint(0 , height
-MAC_SCROLLBAR_SIZE 
) ; 
2059         wxSize 
hSize( width 
- adjust
, MAC_SCROLLBAR_SIZE
) ; 
2061         m_vScrollBar 
= new wxScrollBar(this, wxWINDOW_VSCROLL
, vPoint
,  
2062                 vSize 
, wxVERTICAL
); 
2064         if ( style 
& wxVSCROLL 
) 
2070                 m_vScrollBar
->Show(false) ; 
2072         m_hScrollBar 
= new wxScrollBar(this, wxWINDOW_HSCROLL
, hPoint
,  
2073                 hSize 
, wxHORIZONTAL
); 
2074         if ( style  
& wxHSCROLL 
) 
2079                 m_hScrollBar
->Show(false) ; 
2082         // because the create does not take into account the client area origin 
2083         MacRepositionScrollBars() ; // we might have a real position shift 
2086 void wxWindow::MacRepositionScrollBars() 
2088         bool hasBoth 
= ( m_hScrollBar 
&& m_hScrollBar
->IsShown()) && ( m_vScrollBar 
&& m_vScrollBar
->IsShown()) ; 
2089         int adjust 
= hasBoth 
? MAC_SCROLLBAR_SIZE 
- 1 : 0 ; 
2091         // get real client area 
2093         int width 
= m_width 
;  
2094         int height 
= m_height 
; 
2096         width 
-= MacGetLeftBorderSize() + MacGetRightBorderSize(); 
2097         height 
-= MacGetTopBorderSize() + MacGetBottomBorderSize(); 
2099         wxPoint 
vPoint(width
-MAC_SCROLLBAR_SIZE
, 0) ; 
2100         wxSize 
vSize(MAC_SCROLLBAR_SIZE
, height 
- adjust
) ; 
2101         wxPoint 
hPoint(0 , height
-MAC_SCROLLBAR_SIZE 
) ; 
2102         wxSize 
hSize( width 
- adjust
, MAC_SCROLLBAR_SIZE
) ; 
2109         MacClientToRootWindow( &x 
, &y 
) ; 
2110         MacClientToRootWindow( &w 
, &h 
) ; 
2112         WindowRef window 
= NULL 
; 
2113         wxWindow 
*iter 
= (wxWindow
*)this ; 
2115         int totW 
= 10000 , totH 
= 10000; 
2118                 if ( iter
->m_macWindowData 
) 
2120                         totW 
= iter
->m_width 
; 
2121                         totH 
= iter
->m_height 
; 
2125                 iter 
= iter
->GetParent() ; 
2153                 m_vScrollBar
->SetSize( vPoint
.x 
, vPoint
.y
, vSize
.x
, vSize
.y 
, wxSIZE_ALLOW_MINUS_ONE
); 
2157                 m_hScrollBar
->SetSize( hPoint
.x 
, hPoint
.y
, hSize
.x
, hSize
.y
, wxSIZE_ALLOW_MINUS_ONE
); 
2161 void wxWindow::MacKeyDown( EventRecord 
*ev 
)  
2167 bool wxWindow::AcceptsFocus() const 
2169     return MacCanFocus() && wxWindowBase::AcceptsFocus(); 
2172 ControlHandle 
wxWindow::MacGetContainerForEmbedding()  
2174         if ( m_macWindowData 
) 
2175                 return m_macWindowData
->m_macRootControl 
; 
2177                 return GetParent()->MacGetContainerForEmbedding() ; 
2180 void wxWindow::MacSuperChangedPosition()  
2182         // only window-absolute structures have to be moved i.e. controls 
2184         wxNode 
*node 
= GetChildren().First(); 
2187                 wxWindow 
*child 
= (wxWindow 
*)node
->Data(); 
2188                 child
->MacSuperChangedPosition() ; 
2189                 node 
= node
->Next(); 
2193 bool wxWindow::MacSetPortFocusParams( const Point 
& localOrigin
, const Rect 
& clipRect
, WindowRef window 
, wxWindow
* win 
)  
2195         if ( window 
== NULL 
) 
2201         ::GetPort(&currPort
); 
2202         port 
= UMAGetWindowPort( window
) ; 
2203         if (currPort 
!= port 
) 
2206 //      wxASSERT( port->portRect.left == 0 && port->portRect.top == 0 ) ;  
2207         ::SetOrigin(-localOrigin
.h
, -localOrigin
.v
); 
2211 bool wxWindow::MacSetPortDrawingParams( const Point 
& localOrigin
, const Rect 
& clipRect
, WindowRef window 
, wxWindow
* win 
)  
2213         if ( window 
== NULL 
) 
2218         ::GetPort(&currPort
); 
2219         port 
= UMAGetWindowPort( window
) ; 
2220         if (currPort 
!= port 
) 
2222 //      wxASSERT( port->portRect.left == 0 && port->portRect.top == 0 ) ;  
2223         ::SetOrigin(-localOrigin
.h
, -localOrigin
.v
); 
2224         ::ClipRect(&clipRect
); 
2227         ::RGBBackColor(& win
->GetBackgroundColour().GetPixel() ) ; 
2228         ::RGBForeColor(& win
->GetForegroundColour().GetPixel() ) ; 
2229         Pattern whiteColor 
; 
2231         ::BackPat( GetQDGlobalsWhite( &whiteColor
) ) ; 
2232         ::UMASetThemeWindowBackground(  win
->m_macWindowData
->m_macWindow 
, win
->m_macWindowData
->m_macWindowBackgroundTheme 
,  false ) ; 
2236 void wxWindow::MacGetPortParams(Point
* localOrigin
, Rect
* clipRect
, WindowRef 
*window  
, wxWindow
** rootwin
)  
2238         if ( m_macWindowData 
) 
2244                 clipRect
->right 
= m_width
; 
2245                 clipRect
->bottom 
= m_height
; 
2246                 *window 
= m_macWindowData
->m_macWindow 
; 
2251                 wxASSERT( GetParent() != NULL 
) ; 
2252                 GetParent()->MacGetPortParams( localOrigin 
, clipRect 
, window
, rootwin
) ; 
2253                 localOrigin
->h 
+= m_x
; 
2254                 localOrigin
->v 
+= m_y
; 
2255                 OffsetRect(clipRect
, -m_x
, -m_y
); 
2260                 myClip
.right 
= m_width
; 
2261                 myClip
.bottom 
= m_height
; 
2262                 SectRect(clipRect
, &myClip
, clipRect
); 
2266 void wxWindow::MacDoGetPortClientParams(Point
* localOrigin
, Rect
* clipRect
, WindowRef 
*window 
, wxWindow
** rootwin 
)  
2268 //      int width , height ; 
2269 //      GetClientSize( &width , &height ) ; 
2271         if ( m_macWindowData 
) 
2277                 clipRect
->right 
= m_width 
;//width; 
2278                 clipRect
->bottom 
= m_height 
;// height; 
2279                 *window 
= m_macWindowData
->m_macWindow 
; 
2284                 wxASSERT( GetParent() != NULL 
) ; 
2286                 GetParent()->MacDoGetPortClientParams( localOrigin 
, clipRect 
, window
, rootwin
) ; 
2288                 localOrigin
->h 
+= m_x
; 
2289                 localOrigin
->v 
+= m_y
; 
2290                 OffsetRect(clipRect
, -m_x
, -m_y
); 
2295                 myClip
.right 
= m_width 
;//width; 
2296                 myClip
.bottom 
= m_height 
;// height; 
2297                 SectRect(clipRect
, &myClip
, clipRect
); 
2301 void wxWindow::MacGetPortClientParams(Point
* localOrigin
, Rect
* clipRect
, WindowRef 
*window 
, wxWindow
** rootwin 
)  
2303         MacDoGetPortClientParams( localOrigin 
, clipRect 
, window 
, rootwin 
) ; 
2305         int width 
, height 
; 
2306         GetClientSize( &width 
, &height 
) ; 
2308         client 
= GetClientAreaOrigin( ) ; 
2310         localOrigin
->h 
+= client
.x
; 
2311         localOrigin
->v 
+= client
.y
; 
2312         OffsetRect(clipRect
, -client
.x
, -client
.y
); 
2317         myClip
.right 
= width
; 
2318         myClip
.bottom 
= height
; 
2319         SectRect(clipRect
, &myClip
, clipRect
); 
2322 long wxWindow::MacGetLeftBorderSize( ) const 
2324         if( m_macWindowData 
) 
2327     if (m_windowStyle 
& wxRAISED_BORDER 
|| m_windowStyle 
& wxSUNKEN_BORDER 
) 
2331     else if (  m_windowStyle 
&wxDOUBLE_BORDER
) 
2335     else if (m_windowStyle 
&wxSIMPLE_BORDER
) 
2342 long wxWindow::MacGetRightBorderSize( ) const 
2344         if( m_macWindowData 
) 
2347     if (m_windowStyle 
& wxRAISED_BORDER 
|| m_windowStyle 
& wxSUNKEN_BORDER 
) 
2351     else if (  m_windowStyle 
&wxDOUBLE_BORDER
) 
2355     else if (m_windowStyle 
&wxSIMPLE_BORDER
) 
2362 long wxWindow::MacGetTopBorderSize( ) const 
2364         if( m_macWindowData 
) 
2367     if (m_windowStyle 
& wxRAISED_BORDER 
|| m_windowStyle 
& wxSUNKEN_BORDER 
) 
2371     else if (  m_windowStyle 
&wxDOUBLE_BORDER
) 
2375     else if (m_windowStyle 
&wxSIMPLE_BORDER
) 
2382 long wxWindow::MacGetBottomBorderSize( ) const 
2384         if( m_macWindowData 
) 
2387     if (m_windowStyle 
& wxRAISED_BORDER 
|| m_windowStyle 
& wxSUNKEN_BORDER 
) 
2391     else if (  m_windowStyle 
&wxDOUBLE_BORDER
) 
2395     else if (m_windowStyle 
&wxSIMPLE_BORDER
) 
2402 long wxWindow::MacRemoveBordersFromStyle( long style 
)  
2404         return style 
& ~( wxDOUBLE_BORDER 
| wxSUNKEN_BORDER 
| wxRAISED_BORDER 
| wxBORDER 
| wxSTATIC_BORDER 
) ; 
2408 wxMacDrawingHelper::wxMacDrawingHelper( wxWindow 
* theWindow 
)  
2415         m_currentPort 
= NULL 
; 
2417         GetPort( &m_formerPort 
) ; 
2420                 theWindow
->MacGetPortParams( &localOrigin 
, &clipRect 
, &window 
, &rootwin
) ; 
2421                 m_currentPort 
= UMAGetWindowPort( window 
) ; 
2422                 if ( m_formerPort 
!= m_currentPort 
) 
2423                         SetPort( m_currentPort 
) ; 
2424                 GetPenState( &m_savedPenState 
) ; 
2425                 theWindow
->MacSetPortDrawingParams( localOrigin
, clipRect
, window 
, rootwin 
) ;  
2430 wxMacDrawingHelper::~wxMacDrawingHelper()  
2434                 SetPort( m_currentPort 
) ; 
2435                 SetPenState( &m_savedPenState 
) ; 
2436                 SetOrigin( 0 , 0 ) ; 
2438                 GetPortBounds( m_currentPort 
, &portRect 
) ; 
2439                 ClipRect( &portRect 
) ; 
2442         if ( m_formerPort 
!= m_currentPort 
) 
2443                 SetPort( m_formerPort 
) ; 
2446 wxMacDrawingClientHelper::wxMacDrawingClientHelper( wxWindow 
* theWindow 
)  
2453         m_currentPort 
= NULL 
; 
2455         GetPort( &m_formerPort 
) ; 
2459                 theWindow
->MacGetPortClientParams( &localOrigin 
, &clipRect 
, &window 
, &rootwin
) ; 
2460                 m_currentPort 
= UMAGetWindowPort( window 
) ; 
2461                 if ( m_formerPort 
!= m_currentPort 
) 
2462                         SetPort( m_currentPort 
) ; 
2463                 GetPenState( &m_savedPenState 
) ; 
2464                 theWindow
->MacSetPortDrawingParams( localOrigin
, clipRect
, window 
, rootwin 
) ;  
2469 wxMacDrawingClientHelper::~wxMacDrawingClientHelper()  
2473                 SetPort( m_currentPort 
) ; 
2474                 SetPenState( &m_savedPenState 
) ; 
2475                 SetOrigin( 0 , 0 ) ; 
2477                 GetPortBounds( m_currentPort 
, &portRect 
) ; 
2478                 ClipRect( &portRect 
) ; 
2481         if ( m_formerPort 
!= m_currentPort 
) 
2482                 SetPort( m_formerPort 
) ; 
2485 // Find the wxWindow at the current mouse position, returning the mouse 
2487 wxWindow
* wxFindWindowAtPointer(wxPoint
& pt
) 
2489     pt 
= wxGetMousePosition(); 
2490     wxWindow
* found 
= wxFindWindowAtPoint(pt
); 
2494 // Get the current mouse position. 
2495 wxPoint 
wxGetMousePosition() 
2498     wxGetMousePosition(& x
, & y
); 
2499     return wxPoint(x
, y
);