X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/83f787ba2137594f12c7bd0659dc3c2fb973598f..90f58090f638b6e2b136e2cb61ad26d55c76747b:/src/mac/carbon/toolbar.cpp diff --git a/src/mac/carbon/toolbar.cpp b/src/mac/carbon/toolbar.cpp index 61fdc4325a..7f12f1cc6b 100644 --- a/src/mac/carbon/toolbar.cpp +++ b/src/mac/carbon/toolbar.cpp @@ -72,8 +72,8 @@ public: const wxString& shortHelp, const wxString& longHelp ); - wxToolBarTool(wxToolBar *tbar, wxControl *control) - : wxToolBarToolBase(tbar, control) + wxToolBarTool(wxToolBar *tbar, wxControl *control, const wxString& label) + : wxToolBarToolBase(tbar, control, label) { Init(); if (control != NULL) @@ -168,10 +168,19 @@ public: m_toolbarItemRef = ref; if ( m_toolbarItemRef ) { + wxFont f; + wxFontEncoding enc; + if ( GetToolBar() ) + f = GetToolBar()->GetFont(); + if ( f.IsOk() ) + enc = f.GetEncoding(); + else + enc = wxFont::GetDefaultEncoding(); + HIToolbarItemSetHelpText( m_toolbarItemRef, - wxMacCFStringHolder( GetShortHelp(), GetToolBar()->GetFont().GetEncoding() ), - wxMacCFStringHolder( GetLongHelp(), GetToolBar()->GetFont().GetEncoding() ) ); + wxMacCFStringHolder( GetShortHelp(), enc ), + wxMacCFStringHolder( GetLongHelp(), enc ) ); } } @@ -453,7 +462,7 @@ void wxToolBarTool::UpdateToggleImage( bool toggle ) dc.DrawBitmap( m_bmpNormal, 0, 0, true ); dc.SelectObject( wxNullBitmap ); ControlButtonContentInfo info; - wxMacCreateBitmapButton( &info, bmp ); + wxMacCreateBitmapButton( &info, bmp, kControlContentIconRef ); SetControlData( m_controlHandle, 0, kControlIconContentTag, sizeof(info), (Ptr)&info ); #if wxMAC_USE_NATIVE_TOOLBAR if (m_toolbarItemRef != NULL) @@ -466,7 +475,7 @@ void wxToolBarTool::UpdateToggleImage( bool toggle ) else { ControlButtonContentInfo info; - wxMacCreateBitmapButton( &info, m_bmpNormal ); + wxMacCreateBitmapButton( &info, m_bmpNormal, kControlContentIconRef ); SetControlData( m_controlHandle, 0, kControlIconContentTag, sizeof(info), (Ptr)&info ); #if wxMAC_USE_NATIVE_TOOLBAR if (m_toolbarItemRef != NULL) @@ -524,9 +533,10 @@ wxToolBarToolBase *wxToolBar::CreateTool( clientData, shortHelp, longHelp ); } -wxToolBarToolBase * wxToolBar::CreateTool( wxControl *control ) +wxToolBarToolBase * +wxToolBar::CreateTool(wxControl *control, const wxString& label) { - return new wxToolBarTool( this, control ); + return new wxToolBarTool(this, control, label); } void wxToolBar::Init() @@ -544,26 +554,26 @@ void wxToolBar::Init() #define kControlToolbarItemClassID CFSTR( "org.wxwidgets.controltoolbaritem" ) -const EventTypeSpec kEvents[] = +const EventTypeSpec kEvents[] = { { kEventClassHIObject, kEventHIObjectConstruct }, { kEventClassHIObject, kEventHIObjectInitialize }, { kEventClassHIObject, kEventHIObjectDestruct }, - + { kEventClassToolbarItem, kEventToolbarItemCreateCustomView } }; -const EventTypeSpec kViewEvents[] = -{ - { kEventClassControl, kEventControlGetSizeConstraints } +const EventTypeSpec kViewEvents[] = +{ + { kEventClassControl, kEventControlGetSizeConstraints } }; -struct ControlToolbarItem -{ - HIToolbarItemRef toolbarItem; +struct ControlToolbarItem +{ + HIToolbarItemRef toolbarItem; HIViewRef viewRef; wxSize lastValidSize ; -}; +}; static pascal OSStatus ControlToolbarItemHandler( EventHandlerCallRef inCallRef, EventRef inEvent, void* inUserData ) { @@ -579,20 +589,20 @@ static pascal OSStatus ControlToolbarItemHandler( EventHandlerCallRef inCallRef, { HIObjectRef toolbarItem; ControlToolbarItem* item; - + GetEventParameter( inEvent, kEventParamHIObjectInstance, typeHIObjectRef, NULL, sizeof( HIObjectRef ), NULL, &toolbarItem ); - + item = (ControlToolbarItem*) malloc(sizeof(ControlToolbarItem)) ; item->toolbarItem = toolbarItem ; item->viewRef = NULL ; - + SetEventParameter( inEvent, kEventParamHIObjectInstance, typeVoidPtr, sizeof( void * ), &item ); - + result = noErr ; } break; - + case kEventHIObjectInitialize: result = CallNextEventHandler( inCallRef, inEvent ); if ( result == noErr ) @@ -600,12 +610,12 @@ static pascal OSStatus ControlToolbarItemHandler( EventHandlerCallRef inCallRef, CFDataRef data; GetEventParameter( inEvent, kEventParamToolbarItemConfigData, typeCFTypeRef, NULL, sizeof( CFTypeRef ), NULL, &data ); - + HIViewRef viewRef ; - + wxASSERT_MSG( CFDataGetLength( data ) == sizeof( viewRef ) , wxT("Illegal Data passed") ) ; memcpy( &viewRef , CFDataGetBytePtr( data ) , sizeof( viewRef ) ) ; - + object->viewRef = (HIViewRef) viewRef ; result = noErr ; @@ -619,7 +629,7 @@ static pascal OSStatus ControlToolbarItemHandler( EventHandlerCallRef inCallRef, HIViewRef viewRef = object->viewRef ; if( viewRef && IsValidControlHandle( viewRef) ) { - CFIndex count = CFGetRetainCount( viewRef ) ; + CFIndex count = CFGetRetainCount( viewRef ) ; if ( count >= 1 ) CFRelease( viewRef ) ; } @@ -629,10 +639,10 @@ static pascal OSStatus ControlToolbarItemHandler( EventHandlerCallRef inCallRef, break; } break; - + case kEventClassToolbarItem: switch ( GetEventKind( inEvent ) ) - { + { case kEventToolbarItemCreateCustomView: { HIViewRef viewRef = object->viewRef ; @@ -641,13 +651,13 @@ static pascal OSStatus ControlToolbarItemHandler( EventHandlerCallRef inCallRef, HIViewSetVisible(viewRef, true) ; InstallEventHandler( GetControlEventTarget( viewRef ), ControlToolbarItemHandler, GetEventTypeCount( kViewEvents ), kViewEvents, object, NULL ); - + result = SetEventParameter( inEvent, kEventParamControlRef, typeControlRef, sizeof( HIViewRef ), &viewRef ); } break; } break; - + case kEventClassControl: switch ( GetEventKind( inEvent ) ) { @@ -666,14 +676,14 @@ static pascal OSStatus ControlToolbarItemHandler( EventHandlerCallRef inCallRef, object->lastValidSize = sz ; else sz = object->lastValidSize ; - + HISize min, max; min.width = max.width = sz.x ; min.height = max.height = sz.y ; - + result = SetEventParameter( inEvent, kEventParamMinimumSize, typeHISize, sizeof( HISize ), &min ); - + result = SetEventParameter( inEvent, kEventParamMaximumSize, typeHISize, sizeof( HISize ), &max ); result = noErr ; @@ -683,19 +693,19 @@ static pascal OSStatus ControlToolbarItemHandler( EventHandlerCallRef inCallRef, } break; } - + return result; } void RegisterControlToolbarItemClass() { static bool sRegistered; - + if ( !sRegistered ) { HIObjectRegisterSubclass( kControlToolbarItemClassID, kHIToolbarItemClassID, 0, ControlToolbarItemHandler, GetEventTypeCount( kEvents ), kEvents, 0, NULL ); - + sRegistered = true; } } @@ -703,26 +713,26 @@ void RegisterControlToolbarItemClass() HIToolbarItemRef CreateControlToolbarItem(CFStringRef inIdentifier, CFTypeRef inConfigData) { RegisterControlToolbarItemClass(); - + OSStatus err; EventRef event; UInt32 options = kHIToolbarItemAllowDuplicates; HIToolbarItemRef result = NULL; - + err = CreateEvent( NULL, kEventClassHIObject, kEventHIObjectInitialize, GetCurrentEventTime(), 0, &event ); require_noerr( err, CantCreateEvent ); - + SetEventParameter( event, kEventParamAttributes, typeUInt32, sizeof( UInt32 ), &options ); SetEventParameter( event, kEventParamToolbarItemIdentifier, typeCFStringRef, sizeof( CFStringRef ), &inIdentifier ); - + if ( inConfigData ) SetEventParameter( event, kEventParamToolbarItemConfigData, typeCFTypeRef, sizeof( CFTypeRef ), &inConfigData ); - + err = HIObjectCreate( kControlToolbarItemClassID, event, (HIObjectRef*)&result ); check_noerr( err ); - + ReleaseEvent( event ); -CantCreateEvent : +CantCreateEvent : return result ; } @@ -752,7 +762,7 @@ static OSStatus ToolbarDelegateHandler( EventHandlerCallRef inCallRef, EventRef result = noErr; } break; - + case kEventToolbarGetAllowedIdentifiers: { GetEventParameter( inEvent, kEventParamMutableArray, typeCFMutableArrayRef, NULL, @@ -767,13 +777,13 @@ static OSStatus ToolbarDelegateHandler( EventHandlerCallRef inCallRef, EventRef HIToolbarItemRef item = NULL; CFTypeRef data = NULL; CFStringRef identifier = NULL ; - + GetEventParameter( inEvent, kEventParamToolbarItemIdentifier, typeCFStringRef, NULL, sizeof( CFStringRef ), NULL, &identifier ); - + GetEventParameter( inEvent, kEventParamToolbarItemConfigData, typeCFTypeRef, NULL, sizeof( CFTypeRef ), NULL, &data ); - + if ( CFStringCompare( kControlToolbarItemClassID, identifier, kCFCompareBackwards ) == kCFCompareEqualTo ) { item = CreateControlToolbarItem( kControlToolbarItemClassID, data ); @@ -784,7 +794,7 @@ static OSStatus ToolbarDelegateHandler( EventHandlerCallRef inCallRef, EventRef result = noErr; } } - + } break; } @@ -834,7 +844,7 @@ bool wxToolBar::Create( HIToolbarSetDisplayMode( (HIToolbarRef) m_macHIToolbarRef, mode ); HIToolbarSetDisplaySize( (HIToolbarRef) m_macHIToolbarRef, displaySize ); } -#endif +#endif // wxMAC_USE_NATIVE_TOOLBAR return (err == noErr); } @@ -1312,6 +1322,33 @@ void wxToolBar::MacSuperChangedPosition() #endif } +void wxToolBar::SetToolNormalBitmap( int id, const wxBitmap& bitmap ) +{ + wxToolBarTool* tool = wx_static_cast(wxToolBarTool*, FindById(id)); + if ( tool ) + { + wxCHECK_RET( tool->IsButton(), wxT("Can only set bitmap on button tools.")); + + tool->SetNormalBitmap(bitmap); + + // a side-effect of the UpdateToggleImage function is that it always changes the bitmap used on the button. + tool->UpdateToggleImage( tool->CanBeToggled() && tool->IsToggled() ); + } +} + +void wxToolBar::SetToolDisabledBitmap( int id, const wxBitmap& bitmap ) +{ + wxToolBarTool* tool = wx_static_cast(wxToolBarTool*, FindById(id)); + if ( tool ) + { + wxCHECK_RET( tool->IsButton(), wxT("Can only set bitmap on button tools.")); + + tool->SetDisabledBitmap(bitmap); + + // TODO: what to do for this one? + } +} + wxToolBarToolBase *wxToolBar::FindToolForPosition(wxCoord x, wxCoord y) const { wxToolBarTool *tool; @@ -1365,6 +1402,11 @@ 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 switch (tool->GetStyle()) { @@ -1378,21 +1420,18 @@ bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolBase) 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 +#endif // wxMAC_USE_NATIVE_TOOLBAR CreateSeparatorControl( window, &toolrect, &controlHandle ); tool->SetControlHandle( controlHandle ); -#endif } break; @@ -1417,7 +1456,6 @@ bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolBase) } #if wxMAC_USE_NATIVE_TOOLBAR - HIToolbarItemRef item; wxString labelStr = wxString::Format(wxT("%xd"), (int)tool); err = HIToolbarItemCreate( wxMacCFStringHolder(labelStr, wxFont::GetDefaultEncoding()), @@ -1427,12 +1465,12 @@ bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolBase) 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 ); } -#endif +#endif // wxMAC_USE_NATIVE_TOOLBAR wxMacReleaseBitmapButton( &info ); @@ -1460,8 +1498,8 @@ bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolBase) // reference count to make sure we are not dealing with zombie controls after the native toolbar has released its views CFRetain( viewRef ) ; CFDataRef data = CFDataCreate( kCFAllocatorDefault , (UInt8*) &viewRef , sizeof(viewRef) ) ; - err = HIToolbarCreateItemWithIdentifier((HIToolbarRef) m_macHIToolbarRef,kControlToolbarItemClassID, - data , &item ) ; + err = HIToolbarCreateItemWithIdentifier((HIToolbarRef) m_macHIToolbarRef,kControlToolbarItemClassID, + data , &item ) ; if (err == noErr) { @@ -1479,6 +1517,19 @@ bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolBase) break; } +#if wxMAC_USE_NATIVE_TOOLBAR + wxString label = tool->GetLabel(); + if ( !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 ) @@ -1494,7 +1545,6 @@ bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolBase) tool->UpdateToggleImage( true ); // nothing special to do here - we relayout in Realize() later - tool->Attach( this ); InvalidateBestSize(); } else