X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/456c94e1947c298afa4a3d3e6a36a4365b4fb2bd..2ad99bc1398db5a619b3682e90ad7a99485ae4c9:/src/mac/control.cpp diff --git a/src/mac/control.cpp b/src/mac/control.cpp index 9ee03b8a4e..fc90b8ea04 100644 --- a/src/mac/control.cpp +++ b/src/mac/control.cpp @@ -36,12 +36,13 @@ 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 #include "wx/mac/uma.h" +#include "wx/mac/private.h" // Item members @@ -60,6 +61,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 ; @@ -90,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); @@ -110,26 +145,26 @@ 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 ; } } void wxControl::SetLabel(const wxString& title) { - m_label = title ; + m_label = wxStripMenuCodes(title) ; - if ( m_macControl ) + if ( (ControlHandle) m_macControl ) { Str255 maclabel ; 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 ) ; @@ -137,7 +172,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() ; } @@ -147,7 +182,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 ) ) { @@ -239,7 +274,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); @@ -264,10 +299,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 ) ; @@ -286,19 +321,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 { @@ -306,15 +341,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); @@ -332,19 +372,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 ) ) { @@ -377,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 ) { @@ -385,13 +425,14 @@ void wxControl::MacAdjustControlRect() if ( m_height < 10 ) m_height = 13 ; - m_height += 2 * m_macVerticalBorder; + m_height += 2 * m_macVerticalBorder + MacGetTopBorderSize() + MacGetBottomBorderSize() ; } - - UMASizeControl( 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 ) ; } } -ControlHandle wxControl::MacGetContainerForEmbedding() + +WXWidget wxControl::MacGetContainerForEmbedding() { if ( m_macControl ) return m_macControl ; @@ -399,35 +440,49 @@ ControlHandle wxControl::MacGetContainerForEmbedding() return wxWindow::MacGetContainerForEmbedding() ; } -void wxControl::MacSuperChangedPosition() +void wxControl::MacUpdateDimensions() { - if ( m_macControl ) - { - Rect contrlRect ; - GetControlBounds( 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() ; - - 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 ) ; - { - 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() ; } @@ -439,13 +494,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 ; } } @@ -453,7 +508,7 @@ void wxControl::MacSuperShown( bool show ) { if ( MacIsReallyShown() && !m_macControlIsShown ) { - ::UMAShowControl( m_macControl ) ; + ::UMAShowControl( (ControlHandle) m_macControl ) ; m_macControlIsShown = true ; } } @@ -466,13 +521,17 @@ void wxControl::DoSetSize(int x, int y, int width, int height, int sizeFlags ) { - if ( m_macControl == NULL ) + wxWindow::DoSetSize( x , y ,width , height ,sizeFlags ) ; + return ; +/* + + 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; @@ -515,7 +574,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; @@ -556,7 +615,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); @@ -568,7 +627,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 ) ; @@ -580,6 +639,7 @@ void wxControl::DoSetSize(int x, int y, Refresh() ; } +*/ } bool wxControl::Show(bool show) @@ -587,13 +647,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 ; } } @@ -601,7 +661,7 @@ bool wxControl::Show(bool show) { if ( MacIsReallyShown() && !m_macControlIsShown ) { - ::UMAShowControl( m_macControl ) ; + ::UMAShowControl( (ControlHandle) m_macControl ) ; m_macControlIsShown = true ; } } @@ -614,12 +674,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 ; } @@ -631,37 +691,66 @@ void wxControl::Refresh(bool eraseBack, const wxRect *rect) void wxControl::MacRedrawControl() { - if ( m_macControl && MacGetRootWindow() ) + if ( (ControlHandle) m_macControl && MacGetRootWindow() ) { 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( m_macControl ) ; + UMADrawControl( (ControlHandle) m_macControl ) ; } } void wxControl::OnPaint(wxPaintEvent& event) { - if ( m_macControl ) + if ( (ControlHandle) m_macControl ) { 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( m_macControl ) ; + UMADrawControl( (ControlHandle) m_macControl ) ; } else { @@ -676,21 +765,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 ; @@ -707,7 +796,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 ; @@ -742,7 +831,7 @@ void wxControl::OnMouseEvent( wxMouseEvent &event ) SetFocus() ; } */ - control = m_macControl ; + control = (ControlHandle) m_macControl ; if ( control && ::IsControlActive( control ) ) { { @@ -762,15 +851,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" ) ; }