+ // send new focus event
+ {
+ EventRef evRef = NULL ;
+ verify_noerr( MacCreateEvent( NULL , kEventClassControl , kEventControlSetFocusPart , TicksToEventTime( TickCount() ) , kEventAttributeUserEvent ,
+ &evRef ) );
+
+ wxMacCarbonEvent cEvent( evRef ) ;
+ cEvent.SetParameter<ControlRef>( kEventParamDirectObject , (ControlRef) GetHandle() ) ;
+ cEvent.SetParameter<ControlPartCode>(kEventParamControlPart , typeControlPartCode , kControlFocusNextPart ) ;
+
+ wxMacWindowEventHandler( NULL , evRef , this ) ;
+ ReleaseEvent(evRef) ;
+ }
+#endif
+ }
+}
+
+
+void wxWindowMac::DoCaptureMouse()
+{
+ wxTheApp->s_captureWindow = this ;
+}
+
+wxWindow* wxWindowBase::GetCapture()
+{
+ return wxTheApp->s_captureWindow ;
+}
+
+void wxWindowMac::DoReleaseMouse()
+{
+ wxTheApp->s_captureWindow = NULL ;
+}
+
+#if wxUSE_DRAG_AND_DROP
+
+void wxWindowMac::SetDropTarget(wxDropTarget *pDropTarget)
+{
+ if ( m_dropTarget != 0 ) {
+ delete m_dropTarget;
+ }
+
+ m_dropTarget = pDropTarget;
+ if ( m_dropTarget != 0 )
+ {
+ // TODO
+ }
+}
+
+#endif
+
+// Old style file-manager drag&drop
+void wxWindowMac::DragAcceptFiles(bool accept)
+{
+ // TODO
+}
+
+// Returns the size of the native control. In the case of the toplevel window
+// this is the content area root control
+
+void wxWindowMac::MacGetPositionAndSizeFromControl(int& x, int& y,
+ int& w, int& h) const
+{
+ Rect bounds ;
+ m_peer->GetRect( &bounds ) ;
+
+
+ x = bounds.left ;
+ y = bounds.top ;
+ w = bounds.right - bounds.left ;
+ h = bounds.bottom - bounds.top ;
+}
+
+// From a wx position / size calculate the appropriate size of the native control
+
+bool wxWindowMac::MacGetBoundsForControl(const wxPoint& pos,
+ const wxSize& size,
+ int& x, int& y,
+ int& w, int& h , bool adjustOrigin ) const
+{
+ // the desired size, minus the border pixels gives the correct size of the control
+
+ x = (int)pos.x;
+ y = (int)pos.y;
+ // todo the default calls may be used as soon as PostCreateControl Is moved here
+ w = size.x ; // WidthDefault( size.x );
+ h = size.y ; // HeightDefault( size.y ) ;
+#if !TARGET_API_MAC_OSX
+ GetParent()->MacWindowToRootWindow( &x , &y ) ;
+#endif
+
+ x += MacGetLeftBorderSize() ;
+ y += MacGetTopBorderSize() ;
+ w -= MacGetLeftBorderSize() + MacGetRightBorderSize() ;
+ h -= MacGetTopBorderSize() + MacGetBottomBorderSize() ;
+
+ if ( adjustOrigin )
+ AdjustForParentClientOrigin( x , y ) ;
+#if TARGET_API_MAC_OSX
+ // this is in window relative coordinate, as this parent may have a border, its physical position is offset by this border
+ if ( ! GetParent()->IsTopLevel() )
+ {
+ x -= GetParent()->MacGetLeftBorderSize() ;
+ y -= GetParent()->MacGetTopBorderSize() ;
+ }
+#endif
+ return true ;
+}
+
+// Get window size (not client size)
+void wxWindowMac::DoGetSize(int *x, int *y) const
+{
+ // take the size of the control and add the borders that have to be drawn outside
+ int x1 , y1 , w1 , h1 ;
+
+ MacGetPositionAndSizeFromControl( x1 , y1, w1 ,h1 ) ;
+
+ w1 += MacGetLeftBorderSize() + MacGetRightBorderSize() ;
+ h1 += MacGetTopBorderSize() + MacGetBottomBorderSize() ;
+
+ if(x) *x = w1 ;
+ if(y) *y = h1 ;
+}
+
+// get the position of the bounds of this window in client coordinates of its parent
+void wxWindowMac::DoGetPosition(int *x, int *y) const
+{
+ int x1 , y1 , w1 ,h1 ;
+ MacGetPositionAndSizeFromControl( x1 , y1, w1 ,h1 ) ;
+ x1 -= MacGetLeftBorderSize() ;
+ y1 -= MacGetTopBorderSize() ;
+ // to non-client
+ #if !TARGET_API_MAC_OSX
+ if ( !GetParent()->IsTopLevel() )
+ {
+ Rect bounds ;
+ GetControlBounds( (ControlRef) GetParent()->GetHandle() , &bounds ) ;
+ x1 -= bounds.left ;
+ y1 -= bounds.top ;
+ }
+#endif
+ if ( !IsTopLevel() )
+ {
+ wxWindow *parent = GetParent();
+ if ( parent )
+ {
+ // we must first adjust it to be in window coordinates of the parent, as otherwise it gets lost by the clientareaorigin fix
+ x1 += parent->MacGetLeftBorderSize() ;
+ y1 += parent->MacGetTopBorderSize() ;
+ // and now to client coordinates
+ wxPoint pt(parent->GetClientAreaOrigin());
+ x1 -= pt.x ;
+ y1 -= pt.y ;
+ }
+ }
+ if(x) *x = x1 ;
+ if(y) *y = y1 ;
+}
+
+void wxWindowMac::DoScreenToClient(int *x, int *y) const
+{
+ WindowRef window = (WindowRef) MacGetTopLevelWindowRef() ;
+
+ wxCHECK_RET( window , wxT("TopLevel Window Missing") ) ;
+
+ {
+ Point localwhere = {0,0} ;
+
+ if(x) localwhere.h = * x ;
+ if(y) localwhere.v = * y ;
+
+ QDGlobalToLocalPoint( GetWindowPort( window ) , &localwhere ) ;
+ if(x) *x = localwhere.h ;
+ if(y) *y = localwhere.v ;
+
+ }
+ MacRootWindowToWindow( x , y ) ;
+
+ wxPoint origin = GetClientAreaOrigin() ;
+ if(x) *x -= origin.x ;
+ if(y) *y -= origin.y ;
+}
+
+void wxWindowMac::DoClientToScreen(int *x, int *y) const
+{
+ WindowRef window = (WindowRef) MacGetTopLevelWindowRef() ;
+ wxCHECK_RET( window , wxT("TopLevel Window Missing") ) ;
+
+ wxPoint origin = GetClientAreaOrigin() ;
+ if(x) *x += origin.x ;
+ if(y) *y += origin.y ;
+
+ MacWindowToRootWindow( x , y ) ;
+
+ {
+ Point localwhere = { 0,0 };
+ if(x) localwhere.h = * x ;
+ if(y) localwhere.v = * y ;
+ QDLocalToGlobalPoint( GetWindowPort( window ) , &localwhere ) ;
+ if(x) *x = localwhere.h ;
+ if(y) *y = localwhere.v ;
+ }
+}
+
+void wxWindowMac::MacClientToRootWindow( int *x , int *y ) const
+{
+ wxPoint origin = GetClientAreaOrigin() ;
+ if(x) *x += origin.x ;
+ if(y) *y += origin.y ;
+
+ MacWindowToRootWindow( x , y ) ;
+}
+
+void wxWindowMac::MacRootWindowToClient( int *x , int *y ) const
+{
+ MacRootWindowToWindow( x , y ) ;
+
+ wxPoint origin = GetClientAreaOrigin() ;
+ if(x) *x -= origin.x ;
+ if(y) *y -= origin.y ;
+}
+
+void wxWindowMac::MacWindowToRootWindow( int *x , int *y ) const
+{
+ #if TARGET_API_MAC_OSX
+ wxPoint pt ;
+ if ( x ) pt.x = *x ;
+ if ( y ) pt.y = *y ;
+
+ if ( !IsTopLevel() )
+ {
+ wxTopLevelWindowMac* top = MacGetTopLevelWindow();
+ if (top)
+ {
+ pt.x -= MacGetLeftBorderSize() ;
+ pt.y -= MacGetTopBorderSize() ;
+ wxMacControl::Convert( &pt , m_peer , top->m_peer ) ;
+ }
+ }
+
+ if ( x ) *x = (int) pt.x ;
+ if ( y ) *y = (int) pt.y ;
+ #else
+ if ( !IsTopLevel() )
+ {
+ Rect bounds ;
+ m_peer->GetRect( &bounds ) ;
+ if(x) *x += bounds.left - MacGetLeftBorderSize() ;
+ if(y) *y += bounds.top - MacGetTopBorderSize() ;
+ }
+#endif
+}
+
+void wxWindowMac::MacWindowToRootWindow( short *x , short *y ) const
+{
+ int x1 , y1 ;
+ if ( x ) x1 = *x ;
+ if ( y ) y1 = *y ;
+ MacWindowToRootWindow( &x1 , &y1 ) ;
+ if ( x ) *x = x1 ;
+ if ( y ) *y = y1 ;
+}
+
+void wxWindowMac::MacRootWindowToWindow( int *x , int *y ) const
+{
+ #if TARGET_API_MAC_OSX
+ wxPoint pt ;
+ if ( x ) pt.x = *x ;
+ if ( y ) pt.y = *y ;
+
+ if ( !IsTopLevel() )
+ {
+ wxMacControl::Convert( &pt , MacGetTopLevelWindow()->m_peer , m_peer ) ;
+ pt.x += MacGetLeftBorderSize() ;
+ pt.y += MacGetTopBorderSize() ;
+ }
+
+ if ( x ) *x = (int) pt.x ;
+ if ( y ) *y = (int) pt.y ;
+ #else
+ if ( !IsTopLevel() )
+ {
+ Rect bounds ;
+ m_peer->GetRect( &bounds ) ;
+ if(x) *x -= bounds.left + MacGetLeftBorderSize() ;
+ if(y) *y -= bounds.top + MacGetTopBorderSize() ;
+ }
+#endif
+}
+
+void wxWindowMac::MacRootWindowToWindow( short *x , short *y ) const
+{
+ int x1 , y1 ;
+ if ( x ) x1 = *x ;
+ if ( y ) y1 = *y ;
+ MacRootWindowToWindow( &x1 , &y1 ) ;
+ if ( x ) *x = x1 ;
+ if ( y ) *y = y1 ;
+}
+
+void wxWindowMac::MacGetContentAreaInset( int &left , int &top , int &right , int &bottom )
+{
+ RgnHandle rgn = NewRgn() ;
+ Rect content ;
+ if ( m_peer->GetRegion( kControlContentMetaPart , rgn ) == noErr )
+ {
+ GetRegionBounds( rgn , &content ) ;
+ }
+ else
+ {
+ m_peer->GetRect( &content ) ;
+ }
+ DisposeRgn( rgn ) ;
+ Rect structure ;
+ m_peer->GetRect( &structure ) ;
+#if !TARGET_API_MAC_OSX
+ OffsetRect( &content , -structure.left , -structure.top ) ;
+#endif
+ left = content.left - structure.left ;
+ top = content.top - structure.top ;
+ right = structure.right - content.right ;
+ bottom = structure.bottom - content.bottom ;
+}
+
+wxSize wxWindowMac::DoGetSizeFromClientSize( const wxSize & size ) const
+{
+ wxSize sizeTotal = size;
+
+ RgnHandle rgn = NewRgn() ;
+
+ Rect content ;
+
+ if ( m_peer->GetRegion( kControlContentMetaPart , rgn ) == noErr )
+ {
+ GetRegionBounds( rgn , &content ) ;
+ }
+ else
+ {
+ m_peer->GetRect( &content ) ;
+ }
+ DisposeRgn( rgn ) ;
+ Rect structure ;
+ m_peer->GetRect( &structure ) ;
+#if !TARGET_API_MAC_OSX
+ OffsetRect( &content , -structure.left , -structure.top ) ;
+#endif
+
+ sizeTotal.x += (structure.right - structure.left) - (content.right - content.left) ;
+ sizeTotal.y += (structure.bottom - structure.top) - (content.bottom - content.top ) ;
+
+ sizeTotal.x += MacGetLeftBorderSize( ) + MacGetRightBorderSize( ) ;
+ sizeTotal.y += MacGetTopBorderSize( ) + MacGetBottomBorderSize( ) ;
+
+ return sizeTotal;
+}
+
+
+// Get size *available for subwindows* i.e. excluding menu bar etc.
+void wxWindowMac::DoGetClientSize(int *x, int *y) const
+{
+ int ww, hh;
+
+ RgnHandle rgn = NewRgn() ;
+ Rect content ;
+ if ( m_peer->GetRegion( kControlContentMetaPart , rgn ) == noErr )
+ {
+ GetRegionBounds( rgn , &content ) ;
+ }
+ else
+ {
+ m_peer->GetRect( &content ) ;
+ }
+ DisposeRgn( rgn ) ;
+#if !TARGET_API_MAC_OSX
+ Rect structure ;
+ m_peer->GetRect( &structure ) ;
+ OffsetRect( &content , -structure.left , -structure.top ) ;
+#endif
+ ww = content.right - content.left ;
+ hh = content.bottom - content.top ;
+ /*
+ ww -= MacGetLeftBorderSize( ) + MacGetRightBorderSize( ) ;
+ hh -= MacGetTopBorderSize( ) + MacGetBottomBorderSize( );
+ */
+ /*
+ if ( (m_vScrollBar && m_vScrollBar->IsShown()) || (m_hScrollBar && m_hScrollBar->IsShown()) )
+ {
+ int x1 = 0 ;
+ int y1 = 0 ;
+ int w ;
+ int h ;
+ GetSize( &w , &h ) ;
+
+ MacClientToRootWindow( &x1 , &y1 ) ;
+ MacClientToRootWindow( &w , &h ) ;
+
+ wxWindowMac *iter = (wxWindowMac*)this ;
+
+ int totW = 10000 , totH = 10000;
+ while( iter )
+ {
+ if ( iter->IsTopLevel() )
+ {
+ iter->GetSize( &totW , &totH ) ;
+ break ;
+ }
+
+ iter = iter->GetParent() ;
+ }
+
+ if (m_hScrollBar && m_hScrollBar->IsShown() )
+ {
+ hh -= m_hScrollBar->GetSize().y ; // MAC_SCROLLBAR_SIZE ;
+ if ( h-y1 >= totH )
+ {
+ hh += 1 ;
+ }
+ }
+ if (m_vScrollBar && m_vScrollBar->IsShown() )
+ {
+ ww -= m_vScrollBar->GetSize().x ; // MAC_SCROLLBAR_SIZE;
+ if ( w-x1 >= totW )
+ {
+ ww += 1 ;
+ }
+ }
+ }
+ */
+ if (m_hScrollBar && m_hScrollBar->IsShown() )
+ {
+ hh -= m_hScrollBar->GetSize().y ; // MAC_SCROLLBAR_SIZE ;
+ }
+ if (m_vScrollBar && m_vScrollBar->IsShown() )
+ {
+ ww -= m_vScrollBar->GetSize().x ; // MAC_SCROLLBAR_SIZE;
+ }
+ if(x) *x = ww;
+ if(y) *y = hh;
+
+}
+
+bool wxWindowMac::SetCursor(const wxCursor& cursor)
+{
+ if (m_cursor == cursor)
+ return FALSE;
+
+ if (wxNullCursor == cursor)
+ {
+ if ( ! wxWindowBase::SetCursor( *wxSTANDARD_CURSOR ) )
+ return FALSE ;
+ }
+ else
+ {
+ if ( ! wxWindowBase::SetCursor( cursor ) )
+ return FALSE ;
+ }
+
+ wxASSERT_MSG( m_cursor.Ok(),
+ wxT("cursor must be valid after call to the base version"));
+
+
+ wxWindowMac *mouseWin = 0 ;
+ {
+ WindowRef window = (WindowRef) MacGetTopLevelWindowRef() ;
+ CGrafPtr savePort ;
+ Boolean swapped = QDSwapPort( GetWindowPort( window ) , &savePort ) ;
+
+ // TODO If we ever get a GetCurrentEvent.. replacement for the mouse
+ // position, use it...
+
+ Point pt ;
+ GetMouse( &pt ) ;
+ ControlPartCode part ;
+ ControlRef control ;
+ control = wxMacFindControlUnderMouse( pt , window , &part ) ;
+ if ( control )
+ mouseWin = wxFindControlFromMacControl( control ) ;
+
+ if ( swapped )
+ QDSwapPort( savePort , NULL ) ;
+ }
+
+ if ( mouseWin == this && !wxIsBusy() )
+ {
+ m_cursor.MacInstall() ;
+ }
+
+ return TRUE ;
+}
+
+#if wxUSE_MENUS
+bool wxWindowMac::DoPopupMenu(wxMenu *menu, int x, int y)
+{
+ menu->SetInvokingWindow(this);
+ menu->UpdateUI();