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