+
+ err = HIToolbarInsertItemAtIndex( (HIToolbarRef) m_macHIToolbarRef, hiItemRef , currentPosition ) ;
+ wxASSERT_MSG( err == noErr, _T("HIToolbarInsertItemAtIndex failed") );
+
+ tool->SetIndex( currentPosition ) ;
+ }
+
+ currentPosition++ ;
+ }
+ }
+#endif // wxMAC_USE_NATIVE_TOOLBAR
+
+ // update radio button (and group) state
+ lastIsRadio = curIsRadio;
+ curIsRadio = ( tool->IsButton() && (tool->GetKind() == wxITEM_RADIO) );
+
+ if ( !curIsRadio )
+ {
+ if ( tool->IsToggled() )
+ DoToggleTool( tool, true );
+
+ setChoiceInGroup = false;
+ }
+ else
+ {
+ if ( !lastIsRadio )
+ {
+ if ( tool->Toggle(true) )
+ {
+ DoToggleTool( tool, true );
+ setChoiceInGroup = true;
+ }
+ }
+ else if ( tool->IsToggled() )
+ {
+ if ( tool->IsToggled() )
+ DoToggleTool( tool, true );
+
+ wxToolBarToolsList::compatibility_iterator nodePrev = node->GetPrevious();
+ while ( nodePrev != NULL )
+ {
+ wxToolBarToolBase *toggleTool = nodePrev->GetData();
+ if ( (toggleTool == NULL) || !toggleTool->IsButton() || (toggleTool->GetKind() != wxITEM_RADIO) )
+ break;
+
+ if ( toggleTool->Toggle(false) )
+ DoToggleTool( toggleTool, false );
+
+ nodePrev = nodePrev->GetPrevious();
+ }
+ }
+ }
+
+ node = node->GetNext();
+ }
+
+ if ( GetWindowStyleFlag() & wxTB_HORIZONTAL )
+ {
+ // if not set yet, only one row
+ if ( m_maxRows <= 0 )
+ SetRows( 1 );
+
+ m_minWidth = maxWidth;
+ maxWidth = tw;
+ maxHeight += m_yMargin + kwxMacToolBarTopMargin;
+ m_minHeight = m_maxHeight = maxHeight;
+ }
+ else
+ {
+ // if not set yet, have one column
+ if ( (GetToolsCount() > 0) && (m_maxRows <= 0) )
+ SetRows( GetToolsCount() );
+
+ m_minHeight = maxHeight;
+ maxHeight = th;
+ maxWidth += m_xMargin + kwxMacToolBarLeftMargin;
+ m_minWidth = m_maxWidth = maxWidth;
+ }
+
+#if 0
+ // FIXME: should this be OSX-only?
+ {
+ bool wantNativeToolbar, ownToolbarInstalled;
+
+ // attempt to install the native toolbar
+ wantNativeToolbar = ((GetWindowStyleFlag() & wxTB_VERTICAL) == 0);
+ MacInstallNativeToolbar( wantNativeToolbar );
+ (void)MacTopLevelHasNativeToolbar( &ownToolbarInstalled );
+ if (!ownToolbarInstalled)
+ {
+ SetSize( maxWidth, maxHeight );
+ InvalidateBestSize();
+ }
+ }
+#else
+ SetSize( maxWidth, maxHeight );
+ InvalidateBestSize();
+#endif
+
+ SetBestFittingSize();
+
+ return true;
+}
+
+void wxToolBar::SetToolBitmapSize(const wxSize& size)
+{
+ m_defaultWidth = size.x + kwxMacToolBorder;
+ m_defaultHeight = size.y + kwxMacToolBorder;
+
+#if wxMAC_USE_NATIVE_TOOLBAR
+ if (m_macHIToolbarRef != NULL)
+ {
+ int maxs = wxMax( size.x, size.y );
+ HIToolbarDisplaySize sizeSpec ;
+ if ( maxs > 32 )
+ sizeSpec = kHIToolbarDisplaySizeNormal ;
+ else if ( maxs > 24 )
+ sizeSpec = kHIToolbarDisplaySizeDefault ;
+ else
+ sizeSpec = kHIToolbarDisplaySizeSmall ;
+
+ HIToolbarSetDisplaySize( (HIToolbarRef) m_macHIToolbarRef, sizeSpec );
+ }
+#endif
+}
+
+// The button size is bigger than the bitmap size
+wxSize wxToolBar::GetToolSize() const
+{
+ return wxSize(m_defaultWidth + kwxMacToolBorder, m_defaultHeight + kwxMacToolBorder);
+}
+
+void wxToolBar::SetRows(int nRows)
+{
+ // avoid resizing the frame uselessly
+ if ( nRows != m_maxRows )
+ m_maxRows = nRows;
+}
+
+void wxToolBar::MacSuperChangedPosition()
+{
+ wxWindow::MacSuperChangedPosition();
+
+#if wxMAC_USE_NATIVE_TOOLBAR
+ if (! m_macUsesNativeToolbar )
+ Realize();
+#else
+ Realize();
+#endif
+}
+
+wxToolBarToolBase *wxToolBar::FindToolForPosition(wxCoord x, wxCoord y) const
+{
+ wxToolBarToolsList::compatibility_iterator node = m_tools.GetFirst();
+ while ( node != NULL )
+ {
+ wxToolBarTool *tool = (wxToolBarTool *)node->GetData() ;
+
+ if (tool != NULL)
+ {
+ wxRect2DInt r( tool->GetPosition(), tool->GetSize() );
+ if ( r.Contains( wxPoint( x, y ) ) )
+ return tool;
+ }
+
+ node = node->GetNext();
+ }
+
+ return (wxToolBarToolBase *)NULL;
+}
+
+wxString wxToolBar::MacGetToolTipString( wxPoint &pt )
+{
+ wxToolBarToolBase* tool = FindToolForPosition( pt.x , pt.y ) ;
+ if ( tool != NULL )
+ return tool->GetShortHelp() ;
+
+ return wxEmptyString ;
+}
+
+void wxToolBar::DoEnableTool(wxToolBarToolBase *t, bool enable)
+{
+ if ( t != NULL )
+ ((wxToolBarTool*)t)->DoEnable( enable ) ;
+}
+
+void wxToolBar::DoToggleTool(wxToolBarToolBase *t, bool toggle)
+{
+ wxToolBarTool *tool = (wxToolBarTool *)t;
+ if ( ( tool != NULL ) && tool->IsButton() )
+ tool->UpdateToggleImage( toggle );
+}
+
+bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos),
+ wxToolBarToolBase *toolBase)
+{
+ wxToolBarTool* tool = wx_static_cast( wxToolBarTool* , toolBase );
+ if (tool == NULL)
+ return false;
+
+ WindowRef window = (WindowRef) MacGetTopLevelWindowRef();
+ wxSize toolSize = GetToolSize();
+ Rect toolrect = { 0, 0 , toolSize.y , toolSize.x };
+ ControlRef controlHandle = NULL;
+ OSStatus err = 0;
+
+ switch (tool->GetStyle())
+ {
+ case wxTOOL_STYLE_SEPARATOR :
+ {
+ wxASSERT( tool->GetControlHandle() == NULL );
+ toolSize.x /= 4;
+ toolSize.y /= 4;
+ if ( GetWindowStyleFlag() & wxTB_VERTICAL )
+ toolrect.bottom = toolSize.y;
+ 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
+
+ CreateSeparatorControl( window, &toolrect, &controlHandle );
+ tool->SetControlHandle( controlHandle );
+#endif
+ }
+ break;
+
+ case wxTOOL_STYLE_BUTTON :
+ {
+ wxASSERT( tool->GetControlHandle() == NULL ) ;
+ ControlButtonContentInfo info ;
+ wxMacCreateBitmapButton( &info , tool->GetNormalBitmap() , kControlContentIconRef ) ;
+
+ if ( UMAGetSystemVersion() >= 0x1000)
+ CreateIconControl( window , &toolrect , &info , false , &controlHandle ) ;
+ else
+ {
+ SInt16 behaviour = kControlBehaviorOffsetContents ;
+ if ( tool->CanBeToggled() )
+ behaviour |= kControlBehaviorToggles ;
+ CreateBevelButtonControl( window ,
+ &toolrect , CFSTR("") , kControlBevelButtonNormalBevel ,
+ behaviour , &info , 0 , 0 , 0 , &controlHandle ) ;
+ }
+
+#if wxMAC_USE_NATIVE_TOOLBAR
+ HIToolbarItemRef item ;
+ wxString labelStr = wxString::Format(wxT("%xd"), (int)tool);
+ err = HIToolbarItemCreate(
+ wxMacCFStringHolder(labelStr, wxFont::GetDefaultEncoding()),
+ kHIToolbarItemCantBeRemoved | kHIToolbarItemAnchoredLeft | kHIToolbarItemAllowDuplicates, &item );
+ if (err == noErr)
+ {
+ 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 );