X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9b7835a516d1acdeb007bed0c5bb80cae1643416..7f65743f005572f1de2754ba8c5e7cf1eed1847e:/src/mac/carbon/toolbar.cpp diff --git a/src/mac/carbon/toolbar.cpp b/src/mac/carbon/toolbar.cpp index 1b7cef3e5f..f0364473c9 100644 --- a/src/mac/carbon/toolbar.cpp +++ b/src/mac/carbon/toolbar.cpp @@ -25,21 +25,12 @@ #include "wx/sysopt.h" -#ifdef __WXMAC_OSX__ const short kwxMacToolBarToolDefaultWidth = 16; const short kwxMacToolBarToolDefaultHeight = 16; const short kwxMacToolBarTopMargin = 4; const short kwxMacToolBarLeftMargin = 4; const short kwxMacToolBorder = 0; const short kwxMacToolSpacing = 6; -#else -const short kwxMacToolBarToolDefaultWidth = 24; -const short kwxMacToolBarToolDefaultHeight = 22; -const short kwxMacToolBarTopMargin = 2; -const short kwxMacToolBarLeftMargin = 2; -const short kwxMacToolBorder = 4; -const short kwxMacToolSpacing = 0; -#endif IMPLEMENT_DYNAMIC_CLASS(wxToolBar, wxControl) @@ -61,7 +52,7 @@ END_EVENT_TABLE() // when embedding native controls in the native toolbar we must make sure the // control does not get deleted behind our backs, so the retain count gets increased -// (after creation it is 1), first be the creation of the custom HIToolbarItem wrapper +// (after creation it is 1), first be the creation of the custom HIToolbarItem wrapper // object, and second by the code 'creating' the custom HIView (which is the same as the // already existing native control, therefore we just increase the ref count) // when this view is removed from the native toolbar its count gets decremented again @@ -117,24 +108,29 @@ public: DisposeControl( m_controlHandle ); else { - // the embedded control is not under the responsibility of the tool, it will be disposed of in the + // the embedded control is not under the responsibility of the tool, it gets disposed of in the // proper wxControl destructor - wxASSERT( IsValidControlHandle(GetControl()->GetPeer()->GetControlRef() )) ; } m_controlHandle = NULL ; } - m_control = NULL; #if wxMAC_USE_NATIVE_TOOLBAR if ( m_toolbarItemRef ) { CFIndex count = CFGetRetainCount( m_toolbarItemRef ) ; - wxASSERT_MSG( count == 1 , wxT("Reference Count of native tool was not 1 in wxToolBarTool destructor") ); + // different behaviour under Leopard + if ( UMAGetSystemVersion() < 0x1050 ) + { + if ( count != 1 ) + { + wxFAIL_MSG("Reference count of native tool was not 1 in wxToolBarTool destructor"); + } + } wxTheApp->MacAddToAutorelease(m_toolbarItemRef); CFRelease(m_toolbarItemRef); m_toolbarItemRef = NULL; } -#endif +#endif // wxMAC_USE_NATIVE_TOOLBAR } wxSize GetSize() const @@ -193,8 +189,8 @@ public: HIToolbarItemSetHelpText( m_toolbarItemRef, - wxMacCFStringHolder( GetShortHelp(), enc ), - wxMacCFStringHolder( GetLongHelp(), enc ) ); + wxCFStringRef( GetShortHelp(), enc ), + wxCFStringRef( GetLongHelp(), enc ) ); } } @@ -239,12 +235,10 @@ private: static const EventTypeSpec eventList[] = { { kEventClassControl, kEventControlHit }, -#ifdef __WXMAC_OSX__ { kEventClassControl, kEventControlHitTest }, -#endif }; -static pascal OSStatus wxMacToolBarToolControlEventHandler( EventHandlerCallRef handler, EventRef event, void *data ) +static pascal OSStatus wxMacToolBarToolControlEventHandler( EventHandlerCallRef WXUNUSED(handler), EventRef event, void *data ) { OSStatus result = eventNotHandledErr; ControlRef controlRef; @@ -262,11 +256,7 @@ static pascal OSStatus wxMacToolBarToolControlEventHandler( EventHandlerCallRef { bool shouldToggle; -#ifdef __WXMAC_OSX__ shouldToggle = !tbartool->IsToggled(); -#else - shouldToggle = (GetControl32BitValue( (ControlRef)(tbartool->GetControlHandle()) ) != 0); -#endif tbar->ToggleTool( tbartool->GetId(), shouldToggle ); } @@ -277,7 +267,6 @@ static pascal OSStatus wxMacToolBarToolControlEventHandler( EventHandlerCallRef } break; -#ifdef __WXMAC_OSX__ case kEventControlHitTest: { HIPoint pt = cEvent.GetParameter(kEventParamMouseLocation); @@ -291,7 +280,6 @@ static pascal OSStatus wxMacToolBarToolControlEventHandler( EventHandlerCallRef result = noErr; } break; -#endif default: break; @@ -326,7 +314,7 @@ static const EventTypeSpec toolBarEventList[] = { kEventClassToolbarItem, kEventToolbarItemPerformAction }, }; -static pascal OSStatus wxMacToolBarCommandEventHandler( EventHandlerCallRef handler, EventRef event, void *data ) +static pascal OSStatus wxMacToolBarCommandEventHandler( EventHandlerCallRef WXUNUSED(handler), EventRef event, void *data ) { OSStatus result = eventNotHandledErr; @@ -396,17 +384,10 @@ bool wxToolBarTool::DoEnable( bool enable ) if ( m_controlHandle != NULL ) { -#if TARGET_API_MAC_OSX if ( enable ) EnableControl( m_controlHandle ); else DisableControl( m_controlHandle ); -#else - if ( enable ) - ActivateControl( m_controlHandle ); - else - DeactivateControl( m_controlHandle ); -#endif } } @@ -431,7 +412,7 @@ void wxToolBarTool::SetPosition( const wxPoint& position ) if ( mac_x != former_mac_x || mac_y != former_mac_y ) { - UMAMoveControl( m_controlHandle, mac_x, mac_y ); + ::MoveControl( m_controlHandle, mac_x, mac_y ); } } else if ( IsControl() ) @@ -447,21 +428,18 @@ void wxToolBarTool::SetPosition( const wxPoint& position ) else { // separator -#ifdef __WXMAC_OSX__ Rect contrlRect; GetControlBounds( m_controlHandle, &contrlRect ); int former_mac_x = contrlRect.left; int former_mac_y = contrlRect.top; if ( mac_x != former_mac_x || mac_y != former_mac_y ) - UMAMoveControl( m_controlHandle, mac_x, mac_y ); -#endif + ::MoveControl( m_controlHandle, mac_x, mac_y ); } } void wxToolBarTool::UpdateToggleImage( bool toggle ) { -#ifdef __WXMAC_OSX__ if ( toggle ) { int w = m_bmpNormal.GetWidth(); @@ -476,12 +454,15 @@ void wxToolBarTool::UpdateToggleImage( bool toggle ) dc.DrawBitmap( m_bmpNormal, 0, 0, true ); dc.SelectObject( wxNullBitmap ); ControlButtonContentInfo info; - wxMacCreateBitmapButton( &info, bmp, kControlContentIconRef ); + wxMacCreateBitmapButton( &info, bmp ); SetControlData( m_controlHandle, 0, kControlIconContentTag, sizeof(info), (Ptr)&info ); #if wxMAC_USE_NATIVE_TOOLBAR if (m_toolbarItemRef != NULL) { - HIToolbarItemSetIconRef( m_toolbarItemRef, info.u.iconRef ); + ControlButtonContentInfo info2; + wxMacCreateBitmapButton( &info2, bmp, kControlContentCGImageRef); + HIToolbarItemSetImage( m_toolbarItemRef, info2.u.imageRef ); + wxMacReleaseBitmapButton( &info2 ); } #endif wxMacReleaseBitmapButton( &info ); @@ -489,12 +470,15 @@ void wxToolBarTool::UpdateToggleImage( bool toggle ) else { ControlButtonContentInfo info; - wxMacCreateBitmapButton( &info, m_bmpNormal, kControlContentIconRef ); + wxMacCreateBitmapButton( &info, m_bmpNormal ); SetControlData( m_controlHandle, 0, kControlIconContentTag, sizeof(info), (Ptr)&info ); #if wxMAC_USE_NATIVE_TOOLBAR if (m_toolbarItemRef != NULL) { - HIToolbarItemSetIconRef( m_toolbarItemRef, info.u.iconRef ); + ControlButtonContentInfo info2; + wxMacCreateBitmapButton( &info2, m_bmpNormal, kControlContentCGImageRef); + HIToolbarItemSetImage( m_toolbarItemRef, info2.u.imageRef ); + wxMacReleaseBitmapButton( &info2 ); } #endif wxMacReleaseBitmapButton( &info ); @@ -506,9 +490,6 @@ void wxToolBarTool::UpdateToggleImage( bool toggle ) sizeof(transform), (Ptr)&transform ); HIViewSetNeedsDisplay( m_controlHandle, true ); -#else - ::SetControl32BitValue( m_controlHandle, toggle ); -#endif } wxToolBarTool::wxToolBarTool( @@ -649,12 +630,15 @@ static pascal OSStatus ControlToolbarItemHandler( EventHandlerCallRef inCallRef, // depending whether the wxControl corresponding to this HIView has already been destroyed or // not, ref counts differ, so we cannot assert a special value CFIndex count = CFGetRetainCount( viewRef ) ; - wxASSERT_MSG( count >=1 , wxT("Reference Count of native tool was illegal before removal") ); if ( count >= 1 ) + { + wxFAIL_MSG("Reference count of native tool was illegal before removal"); + CFRelease( viewRef ) ; + } } - free( object ) ; - result = noErr; + free( object ) ; + result = noErr; } break; } @@ -701,7 +685,7 @@ static pascal OSStatus ControlToolbarItemHandler( EventHandlerCallRef inCallRef, // Extra width to avoid edge of combobox being cut off sz.x += 3; - + HISize min, max; min.width = max.width = sz.x ; min.height = max.height = sz.y ; @@ -769,7 +753,9 @@ static const EventTypeSpec kToolbarEvents[] = { kEventClassToolbar, kEventToolbarCreateItemWithIdentifier }, }; -static OSStatus ToolbarDelegateHandler( EventHandlerCallRef inCallRef, EventRef inEvent, void* inUserData ) +static OSStatus ToolbarDelegateHandler(EventHandlerCallRef WXUNUSED(inCallRef), + EventRef inEvent, + void* WXUNUSED(inUserData)) { OSStatus result = eventNotHandledErr; // Not yet needed @@ -848,9 +834,9 @@ bool wxToolBar::Create( #if wxMAC_USE_NATIVE_TOOLBAR if (parent->IsKindOf(CLASSINFO(wxFrame)) && wxSystemOptions::GetOptionInt(wxT("mac.toolbar.no-native")) != 1) { - wxString labelStr = wxString::Format( wxT("%xd"), (int)this ); + wxString labelStr = wxString::Format( wxT("%p"), this ); err = HIToolbarCreate( - wxMacCFStringHolder( labelStr, wxFont::GetDefaultEncoding() ), 0, + wxCFStringRef( labelStr, wxFont::GetDefaultEncoding() ), 0, (HIToolbarRef*) &m_macHIToolbarRef ); if (m_macHIToolbarRef != NULL) @@ -887,8 +873,14 @@ wxToolBar::~wxToolBar() MacInstallNativeToolbar( false ); CFIndex count = CFGetRetainCount( m_macHIToolbarRef ) ; - wxASSERT_MSG( count == 1 , wxT("Reference Count of native control was not 1 in wxToolBar destructor") ); - + // 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; } @@ -1199,7 +1191,11 @@ bool wxToolBar::Realize() if ( tool2->IsControl() ) { CFIndex count = CFGetRetainCount( tool2->GetControl()->GetPeer()->GetControlRef() ) ; - wxASSERT_MSG( count == 3 || count == 2 , wxT("Reference Count of native tool was illegal before removal") ); + if ( count != 3 && count != 2 ) + { + wxFAIL_MSG("Reference count of native tool was illegal before removal"); + } + wxASSERT( IsValidControlHandle(tool2->GetControl()->GetPeer()->GetControlRef() )) ; } err = HIToolbarRemoveItemAtIndex(refTB, idx); @@ -1211,7 +1207,11 @@ bool wxToolBar::Realize() if ( tool2->IsControl() ) { CFIndex count = CFGetRetainCount( tool2->GetControl()->GetPeer()->GetControlRef() ) ; - wxASSERT_MSG( count == 2 , wxT("Reference Count of native tool was not 2 after removal") ); + if ( count != 2 ) + { + wxFAIL_MSG("Reference count of native tool was not 2 after removal"); + } + wxASSERT( IsValidControlHandle(tool2->GetControl()->GetPeer()->GetControlRef() )) ; } @@ -1230,7 +1230,10 @@ bool wxToolBar::Realize() if ( tool->IsControl() ) { CFIndex count = CFGetRetainCount( tool->GetControl()->GetPeer()->GetControlRef() ) ; - wxASSERT_MSG( count == 3 || count == 2, wxT("Reference Count of native tool was illegal after insertion") ); + if ( count != 3 && count != 2 ) + { + wxFAIL_MSG("Reference count of native tool was illegal before removal"); + } wxASSERT( IsValidControlHandle(tool->GetControl()->GetPeer()->GetControlRef() )) ; } } @@ -1457,11 +1460,16 @@ 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 + wxString label = tool->GetLabel(); + if (m_macHIToolbarRef && !label.empty() ) + { + // strip mnemonics from the label for compatibility + // with the usual labels in wxStaticText sense + label = wxStripMenuCodes(label); + } +#endif // wxMAC_USE_NATIVE_TOOLBAR switch (tool->GetStyle()) { @@ -1479,6 +1487,7 @@ bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolBase) #if wxMAC_USE_NATIVE_TOOLBAR if (m_macHIToolbarRef != NULL) { + HIToolbarItemRef item; err = HIToolbarItemCreate( kHIToolbarSeparatorIdentifier, kHIToolbarItemCantBeRemoved | kHIToolbarItemIsSeparator | kHIToolbarItemAllowDuplicates, @@ -1499,11 +1508,15 @@ bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolBase) { wxASSERT( tool->GetControlHandle() == NULL ); ControlButtonContentInfo info; - wxMacCreateBitmapButton( &info, tool->GetNormalBitmap(), kControlContentIconRef ); + wxMacCreateBitmapButton( &info, tool->GetNormalBitmap() ); if ( UMAGetSystemVersion() >= 0x1000) { + // contrary to the docs this control only works with iconrefs + ControlButtonContentInfo info; + wxMacCreateBitmapButton( &info, tool->GetNormalBitmap(), kControlContentIconRef ); CreateIconControl( window, &toolrect, &info, false, &controlHandle ); + wxMacReleaseBitmapButton( &info ); } else { @@ -1518,19 +1531,25 @@ bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolBase) #if wxMAC_USE_NATIVE_TOOLBAR if (m_macHIToolbarRef != NULL) { - wxString labelStr = wxString::Format(wxT("%xd"), (int)tool); + HIToolbarItemRef item; + wxString labelStr = wxString::Format(wxT("%p"), tool); err = HIToolbarItemCreate( - wxMacCFStringHolder(labelStr, wxFont::GetDefaultEncoding()), + wxCFStringRef(labelStr, wxFont::GetDefaultEncoding()), kHIToolbarItemCantBeRemoved | kHIToolbarItemAnchoredLeft | kHIToolbarItemAllowDuplicates, &item ); if (err == noErr) { + ControlButtonContentInfo info2; + wxMacCreateBitmapButton( &info2, tool->GetNormalBitmap(), kControlContentCGImageRef); + InstallEventHandler( HIObjectGetEventTarget(item), GetwxMacToolBarEventHandlerUPP(), GetEventTypeCount(toolBarEventList), toolBarEventList, tool, NULL ); - - HIToolbarItemSetIconRef( item, info.u.iconRef ); + HIToolbarItemSetLabel( item, wxCFStringRef(label, GetFont().GetEncoding()) ); + HIToolbarItemSetImage( item, info2.u.imageRef ); HIToolbarItemSetCommandID( item, kHIToolbarCommandPressAction ); tool->SetToolbarItemRef( item ); + + wxMacReleaseBitmapButton( &info2 ); } } else @@ -1541,7 +1560,7 @@ bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolBase) #if 0 SetBevelButtonTextPlacement( m_controlHandle, kControlBevelButtonPlaceBelowGraphic ); - UMASetControlTitle( m_controlHandle, label, wxFont::GetDefaultEncoding() ); + SetControlTitleWithCFString( m_controlHandle , wxCFStringRef( label, wxFont::GetDefaultEncoding() ); #endif InstallControlEventHandler( @@ -1558,7 +1577,7 @@ bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolBase) if (m_macHIToolbarRef != NULL) { wxCHECK_MSG( tool->GetControl(), false, _T("control must be non-NULL") ); - + HIToolbarItemRef item; HIViewRef viewRef = (HIViewRef) tool->GetControl()->GetHandle() ; CFDataRef data = CFDataCreate( kCFAllocatorDefault , (UInt8*) &viewRef , sizeof(viewRef) ) ; err = HIToolbarCreateItemWithIdentifier((HIToolbarRef) m_macHIToolbarRef,kControlToolbarItemClassID, @@ -1584,19 +1603,6 @@ bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolBase) break; } -#if wxMAC_USE_NATIVE_TOOLBAR - wxString label = tool->GetLabel(); - if (m_macHIToolbarRef && !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 ) @@ -1604,7 +1610,7 @@ bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolBase) ControlRef container = (ControlRef) GetHandle(); wxASSERT_MSG( container != NULL, wxT("No valid Mac container control") ); - UMAShowControl( controlHandle ); + SetControlVisibility( controlHandle, true, true ); ::EmbedControl( controlHandle, container ); } @@ -1645,8 +1651,6 @@ bool wxToolBar::DoDeleteTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolbase) wxSize sz = ((wxToolBarTool*)tool)->GetSize(); - tool->Detach(); - #if wxMAC_USE_NATIVE_TOOLBAR CFIndex removeIndex = tool->GetIndex(); #endif @@ -1661,21 +1665,7 @@ bool wxToolBar::DoDeleteTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolbase) } } #endif - switch ( tool->GetStyle() ) - { - case wxTOOL_STYLE_CONTROL: - if ( tool->GetControl() ) - tool->GetControl()->Destroy(); - break; - case wxTOOL_STYLE_BUTTON: - case wxTOOL_STYLE_SEPARATOR: - // nothing special - break; - - default: - break; - } tool->ClearControl(); // and finally reposition all the controls after this one @@ -1722,10 +1712,8 @@ void wxToolBar::OnPaint(wxPaintEvent& event) GetSize( &w, &h ); bool drawMetalTheme = MacGetTopLevelWindow()->MacGetMetalAppearance(); - bool minimumUmaAvailable = (UMAGetSystemVersion() >= 0x1030); -#if wxMAC_USE_CORE_GRAPHICS && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3 - if ( !drawMetalTheme && minimumUmaAvailable ) + if ( !drawMetalTheme ) { HIThemePlacardDrawInfo info; memset( &info, 0, sizeof(info) ); @@ -1741,57 +1729,6 @@ void wxToolBar::OnPaint(wxPaintEvent& event) // leave the background as it is (striped or metal) } -#else - - const bool drawBorder = true; - - if (drawBorder) - { - wxMacPortSetter helper( &dc ); - - if ( !drawMetalTheme || !minimumUmaAvailable ) - { - Rect toolbarrect = { dc.YLOG2DEVMAC(0), dc.XLOG2DEVMAC(0), - dc.YLOG2DEVMAC(h), dc.XLOG2DEVMAC(w) }; - -#if 0 - if ( toolbarrect.left < 0 ) - toolbarrect.left = 0; - if ( toolbarrect.top < 0 ) - toolbarrect.top = 0; -#endif - - UMADrawThemePlacard( &toolbarrect, IsEnabled() ? kThemeStateActive : kThemeStateInactive ); - } - else - { -#if TARGET_API_MAC_OSX - HIRect hiToolbarrect = CGRectMake( - dc.YLOG2DEVMAC(0), dc.XLOG2DEVMAC(0), - dc.YLOG2DEVREL(h), dc.XLOG2DEVREL(w) ); - CGContextRef cgContext; - Rect bounds; - - GetPortBounds( (CGrafPtr) dc.m_macPort, &bounds ); - QDBeginCGContext( (CGrafPtr) dc.m_macPort, &cgContext ); - - CGContextTranslateCTM( cgContext, 0, bounds.bottom - bounds.top ); - CGContextScaleCTM( cgContext, 1, -1 ); - - HIThemeBackgroundDrawInfo drawInfo; - drawInfo.version = 0; - drawInfo.state = kThemeStateActive; - drawInfo.kind = kThemeBackgroundMetal; - HIThemeApplyBackground( &hiToolbarrect, &drawInfo, cgContext, kHIThemeOrientationNormal ); - -#ifndef __LP64__ - QDEndCGContext( (CGrafPtr) dc.m_macPort, &cgContext ); -#endif -#endif - } - } -#endif - event.Skip(); }