X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/89ebf1c919fbd662b2b9440573cf7d268023419c..4cae9a20a89d127601f68873681cfdaa7fe484d5:/src/mac/carbon/control.cpp?ds=sidebyside diff --git a/src/mac/carbon/control.cpp b/src/mac/carbon/control.cpp index 29698c6839..cc93410764 100644 --- a/src/mac/carbon/control.cpp +++ b/src/mac/carbon/control.cpp @@ -19,6 +19,7 @@ #include "wx/panel.h" #include "wx/app.h" #include "wx/dc.h" +#include "wx/dcclient.h" #include "wx/notebook.h" #include "wx/tabctrl.h" #include "wx/radiobox.h" @@ -103,15 +104,15 @@ wxControl::~wxControl() m_isBeingDeleted = TRUE; // If we delete an item, we should initialize the parent panel, // because it could now be invalid. - wxPanel *panel = wxDynamicCast(GetParent(), wxPanel); - if ( panel ) + wxWindow *parent = GetParent() ; + if ( parent ) { - if (panel->GetDefaultItem() == (wxButton*) this) - panel->SetDefaultItem(NULL); + if (parent->GetDefaultItem() == (wxButton*) this) + parent->SetDefaultItem(NULL); } - if ( m_macControl ) + if ( (ControlHandle) m_macControl ) { - ::DisposeControl( m_macControl ) ; + ::DisposeControl( (ControlHandle) m_macControl ) ; m_macControl = NULL ; } } @@ -120,7 +121,7 @@ void wxControl::SetLabel(const wxString& title) { m_label = title ; - if ( m_macControl ) + if ( (ControlHandle) m_macControl ) { Str255 maclabel ; wxString label ; @@ -136,7 +137,7 @@ void wxControl::SetLabel(const wxString& title) strcpy( (char *) maclabel , label ) ; c2pstr( (char *) maclabel ) ; #endif - ::SetControlTitle( m_macControl , maclabel ) ; + ::SetControlTitle( (ControlHandle) m_macControl , maclabel ) ; } Refresh() ; } @@ -146,7 +147,7 @@ wxSize wxControl::DoGetBestSize() const Rect bestsize = { 0 , 0 , 0 , 0 } ; short baselineoffset ; int bestWidth, bestHeight ; - ::GetBestControlRect( m_macControl , &bestsize , &baselineoffset ) ; + ::GetBestControlRect( (ControlHandle) m_macControl , &bestsize , &baselineoffset ) ; if ( EmptyRect( &bestsize ) ) { @@ -238,7 +239,7 @@ void wxControl::MacPreControlCreate( wxWindow *parent, wxWindowID id, wxString l const wxPoint& pos, const wxSize& size, long style, const wxValidator& validator, - const wxString& name , Rect *outBounds , StringPtr maclabel ) + const wxString& name , WXRECTPTR outBounds , unsigned char* maclabel ) { m_label = label ; SetName(name); @@ -263,10 +264,10 @@ void wxControl::MacPreControlCreate( wxWindow *parent, wxWindowID id, wxString l m_x = pos.x ; m_y = pos.y ; - outBounds->top = -10; - outBounds->left = -10; - outBounds->bottom = 0; - outBounds->right = 0; + ((Rect*)outBounds)->top = -10; + ((Rect*)outBounds)->left = -10; + ((Rect*)outBounds)->bottom = 0; + ((Rect*)outBounds)->right = 0; char c_text[255]; strcpy( c_text , label ) ; @@ -285,7 +286,7 @@ void wxControl::MacPreControlCreate( wxWindow *parent, wxWindowID id, wxString l void wxControl::MacPostControlCreate() { - wxASSERT_MSG( m_macControl != NULL , "No valid mac control" ) ; + wxASSERT_MSG( (ControlHandle) m_macControl != NULL , "No valid mac control" ) ; if ( IsKindOf( CLASSINFO( wxScrollBar ) ) ) { @@ -297,7 +298,7 @@ void wxControl::MacPostControlCreate() controlstyle.flags = kControlUseFontMask ; controlstyle.font = kControlFontSmallBoldSystemFont ; - ::SetControlFontStyle( m_macControl , &controlstyle ) ; + ::SetControlFontStyle( (ControlHandle) m_macControl , &controlstyle ) ; } else { @@ -305,14 +306,14 @@ void wxControl::MacPostControlCreate() controlstyle.flags = kControlUseFontMask ; controlstyle.font = kControlFontSmallSystemFont ; - ::SetControlFontStyle( m_macControl , &controlstyle ) ; + ::SetControlFontStyle( (ControlHandle) m_macControl , &controlstyle ) ; } - ControlHandle container = GetParent()->MacGetContainerForEmbedding() ; + ControlHandle container = (ControlHandle) GetParent()->MacGetContainerForEmbedding() ; wxASSERT_MSG( container != NULL , wxT("No valid mac container control") ) ; - ::EmbedControl( m_macControl , container ) ; + ::EmbedControl( (ControlHandle) m_macControl , container ) ; m_macControlIsShown = true ; - wxAssociateControlWithMacControl( m_macControl , this ) ; + wxAssociateControlWithMacControl( (ControlHandle) m_macControl , this ) ; // Adjust the controls size and position @@ -331,18 +332,19 @@ void wxControl::MacPostControlCreate() SetSize(pos.x, pos.y, new_size.x, new_size.y); - UMAShowControl( m_macControl ) ; + UMAShowControl( (ControlHandle) m_macControl ) ; + Refresh() ; } void wxControl::MacAdjustControlRect() { - wxASSERT_MSG( m_macControl != NULL , wxT("No valid mac control") ) ; + wxASSERT_MSG( (ControlHandle) m_macControl != NULL , wxT("No valid mac control") ) ; if ( m_width == -1 || m_height == -1 ) { Rect bestsize = { 0 , 0 , 0 , 0 } ; short baselineoffset ; - ::GetBestControlRect( m_macControl , &bestsize , &baselineoffset ) ; + ::GetBestControlRect( (ControlHandle) m_macControl , &bestsize , &baselineoffset ) ; if ( EmptyRect( &bestsize ) ) { @@ -386,14 +388,11 @@ void wxControl::MacAdjustControlRect() m_height += 2 * m_macVerticalBorder; } - wxMacDrawingHelper helper ( wxFindWinFromMacWindow( GetMacRootWindow() ) ) ; - if ( helper.Ok() ) - { - UMASizeControl( m_macControl , m_width - 2 * m_macHorizontalBorder, m_height - 2 * m_macVerticalBorder ) ; - } + UMASizeControl( (ControlHandle) m_macControl , m_width - 2 * m_macHorizontalBorder, m_height - 2 * m_macVerticalBorder ) ; } } -ControlHandle wxControl::MacGetContainerForEmbedding() + +WXWidget wxControl::MacGetContainerForEmbedding() { if ( m_macControl ) return m_macControl ; @@ -403,40 +402,31 @@ ControlHandle wxControl::MacGetContainerForEmbedding() void wxControl::MacSuperChangedPosition() { - if ( m_macControl ) + if ( (ControlHandle) m_macControl ) { Rect contrlRect ; - GetControlBounds( m_macControl , &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()->MacClientToRootWindow( & mac_x , & mac_y ) ; + GetParent()->MacWindowToRootWindow( & mac_x , & mac_y ) ; - WindowRef rootwindow = GetMacRootWindow() ; - wxWindow* wxrootwindow = wxFindWinFromMacWindow( rootwindow ) ; - ::SetThemeWindowBackground( rootwindow , kThemeBrushDialogBackgroundActive , false ) ; - wxMacDrawingHelper focus( wxrootwindow ) ; - - if ( mac_x != former_mac_x || mac_y != former_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( m_macControl , mac_x + m_macHorizontalBorder , mac_y + m_macVerticalBorder ) ; + 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 ) ; } } - if ( wxrootwindow->IsKindOf( CLASSINFO( wxDialog ) ) ) - { - } - else - { - ::SetThemeWindowBackground( rootwindow , kThemeBrushDocumentWindowBackground , false ) ; - } } wxWindow::MacSuperChangedPosition() ; @@ -444,47 +434,19 @@ void wxControl::MacSuperChangedPosition() void wxControl::MacSuperEnabled( bool enabled ) { -/* - if ( m_macControl ) - { - if ( UMAHasAppearance() ) - { - if ( !enabled ) - { - ::DeactivateControl( m_macControl ) ; - } - else - { - if ( m_macEnabled ) - ::ActivateControl( m_macControl ) ; - } - } - else - { - if ( !enabled ) - { - ::HiliteControl( m_macControl , 255 ) ; - } - else - { - if ( m_macEnabled ) - ::HiliteControl( m_macControl , 0 ) ; - } - } - } + Refresh(FALSE) ; wxWindow::MacSuperEnabled( enabled ) ; -*/ } void wxControl::MacSuperShown( bool show ) { - if ( m_macControl ) + if ( (ControlHandle) m_macControl ) { if ( !show ) { if ( m_macControlIsShown ) { - ::HideControl( m_macControl ) ; + ::UMAHideControl( (ControlHandle) m_macControl ) ; m_macControlIsShown = false ; } } @@ -492,7 +454,7 @@ void wxControl::MacSuperShown( bool show ) { if ( MacIsReallyShown() && !m_macControlIsShown ) { - ::UMAShowControl( m_macControl ) ; + ::UMAShowControl( (ControlHandle) m_macControl ) ; m_macControlIsShown = true ; } } @@ -505,13 +467,13 @@ void wxControl::DoSetSize(int x, int y, int width, int height, int sizeFlags ) { - if ( m_macControl == NULL ) + if ( (ControlHandle) m_macControl == NULL ) { wxWindow::DoSetSize( x , y ,width , height ,sizeFlags ) ; return ; } - Rect oldbounds, newbounds; + Rect oldbounds; int new_x, new_y, new_width, new_height; int mac_x, mac_y; @@ -547,14 +509,14 @@ void wxControl::DoSetSize(int x, int y, if (height == -1) new_height = size.y; } } - // AdjustForParentClientOrigin(new_x, new_y, sizeFlags); + AdjustForParentClientOrigin(new_x, new_y, sizeFlags); mac_x = new_x; mac_y = new_y; if(GetParent()) { - GetParent()->MacClientToRootWindow(&mac_x, &mac_y); + GetParent()->MacWindowToRootWindow(&mac_x, &mac_y); } - GetControlBounds(m_macControl, &oldbounds); + GetControlBounds( (ControlHandle) m_macControl, &oldbounds); oldbounds.right = oldbounds.left + m_width; oldbounds.bottom = oldbounds.top + m_height; @@ -574,6 +536,8 @@ void wxControl::DoSetSize(int x, int y, if ( doMove || doResize ) { + Refresh() ; + // Ensure resize is within constraints if ((m_minWidth != -1) && (new_width < m_minWidth)) { new_width = m_minWidth; @@ -593,9 +557,9 @@ void wxControl::DoSetSize(int x, int y, m_x = new_x; m_y = new_y; - UMAMoveControl(m_macControl, + UMAMoveControl( (ControlHandle) m_macControl, mac_x + m_macHorizontalBorder, mac_y + m_macVerticalBorder); - + wxMoveEvent event(wxPoint(m_x, m_y), m_windowId); event.SetEventObject(this); GetEventHandler()->ProcessEvent(event) ; @@ -605,7 +569,7 @@ void wxControl::DoSetSize(int x, int y, m_width = new_width; m_height = new_height; - UMASizeControl( m_macControl, + UMASizeControl( (ControlHandle) m_macControl, m_width - 2 * m_macHorizontalBorder, m_height - 2 * m_macVerticalBorder ) ; @@ -615,23 +579,7 @@ void wxControl::DoSetSize(int x, int y, GetEventHandler()->ProcessEvent(event); } - // Set up port - WindowRef rootwindow = GetMacRootWindow() ; - wxWindow* wxrootwindow = wxFindWinFromMacWindow( rootwindow ) ; - wxMacDrawingHelper focus( wxrootwindow ); - - ::SetThemeWindowBackground( rootwindow , kThemeBrushDialogBackgroundActive , false ) ; - // Update window at old and new positions - SetRect(&newbounds, m_x, m_y, m_x + m_width, m_y + m_height); - InvalWindowRect( rootwindow , &oldbounds ); - InvalWindowRect( rootwindow , &newbounds ); - - MacRepositionScrollBars() ; - - if ( !wxrootwindow->IsKindOf( CLASSINFO( wxDialog ) ) ) - { - ::SetThemeWindowBackground( rootwindow, kThemeBrushDocumentWindowBackground, false ); - } + Refresh() ; } } @@ -640,13 +588,13 @@ bool wxControl::Show(bool show) if ( !wxWindow::Show( show ) ) return FALSE ; - if ( m_macControl ) + if ( (ControlHandle) m_macControl ) { if ( !show ) { if ( m_macControlIsShown ) { - ::HideControl( m_macControl ) ; + ::UMAHideControl( (ControlHandle) m_macControl ) ; m_macControlIsShown = false ; } } @@ -654,7 +602,7 @@ bool wxControl::Show(bool show) { if ( MacIsReallyShown() && !m_macControlIsShown ) { - ::UMAShowControl( m_macControl ) ; + ::UMAShowControl( (ControlHandle) m_macControl ) ; m_macControlIsShown = true ; } } @@ -667,137 +615,83 @@ bool wxControl::Enable(bool enable) if ( !wxWindow::Enable(enable) ) return FALSE; - if ( m_macControl ) + if ( (ControlHandle) m_macControl ) { if ( enable ) - UMAActivateControl( m_macControl ) ; + UMAActivateControl( (ControlHandle) m_macControl ) ; else - UMADeactivateControl( m_macControl ) ; + UMADeactivateControl( (ControlHandle) m_macControl ) ; } return TRUE ; } void wxControl::Refresh(bool eraseBack, const wxRect *rect) { - if ( m_macControl ) - { wxWindow::Refresh( eraseBack , rect ) ; - } - else - { - wxWindow::Refresh( eraseBack , rect ) ; - } } void wxControl::MacRedrawControl() { - if ( m_macControl ) + if ( (ControlHandle) m_macControl && MacGetRootWindow() ) { - WindowRef window = GetMacRootWindow() ; - if ( window ) - { - wxWindow* win = wxFindWinFromMacWindow( window ) ; - if ( win ) - { - wxMacDrawingHelper help( win ) ; - // the mac control manager always assumes to have the origin at 0,0 - SetOrigin( 0 , 0 ) ; - - wxWindow* parent = GetParent() ; - while ( parent ) - { - if( parent->MacGetWindowData() ) - { - ::SetThemeWindowBackground( win->MacGetWindowData()->m_macWindow , kThemeBrushDialogBackgroundActive , false ) ; - break ; - } - - if( parent->IsKindOf( CLASSINFO( wxNotebook ) ) || parent->IsKindOf( CLASSINFO( wxTabCtrl ) )) - { - if ( ((wxControl*)parent)->m_macControl ) - SetUpControlBackground( ((wxControl*)parent)->m_macControl , -1 , true ) ; - break ; - } - - parent = parent->GetParent() ; - } - - UMADrawControl( m_macControl ) ; - ::SetThemeWindowBackground( win->MacGetWindowData()->m_macWindow , win->MacGetWindowData()->m_macWindowBackgroundTheme , false ) ; - } - } + 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 ) ; + wxDC::MacSetupBackgroundForCurrentPort( MacGetBackgroundBrush() ) ; + UMADrawControl( (ControlHandle) m_macControl ) ; } } void wxControl::OnPaint(wxPaintEvent& event) { - if ( m_macControl ) + if ( (ControlHandle) m_macControl ) { - WindowRef window = GetMacRootWindow() ; - if ( window ) - { - wxWindow* win = wxFindWinFromMacWindow( window ) ; - if ( win ) - { - wxMacDrawingHelper help( win ) ; - // the mac control manager always assumes to have the origin at 0,0 - SetOrigin( 0 , 0 ) ; - - wxWindow* parent = GetParent() ; - while ( parent ) - { - if( parent->MacGetWindowData() ) - { - ::SetThemeWindowBackground( win->MacGetWindowData()->m_macWindow , kThemeBrushDialogBackgroundActive , false ) ; - break ; - } - - if( parent->IsKindOf( CLASSINFO( wxNotebook ) ) || parent->IsKindOf( CLASSINFO( wxTabCtrl ) )) - { - if ( ((wxControl*)parent)->m_macControl ) - SetUpControlBackground( ((wxControl*)parent)->m_macControl , -1 , true ) ; - break ; - } - - parent = parent->GetParent() ; - } - - UMADrawControl( m_macControl ) ; - ::SetThemeWindowBackground( win->MacGetWindowData()->m_macWindow , win->MacGetWindowData()->m_macWindowBackgroundTheme , false ) ; - } - } + 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 ) ; + + wxDC::MacSetupBackgroundForCurrentPort( MacGetBackgroundBrush() ) ; + UMADrawControl( (ControlHandle) m_macControl ) ; } else { - // wxWindow::OnPaint( event ) ; + event.Skip() ; } } void wxControl::OnEraseBackground(wxEraseEvent& event) { - // In general, you don't want to erase the background of a control, - // or you'll get a flicker. - // TODO: move this 'null' function into each control that - // might flicker. + wxWindow::OnEraseBackground( event ) ; } void wxControl::OnKeyDown( wxKeyEvent &event ) { - if ( m_macControl == NULL ) + if ( (ControlHandle) m_macControl == NULL ) return ; - EventRecord *ev = wxTheApp->MacGetCurrentEvent() ; + EventRecord *ev = (EventRecord*) wxTheApp->MacGetCurrentEvent() ; short keycode ; short keychar ; keychar = short(ev->message & charCodeMask); keycode = short(ev->message & keyCodeMask) >> 8 ; - ::HandleControlKey( m_macControl , keycode , keychar , ev->modifiers ) ; + ::HandleControlKey( (ControlHandle) m_macControl , keycode , keychar , ev->modifiers ) ; } void wxControl::OnMouseEvent( wxMouseEvent &event ) { - if ( m_macControl == NULL ) + if ( (ControlHandle) m_macControl == NULL ) { event.Skip() ; return ; @@ -814,7 +708,7 @@ void wxControl::OnMouseEvent( wxMouseEvent &event ) ControlHandle control ; Point localwhere ; SInt16 controlpart ; - WindowRef window = GetMacRootWindow() ; + WindowRef window = (WindowRef) MacGetRootWindow() ; localwhere.h = x ; localwhere.v = y ; @@ -849,7 +743,7 @@ void wxControl::OnMouseEvent( wxMouseEvent &event ) SetFocus() ; } */ - control = m_macControl ; + control = (ControlHandle) m_macControl ; if ( control && ::IsControlActive( control ) ) { { @@ -869,15 +763,15 @@ void wxControl::OnMouseEvent( wxMouseEvent &event ) bool wxControl::MacCanFocus() const { - { if ( m_macControl == NULL ) + { if ( (ControlHandle) m_macControl == NULL ) return true ; else return false ; } } -void wxControl::MacHandleControlClick( ControlHandle control , SInt16 controlpart ) +void wxControl::MacHandleControlClick( WXWidget control , wxInt16 controlpart ) { - wxASSERT_MSG( m_macControl != NULL , "No valid mac control" ) ; + wxASSERT_MSG( (ControlHandle) m_macControl != NULL , "No valid mac control" ) ; }