1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28 #ifndef __FRAMEWORK_UIFACTORY_UIELEMENTFACTORYMANAGER_HXX_ 29 #define __FRAMEWORK_UIFACTORY_UIELEMENTFACTORYMANAGER_HXX_ 30 31 /** Attention: stl headers must(!) be included at first. Otherwhise it can make trouble 32 with solaris headers ... 33 */ 34 #include <vector> 35 #include <list> 36 37 //_________________________________________________________________________________________________________________ 38 // my own includes 39 //_________________________________________________________________________________________________________________ 40 #include <threadhelp/threadhelpbase.hxx> 41 #include <macros/generic.hxx> 42 #include <macros/xinterface.hxx> 43 #include <macros/xtypeprovider.hxx> 44 #include <macros/xserviceinfo.hxx> 45 #include <stdtypes.h> 46 47 //_________________________________________________________________________________________________________________ 48 // interface includes 49 //_________________________________________________________________________________________________________________ 50 #include <com/sun/star/lang/XServiceInfo.hpp> 51 #include <com/sun/star/ui/XUIElementFactory.hpp> 52 #include <com/sun/star/ui/XUIElementFactoryRegistration.hpp> 53 #include <com/sun/star/container/XContainerListener.hpp> 54 #include <com/sun/star/container/XNameAccess.hpp> 55 #include "com/sun/star/frame/XModuleManager.hpp" 56 57 //_________________________________________________________________________________________________________________ 58 // other includes 59 //_________________________________________________________________________________________________________________ 60 #include <cppuhelper/implbase1.hxx> 61 #include <cppuhelper/implbase3.hxx> 62 #include <rtl/ustring.hxx> 63 64 namespace framework 65 { 66 67 class ConfigurationAccess_FactoryManager : // interfaces 68 // baseclasses 69 // Order is neccessary for right initialization! 70 private ThreadHelpBase , 71 public ::cppu::WeakImplHelper1< ::com::sun::star::container::XContainerListener> 72 { 73 public: 74 ConfigurationAccess_FactoryManager( ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rServiceManager,const ::rtl::OUString& _sRoot ); 75 virtual ~ConfigurationAccess_FactoryManager(); 76 77 void readConfigurationData(); 78 79 rtl::OUString getFactorySpecifierFromTypeNameModule( const rtl::OUString& rType, const rtl::OUString& rName, const rtl::OUString& rModule ) const; 80 void addFactorySpecifierToTypeNameModule( const rtl::OUString& rType, const rtl::OUString& rName, const rtl::OUString& rModule, const rtl::OUString& aServiceSpecifier ); 81 void removeFactorySpecifierFromTypeNameModule( const rtl::OUString& rType, const rtl::OUString& rName, const rtl::OUString& rModule ); 82 ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > > getFactoriesDescription() const; 83 84 // container.XContainerListener 85 virtual void SAL_CALL elementInserted( const ::com::sun::star::container::ContainerEvent& Event ) throw (::com::sun::star::uno::RuntimeException); 86 virtual void SAL_CALL elementRemoved( const ::com::sun::star::container::ContainerEvent& Event ) throw (::com::sun::star::uno::RuntimeException); 87 virtual void SAL_CALL elementReplaced( const ::com::sun::star::container::ContainerEvent& Event ) throw (::com::sun::star::uno::RuntimeException); 88 89 // lang.XEventListener 90 virtual void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& Source ) throw (::com::sun::star::uno::RuntimeException); 91 92 private: 93 class FactoryManagerMap : public std::hash_map< rtl::OUString, 94 rtl::OUString, 95 OUStringHashCode, 96 ::std::equal_to< ::rtl::OUString > > 97 { 98 inline void free() 99 { 100 FactoryManagerMap().swap( *this ); 101 } 102 }; 103 104 sal_Bool impl_getElementProps( const ::com::sun::star::uno::Any& rElement, rtl::OUString& rType, rtl::OUString& rName, rtl::OUString& rModule, rtl::OUString& rServiceSpecifier ) const; 105 106 rtl::OUString m_aPropType; 107 rtl::OUString m_aPropName; 108 rtl::OUString m_aPropModule; 109 rtl::OUString m_aPropFactory; 110 ::rtl::OUString m_sRoot; 111 FactoryManagerMap m_aFactoryManagerMap; 112 ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > m_xServiceManager; 113 ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > m_xConfigProvider; 114 ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess > m_xConfigAccess; 115 sal_Bool m_bConfigAccessInitialized; 116 bool m_bConfigDirty; 117 }; 118 119 120 class UIElementFactoryManager : private ThreadHelpBase , // Struct for right initalization of mutex member! Must be first of baseclasses. 121 public ::cppu::WeakImplHelper3< ::com::sun::star::lang::XServiceInfo, 122 ::com::sun::star::ui::XUIElementFactory, 123 ::com::sun::star::ui::XUIElementFactoryRegistration> 124 { 125 public: 126 UIElementFactoryManager( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& xServiceManager ); 127 virtual ~UIElementFactoryManager(); 128 129 // XInterface, XTypeProvider, XServiceInfo 130 DECLARE_XSERVICEINFO 131 132 // XUIElementFactory 133 virtual ::com::sun::star::uno::Reference< ::com::sun::star::ui::XUIElement > SAL_CALL createUIElement( const ::rtl::OUString& ResourceURL, const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& Args ) throw (::com::sun::star::container::NoSuchElementException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException); 134 135 // XUIElementFactoryRegistration 136 virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > > SAL_CALL getRegisteredFactories( ) throw (::com::sun::star::uno::RuntimeException); 137 virtual ::com::sun::star::uno::Reference< ::com::sun::star::ui::XUIElementFactory > SAL_CALL getFactory( const ::rtl::OUString& ResourceURL, const ::rtl::OUString& ModuleIdentifier ) throw (::com::sun::star::uno::RuntimeException); 138 virtual void SAL_CALL registerFactory( const ::rtl::OUString& aType, const ::rtl::OUString& aName, const ::rtl::OUString& aModuleIdentifier, const ::rtl::OUString& aFactoryImplementationName ) throw (::com::sun::star::container::ElementExistException, ::com::sun::star::uno::RuntimeException); 139 virtual void SAL_CALL deregisterFactory( const ::rtl::OUString& aType, const ::rtl::OUString& aName, const ::rtl::OUString& aModuleIdentifier ) throw (::com::sun::star::container::NoSuchElementException, ::com::sun::star::uno::RuntimeException); 140 141 private: 142 143 sal_Bool m_bConfigRead; 144 ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > m_xServiceManager; 145 ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModuleManager > m_xModuleManager; 146 ConfigurationAccess_FactoryManager* m_pConfigAccess; 147 }; 148 149 } // namespace framework 150 151 #endif // __FRAMEWORK_UIFACTORY_UIELEMENTFACTORYMANAGER_HXX_ 152