+void wxWindowMac::MacGetPositionAndSizeFromControl(int& x, int& y,
+ int& w, int& h) const
+{
+ Rect bounds ;
+ GetControlBounds( (ControlRef) m_macControl , &bounds ) ;
+
+
+ x = bounds.left ;
+ y = bounds.top ;
+ w = bounds.right - bounds.left ;
+ h = bounds.bottom - bounds.top ;
+
+ wxTopLevelWindow* tlw = wxDynamicCast( this , wxTopLevelWindow ) ;
+ if ( tlw )
+ {
+ Point tlworigin = { 0 , 0 } ;
+ GrafPtr port ;
+ bool swapped = QDSwapPort( UMAGetWindowPort( (WindowRef) tlw->MacGetWindowRef() ) , &port ) ;
+ ::LocalToGlobal( &tlworigin ) ;
+ if ( swapped )
+ ::SetPort( port ) ;
+ x = tlworigin.h ;
+ y = tlworigin.v ;
+ }
+}
+
+bool wxWindowMac::MacGetBoundsForControl(const wxPoint& pos,
+ const wxSize& size,
+ int& x, int& y,
+ int& w, int& h , bool adjustOrigin ) const
+{
+ 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
+ if ( adjustOrigin )
+ AdjustForParentClientOrigin( x , y ) ;
+ return true ;
+}
+
+// Get total size
+void wxWindowMac::DoGetSize(int *x, int *y) const
+{
+#if TARGET_API_MAC_OSX
+ int x1 , y1 , w1 ,h1 ;
+ MacGetPositionAndSizeFromControl( x1 , y1, w1 ,h1 ) ;
+ if(x) *x = w1 ;
+ if(y) *y = h1 ;
+
+#else
+ Rect bounds ;
+ GetControlBounds( (ControlRef) m_macControl , &bounds ) ;
+ if(x) *x = bounds.right - bounds.left ;
+ if(y) *y = bounds.bottom - bounds.top ;
+#endif
+}
+
+void wxWindowMac::DoGetPosition(int *x, int *y) const
+{
+ #if TARGET_API_MAC_OSX
+ int x1 , y1 , w1 ,h1 ;
+ MacGetPositionAndSizeFromControl( x1 , y1, w1 ,h1 ) ;
+ if ( !IsTopLevel() )
+ {
+ wxWindow *parent = GetParent();
+ if ( parent )
+ {
+ wxPoint pt(parent->GetClientAreaOrigin());
+ x1 -= pt.x ;
+ y1 -= pt.y ;
+ }
+ }
+ if(x) *x = x1 ;
+ if(y) *y = y1 ;
+ #else
+ Rect bounds ;
+ GetControlBounds( (ControlRef) m_macControl , &bounds ) ;
+ wxCHECK_RET( GetParent() , wxT("Missing Parent") ) ;
+
+ int xx = bounds.left ;
+ int yy = bounds.top ;
+
+ if ( !GetParent()->IsTopLevel() )
+ {
+ GetControlBounds( (ControlRef) GetParent()->GetHandle() , &bounds ) ;
+
+ xx -= bounds.left ;
+ yy -= bounds.top ;
+ }
+
+ wxPoint pt(GetParent()->GetClientAreaOrigin());
+ xx -= pt.x;
+ yy -= pt.y;
+
+ if(x) *x = xx;
+ if(y) *y = yy;
+#endif
+}
+
+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 ;
+
+ wxMacPortSaver s((GrafPtr)GetWindowPort( window )) ;
+ ::GlobalToLocal( &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 ;
+
+ wxMacPortSaver s((GrafPtr)GetWindowPort( window )) ;
+ ::LocalToGlobal( &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
+ HIPoint pt ;
+ if ( x ) pt.x = *x ;
+ if ( y ) pt.y = *y ;
+
+ if ( !IsTopLevel() )
+ HIViewConvertPoint( &pt , (ControlRef) m_macControl , (ControlRef) MacGetTopLevelWindow()->GetHandle() ) ;
+
+ if ( x ) *x = (int) pt.x ;
+ if ( y ) *y = (int) pt.y ;
+ #else
+ if ( !IsTopLevel() )
+ {
+ Rect bounds ;
+ GetControlBounds( (ControlRef) m_macControl , &bounds ) ;
+ if(x) *x += bounds.left ;
+ if(y) *y += bounds.top ;
+ }
+#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
+ HIPoint pt ;
+ if ( x ) pt.x = *x ;
+ if ( y ) pt.y = *y ;
+
+ if ( !IsTopLevel() )
+ HIViewConvertPoint( &pt , (ControlRef) MacGetTopLevelWindow()->GetHandle() , (ControlRef) m_macControl ) ;
+
+ if ( x ) *x = (int) pt.x ;
+ if ( y ) *y = (int) pt.y ;
+ #else
+ if ( !IsTopLevel() )
+ {
+ Rect bounds ;
+ GetControlBounds( (ControlRef) m_macControl , &bounds ) ;
+ if(x) *x -= bounds.left ;
+ if(y) *y -= bounds.top ;
+ }
+#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 ( GetControlRegion( (ControlRef) m_macControl , kControlContentMetaPart , rgn ) == noErr )
+ {
+ GetRegionBounds( rgn , &content ) ;
+ DisposeRgn( rgn ) ;
+ }
+ else
+ {
+ GetControlBounds( (ControlRef) m_macControl , &content ) ;
+ }
+ Rect structure ;
+ GetControlBounds( (ControlRef) m_macControl , &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 ( GetControlRegion( (ControlRef) m_macControl , kControlContentMetaPart , rgn ) == noErr )
+ {
+ GetRegionBounds( rgn , &content ) ;
+ DisposeRgn( rgn ) ;
+ }
+ else
+ {
+ GetControlBounds( (ControlRef) m_macControl , &content ) ;
+ }
+ Rect structure ;
+ GetControlBounds( (ControlRef) m_macControl , &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 ( GetControlRegion( (ControlRef) m_macControl , kControlContentMetaPart , rgn ) == noErr )
+ {
+ GetRegionBounds( rgn , &content ) ;
+ DisposeRgn( rgn ) ;
+ }
+ else
+ {
+ GetControlBounds( (ControlRef) m_macControl , &content ) ;
+ }
+#if !TARGET_API_MAC_OSX
+ Rect structure ;
+ GetControlBounds( (ControlRef) m_macControl , &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 -= MAC_SCROLLBAR_SIZE;
+ if ( h-y1 >= totH )
+ {
+ hh += 1 ;
+ }
+ }
+ if (m_vScrollBar && m_vScrollBar->IsShown() )
+ {
+ ww -= MAC_SCROLLBAR_SIZE;
+ if ( w-x1 >= totW )
+ {
+ ww += 1 ;
+ }
+ }
+ }
+ 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"));
+
+ /*
+
+ TODO why do we have to use current coordinates ?
+
+ Point pt ;
+ wxWindowMac *mouseWin ;
+ GetMouse( &pt ) ;
+
+ // Change the cursor NOW if we're within the correct window
+
+
+ if ( MacGetWindowFromPoint( wxPoint( pt.h , pt.v ) , &mouseWin ) )
+ {
+ if ( mouseWin == this && !wxIsBusy() )
+ {
+ m_cursor.MacInstall() ;
+ }
+ }
+ */
+ if ( !wxIsBusy() )
+ {
+ m_cursor.MacInstall() ;
+ }
+
+ return TRUE ;
+}
+
+#if wxUSE_MENUS
+bool wxWindowMac::DoPopupMenu(wxMenu *menu, int x, int y)
+{
+ menu->SetInvokingWindow(this);
+ menu->UpdateUI();
+ ClientToScreen( &x , &y ) ;
+
+ menu->MacBeforeDisplay( true ) ;
+ long menuResult = ::PopUpMenuSelect((MenuHandle) menu->GetHMenu() ,y,x, 0) ;
+ if ( HiWord(menuResult) != 0 )
+ {
+ MenuCommand id ;
+ GetMenuItemCommandID( GetMenuHandle(HiWord(menuResult)) , LoWord(menuResult) , &id ) ;
+ wxMenuItem* item = NULL ;
+ wxMenu* realmenu ;
+ item = menu->FindItem(id, &realmenu) ;
+ if (item->IsCheckable())
+ {
+ item->Check( !item->IsChecked() ) ;
+ }
+ menu->SendEvent( id , item->IsCheckable() ? item->IsChecked() : -1 ) ;
+ }
+ menu->MacAfterDisplay( true ) ;
+
+ menu->SetInvokingWindow(NULL);
+
+ return TRUE;
+}
+#endif
+
+// ----------------------------------------------------------------------------
+// tooltips
+// ----------------------------------------------------------------------------
+
+#if wxUSE_TOOLTIPS
+
+void wxWindowMac::DoSetToolTip(wxToolTip *tooltip)
+{
+ wxWindowBase::DoSetToolTip(tooltip);
+
+ if ( m_tooltip )
+ m_tooltip->SetWindow(this);
+}
+
+#endif // wxUSE_TOOLTIPS
+
+void wxWindowMac::DoMoveWindow(int x, int y, int width, int height)
+{
+ int former_x , former_y , former_w, former_h ;
+#if !TARGET_API_MAC_OSX
+ DoGetPosition( &former_x , &former_y ) ;
+ DoGetSize( &former_w , &former_h ) ;
+#else
+ MacGetPositionAndSizeFromControl( former_x , former_y , former_w , former_h ) ;
+#endif
+
+ int actualWidth = width;
+ int actualHeight = height;
+ int actualX = x;
+ int actualY = y;
+
+ if ((m_minWidth != -1) && (actualWidth < m_minWidth))
+ actualWidth = m_minWidth;
+ if ((m_minHeight != -1) && (actualHeight < m_minHeight))
+ actualHeight = m_minHeight;
+ if ((m_maxWidth != -1) && (actualWidth > m_maxWidth))
+ actualWidth = m_maxWidth;
+ if ((m_maxHeight != -1) && (actualHeight > m_maxHeight))
+ actualHeight = m_maxHeight;
+
+ bool doMove = false ;
+ bool doResize = false ;
+
+ if ( actualX != former_x || actualY != former_y )
+ {
+ doMove = true ;
+ }
+ if ( actualWidth != former_w || actualHeight != former_h )
+ {
+ doResize = true ;
+ }
+
+ if ( doMove || doResize )
+ {
+ // we don't adjust twice for the origin
+ Rect r = wxMacGetBoundsForControl(this , wxPoint( actualX,actualY), wxSize( actualWidth, actualHeight ) , false ) ;
+ bool vis = IsControlVisible( (ControlRef) m_macControl ) ;
+#if TARGET_API_MAC_OSX
+ // the HIViewSetFrame call itself should invalidate the areas, but when testing with the UnicodeTextCtrl it does not !
+ if ( vis )
+ SetControlVisibility( (ControlRef)m_macControl , false , true ) ;
+ HIRect hir = { r.left , r.top , r.right - r.left , r.bottom - r.top } ;
+ HIViewSetFrame ( (ControlRef) m_macControl , &hir ) ;
+ if ( vis )
+ SetControlVisibility( (ControlRef)m_macControl , true , true ) ;
+#else
+ if ( vis )
+ SetControlVisibility( (ControlRef)m_macControl , false , true ) ;
+ SetControlBounds( (ControlRef) m_macControl , &r ) ;
+ if ( vis )
+ SetControlVisibility( (ControlRef)m_macControl , true , true ) ;
+#endif
+ MacRepositionScrollBars() ;
+ if ( doMove )
+ {
+ wxPoint point(actualX,actualY);
+ wxMoveEvent event(point, m_windowId);
+ event.SetEventObject(this);
+ GetEventHandler()->ProcessEvent(event) ;
+ }
+ if ( doResize )
+ {
+ MacRepositionScrollBars() ;
+ wxSize size(actualWidth, actualHeight);
+ wxSizeEvent event(size, m_windowId);
+ event.SetEventObject(this);
+ GetEventHandler()->ProcessEvent(event);
+ }
+ }
+
+}
+
+wxSize wxWindowMac::DoGetBestSize() const
+{
+ if ( m_macIsUserPane || IsTopLevel() )
+ return wxWindowBase::DoGetBestSize() ;
+
+ Rect bestsize = { 0 , 0 , 0 , 0 } ;
+ short baselineoffset ;
+ int bestWidth, bestHeight ;
+ ::GetBestControlRect( (ControlRef) m_macControl , &bestsize , &baselineoffset ) ;
+
+ if ( EmptyRect( &bestsize ) )
+ {
+ baselineoffset = 0;
+ bestsize.left = bestsize.top = 0 ;
+ bestsize.right = 16 ;
+ bestsize.bottom = 16 ;
+ if ( IsKindOf( CLASSINFO( wxScrollBar ) ) )
+ {
+ bestsize.bottom = 16 ;
+ }
+ else if ( IsKindOf( CLASSINFO( wxSpinButton ) ) )
+ {
+ bestsize.bottom = 24 ;
+ }
+ else
+ {
+ // return wxWindowBase::DoGetBestSize() ;
+ }
+ }
+
+ bestWidth = bestsize.right - bestsize.left ;
+ bestHeight = bestsize.bottom - bestsize.top ;
+ if ( bestHeight < 10 )
+ bestHeight = 13 ;
+
+ return wxSize(bestWidth, bestHeight);
+// return wxWindowBase::DoGetBestSize() ;
+}
+
+
+// set the size of the window: if the dimensions are positive, just use them,
+// but if any of them is equal to -1, it means that we must find the value for
+// it ourselves (unless sizeFlags contains wxSIZE_ALLOW_MINUS_ONE flag, in
+// which case -1 is a valid value for x and y)
+//
+// If sizeFlags contains wxSIZE_AUTO_WIDTH/HEIGHT flags (default), we calculate
+// the width/height to best suit our contents, otherwise we reuse the current
+// width/height
+void wxWindowMac::DoSetSize(int x, int y, int width, int height, int sizeFlags)
+{
+ // get the current size and position...
+ int currentX, currentY;
+ GetPosition(¤tX, ¤tY);
+
+ int currentW,currentH;
+ GetSize(¤tW, ¤tH);
+
+ // ... and don't do anything (avoiding flicker) if it's already ok
+ if ( x == currentX && y == currentY &&
+ width == currentW && height == currentH && ( height != -1 && width != -1 ) )
+ {
+ // TODO REMOVE
+ MacRepositionScrollBars() ; // we might have a real position shift
+ return;
+ }
+
+ if ( x == -1 && !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE) )
+ x = currentX;
+ if ( y == -1 && !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE) )
+ y = currentY;
+
+ AdjustForParentClientOrigin(x, y, sizeFlags);
+
+ wxSize size(-1, -1);
+ if ( width == -1 )
+ {
+ if ( sizeFlags & wxSIZE_AUTO_WIDTH )
+ {
+ size = DoGetBestSize();
+ width = size.x;
+ }
+ else
+ {
+ // just take the current one
+ width = currentW;
+ }
+ }
+
+ if ( height == -1 )
+ {
+ if ( sizeFlags & wxSIZE_AUTO_HEIGHT )
+ {
+ if ( size.x == -1 )
+ {
+ size = DoGetBestSize();
+ }
+ //else: already called DoGetBestSize() above
+
+ height = size.y;
+ }
+ else
+ {
+ // just take the current one
+ height = currentH;
+ }
+ }
+
+ DoMoveWindow(x, y, width, height);
+
+}
+
+wxPoint wxWindowMac::GetClientAreaOrigin() const
+{
+ RgnHandle rgn = NewRgn() ;
+ Rect content ;
+ GetControlRegion( (ControlRef) m_macControl , kControlContentMetaPart , rgn ) ;
+ GetRegionBounds( rgn , &content ) ;
+ DisposeRgn( rgn ) ;
+#if !TARGET_API_MAC_OSX
+ // if the content rgn is empty / not supported
+ // don't attempt to correct the coordinates to wxWindow relative ones
+ if (!::EmptyRect( &content ) )
+ {
+ Rect structure ;
+ GetControlBounds( (ControlRef) m_macControl , &structure ) ;
+ OffsetRect( &content , -structure.left , -structure.top ) ;
+ }
+#endif
+
+ return wxPoint( content.left + MacGetLeftBorderSize( ) , content.top + MacGetTopBorderSize( ) );
+}
+
+void wxWindowMac::DoSetClientSize(int clientwidth, int clientheight)
+{
+ if ( clientheight != -1 || clientheight != -1 )
+ {
+ int currentclientwidth , currentclientheight ;
+ int currentwidth , currentheight ;
+
+ GetClientSize( ¤tclientwidth , ¤tclientheight ) ;
+ GetSize( ¤twidth , ¤theight ) ;
+
+ DoSetSize( -1 , -1 , currentwidth + clientwidth - currentclientwidth ,
+ currentheight + clientheight - currentclientheight , wxSIZE_USE_EXISTING ) ;
+ }
+}
+
+void wxWindowMac::SetTitle(const wxString& title)
+{
+ m_label = wxStripMenuCodes(title) ;
+
+ if ( m_macControl )
+ {
+ UMASetControlTitle( (ControlRef) m_macControl , m_label , m_font.GetEncoding() ) ;
+ }
+ Refresh() ;
+}
+
+wxString wxWindowMac::GetTitle() const
+{
+ return m_label ;
+}
+
+bool wxWindowMac::Show(bool show)
+{
+ if ( !wxWindowBase::Show(show) )
+ return FALSE;
+
+ // TODO use visibilityChanged Carbon Event for OSX
+ bool former = MacIsReallyShown() ;
+
+ SetControlVisibility( (ControlRef) m_macControl , show , true ) ;
+ if ( former != MacIsReallyShown() )
+ MacPropagateVisibilityChanged() ;
+ return TRUE;
+}
+
+bool wxWindowMac::Enable(bool enable)
+{
+ wxASSERT( m_macControl != NULL ) ;
+ if ( !wxWindowBase::Enable(enable) )
+ return FALSE;
+
+ bool former = MacIsReallyEnabled() ;
+#if TARGET_API_MAC_OSX
+ if ( enable )
+ EnableControl( (ControlRef) m_macControl ) ;
+ else
+ DisableControl( (ControlRef) m_macControl ) ;
+#else
+ if ( enable )
+ ActivateControl( (ControlRef) m_macControl ) ;
+ else
+ DeactivateControl( (ControlRef) m_macControl ) ;
+#endif
+
+ if ( former != MacIsReallyEnabled() )
+ MacPropagateEnabledStateChanged() ;
+ return TRUE;
+}
+
+//
+// status change propagations (will be not necessary for OSX later )
+//
+
+void wxWindowMac::MacPropagateVisibilityChanged()
+{
+#if !TARGET_API_MAC_OSX
+ MacVisibilityChanged() ;
+
+ wxWindowListNode *node = GetChildren().GetFirst();
+ while ( node )
+ {
+ wxWindowMac *child = node->GetData();
+ if ( child->IsShown() )
+ child->MacPropagateVisibilityChanged( ) ;
+ node = node->GetNext();
+ }
+#endif
+}
+
+void wxWindowMac::MacPropagateEnabledStateChanged( )
+{
+#if !TARGET_API_MAC_OSX
+ MacEnabledStateChanged() ;
+
+ wxWindowListNode *node = GetChildren().GetFirst();
+ while ( node )
+ {
+ wxWindowMac *child = node->GetData();
+ if ( child->IsEnabled() )
+ child->MacPropagateEnabledStateChanged() ;
+ node = node->GetNext();
+ }
+#endif
+}
+
+void wxWindowMac::MacPropagateHiliteChanged( )
+{
+#if !TARGET_API_MAC_OSX
+ MacHiliteChanged() ;
+
+ wxWindowListNode *node = GetChildren().GetFirst();
+ while ( node )
+ {
+ wxWindowMac *child = node->GetData();
+ // if ( child->IsEnabled() )
+ child->MacPropagateHiliteChanged() ;
+ node = node->GetNext();
+ }
+#endif
+}
+
+//
+// status change notifications
+//
+
+void wxWindowMac::MacVisibilityChanged()
+{
+}
+
+void wxWindowMac::MacHiliteChanged()
+{
+}
+
+void wxWindowMac::MacEnabledStateChanged()
+{
+}
+
+//
+// status queries on the inherited window's state
+//
+
+bool wxWindowMac::MacIsReallyShown()
+{
+ // only under OSX the visibility of the TLW is taken into account
+#if TARGET_API_MAC_OSX
+ return IsControlVisible( (ControlRef) m_macControl ) ;
+#else
+ wxWindow* win = this ;
+ while( win->IsShown() )
+ {
+ if ( win->IsTopLevel() )
+ return true ;
+
+ win = win->GetParent() ;
+ if ( win == NULL )
+ return true ;
+
+ } ;
+ return false ;
+#endif
+}
+
+bool wxWindowMac::MacIsReallyEnabled()
+{
+#if TARGET_API_MAC_OSX
+ return IsControlEnabled( (ControlRef) m_macControl ) ;
+#else
+ return IsControlActive( (ControlRef) m_macControl ) ;
+#endif
+}
+
+bool wxWindowMac::MacIsReallyHilited()
+{
+ return IsControlActive( (ControlRef) m_macControl ) ;
+}
+
+//
+//
+//
+
+int wxWindowMac::GetCharHeight() const
+{
+ wxClientDC dc ( (wxWindowMac*)this ) ;
+ return dc.GetCharHeight() ;
+}
+
+int wxWindowMac::GetCharWidth() const
+{
+ wxClientDC dc ( (wxWindowMac*)this ) ;
+ return dc.GetCharWidth() ;
+}
+
+void wxWindowMac::GetTextExtent(const wxString& string, int *x, int *y,
+ int *descent, int *externalLeading, const wxFont *theFont ) const
+{
+ const wxFont *fontToUse = theFont;
+ if ( !fontToUse )
+ fontToUse = &m_font;
+
+ wxClientDC dc( (wxWindowMac*) this ) ;
+ long lx,ly,ld,le ;
+ dc.GetTextExtent( string , &lx , &ly , &ld, &le, (wxFont *)fontToUse ) ;
+ if ( externalLeading )
+ *externalLeading = le ;
+ if ( descent )
+ *descent = ld ;
+ if ( x )
+ *x = lx ;
+ if ( y )
+ *y = ly ;
+}
+
+/*
+ * Rect is given in client coordinates, for further reading, read wxTopLevelWindowMac::InvalidateRect
+ * we always intersect with the entire window, not only with the client area
+ */
+
+void wxWindowMac::Refresh(bool eraseBack, const wxRect *rect)
+{
+#if TARGET_API_MAC_OSX
+ if ( rect == NULL )
+ HIViewSetNeedsDisplay( (ControlRef) m_macControl , true ) ;
+ else
+ {
+ RgnHandle update = NewRgn() ;
+ SetRectRgn( update , rect->x , rect->y , rect->x + rect->width , rect->y + rect->height ) ;
+ SectRgn( (RgnHandle) MacGetVisibleRegion().GetWXHRGN() , update , update ) ;
+ wxPoint origin = GetClientAreaOrigin() ;
+ OffsetRgn( update, origin.x , origin.y ) ;
+ HIViewSetNeedsDisplayInRegion( (ControlRef) m_macControl , update , true ) ;
+ }
+#else
+/*
+ RgnHandle updateRgn = NewRgn() ;
+ if ( rect == NULL )
+ {
+ CopyRgn( (RgnHandle) MacGetVisibleRegion().GetWXHRGN() , updateRgn ) ;
+ }
+ else
+ {
+ SetRectRgn( updateRgn , rect->x , rect->y , rect->x + rect->width , rect->y + rect->height ) ;
+ SectRgn( (RgnHandle) MacGetVisibleRegion().GetWXHRGN() , updateRgn , updateRgn ) ;
+ }
+ InvalWindowRgn( (WindowRef) MacGetTopLevelWindowRef() , updateRgn ) ;
+ DisposeRgn(updateRgn) ;
+*/
+ if ( IsControlVisible( (ControlRef) m_macControl ) )
+ {
+ SetControlVisibility( (ControlRef) m_macControl , false , false ) ;
+ SetControlVisibility( (ControlRef) m_macControl , true , true ) ;
+ }
+ /*
+ if ( MacGetTopLevelWindow() == NULL )
+ return ;
+
+ if ( !IsControlVisible( (ControlRef) m_macControl ) )
+ return ;
+
+ wxPoint client = GetClientAreaOrigin();
+ int x1 = -client.x;
+ int y1 = -client.y;
+ int x2 = m_width - client.x;
+ int y2 = m_height - client.y;
+
+ if (IsKindOf( CLASSINFO(wxButton)))
+ {
+ // buttons have an "aura"
+ y1 -= 5;
+ x1 -= 5;
+ y2 += 5;
+ x2 += 5;
+ }
+
+ Rect clientrect = { y1, x1, y2, x2 };
+
+ if ( rect )
+ {
+ Rect r = { rect->y , rect->x , rect->y + rect->height , rect->x + rect->width } ;
+ SectRect( &clientrect , &r , &clientrect ) ;
+ }
+
+ if ( !EmptyRect( &clientrect ) )
+ {
+ int top = 0 , left = 0 ;
+
+ MacClientToRootWindow( &left , &top ) ;
+ OffsetRect( &clientrect , left , top ) ;
+
+ MacGetTopLevelWindow()->MacInvalidate( &clientrect , eraseBack ) ;
+ }
+ */
+#endif
+}
+
+void wxWindowMac::Freeze()
+{
+#if TARGET_API_MAC_OSX
+ if ( !m_frozenness++ )
+ {
+ HIViewSetDrawingEnabled( (HIViewRef) m_macControl , false ) ;
+ }
+#endif
+}
+
+#if TARGET_API_MAC_OSX
+static void InvalidateControlAndChildren( HIViewRef control )
+{
+ HIViewSetNeedsDisplay( control , true ) ;
+ UInt16 childrenCount = 0 ;
+ OSStatus err = CountSubControls( control , &childrenCount ) ;
+ if ( err == errControlIsNotEmbedder )
+ return ;
+ wxASSERT_MSG( err == noErr , wxT("Unexpected error when accessing subcontrols") ) ;
+
+ for ( UInt16 i = childrenCount ; i >=1 ; --i )
+ {
+ HIViewRef child ;
+ err = GetIndexedSubControl( control , i , & child ) ;
+ if ( err == errControlIsNotEmbedder )
+ return ;
+ InvalidateControlAndChildren( child ) ;
+ }
+}
+#endif
+
+void wxWindowMac::Thaw()
+{
+#if TARGET_API_MAC_OSX
+ wxASSERT_MSG( m_frozenness > 0, _T("Thaw() without matching Freeze()") );
+
+ if ( !--m_frozenness )
+ {
+ HIViewSetDrawingEnabled( (HIViewRef) m_macControl , true ) ;
+ InvalidateControlAndChildren( (HIViewRef) m_macControl ) ;
+ // HIViewSetNeedsDisplay( (HIViewRef) m_macControl , true ) ;
+ }
+#endif
+}
+
+void wxWindowMac::MacRedrawControl()
+{
+/*
+ if ( (ControlRef) m_macControl && MacGetTopLevelWindowRef() && IsControlVisible( (ControlRef) m_macControl ) )
+ {
+#if TARGET_API_MAC_CARBON
+ Update() ;
+#else
+ wxClientDC dc(this) ;
+ wxMacPortSetter helper(&dc) ;
+ wxMacWindowClipper clipper(this) ;
+ wxDC::MacSetupBackgroundForCurrentPort( MacGetBackgroundBrush() ) ;
+ UMADrawControl( (ControlRef) m_macControl ) ;
+#endif
+ }
+*/
+}
+
+/* TODO
+void wxWindowMac::OnPaint(wxPaintEvent& event)
+{
+ // why don't we skip that here ?
+}
+*/
+
+wxWindowMac *wxGetActiveWindow()
+{
+ // actually this is a windows-only concept
+ return NULL;
+}
+
+// Coordinates relative to the window
+void wxWindowMac::WarpPointer (int x_pos, int y_pos)
+{
+ // We really don't move the mouse programmatically under Mac.
+}
+
+void wxWindowMac::OnEraseBackground(wxEraseEvent& event)
+{
+ if ( m_macBackgroundBrush.Ok() == false || m_macBackgroundBrush.GetStyle() == wxTRANSPARENT )
+ {
+ event.Skip() ;
+ }
+ else
+ event.GetDC()->Clear() ;
+}
+
+void wxWindowMac::OnNcPaint( wxNcPaintEvent& event )