diff options
Diffstat (limited to 'framework/source/helper/actiontriggerhelper.cxx')
-rw-r--r-- | framework/source/helper/actiontriggerhelper.cxx | 408 |
1 files changed, 0 insertions, 408 deletions
diff --git a/framework/source/helper/actiontriggerhelper.cxx b/framework/source/helper/actiontriggerhelper.cxx deleted file mode 100644 index b1c4e50dfe00..000000000000 --- a/framework/source/helper/actiontriggerhelper.cxx +++ /dev/null @@ -1,408 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_framework.hxx" -#include <helper/actiontriggerhelper.hxx> -#include <classes/actiontriggerseparatorpropertyset.hxx> -#include <classes/rootactiontriggercontainer.hxx> -#include <classes/imagewrapper.hxx> -#include <classes/addonsoptions.hxx> -#include <com/sun/star/lang/XServiceInfo.hpp> -#include <com/sun/star/beans/XPropertySet.hpp> -#include <com/sun/star/awt/XBitmap.hpp> -#include <vcl/svapp.hxx> -#include <vos/mutex.hxx> -#include <tools/stream.hxx> -#include <cppuhelper/weak.hxx> -#include <comphelper/processfactory.hxx> - - -const USHORT START_ITEMID = 1000; - -using namespace rtl; -using namespace vos; -using namespace com::sun::star::awt; -using namespace com::sun::star::uno; -using namespace com::sun::star::lang; -using namespace com::sun::star::beans; -using namespace com::sun::star::container; - -namespace framework -{ - -// ---------------------------------------------------------------------------- -// implementation helper ( menu => ActionTrigger ) -// ---------------------------------------------------------------------------- - -sal_Bool IsSeparator( Reference< XPropertySet > xPropertySet ) -{ - Reference< XServiceInfo > xServiceInfo( xPropertySet, UNO_QUERY ); - try - { - return xServiceInfo->supportsService( OUString( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME_ACTIONTRIGGERSEPARATOR )) ); - } - catch ( Exception& ) - { - } - - return sal_False; -} - -void GetMenuItemAttributes( Reference< XPropertySet > xActionTriggerPropertySet, - OUString& aMenuLabel, - OUString& aCommandURL, - OUString& aHelpURL, - Reference< XBitmap >& xBitmap, - Reference< XIndexContainer >& xSubContainer ) -{ - Any a; - - try - { - // mandatory properties - a = xActionTriggerPropertySet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "Text" )) ); - a >>= aMenuLabel; - a = xActionTriggerPropertySet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "CommandURL" )) ); - a >>= aCommandURL; - a = xActionTriggerPropertySet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "Image" )) ); - a >>= xBitmap; - a = xActionTriggerPropertySet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "SubContainer" )) ); - a >>= xSubContainer; - } - catch ( Exception& ) - { - } - - // optional properties - try - { - a = xActionTriggerPropertySet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "HelpURL" )) ); - a >>= aHelpURL; - } - catch ( Exception& ) - { - } -} - -void InsertSubMenuItems( Menu* pSubMenu, USHORT& nItemId, Reference< XIndexContainer > xActionTriggerContainer ) -{ - Reference< XIndexAccess > xIndexAccess( xActionTriggerContainer, UNO_QUERY ); - if ( xIndexAccess.is() ) - { - AddonsOptions aAddonOptions; - const StyleSettings& rSettings = Application::GetSettings().GetStyleSettings(); - sal_Bool bHiContrast = rSettings.GetHighContrastMode(); - - OUString aSlotURL( RTL_CONSTASCII_USTRINGPARAM( "slot:" )); - - for ( sal_Int32 i = 0; i < xIndexAccess->getCount(); i++ ) - { - try - { - Reference< XPropertySet > xPropSet; - if (( xIndexAccess->getByIndex( i ) >>= xPropSet ) && ( xPropSet.is() )) - { - if ( IsSeparator( xPropSet )) - { - // Separator - OGuard aGuard( Application::GetSolarMutex() ); - pSubMenu->InsertSeparator(); - } - else - { - // Menu item - OUString aLabel; - OUString aCommandURL; - OUString aHelpURL; - Reference< XBitmap > xBitmap; - Reference< XIndexContainer > xSubContainer; - sal_Bool bSpecialItemId = sal_False; - - USHORT nNewItemId = nItemId++; - GetMenuItemAttributes( xPropSet, aLabel, aCommandURL, aHelpURL, xBitmap, xSubContainer ); - - OGuard aGuard( Application::GetSolarMutex() ); - { - // insert new menu item - sal_Int32 nIndex = aCommandURL.indexOf( aSlotURL ); - if ( nIndex >= 0 ) - { - // Special code for our menu implementation: some menu items don't have a - // command url but uses the item id as a unqiue identifier. These entries - // got a special url during conversion from menu=>actiontriggercontainer. - // Now we have to extract this special url and set the correct item id!!! - bSpecialItemId = sal_True; - nNewItemId = (USHORT)aCommandURL.copy( nIndex+aSlotURL.getLength() ).toInt32(); - pSubMenu->InsertItem( nNewItemId, aLabel ); - } - else - { - pSubMenu->InsertItem( nNewItemId, aLabel ); - pSubMenu->SetItemCommand( nNewItemId, aCommandURL ); - } - - // handle bitmap - if ( xBitmap.is() ) - { - sal_Bool bImageSet = sal_False; - - Reference< XUnoTunnel > xUnoTunnel( xBitmap, UNO_QUERY ); - if ( xUnoTunnel.is() ) - { - // Try to get implementation pointer through XUnoTunnel - sal_Int64 nPointer = xUnoTunnel->getSomething( ImageWrapper::GetUnoTunnelId() ); - if ( nPointer ) - { - // This is our own optimized implementation of menu images! - ImageWrapper* pImageWrapper = reinterpret_cast< ImageWrapper * >( nPointer ); - Image aMenuImage = pImageWrapper->GetImage(); - - if ( !!aMenuImage ) - pSubMenu->SetItemImage( nNewItemId, aMenuImage ); - - bImageSet = sal_True; - } - } - - if ( !bImageSet ) - { - // This is an unknown implementation of a XBitmap interface. We have to - // use a more time consuming way to build an Image! - Image aImage; - Bitmap aBitmap; - - Sequence< sal_Int8 > aDIBSeq; - { - aDIBSeq = xBitmap->getDIB(); - SvMemoryStream aMem( (void *)aDIBSeq.getConstArray(), aDIBSeq.getLength(), STREAM_READ ); - aMem >> aBitmap; - } - - aDIBSeq = xBitmap->getMaskDIB(); - if ( aDIBSeq.getLength() > 0 ) - { - Bitmap aMaskBitmap; - SvMemoryStream aMem( (void *)aDIBSeq.getConstArray(), aDIBSeq.getLength(), STREAM_READ ); - aMem >> aMaskBitmap; - aImage = Image( aBitmap, aMaskBitmap ); - } - else - aImage = Image( aBitmap ); - - if ( !!aImage ) - pSubMenu->SetItemImage( nNewItemId, aImage ); - } - } - else - { - // Support add-on images for context menu interceptors - Image aImage = aAddonOptions.GetImageFromURL( aCommandURL, sal_False, bHiContrast, sal_True ); - if ( !!aImage ) - pSubMenu->SetItemImage( nNewItemId, aImage ); - } - - if ( xSubContainer.is() ) - { - PopupMenu* pNewSubMenu = new PopupMenu; - - // Sub menu (recursive call CreateSubMenu ) - InsertSubMenuItems( pNewSubMenu, nItemId, xSubContainer ); - pSubMenu->SetPopupMenu( nNewItemId, pNewSubMenu ); - } - } - } - } - } - catch ( IndexOutOfBoundsException ) - { - return; - } - catch ( WrappedTargetException ) - { - return; - } - catch ( RuntimeException ) - { - return; - } - } - } -} - - -// ---------------------------------------------------------------------------- -// implementation helper ( ActionTrigger => menu ) -// ---------------------------------------------------------------------------- - -Reference< XPropertySet > CreateActionTrigger( USHORT nItemId, const Menu* pMenu, const Reference< XIndexContainer >& rActionTriggerContainer ) throw ( RuntimeException ) -{ - Reference< XPropertySet > xPropSet; - - Reference< XMultiServiceFactory > xMultiServiceFactory( rActionTriggerContainer, UNO_QUERY ); - if ( xMultiServiceFactory.is() ) - { - xPropSet = Reference< XPropertySet >( xMultiServiceFactory->createInstance( - OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.ui.ActionTrigger" )) ), - UNO_QUERY ); - - Any a; - - try - { - // Retrieve the menu attributes and set them in our PropertySet - OUString aLabel = pMenu->GetItemText( nItemId ); - a <<= aLabel; - xPropSet->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "Text" )), a ); - - OUString aCommandURL = pMenu->GetItemCommand( nItemId ); - - if ( aCommandURL.getLength() == 0 ) - { - aCommandURL = OUString( RTL_CONSTASCII_USTRINGPARAM( "slot:" )); - aCommandURL += OUString::valueOf( (sal_Int32)nItemId ); - } - - a <<= aCommandURL; - xPropSet->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "CommandURL" )), a ); - - Image aImage = pMenu->GetItemImage( nItemId ); - if ( !!aImage ) - { - // We use our own optimized XBitmap implementation - Reference< XBitmap > xBitmap( static_cast< cppu::OWeakObject* >( new ImageWrapper( aImage )), UNO_QUERY ); - a <<= xBitmap; - xPropSet->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "Image" )), a ); - } - } - catch ( Exception& ) - { - } - } - - return xPropSet; -} - -Reference< XPropertySet > CreateActionTriggerSeparator( const Reference< XIndexContainer >& rActionTriggerContainer ) throw ( RuntimeException ) -{ - Reference< XMultiServiceFactory > xMultiServiceFactory( rActionTriggerContainer, UNO_QUERY ); - if ( xMultiServiceFactory.is() ) - { - return Reference< XPropertySet >( xMultiServiceFactory->createInstance( - OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.ui.ActionTriggerSeparator" )) ), - UNO_QUERY ); - } - - return Reference< XPropertySet >(); -} - -Reference< XIndexContainer > CreateActionTriggerContainer( const Reference< XIndexContainer >& rActionTriggerContainer ) throw ( RuntimeException ) -{ - Reference< XMultiServiceFactory > xMultiServiceFactory( rActionTriggerContainer, UNO_QUERY ); - if ( xMultiServiceFactory.is() ) - { - return Reference< XIndexContainer >( xMultiServiceFactory->createInstance( - OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.ui.ActionTriggerContainer" )) ), - UNO_QUERY ); - } - - return Reference< XIndexContainer >(); -} - -void FillActionTriggerContainerWithMenu( const Menu* pMenu, Reference< XIndexContainer >& rActionTriggerContainer ) -{ - OGuard aGuard( Application::GetSolarMutex() ); - - for ( USHORT nPos = 0; nPos < pMenu->GetItemCount(); nPos++ ) - { - USHORT nItemId = pMenu->GetItemId( nPos ); - MenuItemType nType = pMenu->GetItemType( nPos ); - - try - { - Any a; - Reference< XPropertySet > xPropSet; - - if ( nType == MENUITEM_SEPARATOR ) - { - xPropSet = CreateActionTriggerSeparator( rActionTriggerContainer ); - - a <<= xPropSet; - rActionTriggerContainer->insertByIndex( nPos, a ); - } - else - { - xPropSet = CreateActionTrigger( nItemId, pMenu, rActionTriggerContainer ); - - a <<= xPropSet; - rActionTriggerContainer->insertByIndex( nPos, a ); - - PopupMenu* pPopupMenu = pMenu->GetPopupMenu( nItemId ); - if ( pPopupMenu ) - { - // recursive call to build next sub menu - Reference< XIndexContainer > xSubContainer = CreateActionTriggerContainer( rActionTriggerContainer ); - - a <<= xSubContainer; - xPropSet->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "SubContainer" )), a ); - FillActionTriggerContainerWithMenu( pPopupMenu, xSubContainer ); - } - } - } - catch ( Exception& ) - { - } - } -} - -void ActionTriggerHelper::CreateMenuFromActionTriggerContainer( - Menu* pNewMenu, - const Reference< XIndexContainer >& rActionTriggerContainer ) -{ - USHORT nItemId = START_ITEMID; - - if ( rActionTriggerContainer.is() ) - InsertSubMenuItems( pNewMenu, nItemId, rActionTriggerContainer ); -} - -void ActionTriggerHelper::FillActionTriggerContainerFromMenu( - Reference< XIndexContainer >& xActionTriggerContainer, - const Menu* pMenu ) -{ - FillActionTriggerContainerWithMenu( pMenu, xActionTriggerContainer ); -} - -Reference< XIndexContainer > ActionTriggerHelper::CreateActionTriggerContainerFromMenu( - // #110897# - const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& xServiceFactory, - const Menu* pMenu, - const ::rtl::OUString* pMenuIdentifier ) -{ - return new RootActionTriggerContainer( pMenu, pMenuIdentifier, xServiceFactory ); -} - -} |