/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_toolkit.hxx" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using rtl::OUString; using rtl::OUStringBuffer; DBG_NAME(VCLXMenu) VCLXMenu::VCLXMenu() : maMenuListeners( *this ) { DBG_CTOR( VCLXMenu, 0 ); mpMenu = NULL; } VCLXMenu::VCLXMenu( Menu* pMenu ) : maMenuListeners( *this ) { DBG_CTOR( VCLXMenu, 0 ); mpMenu = pMenu; } VCLXMenu::~VCLXMenu() { DBG_DTOR( VCLXMenu, 0 ); for ( sal_uInt32 n = maPopupMenueRefs.Count(); n; ) { css::uno::Reference< css::awt::XPopupMenu > * pRef = maPopupMenueRefs.GetObject( --n ); delete pRef; } if ( mpMenu ) { mpMenu->RemoveEventListener( LINK( this, VCLXMenu, MenuEventListener ) ); delete mpMenu; } } sal_Bool VCLXMenu::IsPopupMenu() const { return (mpMenu && ! mpMenu->IsMenuBar()); } void VCLXMenu::ImplCreateMenu( sal_Bool bPopup ) { DBG_ASSERT( !mpMenu, "CreateMenu: Menu exists!" ); if ( bPopup ) mpMenu = new PopupMenu; else mpMenu = new MenuBar; mpMenu->AddEventListener( LINK( this, VCLXMenu, MenuEventListener ) ); } IMPL_LINK( VCLXMenu, MenuEventListener, VclSimpleEvent*, pEvent ) { DBG_ASSERT( pEvent && pEvent->ISA( VclMenuEvent ), "Unknown Event!" ); if ( pEvent && pEvent->ISA( VclMenuEvent ) ) { DBG_ASSERT( ((VclMenuEvent*)pEvent)->GetMenu() && mpMenu, "Menu???" ); VclMenuEvent* pMenuEvent = (VclMenuEvent*)pEvent; if ( pMenuEvent->GetMenu() == mpMenu ) // Also called for the root menu { switch ( pMenuEvent->GetId() ) { case VCLEVENT_MENU_SELECT: { if ( maMenuListeners.getLength() ) { css::awt::MenuEvent aEvent; aEvent.Source = (::cppu::OWeakObject*)this; aEvent.MenuId = mpMenu->GetCurItemId(); maMenuListeners.itemSelected( aEvent ); } } break; case VCLEVENT_OBJECT_DYING: { mpMenu = NULL; } break; case VCLEVENT_MENU_HIGHLIGHT: { if ( maMenuListeners.getLength() ) { css::awt::MenuEvent aEvent; aEvent.Source = (::cppu::OWeakObject*)this; aEvent.MenuId = mpMenu->GetCurItemId(); maMenuListeners.itemHighlighted( aEvent ); } } break; case VCLEVENT_MENU_ACTIVATE: { if ( maMenuListeners.getLength() ) { css::awt::MenuEvent aEvent; aEvent.Source = (::cppu::OWeakObject*)this; aEvent.MenuId = mpMenu->GetCurItemId(); maMenuListeners.itemActivated( aEvent ); } } break; case VCLEVENT_MENU_DEACTIVATE: { if ( maMenuListeners.getLength() ) { css::awt::MenuEvent aEvent; aEvent.Source = (::cppu::OWeakObject*)this; aEvent.MenuId = mpMenu->GetCurItemId(); maMenuListeners.itemDeactivated( aEvent ); } } break; // ignore accessibility events case VCLEVENT_MENU_ENABLE: case VCLEVENT_MENU_INSERTITEM: case VCLEVENT_MENU_REMOVEITEM: case VCLEVENT_MENU_SUBMENUACTIVATE: case VCLEVENT_MENU_SUBMENUDEACTIVATE: case VCLEVENT_MENU_SUBMENUCHANGED: case VCLEVENT_MENU_DEHIGHLIGHT: case VCLEVENT_MENU_DISABLE: case VCLEVENT_MENU_ITEMTEXTCHANGED: case VCLEVENT_MENU_ITEMCHECKED: case VCLEVENT_MENU_ITEMUNCHECKED: case VCLEVENT_MENU_SHOW: case VCLEVENT_MENU_HIDE: break; default: DBG_ERROR( "MenuEventListener - Unknown event!" ); } } } return 0; } OUString SAL_CALL VCLXMenu::getImplementationName( ) throw (css::uno::RuntimeException) { ::osl::ResettableGuard < ::osl::Mutex > aGuard( GetMutex() ); const sal_Bool bIsPopupMenu = IsPopupMenu(); aGuard.clear(); OUStringBuffer implName; implName.appendAscii( RTL_CONSTASCII_STRINGPARAM( "stardiv.Toolkit." ) ); if ( bIsPopupMenu ) implName.appendAscii( RTL_CONSTASCII_STRINGPARAM( "VCLXPopupMenu" ) ); else implName.appendAscii( RTL_CONSTASCII_STRINGPARAM( "VCLXMenuBar" ) ); return implName.makeStringAndClear(); } css::uno::Sequence< OUString > SAL_CALL VCLXMenu::getSupportedServiceNames( ) throw (css::uno::RuntimeException) { ::osl::ResettableGuard < ::osl::Mutex > aGuard( GetMutex() ); const sal_Bool bIsPopupMenu = IsPopupMenu(); aGuard.clear(); css::uno::Sequence< OUString > aNames( 1 ); if ( bIsPopupMenu ) aNames[ 0 ] = OUString::createFromAscii( szServiceName2_PopupMenu ); else aNames[ 0 ] = OUString::createFromAscii( szServiceName2_MenuBar ); return aNames; } ::sal_Bool SAL_CALL VCLXMenu::supportsService( const OUString& rServiceName ) throw (css::uno::RuntimeException) { css::uno::Sequence< OUString > aServiceNames( getSupportedServiceNames() ); if ( aServiceNames[ 0 ] == rServiceName ) return sal_True; return sal_False; } css::uno::Any VCLXMenu::queryInterface( const css::uno::Type & rType ) throw(css::uno::RuntimeException) { ::osl::ResettableGuard < ::osl::Mutex > aGuard( GetMutex() ); const sal_Bool bIsPopupMenu = IsPopupMenu(); aGuard.clear(); css::uno::Any aRet; if ( bIsPopupMenu ) aRet = ::cppu::queryInterface( rType, SAL_STATIC_CAST( css::awt::XMenu*, (css::awt::XPopupMenu*) this ), SAL_STATIC_CAST( css::awt::XPopupMenu*, this ), SAL_STATIC_CAST( css::lang::XTypeProvider*, this ), SAL_STATIC_CAST( css::lang::XServiceInfo*, this ), SAL_STATIC_CAST( css::lang::XUnoTunnel*, this ) ); else aRet = ::cppu::queryInterface( rType, SAL_STATIC_CAST( css::awt::XMenu*, (css::awt::XMenuBar*) this ), SAL_STATIC_CAST( css::awt::XMenuBar*, this ), SAL_STATIC_CAST( css::lang::XTypeProvider*, this ), SAL_STATIC_CAST( css::lang::XServiceInfo*, this ), SAL_STATIC_CAST( css::lang::XUnoTunnel*, this ) ); return (aRet.hasValue() ? aRet : OWeakObject::queryInterface( rType )); } IMPL_XUNOTUNNEL( VCLXMenu ) css::uno::Sequence< css::uno::Type > VCLXMenu::getTypes() throw(css::uno::RuntimeException) { ::osl::ResettableGuard < ::osl::Mutex > aGuard( GetMutex() ); const sal_Bool bIsPopupMenu = IsPopupMenu(); aGuard.clear(); static ::cppu::OTypeCollection* pCollectionMenuBar = NULL; static ::cppu::OTypeCollection* pCollectionPopupMenu = NULL; if ( bIsPopupMenu ) { if( !pCollectionPopupMenu ) { ::osl::Guard< ::osl::Mutex > aGlobalGuard( ::osl::Mutex::getGlobalMutex() ); if( !pCollectionPopupMenu ) { static ::cppu::OTypeCollection collectionPopupMenu( getCppuType( ( css::uno::Reference< css::lang::XTypeProvider>* ) NULL ), getCppuType( ( css::uno::Reference< css::awt::XMenu>* ) NULL ), getCppuType( ( css::uno::Reference< css::awt::XPopupMenu>* ) NULL ), getCppuType( ( css::uno::Reference< css::lang::XServiceInfo>* ) NULL ) ); pCollectionPopupMenu = &collectionPopupMenu; } } return (*pCollectionPopupMenu).getTypes(); } else { if( !pCollectionMenuBar ) { ::osl::Guard< ::osl::Mutex > aGlobalGuard( ::osl::Mutex::getGlobalMutex() ); if( !pCollectionMenuBar ) { static ::cppu::OTypeCollection collectionMenuBar( getCppuType( ( css::uno::Reference< css::lang::XTypeProvider>* ) NULL ), getCppuType( ( css::uno::Reference< css::awt::XMenu>* ) NULL ), getCppuType( ( css::uno::Reference< css::awt::XMenuBar>* ) NULL ), getCppuType( ( css::uno::Reference< css::lang::XServiceInfo>* ) NULL ) ); pCollectionMenuBar = &collectionMenuBar; } } return (*pCollectionMenuBar).getTypes(); } } css::uno::Sequence< sal_Int8 > VCLXMenu::getImplementationId() throw(css::uno::RuntimeException) { ::osl::ResettableGuard < ::osl::Mutex > aGuard( GetMutex() ); const sal_Bool bIsPopupMenu = IsPopupMenu(); aGuard.clear(); static ::cppu::OImplementationId* pIdMenuBar = NULL; static ::cppu::OImplementationId* pIdPopupMenu = NULL; if ( bIsPopupMenu ) { if( !pIdPopupMenu ) { ::osl::Guard< ::osl::Mutex > aGlobalGuard( ::osl::Mutex::getGlobalMutex() ); if( !pIdPopupMenu ) { static ::cppu::OImplementationId idPopupMenu( sal_False ); pIdPopupMenu = &idPopupMenu; } } return (*pIdPopupMenu).getImplementationId(); } else { if( !pIdMenuBar ) { ::osl::Guard< ::osl::Mutex > aGlobalGuard( ::osl::Mutex::getGlobalMutex() ); if( !pIdMenuBar ) { static ::cppu::OImplementationId idMenuBar( sal_False ); pIdMenuBar = &idMenuBar; } } return (*pIdMenuBar).getImplementationId(); } } void VCLXMenu::addMenuListener( const css::uno::Reference< css::awt::XMenuListener >& rxListener ) throw(css::uno::RuntimeException) { ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); maMenuListeners.addInterface( rxListener ); } void VCLXMenu::removeMenuListener( const css::uno::Reference< css::awt::XMenuListener >& rxListener ) throw(css::uno::RuntimeException) { ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); maMenuListeners.removeInterface( rxListener ); } void VCLXMenu::insertItem( sal_Int16 nItemId, const OUString& aText, sal_Int16 nItemStyle, sal_Int16 nPos ) throw(css::uno::RuntimeException) { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); if ( mpMenu ) mpMenu->InsertItem( nItemId, aText, (MenuItemBits)nItemStyle, nPos ); } void VCLXMenu::removeItem( sal_Int16 nPos, sal_Int16 nCount ) throw(css::uno::RuntimeException) { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); sal_Int32 nItemCount = (sal_Int32)mpMenu->GetItemCount(); if ( mpMenu && ( nCount > 0 ) && ( nPos >= 0 ) && ( nPos < nItemCount ) && ( nItemCount > 0 )) { sal_Int16 nP = sal::static_int_cast< sal_Int16 >( Min( (int)(nPos+nCount), (int)nItemCount )); while( nP-nPos > 0 ) mpMenu->RemoveItem( --nP ); } } sal_Int16 VCLXMenu::getItemCount( ) throw(css::uno::RuntimeException) { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); return mpMenu ? mpMenu->GetItemCount() : 0; } sal_Int16 VCLXMenu::getItemId( sal_Int16 nPos ) throw(css::uno::RuntimeException) { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); return mpMenu ? mpMenu->GetItemId( nPos ) : 0; } sal_Int16 VCLXMenu::getItemPos( sal_Int16 nId ) throw(css::uno::RuntimeException) { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); return mpMenu ? mpMenu->GetItemPos( nId ) : 0; } void VCLXMenu::enableItem( sal_Int16 nItemId, sal_Bool bEnable ) throw(css::uno::RuntimeException) { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); if ( mpMenu ) mpMenu->EnableItem( nItemId, bEnable ); } sal_Bool VCLXMenu::isItemEnabled( sal_Int16 nItemId ) throw(css::uno::RuntimeException) { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); return mpMenu ? mpMenu->IsItemEnabled( nItemId ) : sal_False; } void VCLXMenu::setItemText( sal_Int16 nItemId, const OUString& aText ) throw(css::uno::RuntimeException) { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); if ( mpMenu ) mpMenu->SetItemText( nItemId, aText ); } OUString VCLXMenu::getItemText( sal_Int16 nItemId ) throw(css::uno::RuntimeException) { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); OUString aItemText; if ( mpMenu ) aItemText = mpMenu->GetItemText( nItemId ); return aItemText; } void VCLXMenu::setPopupMenu( sal_Int16 nItemId, const css::uno::Reference< css::awt::XPopupMenu >& rxPopupMenu ) throw(css::uno::RuntimeException) { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); VCLXMenu* pVCLMenu = VCLXMenu::GetImplementation( rxPopupMenu ); DBG_ASSERT( pVCLMenu && pVCLMenu->GetMenu() && pVCLMenu->IsPopupMenu(), "setPopupMenu: Invalid Menu!" ); if ( mpMenu && pVCLMenu && pVCLMenu->GetMenu() && pVCLMenu->IsPopupMenu() ) { // Selbst eine Ref halten! css::uno::Reference< css::awt::XPopupMenu > * pNewRef = new css::uno::Reference< css::awt::XPopupMenu > ; *pNewRef = rxPopupMenu; maPopupMenueRefs.Insert( pNewRef, LIST_APPEND ); mpMenu->SetPopupMenu( nItemId, (PopupMenu*) pVCLMenu->GetMenu() ); } } css::uno::Reference< css::awt::XPopupMenu > VCLXMenu::getPopupMenu( sal_Int16 nItemId ) throw(css::uno::RuntimeException) { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); css::uno::Reference< css::awt::XPopupMenu > aRef; Menu* pMenu = mpMenu ? mpMenu->GetPopupMenu( nItemId ) : NULL; if ( pMenu ) { for ( sal_uInt32 n = maPopupMenueRefs.Count(); n; ) { css::uno::Reference< css::awt::XPopupMenu > * pRef = maPopupMenueRefs.GetObject( --n ); Menu* pM = ((VCLXMenu*)pRef->get())->GetMenu(); if ( pM == pMenu ) { aRef = *pRef; break; } } } return aRef; } // css::awt::XPopupMenu void VCLXMenu::insertSeparator( sal_Int16 nPos ) throw(css::uno::RuntimeException) { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); if ( mpMenu ) mpMenu->InsertSeparator( nPos ); } void VCLXMenu::setDefaultItem( sal_Int16 nItemId ) throw(css::uno::RuntimeException) { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); if ( mpMenu ) mpMenu->SetDefaultItem( nItemId ); } sal_Int16 VCLXMenu::getDefaultItem( ) throw(css::uno::RuntimeException) { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); return mpMenu ? mpMenu->GetDefaultItem() : 0; } void VCLXMenu::checkItem( sal_Int16 nItemId, sal_Bool bCheck ) throw(css::uno::RuntimeException) { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); if ( mpMenu ) mpMenu->CheckItem( nItemId, bCheck ); } sal_Bool VCLXMenu::isItemChecked( sal_Int16 nItemId ) throw(css::uno::RuntimeException) { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); return mpMenu ? mpMenu->IsItemChecked( nItemId ) : sal_False; } sal_Int16 VCLXMenu::execute( const css::uno::Reference< css::awt::XWindowPeer >& rxWindowPeer, const css::awt::Rectangle& rPos, sal_Int16 nFlags ) throw(css::uno::RuntimeException) { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); sal_Int16 nRet = 0; if ( mpMenu && IsPopupMenu() ) { nRet = ((PopupMenu*)mpMenu)->Execute( VCLUnoHelper::GetWindow( rxWindowPeer ), VCLRectangle( rPos ), nFlags | POPUPMENU_NOMOUSEUPCLOSE ); } return nRet; } void SAL_CALL VCLXMenu::setCommand( sal_Int16 nItemId, const OUString& aCommand ) throw (css::uno::RuntimeException) { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); if ( mpMenu ) mpMenu->SetItemCommand( nItemId, aCommand ); } OUString SAL_CALL VCLXMenu::getCommand( sal_Int16 nItemId ) throw (css::uno::RuntimeException) { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); OUString aItemCommand; if ( mpMenu ) aItemCommand = mpMenu->GetItemCommand( nItemId ); return aItemCommand; } void SAL_CALL VCLXMenu::setHelpCommand( sal_Int16 nItemId, const OUString& aHelp ) throw (css::uno::RuntimeException) { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); if ( mpMenu ) mpMenu->SetHelpCommand( nItemId, aHelp ); } OUString SAL_CALL VCLXMenu::getHelpCommand( sal_Int16 nItemId ) throw (css::uno::RuntimeException) { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); OUString aHelpCommand; if ( mpMenu ) aHelpCommand = mpMenu->GetHelpCommand( nItemId ); return aHelpCommand; } namespace { static Image lcl_XGraphic2VCLImage( const css::uno::Reference< css::graphic::XGraphic >& xGraphic, sal_Bool bResize ) { Image aImage; if ( !xGraphic.is() ) return aImage; aImage = Image( xGraphic ); const ::Size aCurSize = aImage.GetSizePixel(); const sal_Int32 nCurWidth = aCurSize.Width(); const sal_Int32 nCurHeight = aCurSize.Height(); const sal_Int32 nIdeal( 16 ); if ( nCurWidth > 0 && nCurHeight > 0 ) { if ( bResize && ( nCurWidth > nIdeal || nCurHeight > nIdeal ) ) { sal_Int32 nIdealWidth = nCurWidth > nIdeal ? nIdeal : nCurWidth; sal_Int32 nIdealHeight = nCurHeight > nIdeal ? nIdeal : nCurHeight; ::Size aNewSize( nIdealWidth, nIdealHeight ); sal_Bool bModified( sal_False ); BitmapEx aBitmapEx = aImage.GetBitmapEx(); bModified = aBitmapEx.Scale( aNewSize, BMP_SCALE_INTERPOLATE ); if ( bModified ) aImage = Image( aBitmapEx ); } } return aImage; } /** Copied from svtools/inc/acceleratorexecute.hxx */ static css::awt::KeyEvent lcl_VCLKey2AWTKey( const KeyCode& aVCLKey) { css::awt::KeyEvent aAWTKey; aAWTKey.Modifiers = 0; aAWTKey.KeyCode = (sal_Int16)aVCLKey.GetCode(); if (aVCLKey.IsShift()) aAWTKey.Modifiers |= css::awt::KeyModifier::SHIFT; if (aVCLKey.IsMod1()) aAWTKey.Modifiers |= css::awt::KeyModifier::MOD1; if (aVCLKey.IsMod2()) aAWTKey.Modifiers |= css::awt::KeyModifier::MOD2; if (aVCLKey.IsMod3()) aAWTKey.Modifiers |= css::awt::KeyModifier::MOD3; return aAWTKey; } KeyCode lcl_AWTKey2VCLKey(const css::awt::KeyEvent& aAWTKey) { sal_Bool bShift = ((aAWTKey.Modifiers & css::awt::KeyModifier::SHIFT) == css::awt::KeyModifier::SHIFT ); sal_Bool bMod1 = ((aAWTKey.Modifiers & css::awt::KeyModifier::MOD1 ) == css::awt::KeyModifier::MOD1 ); sal_Bool bMod2 = ((aAWTKey.Modifiers & css::awt::KeyModifier::MOD2 ) == css::awt::KeyModifier::MOD2 ); sal_Bool bMod3 = ((aAWTKey.Modifiers & css::awt::KeyModifier::MOD3 ) == css::awt::KeyModifier::MOD3 ); sal_uInt16 nKey = (sal_uInt16)aAWTKey.KeyCode; return KeyCode(nKey, bShift, bMod1, bMod2, bMod3); } } ::sal_Bool SAL_CALL VCLXMenu::isPopupMenu( ) throw (css::uno::RuntimeException) { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); return IsPopupMenu(); } void SAL_CALL VCLXMenu::clear( ) throw (css::uno::RuntimeException) { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); if ( mpMenu ) mpMenu->Clear(); } css::awt::MenuItemType SAL_CALL VCLXMenu::getItemType( ::sal_Int16 nItemPos ) throw (css::uno::RuntimeException) { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); css::awt::MenuItemType aMenuItemType = css::awt::MenuItemType_DONTKNOW; if ( mpMenu ) { aMenuItemType = ( (css::awt::MenuItemType) mpMenu->GetItemType( nItemPos ) ); } return aMenuItemType; } void SAL_CALL VCLXMenu::hideDisabledEntries( ::sal_Bool bHide ) throw (css::uno::RuntimeException) { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); if ( mpMenu ) { if ( bHide ) mpMenu->SetMenuFlags( mpMenu->GetMenuFlags() | MENU_FLAG_HIDEDISABLEDENTRIES ); else mpMenu->SetMenuFlags( mpMenu->GetMenuFlags() & ~MENU_FLAG_HIDEDISABLEDENTRIES ); } } ::sal_Bool SAL_CALL VCLXMenu::isInExecute( ) throw (css::uno::RuntimeException) { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); if ( mpMenu && IsPopupMenu() ) return ( (PopupMenu*) mpMenu )->IsInExecute(); else return sal_False; } void SAL_CALL VCLXMenu::endExecute() throw (css::uno::RuntimeException) { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); if ( mpMenu && IsPopupMenu() ) ( (PopupMenu*) mpMenu )->EndExecute(); } void SAL_CALL VCLXMenu::enableAutoMnemonics( ::sal_Bool bEnable ) throw (css::uno::RuntimeException) { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); if ( mpMenu ) { if ( !bEnable ) mpMenu->SetMenuFlags( mpMenu->GetMenuFlags() | MENU_FLAG_NOAUTOMNEMONICS ); else mpMenu->SetMenuFlags( mpMenu->GetMenuFlags() & ~MENU_FLAG_NOAUTOMNEMONICS ); } } void SAL_CALL VCLXMenu::setAcceleratorKeyEvent( ::sal_Int16 nItemId, const css::awt::KeyEvent& aKeyEvent ) throw (css::uno::RuntimeException) { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); if ( mpMenu && IsPopupMenu() && MENU_ITEM_NOTFOUND != mpMenu->GetItemPos( nItemId ) ) { KeyCode aVCLKeyCode = lcl_AWTKey2VCLKey( aKeyEvent ); mpMenu->SetAccelKey( nItemId, aVCLKeyCode ); } } css::awt::KeyEvent SAL_CALL VCLXMenu::getAcceleratorKeyEvent( ::sal_Int16 nItemId ) throw (css::uno::RuntimeException) { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); css::awt::KeyEvent aKeyEvent; if ( mpMenu && IsPopupMenu() && MENU_ITEM_NOTFOUND != mpMenu->GetItemPos( nItemId ) ) { KeyCode nKeyCode = mpMenu->GetAccelKey( nItemId ); aKeyEvent = lcl_VCLKey2AWTKey( nKeyCode ); } return aKeyEvent; } void SAL_CALL VCLXMenu::setHelpText( ::sal_Int16 nItemId, const OUString& sHelpText ) throw (css::uno::RuntimeException) { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); if ( mpMenu && MENU_ITEM_NOTFOUND != mpMenu->GetItemPos( nItemId ) ) { mpMenu->SetHelpText( nItemId, sHelpText ); } } OUString SAL_CALL VCLXMenu::getHelpText( ::sal_Int16 nItemId ) throw (css::uno::RuntimeException) { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); rtl::OUString sHelpText; if ( mpMenu && MENU_ITEM_NOTFOUND != mpMenu->GetItemPos( nItemId ) ) { sHelpText = mpMenu->GetHelpText( nItemId ); } return sHelpText; } void SAL_CALL VCLXMenu::setTipHelpText( ::sal_Int16 nItemId, const OUString& sTipHelpText ) throw (css::uno::RuntimeException) { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); if ( mpMenu && MENU_ITEM_NOTFOUND != mpMenu->GetItemPos( nItemId ) ) { mpMenu->SetTipHelpText( nItemId, sTipHelpText ); } } OUString SAL_CALL VCLXMenu::getTipHelpText( ::sal_Int16 nItemId ) throw (css::uno::RuntimeException) { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); rtl::OUString sTipHelpText; if ( mpMenu && MENU_ITEM_NOTFOUND != mpMenu->GetItemPos( nItemId ) ) { sTipHelpText = mpMenu->GetTipHelpText( nItemId ); } return sTipHelpText; } void SAL_CALL VCLXMenu::setItemImage( ::sal_Int16 nItemId, const css::uno::Reference< css::graphic::XGraphic >& xGraphic, ::sal_Bool bScale ) throw (css::uno::RuntimeException) { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); if ( mpMenu && IsPopupMenu() && MENU_ITEM_NOTFOUND != mpMenu->GetItemPos( nItemId ) ) { Image aImage = lcl_XGraphic2VCLImage( xGraphic, bScale ); mpMenu->SetItemImage( nItemId, aImage ); } } css::uno::Reference< css::graphic::XGraphic > SAL_CALL VCLXMenu::getItemImage( ::sal_Int16 nItemId ) throw (css::uno::RuntimeException) { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); css::uno::Reference< css::graphic::XGraphic > rxGraphic; if ( mpMenu && IsPopupMenu() && MENU_ITEM_NOTFOUND != mpMenu->GetItemPos( nItemId ) ) { Image aImage = mpMenu->GetItemImage( nItemId ); if ( !!aImage ) rxGraphic = aImage.GetXGraphic(); } return rxGraphic; } DBG_NAME(VCLXMenuBar); VCLXMenuBar::VCLXMenuBar() { DBG_CTOR( VCLXMenuBar, 0 ); ImplCreateMenu( sal_False ); } VCLXMenuBar::VCLXMenuBar( MenuBar* pMenuBar ) : VCLXMenu( (Menu *)pMenuBar ) { DBG_CTOR( VCLXMenuBar, 0 ); } DBG_NAME(VCLXPopupMenu); VCLXPopupMenu::VCLXPopupMenu() { DBG_CTOR( VCLXPopupMenu, 0 ); ImplCreateMenu( sal_True ); }