X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1c310985399bf2919b16e5043d6e424c623c62c9..89e92728495341a97be57248620f5a12c1ccab1e:/src/mac/carbon/control.cpp diff --git a/src/mac/carbon/control.cpp b/src/mac/carbon/control.cpp index 1c7030c6b8..6570c1303b 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" @@ -35,7 +36,7 @@ IMPLEMENT_ABSTRACT_CLASS(wxControl, wxWindow) BEGIN_EVENT_TABLE(wxControl, wxWindow) EVT_MOUSE_EVENTS( wxControl::OnMouseEvent ) - EVT_CHAR( wxControl::OnKeyDown ) +// EVT_CHAR( wxControl::OnKeyDown ) EVT_PAINT( wxControl::OnPaint ) END_EVENT_TABLE() #endif @@ -59,6 +60,34 @@ pascal void wxMacLiveScrollbarActionProc( ControlHandle control , ControlPartCod } } +ControlColorUPP wxMacSetupControlBackgroundUPP = NULL ; + +pascal OSStatus wxMacSetupControlBackground( ControlRef iControl , SInt16 iMessage , SInt16 iDepth , Boolean iIsColor ) +{ + OSStatus status = noErr ; + switch( iMessage ) + { + case kControlMsgSetUpBackground : + { + wxControl* wx = (wxControl*) GetControlReference( iControl ) ; + if ( wx != NULL && wx->IsKindOf( CLASSINFO( wxControl ) ) ) + { + wxDC::MacSetupBackgroundForCurrentPort( wx->MacGetBackgroundBrush() ) ; + // SetThemeBackground( iDepth , iIsColor ) ; + } + else + { + status = paramErr ; + } + } + break ; + default : + status = paramErr ; + break ; + } + return status ; +} + wxControl::wxControl() { m_macControl = NULL ; @@ -109,9 +138,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 +149,7 @@ void wxControl::SetLabel(const wxString& title) { m_label = title ; - if ( m_macControl ) + if ( (ControlHandle) m_macControl ) { Str255 maclabel ; wxString label ; @@ -136,7 +165,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 +175,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 +267,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 +292,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,19 +314,19 @@ 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 ) ) ) { // no font } - else if ( IsKindOf( CLASSINFO( wxStaticBox ) ) || IsKindOf( CLASSINFO( wxRadioBox ) ) || IsKindOf( CLASSINFO( wxButton ) ) ) + else if ( !UMAHasAquaLayout() && (IsKindOf( CLASSINFO( wxStaticBox ) ) || IsKindOf( CLASSINFO( wxRadioBox ) ) || IsKindOf( CLASSINFO( wxButton ) ) ) ) { ControlFontStyleRec controlstyle ; controlstyle.flags = kControlUseFontMask ; controlstyle.font = kControlFontSmallBoldSystemFont ; - ::SetControlFontStyle( m_macControl , &controlstyle ) ; + ::SetControlFontStyle( (ControlHandle) m_macControl , &controlstyle ) ; } else { @@ -305,15 +334,20 @@ 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 ) ; + if ( wxMacSetupControlBackgroundUPP == NULL ) + { + wxMacSetupControlBackgroundUPP = NewControlColorUPP( wxMacSetupControlBackground ) ; + } + SetControlColorProc( (ControlHandle) m_macControl , wxMacSetupControlBackgroundUPP ) ; // Adjust the controls size and position wxPoint pos(m_x, m_y); @@ -331,18 +365,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 +421,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 +435,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 +454,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 ) ; @@ -438,48 +467,19 @@ void wxControl::MacSuperChangedPosition() void wxControl::MacSuperEnabled( bool enabled ) { + Refresh(FALSE) ; wxWindow::MacSuperEnabled( 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 ) ; - } - } - } - wxWindow::MacSuperEnabled( 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 ; } } @@ -487,7 +487,7 @@ void wxControl::MacSuperShown( bool show ) { if ( MacIsReallyShown() && !m_macControlIsShown ) { - ::UMAShowControl( m_macControl ) ; + ::UMAShowControl( (ControlHandle) m_macControl ) ; m_macControlIsShown = true ; } } @@ -500,13 +500,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; @@ -549,7 +549,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; @@ -590,7 +590,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); @@ -602,7 +602,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 ) ; @@ -621,13 +621,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 ; } } @@ -635,7 +635,7 @@ bool wxControl::Show(bool show) { if ( MacIsReallyShown() && !m_macControlIsShown ) { - ::UMAShowControl( m_macControl ) ; + ::UMAShowControl( (ControlHandle) m_macControl ) ; m_macControlIsShown = true ; } } @@ -648,12 +648,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 ; } @@ -665,87 +665,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) @@ -756,21 +710,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 ; @@ -787,7 +741,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 ; @@ -822,7 +776,7 @@ void wxControl::OnMouseEvent( wxMouseEvent &event ) SetFocus() ; } */ - control = m_macControl ; + control = (ControlHandle) m_macControl ; if ( control && ::IsControlActive( control ) ) { { @@ -842,15 +796,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" ) ; }