#include "wx/geometry.h"
#ifdef __WXMAC_OSX__
-const short kwxMacToolBarToolDefaultWidth = 24 ;
-const short kwxMacToolBarToolDefaultHeight = 24 ;
+const short kwxMacToolBarToolDefaultWidth = 16 ;
+const short kwxMacToolBarToolDefaultHeight = 16 ;
const short kwxMacToolBarTopMargin = 4 ;
const short kwxMacToolBarLeftMargin = 4 ;
const short kwxMacToolBorder = 0 ;
{
// separator size
wxSize sz = GetToolBar()->GetToolSize() ;
- sz.x /= 4 ;
- sz.y /= 4 ;
+ if ( GetToolBar()->GetWindowStyleFlag() & wxTB_VERTICAL )
+ sz.y /= 4 ;
+ else
+ sz.x /= 4 ;
return sz ;
}
}
return wxPoint(m_x, m_y);
}
bool DoEnable( bool enable ) ;
+
+ void UpdateToggleImage( bool toggle ) ;
private :
void Init()
{
static const EventTypeSpec eventList[] =
{
{ kEventClassControl , kEventControlHit } ,
+#ifdef __WXMAC_OSX__
+ { kEventClassControl , kEventControlHitTest } ,
+#endif
} ;
static pascal OSStatus wxMacToolBarToolControlEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
wxToolBarTool* tbartool = (wxToolBarTool*)data ;
if ( tbartool->CanBeToggled() )
{
+#ifdef __WXMAC_OSX__
+ ((wxToolBar*)tbartool->GetToolBar())->ToggleTool(tbartool->GetId(), !tbartool->IsToggled() );
+#else
((wxToolBar*)tbartool->GetToolBar())->ToggleTool(tbartool->GetId(), GetControl32BitValue((ControlRef)tbartool->GetControlHandle()));
+#endif
}
((wxToolBar*)tbartool->GetToolBar())->OnLeftClick( tbartool->GetId() , tbartool -> IsToggled() ) ;
result = noErr;
}
break ;
+#ifdef __WXMAC_OSX__
+ case kEventControlHitTest :
+ {
+ HIPoint pt = cEvent.GetParameter<HIPoint>(kEventParamMouseLocation) ;
+ HIRect rect ;
+ HIViewGetBounds( controlRef , &rect ) ;
+
+ ControlPartCode pc = kControlNoPart ;
+ if ( CGRectContainsPoint( rect , pt ) )
+ pc = kControlButtonPart ;
+ cEvent.SetParameter( kEventParamControlPart , typeControlPartCode, pc ) ;
+ result = noErr ;
+ }
+ break ;
+#endif
default :
break ;
}
m_x = position.x;
m_y = position.y;
- if ( IsButton() )
+ int x , y ;
+ x = y = 0 ;
+ int mac_x = position.x ;
+ int mac_y = position.y ;
+
+ if ( ! GetToolBar()->MacGetTopLevelWindow()->MacUsesCompositing() )
{
- int x , y ;
- x = y = 0 ;
- int mac_x = position.x ;
- int mac_y = position.y ;
-#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;
mac_y += y;
-#endif
+ }
+
+ if ( IsButton() )
+ {
Rect contrlRect ;
GetControlBounds( m_controlHandle , &contrlRect ) ;
int former_mac_x = contrlRect.left ;
{
// separator
#ifdef __WXMAC_OSX__
- int x , y ;
- x = y = 0 ;
- int mac_x = position.x ;
- int mac_y = position.y ;
-
Rect contrlRect ;
GetControlBounds( m_controlHandle , &contrlRect ) ;
int former_mac_x = contrlRect.left ;
}
}
+void wxToolBarTool::UpdateToggleImage( bool toggle )
+{
+#ifdef __WXMAC_OSX__
+ if ( toggle )
+ {
+ int w = m_bmpNormal.GetWidth() ;
+ int h = m_bmpNormal.GetHeight() ;
+ wxBitmap bmp( w , h ) ;
+ wxMemoryDC dc ;
+ dc.SelectObject( bmp ) ;
+ dc.SetPen( wxNullPen ) ;
+ dc.SetBackground( *wxWHITE ) ;
+ dc.DrawRectangle( 0 , 0 , w , h ) ;
+ dc.DrawBitmap( m_bmpNormal , 0 , 0 , true) ;
+ dc.SelectObject( wxNullBitmap ) ;
+ ControlButtonContentInfo info ;
+ wxMacCreateBitmapButton( &info , bmp ) ;
+ SetControlData( m_controlHandle , 0, kControlIconContentTag, sizeof( info ),
+ (Ptr)&info );
+ wxMacReleaseBitmapButton( &info ) ;
+ }
+ else
+ {
+ ControlButtonContentInfo info ;
+ wxMacCreateBitmapButton( &info , m_bmpNormal ) ;
+ SetControlData( m_controlHandle , 0, kControlIconContentTag, sizeof( info ),
+ (Ptr)&info );
+ wxMacReleaseBitmapButton( &info ) ;
+ }
+
+ IconTransformType transform = toggle ? kTransformSelected : kTransformNone ;
+ SetControlData( m_controlHandle, 0, kControlIconTransformTag, sizeof( transform ),
+ (Ptr)&transform );
+ HIViewSetNeedsDisplay( m_controlHandle , true ) ;
+
+#else
+ ::SetControl32BitValue( m_controlHandle , toggle ) ;
+#endif
+}
+
wxToolBarTool::wxToolBarTool(wxToolBar *tbar,
int id,
const wxString& label,
else
{
ControlButtonContentInfo info ;
- wxMacCreateBitmapButton( &info , GetNormalBitmap() ) ;
+ wxMacCreateBitmapButton( &info , GetNormalBitmap() , kControlContentIconRef ) ;
#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 ;
InstallControlEventHandler( (ControlRef) m_controlHandle, GetwxMacToolBarToolEventHandlerUPP(),
GetEventTypeCount(eventList), eventList, this,NULL);
- 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") ) ;
UMAShowControl( m_controlHandle ) ;
::EmbedControl( m_controlHandle , container ) ;
}
+ if ( CanBeToggled() && IsToggled() )
+ {
+ UpdateToggleImage( true ) ;
+ }
}
if ( y + cursize.y > maxHeight )
maxHeight = y + cursize.y ;
- tool->SetPosition( wxPoint( x , y ) ) ;
-
+ if ( GetWindowStyleFlag() & wxTB_VERTICAL )
+ {
+ int x1 = x + (maxToolWidth - cursize.x)/2 ;
+ tool->SetPosition( wxPoint( x1 , y ) ) ;
+ }
+ else
+ {
+ int y1 = y + (maxToolHeight - cursize.y)/2 ;
+ tool->SetPosition( wxPoint( x , y1 ) ) ;
+ }
if ( GetWindowStyleFlag() & wxTB_VERTICAL )
{
y += cursize.y ;
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
+ tool->UpdateToggleImage( toggle ) ;
}
}
tool->Detach();
+ wxToolBarTool* tl = wx_static_cast( wxToolBarTool* , tool ) ;
+ switch ( tool->GetStyle() )
+ {
+ case wxTOOL_STYLE_CONTROL:
+ tool->GetControl()->Destroy();
+ break;
+
+ case wxTOOL_STYLE_BUTTON:
+ case wxTOOL_STYLE_SEPARATOR:
+ if ( tl->GetControlHandle() )
+ {
+ DisposeControl( (ControlRef) tl->GetControlHandle() ) ;
+ tl->SetControlHandle( (ControlRef) NULL ) ;
+ }
+ break;
+ }
+
// and finally reposition all the controls after this one
for ( /* node -> first after deleted */ ; node; node = node->GetNext() )
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 ) ;
+#if wxMAC_USE_CORE_GRAPHICS && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3
+ if ( !MacGetTopLevelWindow()->MacGetMetalAppearance() )
+ {
+ if ( UMAGetSystemVersion() >= 0x1030 )
+ {
+ HIThemePlacardDrawInfo info ;
+ memset( &info, 0 , sizeof( info ) ) ;
+ info.version = 0 ;
+ info.state = IsEnabled() ? kThemeStateActive : kThemeStateInactive ;
+
+ CGContextRef cgContext = (CGContextRef) MacGetCGContextRef() ;
+ HIRect rect = CGRectMake( 0 , 0 , w , h ) ;
+ HIThemeDrawPlacard( &rect , & info , cgContext, kHIThemeOrientationNormal) ;
+ }
+ }
+ else
+ {
+ // leave the background as it is (striped or metal)
+ }
+#else
+ wxMacPortSetter helper(&dc) ;
Rect toolbarrect = { dc.YLOG2DEVMAC(0) , dc.XLOG2DEVMAC(0) ,
dc.YLOG2DEVMAC(h) , dc.XLOG2DEVMAC(w) } ;