16d739b60SAndrew Rist /**************************************************************
2*dccf82beSAriel Constenla-Haile *
36d739b60SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
46d739b60SAndrew Rist * or more contributor license agreements. See the NOTICE file
56d739b60SAndrew Rist * distributed with this work for additional information
66d739b60SAndrew Rist * regarding copyright ownership. The ASF licenses this file
76d739b60SAndrew Rist * to you under the Apache License, Version 2.0 (the
86d739b60SAndrew Rist * "License"); you may not use this file except in compliance
96d739b60SAndrew Rist * with the License. You may obtain a copy of the License at
10*dccf82beSAriel Constenla-Haile *
116d739b60SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12*dccf82beSAriel Constenla-Haile *
136d739b60SAndrew Rist * Unless required by applicable law or agreed to in writing,
146d739b60SAndrew Rist * software distributed under the License is distributed on an
156d739b60SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
166d739b60SAndrew Rist * KIND, either express or implied. See the License for the
176d739b60SAndrew Rist * specific language governing permissions and limitations
186d739b60SAndrew Rist * under the License.
19*dccf82beSAriel Constenla-Haile *
206d739b60SAndrew Rist *************************************************************/
216d739b60SAndrew Rist
226d739b60SAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_framework.hxx"
26cdf0e10cSrcweir
27*dccf82beSAriel Constenla-Haile #include <uifactory/uicontrollerfactory.hxx>
28*dccf82beSAriel Constenla-Haile #include <uifactory/factoryconfiguration.hxx>
29cdf0e10cSrcweir #include <threadhelp/resetableguard.hxx>
30cdf0e10cSrcweir #include "services.h"
31cdf0e10cSrcweir
32cdf0e10cSrcweir #include <com/sun/star/beans/PropertyValue.hpp>
33cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp>
34cdf0e10cSrcweir #include <com/sun/star/container/XNameAccess.hpp>
35cdf0e10cSrcweir #include <com/sun/star/container/XNameContainer.hpp>
36cdf0e10cSrcweir #include <com/sun/star/container/XContainer.hpp>
37cdf0e10cSrcweir
38cdf0e10cSrcweir #include <rtl/ustrbuf.hxx>
39cdf0e10cSrcweir #include <cppuhelper/weak.hxx>
40cdf0e10cSrcweir
41cdf0e10cSrcweir using namespace com::sun::star::uno;
42cdf0e10cSrcweir using namespace com::sun::star::lang;
43cdf0e10cSrcweir using namespace com::sun::star::beans;
44cdf0e10cSrcweir using namespace com::sun::star::container;
45cdf0e10cSrcweir using namespace ::com::sun::star::frame;
46cdf0e10cSrcweir
47cdf0e10cSrcweir namespace framework
48cdf0e10cSrcweir {
49cdf0e10cSrcweir
UIControllerFactory(const Reference<XMultiServiceFactory> & xServiceManager,const rtl::OUString & rConfigurationNode)50*dccf82beSAriel Constenla-Haile UIControllerFactory::UIControllerFactory(
51*dccf82beSAriel Constenla-Haile const Reference< XMultiServiceFactory >& xServiceManager,
52*dccf82beSAriel Constenla-Haile const rtl::OUString &rConfigurationNode )
53*dccf82beSAriel Constenla-Haile : ThreadHelpBase()
54*dccf82beSAriel Constenla-Haile , m_bConfigRead( sal_False )
55*dccf82beSAriel Constenla-Haile , m_xServiceManager( xServiceManager )
56*dccf82beSAriel Constenla-Haile , m_pConfigAccess()
57cdf0e10cSrcweir {
58*dccf82beSAriel Constenla-Haile rtl::OUStringBuffer aBuffer;
59*dccf82beSAriel Constenla-Haile aBuffer.appendAscii(
60*dccf82beSAriel Constenla-Haile RTL_CONSTASCII_STRINGPARAM(
61*dccf82beSAriel Constenla-Haile "/org.openoffice.Office.UI.Controller/Registered/" ) );
62*dccf82beSAriel Constenla-Haile aBuffer.append( rConfigurationNode );
63*dccf82beSAriel Constenla-Haile m_pConfigAccess = new ConfigurationAccess_ControllerFactory(
64*dccf82beSAriel Constenla-Haile m_xServiceManager, aBuffer.makeStringAndClear() );
65cdf0e10cSrcweir m_pConfigAccess->acquire();
66cdf0e10cSrcweir }
67cdf0e10cSrcweir
~UIControllerFactory()68*dccf82beSAriel Constenla-Haile UIControllerFactory::~UIControllerFactory()
69cdf0e10cSrcweir {
70cdf0e10cSrcweir ResetableGuard aLock( m_aLock );
71*dccf82beSAriel Constenla-Haile
72cdf0e10cSrcweir // reduce reference count
73cdf0e10cSrcweir m_pConfigAccess->release();
74cdf0e10cSrcweir }
75cdf0e10cSrcweir
76cdf0e10cSrcweir // XMultiComponentFactory
createInstanceWithContext(const::rtl::OUString & aServiceSpecifier,const Reference<XComponentContext> &)77*dccf82beSAriel Constenla-Haile Reference< XInterface > SAL_CALL UIControllerFactory::createInstanceWithContext(
78*dccf82beSAriel Constenla-Haile const ::rtl::OUString& aServiceSpecifier,
79cdf0e10cSrcweir const Reference< XComponentContext >& )
80cdf0e10cSrcweir throw (Exception, RuntimeException)
81cdf0e10cSrcweir {
82cdf0e10cSrcweir // SAFE
83cdf0e10cSrcweir ResetableGuard aLock( m_aLock );
84*dccf82beSAriel Constenla-Haile
85cdf0e10cSrcweir if ( !m_bConfigRead )
86cdf0e10cSrcweir {
87cdf0e10cSrcweir m_bConfigRead = sal_True;
88cdf0e10cSrcweir m_pConfigAccess->readConfigurationData();
89cdf0e10cSrcweir }
90*dccf82beSAriel Constenla-Haile
91cdf0e10cSrcweir rtl::OUString aServiceName = m_pConfigAccess->getServiceFromCommandModule( aServiceSpecifier, rtl::OUString() );
92cdf0e10cSrcweir if ( aServiceName.getLength() > 0 )
93cdf0e10cSrcweir return m_xServiceManager->createInstance( aServiceName );
94cdf0e10cSrcweir else
95cdf0e10cSrcweir return Reference< XInterface >();
96cdf0e10cSrcweir // SAFE
97cdf0e10cSrcweir }
98cdf0e10cSrcweir
createInstanceWithArgumentsAndContext(const::rtl::OUString & ServiceSpecifier,const Sequence<Any> & Arguments,const Reference<XComponentContext> &)99*dccf82beSAriel Constenla-Haile Reference< XInterface > SAL_CALL UIControllerFactory::createInstanceWithArgumentsAndContext(
100*dccf82beSAriel Constenla-Haile const ::rtl::OUString& ServiceSpecifier,
101*dccf82beSAriel Constenla-Haile const Sequence< Any >& Arguments,
102cdf0e10cSrcweir const Reference< XComponentContext >& )
103cdf0e10cSrcweir throw (Exception, RuntimeException)
104cdf0e10cSrcweir {
105*dccf82beSAriel Constenla-Haile const rtl::OUString aPropModuleName( RTL_CONSTASCII_USTRINGPARAM( "ModuleIdentifier" ));
106cdf0e10cSrcweir const rtl::OUString aPropValueName( RTL_CONSTASCII_USTRINGPARAM( "Value" ));
107*dccf82beSAriel Constenla-Haile
108cdf0e10cSrcweir rtl::OUString aPropName;
109cdf0e10cSrcweir PropertyValue aPropValue;
110*dccf82beSAriel Constenla-Haile
111cdf0e10cSrcweir // Retrieve the optional module name form the Arguments sequence. It is used as a part of
112cdf0e10cSrcweir // the hash map key to support different controller implementation for the same URL but different
113cdf0e10cSrcweir // module!!
114cdf0e10cSrcweir for ( int i = 0; i < Arguments.getLength(); i++ )
115cdf0e10cSrcweir {
116cdf0e10cSrcweir if (( Arguments[i] >>= aPropValue ) && ( aPropValue.Name.equals( aPropModuleName )))
117cdf0e10cSrcweir {
118cdf0e10cSrcweir aPropValue.Value >>= aPropName;
119cdf0e10cSrcweir break;
120cdf0e10cSrcweir }
121cdf0e10cSrcweir }
122*dccf82beSAriel Constenla-Haile
123cdf0e10cSrcweir Sequence< Any > aNewArgs( Arguments );
124*dccf82beSAriel Constenla-Haile
125cdf0e10cSrcweir sal_Int32 nAppendIndex = aNewArgs.getLength();
126cdf0e10cSrcweir bool bHasValue = m_pConfigAccess->hasValue();
127cdf0e10cSrcweir aNewArgs.realloc( aNewArgs.getLength() + (bHasValue ? 2 : 1) );
128cdf0e10cSrcweir
129cdf0e10cSrcweir // Append the command URL to the Arguments sequence so that one controller can be
130cdf0e10cSrcweir // used for more than one command URL.
131cdf0e10cSrcweir aPropValue.Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "CommandURL" ));
132cdf0e10cSrcweir aPropValue.Value <<= ServiceSpecifier;
133cdf0e10cSrcweir aNewArgs[nAppendIndex] <<= aPropValue;
134*dccf82beSAriel Constenla-Haile
135cdf0e10cSrcweir if ( bHasValue )
136cdf0e10cSrcweir {
137cdf0e10cSrcweir // Append the optional value argument. It's an empty string if no additional info
138cdf0e10cSrcweir // is provided to the controller.
139cdf0e10cSrcweir rtl::OUString aValue = m_pConfigAccess->getValueFromCommandModule( ServiceSpecifier, aPropName );
140cdf0e10cSrcweir aPropValue.Name = aPropValueName;
141cdf0e10cSrcweir aPropValue.Value <<= aValue;
142cdf0e10cSrcweir aNewArgs[nAppendIndex+1] <<= aPropValue;
143cdf0e10cSrcweir }
144cdf0e10cSrcweir
145cdf0e10cSrcweir {
146cdf0e10cSrcweir // SAFE
147cdf0e10cSrcweir ResetableGuard aLock( m_aLock );
148*dccf82beSAriel Constenla-Haile
149cdf0e10cSrcweir if ( !m_bConfigRead )
150cdf0e10cSrcweir {
151cdf0e10cSrcweir m_bConfigRead = sal_True;
152cdf0e10cSrcweir m_pConfigAccess->readConfigurationData();
153cdf0e10cSrcweir }
154*dccf82beSAriel Constenla-Haile
155cdf0e10cSrcweir rtl::OUString aServiceName = m_pConfigAccess->getServiceFromCommandModule( ServiceSpecifier, aPropName );
156cdf0e10cSrcweir Reference< XMultiServiceFactory > xServiceManager( m_xServiceManager );
157*dccf82beSAriel Constenla-Haile
158cdf0e10cSrcweir aLock.unlock();
159cdf0e10cSrcweir // SAFE
160cdf0e10cSrcweir
161cdf0e10cSrcweir if ( aServiceName.getLength() > 0 )
162cdf0e10cSrcweir return xServiceManager->createInstanceWithArguments( aServiceName, aNewArgs );
163cdf0e10cSrcweir else
164cdf0e10cSrcweir return Reference< XInterface >();
165cdf0e10cSrcweir }
166cdf0e10cSrcweir }
167cdf0e10cSrcweir
getAvailableServiceNames()168*dccf82beSAriel Constenla-Haile Sequence< ::rtl::OUString > SAL_CALL UIControllerFactory::getAvailableServiceNames()
169cdf0e10cSrcweir throw (RuntimeException)
170cdf0e10cSrcweir {
171cdf0e10cSrcweir return Sequence< ::rtl::OUString >();
172cdf0e10cSrcweir }
173cdf0e10cSrcweir
174cdf0e10cSrcweir // XUIControllerRegistration
hasController(const::rtl::OUString & aCommandURL,const rtl::OUString & aModuleName)175*dccf82beSAriel Constenla-Haile sal_Bool SAL_CALL UIControllerFactory::hasController(
176*dccf82beSAriel Constenla-Haile const ::rtl::OUString& aCommandURL,
177*dccf82beSAriel Constenla-Haile const rtl::OUString& aModuleName )
178cdf0e10cSrcweir throw (::com::sun::star::uno::RuntimeException)
179cdf0e10cSrcweir {
180cdf0e10cSrcweir ResetableGuard aLock( m_aLock );
181cdf0e10cSrcweir
182cdf0e10cSrcweir if ( !m_bConfigRead )
183cdf0e10cSrcweir {
184cdf0e10cSrcweir m_bConfigRead = sal_True;
185cdf0e10cSrcweir m_pConfigAccess->readConfigurationData();
186cdf0e10cSrcweir }
187*dccf82beSAriel Constenla-Haile
188cdf0e10cSrcweir return ( m_pConfigAccess->getServiceFromCommandModule( aCommandURL, aModuleName ).getLength() > 0 );
189cdf0e10cSrcweir }
190cdf0e10cSrcweir
registerController(const::rtl::OUString & aCommandURL,const::rtl::OUString & aModuleName,const::rtl::OUString & aControllerImplementationName)191*dccf82beSAriel Constenla-Haile void SAL_CALL UIControllerFactory::registerController(
192*dccf82beSAriel Constenla-Haile const ::rtl::OUString& aCommandURL,
193*dccf82beSAriel Constenla-Haile const ::rtl::OUString& aModuleName,
194*dccf82beSAriel Constenla-Haile const ::rtl::OUString& aControllerImplementationName )
195cdf0e10cSrcweir throw (RuntimeException)
196cdf0e10cSrcweir {
197cdf0e10cSrcweir // SAFE
198cdf0e10cSrcweir ResetableGuard aLock( m_aLock );
199*dccf82beSAriel Constenla-Haile
200cdf0e10cSrcweir if ( !m_bConfigRead )
201cdf0e10cSrcweir {
202cdf0e10cSrcweir m_bConfigRead = sal_True;
203cdf0e10cSrcweir m_pConfigAccess->readConfigurationData();
204cdf0e10cSrcweir }
205cdf0e10cSrcweir
206cdf0e10cSrcweir m_pConfigAccess->addServiceToCommandModule( aCommandURL, aModuleName, aControllerImplementationName );
207cdf0e10cSrcweir // SAFE
208cdf0e10cSrcweir }
209cdf0e10cSrcweir
deregisterController(const::rtl::OUString & aCommandURL,const rtl::OUString & aModuleName)210*dccf82beSAriel Constenla-Haile void SAL_CALL UIControllerFactory::deregisterController(
211*dccf82beSAriel Constenla-Haile const ::rtl::OUString& aCommandURL,
212*dccf82beSAriel Constenla-Haile const rtl::OUString& aModuleName )
213cdf0e10cSrcweir throw (RuntimeException)
214cdf0e10cSrcweir {
215cdf0e10cSrcweir // SAFE
216cdf0e10cSrcweir ResetableGuard aLock( m_aLock );
217*dccf82beSAriel Constenla-Haile
218cdf0e10cSrcweir if ( !m_bConfigRead )
219cdf0e10cSrcweir {
220cdf0e10cSrcweir m_bConfigRead = sal_True;
221cdf0e10cSrcweir m_pConfigAccess->readConfigurationData();
222cdf0e10cSrcweir }
223cdf0e10cSrcweir
224cdf0e10cSrcweir m_pConfigAccess->removeServiceFromCommandModule( aCommandURL, aModuleName );
225cdf0e10cSrcweir // SAFE
226cdf0e10cSrcweir }
227cdf0e10cSrcweir
228*dccf82beSAriel Constenla-Haile
DEFINE_XSERVICEINFO_ONEINSTANCESERVICE(PopupMenuControllerFactory,::cppu::OWeakObject,SERVICENAME_POPUPMENUCONTROLLERFACTORY,IMPLEMENTATIONNAME_POPUPMENUCONTROLLERFACTORY)229*dccf82beSAriel Constenla-Haile DEFINE_XSERVICEINFO_ONEINSTANCESERVICE ( PopupMenuControllerFactory ,
230*dccf82beSAriel Constenla-Haile ::cppu::OWeakObject ,
231*dccf82beSAriel Constenla-Haile SERVICENAME_POPUPMENUCONTROLLERFACTORY ,
232*dccf82beSAriel Constenla-Haile IMPLEMENTATIONNAME_POPUPMENUCONTROLLERFACTORY
233*dccf82beSAriel Constenla-Haile )
234*dccf82beSAriel Constenla-Haile
235*dccf82beSAriel Constenla-Haile DEFINE_INIT_SERVICE ( PopupMenuControllerFactory, {} )
236*dccf82beSAriel Constenla-Haile
237*dccf82beSAriel Constenla-Haile PopupMenuControllerFactory::PopupMenuControllerFactory( const Reference< XMultiServiceFactory >& xServiceManager ) :
238*dccf82beSAriel Constenla-Haile UIControllerFactory(
239*dccf82beSAriel Constenla-Haile xServiceManager,
240*dccf82beSAriel Constenla-Haile rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PopupMenu" )) )
241*dccf82beSAriel Constenla-Haile {
242*dccf82beSAriel Constenla-Haile }
243*dccf82beSAriel Constenla-Haile
DEFINE_XSERVICEINFO_ONEINSTANCESERVICE(ToolbarControllerFactory,::cppu::OWeakObject,SERVICENAME_TOOLBARCONTROLLERFACTORY,IMPLEMENTATIONNAME_TOOLBARCONTROLLERFACTORY)244*dccf82beSAriel Constenla-Haile DEFINE_XSERVICEINFO_ONEINSTANCESERVICE ( ToolbarControllerFactory ,
245*dccf82beSAriel Constenla-Haile ::cppu::OWeakObject ,
246*dccf82beSAriel Constenla-Haile SERVICENAME_TOOLBARCONTROLLERFACTORY ,
247*dccf82beSAriel Constenla-Haile IMPLEMENTATIONNAME_TOOLBARCONTROLLERFACTORY
248*dccf82beSAriel Constenla-Haile )
249*dccf82beSAriel Constenla-Haile
250*dccf82beSAriel Constenla-Haile DEFINE_INIT_SERVICE ( ToolbarControllerFactory, {} )
251*dccf82beSAriel Constenla-Haile
252*dccf82beSAriel Constenla-Haile ToolbarControllerFactory::ToolbarControllerFactory( const Reference< XMultiServiceFactory >& xServiceManager ) :
253*dccf82beSAriel Constenla-Haile UIControllerFactory(
254*dccf82beSAriel Constenla-Haile xServiceManager,
255*dccf82beSAriel Constenla-Haile rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ToolBar" )))
256*dccf82beSAriel Constenla-Haile {
257*dccf82beSAriel Constenla-Haile }
258*dccf82beSAriel Constenla-Haile
DEFINE_XSERVICEINFO_ONEINSTANCESERVICE(StatusbarControllerFactory,::cppu::OWeakObject,SERVICENAME_STATUSBARCONTROLLERFACTORY,IMPLEMENTATIONNAME_STATUSBARCONTROLLERFACTORY)259*dccf82beSAriel Constenla-Haile DEFINE_XSERVICEINFO_ONEINSTANCESERVICE ( StatusbarControllerFactory ,
260*dccf82beSAriel Constenla-Haile ::cppu::OWeakObject ,
261*dccf82beSAriel Constenla-Haile SERVICENAME_STATUSBARCONTROLLERFACTORY ,
262*dccf82beSAriel Constenla-Haile IMPLEMENTATIONNAME_STATUSBARCONTROLLERFACTORY
263*dccf82beSAriel Constenla-Haile )
264*dccf82beSAriel Constenla-Haile
265*dccf82beSAriel Constenla-Haile DEFINE_INIT_SERVICE ( StatusbarControllerFactory, {} )
266*dccf82beSAriel Constenla-Haile
267*dccf82beSAriel Constenla-Haile StatusbarControllerFactory::StatusbarControllerFactory( const Reference< XMultiServiceFactory >& xServiceManager ) :
268*dccf82beSAriel Constenla-Haile UIControllerFactory(
269*dccf82beSAriel Constenla-Haile xServiceManager,
270*dccf82beSAriel Constenla-Haile rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "StatusBar" )) )
271*dccf82beSAriel Constenla-Haile {
272*dccf82beSAriel Constenla-Haile }
273*dccf82beSAriel Constenla-Haile
274cdf0e10cSrcweir } // namespace framework
275