1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski *
3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file
5*b1cdbd2cSJim Jagielski * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file
7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski *
11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski *
13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the
17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski * under the License.
19*b1cdbd2cSJim Jagielski *
20*b1cdbd2cSJim Jagielski *************************************************************/
21*b1cdbd2cSJim Jagielski
22*b1cdbd2cSJim Jagielski
23*b1cdbd2cSJim Jagielski
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_framework.hxx"
26*b1cdbd2cSJim Jagielski
27*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
28*b1cdbd2cSJim Jagielski // my own includes
29*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
30*b1cdbd2cSJim Jagielski
31*b1cdbd2cSJim Jagielski #ifndef __FRAMEWORK_UICONFIGURATION_UICATEGORYDESCRPTION_HXX_
32*b1cdbd2cSJim Jagielski #include "uiconfiguration/uicategorydescription.hxx"
33*b1cdbd2cSJim Jagielski #endif
34*b1cdbd2cSJim Jagielski #include <threadhelp/resetableguard.hxx>
35*b1cdbd2cSJim Jagielski #include "services.h"
36*b1cdbd2cSJim Jagielski
37*b1cdbd2cSJim Jagielski #include "properties.h"
38*b1cdbd2cSJim Jagielski
39*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
40*b1cdbd2cSJim Jagielski // interface includes
41*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
42*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/PropertyValue.hpp>
43*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/XPropertySet.hpp>
44*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XNameAccess.hpp>
45*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XNameContainer.hpp>
46*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XContainer.hpp>
47*b1cdbd2cSJim Jagielski
48*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
49*b1cdbd2cSJim Jagielski // includes of other projects
50*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
51*b1cdbd2cSJim Jagielski #include <rtl/ustrbuf.hxx>
52*b1cdbd2cSJim Jagielski #include <cppuhelper/implbase2.hxx>
53*b1cdbd2cSJim Jagielski #include <unotools/configmgr.hxx>
54*b1cdbd2cSJim Jagielski #include <tools/string.hxx>
55*b1cdbd2cSJim Jagielski
56*b1cdbd2cSJim Jagielski #ifndef _VCL_MNEMONIC_HXX_
57*b1cdbd2cSJim Jagielski #include <vcl/mnemonic.hxx>
58*b1cdbd2cSJim Jagielski #endif
59*b1cdbd2cSJim Jagielski #include <comphelper/sequence.hxx>
60*b1cdbd2cSJim Jagielski #include <rtl/logfile.hxx>
61*b1cdbd2cSJim Jagielski
62*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
63*b1cdbd2cSJim Jagielski // Defines
64*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
65*b1cdbd2cSJim Jagielski //
66*b1cdbd2cSJim Jagielski
67*b1cdbd2cSJim Jagielski using namespace com::sun::star::uno;
68*b1cdbd2cSJim Jagielski using namespace com::sun::star::lang;
69*b1cdbd2cSJim Jagielski using namespace com::sun::star::beans;
70*b1cdbd2cSJim Jagielski using namespace com::sun::star::container;
71*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::frame;
72*b1cdbd2cSJim Jagielski
73*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
74*b1cdbd2cSJim Jagielski // Namespace
75*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
76*b1cdbd2cSJim Jagielski //
77*b1cdbd2cSJim Jagielski
78*b1cdbd2cSJim Jagielski struct ModuleToCategory
79*b1cdbd2cSJim Jagielski {
80*b1cdbd2cSJim Jagielski const char* pModuleId;
81*b1cdbd2cSJim Jagielski const char* pCommands;
82*b1cdbd2cSJim Jagielski };
83*b1cdbd2cSJim Jagielski
84*b1cdbd2cSJim Jagielski static const char CATEGORY[] = "Category";
85*b1cdbd2cSJim Jagielski static const char GENERIC_MODULE_NAME[] = "generic";
86*b1cdbd2cSJim Jagielski static const char CONFIGURATION_ROOT_ACCESS[] = "/org.openoffice.Office.UI.";
87*b1cdbd2cSJim Jagielski static const char CONFIGURATION_CATEGORY_ELEMENT_ACCESS[] = "/Commands/Categories";
88*b1cdbd2cSJim Jagielski static const char CONFIGURATION_PROPERTY_NAME[] = "Name";
89*b1cdbd2cSJim Jagielski
90*b1cdbd2cSJim Jagielski namespace framework
91*b1cdbd2cSJim Jagielski {
92*b1cdbd2cSJim Jagielski
93*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
94*b1cdbd2cSJim Jagielski // Configuration access class for PopupMenuControllerFactory implementation
95*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
96*b1cdbd2cSJim Jagielski
97*b1cdbd2cSJim Jagielski class ConfigurationAccess_UICategory : // Order is neccessary for right initialization!
98*b1cdbd2cSJim Jagielski private ThreadHelpBase ,
99*b1cdbd2cSJim Jagielski public ::cppu::WeakImplHelper2<XNameAccess,XContainerListener>
100*b1cdbd2cSJim Jagielski {
101*b1cdbd2cSJim Jagielski public:
102*b1cdbd2cSJim Jagielski ConfigurationAccess_UICategory( const ::rtl::OUString& aModuleName, const Reference< XNameAccess >& xGenericUICommands, const Reference< XMultiServiceFactory >& rServiceManager );
103*b1cdbd2cSJim Jagielski virtual ~ConfigurationAccess_UICategory();
104*b1cdbd2cSJim Jagielski
105*b1cdbd2cSJim Jagielski // XNameAccess
106*b1cdbd2cSJim Jagielski virtual ::com::sun::star::uno::Any SAL_CALL getByName( const ::rtl::OUString& aName )
107*b1cdbd2cSJim Jagielski throw (::com::sun::star::container::NoSuchElementException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
108*b1cdbd2cSJim Jagielski
109*b1cdbd2cSJim Jagielski virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getElementNames()
110*b1cdbd2cSJim Jagielski throw (::com::sun::star::uno::RuntimeException);
111*b1cdbd2cSJim Jagielski
112*b1cdbd2cSJim Jagielski virtual sal_Bool SAL_CALL hasByName( const ::rtl::OUString& aName )
113*b1cdbd2cSJim Jagielski throw (::com::sun::star::uno::RuntimeException);
114*b1cdbd2cSJim Jagielski
115*b1cdbd2cSJim Jagielski // XElementAccess
116*b1cdbd2cSJim Jagielski virtual ::com::sun::star::uno::Type SAL_CALL getElementType()
117*b1cdbd2cSJim Jagielski throw (::com::sun::star::uno::RuntimeException);
118*b1cdbd2cSJim Jagielski
119*b1cdbd2cSJim Jagielski virtual sal_Bool SAL_CALL hasElements()
120*b1cdbd2cSJim Jagielski throw (::com::sun::star::uno::RuntimeException);
121*b1cdbd2cSJim Jagielski
122*b1cdbd2cSJim Jagielski // container.XContainerListener
123*b1cdbd2cSJim Jagielski virtual void SAL_CALL elementInserted( const ContainerEvent& aEvent ) throw(RuntimeException);
124*b1cdbd2cSJim Jagielski virtual void SAL_CALL elementRemoved ( const ContainerEvent& aEvent ) throw(RuntimeException);
125*b1cdbd2cSJim Jagielski virtual void SAL_CALL elementReplaced( const ContainerEvent& aEvent ) throw(RuntimeException);
126*b1cdbd2cSJim Jagielski
127*b1cdbd2cSJim Jagielski // lang.XEventListener
128*b1cdbd2cSJim Jagielski virtual void SAL_CALL disposing( const EventObject& aEvent ) throw(RuntimeException);
129*b1cdbd2cSJim Jagielski
130*b1cdbd2cSJim Jagielski protected:
131*b1cdbd2cSJim Jagielski Any getUINameFromID( const rtl::OUString& rId );
132*b1cdbd2cSJim Jagielski Any getUINameFromCache( const rtl::OUString& rId );
133*b1cdbd2cSJim Jagielski Sequence< rtl::OUString > getAllIds();
134*b1cdbd2cSJim Jagielski sal_Bool fillCache();
135*b1cdbd2cSJim Jagielski
136*b1cdbd2cSJim Jagielski private:
137*b1cdbd2cSJim Jagielski typedef ::std::hash_map< ::rtl::OUString,
138*b1cdbd2cSJim Jagielski ::rtl::OUString,
139*b1cdbd2cSJim Jagielski rtl::OUStringHash,
140*b1cdbd2cSJim Jagielski ::std::equal_to< ::rtl::OUString > > IdToInfoCache;
141*b1cdbd2cSJim Jagielski
142*b1cdbd2cSJim Jagielski sal_Bool initializeConfigAccess();
143*b1cdbd2cSJim Jagielski
144*b1cdbd2cSJim Jagielski rtl::OUString m_aConfigCategoryAccess;
145*b1cdbd2cSJim Jagielski rtl::OUString m_aPropUIName;
146*b1cdbd2cSJim Jagielski Reference< XNameAccess > m_xGenericUICategories;
147*b1cdbd2cSJim Jagielski Reference< XMultiServiceFactory > m_xServiceManager;
148*b1cdbd2cSJim Jagielski Reference< XMultiServiceFactory > m_xConfigProvider;
149*b1cdbd2cSJim Jagielski Reference< XNameAccess > m_xConfigAccess;
150*b1cdbd2cSJim Jagielski sal_Bool m_bConfigAccessInitialized;
151*b1cdbd2cSJim Jagielski sal_Bool m_bCacheFilled;
152*b1cdbd2cSJim Jagielski IdToInfoCache m_aIdCache;
153*b1cdbd2cSJim Jagielski };
154*b1cdbd2cSJim Jagielski
155*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
156*b1cdbd2cSJim Jagielski // XInterface, XTypeProvider
157*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
158*b1cdbd2cSJim Jagielski
ConfigurationAccess_UICategory(const rtl::OUString & aModuleName,const Reference<XNameAccess> & rGenericUICategories,const Reference<XMultiServiceFactory> & rServiceManager)159*b1cdbd2cSJim Jagielski ConfigurationAccess_UICategory::ConfigurationAccess_UICategory( const rtl::OUString& aModuleName, const Reference< XNameAccess >& rGenericUICategories, const Reference< XMultiServiceFactory >& rServiceManager ) :
160*b1cdbd2cSJim Jagielski ThreadHelpBase(),
161*b1cdbd2cSJim Jagielski m_aConfigCategoryAccess( RTL_CONSTASCII_USTRINGPARAM( CONFIGURATION_ROOT_ACCESS )),
162*b1cdbd2cSJim Jagielski m_aPropUIName( RTL_CONSTASCII_USTRINGPARAM( CONFIGURATION_PROPERTY_NAME )),
163*b1cdbd2cSJim Jagielski m_xGenericUICategories( rGenericUICategories ),
164*b1cdbd2cSJim Jagielski m_xServiceManager( rServiceManager ),
165*b1cdbd2cSJim Jagielski m_bConfigAccessInitialized( sal_False ),
166*b1cdbd2cSJim Jagielski m_bCacheFilled( sal_False )
167*b1cdbd2cSJim Jagielski {
168*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "ConfigurationAccess_UICategory::ConfigurationAccess_UICategory" );
169*b1cdbd2cSJim Jagielski // Create configuration hierachical access name
170*b1cdbd2cSJim Jagielski m_aConfigCategoryAccess += aModuleName;
171*b1cdbd2cSJim Jagielski m_aConfigCategoryAccess += rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( CONFIGURATION_CATEGORY_ELEMENT_ACCESS ));
172*b1cdbd2cSJim Jagielski
173*b1cdbd2cSJim Jagielski m_xConfigProvider = Reference< XMultiServiceFactory >( rServiceManager->createInstance(SERVICENAME_CFGPROVIDER),UNO_QUERY );
174*b1cdbd2cSJim Jagielski }
175*b1cdbd2cSJim Jagielski
~ConfigurationAccess_UICategory()176*b1cdbd2cSJim Jagielski ConfigurationAccess_UICategory::~ConfigurationAccess_UICategory()
177*b1cdbd2cSJim Jagielski {
178*b1cdbd2cSJim Jagielski // SAFE
179*b1cdbd2cSJim Jagielski ResetableGuard aLock( m_aLock );
180*b1cdbd2cSJim Jagielski Reference< XContainer > xContainer( m_xConfigAccess, UNO_QUERY );
181*b1cdbd2cSJim Jagielski if ( xContainer.is() )
182*b1cdbd2cSJim Jagielski xContainer->removeContainerListener( this );
183*b1cdbd2cSJim Jagielski }
184*b1cdbd2cSJim Jagielski
185*b1cdbd2cSJim Jagielski // XNameAccess
getByName(const::rtl::OUString & rId)186*b1cdbd2cSJim Jagielski Any SAL_CALL ConfigurationAccess_UICategory::getByName( const ::rtl::OUString& rId )
187*b1cdbd2cSJim Jagielski throw ( NoSuchElementException, WrappedTargetException, RuntimeException)
188*b1cdbd2cSJim Jagielski {
189*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "ConfigurationAccess_UICategory::getByName" );
190*b1cdbd2cSJim Jagielski ResetableGuard aLock( m_aLock );
191*b1cdbd2cSJim Jagielski if ( !m_bConfigAccessInitialized )
192*b1cdbd2cSJim Jagielski {
193*b1cdbd2cSJim Jagielski initializeConfigAccess();
194*b1cdbd2cSJim Jagielski m_bConfigAccessInitialized = sal_True;
195*b1cdbd2cSJim Jagielski fillCache();
196*b1cdbd2cSJim Jagielski }
197*b1cdbd2cSJim Jagielski
198*b1cdbd2cSJim Jagielski // SAFE
199*b1cdbd2cSJim Jagielski Any a = getUINameFromID( rId );
200*b1cdbd2cSJim Jagielski
201*b1cdbd2cSJim Jagielski if ( !a.hasValue() )
202*b1cdbd2cSJim Jagielski throw NoSuchElementException();
203*b1cdbd2cSJim Jagielski
204*b1cdbd2cSJim Jagielski return a;
205*b1cdbd2cSJim Jagielski }
206*b1cdbd2cSJim Jagielski
getElementNames()207*b1cdbd2cSJim Jagielski Sequence< ::rtl::OUString > SAL_CALL ConfigurationAccess_UICategory::getElementNames()
208*b1cdbd2cSJim Jagielski throw ( RuntimeException )
209*b1cdbd2cSJim Jagielski {
210*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "ConfigurationAccess_UICategory::getElementNames" );
211*b1cdbd2cSJim Jagielski return getAllIds();
212*b1cdbd2cSJim Jagielski }
213*b1cdbd2cSJim Jagielski
hasByName(const::rtl::OUString & rId)214*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL ConfigurationAccess_UICategory::hasByName( const ::rtl::OUString& rId )
215*b1cdbd2cSJim Jagielski throw (::com::sun::star::uno::RuntimeException)
216*b1cdbd2cSJim Jagielski {
217*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "ConfigurationAccess_UICategory::hasByName" );
218*b1cdbd2cSJim Jagielski return getByName( rId ).hasValue();
219*b1cdbd2cSJim Jagielski }
220*b1cdbd2cSJim Jagielski
221*b1cdbd2cSJim Jagielski // XElementAccess
getElementType()222*b1cdbd2cSJim Jagielski Type SAL_CALL ConfigurationAccess_UICategory::getElementType()
223*b1cdbd2cSJim Jagielski throw ( RuntimeException )
224*b1cdbd2cSJim Jagielski {
225*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "ConfigurationAccess_UICategory::getElementType" );
226*b1cdbd2cSJim Jagielski return( ::getCppuType( (const rtl::OUString*)NULL ) );
227*b1cdbd2cSJim Jagielski }
228*b1cdbd2cSJim Jagielski
hasElements()229*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL ConfigurationAccess_UICategory::hasElements()
230*b1cdbd2cSJim Jagielski throw ( RuntimeException )
231*b1cdbd2cSJim Jagielski {
232*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "ConfigurationAccess_UICategory::hasElements" );
233*b1cdbd2cSJim Jagielski // There must be global categories!
234*b1cdbd2cSJim Jagielski return sal_True;
235*b1cdbd2cSJim Jagielski }
236*b1cdbd2cSJim Jagielski
fillCache()237*b1cdbd2cSJim Jagielski sal_Bool ConfigurationAccess_UICategory::fillCache()
238*b1cdbd2cSJim Jagielski {
239*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "ConfigurationAccess_UICategory::fillCache" );
240*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT( aLog, "framework (cd100003) ::ConfigurationAccess_UICategory::fillCache" );
241*b1cdbd2cSJim Jagielski
242*b1cdbd2cSJim Jagielski if ( m_bCacheFilled )
243*b1cdbd2cSJim Jagielski return sal_True;
244*b1cdbd2cSJim Jagielski
245*b1cdbd2cSJim Jagielski sal_Int32 i( 0 );
246*b1cdbd2cSJim Jagielski rtl::OUString aUIName;
247*b1cdbd2cSJim Jagielski Sequence< ::rtl::OUString > aNameSeq = m_xConfigAccess->getElementNames();
248*b1cdbd2cSJim Jagielski
249*b1cdbd2cSJim Jagielski for ( i = 0; i < aNameSeq.getLength(); i++ )
250*b1cdbd2cSJim Jagielski {
251*b1cdbd2cSJim Jagielski try
252*b1cdbd2cSJim Jagielski {
253*b1cdbd2cSJim Jagielski Reference< XNameAccess > xNameAccess(m_xConfigAccess->getByName( aNameSeq[i] ),UNO_QUERY);
254*b1cdbd2cSJim Jagielski if ( xNameAccess.is() )
255*b1cdbd2cSJim Jagielski {
256*b1cdbd2cSJim Jagielski xNameAccess->getByName( m_aPropUIName ) >>= aUIName;
257*b1cdbd2cSJim Jagielski
258*b1cdbd2cSJim Jagielski m_aIdCache.insert( IdToInfoCache::value_type( aNameSeq[i], aUIName ));
259*b1cdbd2cSJim Jagielski }
260*b1cdbd2cSJim Jagielski }
261*b1cdbd2cSJim Jagielski catch ( com::sun::star::lang::WrappedTargetException& )
262*b1cdbd2cSJim Jagielski {
263*b1cdbd2cSJim Jagielski }
264*b1cdbd2cSJim Jagielski catch ( com::sun::star::container::NoSuchElementException& )
265*b1cdbd2cSJim Jagielski {
266*b1cdbd2cSJim Jagielski }
267*b1cdbd2cSJim Jagielski }
268*b1cdbd2cSJim Jagielski
269*b1cdbd2cSJim Jagielski m_bCacheFilled = sal_True;
270*b1cdbd2cSJim Jagielski
271*b1cdbd2cSJim Jagielski return sal_True;
272*b1cdbd2cSJim Jagielski }
273*b1cdbd2cSJim Jagielski
getUINameFromID(const rtl::OUString & rId)274*b1cdbd2cSJim Jagielski Any ConfigurationAccess_UICategory::getUINameFromID( const rtl::OUString& rId )
275*b1cdbd2cSJim Jagielski {
276*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "ConfigurationAccess_UICategory::getUINameFromID" );
277*b1cdbd2cSJim Jagielski Any a;
278*b1cdbd2cSJim Jagielski
279*b1cdbd2cSJim Jagielski try
280*b1cdbd2cSJim Jagielski {
281*b1cdbd2cSJim Jagielski a = getUINameFromCache( rId );
282*b1cdbd2cSJim Jagielski if ( !a.hasValue() )
283*b1cdbd2cSJim Jagielski {
284*b1cdbd2cSJim Jagielski // Try to ask our global commands configuration access
285*b1cdbd2cSJim Jagielski if ( m_xGenericUICategories.is() )
286*b1cdbd2cSJim Jagielski {
287*b1cdbd2cSJim Jagielski try
288*b1cdbd2cSJim Jagielski {
289*b1cdbd2cSJim Jagielski return m_xGenericUICategories->getByName( rId );
290*b1cdbd2cSJim Jagielski }
291*b1cdbd2cSJim Jagielski catch ( com::sun::star::lang::WrappedTargetException& )
292*b1cdbd2cSJim Jagielski {
293*b1cdbd2cSJim Jagielski }
294*b1cdbd2cSJim Jagielski catch ( com::sun::star::container::NoSuchElementException& )
295*b1cdbd2cSJim Jagielski {
296*b1cdbd2cSJim Jagielski }
297*b1cdbd2cSJim Jagielski }
298*b1cdbd2cSJim Jagielski }
299*b1cdbd2cSJim Jagielski }
300*b1cdbd2cSJim Jagielski catch( com::sun::star::container::NoSuchElementException& )
301*b1cdbd2cSJim Jagielski {
302*b1cdbd2cSJim Jagielski }
303*b1cdbd2cSJim Jagielski catch ( com::sun::star::lang::WrappedTargetException& )
304*b1cdbd2cSJim Jagielski {
305*b1cdbd2cSJim Jagielski }
306*b1cdbd2cSJim Jagielski
307*b1cdbd2cSJim Jagielski return a;
308*b1cdbd2cSJim Jagielski }
309*b1cdbd2cSJim Jagielski
getUINameFromCache(const rtl::OUString & rId)310*b1cdbd2cSJim Jagielski Any ConfigurationAccess_UICategory::getUINameFromCache( const rtl::OUString& rId )
311*b1cdbd2cSJim Jagielski {
312*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "ConfigurationAccess_UICategory::getUINameFromCache" );
313*b1cdbd2cSJim Jagielski Any a;
314*b1cdbd2cSJim Jagielski
315*b1cdbd2cSJim Jagielski IdToInfoCache::const_iterator pIter = m_aIdCache.find( rId );
316*b1cdbd2cSJim Jagielski if ( pIter != m_aIdCache.end() )
317*b1cdbd2cSJim Jagielski a <<= pIter->second;
318*b1cdbd2cSJim Jagielski
319*b1cdbd2cSJim Jagielski return a;
320*b1cdbd2cSJim Jagielski }
321*b1cdbd2cSJim Jagielski
getAllIds()322*b1cdbd2cSJim Jagielski Sequence< rtl::OUString > ConfigurationAccess_UICategory::getAllIds()
323*b1cdbd2cSJim Jagielski {
324*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "ConfigurationAccess_UICategory::getAllIds" );
325*b1cdbd2cSJim Jagielski // SAFE
326*b1cdbd2cSJim Jagielski ResetableGuard aLock( m_aLock );
327*b1cdbd2cSJim Jagielski
328*b1cdbd2cSJim Jagielski if ( !m_bConfigAccessInitialized )
329*b1cdbd2cSJim Jagielski {
330*b1cdbd2cSJim Jagielski initializeConfigAccess();
331*b1cdbd2cSJim Jagielski m_bConfigAccessInitialized = sal_True;
332*b1cdbd2cSJim Jagielski fillCache();
333*b1cdbd2cSJim Jagielski }
334*b1cdbd2cSJim Jagielski
335*b1cdbd2cSJim Jagielski if ( m_xConfigAccess.is() )
336*b1cdbd2cSJim Jagielski {
337*b1cdbd2cSJim Jagielski Any a;
338*b1cdbd2cSJim Jagielski Reference< XNameAccess > xNameAccess;
339*b1cdbd2cSJim Jagielski
340*b1cdbd2cSJim Jagielski try
341*b1cdbd2cSJim Jagielski {
342*b1cdbd2cSJim Jagielski Sequence< ::rtl::OUString > aNameSeq = m_xConfigAccess->getElementNames();
343*b1cdbd2cSJim Jagielski
344*b1cdbd2cSJim Jagielski if ( m_xGenericUICategories.is() )
345*b1cdbd2cSJim Jagielski {
346*b1cdbd2cSJim Jagielski // Create concat list of supported user interface commands of the module
347*b1cdbd2cSJim Jagielski Sequence< ::rtl::OUString > aGenericNameSeq = m_xGenericUICategories->getElementNames();
348*b1cdbd2cSJim Jagielski sal_uInt32 nCount1 = aNameSeq.getLength();
349*b1cdbd2cSJim Jagielski sal_uInt32 nCount2 = aGenericNameSeq.getLength();
350*b1cdbd2cSJim Jagielski
351*b1cdbd2cSJim Jagielski aNameSeq.realloc( nCount1 + nCount2 );
352*b1cdbd2cSJim Jagielski ::rtl::OUString* pNameSeq = aNameSeq.getArray();
353*b1cdbd2cSJim Jagielski const ::rtl::OUString* pGenericSeq = aGenericNameSeq.getConstArray();
354*b1cdbd2cSJim Jagielski for ( sal_uInt32 i = 0; i < nCount2; i++ )
355*b1cdbd2cSJim Jagielski pNameSeq[nCount1+i] = pGenericSeq[i];
356*b1cdbd2cSJim Jagielski }
357*b1cdbd2cSJim Jagielski
358*b1cdbd2cSJim Jagielski return aNameSeq;
359*b1cdbd2cSJim Jagielski }
360*b1cdbd2cSJim Jagielski catch( com::sun::star::container::NoSuchElementException& )
361*b1cdbd2cSJim Jagielski {
362*b1cdbd2cSJim Jagielski }
363*b1cdbd2cSJim Jagielski catch ( com::sun::star::lang::WrappedTargetException& )
364*b1cdbd2cSJim Jagielski {
365*b1cdbd2cSJim Jagielski }
366*b1cdbd2cSJim Jagielski }
367*b1cdbd2cSJim Jagielski
368*b1cdbd2cSJim Jagielski return Sequence< rtl::OUString >();
369*b1cdbd2cSJim Jagielski }
370*b1cdbd2cSJim Jagielski
initializeConfigAccess()371*b1cdbd2cSJim Jagielski sal_Bool ConfigurationAccess_UICategory::initializeConfigAccess()
372*b1cdbd2cSJim Jagielski {
373*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "ConfigurationAccess_UICategory::initializeConfigAccess" );
374*b1cdbd2cSJim Jagielski Sequence< Any > aArgs( 1 );
375*b1cdbd2cSJim Jagielski PropertyValue aPropValue;
376*b1cdbd2cSJim Jagielski
377*b1cdbd2cSJim Jagielski try
378*b1cdbd2cSJim Jagielski {
379*b1cdbd2cSJim Jagielski aPropValue.Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "nodepath" ));
380*b1cdbd2cSJim Jagielski aPropValue.Value <<= m_aConfigCategoryAccess;
381*b1cdbd2cSJim Jagielski aArgs[0] <<= aPropValue;
382*b1cdbd2cSJim Jagielski
383*b1cdbd2cSJim Jagielski m_xConfigAccess = Reference< XNameAccess >( m_xConfigProvider->createInstanceWithArguments(SERVICENAME_CFGREADACCESS,aArgs ),UNO_QUERY );
384*b1cdbd2cSJim Jagielski if ( m_xConfigAccess.is() )
385*b1cdbd2cSJim Jagielski {
386*b1cdbd2cSJim Jagielski // Add as container listener
387*b1cdbd2cSJim Jagielski Reference< XContainer > xContainer( m_xConfigAccess, UNO_QUERY );
388*b1cdbd2cSJim Jagielski if ( xContainer.is() )
389*b1cdbd2cSJim Jagielski xContainer->addContainerListener( this );
390*b1cdbd2cSJim Jagielski }
391*b1cdbd2cSJim Jagielski
392*b1cdbd2cSJim Jagielski return sal_True;
393*b1cdbd2cSJim Jagielski }
394*b1cdbd2cSJim Jagielski catch ( WrappedTargetException& )
395*b1cdbd2cSJim Jagielski {
396*b1cdbd2cSJim Jagielski }
397*b1cdbd2cSJim Jagielski catch ( Exception& )
398*b1cdbd2cSJim Jagielski {
399*b1cdbd2cSJim Jagielski }
400*b1cdbd2cSJim Jagielski
401*b1cdbd2cSJim Jagielski return sal_False;
402*b1cdbd2cSJim Jagielski }
403*b1cdbd2cSJim Jagielski
404*b1cdbd2cSJim Jagielski // container.XContainerListener
elementInserted(const ContainerEvent &)405*b1cdbd2cSJim Jagielski void SAL_CALL ConfigurationAccess_UICategory::elementInserted( const ContainerEvent& ) throw(RuntimeException)
406*b1cdbd2cSJim Jagielski {
407*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "ConfigurationAccess_UICategory::elementInserted" );
408*b1cdbd2cSJim Jagielski }
409*b1cdbd2cSJim Jagielski
elementRemoved(const ContainerEvent &)410*b1cdbd2cSJim Jagielski void SAL_CALL ConfigurationAccess_UICategory::elementRemoved ( const ContainerEvent& ) throw(RuntimeException)
411*b1cdbd2cSJim Jagielski {
412*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "ConfigurationAccess_UICategory::elementRemoved " );
413*b1cdbd2cSJim Jagielski }
414*b1cdbd2cSJim Jagielski
elementReplaced(const ContainerEvent &)415*b1cdbd2cSJim Jagielski void SAL_CALL ConfigurationAccess_UICategory::elementReplaced( const ContainerEvent& ) throw(RuntimeException)
416*b1cdbd2cSJim Jagielski {
417*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "ConfigurationAccess_UICategory::elementReplaced" );
418*b1cdbd2cSJim Jagielski }
419*b1cdbd2cSJim Jagielski
420*b1cdbd2cSJim Jagielski // lang.XEventListener
disposing(const EventObject & aEvent)421*b1cdbd2cSJim Jagielski void SAL_CALL ConfigurationAccess_UICategory::disposing( const EventObject& aEvent ) throw(RuntimeException)
422*b1cdbd2cSJim Jagielski {
423*b1cdbd2cSJim Jagielski RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "ConfigurationAccess_UICategory::disposing" );
424*b1cdbd2cSJim Jagielski // SAFE
425*b1cdbd2cSJim Jagielski // remove our reference to the config access
426*b1cdbd2cSJim Jagielski ResetableGuard aLock( m_aLock );
427*b1cdbd2cSJim Jagielski
428*b1cdbd2cSJim Jagielski Reference< XInterface > xIfac1( aEvent.Source, UNO_QUERY );
429*b1cdbd2cSJim Jagielski Reference< XInterface > xIfac2( m_xConfigAccess, UNO_QUERY );
430*b1cdbd2cSJim Jagielski if ( xIfac1 == xIfac2 )
431*b1cdbd2cSJim Jagielski m_xConfigAccess.clear();
432*b1cdbd2cSJim Jagielski }
433*b1cdbd2cSJim Jagielski
434*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
435*b1cdbd2cSJim Jagielski // XInterface, XTypeProvider, XServiceInfo
436*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
DEFINE_XSERVICEINFO_ONEINSTANCESERVICE(UICategoryDescription,::cppu::OWeakObject,SERVICENAME_UICATEGORYDESCRIPTION,IMPLEMENTATIONNAME_UICATEGORYDESCRIPTION)437*b1cdbd2cSJim Jagielski DEFINE_XSERVICEINFO_ONEINSTANCESERVICE ( UICategoryDescription ,
438*b1cdbd2cSJim Jagielski ::cppu::OWeakObject ,
439*b1cdbd2cSJim Jagielski SERVICENAME_UICATEGORYDESCRIPTION ,
440*b1cdbd2cSJim Jagielski IMPLEMENTATIONNAME_UICATEGORYDESCRIPTION
441*b1cdbd2cSJim Jagielski )
442*b1cdbd2cSJim Jagielski
443*b1cdbd2cSJim Jagielski DEFINE_INIT_SERVICE ( UICategoryDescription, {} )
444*b1cdbd2cSJim Jagielski
445*b1cdbd2cSJim Jagielski UICategoryDescription::UICategoryDescription( const Reference< XMultiServiceFactory >& xServiceManager ) :
446*b1cdbd2cSJim Jagielski UICommandDescription(xServiceManager,true)
447*b1cdbd2cSJim Jagielski {
448*b1cdbd2cSJim Jagielski Reference< XNameAccess > xEmpty;
449*b1cdbd2cSJim Jagielski rtl::OUString aGenericCategories( RTL_CONSTASCII_USTRINGPARAM( "GenericCategories" ));
450*b1cdbd2cSJim Jagielski m_xGenericUICommands = new ConfigurationAccess_UICategory( aGenericCategories, xEmpty, xServiceManager );
451*b1cdbd2cSJim Jagielski
452*b1cdbd2cSJim Jagielski // insert generic categories mappings
453*b1cdbd2cSJim Jagielski m_aModuleToCommandFileMap.insert( ModuleToCommandFileMap::value_type(
454*b1cdbd2cSJim Jagielski rtl::OUString::createFromAscii( GENERIC_MODULE_NAME ), aGenericCategories ));
455*b1cdbd2cSJim Jagielski
456*b1cdbd2cSJim Jagielski UICommandsHashMap::iterator pCatIter = m_aUICommandsHashMap.find( aGenericCategories );
457*b1cdbd2cSJim Jagielski if ( pCatIter != m_aUICommandsHashMap.end() )
458*b1cdbd2cSJim Jagielski pCatIter->second = m_xGenericUICommands;
459*b1cdbd2cSJim Jagielski
460*b1cdbd2cSJim Jagielski impl_fillElements("ooSetupFactoryCmdCategoryConfigRef");
461*b1cdbd2cSJim Jagielski }
462*b1cdbd2cSJim Jagielski
~UICategoryDescription()463*b1cdbd2cSJim Jagielski UICategoryDescription::~UICategoryDescription()
464*b1cdbd2cSJim Jagielski {
465*b1cdbd2cSJim Jagielski }
impl_createConfigAccess(const::rtl::OUString & _sName)466*b1cdbd2cSJim Jagielski Reference< XNameAccess > UICategoryDescription::impl_createConfigAccess(const ::rtl::OUString& _sName)
467*b1cdbd2cSJim Jagielski {
468*b1cdbd2cSJim Jagielski return new ConfigurationAccess_UICategory( _sName,m_xGenericUICommands,m_xServiceManager );
469*b1cdbd2cSJim Jagielski }
470*b1cdbd2cSJim Jagielski
471*b1cdbd2cSJim Jagielski } // namespace framework
472*b1cdbd2cSJim Jagielski
473