X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1c469f7f4e85bd5212bf0409be0384a7b89405df..e7e91e03584a8e2582e7efd32a06f9f79ef65a52:/src/mac/control.cpp diff --git a/src/mac/control.cpp b/src/mac/control.cpp index 55263a3a6b..cc93410764 100644 --- a/src/mac/control.cpp +++ b/src/mac/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" @@ -109,9 +110,9 @@ wxControl::~wxControl() 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( MacGetRootWindow() ) ) ; - 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,21 +402,18 @@ 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()->MacWindowToRootWindow( & mac_x , & mac_y ) ; - WindowRef rootwindow = MacGetRootWindow() ; - wxWindow* wxrootwindow = wxFindWinFromMacWindow( rootwindow ) ; + WindowRef rootwindow = (WindowRef) MacGetRootWindow() ; - wxMacDrawingHelper focus( wxrootwindow ) ; - if ( mac_x + m_macHorizontalBorder != former_mac_x || mac_y + m_macVerticalBorder != former_mac_y ) { @@ -425,7 +421,7 @@ void wxControl::MacSuperChangedPosition() 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 ) ; @@ -444,13 +440,13 @@ void wxControl::MacSuperEnabled( bool enabled ) void wxControl::MacSuperShown( bool show ) { - if ( m_macControl ) + if ( (ControlHandle) m_macControl ) { if ( !show ) { if ( m_macControlIsShown ) { - ::UMAHideControl( m_macControl ) ; + ::UMAHideControl( (ControlHandle) m_macControl ) ; m_macControlIsShown = false ; } } @@ -458,7 +454,7 @@ void wxControl::MacSuperShown( bool show ) { if ( MacIsReallyShown() && !m_macControlIsShown ) { - ::UMAShowControl( m_macControl ) ; + ::UMAShowControl( (ControlHandle) m_macControl ) ; m_macControlIsShown = true ; } } @@ -471,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; @@ -520,7 +516,7 @@ void wxControl::DoSetSize(int x, int y, if(GetParent()) { 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; @@ -561,7 +557,7 @@ 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); @@ -573,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 ) ; @@ -592,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 ) { - ::UMAHideControl( m_macControl ) ; + ::UMAHideControl( (ControlHandle) m_macControl ) ; m_macControlIsShown = false ; } } @@ -606,7 +602,7 @@ bool wxControl::Show(bool show) { if ( MacIsReallyShown() && !m_macControlIsShown ) { - ::UMAShowControl( m_macControl ) ; + ::UMAShowControl( (ControlHandle) m_macControl ) ; m_macControlIsShown = true ; } } @@ -619,12 +615,12 @@ 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 ; } @@ -636,87 +632,41 @@ void wxControl::Refresh(bool eraseBack, const wxRect *rect) void wxControl::MacRedrawControl() { - if ( m_macControl ) + if ( (ControlHandle) m_macControl && MacGetRootWindow() ) { - WindowRef window = MacGetRootWindow() ; - 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->IsTopLevel() ) - { - // ::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 = MacGetRootWindow() ; - 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->IsTopLevel() ) - { - // ::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() ; - } - */ - SetUpControlBackground( m_macControl , -1 , true ) ; - 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) @@ -727,21 +677,21 @@ void wxControl::OnEraseBackground(wxEraseEvent& 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 ; @@ -758,7 +708,7 @@ void wxControl::OnMouseEvent( wxMouseEvent &event ) ControlHandle control ; Point localwhere ; SInt16 controlpart ; - WindowRef window = MacGetRootWindow() ; + WindowRef window = (WindowRef) MacGetRootWindow() ; localwhere.h = x ; localwhere.v = y ; @@ -793,7 +743,7 @@ void wxControl::OnMouseEvent( wxMouseEvent &event ) SetFocus() ; } */ - control = m_macControl ; + control = (ControlHandle) m_macControl ; if ( control && ::IsControlActive( control ) ) { { @@ -813,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" ) ; }