+{
+#if wxMAC_USE_NATIVE_TOOLBAR
+ if (m_macHIToolbarRef != NULL)
+ {
+ // if this is the installed toolbar, then deinstall it
+ if (m_macUsesNativeToolbar)
+ MacInstallNativeToolbar( false );
+
+ CFIndex count = CFGetRetainCount( m_macHIToolbarRef ) ;
+ // Leopard seems to have one refcount more, so we cannot check reliably at the moment
+ if ( UMAGetSystemVersion() < 0x1050 )
+ {
+ if ( count != 1 )
+ {
+ wxFAIL_MSG("Reference count of native control was not 1 in wxToolBar destructor");
+ }
+ }
+ CFRelease( (HIToolbarRef)m_macHIToolbarRef );
+ m_macHIToolbarRef = NULL;
+ }
+#endif
+}
+
+bool wxToolBar::Show( bool show )
+{
+ WindowRef tlw = MAC_WXHWND(MacGetTopLevelWindowRef());
+ bool bResult = (tlw != NULL);
+
+ if (bResult)
+ {
+#if wxMAC_USE_NATIVE_TOOLBAR
+ bool ownToolbarInstalled = false;
+ MacTopLevelHasNativeToolbar( &ownToolbarInstalled );
+ if (ownToolbarInstalled)
+ {
+ bResult = (IsWindowToolbarVisible( tlw ) != show);
+ if ( bResult )
+ ShowHideWindowToolbar( tlw, show, false );
+ }
+ else
+ bResult = wxToolBarBase::Show( show );
+#else
+
+ bResult = wxToolBarBase::Show( show );
+#endif
+ }
+
+ return bResult;
+}
+
+bool wxToolBar::IsShown() const
+{
+ bool bResult;
+
+#if wxMAC_USE_NATIVE_TOOLBAR
+ bool ownToolbarInstalled;
+
+ MacTopLevelHasNativeToolbar( &ownToolbarInstalled );
+ if (ownToolbarInstalled)
+ {
+ WindowRef tlw = MAC_WXHWND(MacGetTopLevelWindowRef());
+ bResult = IsWindowToolbarVisible( tlw );
+ }
+ else
+ bResult = wxToolBarBase::IsShown();
+#else
+
+ bResult = wxToolBarBase::IsShown();
+#endif
+
+ return bResult;
+}
+
+void wxToolBar::DoGetSize( int *width, int *height ) const
+{
+#if wxMAC_USE_NATIVE_TOOLBAR
+ Rect boundsR;
+ bool ownToolbarInstalled;
+
+ MacTopLevelHasNativeToolbar( &ownToolbarInstalled );
+ if ( ownToolbarInstalled )
+ {
+ // TODO: is this really a control ?
+ GetControlBounds( (ControlRef) m_macHIToolbarRef, &boundsR );
+ if ( width != NULL )
+ *width = boundsR.right - boundsR.left;
+ if ( height != NULL )
+ *height = boundsR.bottom - boundsR.top;
+ }
+ else
+ wxToolBarBase::DoGetSize( width, height );
+
+#else
+ wxToolBarBase::DoGetSize( width, height );
+#endif
+}
+
+wxSize wxToolBar::DoGetBestSize() const
+{
+ int width, height;
+
+ DoGetSize( &width, &height );
+
+ return wxSize( width, height );
+}
+
+void wxToolBar::SetWindowStyleFlag( long style )
+{
+ wxToolBarBase::SetWindowStyleFlag( style );
+
+#if wxMAC_USE_NATIVE_TOOLBAR
+ if (m_macHIToolbarRef != NULL)
+ {
+ HIToolbarDisplayMode mode = kHIToolbarDisplayModeDefault;
+
+ if ( style & wxTB_NOICONS )
+ mode = kHIToolbarDisplayModeLabelOnly;
+ else if ( style & wxTB_TEXT )
+ mode = kHIToolbarDisplayModeIconAndLabel;
+ else
+ mode = kHIToolbarDisplayModeIconOnly;
+
+ HIToolbarSetDisplayMode( (HIToolbarRef) m_macHIToolbarRef, mode );
+ }
+#endif
+}
+
+#if wxMAC_USE_NATIVE_TOOLBAR
+bool wxToolBar::MacWantsNativeToolbar()
+{
+ return m_macUsesNativeToolbar;
+}
+
+bool wxToolBar::MacTopLevelHasNativeToolbar(bool *ownToolbarInstalled) const
+{
+ bool bResultV = false;
+
+ if (ownToolbarInstalled != NULL)
+ *ownToolbarInstalled = false;
+
+ WindowRef tlw = MAC_WXHWND(MacGetTopLevelWindowRef());
+ if (tlw != NULL)
+ {
+ HIToolbarRef curToolbarRef = NULL;
+ OSStatus err = GetWindowToolbar( tlw, &curToolbarRef );
+ bResultV = ((err == noErr) && (curToolbarRef != NULL));
+ if (bResultV && (ownToolbarInstalled != NULL))
+ *ownToolbarInstalled = (curToolbarRef == m_macHIToolbarRef);
+ }
+
+ return bResultV;
+}
+
+bool wxToolBar::MacInstallNativeToolbar(bool usesNative)
+{
+ bool bResult = false;
+
+ if (usesNative && (m_macHIToolbarRef == NULL))
+ return bResult;
+
+ if (usesNative && ((GetWindowStyleFlag() & wxTB_VERTICAL) != 0))
+ return bResult;
+
+ WindowRef tlw = MAC_WXHWND(MacGetTopLevelWindowRef());
+ if (tlw == NULL)
+ return bResult;
+
+ // check the existing toolbar
+ HIToolbarRef curToolbarRef = NULL;
+ OSStatus err = GetWindowToolbar( tlw, &curToolbarRef );
+ if (err != noErr)
+ curToolbarRef = NULL;
+
+ m_macUsesNativeToolbar = usesNative;
+
+ if (m_macUsesNativeToolbar)
+ {
+ // only install toolbar if there isn't one installed already
+ if (curToolbarRef == NULL)
+ {
+ bResult = true;
+
+ SetWindowToolbar( tlw, (HIToolbarRef) m_macHIToolbarRef );
+ ShowHideWindowToolbar( tlw, true, false );
+ ChangeWindowAttributes( tlw, kWindowToolbarButtonAttribute, 0 );
+ SetAutomaticControlDragTrackingEnabledForWindow( tlw, true );
+
+ Rect r = { 0, 0, 0, 0 };
+ m_peer->SetRect( &r );
+ SetSize( wxSIZE_AUTO_WIDTH, 0 );
+ m_peer->SetVisibility( false, true );
+ wxToolBarBase::Show( false );
+ }
+ }
+ else
+ {
+ // only deinstall toolbar if this is the installed one
+ if (m_macHIToolbarRef == curToolbarRef)
+ {
+ bResult = true;
+
+ ShowHideWindowToolbar( tlw, false, false );
+ ChangeWindowAttributes( tlw, 0, kWindowToolbarButtonAttribute );
+ SetWindowToolbar( tlw, NULL );
+
+ m_peer->SetVisibility( true, true );
+ }
+ }
+
+ if (bResult)
+ InvalidateBestSize();
+
+// wxLogDebug( wxT(" --> [%lx] - result [%s]"), (long)this, bResult ? wxT("T") : wxT("F") );
+ return bResult;