From 1fb5a19fa3c80b4a33d8ccffad2127ebc1c17542 Mon Sep 17 00:00:00 2001 From: Caolán McNamara Date: Tue, 21 May 2013 16:35:47 +0100 Subject: add missing files Change-Id: I94dc9b99d243adf21f0439911899354781467da4 (cherry picked from commit aad035bd70b29253e9206de48259a9f0943bbc41) --- framework/inc/uifactory/uicontrollerfactory.hxx | 101 ++++++++ framework/source/uifactory/uicontrollerfactory.cxx | 269 +++++++++++++++++++++ 2 files changed, 370 insertions(+) create mode 100644 framework/inc/uifactory/uicontrollerfactory.hxx create mode 100644 framework/source/uifactory/uicontrollerfactory.cxx diff --git a/framework/inc/uifactory/uicontrollerfactory.hxx b/framework/inc/uifactory/uicontrollerfactory.hxx new file mode 100644 index 000000000000..df3f70aa8603 --- /dev/null +++ b/framework/inc/uifactory/uicontrollerfactory.hxx @@ -0,0 +1,101 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * 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 . + */ + +#ifndef __FRAMEWORK_UICONTROLLERFACTORY_HXX_ +#define __FRAMEWORK_UICONTROLLERFACTORY_HXX_ + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include + +namespace framework +{ + +class ConfigurationAccess_ControllerFactory; +class UIControllerFactory : protected ThreadHelpBase, // Struct for right initalization of mutex member! Must be first of baseclasses. + public ::cppu::WeakImplHelper2< + com::sun::star::lang::XServiceInfo, + com::sun::star::frame::XUIControllerFactory > +{ + public: + virtual ~UIControllerFactory(); + + // XServiceInfo + virtual ::rtl::OUString SAL_CALL getImplementationName( ) throw (::com::sun::star::uno::RuntimeException) = 0; + virtual ::sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName ) throw (::com::sun::star::uno::RuntimeException) = 0; + virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames( ) throw (::com::sun::star::uno::RuntimeException) = 0; + + // XMultiComponentFactory + virtual ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL createInstanceWithContext( const OUString& aServiceSpecifier, const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& Context ) throw (::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL createInstanceWithArgumentsAndContext( const OUString& ServiceSpecifier, const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& Arguments, const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& Context ) throw (::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Sequence< OUString > SAL_CALL getAvailableServiceNames() throw (::com::sun::star::uno::RuntimeException); + + // XUIControllerRegistration + virtual sal_Bool SAL_CALL hasController( const OUString& aCommandURL, const OUString& aModuleName ) throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL registerController( const OUString& aCommandURL, const OUString& aModuleName, const OUString& aControllerImplementationName ) throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL deregisterController( const OUString& aCommandURL, const OUString& aModuleName ) throw (::com::sun::star::uno::RuntimeException); + + protected: + UIControllerFactory( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& xServiceManager, const rtl::OUString &rUINode ); + sal_Bool m_bConfigRead; + ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > m_xServiceManager; + ConfigurationAccess_ControllerFactory* m_pConfigAccess; +}; + +class PopupMenuControllerFactory : public UIControllerFactory +{ + public: + PopupMenuControllerFactory( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& xServiceManager ); + + // XInterface, XTypeProvider, XServiceInfo + DECLARE_XSERVICEINFO +}; + +class ToolbarControllerFactory : public UIControllerFactory +{ + public: + ToolbarControllerFactory( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& xServiceManager ); + + // XInterface, XTypeProvider, XServiceInfo + DECLARE_XSERVICEINFO +}; + +class StatusbarControllerFactory : public UIControllerFactory +{ + public: + StatusbarControllerFactory( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& xServiceManager ); + + // XInterface, XTypeProvider, XServiceInfo + DECLARE_XSERVICEINFO +}; + +} + +#endif // __FRAMEWORK_UICONTROLLERFACTORY_HXX_ + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/framework/source/uifactory/uicontrollerfactory.cxx b/framework/source/uifactory/uicontrollerfactory.cxx new file mode 100644 index 000000000000..e72a3a8bd80c --- /dev/null +++ b/framework/source/uifactory/uicontrollerfactory.cxx @@ -0,0 +1,269 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * 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 . + */ + +#include +#include +#include +#include "services.h" + +#include +#include +#include +#include +#include + +#include +#include + +using namespace com::sun::star::uno; +using namespace com::sun::star::lang; +using namespace com::sun::star::beans; +using namespace com::sun::star::container; +using namespace ::com::sun::star::frame; + +namespace framework +{ + +UIControllerFactory::UIControllerFactory( + const Reference< XMultiServiceFactory >& xServiceManager, + const rtl::OUString &rConfigurationNode ) + : ThreadHelpBase() + , m_bConfigRead( sal_False ) + , m_xServiceManager( xServiceManager ) + , m_pConfigAccess() +{ + rtl::OUStringBuffer aBuffer; + aBuffer.appendAscii( + RTL_CONSTASCII_STRINGPARAM( + "/org.openoffice.Office.UI.Controller/Registered/" ) ); + aBuffer.append( rConfigurationNode ); + m_pConfigAccess = new ConfigurationAccess_ControllerFactory( + comphelper::getComponentContext(m_xServiceManager), aBuffer.makeStringAndClear() ); + m_pConfigAccess->acquire(); +} + +UIControllerFactory::~UIControllerFactory() +{ + ResetableGuard aLock( m_aLock ); + + // reduce reference count + m_pConfigAccess->release(); +} + +// XMultiComponentFactory +Reference< XInterface > SAL_CALL UIControllerFactory::createInstanceWithContext( + const OUString& aServiceSpecifier, + const Reference< XComponentContext >& ) +throw (Exception, RuntimeException) +{ + // SAFE + ResetableGuard aLock( m_aLock ); + + if ( !m_bConfigRead ) + { + m_bConfigRead = sal_True; + m_pConfigAccess->readConfigurationData(); + } + + OUString aServiceName = m_pConfigAccess->getServiceFromCommandModule( aServiceSpecifier, OUString() ); + if ( !aServiceName.isEmpty() ) + return m_xServiceManager->createInstance( aServiceName ); + else + return Reference< XInterface >(); + // SAFE +} + +Reference< XInterface > SAL_CALL UIControllerFactory::createInstanceWithArgumentsAndContext( + const OUString& ServiceSpecifier, + const Sequence< Any >& Arguments, + const Reference< XComponentContext >& ) +throw (Exception, RuntimeException) +{ + const OUString aPropModuleName( "ModuleIdentifier" ); + const OUString aPropValueName( "Value" ); + + OUString aPropName; + PropertyValue aPropValue; + + // Retrieve the optional module name form the Arguments sequence. It is used as a part of + // the hash map key to support different controller implementation for the same URL but different + // module!! + for ( int i = 0; i < Arguments.getLength(); i++ ) + { + if (( Arguments[i] >>= aPropValue ) && ( aPropValue.Name.equals( aPropModuleName ))) + { + aPropValue.Value >>= aPropName; + break; + } + } + + Sequence< Any > aNewArgs( Arguments ); + + sal_Int32 nAppendIndex = aNewArgs.getLength(); + bool bHasValue = m_pConfigAccess->hasValue(); + aNewArgs.realloc( aNewArgs.getLength() + (bHasValue ? 2 : 1) ); + + // Append the command URL to the Arguments sequence so that one controller can be + // used for more than one command URL. + aPropValue.Name = OUString( "CommandURL" ); + aPropValue.Value <<= ServiceSpecifier; + aNewArgs[nAppendIndex] <<= aPropValue; + + if ( bHasValue ) + { + // Append the optional value argument. It's an empty string if no additional info + // is provided to the controller. + OUString aValue = m_pConfigAccess->getValueFromCommandModule( ServiceSpecifier, aPropName ); + aPropValue.Name = aPropValueName; + aPropValue.Value <<= aValue; + aNewArgs[nAppendIndex+1] <<= aPropValue; + } + + { + // SAFE + ResetableGuard aLock( m_aLock ); + + if ( !m_bConfigRead ) + { + m_bConfigRead = sal_True; + m_pConfigAccess->readConfigurationData(); + } + + OUString aServiceName = m_pConfigAccess->getServiceFromCommandModule( ServiceSpecifier, aPropName ); + Reference< XMultiServiceFactory > xServiceManager( m_xServiceManager ); + + aLock.unlock(); + // SAFE + + if ( !aServiceName.isEmpty() ) + return xServiceManager->createInstanceWithArguments( aServiceName, aNewArgs ); + else + return Reference< XInterface >(); + } +} + +Sequence< OUString > SAL_CALL UIControllerFactory::getAvailableServiceNames() +throw (RuntimeException) +{ + return Sequence< OUString >(); +} + +// XUIControllerRegistration +sal_Bool SAL_CALL UIControllerFactory::hasController( + const OUString& aCommandURL, + const OUString& aModuleName ) +throw (::com::sun::star::uno::RuntimeException) +{ + ResetableGuard aLock( m_aLock ); + + if ( !m_bConfigRead ) + { + m_bConfigRead = sal_True; + m_pConfigAccess->readConfigurationData(); + } + + return ( !m_pConfigAccess->getServiceFromCommandModule( aCommandURL, aModuleName ).isEmpty() ); +} + +void SAL_CALL UIControllerFactory::registerController( + const OUString& aCommandURL, + const OUString& aModuleName, + const OUString& aControllerImplementationName ) +throw (RuntimeException) +{ + // SAFE + ResetableGuard aLock( m_aLock ); + + if ( !m_bConfigRead ) + { + m_bConfigRead = sal_True; + m_pConfigAccess->readConfigurationData(); + } + + m_pConfigAccess->addServiceToCommandModule( aCommandURL, aModuleName, aControllerImplementationName ); + // SAFE +} + +void SAL_CALL UIControllerFactory::deregisterController( + const OUString& aCommandURL, + const OUString& aModuleName ) +throw (RuntimeException) +{ + // SAFE + ResetableGuard aLock( m_aLock ); + + if ( !m_bConfigRead ) + { + m_bConfigRead = sal_True; + m_pConfigAccess->readConfigurationData(); + } + + m_pConfigAccess->removeServiceFromCommandModule( aCommandURL, aModuleName ); + // SAFE +} + + +DEFINE_XSERVICEINFO_ONEINSTANCESERVICE ( PopupMenuControllerFactory , + ::cppu::OWeakObject , + SERVICENAME_POPUPMENUCONTROLLERFACTORY , + IMPLEMENTATIONNAME_POPUPMENUCONTROLLERFACTORY + ) + +DEFINE_INIT_SERVICE ( PopupMenuControllerFactory, {} ) + +PopupMenuControllerFactory::PopupMenuControllerFactory( const Reference< XMultiServiceFactory >& xServiceManager ) : + UIControllerFactory( + xServiceManager, + rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PopupMenu" )) ) +{ +} + +DEFINE_XSERVICEINFO_ONEINSTANCESERVICE ( ToolbarControllerFactory , + ::cppu::OWeakObject , + SERVICENAME_TOOLBARCONTROLLERFACTORY , + IMPLEMENTATIONNAME_TOOLBARCONTROLLERFACTORY + ) + +DEFINE_INIT_SERVICE ( ToolbarControllerFactory, {} ) + +ToolbarControllerFactory::ToolbarControllerFactory( const Reference< XMultiServiceFactory >& xServiceManager ) : + UIControllerFactory( + xServiceManager, + rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ToolBar" ))) +{ +} + +DEFINE_XSERVICEINFO_ONEINSTANCESERVICE ( StatusbarControllerFactory , + ::cppu::OWeakObject , + SERVICENAME_STATUSBARCONTROLLERFACTORY , + IMPLEMENTATIONNAME_STATUSBARCONTROLLERFACTORY + ) + +DEFINE_INIT_SERVICE ( StatusbarControllerFactory, {} ) + +StatusbarControllerFactory::StatusbarControllerFactory( const Reference< XMultiServiceFactory >& xServiceManager ) : + UIControllerFactory( + xServiceManager, + rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "StatusBar" )) ) +{ +} + +} // namespace framework + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ -- cgit v1.2.3