#include "wx/app.h"
#include "wx/mac/uma.h"
#include "wx/geometry.h"
+#include "wx/sysopt.h"
-#ifdef __WXMAC_OSX__
const short kwxMacToolBarToolDefaultWidth = 16;
const short kwxMacToolBarToolDefaultHeight = 16;
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
IMPLEMENT_DYNAMIC_CLASS(wxToolBar, wxControl)
if ( m_toolbarItemRef )
{
CFIndex count = CFGetRetainCount( m_toolbarItemRef ) ;
- wxASSERT_MSG( count == 1 , wxT("Reference Count of native tool was not 1 in wxToolBarTool destructor") );
+ // different behaviour under Leopard
+ if ( UMAGetSystemVersion() < 0x1050 )
+ {
+ wxASSERT_MSG( count == 1 , wxT("Reference Count of native tool was not 1 in wxToolBarTool destructor") );
+ }
wxTheApp->MacAddToAutorelease(m_toolbarItemRef);
CFRelease(m_toolbarItemRef);
m_toolbarItemRef = NULL;
static const EventTypeSpec eventList[] =
{
{ kEventClassControl, kEventControlHit },
-#ifdef __WXMAC_OSX__
{ kEventClassControl, kEventControlHitTest },
-#endif
};
-static pascal OSStatus wxMacToolBarToolControlEventHandler( EventHandlerCallRef handler, EventRef event, void *data )
+static pascal OSStatus wxMacToolBarToolControlEventHandler( EventHandlerCallRef WXUNUSED(handler), EventRef event, void *data )
{
OSStatus result = eventNotHandledErr;
ControlRef controlRef;
{
bool shouldToggle;
-#ifdef __WXMAC_OSX__
shouldToggle = !tbartool->IsToggled();
-#else
- shouldToggle = (GetControl32BitValue( (ControlRef)(tbartool->GetControlHandle()) ) != 0);
-#endif
tbar->ToggleTool( tbartool->GetId(), shouldToggle );
}
}
break;
-#ifdef __WXMAC_OSX__
case kEventControlHitTest:
{
HIPoint pt = cEvent.GetParameter<HIPoint>(kEventParamMouseLocation);
result = noErr;
}
break;
-#endif
default:
break;
{ kEventClassToolbarItem, kEventToolbarItemPerformAction },
};
-static pascal OSStatus wxMacToolBarCommandEventHandler( EventHandlerCallRef handler, EventRef event, void *data )
+static pascal OSStatus wxMacToolBarCommandEventHandler( EventHandlerCallRef WXUNUSED(handler), EventRef event, void *data )
{
OSStatus result = eventNotHandledErr;
if ( m_controlHandle != NULL )
{
-#if TARGET_API_MAC_OSX
if ( enable )
EnableControl( m_controlHandle );
else
DisableControl( m_controlHandle );
-#else
- if ( enable )
- ActivateControl( m_controlHandle );
- else
- DeactivateControl( m_controlHandle );
-#endif
}
}
else
{
// separator
-#ifdef __WXMAC_OSX__
Rect contrlRect;
GetControlBounds( m_controlHandle, &contrlRect );
int former_mac_x = contrlRect.left;
if ( mac_x != former_mac_x || mac_y != former_mac_y )
UMAMoveControl( m_controlHandle, mac_x, mac_y );
-#endif
}
}
void wxToolBarTool::UpdateToggleImage( bool toggle )
{
-#ifdef __WXMAC_OSX__
if ( toggle )
{
int w = m_bmpNormal.GetWidth();
dc.DrawBitmap( m_bmpNormal, 0, 0, true );
dc.SelectObject( wxNullBitmap );
ControlButtonContentInfo info;
- wxMacCreateBitmapButton( &info, bmp, kControlContentIconRef );
+ wxMacCreateBitmapButton( &info, bmp );
SetControlData( m_controlHandle, 0, kControlIconContentTag, sizeof(info), (Ptr)&info );
#if wxMAC_USE_NATIVE_TOOLBAR
if (m_toolbarItemRef != NULL)
{
- HIToolbarItemSetIconRef( m_toolbarItemRef, info.u.iconRef );
+ ControlButtonContentInfo info2;
+ wxMacCreateBitmapButton( &info2, bmp, kControlContentCGImageRef);
+ HIToolbarItemSetImage( m_toolbarItemRef, info2.u.imageRef );
+ wxMacReleaseBitmapButton( &info2 );
}
#endif
wxMacReleaseBitmapButton( &info );
else
{
ControlButtonContentInfo info;
- wxMacCreateBitmapButton( &info, m_bmpNormal, kControlContentIconRef );
+ wxMacCreateBitmapButton( &info, m_bmpNormal );
SetControlData( m_controlHandle, 0, kControlIconContentTag, sizeof(info), (Ptr)&info );
#if wxMAC_USE_NATIVE_TOOLBAR
if (m_toolbarItemRef != NULL)
{
- HIToolbarItemSetIconRef( m_toolbarItemRef, info.u.iconRef );
+ ControlButtonContentInfo info2;
+ wxMacCreateBitmapButton( &info2, m_bmpNormal, kControlContentCGImageRef);
+ HIToolbarItemSetImage( m_toolbarItemRef, info2.u.imageRef );
+ wxMacReleaseBitmapButton( &info2 );
}
#endif
wxMacReleaseBitmapButton( &info );
sizeof(transform), (Ptr)&transform );
HIViewSetNeedsDisplay( m_controlHandle, true );
-#else
- ::SetControl32BitValue( m_controlHandle, toggle );
-#endif
}
wxToolBarTool::wxToolBarTool(
sz = wxSize(0,0) ;
}
+ // Extra width to avoid edge of combobox being cut off
+ sz.x += 3;
+
HISize min, max;
min.width = max.width = sz.x ;
min.height = max.height = sz.y ;
{ kEventClassToolbar, kEventToolbarCreateItemWithIdentifier },
};
-static OSStatus ToolbarDelegateHandler( EventHandlerCallRef inCallRef, EventRef inEvent, void* inUserData )
+static OSStatus ToolbarDelegateHandler(EventHandlerCallRef WXUNUSED(inCallRef),
+ EventRef inEvent,
+ void* WXUNUSED(inUserData))
{
OSStatus result = eventNotHandledErr;
// Not yet needed
OSStatus err = noErr;
#if wxMAC_USE_NATIVE_TOOLBAR
- wxString labelStr = wxString::Format( wxT("%xd"), (int)this );
- err = HIToolbarCreate(
- wxMacCFStringHolder( labelStr, wxFont::GetDefaultEncoding() ), 0,
- (HIToolbarRef*) &m_macHIToolbarRef );
-
- if (m_macHIToolbarRef != NULL)
+ if (parent->IsKindOf(CLASSINFO(wxFrame)) && wxSystemOptions::GetOptionInt(wxT("mac.toolbar.no-native")) != 1)
{
- InstallEventHandler( HIObjectGetEventTarget((HIToolbarRef)m_macHIToolbarRef ), ToolbarDelegateHandler,
- GetEventTypeCount( kToolbarEvents ), kToolbarEvents, this, NULL );
+ wxString labelStr = wxString::Format( wxT("%p"), this );
+ err = HIToolbarCreate(
+ wxMacCFStringHolder( labelStr, wxFont::GetDefaultEncoding() ), 0,
+ (HIToolbarRef*) &m_macHIToolbarRef );
- HIToolbarDisplayMode mode = kHIToolbarDisplayModeDefault;
- HIToolbarDisplaySize displaySize = kHIToolbarDisplaySizeSmall;
+ if (m_macHIToolbarRef != NULL)
+ {
+ InstallEventHandler( HIObjectGetEventTarget((HIToolbarRef)m_macHIToolbarRef ), ToolbarDelegateHandler,
+ GetEventTypeCount( kToolbarEvents ), kToolbarEvents, this, NULL );
- if ( style & wxTB_NOICONS )
- mode = kHIToolbarDisplayModeLabelOnly;
- else if ( style & wxTB_TEXT )
- mode = kHIToolbarDisplayModeIconAndLabel;
- else
- mode = kHIToolbarDisplayModeIconOnly;
+ HIToolbarDisplayMode mode = kHIToolbarDisplayModeDefault;
+ HIToolbarDisplaySize displaySize = kHIToolbarDisplaySizeSmall;
- HIToolbarSetDisplayMode( (HIToolbarRef) m_macHIToolbarRef, mode );
- HIToolbarSetDisplaySize( (HIToolbarRef) m_macHIToolbarRef, displaySize );
+ if ( style & wxTB_NOICONS )
+ mode = kHIToolbarDisplayModeLabelOnly;
+ else if ( style & wxTB_TEXT )
+ mode = kHIToolbarDisplayModeIconAndLabel;
+ else
+ mode = kHIToolbarDisplayModeIconOnly;
+
+ HIToolbarSetDisplayMode( (HIToolbarRef) m_macHIToolbarRef, mode );
+ HIToolbarSetDisplaySize( (HIToolbarRef) m_macHIToolbarRef, displaySize );
+ }
}
#endif // wxMAC_USE_NATIVE_TOOLBAR
MacInstallNativeToolbar( false );
CFIndex count = CFGetRetainCount( m_macHIToolbarRef ) ;
- wxASSERT_MSG( count == 1 , wxT("Reference Count of native control was not 1 in wxToolBar destructor") );
-
+ // Leopard seems to have one refcount more, so we cannot check reliably at the moment
+ if ( UMAGetSystemVersion() < 0x1050 )
+ {
+ wxASSERT_MSG( count == 1 , wxT("Reference Count of native control was not 1 in wxToolBar destructor") );
+ }
CFRelease( (HIToolbarRef)m_macHIToolbarRef );
m_macHIToolbarRef = NULL;
}
// find the maximum tool width and height
wxToolBarTool *tool;
wxToolBarToolsList::compatibility_iterator node = m_tools.GetFirst();
- while ( node != NULL )
+ while ( node )
{
tool = (wxToolBarTool *) node->GetData();
if ( tool != NULL )
#endif
node = m_tools.GetFirst();
- while ( node != NULL )
+ while ( node )
{
tool = (wxToolBarTool*) node->GetData();
if ( tool == NULL )
DoToggleTool( tool, true );
wxToolBarToolsList::compatibility_iterator nodePrev = node->GetPrevious();
- while ( nodePrev != NULL )
+ while ( nodePrev )
{
wxToolBarToolBase *toggleTool = nodePrev->GetData();
if ( (toggleTool == NULL) || !toggleTool->IsButton() || (toggleTool->GetKind() != wxITEM_RADIO) )
{
wxToolBarTool *tool;
wxToolBarToolsList::compatibility_iterator node = m_tools.GetFirst();
- while ( node != NULL )
+ while ( node )
{
tool = (wxToolBarTool *)node->GetData();
if (tool != NULL)
tool->Attach( this );
#if wxMAC_USE_NATIVE_TOOLBAR
- HIToolbarItemRef item;
-#endif
+ wxString label = tool->GetLabel();
+ if (m_macHIToolbarRef && !label.empty() )
+ {
+ // strip mnemonics from the label for compatibility
+ // with the usual labels in wxStaticText sense
+ label = wxStripMenuCodes(label);
+ }
+#endif // wxMAC_USE_NATIVE_TOOLBAR
switch (tool->GetStyle())
{
// in flat style we need a visual separator
#if wxMAC_USE_NATIVE_TOOLBAR
- err = HIToolbarItemCreate(
- kHIToolbarSeparatorIdentifier,
- kHIToolbarItemCantBeRemoved | kHIToolbarItemIsSeparator | kHIToolbarItemAllowDuplicates,
- &item );
- if (err == noErr)
- tool->SetToolbarItemRef( item );
+ if (m_macHIToolbarRef != NULL)
+ {
+ HIToolbarItemRef item;
+ err = HIToolbarItemCreate(
+ kHIToolbarSeparatorIdentifier,
+ kHIToolbarItemCantBeRemoved | kHIToolbarItemIsSeparator | kHIToolbarItemAllowDuplicates,
+ &item );
+ if (err == noErr)
+ tool->SetToolbarItemRef( item );
+ }
+ else
+ err = noErr;
#endif // wxMAC_USE_NATIVE_TOOLBAR
CreateSeparatorControl( window, &toolrect, &controlHandle );
{
wxASSERT( tool->GetControlHandle() == NULL );
ControlButtonContentInfo info;
- wxMacCreateBitmapButton( &info, tool->GetNormalBitmap(), kControlContentIconRef );
+ wxMacCreateBitmapButton( &info, tool->GetNormalBitmap() );
if ( UMAGetSystemVersion() >= 0x1000)
{
+ // contrary to the docs this control only works with iconrefs
+ ControlButtonContentInfo info;
+ wxMacCreateBitmapButton( &info, tool->GetNormalBitmap(), kControlContentIconRef );
CreateIconControl( window, &toolrect, &info, false, &controlHandle );
+ wxMacReleaseBitmapButton( &info );
}
else
{
}
#if wxMAC_USE_NATIVE_TOOLBAR
- wxString labelStr = wxString::Format(wxT("%xd"), (int)tool);
- err = HIToolbarItemCreate(
- wxMacCFStringHolder(labelStr, wxFont::GetDefaultEncoding()),
- kHIToolbarItemCantBeRemoved | kHIToolbarItemAnchoredLeft | kHIToolbarItemAllowDuplicates, &item );
- if (err == noErr)
+ if (m_macHIToolbarRef != NULL)
{
- InstallEventHandler(
- HIObjectGetEventTarget(item), GetwxMacToolBarEventHandlerUPP(),
- GetEventTypeCount(toolBarEventList), toolBarEventList, tool, NULL );
-
- HIToolbarItemSetIconRef( item, info.u.iconRef );
- HIToolbarItemSetCommandID( item, kHIToolbarCommandPressAction );
- tool->SetToolbarItemRef( item );
+ HIToolbarItemRef item;
+ wxString labelStr = wxString::Format(wxT("%p"), tool);
+ err = HIToolbarItemCreate(
+ wxMacCFStringHolder(labelStr, wxFont::GetDefaultEncoding()),
+ kHIToolbarItemCantBeRemoved | kHIToolbarItemAnchoredLeft | kHIToolbarItemAllowDuplicates, &item );
+ if (err == noErr)
+ {
+ ControlButtonContentInfo info2;
+ wxMacCreateBitmapButton( &info2, tool->GetNormalBitmap(), kControlContentCGImageRef);
+
+ InstallEventHandler(
+ HIObjectGetEventTarget(item), GetwxMacToolBarEventHandlerUPP(),
+ GetEventTypeCount(toolBarEventList), toolBarEventList, tool, NULL );
+ HIToolbarItemSetLabel( item, wxMacCFStringHolder(label, m_font.GetEncoding()) );
+ HIToolbarItemSetImage( item, info2.u.imageRef );
+ HIToolbarItemSetCommandID( item, kHIToolbarCommandPressAction );
+ tool->SetToolbarItemRef( item );
+
+ wxMacReleaseBitmapButton( &info2 );
+ }
}
+ else
+ err = noErr;
#endif // wxMAC_USE_NATIVE_TOOLBAR
wxMacReleaseBitmapButton( &info );
case wxTOOL_STYLE_CONTROL:
#if wxMAC_USE_NATIVE_TOOLBAR
+ if (m_macHIToolbarRef != NULL)
{
wxCHECK_MSG( tool->GetControl(), false, _T("control must be non-NULL") );
-
+ HIToolbarItemRef item;
HIViewRef viewRef = (HIViewRef) tool->GetControl()->GetHandle() ;
CFDataRef data = CFDataCreate( kCFAllocatorDefault , (UInt8*) &viewRef , sizeof(viewRef) ) ;
err = HIToolbarCreateItemWithIdentifier((HIToolbarRef) m_macHIToolbarRef,kControlToolbarItemClassID,
}
CFRelease( data ) ;
}
-
+ else
+ {
+ err = noErr;
+ break;
+ }
#else
// right now there's nothing to do here
#endif
break;
}
-#if wxMAC_USE_NATIVE_TOOLBAR
- wxString label = tool->GetLabel();
- if ( !label.empty() )
- {
- // strip mnemonics from the label for compatibility
- // with the usual labels in wxStaticText sense
- label = wxStripMenuCodes(label);
-
- HIToolbarItemSetLabel(item,
- wxMacCFStringHolder(label, m_font.GetEncoding()));
- }
-#endif // wxMAC_USE_NATIVE_TOOLBAR
-
if ( err == noErr )
{
if ( controlHandle )
}
else
{
- wxString errMsg = wxString::Format( wxT("wxToolBar::DoInsertTool - failure [%ld]"), (long)err );
- wxFAIL_MSG( errMsg.c_str() );
+ wxFAIL_MSG( wxString::Format( wxT("wxToolBar::DoInsertTool - failure [%ld]"), (long)err ) );
}
return (err == noErr);
#endif
#if wxMAC_USE_NATIVE_TOOLBAR
- if ( removeIndex != -1 && m_macHIToolbarRef )
+ if (m_macHIToolbarRef != NULL)
{
- HIToolbarRemoveItemAtIndex( (HIToolbarRef) m_macHIToolbarRef, removeIndex );
- tool->SetIndex( -1 );
+ if ( removeIndex != -1 && m_macHIToolbarRef )
+ {
+ HIToolbarRemoveItemAtIndex( (HIToolbarRef) m_macHIToolbarRef, removeIndex );
+ tool->SetIndex( -1 );
+ }
}
#endif
switch ( tool->GetStyle() )
tool2->SetPosition( pt );
#if wxMAC_USE_NATIVE_TOOLBAR
- if ( removeIndex != -1 && tool2->GetIndex() > removeIndex )
- tool2->SetIndex( tool2->GetIndex() - 1 );
+ if (m_macHIToolbarRef != NULL)
+ {
+ if ( removeIndex != -1 && tool2->GetIndex() > removeIndex )
+ tool2->SetIndex( tool2->GetIndex() - 1 );
+ }
#endif
}
GetSize( &w, &h );
bool drawMetalTheme = MacGetTopLevelWindow()->MacGetMetalAppearance();
- bool minimumUmaAvailable = (UMAGetSystemVersion() >= 0x1030);
-#if wxMAC_USE_CORE_GRAPHICS && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3
- if ( !drawMetalTheme && minimumUmaAvailable )
+ if ( !drawMetalTheme )
{
HIThemePlacardDrawInfo info;
memset( &info, 0, sizeof(info) );
// leave the background as it is (striped or metal)
}
-#else
-
- const bool drawBorder = true;
-
- if (drawBorder)
- {
- wxMacPortSetter helper( &dc );
-
- if ( !drawMetalTheme || !minimumUmaAvailable )
- {
- Rect toolbarrect = { dc.YLOG2DEVMAC(0), dc.XLOG2DEVMAC(0),
- dc.YLOG2DEVMAC(h), dc.XLOG2DEVMAC(w) };
-
-#if 0
- if ( toolbarrect.left < 0 )
- toolbarrect.left = 0;
- if ( toolbarrect.top < 0 )
- toolbarrect.top = 0;
-#endif
-
- UMADrawThemePlacard( &toolbarrect, IsEnabled() ? kThemeStateActive : kThemeStateInactive );
- }
- else
- {
-#if TARGET_API_MAC_OSX
- 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 );
-
-#ifndef __LP64__
- QDEndCGContext( (CGrafPtr) dc.m_macPort, &cgContext );
-#endif
-#endif
- }
- }
-#endif
-
event.Skip();
}