1 ///////////////////////////////////////////////////////////////////////////// 
   2 // Name:        src/mac/carbon/toolbar.cpp 
   4 // Author:      Stefan Csomor 
   8 // Copyright:   (c) Stefan Csomor 
   9 // Licence:     wxWindows licence 
  10 ///////////////////////////////////////////////////////////////////////////// 
  12 #include "wx/wxprec.h" 
  16 #include "wx/toolbar.h" 
  23 #include "wx/mac/uma.h" 
  24 #include "wx/geometry.h" 
  25 #include "wx/sysopt.h" 
  29 const short kwxMacToolBarToolDefaultWidth 
= 16; 
  30 const short kwxMacToolBarToolDefaultHeight 
= 16; 
  31 const short kwxMacToolBarTopMargin 
= 4; 
  32 const short kwxMacToolBarLeftMargin 
=  4; 
  33 const short kwxMacToolBorder 
= 0; 
  34 const short kwxMacToolSpacing 
= 6; 
  36 const short kwxMacToolBarToolDefaultWidth 
= 24; 
  37 const short kwxMacToolBarToolDefaultHeight 
= 22; 
  38 const short kwxMacToolBarTopMargin 
= 2; 
  39 const short kwxMacToolBarLeftMargin 
= 2; 
  40 const short kwxMacToolBorder 
= 4; 
  41 const short kwxMacToolSpacing 
= 0; 
  45 IMPLEMENT_DYNAMIC_CLASS(wxToolBar
, wxControl
) 
  47 BEGIN_EVENT_TABLE(wxToolBar
, wxToolBarBase
) 
  48     EVT_PAINT( wxToolBar::OnPaint 
) 
  53 #pragma mark Tool Implementation 
  56 // ---------------------------------------------------------------------------- 
  58 // ---------------------------------------------------------------------------- 
  60 // We have a dual implementation for each tool, ControlRef and HIToolbarItemRef 
  62 // when embedding native controls in the native toolbar we must make sure the 
  63 // control does not get deleted behind our backs, so the retain count gets increased 
  64 // (after creation it is 1), first be the creation of the custom HIToolbarItem wrapper  
  65 // object, and second by the code 'creating' the custom HIView (which is the same as the 
  66 // already existing native control, therefore we just increase the ref count) 
  67 // when this view is removed from the native toolbar its count gets decremented again 
  68 // and when the HITooolbarItem wrapper object gets destroyed it is decremented as well 
  69 // so in the end the control lives with a refcount of one and can be disposed of by the 
  70 // wxControl code. For embedded controls on a non-native toolbar this ref count is less 
  71 // so we can only test against a range, not a specific value of the refcount. 
  73 class wxToolBarTool 
: public wxToolBarToolBase
 
  79         const wxString
& label
, 
  80         const wxBitmap
& bmpNormal
, 
  81         const wxBitmap
& bmpDisabled
, 
  84         const wxString
& shortHelp
, 
  85         const wxString
& longHelp 
); 
  87     wxToolBarTool(wxToolBar 
*tbar
, wxControl 
*control
, const wxString
& label
) 
  88         : wxToolBarToolBase(tbar
, control
, label
) 
  92             SetControlHandle( (ControlRef
) control
->GetHandle() ); 
  95     virtual ~wxToolBarTool() 
 100     WXWidget 
GetControlHandle() 
 102         return (WXWidget
) m_controlHandle
; 
 105     void SetControlHandle( ControlRef handle 
) 
 107         m_controlHandle 
= handle
; 
 110     void SetPosition( const wxPoint
& position 
); 
 114         if ( m_controlHandle 
) 
 117                 DisposeControl( m_controlHandle 
); 
 120                 // the embedded control is not under the responsibility of the tool, it will be disposed of in the 
 121                 // proper wxControl destructor 
 122                 wxASSERT( IsValidControlHandle(GetControl()->GetPeer()->GetControlRef() )) ; 
 124             m_controlHandle 
= NULL 
; 
 128 #if wxMAC_USE_NATIVE_TOOLBAR 
 129         if ( m_toolbarItemRef 
) 
 131             CFIndex count 
= CFGetRetainCount( m_toolbarItemRef 
) ; 
 132             wxASSERT_MSG( count 
== 1 , wxT("Reference Count of native tool was not 1 in wxToolBarTool destructor") ); 
 133             wxTheApp
->MacAddToAutorelease(m_toolbarItemRef
); 
 134             CFRelease(m_toolbarItemRef
); 
 135             m_toolbarItemRef 
= NULL
; 
 140     wxSize 
GetSize() const 
 146             curSize 
= GetControl()->GetSize(); 
 148         else if ( IsButton() ) 
 150             curSize 
= GetToolBar()->GetToolSize(); 
 155             curSize 
= GetToolBar()->GetToolSize(); 
 156             if ( GetToolBar()->GetWindowStyleFlag() & wxTB_VERTICAL 
) 
 165     wxPoint 
GetPosition() const 
 167         return wxPoint( m_x
, m_y 
); 
 170     bool DoEnable( bool enable 
); 
 172     void UpdateToggleImage( bool toggle 
); 
 174 #if wxMAC_USE_NATIVE_TOOLBAR 
 175     void SetToolbarItemRef( HIToolbarItemRef ref 
) 
 177         if ( m_controlHandle 
) 
 178             HideControl( m_controlHandle 
); 
 179         if ( m_toolbarItemRef 
) 
 180             CFRelease( m_toolbarItemRef 
); 
 182         m_toolbarItemRef 
= ref
; 
 183         if ( m_toolbarItemRef 
) 
 188                 f 
= GetToolBar()->GetFont(); 
 190                 enc 
= f
.GetEncoding(); 
 192                 enc 
= wxFont::GetDefaultEncoding(); 
 194             HIToolbarItemSetHelpText( 
 196                 wxMacCFStringHolder( GetShortHelp(), enc 
), 
 197                 wxMacCFStringHolder( GetLongHelp(), enc 
) ); 
 201     HIToolbarItemRef 
GetToolbarItemRef() const 
 203         return m_toolbarItemRef
; 
 206     void SetIndex( CFIndex idx 
) 
 211     CFIndex 
GetIndex() const 
 220         m_controlHandle 
= NULL
; 
 222 #if wxMAC_USE_NATIVE_TOOLBAR 
 223         m_toolbarItemRef 
= NULL
; 
 228     ControlRef m_controlHandle
; 
 232 #if wxMAC_USE_NATIVE_TOOLBAR 
 233     HIToolbarItemRef m_toolbarItemRef
; 
 234     // position in its toolbar, -1 means not inserted 
 239 static const EventTypeSpec eventList
[] = 
 241     { kEventClassControl
, kEventControlHit 
}, 
 243     { kEventClassControl
, kEventControlHitTest 
}, 
 247 static pascal OSStatus 
wxMacToolBarToolControlEventHandler( EventHandlerCallRef handler
, EventRef event
, void *data 
) 
 249     OSStatus result 
= eventNotHandledErr
; 
 250     ControlRef controlRef
; 
 251     wxMacCarbonEvent 
cEvent( event 
); 
 253     cEvent
.GetParameter( kEventParamDirectObject
, &controlRef 
); 
 255     switch ( GetEventKind( event 
) ) 
 257         case kEventControlHit
: 
 259                 wxToolBarTool 
*tbartool 
= (wxToolBarTool
*)data
; 
 260                 wxToolBar 
*tbar 
= tbartool 
!= NULL 
? (wxToolBar
*) (tbartool
->GetToolBar()) : NULL
; 
 261                 if ((tbartool 
!= NULL
) && tbartool
->CanBeToggled()) 
 266                     shouldToggle 
= !tbartool
->IsToggled(); 
 268                     shouldToggle 
= (GetControl32BitValue( (ControlRef
)(tbartool
->GetControlHandle()) ) != 0); 
 271                     tbar
->ToggleTool( tbartool
->GetId(), shouldToggle 
); 
 274                 if (tbartool 
!= NULL
) 
 275                     tbar
->OnLeftClick( tbartool
->GetId(), tbartool
->IsToggled() ); 
 281         case kEventControlHitTest
: 
 283                 HIPoint pt 
= cEvent
.GetParameter
<HIPoint
>(kEventParamMouseLocation
); 
 285                 HIViewGetBounds( controlRef
, &rect 
); 
 287                 ControlPartCode pc 
= kControlNoPart
; 
 288                 if ( CGRectContainsPoint( rect
, pt 
) ) 
 289                     pc 
= kControlIconPart
; 
 290                 cEvent
.SetParameter( kEventParamControlPart
, typeControlPartCode
, pc 
); 
 303 static pascal OSStatus 
wxMacToolBarToolEventHandler( EventHandlerCallRef handler
, EventRef event
, void *data 
) 
 305     OSStatus result 
= eventNotHandledErr
; 
 307     switch ( GetEventClass( event 
) ) 
 309         case kEventClassControl
: 
 310             result 
= wxMacToolBarToolControlEventHandler( handler
, event
, data 
); 
 320 DEFINE_ONE_SHOT_HANDLER_GETTER( wxMacToolBarToolEventHandler 
) 
 322 #if wxMAC_USE_NATIVE_TOOLBAR 
 324 static const EventTypeSpec toolBarEventList
[] = 
 326     { kEventClassToolbarItem
, kEventToolbarItemPerformAction 
}, 
 329 static pascal OSStatus 
wxMacToolBarCommandEventHandler( EventHandlerCallRef handler
, EventRef event
, void *data 
) 
 331     OSStatus result 
= eventNotHandledErr
; 
 333     switch ( GetEventKind( event 
) ) 
 335         case kEventToolbarItemPerformAction
: 
 337                 wxToolBarTool
* tbartool 
= (wxToolBarTool
*) data
; 
 338                 if ( tbartool 
!= NULL 
) 
 340                     wxToolBar 
*tbar 
= (wxToolBar
*)(tbartool
->GetToolBar()); 
 341                     int toolID 
= tbartool
->GetId(); 
 343                     if ( tbartool
->CanBeToggled() ) 
 346                             tbar
->ToggleTool(toolID
, !tbartool
->IsToggled() ); 
 350                         tbar
->OnLeftClick( toolID
, tbartool
->IsToggled() ); 
 363 static pascal OSStatus 
wxMacToolBarEventHandler( EventHandlerCallRef handler
, EventRef event
, void *data 
) 
 365     OSStatus result 
= eventNotHandledErr
; 
 367     switch ( GetEventClass( event 
) ) 
 369         case kEventClassToolbarItem
: 
 370             result 
= wxMacToolBarCommandEventHandler( handler
, event
, data 
); 
 380 DEFINE_ONE_SHOT_HANDLER_GETTER( wxMacToolBarEventHandler 
) 
 384 bool wxToolBarTool::DoEnable( bool enable 
) 
 388         GetControl()->Enable( enable 
); 
 390     else if ( IsButton() ) 
 392 #if wxMAC_USE_NATIVE_TOOLBAR 
 393         if ( m_toolbarItemRef 
!= NULL 
) 
 394             HIToolbarItemSetEnabled( m_toolbarItemRef
, enable 
); 
 397         if ( m_controlHandle 
!= NULL 
) 
 399 #if TARGET_API_MAC_OSX 
 401                 EnableControl( m_controlHandle 
); 
 403                 DisableControl( m_controlHandle 
); 
 406                 ActivateControl( m_controlHandle 
); 
 408                 DeactivateControl( m_controlHandle 
); 
 416 void wxToolBarTool::SetPosition( const wxPoint
& position 
) 
 421     int mac_x 
= position
.x
; 
 422     int mac_y 
= position
.y
; 
 427         GetControlBounds( m_controlHandle
, &contrlRect 
); 
 428         int former_mac_x 
= contrlRect
.left
; 
 429         int former_mac_y 
= contrlRect
.top
; 
 430         GetToolBar()->GetToolSize(); 
 432         if ( mac_x 
!= former_mac_x 
|| mac_y 
!= former_mac_y 
) 
 434             UMAMoveControl( m_controlHandle
, mac_x
, mac_y 
); 
 437     else if ( IsControl() ) 
 439         // embedded native controls are moved by the OS 
 440 #if wxMAC_USE_NATIVE_TOOLBAR 
 441         if ( ((wxToolBar
*)GetToolBar())->MacWantsNativeToolbar() == false ) 
 444             GetControl()->Move( position 
); 
 452         GetControlBounds( m_controlHandle
, &contrlRect 
); 
 453         int former_mac_x 
= contrlRect
.left
; 
 454         int former_mac_y 
= contrlRect
.top
; 
 456         if ( mac_x 
!= former_mac_x 
|| mac_y 
!= former_mac_y 
) 
 457             UMAMoveControl( m_controlHandle
, mac_x
, mac_y 
); 
 462 void wxToolBarTool::UpdateToggleImage( bool toggle 
) 
 467         int w 
= m_bmpNormal
.GetWidth(); 
 468         int h 
= m_bmpNormal
.GetHeight(); 
 469         wxBitmap 
bmp( w
, h 
); 
 472         dc
.SelectObject( bmp 
); 
 473         dc
.SetPen( wxPen(*wxBLACK
) ); 
 474         dc
.SetBrush( wxBrush( *wxLIGHT_GREY 
)); 
 475         dc
.DrawRectangle( 0, 0, w
, h 
); 
 476         dc
.DrawBitmap( m_bmpNormal
, 0, 0, true ); 
 477         dc
.SelectObject( wxNullBitmap 
); 
 478         ControlButtonContentInfo info
; 
 479         wxMacCreateBitmapButton( &info
, bmp
, kControlContentIconRef 
); 
 480         SetControlData( m_controlHandle
, 0, kControlIconContentTag
, sizeof(info
), (Ptr
)&info 
); 
 481 #if wxMAC_USE_NATIVE_TOOLBAR 
 482         if (m_toolbarItemRef 
!= NULL
) 
 484             HIToolbarItemSetIconRef( m_toolbarItemRef
, info
.u
.iconRef 
); 
 487         wxMacReleaseBitmapButton( &info 
); 
 491         ControlButtonContentInfo info
; 
 492         wxMacCreateBitmapButton( &info
, m_bmpNormal
, kControlContentIconRef 
); 
 493         SetControlData( m_controlHandle
, 0, kControlIconContentTag
, sizeof(info
), (Ptr
)&info 
); 
 494 #if wxMAC_USE_NATIVE_TOOLBAR 
 495         if (m_toolbarItemRef 
!= NULL
) 
 497             HIToolbarItemSetIconRef( m_toolbarItemRef
, info
.u
.iconRef 
); 
 500         wxMacReleaseBitmapButton( &info 
); 
 503     IconTransformType transform 
= toggle 
? kTransformSelected 
: kTransformNone
; 
 505         m_controlHandle
, 0, kControlIconTransformTag
, 
 506         sizeof(transform
), (Ptr
)&transform 
); 
 507     HIViewSetNeedsDisplay( m_controlHandle
, true ); 
 510     ::SetControl32BitValue( m_controlHandle
, toggle 
); 
 514 wxToolBarTool::wxToolBarTool( 
 517     const wxString
& label
, 
 518     const wxBitmap
& bmpNormal
, 
 519     const wxBitmap
& bmpDisabled
, 
 521     wxObject 
*clientData
, 
 522     const wxString
& shortHelp
, 
 523     const wxString
& longHelp 
) 
 526         tbar
, id
, label
, bmpNormal
, bmpDisabled
, kind
, 
 527         clientData
, shortHelp
, longHelp 
) 
 533 #pragma mark Toolbar Implementation 
 535 wxToolBarToolBase 
*wxToolBar::CreateTool( 
 537     const wxString
& label
, 
 538     const wxBitmap
& bmpNormal
, 
 539     const wxBitmap
& bmpDisabled
, 
 541     wxObject 
*clientData
, 
 542     const wxString
& shortHelp
, 
 543     const wxString
& longHelp 
) 
 545     return new wxToolBarTool( 
 546         this, id
, label
, bmpNormal
, bmpDisabled
, kind
, 
 547         clientData
, shortHelp
, longHelp 
); 
 551 wxToolBar::CreateTool(wxControl 
*control
, const wxString
& label
) 
 553     return new wxToolBarTool(this, control
, label
); 
 556 void wxToolBar::Init() 
 560     m_defaultWidth 
= kwxMacToolBarToolDefaultWidth
; 
 561     m_defaultHeight 
= kwxMacToolBarToolDefaultHeight
; 
 563 #if wxMAC_USE_NATIVE_TOOLBAR 
 564     m_macHIToolbarRef 
= NULL
; 
 565     m_macUsesNativeToolbar 
= false; 
 569 #define kControlToolbarItemClassID      CFSTR( "org.wxwidgets.controltoolbaritem" ) 
 571 const EventTypeSpec kEvents
[] = 
 573     { kEventClassHIObject
, kEventHIObjectConstruct 
}, 
 574     { kEventClassHIObject
, kEventHIObjectInitialize 
}, 
 575     { kEventClassHIObject
, kEventHIObjectDestruct 
}, 
 577     { kEventClassToolbarItem
, kEventToolbarItemCreateCustomView 
} 
 580 const EventTypeSpec kViewEvents
[] = 
 582     { kEventClassControl
, kEventControlGetSizeConstraints 
} 
 585 struct ControlToolbarItem
 
 587     HIToolbarItemRef    toolbarItem
; 
 589     wxSize              lastValidSize 
; 
 592 static pascal OSStatus 
ControlToolbarItemHandler( EventHandlerCallRef inCallRef
, EventRef inEvent
, void* inUserData 
) 
 594     OSStatus            result 
= eventNotHandledErr
; 
 595     ControlToolbarItem
* object 
= (ControlToolbarItem
*)inUserData
; 
 597     switch ( GetEventClass( inEvent 
) ) 
 599         case kEventClassHIObject
: 
 600             switch ( GetEventKind( inEvent 
) ) 
 602                 case kEventHIObjectConstruct
: 
 604                         HIObjectRef         toolbarItem
; 
 605                         ControlToolbarItem
* item
; 
 607                         GetEventParameter( inEvent
, kEventParamHIObjectInstance
, typeHIObjectRef
, NULL
, 
 608                             sizeof( HIObjectRef 
), NULL
, &toolbarItem 
); 
 610                         item 
= (ControlToolbarItem
*) malloc(sizeof(ControlToolbarItem
)) ; 
 611                         item
->toolbarItem 
= toolbarItem 
; 
 612                         item
->lastValidSize 
= wxSize(-1,-1); 
 613                         item
->viewRef 
= NULL 
; 
 615                         SetEventParameter( inEvent
, kEventParamHIObjectInstance
, typeVoidPtr
, sizeof( void * ), &item 
); 
 621                 case kEventHIObjectInitialize
: 
 622                     result 
= CallNextEventHandler( inCallRef
, inEvent 
); 
 623                     if ( result 
== noErr 
) 
 626                         GetEventParameter( inEvent
, kEventParamToolbarItemConfigData
, typeCFTypeRef
, NULL
, 
 627                             sizeof( CFTypeRef 
), NULL
, &data 
); 
 631                         wxASSERT_MSG( CFDataGetLength( data 
) == sizeof( viewRef 
) , wxT("Illegal Data passed") ) ; 
 632                         memcpy( &viewRef 
, CFDataGetBytePtr( data 
) , sizeof( viewRef 
) ) ; 
 634                         object
->viewRef 
= (HIViewRef
) viewRef 
; 
 635                         // make sure we keep that control during our lifetime 
 636                         CFRetain( object
->viewRef 
) ; 
 638                         verify_noerr(InstallEventHandler( GetControlEventTarget( viewRef 
), ControlToolbarItemHandler
, 
 639                                             GetEventTypeCount( kViewEvents 
), kViewEvents
, object
, NULL 
)); 
 644                 case kEventHIObjectDestruct
: 
 646                         HIViewRef viewRef 
= object
->viewRef 
; 
 647                         if( viewRef 
&& IsValidControlHandle( viewRef
)  ) 
 649                             // depending whether the wxControl corresponding to this HIView has already been destroyed or 
 650                             // not, ref counts differ, so we cannot assert a special value 
 651                             CFIndex count 
=  CFGetRetainCount( viewRef 
) ; 
 652                             wxASSERT_MSG( count 
>=1 , wxT("Reference Count of native tool was illegal before removal") ); 
 654                                 CFRelease( viewRef 
) ; 
 663         case kEventClassToolbarItem
: 
 664             switch ( GetEventKind( inEvent 
) ) 
 666                 case kEventToolbarItemCreateCustomView
: 
 668                     HIViewRef viewRef 
= object
->viewRef 
; 
 669                     HIViewRemoveFromSuperview( viewRef 
) ; 
 670                     HIViewSetVisible(viewRef
, true) ; 
 671                     CFRetain( viewRef 
) ; 
 672                     result 
= SetEventParameter( inEvent
, kEventParamControlRef
, typeControlRef
, sizeof( HIViewRef 
), &viewRef 
); 
 678         case kEventClassControl
: 
 679             switch ( GetEventKind( inEvent 
) ) 
 681                 case kEventControlGetSizeConstraints
: 
 683                     wxWindow
* wxwindow 
= wxFindControlFromMacControl(object
->viewRef 
) ; 
 686                         // during toolbar layout the native window sometimes gets negative sizes, 
 687                         // sometimes it just gets shrunk behind our back, so in order to avoid 
 688                         // ever shrinking more, once a valid size is captured, we keep it 
 690                         wxSize sz 
= object
->lastValidSize
; 
 691                         if ( sz
.x 
<= 0 || sz
.y 
<= 0 ) 
 693                             sz 
= wxwindow
->GetSize() ; 
 694                             sz
.x 
-= wxwindow
->MacGetLeftBorderSize() + wxwindow
->MacGetRightBorderSize(); 
 695                             sz
.y 
-= wxwindow
->MacGetTopBorderSize() + wxwindow
->MacGetBottomBorderSize(); 
 696                             if ( sz
.x 
> 0 && sz
.y 
> 0 ) 
 697                                 object
->lastValidSize 
= sz 
; 
 702                         // Extra width to avoid edge of combobox being cut off 
 706                         min
.width 
= max
.width 
= sz
.x 
; 
 707                         min
.height 
= max
.height 
= sz
.y 
; 
 709                         result 
= SetEventParameter( inEvent
, kEventParamMinimumSize
, typeHISize
, 
 710                                                         sizeof( HISize 
), &min 
); 
 712                         result 
= SetEventParameter( inEvent
, kEventParamMaximumSize
, typeHISize
, 
 713                                                         sizeof( HISize 
), &max 
); 
 725 void RegisterControlToolbarItemClass() 
 727     static bool sRegistered
; 
 731         HIObjectRegisterSubclass( kControlToolbarItemClassID
, kHIToolbarItemClassID
, 0, 
 732                 ControlToolbarItemHandler
, GetEventTypeCount( kEvents 
), kEvents
, 0, NULL 
); 
 738 HIToolbarItemRef 
CreateControlToolbarItem(CFStringRef inIdentifier
, CFTypeRef inConfigData
) 
 740     RegisterControlToolbarItemClass(); 
 744     UInt32              options 
= kHIToolbarItemAllowDuplicates
; 
 745     HIToolbarItemRef    result 
= NULL
; 
 747     err 
= CreateEvent( NULL
, kEventClassHIObject
, kEventHIObjectInitialize
, GetCurrentEventTime(), 0, &event 
); 
 748     require_noerr( err
, CantCreateEvent 
); 
 750     SetEventParameter( event
, kEventParamAttributes
, typeUInt32
, sizeof( UInt32 
), &options 
); 
 751     SetEventParameter( event
, kEventParamToolbarItemIdentifier
, typeCFStringRef
, sizeof( CFStringRef 
), &inIdentifier 
); 
 754         SetEventParameter( event
, kEventParamToolbarItemConfigData
, typeCFTypeRef
, sizeof( CFTypeRef 
), &inConfigData 
); 
 756     err 
= HIObjectCreate( kControlToolbarItemClassID
, event
, (HIObjectRef
*)&result 
); 
 759     ReleaseEvent( event 
); 
 764 #if wxMAC_USE_NATIVE_TOOLBAR 
 765 static const EventTypeSpec kToolbarEvents
[] = 
 767     { kEventClassToolbar
, kEventToolbarGetDefaultIdentifiers 
}, 
 768     { kEventClassToolbar
, kEventToolbarGetAllowedIdentifiers 
}, 
 769     { kEventClassToolbar
, kEventToolbarCreateItemWithIdentifier 
}, 
 772 static OSStatus 
ToolbarDelegateHandler( EventHandlerCallRef inCallRef
, EventRef inEvent
, void* inUserData 
) 
 774     OSStatus result 
= eventNotHandledErr
; 
 776     // wxToolBar* toolbar = (wxToolBar*) inUserData ; 
 777     CFMutableArrayRef   array
; 
 779     switch ( GetEventKind( inEvent 
) ) 
 781         case kEventToolbarGetDefaultIdentifiers
: 
 783                 GetEventParameter( inEvent
, kEventParamMutableArray
, typeCFMutableArrayRef
, NULL
, 
 784                     sizeof( CFMutableArrayRef 
), NULL
, &array 
); 
 785                 // not implemented yet 
 786                 // GetToolbarDefaultItems( array ); 
 791         case kEventToolbarGetAllowedIdentifiers
: 
 793                 GetEventParameter( inEvent
, kEventParamMutableArray
, typeCFMutableArrayRef
, NULL
, 
 794                     sizeof( CFMutableArrayRef 
), NULL
, &array 
); 
 795                 // not implemented yet 
 796                 // GetToolbarAllowedItems( array ); 
 800         case kEventToolbarCreateItemWithIdentifier
: 
 802                 HIToolbarItemRef        item 
= NULL
; 
 803                 CFTypeRef               data 
= NULL
; 
 804                 CFStringRef             identifier 
= NULL 
; 
 806                 GetEventParameter( inEvent
, kEventParamToolbarItemIdentifier
, typeCFStringRef
, NULL
, 
 807                         sizeof( CFStringRef 
), NULL
, &identifier 
); 
 809                 GetEventParameter( inEvent
, kEventParamToolbarItemConfigData
, typeCFTypeRef
, NULL
, 
 810                         sizeof( CFTypeRef 
), NULL
, &data 
); 
 812                 if ( CFStringCompare( kControlToolbarItemClassID
, identifier
, kCFCompareBackwards 
) == kCFCompareEqualTo 
) 
 814                     item 
= CreateControlToolbarItem( kControlToolbarItemClassID
, data 
); 
 817                         SetEventParameter( inEvent
, kEventParamToolbarItem
, typeHIToolbarItemRef
, 
 818                             sizeof( HIToolbarItemRef 
), &item 
); 
 828 #endif // wxMAC_USE_NATIVE_TOOLBAR 
 830 // also for the toolbar we have the dual implementation: 
 831 // only when MacInstallNativeToolbar is called is the native toolbar set as the window toolbar 
 833 bool wxToolBar::Create( 
 839     const wxString
& name 
) 
 841     if ( !wxToolBarBase::Create( parent
, id
, pos
, size
, style
, wxDefaultValidator
, name 
) ) 
 846     OSStatus err 
= noErr
; 
 848 #if wxMAC_USE_NATIVE_TOOLBAR 
 849     if (parent
->IsKindOf(CLASSINFO(wxFrame
)) && wxSystemOptions::GetOptionInt(wxT("mac.toolbar.no-native")) != 1) 
 851         wxString labelStr 
= wxString::Format( wxT("%xd"), (int)this ); 
 852         err 
= HIToolbarCreate( 
 853           wxMacCFStringHolder( labelStr
, wxFont::GetDefaultEncoding() ), 0, 
 854           (HIToolbarRef
*) &m_macHIToolbarRef 
); 
 856         if (m_macHIToolbarRef 
!= NULL
) 
 858             InstallEventHandler( HIObjectGetEventTarget((HIToolbarRef
)m_macHIToolbarRef 
), ToolbarDelegateHandler
, 
 859                     GetEventTypeCount( kToolbarEvents 
), kToolbarEvents
, this, NULL 
); 
 861             HIToolbarDisplayMode mode 
= kHIToolbarDisplayModeDefault
; 
 862             HIToolbarDisplaySize displaySize 
= kHIToolbarDisplaySizeSmall
; 
 864             if ( style 
& wxTB_NOICONS 
) 
 865                 mode 
= kHIToolbarDisplayModeLabelOnly
; 
 866             else if ( style 
& wxTB_TEXT 
) 
 867                 mode 
= kHIToolbarDisplayModeIconAndLabel
; 
 869                 mode 
= kHIToolbarDisplayModeIconOnly
; 
 871             HIToolbarSetDisplayMode( (HIToolbarRef
) m_macHIToolbarRef
, mode 
); 
 872           HIToolbarSetDisplaySize( (HIToolbarRef
) m_macHIToolbarRef
, displaySize 
); 
 875 #endif // wxMAC_USE_NATIVE_TOOLBAR 
 877     return (err 
== noErr
); 
 880 wxToolBar::~wxToolBar() 
 882 #if wxMAC_USE_NATIVE_TOOLBAR 
 883     if (m_macHIToolbarRef 
!= NULL
) 
 885         // if this is the installed toolbar, then deinstall it 
 886         if (m_macUsesNativeToolbar
) 
 887             MacInstallNativeToolbar( false ); 
 889         CFIndex count 
= CFGetRetainCount( m_macHIToolbarRef 
) ; 
 890         wxASSERT_MSG( count 
== 1 , wxT("Reference Count of native control was not 1 in wxToolBar destructor") ); 
 892         CFRelease( (HIToolbarRef
)m_macHIToolbarRef 
); 
 893         m_macHIToolbarRef 
= NULL
; 
 898 bool wxToolBar::Show( bool show 
) 
 900     WindowRef tlw 
= MAC_WXHWND(MacGetTopLevelWindowRef()); 
 901     bool bResult 
= (tlw 
!= NULL
); 
 905 #if wxMAC_USE_NATIVE_TOOLBAR 
 906         bool ownToolbarInstalled 
= false; 
 907         MacTopLevelHasNativeToolbar( &ownToolbarInstalled 
); 
 908         if (ownToolbarInstalled
) 
 910             bResult 
= (IsWindowToolbarVisible( tlw 
) != show
); 
 912                 ShowHideWindowToolbar( tlw
, show
, false ); 
 915             bResult 
= wxToolBarBase::Show( show 
); 
 918         bResult 
= wxToolBarBase::Show( show 
); 
 925 bool wxToolBar::IsShown() const 
 929 #if wxMAC_USE_NATIVE_TOOLBAR 
 930     bool ownToolbarInstalled
; 
 932     MacTopLevelHasNativeToolbar( &ownToolbarInstalled 
); 
 933     if (ownToolbarInstalled
) 
 935         WindowRef tlw 
= MAC_WXHWND(MacGetTopLevelWindowRef()); 
 936         bResult 
= IsWindowToolbarVisible( tlw 
); 
 939         bResult 
= wxToolBarBase::IsShown(); 
 942     bResult 
= wxToolBarBase::IsShown(); 
 948 void wxToolBar::DoGetSize( int *width
, int *height 
) const 
 950 #if wxMAC_USE_NATIVE_TOOLBAR 
 952     bool    ownToolbarInstalled
; 
 954     MacTopLevelHasNativeToolbar( &ownToolbarInstalled 
); 
 955     if ( ownToolbarInstalled 
) 
 957         // TODO: is this really a control ? 
 958         GetControlBounds( (ControlRef
) m_macHIToolbarRef
, &boundsR 
); 
 960             *width 
= boundsR
.right 
- boundsR
.left
; 
 961         if ( height 
!= NULL 
) 
 962             *height 
= boundsR
.bottom 
- boundsR
.top
; 
 965         wxToolBarBase::DoGetSize( width
, height 
); 
 968     wxToolBarBase::DoGetSize( width
, height 
); 
 972 wxSize 
wxToolBar::DoGetBestSize() const 
 976     DoGetSize( &width
, &height 
); 
 978     return wxSize( width
, height 
); 
 981 void wxToolBar::SetWindowStyleFlag( long style 
) 
 983     wxToolBarBase::SetWindowStyleFlag( style 
); 
 985 #if wxMAC_USE_NATIVE_TOOLBAR 
 986     if (m_macHIToolbarRef 
!= NULL
) 
 988         HIToolbarDisplayMode mode 
= kHIToolbarDisplayModeDefault
; 
 990         if ( style 
& wxTB_NOICONS 
) 
 991             mode 
= kHIToolbarDisplayModeLabelOnly
; 
 992         else if ( style 
& wxTB_TEXT 
) 
 993             mode 
= kHIToolbarDisplayModeIconAndLabel
; 
 995             mode 
= kHIToolbarDisplayModeIconOnly
; 
 997        HIToolbarSetDisplayMode( (HIToolbarRef
) m_macHIToolbarRef
, mode 
); 
1002 #if wxMAC_USE_NATIVE_TOOLBAR 
1003 bool wxToolBar::MacWantsNativeToolbar() 
1005     return m_macUsesNativeToolbar
; 
1008 bool wxToolBar::MacTopLevelHasNativeToolbar(bool *ownToolbarInstalled
) const 
1010     bool bResultV 
= false; 
1012     if (ownToolbarInstalled 
!= NULL
) 
1013         *ownToolbarInstalled 
= false; 
1015     WindowRef tlw 
= MAC_WXHWND(MacGetTopLevelWindowRef()); 
1018         HIToolbarRef curToolbarRef 
= NULL
; 
1019         OSStatus err 
= GetWindowToolbar( tlw
, &curToolbarRef 
); 
1020         bResultV 
= ((err 
== noErr
) && (curToolbarRef 
!= NULL
)); 
1021         if (bResultV 
&& (ownToolbarInstalled 
!= NULL
)) 
1022             *ownToolbarInstalled 
= (curToolbarRef 
== m_macHIToolbarRef
); 
1028 bool wxToolBar::MacInstallNativeToolbar(bool usesNative
) 
1030     bool bResult 
= false; 
1032     if (usesNative 
&& (m_macHIToolbarRef 
== NULL
)) 
1035     if (usesNative 
&& ((GetWindowStyleFlag() & wxTB_VERTICAL
) != 0)) 
1038     WindowRef tlw 
= MAC_WXHWND(MacGetTopLevelWindowRef()); 
1042     // check the existing toolbar 
1043     HIToolbarRef curToolbarRef 
= NULL
; 
1044     OSStatus err 
= GetWindowToolbar( tlw
, &curToolbarRef 
); 
1046         curToolbarRef 
= NULL
; 
1048     m_macUsesNativeToolbar 
= usesNative
; 
1050     if (m_macUsesNativeToolbar
) 
1052         // only install toolbar if there isn't one installed already 
1053         if (curToolbarRef 
== NULL
) 
1057             SetWindowToolbar( tlw
, (HIToolbarRef
) m_macHIToolbarRef 
); 
1058             ShowHideWindowToolbar( tlw
, true, false ); 
1059             ChangeWindowAttributes( tlw
, kWindowToolbarButtonAttribute
, 0 ); 
1060             SetAutomaticControlDragTrackingEnabledForWindow( tlw
, true ); 
1062             Rect r 
= { 0, 0, 0, 0 }; 
1063             m_peer
->SetRect( &r 
); 
1064             SetSize( wxSIZE_AUTO_WIDTH
, 0 ); 
1065             m_peer
->SetVisibility( false, true ); 
1066             wxToolBarBase::Show( false ); 
1071         // only deinstall toolbar if this is the installed one 
1072         if (m_macHIToolbarRef 
== curToolbarRef
) 
1076             ShowHideWindowToolbar( tlw
, false, false ); 
1077             ChangeWindowAttributes( tlw
, 0, kWindowToolbarButtonAttribute 
); 
1078             SetWindowToolbar( tlw
, NULL 
); 
1080             m_peer
->SetVisibility( true, true ); 
1085         InvalidateBestSize(); 
1087 // wxLogDebug( wxT("    --> [%lx] - result [%s]"), (long)this, bResult ? wxT("T") : wxT("F") ); 
1092 bool wxToolBar::Realize() 
1094     if (m_tools
.GetCount() == 0) 
1100     int maxToolWidth 
= 0; 
1101     int maxToolHeight 
= 0; 
1103     int x 
= m_xMargin 
+ kwxMacToolBarLeftMargin
; 
1104     int y 
= m_yMargin 
+ kwxMacToolBarTopMargin
; 
1107     GetSize( &tw
, &th 
); 
1109     // find the maximum tool width and height 
1110     wxToolBarTool 
*tool
; 
1111     wxToolBarToolsList::compatibility_iterator node 
= m_tools
.GetFirst(); 
1114         tool 
= (wxToolBarTool 
*) node
->GetData(); 
1117             wxSize  sz 
= tool
->GetSize(); 
1119             if ( sz
.x 
> maxToolWidth 
) 
1120                 maxToolWidth 
= sz
.x
; 
1121             if ( sz
.y 
> maxToolHeight 
) 
1122                 maxToolHeight 
= sz
.y
; 
1125         node 
= node
->GetNext(); 
1128     bool lastIsRadio 
= false; 
1129     bool curIsRadio 
= false; 
1131 #if wxMAC_USE_NATIVE_TOOLBAR 
1132     CFIndex currentPosition 
= 0; 
1133     bool insertAll 
= false; 
1135     HIToolbarRef refTB 
= (HIToolbarRef
)m_macHIToolbarRef
; 
1138     node 
= m_tools
.GetFirst(); 
1141         tool 
= (wxToolBarTool
*) node
->GetData(); 
1144             node 
= node
->GetNext(); 
1148         // set tool position: 
1149         // for the moment just perform a single row/column alignment 
1150         wxSize  cursize 
= tool
->GetSize(); 
1151         if ( x 
+ cursize
.x 
> maxWidth 
) 
1152             maxWidth 
= x 
+ cursize
.x
; 
1153         if ( y 
+ cursize
.y 
> maxHeight 
) 
1154             maxHeight 
= y 
+ cursize
.y
; 
1156         if ( GetWindowStyleFlag() & wxTB_VERTICAL 
) 
1158             int x1 
= x 
+ ( maxToolWidth 
- cursize
.x 
) / 2; 
1159             tool
->SetPosition( wxPoint(x1
, y
) ); 
1163             int y1 
= y 
+ ( maxToolHeight 
- cursize
.y 
) / 2; 
1164             tool
->SetPosition( wxPoint(x
, y1
) ); 
1167         // update the item positioning state 
1168         if ( GetWindowStyleFlag() & wxTB_VERTICAL 
) 
1169             y 
+= cursize
.y 
+ kwxMacToolSpacing
; 
1171             x 
+= cursize
.x 
+ kwxMacToolSpacing
; 
1173 #if wxMAC_USE_NATIVE_TOOLBAR 
1174         // install in native HIToolbar 
1177             HIToolbarItemRef hiItemRef 
= tool
->GetToolbarItemRef(); 
1178             if ( hiItemRef 
!= NULL 
) 
1180                 if ( insertAll 
|| (tool
->GetIndex() != currentPosition
) ) 
1182                     OSStatus err 
= noErr
; 
1187                         // if this is the first tool that gets newly inserted or repositioned 
1188                         // first remove all 'old' tools from here to the right, because of this 
1189                         // all following tools will have to be reinserted (insertAll). 
1190                         for ( wxToolBarToolsList::compatibility_iterator node2 
= m_tools
.GetLast(); 
1192                               node2 
= node2
->GetPrevious() ) 
1194                             wxToolBarTool 
*tool2 
= (wxToolBarTool
*) node2
->GetData(); 
1196                             const long idx 
= tool2
->GetIndex(); 
1199                                 if ( tool2
->IsControl() ) 
1201                                     CFIndex count 
= CFGetRetainCount( tool2
->GetControl()->GetPeer()->GetControlRef() ) ; 
1202                                     wxASSERT_MSG( count 
== 3 || count 
== 2 , wxT("Reference Count of native tool was illegal before removal") ); 
1203                                     wxASSERT( IsValidControlHandle(tool2
->GetControl()->GetPeer()->GetControlRef() )) ; 
1205                                 err 
= HIToolbarRemoveItemAtIndex(refTB
, idx
); 
1208                                     wxLogDebug(wxT("HIToolbarRemoveItemAtIndex(%ld) failed [%ld]"), 
1211                                 if ( tool2
->IsControl() ) 
1213                                     CFIndex count 
= CFGetRetainCount( tool2
->GetControl()->GetPeer()->GetControlRef() ) ; 
1214                                     wxASSERT_MSG( count 
== 2 , wxT("Reference Count of native tool was not 2 after removal") ); 
1215                                     wxASSERT( IsValidControlHandle(tool2
->GetControl()->GetPeer()->GetControlRef() )) ; 
1218                                 tool2
->SetIndex(-1); 
1223                     err 
= HIToolbarInsertItemAtIndex( refTB
, hiItemRef
, currentPosition 
); 
1226                         wxLogDebug( wxT("HIToolbarInsertItemAtIndex failed [%ld]"), (long)err 
); 
1229                     tool
->SetIndex( currentPosition 
); 
1230                     if ( tool
->IsControl() ) 
1232                         CFIndex count 
= CFGetRetainCount( tool
->GetControl()->GetPeer()->GetControlRef() ) ; 
1233                         wxASSERT_MSG( count 
== 3 || count 
== 2, wxT("Reference Count of native tool was illegal after insertion") ); 
1234                         wxASSERT( IsValidControlHandle(tool
->GetControl()->GetPeer()->GetControlRef() )) ; 
1243         // update radio button (and group) state 
1244         lastIsRadio 
= curIsRadio
; 
1245         curIsRadio 
= ( tool
->IsButton() && (tool
->GetKind() == wxITEM_RADIO
) ); 
1249             if ( tool
->IsToggled() ) 
1250                 DoToggleTool( tool
, true ); 
1256                 if ( tool
->Toggle( true ) ) 
1258                     DoToggleTool( tool
, true ); 
1261             else if ( tool
->IsToggled() ) 
1263                 if ( tool
->IsToggled() ) 
1264                     DoToggleTool( tool
, true ); 
1266                 wxToolBarToolsList::compatibility_iterator  nodePrev 
= node
->GetPrevious(); 
1269                     wxToolBarToolBase   
*toggleTool 
= nodePrev
->GetData(); 
1270                     if ( (toggleTool 
== NULL
) || !toggleTool
->IsButton() || (toggleTool
->GetKind() != wxITEM_RADIO
) ) 
1273                     if ( toggleTool
->Toggle( false ) ) 
1274                         DoToggleTool( toggleTool
, false ); 
1276                     nodePrev 
= nodePrev
->GetPrevious(); 
1281         node 
= node
->GetNext(); 
1284     if ( GetWindowStyleFlag() & wxTB_HORIZONTAL 
) 
1286         // if not set yet, only one row 
1287         if ( m_maxRows 
<= 0 ) 
1290         m_minWidth 
= maxWidth
; 
1292         maxHeight 
+= m_yMargin 
+ kwxMacToolBarTopMargin
; 
1293         m_minHeight 
= m_maxHeight 
= maxHeight
; 
1297         // if not set yet, have one column 
1298         if ( (GetToolsCount() > 0) && (m_maxRows 
<= 0) ) 
1299             SetRows( GetToolsCount() ); 
1301         m_minHeight 
= maxHeight
; 
1303         maxWidth 
+= m_xMargin 
+ kwxMacToolBarLeftMargin
; 
1304         m_minWidth 
= m_maxWidth 
= maxWidth
; 
1308     // FIXME: should this be OSX-only? 
1310         bool wantNativeToolbar
, ownToolbarInstalled
; 
1312         // attempt to install the native toolbar 
1313         wantNativeToolbar 
= ((GetWindowStyleFlag() & wxTB_VERTICAL
) == 0); 
1314         MacInstallNativeToolbar( wantNativeToolbar 
); 
1315         (void)MacTopLevelHasNativeToolbar( &ownToolbarInstalled 
); 
1316         if (!ownToolbarInstalled
) 
1318            SetSize( maxWidth
, maxHeight 
); 
1319            InvalidateBestSize(); 
1323     SetSize( maxWidth
, maxHeight 
); 
1324     InvalidateBestSize(); 
1332 void wxToolBar::SetToolBitmapSize(const wxSize
& size
) 
1334     m_defaultWidth 
= size
.x 
+ kwxMacToolBorder
; 
1335     m_defaultHeight 
= size
.y 
+ kwxMacToolBorder
; 
1337 #if wxMAC_USE_NATIVE_TOOLBAR 
1338     if (m_macHIToolbarRef 
!= NULL
) 
1340         int maxs 
= wxMax( size
.x
, size
.y 
); 
1341         HIToolbarDisplaySize sizeSpec
; 
1343             sizeSpec 
= kHIToolbarDisplaySizeNormal
; 
1344         else if ( maxs 
> 24 ) 
1345             sizeSpec 
= kHIToolbarDisplaySizeDefault
; 
1347             sizeSpec 
= kHIToolbarDisplaySizeSmall
; 
1349         HIToolbarSetDisplaySize( (HIToolbarRef
) m_macHIToolbarRef
, sizeSpec 
); 
1354 // The button size is bigger than the bitmap size 
1355 wxSize 
wxToolBar::GetToolSize() const 
1357     return wxSize(m_defaultWidth 
+ kwxMacToolBorder
, m_defaultHeight 
+ kwxMacToolBorder
); 
1360 void wxToolBar::SetRows(int nRows
) 
1362     // avoid resizing the frame uselessly 
1363     if ( nRows 
!= m_maxRows 
) 
1367 void wxToolBar::MacSuperChangedPosition() 
1369     wxWindow::MacSuperChangedPosition(); 
1371 #if wxMAC_USE_NATIVE_TOOLBAR 
1372     if (! m_macUsesNativeToolbar 
) 
1380 void wxToolBar::SetToolNormalBitmap( int id
, const wxBitmap
& bitmap 
) 
1382     wxToolBarTool
* tool 
= wx_static_cast(wxToolBarTool
*, FindById(id
)); 
1385         wxCHECK_RET( tool
->IsButton(), wxT("Can only set bitmap on button tools.")); 
1387         tool
->SetNormalBitmap(bitmap
); 
1389         // a side-effect of the UpdateToggleImage function is that it always changes the bitmap used on the button. 
1390         tool
->UpdateToggleImage( tool
->CanBeToggled() && tool
->IsToggled() ); 
1394 void wxToolBar::SetToolDisabledBitmap( int id
, const wxBitmap
& bitmap 
) 
1396     wxToolBarTool
* tool 
= wx_static_cast(wxToolBarTool
*, FindById(id
)); 
1399         wxCHECK_RET( tool
->IsButton(), wxT("Can only set bitmap on button tools.")); 
1401         tool
->SetDisabledBitmap(bitmap
); 
1403         // TODO:  what to do for this one? 
1407 wxToolBarToolBase 
*wxToolBar::FindToolForPosition(wxCoord x
, wxCoord y
) const 
1409     wxToolBarTool 
*tool
; 
1410     wxToolBarToolsList::compatibility_iterator node 
= m_tools
.GetFirst(); 
1413         tool 
= (wxToolBarTool 
*)node
->GetData(); 
1416             wxRect2DInt 
r( tool
->GetPosition(), tool
->GetSize() ); 
1417             if ( r
.Contains( wxPoint( x
, y 
) ) ) 
1421         node 
= node
->GetNext(); 
1424     return (wxToolBarToolBase
*)NULL
; 
1427 wxString 
wxToolBar::MacGetToolTipString( wxPoint 
&pt 
) 
1429     wxToolBarToolBase 
*tool 
= FindToolForPosition( pt
.x
, pt
.y 
); 
1431         return tool
->GetShortHelp(); 
1433     return wxEmptyString
; 
1436 void wxToolBar::DoEnableTool(wxToolBarToolBase 
*t
, bool enable
) 
1439         ((wxToolBarTool
*)t
)->DoEnable( enable 
); 
1442 void wxToolBar::DoToggleTool(wxToolBarToolBase 
*t
, bool toggle
) 
1444     wxToolBarTool 
*tool 
= (wxToolBarTool 
*)t
; 
1445     if ( ( tool 
!= NULL 
) && tool
->IsButton() ) 
1446         tool
->UpdateToggleImage( toggle 
); 
1449 bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos
), wxToolBarToolBase 
*toolBase
) 
1451     wxToolBarTool 
*tool 
= wx_static_cast( wxToolBarTool
*, toolBase 
); 
1455     WindowRef window 
= (WindowRef
) MacGetTopLevelWindowRef(); 
1456     wxSize toolSize 
= GetToolSize(); 
1457     Rect toolrect 
= { 0, 0, toolSize
.y
, toolSize
.x 
}; 
1458     ControlRef controlHandle 
= NULL
; 
1460     tool
->Attach( this ); 
1462 #if wxMAC_USE_NATIVE_TOOLBAR 
1463     HIToolbarItemRef item
; 
1466     switch (tool
->GetStyle()) 
1468         case wxTOOL_STYLE_SEPARATOR
: 
1470                 wxASSERT( tool
->GetControlHandle() == NULL 
); 
1473                 if ( GetWindowStyleFlag() & wxTB_VERTICAL 
) 
1474                     toolrect
.bottom 
= toolSize
.y
; 
1476                     toolrect
.right 
= toolSize
.x
; 
1478                 // in flat style we need a visual separator 
1479 #if wxMAC_USE_NATIVE_TOOLBAR 
1480                 if (m_macHIToolbarRef 
!= NULL
) 
1482                     err 
= HIToolbarItemCreate( 
1483                         kHIToolbarSeparatorIdentifier
, 
1484                         kHIToolbarItemCantBeRemoved 
| kHIToolbarItemIsSeparator 
| kHIToolbarItemAllowDuplicates
, 
1487                         tool
->SetToolbarItemRef( item 
); 
1491 #endif // wxMAC_USE_NATIVE_TOOLBAR 
1493                 CreateSeparatorControl( window
, &toolrect
, &controlHandle 
); 
1494                 tool
->SetControlHandle( controlHandle 
); 
1498         case wxTOOL_STYLE_BUTTON
: 
1500                 wxASSERT( tool
->GetControlHandle() == NULL 
); 
1501                 ControlButtonContentInfo info
; 
1502                 wxMacCreateBitmapButton( &info
, tool
->GetNormalBitmap(), kControlContentIconRef 
); 
1504                 if ( UMAGetSystemVersion() >= 0x1000) 
1506                     CreateIconControl( window
, &toolrect
, &info
, false, &controlHandle 
); 
1510                     SInt16 behaviour 
= kControlBehaviorOffsetContents
; 
1511                     if ( tool
->CanBeToggled() ) 
1512                         behaviour 
|= kControlBehaviorToggles
; 
1513                     err 
= CreateBevelButtonControl( window
, 
1514                         &toolrect
, CFSTR(""), kControlBevelButtonNormalBevel
, 
1515                         behaviour
, &info
, 0, 0, 0, &controlHandle 
); 
1518 #if wxMAC_USE_NATIVE_TOOLBAR 
1519                 if (m_macHIToolbarRef 
!= NULL
) 
1521                     wxString labelStr 
= wxString::Format(wxT("%xd"), (int)tool
); 
1522                     err 
= HIToolbarItemCreate( 
1523                         wxMacCFStringHolder(labelStr
, wxFont::GetDefaultEncoding()), 
1524                         kHIToolbarItemCantBeRemoved 
| kHIToolbarItemAnchoredLeft 
| kHIToolbarItemAllowDuplicates
, &item 
); 
1527                         InstallEventHandler( 
1528                             HIObjectGetEventTarget(item
), GetwxMacToolBarEventHandlerUPP(), 
1529                             GetEventTypeCount(toolBarEventList
), toolBarEventList
, tool
, NULL 
); 
1531                         HIToolbarItemSetIconRef( item
, info
.u
.iconRef 
); 
1532                         HIToolbarItemSetCommandID( item
, kHIToolbarCommandPressAction 
); 
1533                         tool
->SetToolbarItemRef( item 
); 
1538 #endif // wxMAC_USE_NATIVE_TOOLBAR 
1540                 wxMacReleaseBitmapButton( &info 
); 
1543                 SetBevelButtonTextPlacement( m_controlHandle
, kControlBevelButtonPlaceBelowGraphic 
); 
1544                 UMASetControlTitle( m_controlHandle
, label
, wxFont::GetDefaultEncoding() ); 
1547                 InstallControlEventHandler( 
1548                     (ControlRef
) controlHandle
, GetwxMacToolBarToolEventHandlerUPP(), 
1549                     GetEventTypeCount(eventList
), eventList
, tool
, NULL 
); 
1551                 tool
->SetControlHandle( controlHandle 
); 
1555         case wxTOOL_STYLE_CONTROL
: 
1557 #if wxMAC_USE_NATIVE_TOOLBAR 
1558             if (m_macHIToolbarRef 
!= NULL
) 
1560                 wxCHECK_MSG( tool
->GetControl(), false, _T("control must be non-NULL") ); 
1562                 HIViewRef viewRef 
= (HIViewRef
) tool
->GetControl()->GetHandle() ; 
1563                 CFDataRef data 
= CFDataCreate( kCFAllocatorDefault 
, (UInt8
*) &viewRef 
, sizeof(viewRef
) ) ; 
1564                 err 
= HIToolbarCreateItemWithIdentifier((HIToolbarRef
) m_macHIToolbarRef
,kControlToolbarItemClassID
, 
1569                     tool
->SetToolbarItemRef( item 
); 
1579                 // right now there's nothing to do here 
1587 #if wxMAC_USE_NATIVE_TOOLBAR 
1588     wxString label 
= tool
->GetLabel(); 
1589     if (m_macHIToolbarRef 
&& !label
.empty() ) 
1591         // strip mnemonics from the label for compatibility 
1592         // with the usual labels in wxStaticText sense 
1593         label 
= wxStripMenuCodes(label
); 
1595         HIToolbarItemSetLabel(item
, 
1596                               wxMacCFStringHolder(label
, m_font
.GetEncoding())); 
1598 #endif // wxMAC_USE_NATIVE_TOOLBAR 
1602         if ( controlHandle 
) 
1604             ControlRef container 
= (ControlRef
) GetHandle(); 
1605             wxASSERT_MSG( container 
!= NULL
, wxT("No valid Mac container control") ); 
1607             UMAShowControl( controlHandle 
); 
1608             ::EmbedControl( controlHandle
, container 
); 
1611         if ( tool
->CanBeToggled() && tool
->IsToggled() ) 
1612             tool
->UpdateToggleImage( true ); 
1614         // nothing special to do here - we relayout in Realize() later 
1615         InvalidateBestSize(); 
1619         wxFAIL_MSG( wxString::Format( wxT("wxToolBar::DoInsertTool - failure [%ld]"), (long)err 
) ); 
1622     return (err 
== noErr
); 
1625 void wxToolBar::DoSetToggle(wxToolBarToolBase 
*WXUNUSED(tool
), bool WXUNUSED(toggle
)) 
1627     wxFAIL_MSG( wxT("not implemented") ); 
1630 bool wxToolBar::DoDeleteTool(size_t WXUNUSED(pos
), wxToolBarToolBase 
*toolbase
) 
1632     wxToolBarTool
* tool 
= wx_static_cast( wxToolBarTool
*, toolbase 
); 
1633     wxToolBarToolsList::compatibility_iterator node
; 
1634     for ( node 
= m_tools
.GetFirst(); node
; node 
= node
->GetNext() ) 
1636         wxToolBarToolBase 
*tool2 
= node
->GetData(); 
1637         if ( tool2 
== tool 
) 
1639             // let node point to the next node in the list 
1640             node 
= node
->GetNext(); 
1646     wxSize sz 
= ((wxToolBarTool
*)tool
)->GetSize(); 
1650 #if wxMAC_USE_NATIVE_TOOLBAR 
1651     CFIndex removeIndex 
= tool
->GetIndex(); 
1654 #if wxMAC_USE_NATIVE_TOOLBAR 
1655     if (m_macHIToolbarRef 
!= NULL
) 
1657         if ( removeIndex 
!= -1 && m_macHIToolbarRef 
) 
1659             HIToolbarRemoveItemAtIndex( (HIToolbarRef
) m_macHIToolbarRef
, removeIndex 
); 
1660             tool
->SetIndex( -1 ); 
1664     switch ( tool
->GetStyle() ) 
1666         case wxTOOL_STYLE_CONTROL
: 
1667             if ( tool
->GetControl() ) 
1668                 tool
->GetControl()->Destroy(); 
1671         case wxTOOL_STYLE_BUTTON
: 
1672         case wxTOOL_STYLE_SEPARATOR
: 
1679     tool
->ClearControl(); 
1681     // and finally reposition all the controls after this one 
1683     for ( /* node -> first after deleted */; node
; node 
= node
->GetNext() ) 
1685         wxToolBarTool 
*tool2 
= (wxToolBarTool
*) node
->GetData(); 
1686         wxPoint pt 
= tool2
->GetPosition(); 
1688         if ( GetWindowStyleFlag() & wxTB_VERTICAL 
) 
1693         tool2
->SetPosition( pt 
); 
1695 #if wxMAC_USE_NATIVE_TOOLBAR 
1696         if (m_macHIToolbarRef 
!= NULL
) 
1698             if ( removeIndex 
!= -1 && tool2
->GetIndex() > removeIndex 
) 
1699                 tool2
->SetIndex( tool2
->GetIndex() - 1 ); 
1704     InvalidateBestSize(); 
1709 void wxToolBar::OnPaint(wxPaintEvent
& event
) 
1711 #if wxMAC_USE_NATIVE_TOOLBAR 
1712     if ( m_macUsesNativeToolbar 
) 
1724     bool drawMetalTheme 
= MacGetTopLevelWindow()->MacGetMetalAppearance(); 
1725     bool minimumUmaAvailable 
= (UMAGetSystemVersion() >= 0x1030); 
1727 #if wxMAC_USE_CORE_GRAPHICS && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3 
1728     if ( !drawMetalTheme 
&& minimumUmaAvailable 
) 
1730         HIThemePlacardDrawInfo info
; 
1731         memset( &info
, 0, sizeof(info
) ); 
1733         info
.state 
= IsEnabled() ? kThemeStateActive 
: kThemeStateInactive
; 
1735         CGContextRef cgContext 
= (CGContextRef
) MacGetCGContextRef(); 
1736         HIRect rect 
= CGRectMake( 0, 0, w
, h 
); 
1737         HIThemeDrawPlacard( &rect
, &info
, cgContext
, kHIThemeOrientationNormal 
); 
1741         // leave the background as it is (striped or metal) 
1746     const bool drawBorder 
= true; 
1750         wxMacPortSetter 
helper( &dc 
); 
1752         if ( !drawMetalTheme 
|| !minimumUmaAvailable 
) 
1754             Rect toolbarrect 
= { dc
.YLOG2DEVMAC(0), dc
.XLOG2DEVMAC(0), 
1755                 dc
.YLOG2DEVMAC(h
), dc
.XLOG2DEVMAC(w
) }; 
1758             if ( toolbarrect
.left 
< 0 ) 
1759                 toolbarrect
.left 
= 0; 
1760             if ( toolbarrect
.top 
< 0 ) 
1761                 toolbarrect
.top 
= 0; 
1764             UMADrawThemePlacard( &toolbarrect
, IsEnabled() ? kThemeStateActive 
: kThemeStateInactive 
); 
1768 #if TARGET_API_MAC_OSX 
1769             HIRect hiToolbarrect 
= CGRectMake( 
1770                 dc
.YLOG2DEVMAC(0), dc
.XLOG2DEVMAC(0), 
1771                 dc
.YLOG2DEVREL(h
), dc
.XLOG2DEVREL(w
) ); 
1772             CGContextRef cgContext
; 
1775             GetPortBounds( (CGrafPtr
) dc
.m_macPort
, &bounds 
); 
1776             QDBeginCGContext( (CGrafPtr
) dc
.m_macPort
, &cgContext 
); 
1778             CGContextTranslateCTM( cgContext
, 0, bounds
.bottom 
- bounds
.top 
); 
1779             CGContextScaleCTM( cgContext
, 1, -1 ); 
1781             HIThemeBackgroundDrawInfo drawInfo
; 
1782             drawInfo
.version 
= 0; 
1783             drawInfo
.state 
= kThemeStateActive
; 
1784             drawInfo
.kind 
= kThemeBackgroundMetal
; 
1785             HIThemeApplyBackground( &hiToolbarrect
, &drawInfo
, cgContext
, kHIThemeOrientationNormal 
); 
1788             QDEndCGContext( (CGrafPtr
) dc
.m_macPort
, &cgContext 
); 
1798 #endif // wxUSE_TOOLBAR