X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ce9da810d8d0bc3ea073542e93a3be0a693aa123..0cdd04ad993f86710bc5c9d9c8c12ec25a34ac71:/src/mac/carbon/toolbar.cpp diff --git a/src/mac/carbon/toolbar.cpp b/src/mac/carbon/toolbar.cpp index 94228ad0bf..61fdc4325a 100644 --- a/src/mac/carbon/toolbar.cpp +++ b/src/mac/carbon/toolbar.cpp @@ -19,6 +19,7 @@ #include "wx/wx.h" #endif +#include "wx/app.h" #include "wx/mac/uma.h" #include "wx/geometry.h" @@ -82,11 +83,6 @@ public: virtual ~wxToolBarTool() { ClearControl(); - -#if wxMAC_USE_NATIVE_TOOLBAR - if ( m_toolbarItemRef ) - CFRelease( m_toolbarItemRef ); -#endif } WXWidget GetControlHandle() @@ -116,7 +112,14 @@ public: } #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 } @@ -392,8 +395,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; @@ -612,8 +613,19 @@ static pascal OSStatus ControlToolbarItemHandler( EventHandlerCallRef inCallRef, break; case kEventHIObjectDestruct: - free( object ) ; - result = noErr; + { + // 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; @@ -714,6 +726,7 @@ CantCreateEvent : return result ; } +#if wxMAC_USE_NATIVE_TOOLBAR static const EventTypeSpec kToolbarEvents[] = { { kEventClassToolbar, kEventToolbarGetDefaultIdentifiers }, @@ -777,6 +790,7 @@ static OSStatus ToolbarDelegateHandler( EventHandlerCallRef inCallRef, EventRef } 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 @@ -792,6 +806,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 @@ -832,6 +848,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; } @@ -1070,7 +1089,6 @@ bool wxToolBar::Realize() bool lastIsRadio = false; bool curIsRadio = false; - bool setChoiceInGroup = false; #if wxMAC_USE_NATIVE_TOOLBAR CFIndex currentPosition = 0; @@ -1165,8 +1183,6 @@ bool wxToolBar::Realize() { if ( tool->IsToggled() ) DoToggleTool( tool, true ); - - setChoiceInGroup = false; } else { @@ -1175,7 +1191,6 @@ bool wxToolBar::Realize() if ( tool->Toggle( true ) ) { DoToggleTool( tool, true ); - setChoiceInGroup = true; } } else if ( tool->IsToggled() ) @@ -1244,7 +1259,7 @@ bool wxToolBar::Realize() InvalidateBestSize(); #endif - SetBestFittingSize(); + SetInitialSize(); return true; } @@ -1520,34 +1535,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 +1662,9 @@ void wxToolBar::OnPaint(wxPaintEvent& event) drawInfo.kind = kThemeBackgroundMetal; HIThemeApplyBackground( &hiToolbarrect, &drawInfo, cgContext, kHIThemeOrientationNormal ); +#ifndef __LP64__ QDEndCGContext( (CGrafPtr) dc.m_macPort, &cgContext ); +#endif #endif } }