X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/90d3f91a047de9e5aa43e9ae02e613fb241cb944..8d3b6b8aa1cc0d2f927cedd36d490d412ed3da29:/src/mac/carbon/toolbar.cpp?ds=inline diff --git a/src/mac/carbon/toolbar.cpp b/src/mac/carbon/toolbar.cpp index bdb6e6bad3..34303667b2 100644 --- a/src/mac/carbon/toolbar.cpp +++ b/src/mac/carbon/toolbar.cpp @@ -9,14 +9,15 @@ // Licence: The wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "toolbar.h" #endif -#include "wx/wx.h" +#include "wx/wxprec.h" #if wxUSE_TOOLBAR +#include "wx/wx.h" #include "wx/toolbar.h" #include "wx/notebook.h" #include "wx/tabctrl.h" @@ -32,6 +33,23 @@ END_EVENT_TABLE() #include "wx/mac/uma.h" #include "wx/geometry.h" + +#ifdef __WXMAC_OSX__ +const short kwxMacToolBarToolDefaultWidth = 24 ; +const short kwxMacToolBarToolDefaultHeight = 24 ; +const short kwxMacToolBarTopMargin = 4 ; +const short kwxMacToolBarLeftMargin = 4 ; +const short kwxMacToolBorder = 0 ; +const short kwxMacToolSpacing = 6 ; +#else +const short kwxMacToolBarToolDefaultWidth = 24 ; +const short kwxMacToolBarToolDefaultHeight = 22 ; +const short kwxMacToolBarTopMargin = 2 ; +const short kwxMacToolBarLeftMargin = 2 ; +const short kwxMacToolBorder = 4 ; +const short kwxMacToolSpacing = 0 ; +#endif + // ---------------------------------------------------------------------------- // private classes // ---------------------------------------------------------------------------- @@ -79,6 +97,7 @@ public: } else { + // separator size wxSize sz = GetToolBar()->GetToolSize() ; sz.x /= 4 ; sz.y /= 4 ; @@ -201,7 +220,16 @@ void wxToolBarTool::SetPosition(const wxPoint& position) x = y = 0 ; int mac_x = position.x ; int mac_y = position.y ; -#if !TARGET_API_MAC_OSX +#ifdef __WXMAC_OSX__ + wxSize toolSize = m_tbar->GetToolSize() ; + int iconsize = 16 ; + if ( toolSize.x >= 24 && toolSize.y >= 24) + { + iconsize = 24 ; + } + mac_x += ( toolSize.x - iconsize ) / 2 ; + mac_y += ( toolSize.y - iconsize ) / 2 ; +#else WindowRef rootwindow = (WindowRef) GetToolBar()->MacGetTopLevelWindowRef() ; GetToolBar()->MacWindowToRootWindow( &x , &y ) ; mac_x += x; @@ -222,12 +250,27 @@ void wxToolBarTool::SetPosition(const wxPoint& position) { GetControl()->Move( position ) ; } -} + else + { + // separator +#ifdef __WXMAC_OSX__ + int x , y ; + x = y = 0 ; + int mac_x = position.x ; + int mac_y = position.y ; -const short kwxMacToolBarToolDefaultWidth = 24 ; -const short kwxMacToolBarToolDefaultHeight = 22 ; -const short kwxMacToolBarTopMargin = 2 ; -const short kwxMacToolBarLeftMargin = 2 ; + Rect contrlRect ; + GetControlBounds( m_controlHandle , &contrlRect ) ; + int former_mac_x = contrlRect.left ; + int former_mac_y = contrlRect.top ; + + if ( mac_x != former_mac_x || mac_y != former_mac_y ) + { + UMAMoveControl( m_controlHandle , mac_x , mac_y ) ; + } +#endif + } +} wxToolBarTool::wxToolBarTool(wxToolBar *tbar, int id, @@ -243,35 +286,76 @@ wxToolBarTool::wxToolBarTool(wxToolBar *tbar, { Init(); - if (id == wxID_SEPARATOR) return; - WindowRef window = (WindowRef) tbar->MacGetTopLevelWindowRef() ; wxSize toolSize = tbar->GetToolSize() ; Rect toolrect = { 0, 0 , toolSize.y , toolSize.x } ; - - ControlButtonContentInfo info ; - wxMacCreateBitmapButton( &info , GetNormalBitmap() ) ; - - SInt16 behaviour = kControlBehaviorOffsetContents ; - if ( CanBeToggled() ) - behaviour += kControlBehaviorToggles ; - - CreateBevelButtonControl( window , &toolrect , CFSTR("") , kControlBevelButtonNormalBevel , behaviour , &info , - 0 , 0 , 0 , &m_controlHandle ) ; + + if ( id == wxID_SEPARATOR ) + { + toolSize.x /= 4 ; + toolSize.y /= 4 ; + if ( GetToolBar()->GetWindowStyleFlag() & wxTB_VERTICAL ) + { + toolrect.bottom = toolSize.y ; + } + else + { + toolrect.right = toolSize.x ; + } +#ifdef __WXMAC_OSX__ + // in flat style we need a visual separator + CreateSeparatorControl( window , &toolrect , &m_controlHandle ) ; +#endif + } + else + { + ControlButtonContentInfo info ; + wxMacCreateBitmapButton( &info , GetNormalBitmap() ) ; - InstallControlEventHandler( (ControlRef) m_controlHandle, GetwxMacToolBarToolEventHandlerUPP(), - GetEventTypeCount(eventList), eventList, this,NULL); +#ifdef __WXMAC_OSX__ + int iconsize = 16 ; + if ( toolSize.x >= 24 && toolSize.y >= 24) + { + iconsize = 24 ; + } + toolrect.left += ( toolSize.x - iconsize ) / 2 ; + toolrect.right = toolrect.left + iconsize ; + toolrect.top += ( toolSize.y - iconsize ) / 2 ; + toolrect.bottom = toolrect.top + iconsize ; + CreateIconControl( window , &toolrect , &info , false , &m_controlHandle ) ; +#else + SInt16 behaviour = kControlBehaviorOffsetContents ; + if ( CanBeToggled() ) + behaviour += kControlBehaviorToggles ; + CreateBevelButtonControl( window , &toolrect , CFSTR("") , kControlBevelButtonNormalBevel , behaviour , &info , + 0 , 0 , 0 , &m_controlHandle ) ; +#endif + + wxMacReleaseBitmapButton( &info ) ; + /* + SetBevelButtonTextPlacement( m_controlHandle , kControlBevelButtonPlaceBelowGraphic ) ; + UMASetControlTitle( m_controlHandle , label , wxFont::GetDefaultEncoding() ) ; + */ - UMAShowControl( m_controlHandle ) ; + InstallControlEventHandler( (ControlRef) m_controlHandle, GetwxMacToolBarToolEventHandlerUPP(), + GetEventTypeCount(eventList), eventList, this,NULL); - if ( CanBeToggled() && IsToggled() ) - ::SetControl32BitValue( m_controlHandle , 1 ) ; - else - ::SetControl32BitValue( m_controlHandle , 0 ) ; - + if ( CanBeToggled() && IsToggled() ) + { +#ifdef __WXMAC_OSX__ + // overlay with rounded white rect and set selected to 1 +#else + ::SetControl32BitValue( m_controlHandle , 1 ) ; +#endif + } + } ControlRef container = (ControlRef) tbar->GetHandle() ; wxASSERT_MSG( container != NULL , wxT("No valid mac container control") ) ; - ::EmbedControl( m_controlHandle , container ) ; + if ( m_controlHandle ) + { + UMAShowControl( m_controlHandle ) ; + ::EmbedControl( m_controlHandle , container ) ; + } } @@ -304,6 +388,7 @@ void wxToolBar::Init() bool wxToolBar::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxString& name) { + if ( !wxToolBarBase::Create( parent , id , pos , size , style ) ) return FALSE ; @@ -385,10 +470,12 @@ bool wxToolBar::Realize() if ( GetWindowStyleFlag() & wxTB_VERTICAL ) { y += cursize.y ; + y += kwxMacToolSpacing ; } else { x += cursize.x ; + x += kwxMacToolSpacing ; } node = node->GetNext(); @@ -427,13 +514,13 @@ bool wxToolBar::Realize() void wxToolBar::SetToolBitmapSize(const wxSize& size) { - m_defaultWidth = size.x+4; m_defaultHeight = size.y+4; + m_defaultWidth = size.x+kwxMacToolBorder; m_defaultHeight = size.y+kwxMacToolBorder; } // The button size is bigger than the bitmap size wxSize wxToolBar::GetToolSize() const { - return wxSize(m_defaultWidth + 4, m_defaultHeight + 4); + return wxSize(m_defaultWidth + kwxMacToolBorder, m_defaultHeight + kwxMacToolBorder); } void wxToolBar::SetRows(int nRows) @@ -491,7 +578,13 @@ void wxToolBar::DoToggleTool(wxToolBarToolBase *t, bool toggle) wxToolBarTool *tool = (wxToolBarTool *)t; if ( tool->IsButton() ) { +#ifdef __WXMAC_OSX__ + IconTransformType transform = toggle ? kTransformSelected : kTransformNone ; + SetControlData( (ControlRef) tool->GetControlHandle(), 0, kControlIconTransformTag, sizeof( transform ), + (Ptr)&transform ); +#else ::SetControl32BitValue( (ControlRef) tool->GetControlHandle() , toggle ) ; +#endif } } @@ -554,6 +647,9 @@ bool wxToolBar::DoDeleteTool(size_t WXUNUSED(pos), wxToolBarToolBase *tool) void wxToolBar::OnPaint(wxPaintEvent& event) { wxPaintDC dc(this) ; +#if wxMAC_USE_CORE_GRAPHICS + // leave the background as it is (striped or metal) +#else wxMacPortSetter helper(&dc) ; int w, h ; GetSize( &w , &h ) ; @@ -574,33 +670,35 @@ void wxToolBar::OnPaint(wxPaintEvent& event) { #if TARGET_API_MAC_OSX #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2 - if ( UMAGetSystemVersion() >= 0x1030 ) - { - HIRect hiToolbarrect = CGRectMake( dc.YLOG2DEVMAC(0) , dc.XLOG2DEVMAC(0) , - dc.YLOG2DEVREL(h) , dc.XLOG2DEVREL(w) ); - CGContextRef cgContext ; - Rect bounds ; - GetPortBounds( (CGrafPtr) dc.m_macPort , &bounds ) ; - QDBeginCGContext( (CGrafPtr) dc.m_macPort , &cgContext ) ; - CGContextTranslateCTM( cgContext , 0 , bounds.bottom - bounds.top ) ; - CGContextScaleCTM( cgContext , 1 , -1 ) ; + if ( UMAGetSystemVersion() >= 0x1030 ) + { + HIRect hiToolbarrect = CGRectMake( dc.YLOG2DEVMAC(0) , dc.XLOG2DEVMAC(0) , + dc.YLOG2DEVREL(h) , dc.XLOG2DEVREL(w) ); + CGContextRef cgContext ; + Rect bounds ; + GetPortBounds( (CGrafPtr) dc.m_macPort , &bounds ) ; + QDBeginCGContext( (CGrafPtr) dc.m_macPort , &cgContext ) ; + CGContextTranslateCTM( cgContext , 0 , bounds.bottom - bounds.top ) ; + CGContextScaleCTM( cgContext , 1 , -1 ) ; + { + HIThemeBackgroundDrawInfo drawInfo ; + drawInfo.version = 0 ; + drawInfo.state = kThemeStateActive ; + drawInfo.kind = kThemeBackgroundMetal ; + HIThemeApplyBackground( &hiToolbarrect, &drawInfo , cgContext,kHIThemeOrientationNormal) ; + } + QDEndCGContext( (CGrafPtr) dc.m_macPort , &cgContext ) ; + } + else +#endif { - HIThemeBackgroundDrawInfo drawInfo ; - drawInfo.version = 0 ; - drawInfo.state = kThemeStateActive ; - drawInfo.kind = kThemeBackgroundMetal ; - HIThemeApplyBackground( &hiToolbarrect, &drawInfo , cgContext,kHIThemeOrientationNormal) ; + UMADrawThemePlacard( &toolbarrect , IsEnabled() ? kThemeStateActive : kThemeStateInactive) ; } - QDEndCGContext( (CGrafPtr) dc.m_macPort , &cgContext ) ; - } - else #endif - { - UMADrawThemePlacard( &toolbarrect , IsEnabled() ? kThemeStateActive : kThemeStateInactive) ; } #endif - } + event.Skip() ; }