X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f03c50fa3b51961ef2cd2d3bc0229de1cafebaf2..2ad99bc1398db5a619b3682e90ad7a99485ae4c9:/src/mac/control.cpp?ds=sidebyside diff --git a/src/mac/control.cpp b/src/mac/control.cpp index 6570c1303b..fc90b8ea04 100644 --- a/src/mac/control.cpp +++ b/src/mac/control.cpp @@ -42,6 +42,7 @@ END_EVENT_TABLE() #endif #include "wx/mac/uma.h" +#include "wx/mac/private.h" // Item members @@ -118,7 +119,13 @@ bool wxControl::Create(wxWindow *parent, wxWindowID id, m_macControl = NULL ; m_macHorizontalBorder = 0 ; // additional pixels around the real control m_macVerticalBorder = 0 ; + bool rval = wxWindow::Create(parent, id, pos, size, style, name); + if ( parent ) + { + m_backgroundColour = parent->GetBackgroundColour() ; + m_foregroundColour = parent->GetForegroundColour() ; + } if (rval) { #if wxUSE_VALIDATORS SetValidator(validator); @@ -147,7 +154,7 @@ wxControl::~wxControl() void wxControl::SetLabel(const wxString& title) { - m_label = title ; + m_label = wxStripMenuCodes(title) ; if ( (ControlHandle) m_macControl ) { @@ -155,9 +162,9 @@ void wxControl::SetLabel(const wxString& title) wxString label ; if( wxApp::s_macDefaultEncodingIsPC ) - label = wxMacMakeMacStringFromPC( title ) ; + label = wxMacMakeMacStringFromPC( m_label ) ; else - label = title ; + label = m_label ; #if TARGET_CARBON c2pstrcpy( (StringPtr) maclabel , label ) ; @@ -410,7 +417,7 @@ void wxControl::MacAdjustControlRect() else m_width = bestsize.right - bestsize.left ; - m_width += 2 * m_macHorizontalBorder ; + m_width += 2 * m_macHorizontalBorder + MacGetLeftBorderSize() + MacGetRightBorderSize() ; } if ( m_height == -1 ) { @@ -418,10 +425,10 @@ void wxControl::MacAdjustControlRect() if ( m_height < 10 ) m_height = 13 ; - m_height += 2 * m_macVerticalBorder; + m_height += 2 * m_macVerticalBorder + MacGetTopBorderSize() + MacGetBottomBorderSize() ; } - - UMASizeControl( (ControlHandle) m_macControl , m_width - 2 * m_macHorizontalBorder, m_height - 2 * m_macVerticalBorder ) ; + MacUpdateDimensions() ; +// UMASizeControl( (ControlHandle) m_macControl , m_width - 2 * m_macHorizontalBorder, m_height - 2 * m_macVerticalBorder ) ; } } @@ -433,35 +440,49 @@ WXWidget wxControl::MacGetContainerForEmbedding() return wxWindow::MacGetContainerForEmbedding() ; } -void wxControl::MacSuperChangedPosition() +void wxControl::MacUpdateDimensions() { - if ( (ControlHandle) m_macControl ) - { - Rect contrlRect ; - GetControlBounds( (ControlHandle) m_macControl , &contrlRect ) ; - int former_mac_x = contrlRect.left ; - int former_mac_y = contrlRect.top ; - int mac_x = m_x ; - int mac_y = m_y ; - GetParent()->MacWindowToRootWindow( & mac_x , & mac_y ) ; - - WindowRef rootwindow = (WindowRef) MacGetRootWindow() ; - - if ( mac_x + m_macHorizontalBorder != former_mac_x || - mac_y + m_macVerticalBorder != former_mac_y ) - { - { - Rect inval = { former_mac_y , former_mac_x , former_mac_y + m_height , former_mac_x + m_width } ; - InvalWindowRect( rootwindow , &inval ) ; - } - UMAMoveControl( (ControlHandle) m_macControl , mac_x + m_macHorizontalBorder , mac_y + m_macVerticalBorder ) ; - { - Rect inval = { mac_y , mac_x , mac_y + m_height , mac_x + m_width } ; - InvalWindowRect( rootwindow , &inval ) ; - } - } - } + // actually in the current systems this should never be possible, but later reparenting + // may become a reality + + if ( (ControlHandle) m_macControl == NULL ) + return ; + + if ( GetParent() == NULL ) + return ; + + WindowRef rootwindow = (WindowRef) MacGetRootWindow() ; + if ( rootwindow == NULL ) + return ; + + Rect oldBounds ; + GetControlBounds( (ControlHandle) m_macControl , &oldBounds ) ; + + int new_x = m_x + MacGetLeftBorderSize() + m_macHorizontalBorder ; + int new_y = m_y + MacGetTopBorderSize() + m_macVerticalBorder ; + int new_width = m_width - MacGetLeftBorderSize() - MacGetRightBorderSize() - 2 * m_macHorizontalBorder ; + int new_height = m_height - MacGetTopBorderSize() - MacGetBottomBorderSize() - 2 * m_macVerticalBorder ; + + GetParent()->MacWindowToRootWindow( & new_x , & new_y ) ; + bool doMove = new_x != oldBounds.left || new_y != oldBounds.top ; + bool doResize = ( oldBounds.right - oldBounds.left ) != new_width || (oldBounds.bottom - oldBounds.top ) != new_height ; + if ( doMove || doResize ) + { + InvalWindowRect( rootwindow, &oldBounds ) ; + if ( doMove ) + { + UMAMoveControl( (ControlHandle) m_macControl , new_x , new_y ) ; + } + if ( doResize ) + { + UMASizeControl( (ControlHandle) m_macControl , new_width , new_height ) ; + } + } +} +void wxControl::MacSuperChangedPosition() +{ + MacUpdateDimensions() ; wxWindow::MacSuperChangedPosition() ; } @@ -500,6 +521,10 @@ void wxControl::DoSetSize(int x, int y, int width, int height, int sizeFlags ) { + wxWindow::DoSetSize( x , y ,width , height ,sizeFlags ) ; + return ; +/* + if ( (ControlHandle) m_macControl == NULL ) { wxWindow::DoSetSize( x , y ,width , height ,sizeFlags ) ; @@ -614,6 +639,7 @@ void wxControl::DoSetSize(int x, int y, Refresh() ; } +*/ } bool wxControl::Show(bool show) @@ -669,13 +695,27 @@ void wxControl::MacRedrawControl() { wxClientDC dc(this) ; wxMacPortSetter helper(&dc) ; - - // the controls sometimes draw outside their boundaries, this - // should be resolved differently but is not trivial (e.g. drop shadows) - // since adding them to the border would yield in enormous gaps between - // the controls +/* Rect r = { 0 , 0 , 32000 , 32000 } ; ClipRect( &r ) ; +*/ + int x = 0 , y = 0; + wxWindow *parent = GetParent() ; + parent->MacWindowToRootWindow( &x,&y ) ; + RgnHandle clrgn = NewRgn() ; + RgnHandle insidergn = NewRgn() ; + wxSize size = parent->GetSize() ; + SetRectRgn( insidergn , parent->MacGetLeftBorderSize() , parent->MacGetTopBorderSize() , + size.x - parent->MacGetLeftBorderSize() - parent->MacGetRightBorderSize(), + size.y - parent->MacGetTopBorderSize() - parent->MacGetBottomBorderSize()) ; + + CopyRgn( (RgnHandle) parent->MacGetVisibleRegion(false).GetWXHRGN() , clrgn ) ; + SectRgn( clrgn , insidergn , clrgn ) ; + OffsetRgn( clrgn , x , y ) ; + SetClip( clrgn ) ; + DisposeRgn( clrgn ) ; + DisposeRgn( insidergn ) ; + wxDC::MacSetupBackgroundForCurrentPort( MacGetBackgroundBrush() ) ; UMADrawControl( (ControlHandle) m_macControl ) ; } @@ -687,12 +727,27 @@ void wxControl::OnPaint(wxPaintEvent& event) { wxPaintDC dc(this) ; wxMacPortSetter helper(&dc) ; - // the controls sometimes draw outside their boundaries, this - // should be resolved differently but is not trivial (e.g. drop shadows) - // since adding them to the border would yield in enormous gaps between - // the controls +/* Rect r = { 0 , 0 , 32000 , 32000 } ; ClipRect( &r ) ; +*/ + + int x = 0 , y = 0; + wxWindow *parent = GetParent() ; + parent->MacWindowToRootWindow( &x,&y ) ; + RgnHandle clrgn = NewRgn() ; + RgnHandle insidergn = NewRgn() ; + wxSize size = parent->GetSize() ; + SetRectRgn( insidergn , parent->MacGetLeftBorderSize() , parent->MacGetTopBorderSize() , + size.x - parent->MacGetLeftBorderSize() - parent->MacGetRightBorderSize(), + size.y - parent->MacGetTopBorderSize() - parent->MacGetBottomBorderSize()) ; + + CopyRgn( (RgnHandle) parent->MacGetVisibleRegion(false).GetWXHRGN() , clrgn ) ; + SectRgn( clrgn , insidergn , clrgn ) ; + OffsetRgn( clrgn , x , y ) ; + SetClip( clrgn ) ; + DisposeRgn( clrgn ) ; + DisposeRgn( insidergn ) ; wxDC::MacSetupBackgroundForCurrentPort( MacGetBackgroundBrush() ) ; UMADrawControl( (ControlHandle) m_macControl ) ;