]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/toolbar.cpp
suppress warning about converting -1 to MenuItemIndex
[wxWidgets.git] / src / mac / carbon / toolbar.cpp
index 6292291bdb54342d6db5ff2e284cd97f620a9f27..7f12f1cc6b282a244b41ccbc9e80f4d63b5fc96e 100644 (file)
@@ -19,6 +19,7 @@
     #include "wx/wx.h"
 #endif
 
+#include "wx/app.h"
 #include "wx/mac/uma.h"
 #include "wx/geometry.h"
 
@@ -71,8 +72,8 @@ public:
         const wxString& shortHelp,
         const wxString& longHelp );
 
-    wxToolBarTool(wxToolBar *tbar, wxControl *control)
-        : wxToolBarToolBase(tbar, control)
+    wxToolBarTool(wxToolBar *tbar, wxControl *control, const wxString& label)
+        : wxToolBarToolBase(tbar, control, label)
     {
         Init();
         if (control != NULL)
@@ -82,11 +83,6 @@ public:
     virtual ~wxToolBarTool()
     {
         ClearControl();
-
-#if wxMAC_USE_NATIVE_TOOLBAR
-        if ( m_toolbarItemRef )
-            CFRelease( m_toolbarItemRef );
-#endif
     }
 
     WXWidget GetControlHandle()
@@ -106,12 +102,24 @@ public:
         m_control = NULL;
         if ( m_controlHandle )
         {
-            DisposeControl( m_controlHandle );
+            if ( !IsControl() )
+                DisposeControl( m_controlHandle );
+            else
+            {
+                // the embedded control is not under the responsibility of the tool
+            }
             m_controlHandle = NULL ;
         }
 
 #if wxMAC_USE_NATIVE_TOOLBAR
-        m_toolbarItemRef = NULL;
+        if ( m_toolbarItemRef )
+        {
+            CFIndex count = CFGetRetainCount( m_toolbarItemRef ) ;
+            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;
+        }
 #endif
     }
 
@@ -160,10 +168,19 @@ public:
         m_toolbarItemRef = ref;
         if ( m_toolbarItemRef )
         {
+            wxFont f;
+            wxFontEncoding enc;
+            if ( GetToolBar() )
+                f = GetToolBar()->GetFont();
+            if ( f.IsOk() )
+                enc = f.GetEncoding();
+            else
+                enc = wxFont::GetDefaultEncoding();
+
             HIToolbarItemSetHelpText(
                 m_toolbarItemRef,
-                wxMacCFStringHolder( GetShortHelp(), GetToolBar()->GetFont().GetEncoding() ),
-                wxMacCFStringHolder( GetLongHelp(), GetToolBar()->GetFont().GetEncoding() ) );
+                wxMacCFStringHolder( GetShortHelp(), enc ),
+                wxMacCFStringHolder( GetLongHelp(), enc ) );
         }
     }
 
@@ -387,8 +404,6 @@ void wxToolBarTool::SetPosition( const wxPoint& position )
     m_x = position.x;
     m_y = position.y;
 
-    int x, y;
-    x = y = 0;
     int mac_x = position.x;
     int mac_y = position.y;
 
@@ -407,7 +422,13 @@ void wxToolBarTool::SetPosition( const wxPoint& position )
     }
     else if ( IsControl() )
     {
-        GetControl()->Move( position );
+        // embedded native controls are moved by the OS
+#if wxMAC_USE_NATIVE_TOOLBAR
+        if ( ((wxToolBar*)GetToolBar())->MacWantsNativeToolbar() == false )
+#endif
+        {
+            GetControl()->Move( position );
+        }
     }
     else
     {
@@ -426,33 +447,6 @@ void wxToolBarTool::SetPosition( const wxPoint& position )
 
 void wxToolBarTool::UpdateToggleImage( bool toggle )
 {
-#if wxMAC_USE_NATIVE_TOOLBAR
-
-#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_4
-#define kHIToolbarItemSelected (1 << 7)
-#endif
-
-    // FIXME: this should be a OSX v10.4 runtime check
-    if (m_toolbarItemRef != NULL)
-    {
-        OptionBits addAttrs, removeAttrs;
-        OSStatus result;
-
-        if (toggle)
-        {
-            addAttrs = kHIToolbarItemSelected;
-            removeAttrs = kHIToolbarItemNoAttributes;
-        }
-        else
-        {
-            addAttrs = kHIToolbarItemNoAttributes;
-            removeAttrs = kHIToolbarItemSelected;
-        }
-
-        result = HIToolbarItemChangeAttributes( m_toolbarItemRef, addAttrs, removeAttrs );
-    }
-#endif
-
 #ifdef __WXMAC_OSX__
     if ( toggle )
     {
@@ -462,21 +456,33 @@ void wxToolBarTool::UpdateToggleImage( bool toggle )
         wxMemoryDC dc;
 
         dc.SelectObject( bmp );
-        dc.SetPen( wxNullPen );
-        dc.SetBackground( *wxWHITE );
+        dc.SetPen( wxPen(*wxBLACK) );
+        dc.SetBrush( wxBrush( *wxLIGHT_GREY ));
         dc.DrawRectangle( 0, 0, w, h );
         dc.DrawBitmap( m_bmpNormal, 0, 0, true );
         dc.SelectObject( wxNullBitmap );
         ControlButtonContentInfo info;
-        wxMacCreateBitmapButton( &info, bmp );
+        wxMacCreateBitmapButton( &info, bmp, kControlContentIconRef );
         SetControlData( m_controlHandle, 0, kControlIconContentTag, sizeof(info), (Ptr)&info );
+#if wxMAC_USE_NATIVE_TOOLBAR
+        if (m_toolbarItemRef != NULL)
+        {
+            HIToolbarItemSetIconRef( m_toolbarItemRef, info.u.iconRef );
+        }
+#endif
         wxMacReleaseBitmapButton( &info );
     }
     else
     {
         ControlButtonContentInfo info;
-        wxMacCreateBitmapButton( &info, m_bmpNormal );
+        wxMacCreateBitmapButton( &info, m_bmpNormal, kControlContentIconRef );
         SetControlData( m_controlHandle, 0, kControlIconContentTag, sizeof(info), (Ptr)&info );
+#if wxMAC_USE_NATIVE_TOOLBAR
+        if (m_toolbarItemRef != NULL)
+        {
+            HIToolbarItemSetIconRef( m_toolbarItemRef, info.u.iconRef );
+        }
+#endif
         wxMacReleaseBitmapButton( &info );
     }
 
@@ -527,9 +533,10 @@ wxToolBarToolBase *wxToolBar::CreateTool(
         clientData, shortHelp, longHelp );
 }
 
-wxToolBarToolBase * wxToolBar::CreateTool( wxControl *control )
+wxToolBarToolBase *
+wxToolBar::CreateTool(wxControl *control, const wxString& label)
 {
-    return new wxToolBarTool( this, control );
+    return new wxToolBarTool(this, control, label);
 }
 
 void wxToolBar::Init()
@@ -545,106 +552,117 @@ void wxToolBar::Init()
 #endif
 }
 
-#define kControlToolbarItemClassID             CFSTR( "org.wxwidgets.controltoolbaritem" )
+#define kControlToolbarItemClassID      CFSTR( "org.wxwidgets.controltoolbaritem" )
 
-const EventTypeSpec kEvents[] = 
+const EventTypeSpec kEvents[] =
 {
-       { kEventClassHIObject, kEventHIObjectConstruct },
-       { kEventClassHIObject, kEventHIObjectInitialize },
-       { kEventClassHIObject, kEventHIObjectDestruct },
-       
-       { kEventClassToolbarItem, kEventToolbarItemCreateCustomView }
+    { kEventClassHIObject, kEventHIObjectConstruct },
+    { kEventClassHIObject, kEventHIObjectInitialize },
+    { kEventClassHIObject, kEventHIObjectDestruct },
+
+    { kEventClassToolbarItem, kEventToolbarItemCreateCustomView }
 };
 
-const EventTypeSpec kViewEvents[] = 
-{ 
-    { kEventClassControl, kEventControlGetSizeConstraints } 
+const EventTypeSpec kViewEvents[] =
+{
+    { kEventClassControl, kEventControlGetSizeConstraints }
 };
 
-struct ControlToolbarItem 
-{ 
-    HIToolbarItemRef    toolbarItem; 
+struct ControlToolbarItem
+{
+    HIToolbarItemRef    toolbarItem;
     HIViewRef           viewRef;
     wxSize              lastValidSize ;
-}; 
+};
 
 static pascal OSStatus ControlToolbarItemHandler( EventHandlerCallRef inCallRef, EventRef inEvent, void* inUserData )
 {
-       OSStatus                        result = eventNotHandledErr;
-       ControlToolbarItem*     object = (ControlToolbarItem*)inUserData;
-
-       switch ( GetEventClass( inEvent ) )
-       {
-               case kEventClassHIObject:
-                       switch ( GetEventKind( inEvent ) )
-                       {
-                               case kEventHIObjectConstruct:
-                                       {
-                                               HIObjectRef                     toolbarItem;
-                                               ControlToolbarItem*     item;
-                                               
-                                               GetEventParameter( inEvent, kEventParamHIObjectInstance, typeHIObjectRef, NULL,
+    OSStatus            result = eventNotHandledErr;
+    ControlToolbarItem* object = (ControlToolbarItem*)inUserData;
+
+    switch ( GetEventClass( inEvent ) )
+    {
+        case kEventClassHIObject:
+            switch ( GetEventKind( inEvent ) )
+            {
+                case kEventHIObjectConstruct:
+                    {
+                        HIObjectRef         toolbarItem;
+                        ControlToolbarItem* item;
+
+                        GetEventParameter( inEvent, kEventParamHIObjectInstance, typeHIObjectRef, NULL,
                             sizeof( HIObjectRef ), NULL, &toolbarItem );
-                                               
+
                         item = (ControlToolbarItem*) malloc(sizeof(ControlToolbarItem)) ;
                         item->toolbarItem = toolbarItem ;
                         item->viewRef = NULL ;
-                        
-                                               SetEventParameter( inEvent, kEventParamHIObjectInstance, typeVoidPtr, sizeof( void * ), &item );
-                        
+
+                        SetEventParameter( inEvent, kEventParamHIObjectInstance, typeVoidPtr, sizeof( void * ), &item );
+
                         result = noErr ;
-                                       }
-                                       break;
+                    }
+                    break;
+
                 case kEventHIObjectInitialize:
                     result = CallNextEventHandler( inCallRef, inEvent );
-                                       if ( result == noErr )
+                    if ( result == noErr )
                     {
                         CFDataRef           data;
                         GetEventParameter( inEvent, kEventParamToolbarItemConfigData, typeCFTypeRef, NULL,
                             sizeof( CFTypeRef ), NULL, &data );
-                                       
+
                         HIViewRef viewRef ;
-                        
+
                         wxASSERT_MSG( CFDataGetLength( data ) == sizeof( viewRef ) , wxT("Illegal Data passed") ) ;
                         memcpy( &viewRef , CFDataGetBytePtr( data ) , sizeof( viewRef ) ) ;
-                    
+
                         object->viewRef = (HIViewRef) viewRef ;
 
-                                               result = noErr ;
-                                       }
+                        result = noErr ;
+                    }
+                    break;
+
+                case kEventHIObjectDestruct:
+                    {
+                        // we've increased the ref count when creating this, so we decrease manually again in case
+                        // it was never really installed and deinstalled
+                        HIViewRef viewRef = object->viewRef ;
+                        if( viewRef && IsValidControlHandle( viewRef)  )
+                        {
+                            CFIndex count =  CFGetRetainCount( viewRef ) ;
+                            if ( count >= 1 )
+                                CFRelease( viewRef ) ;
+                        }
+                           free( object ) ;
+                       result = noErr;
+                    }
                     break;
+            }
+            break;
 
-                               case kEventHIObjectDestruct:
-                    free( object ) ;
-                                       result = noErr;
-                                       break;
-                       }
-                       break;
-               
-               case kEventClassToolbarItem:
-                       switch ( GetEventKind( inEvent ) )
-                       {                               
-                               case kEventToolbarItemCreateCustomView:
-                               {
+        case kEventClassToolbarItem:
+            switch ( GetEventKind( inEvent ) )
+            {
+                case kEventToolbarItemCreateCustomView:
+                {
                     HIViewRef viewRef = object->viewRef ;
 
                     HIViewRemoveFromSuperview( viewRef ) ;
                     HIViewSetVisible(viewRef, true) ;
                     InstallEventHandler( GetControlEventTarget( viewRef ), ControlToolbarItemHandler,
                                             GetEventTypeCount( kViewEvents ), kViewEvents, object, NULL );
-                    
+
                     result = SetEventParameter( inEvent, kEventParamControlRef, typeControlRef, sizeof( HIViewRef ), &viewRef );
-                               }
-                               break;
-                       }
-                       break;
-               
-               case kEventClassControl:
-                       switch ( GetEventKind( inEvent ) )
-                       {
-                               case kEventControlGetSizeConstraints:
-                               {
+                }
+                break;
+            }
+            break;
+
+        case kEventClassControl:
+            switch ( GetEventKind( inEvent ) )
+            {
+                case kEventControlGetSizeConstraints:
+                {
                     wxWindow* wxwindow = wxFindControlFromMacControl(object->viewRef ) ;
                     if ( wxwindow )
                     {
@@ -658,112 +676,114 @@ static pascal OSStatus ControlToolbarItemHandler( EventHandlerCallRef inCallRef,
                             object->lastValidSize = sz ;
                         else
                             sz = object->lastValidSize ;
-                            
+
                         HISize min, max;
                         min.width = max.width = sz.x ;
                         min.height = max.height = sz.y ;
-                        
+
                         result = SetEventParameter( inEvent, kEventParamMinimumSize, typeHISize,
                                                         sizeof( HISize ), &min );
-                        
+
                         result = SetEventParameter( inEvent, kEventParamMaximumSize, typeHISize,
                                                         sizeof( HISize ), &max );
                         result = noErr ;
                     }
-                               }
-                               break;
-                       }
-                       break;
-       }
-       
-       return result;
+                }
+                break;
+            }
+            break;
+    }
+
+    return result;
 }
 
 void RegisterControlToolbarItemClass()
 {
-       static bool sRegistered;
-       
-       if ( !sRegistered )
-       {
-               HIObjectRegisterSubclass( kControlToolbarItemClassID, kHIToolbarItemClassID, 0,
-                               ControlToolbarItemHandler, GetEventTypeCount( kEvents ), kEvents, 0, NULL );
-               
-               sRegistered = true;
-       }
+    static bool sRegistered;
+
+    if ( !sRegistered )
+    {
+        HIObjectRegisterSubclass( kControlToolbarItemClassID, kHIToolbarItemClassID, 0,
+                ControlToolbarItemHandler, GetEventTypeCount( kEvents ), kEvents, 0, NULL );
+
+        sRegistered = true;
+    }
 }
 
 HIToolbarItemRef CreateControlToolbarItem(CFStringRef inIdentifier, CFTypeRef inConfigData)
 {
-       RegisterControlToolbarItemClass();
-    
-       OSStatus                        err;
-       EventRef                        event;
-       UInt32                          options = kHIToolbarItemAllowDuplicates;
-       HIToolbarItemRef        result = NULL;
-       
-       err = CreateEvent( NULL, kEventClassHIObject, kEventHIObjectInitialize, GetCurrentEventTime(), 0, &event );
-       require_noerr( err, CantCreateEvent );
-       
-       SetEventParameter( event, kEventParamAttributes, typeUInt32, sizeof( UInt32 ), &options );
-       SetEventParameter( event, kEventParamToolbarItemIdentifier, typeCFStringRef, sizeof( CFStringRef ), &inIdentifier );
-       
-       if ( inConfigData )
-               SetEventParameter( event, kEventParamToolbarItemConfigData, typeCFTypeRef, sizeof( CFTypeRef ), &inConfigData );
-       
-       err = HIObjectCreate( kControlToolbarItemClassID, event, (HIObjectRef*)&result );
-       check_noerr( err );
-       
-       ReleaseEvent( event );
-CantCreateEvent :      
-       return result ;
+    RegisterControlToolbarItemClass();
+
+    OSStatus            err;
+    EventRef            event;
+    UInt32              options = kHIToolbarItemAllowDuplicates;
+    HIToolbarItemRef    result = NULL;
+
+    err = CreateEvent( NULL, kEventClassHIObject, kEventHIObjectInitialize, GetCurrentEventTime(), 0, &event );
+    require_noerr( err, CantCreateEvent );
+
+    SetEventParameter( event, kEventParamAttributes, typeUInt32, sizeof( UInt32 ), &options );
+    SetEventParameter( event, kEventParamToolbarItemIdentifier, typeCFStringRef, sizeof( CFStringRef ), &inIdentifier );
+
+    if ( inConfigData )
+        SetEventParameter( event, kEventParamToolbarItemConfigData, typeCFTypeRef, sizeof( CFTypeRef ), &inConfigData );
+
+    err = HIObjectCreate( kControlToolbarItemClassID, event, (HIObjectRef*)&result );
+    check_noerr( err );
+
+    ReleaseEvent( event );
+CantCreateEvent :
+    return result ;
 }
 
+#if wxMAC_USE_NATIVE_TOOLBAR
 static const EventTypeSpec kToolbarEvents[] =
 {
-       { kEventClassToolbar, kEventToolbarGetDefaultIdentifiers },
-       { kEventClassToolbar, kEventToolbarGetAllowedIdentifiers },
-       { kEventClassToolbar, kEventToolbarCreateItemWithIdentifier },
+    { kEventClassToolbar, kEventToolbarGetDefaultIdentifiers },
+    { kEventClassToolbar, kEventToolbarGetAllowedIdentifiers },
+    { kEventClassToolbar, kEventToolbarCreateItemWithIdentifier },
 };
 
 static OSStatus ToolbarDelegateHandler( EventHandlerCallRef inCallRef, EventRef inEvent, void* inUserData )
 {
-       OSStatus result = eventNotHandledErr;
-    wxToolBar* toolbar = (wxToolBar*) inUserData ;
-       CFMutableArrayRef       array;
+    OSStatus result = eventNotHandledErr;
+    // Not yet needed
+    // wxToolBar* toolbar = (wxToolBar*) inUserData ;
+    CFMutableArrayRef   array;
 
-       switch ( GetEventKind( inEvent ) )
-       {
-               case kEventToolbarGetDefaultIdentifiers:
+    switch ( GetEventKind( inEvent ) )
+    {
+        case kEventToolbarGetDefaultIdentifiers:
             {
                 GetEventParameter( inEvent, kEventParamMutableArray, typeCFMutableArrayRef, NULL,
-                                       sizeof( CFMutableArrayRef ), NULL, &array );
+                    sizeof( CFMutableArrayRef ), NULL, &array );
                 // not implemented yet
                 // GetToolbarDefaultItems( array );
                 result = noErr;
             }
-                       break;
-                       
-               case kEventToolbarGetAllowedIdentifiers:
+            break;
+
+        case kEventToolbarGetAllowedIdentifiers:
             {
                 GetEventParameter( inEvent, kEventParamMutableArray, typeCFMutableArrayRef, NULL,
-                                       sizeof( CFMutableArrayRef ), NULL, &array );
+                    sizeof( CFMutableArrayRef ), NULL, &array );
                 // not implemented yet
                 // GetToolbarAllowedItems( array );
                 result = noErr;
             }
-                       break;
-               case kEventToolbarCreateItemWithIdentifier:
-                       {
-                               HIToolbarItemRef                item = NULL;
-                               CFTypeRef                               data = NULL;
+            break;
+        case kEventToolbarCreateItemWithIdentifier:
+            {
+                HIToolbarItemRef        item = NULL;
+                CFTypeRef               data = NULL;
                 CFStringRef             identifier = NULL ;
-                               
-                               GetEventParameter( inEvent, kEventParamToolbarItemIdentifier, typeCFStringRef, NULL,
-                                               sizeof( CFStringRef ), NULL, &identifier );
-                               
-                               GetEventParameter( inEvent, kEventParamToolbarItemConfigData, typeCFTypeRef, NULL,
-                                               sizeof( CFTypeRef ), NULL, &data );
-                                       
+
+                GetEventParameter( inEvent, kEventParamToolbarItemIdentifier, typeCFStringRef, NULL,
+                        sizeof( CFStringRef ), NULL, &identifier );
+
+                GetEventParameter( inEvent, kEventParamToolbarItemConfigData, typeCFTypeRef, NULL,
+                        sizeof( CFTypeRef ), NULL, &data );
+
                 if ( CFStringCompare( kControlToolbarItemClassID, identifier, kCFCompareBackwards ) == kCFCompareEqualTo )
                 {
                     item = CreateControlToolbarItem( kControlToolbarItemClassID, data );
@@ -773,13 +793,14 @@ static OSStatus ToolbarDelegateHandler( EventHandlerCallRef inCallRef, EventRef
                             sizeof( HIToolbarItemRef ), &item );
                         result = noErr;
                     }
-                               }
-                
-                       }
-                       break;
+                }
+
+            }
+            break;
     }
     return result ;
 }
+#endif // wxMAC_USE_NATIVE_TOOLBAR
 
 // also for the toolbar we have the dual implementation:
 // only when MacInstallNativeToolbar is called is the native toolbar set as the window toolbar
@@ -795,6 +816,8 @@ bool wxToolBar::Create(
     if ( !wxToolBarBase::Create( parent, id, pos, size, style, wxDefaultValidator, name ) )
         return false;
 
+    FixupStyle();
+
     OSStatus err = noErr;
 
 #if wxMAC_USE_NATIVE_TOOLBAR
@@ -805,8 +828,8 @@ bool wxToolBar::Create(
 
     if (m_macHIToolbarRef != NULL)
     {
-               InstallEventHandler( HIObjectGetEventTarget((HIToolbarRef)m_macHIToolbarRef ), ToolbarDelegateHandler,
-                               GetEventTypeCount( kToolbarEvents ), kToolbarEvents, this, NULL );
+        InstallEventHandler( HIObjectGetEventTarget((HIToolbarRef)m_macHIToolbarRef ), ToolbarDelegateHandler,
+                GetEventTypeCount( kToolbarEvents ), kToolbarEvents, this, NULL );
 
         HIToolbarDisplayMode mode = kHIToolbarDisplayModeDefault;
         HIToolbarDisplaySize displaySize = kHIToolbarDisplaySizeSmall;
@@ -821,7 +844,7 @@ bool wxToolBar::Create(
         HIToolbarSetDisplayMode( (HIToolbarRef) m_macHIToolbarRef, mode );
         HIToolbarSetDisplaySize( (HIToolbarRef) m_macHIToolbarRef, displaySize );
     }
-#endif
+#endif // wxMAC_USE_NATIVE_TOOLBAR
 
     return (err == noErr);
 }
@@ -835,6 +858,9 @@ wxToolBar::~wxToolBar()
         if (m_macUsesNativeToolbar)
             MacInstallNativeToolbar( false );
 
+        CFIndex count = CFGetRetainCount( m_macHIToolbarRef ) ;
+        wxASSERT_MSG( count == 1 , wxT("Reference Count of native control was not 1 in wxToolBar destructor") );
+
         CFRelease( (HIToolbarRef)m_macHIToolbarRef );
         m_macHIToolbarRef = NULL;
     }
@@ -1073,7 +1099,6 @@ bool wxToolBar::Realize()
 
     bool lastIsRadio = false;
     bool curIsRadio = false;
-    bool setChoiceInGroup = false;
 
 #if wxMAC_USE_NATIVE_TOOLBAR
     CFIndex currentPosition = 0;
@@ -1168,8 +1193,6 @@ bool wxToolBar::Realize()
         {
             if ( tool->IsToggled() )
                 DoToggleTool( tool, true );
-
-            setChoiceInGroup = false;
         }
         else
         {
@@ -1178,7 +1201,6 @@ bool wxToolBar::Realize()
                 if ( tool->Toggle( true ) )
                 {
                     DoToggleTool( tool, true );
-                    setChoiceInGroup = true;
                 }
             }
             else if ( tool->IsToggled() )
@@ -1247,7 +1269,7 @@ bool wxToolBar::Realize()
     InvalidateBestSize();
 #endif
 
-    SetBestFittingSize();
+    SetInitialSize();
 
     return true;
 }
@@ -1300,6 +1322,33 @@ void wxToolBar::MacSuperChangedPosition()
 #endif
 }
 
+void wxToolBar::SetToolNormalBitmap( int id, const wxBitmap& bitmap )
+{
+    wxToolBarTool* tool = wx_static_cast(wxToolBarTool*, FindById(id));
+    if ( tool )
+    {
+        wxCHECK_RET( tool->IsButton(), wxT("Can only set bitmap on button tools."));
+
+        tool->SetNormalBitmap(bitmap);
+
+        // a side-effect of the UpdateToggleImage function is that it always changes the bitmap used on the button.
+        tool->UpdateToggleImage( tool->CanBeToggled() && tool->IsToggled() );
+    }
+}
+
+void wxToolBar::SetToolDisabledBitmap( int id, const wxBitmap& bitmap )
+{
+    wxToolBarTool* tool = wx_static_cast(wxToolBarTool*, FindById(id));
+    if ( tool )
+    {
+        wxCHECK_RET( tool->IsButton(), wxT("Can only set bitmap on button tools."));
+
+        tool->SetDisabledBitmap(bitmap);
+
+        // TODO:  what to do for this one?
+    }
+}
+
 wxToolBarToolBase *wxToolBar::FindToolForPosition(wxCoord x, wxCoord y) const
 {
     wxToolBarTool *tool;
@@ -1353,6 +1402,11 @@ bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolBase)
     Rect toolrect = { 0, 0, toolSize.y, toolSize.x };
     ControlRef controlHandle = NULL;
     OSStatus err = 0;
+    tool->Attach( this );
+
+#if wxMAC_USE_NATIVE_TOOLBAR
+    HIToolbarItemRef item;
+#endif
 
     switch (tool->GetStyle())
     {
@@ -1366,21 +1420,18 @@ bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolBase)
                 else
                     toolrect.right = toolSize.x;
 
-#ifdef __WXMAC_OSX__
                 // in flat style we need a visual separator
 #if wxMAC_USE_NATIVE_TOOLBAR
-                HIToolbarItemRef item;
                 err = HIToolbarItemCreate(
                     kHIToolbarSeparatorIdentifier,
                     kHIToolbarItemCantBeRemoved | kHIToolbarItemIsSeparator | kHIToolbarItemAllowDuplicates,
                     &item );
                 if (err == noErr)
                     tool->SetToolbarItemRef( item );
-#endif
+#endif // wxMAC_USE_NATIVE_TOOLBAR
 
                 CreateSeparatorControl( window, &toolrect, &controlHandle );
                 tool->SetControlHandle( controlHandle );
-#endif
             }
             break;
 
@@ -1405,7 +1456,6 @@ bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolBase)
                 }
 
 #if wxMAC_USE_NATIVE_TOOLBAR
-                HIToolbarItemRef item;
                 wxString labelStr = wxString::Format(wxT("%xd"), (int)tool);
                 err = HIToolbarItemCreate(
                     wxMacCFStringHolder(labelStr, wxFont::GetDefaultEncoding()),
@@ -1415,12 +1465,12 @@ bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolBase)
                     InstallEventHandler(
                         HIObjectGetEventTarget(item), GetwxMacToolBarEventHandlerUPP(),
                         GetEventTypeCount(toolBarEventList), toolBarEventList, tool, NULL );
-                    HIToolbarItemSetLabel( item, wxMacCFStringHolder(tool->GetLabel(), m_font.GetEncoding()) );
+
                     HIToolbarItemSetIconRef( item, info.u.iconRef );
                     HIToolbarItemSetCommandID( item, kHIToolbarCommandPressAction );
                     tool->SetToolbarItemRef( item );
                 }
-#endif
+#endif // wxMAC_USE_NATIVE_TOOLBAR
 
                 wxMacReleaseBitmapButton( &info );
 
@@ -1441,12 +1491,15 @@ bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolBase)
 
 #if wxMAC_USE_NATIVE_TOOLBAR
             {
-                   wxASSERT( tool->GetControl() != NULL );
+                wxASSERT( tool->GetControl() != NULL );
                 HIToolbarItemRef    item;
                 HIViewRef viewRef = (HIViewRef) tool->GetControl()->GetHandle() ;
+                // as this control now is part of both the wxToolBar children and the native toolbar, we have to increase the
+                // reference count to make sure we are not dealing with zombie controls after the native toolbar has released its views
+                CFRetain( viewRef ) ;
                 CFDataRef data = CFDataCreate( kCFAllocatorDefault , (UInt8*) &viewRef , sizeof(viewRef) ) ;
-                 err = HIToolbarCreateItemWithIdentifier((HIToolbarRef) m_macHIToolbarRef,kControlToolbarItemClassID,
-                   data , &item ) ;
+                err = HIToolbarCreateItemWithIdentifier((HIToolbarRef) m_macHIToolbarRef,kControlToolbarItemClassID,
+                    data , &item ) ;
 
                 if (err  == noErr)
                 {
@@ -1464,6 +1517,19 @@ bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolBase)
             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 )
@@ -1479,7 +1545,6 @@ bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolBase)
             tool->UpdateToggleImage( true );
 
         // nothing special to do here - we relayout in Realize() later
-        tool->Attach( this );
         InvalidateBestSize();
     }
     else
@@ -1520,34 +1585,29 @@ bool wxToolBar::DoDeleteTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolbase)
     CFIndex removeIndex = tool->GetIndex();
 #endif
 
+#if wxMAC_USE_NATIVE_TOOLBAR
+    if ( removeIndex != -1 && m_macHIToolbarRef )
+    {
+        HIToolbarRemoveItemAtIndex( (HIToolbarRef) m_macHIToolbarRef, removeIndex );
+        tool->SetIndex( -1 );
+    }
+#endif
     switch ( tool->GetStyle() )
     {
         case wxTOOL_STYLE_CONTROL:
-            {
+            if ( tool->GetControl() )
                 tool->GetControl()->Destroy();
-                tool->ClearControl();
-            }
             break;
 
         case wxTOOL_STYLE_BUTTON:
         case wxTOOL_STYLE_SEPARATOR:
-            if ( tool->GetControlHandle() )
-            {
-#if wxMAC_USE_NATIVE_TOOLBAR
-                if ( removeIndex != -1 && m_macHIToolbarRef )
-                {
-                    HIToolbarRemoveItemAtIndex( (HIToolbarRef) m_macHIToolbarRef, removeIndex );
-                    tool->SetIndex( -1 );
-                }
-#endif
-
-                tool->ClearControl();
-            }
+            // nothing special
             break;
 
         default:
             break;
     }
+    tool->ClearControl();
 
     // and finally reposition all the controls after this one
 
@@ -1652,7 +1712,9 @@ void wxToolBar::OnPaint(wxPaintEvent& event)
             drawInfo.kind = kThemeBackgroundMetal;
             HIThemeApplyBackground( &hiToolbarrect, &drawInfo, cgContext, kHIThemeOrientationNormal );
 
+#ifndef __LP64__
             QDEndCGContext( (CGrafPtr) dc.m_macPort, &cgContext );
+#endif
 #endif
         }
     }