Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*************************************************************************
3 : : *
4 : : * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 : : *
6 : : * Copyright 2000, 2010 Oracle and/or its affiliates.
7 : : *
8 : : * OpenOffice.org - a multi-platform office productivity suite
9 : : *
10 : : * This file is part of OpenOffice.org.
11 : : *
12 : : * OpenOffice.org is free software: you can redistribute it and/or modify
13 : : * it under the terms of the GNU Lesser General Public License version 3
14 : : * only, as published by the Free Software Foundation.
15 : : *
16 : : * OpenOffice.org is distributed in the hope that it will be useful,
17 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 : : * GNU Lesser General Public License version 3 for more details
20 : : * (a copy is included in the LICENSE file that accompanied this code).
21 : : *
22 : : * You should have received a copy of the GNU Lesser General Public License
23 : : * version 3 along with OpenOffice.org. If not, see
24 : : * <http://www.openoffice.org/license.html>
25 : : * for a copy of the LGPLv3 License.
26 : : *
27 : : ************************************************************************/
28 : :
29 : : #include "uiconfiguration/windowstateconfiguration.hxx"
30 : : #include <threadhelp/resetableguard.hxx>
31 : : #include "services.h"
32 : :
33 : : #include "helper/mischelper.hxx"
34 : :
35 : : #include <com/sun/star/beans/PropertyValue.hpp>
36 : : #include <com/sun/star/beans/XPropertySet.hpp>
37 : : #include <com/sun/star/container/XNameAccess.hpp>
38 : : #include <com/sun/star/container/XNameContainer.hpp>
39 : : #include <com/sun/star/container/XContainer.hpp>
40 : : #include <com/sun/star/awt/Point.hpp>
41 : : #include <com/sun/star/awt/Size.hpp>
42 : : #include <com/sun/star/ui/DockingArea.hpp>
43 : : #include <com/sun/star/util/XChangesBatch.hpp>
44 : :
45 : : #include <rtl/ustrbuf.hxx>
46 : : #include <cppuhelper/weak.hxx>
47 : : #include <tools/debug.hxx>
48 : :
49 : : //_________________________________________________________________________________________________________________
50 : : // Defines
51 : : //_________________________________________________________________________________________________________________
52 : :
53 : : using namespace com::sun::star::uno;
54 : : using namespace com::sun::star::lang;
55 : : using namespace com::sun::star::beans;
56 : : using namespace com::sun::star::util;
57 : : using namespace com::sun::star::container;
58 : : using namespace ::com::sun::star::frame;
59 : : using namespace ::com::sun::star::ui;
60 : :
61 : : //_________________________________________________________________________________________________________________
62 : : // Namespace
63 : : //_________________________________________________________________________________________________________________
64 : :
65 : : static const char CONFIGURATION_ROOT_ACCESS[] = "/org.openoffice.Office.UI.";
66 : : static const char CONFIGURATION_WINDOWSTATE_ACCESS[] = "/UIElements/States";
67 : :
68 : : static const char CONFIGURATION_PROPERTY_LOCKED[] = WINDOWSTATE_PROPERTY_LOCKED;
69 : : static const char CONFIGURATION_PROPERTY_DOCKED[] = WINDOWSTATE_PROPERTY_DOCKED;
70 : : static const char CONFIGURATION_PROPERTY_VISIBLE[] = WINDOWSTATE_PROPERTY_VISIBLE;
71 : : static const char CONFIGURATION_PROPERTY_DOCKINGAREA[] = WINDOWSTATE_PROPERTY_DOCKINGAREA;
72 : : static const char CONFIGURATION_PROPERTY_DOCKPOS[] = WINDOWSTATE_PROPERTY_DOCKPOS;
73 : : static const char CONFIGURATION_PROPERTY_DOCKSIZE[] = WINDOWSTATE_PROPERTY_DOCKSIZE;
74 : : static const char CONFIGURATION_PROPERTY_POS[] = WINDOWSTATE_PROPERTY_POS;
75 : : static const char CONFIGURATION_PROPERTY_SIZE[] = WINDOWSTATE_PROPERTY_SIZE;
76 : : static const char CONFIGURATION_PROPERTY_UINAME[] = WINDOWSTATE_PROPERTY_UINAME;
77 : : static const char CONFIGURATION_PROPERTY_INTERNALSTATE[] = WINDOWSTATE_PROPERTY_INTERNALSTATE;
78 : : static const char CONFIGURATION_PROPERTY_STYLE[] = WINDOWSTATE_PROPERTY_STYLE;
79 : : static const char CONFIGURATION_PROPERTY_CONTEXT[] = WINDOWSTATE_PROPERTY_CONTEXT;
80 : : static const char CONFIGURATION_PROPERTY_HIDEFROMMENU[] = WINDOWSTATE_PROPERTY_HIDEFROMENU;
81 : : static const char CONFIGURATION_PROPERTY_NOCLOSE[] = WINDOWSTATE_PROPERTY_NOCLOSE;
82 : : static const char CONFIGURATION_PROPERTY_SOFTCLOSE[] = WINDOWSTATE_PROPERTY_SOFTCLOSE;
83 : : static const char CONFIGURATION_PROPERTY_CONTEXTACTIVE[] = WINDOWSTATE_PROPERTY_CONTEXTACTIVE;
84 : :
85 : : // Zero based indexes, order must be the same as WindowStateMask && CONFIGURATION_PROPERTIES!
86 : : static const sal_Int16 PROPERTY_LOCKED = 0;
87 : : static const sal_Int16 PROPERTY_DOCKED = 1;
88 : : static const sal_Int16 PROPERTY_VISIBLE = 2;
89 : : static const sal_Int16 PROPERTY_CONTEXT = 3;
90 : : static const sal_Int16 PROPERTY_HIDEFROMMENU = 4;
91 : : static const sal_Int16 PROPERTY_NOCLOSE = 5;
92 : : static const sal_Int16 PROPERTY_SOFTCLOSE = 6;
93 : : static const sal_Int16 PROPERTY_CONTEXTACTIVE = 7;
94 : : static const sal_Int16 PROPERTY_DOCKINGAREA = 8;
95 : : static const sal_Int16 PROPERTY_POS = 9;
96 : : static const sal_Int16 PROPERTY_SIZE = 10;
97 : : static const sal_Int16 PROPERTY_UINAME = 11;
98 : : static const sal_Int16 PROPERTY_INTERNALSTATE = 12;
99 : : static const sal_Int16 PROPERTY_STYLE = 13;
100 : : static const sal_Int16 PROPERTY_DOCKPOS = 14;
101 : : static const sal_Int16 PROPERTY_DOCKSIZE = 15;
102 : :
103 : : // Order must be the same as WindowStateMask!!
104 : : static const char* CONFIGURATION_PROPERTIES[] =
105 : : {
106 : : CONFIGURATION_PROPERTY_LOCKED,
107 : : CONFIGURATION_PROPERTY_DOCKED,
108 : : CONFIGURATION_PROPERTY_VISIBLE,
109 : : CONFIGURATION_PROPERTY_CONTEXT,
110 : : CONFIGURATION_PROPERTY_HIDEFROMMENU,
111 : : CONFIGURATION_PROPERTY_NOCLOSE,
112 : : CONFIGURATION_PROPERTY_SOFTCLOSE,
113 : : CONFIGURATION_PROPERTY_CONTEXTACTIVE,
114 : : CONFIGURATION_PROPERTY_DOCKINGAREA,
115 : : CONFIGURATION_PROPERTY_POS,
116 : : CONFIGURATION_PROPERTY_SIZE,
117 : : CONFIGURATION_PROPERTY_UINAME,
118 : : CONFIGURATION_PROPERTY_INTERNALSTATE,
119 : : CONFIGURATION_PROPERTY_STYLE,
120 : : CONFIGURATION_PROPERTY_DOCKPOS,
121 : : CONFIGURATION_PROPERTY_DOCKSIZE,
122 : : 0
123 : : };
124 : :
125 : : namespace framework
126 : : {
127 : :
128 : : //*****************************************************************************************************************
129 : : // Configuration access class for WindowState supplier implementation
130 : : //*****************************************************************************************************************
131 : :
132 : : class ConfigurationAccess_WindowState : // interfaces
133 : : public XTypeProvider ,
134 : : public XNameContainer ,
135 : : public XContainerListener ,
136 : : // baseclasses
137 : : // Order is neccessary for right initialization!
138 : : private ThreadHelpBase ,
139 : : public ::cppu::OWeakObject
140 : : {
141 : : public:
142 : : ConfigurationAccess_WindowState( const ::rtl::OUString& aWindowStateConfigFile, const Reference< XMultiServiceFactory >& rServiceManager );
143 : : virtual ~ConfigurationAccess_WindowState();
144 : :
145 : : // XInterface, XTypeProvider
146 : : FWK_DECLARE_XINTERFACE
147 : : FWK_DECLARE_XTYPEPROVIDER
148 : :
149 : : // XNameAccess
150 : : virtual ::com::sun::star::uno::Any SAL_CALL getByName( const ::rtl::OUString& aName )
151 : : throw (::com::sun::star::container::NoSuchElementException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
152 : :
153 : : virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getElementNames()
154 : : throw (::com::sun::star::uno::RuntimeException);
155 : :
156 : : virtual sal_Bool SAL_CALL hasByName( const ::rtl::OUString& aName )
157 : : throw (::com::sun::star::uno::RuntimeException);
158 : :
159 : : // XNameContainer
160 : : virtual void SAL_CALL removeByName( const ::rtl::OUString& sName )
161 : : throw(css::container::NoSuchElementException, css::lang::WrappedTargetException, css::uno::RuntimeException );
162 : :
163 : : virtual void SAL_CALL insertByName( const ::rtl::OUString& sName, const css::uno::Any& aPropertySet )
164 : : throw(css::lang::IllegalArgumentException, css::container::ElementExistException, css::lang::WrappedTargetException, css::uno::RuntimeException );
165 : :
166 : : // XNameReplace
167 : : virtual void SAL_CALL replaceByName( const ::rtl::OUString& sName, const css::uno::Any& aPropertySet )
168 : : throw(css::lang::IllegalArgumentException, css::container::NoSuchElementException, css::lang::WrappedTargetException, css::uno::RuntimeException );
169 : :
170 : : // XElementAccess
171 : : virtual ::com::sun::star::uno::Type SAL_CALL getElementType()
172 : : throw (::com::sun::star::uno::RuntimeException);
173 : :
174 : : virtual sal_Bool SAL_CALL hasElements()
175 : : throw (::com::sun::star::uno::RuntimeException);
176 : :
177 : : // container.XContainerListener
178 : : virtual void SAL_CALL elementInserted( const ContainerEvent& aEvent ) throw(RuntimeException);
179 : : virtual void SAL_CALL elementRemoved ( const ContainerEvent& aEvent ) throw(RuntimeException);
180 : : virtual void SAL_CALL elementReplaced( const ContainerEvent& aEvent ) throw(RuntimeException);
181 : :
182 : : // lang.XEventListener
183 : : virtual void SAL_CALL disposing( const EventObject& aEvent ) throw(RuntimeException);
184 : :
185 : : protected:
186 : : enum WindowStateMask
187 : : {
188 : : WINDOWSTATE_MASK_LOCKED = 1,
189 : : WINDOWSTATE_MASK_DOCKED = 2,
190 : : WINDOWSTATE_MASK_VISIBLE = 4,
191 : : WINDOWSTATE_MASK_CONTEXT = 8,
192 : : WINDOWSTATE_MASK_HIDEFROMMENU = 16,
193 : : WINDOWSTATE_MASK_NOCLOSE = 32,
194 : : WINDOWSTATE_MASK_SOFTCLOSE = 64,
195 : : WINDOWSTATE_MASK_CONTEXTACTIVE = 128,
196 : : WINDOWSTATE_MASK_DOCKINGAREA = 256,
197 : : WINDOWSTATE_MASK_POS = 512,
198 : : WINDOWSTATE_MASK_SIZE = 1024,
199 : : WINDOWSTATE_MASK_UINAME = 2048,
200 : : WINDOWSTATE_MASK_INTERNALSTATE = 4096,
201 : : WINDOWSTATE_MASK_STYLE = 8192,
202 : : WINDOWSTATE_MASK_DOCKPOS = 16384,
203 : : WINDOWSTATE_MASK_DOCKSIZE = 32768
204 : : };
205 : :
206 : : // Cache structure. Valid values are described by tje eMask member. All other values should not be
207 : : // provided to outside code!
208 : 32540 : struct WindowStateInfo
209 : : {
210 : 5120 : WindowStateInfo() : aDockingArea( ::com::sun::star::ui::DockingArea_DOCKINGAREA_TOP ),
211 : : aDockPos( 0, 0 ),
212 : : aPos( 0, 0 ),
213 : : aSize( 0, 0 ),
214 : : nInternalState( 0 ),
215 : : nStyle( 0 ),
216 : 5120 : nMask( 0 ) {}
217 : :
218 : : bool bLocked : 1,
219 : : bDocked : 1,
220 : : bVisible : 1,
221 : : bContext : 1,
222 : : bHideFromMenu : 1,
223 : : bNoClose : 1,
224 : : bSoftClose : 1,
225 : : bContextActive : 1;
226 : : ::com::sun::star::ui::DockingArea aDockingArea;
227 : : com::sun::star::awt::Point aDockPos;
228 : : com::sun::star::awt::Size aDockSize;
229 : : com::sun::star::awt::Point aPos;
230 : : com::sun::star::awt::Size aSize;
231 : : rtl::OUString aUIName;
232 : : sal_uInt32 nInternalState;
233 : : sal_uInt16 nStyle;
234 : : sal_uInt32 nMask; // see WindowStateMask
235 : : };
236 : :
237 : : void impl_putPropertiesFromStruct( const WindowStateInfo& rWinStateInfo, Reference< XPropertySet >& xPropSet );
238 : : Any impl_insertCacheAndReturnSequence( const rtl::OUString& rResourceURL, Reference< XNameAccess >& rNameAccess );
239 : : WindowStateInfo& impl_insertCacheAndReturnWinState( const rtl::OUString& rResourceURL, Reference< XNameAccess >& rNameAccess );
240 : : Any impl_getSequenceFromStruct( const WindowStateInfo& rWinStateInfo );
241 : : void impl_fillStructFromSequence( WindowStateInfo& rWinStateInfo, const Sequence< PropertyValue >& rSeq );
242 : : Any impl_getWindowStateFromResourceURL( const rtl::OUString& rResourceURL );
243 : : sal_Bool impl_initializeConfigAccess();
244 : :
245 : : private:
246 : : typedef ::boost::unordered_map< ::rtl::OUString,
247 : : WindowStateInfo,
248 : : OUStringHashCode,
249 : : ::std::equal_to< ::rtl::OUString > > ResourceURLToInfoCache;
250 : :
251 : : rtl::OUString m_aConfigWindowAccess;
252 : : Reference< XMultiServiceFactory > m_xServiceManager;
253 : : Reference< XMultiServiceFactory > m_xConfigProvider;
254 : : Reference< XNameAccess > m_xConfigAccess;
255 : : Reference< XContainerListener > m_xConfigListener;
256 : : ResourceURLToInfoCache m_aResourceURLToInfoCache;
257 : : sal_Bool m_bConfigAccessInitialized : 1,
258 : : m_bModified : 1;
259 : : std::vector< ::rtl::OUString > m_aPropArray;
260 : : };
261 : :
262 : : //*****************************************************************************************************************
263 : : // XInterface, XTypeProvider
264 : : //*****************************************************************************************************************
265 [ + + ][ + - ]: 224616 : DEFINE_XINTERFACE_7 ( ConfigurationAccess_WindowState ,
266 : : OWeakObject ,
267 : : DIRECT_INTERFACE ( css::container::XNameContainer ),
268 : : DIRECT_INTERFACE ( css::container::XContainerListener ),
269 : : DIRECT_INTERFACE ( css::lang::XTypeProvider ),
270 : : DERIVED_INTERFACE( css::container::XElementAccess, css::container::XNameAccess ),
271 : : DERIVED_INTERFACE( css::container::XNameAccess, css::container::XNameReplace ),
272 : : DERIVED_INTERFACE( css::container::XNameReplace, css::container::XNameContainer ),
273 : : DERIVED_INTERFACE( css::lang::XEventListener, XContainerListener )
274 : : )
275 : :
276 [ # # ][ # # ]: 0 : DEFINE_XTYPEPROVIDER_7 ( ConfigurationAccess_WindowState ,
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
277 : : css::container::XNameContainer ,
278 : : css::container::XNameReplace ,
279 : : css::container::XNameAccess ,
280 : : css::container::XElementAccess ,
281 : : css::container::XContainerListener ,
282 : : css::lang::XEventListener ,
283 : : css::lang::XTypeProvider
284 : : )
285 : :
286 : 147 : ConfigurationAccess_WindowState::ConfigurationAccess_WindowState( const rtl::OUString& aModuleName, const Reference< XMultiServiceFactory >& rServiceManager ) :
287 : : ThreadHelpBase(),
288 : : m_aConfigWindowAccess( CONFIGURATION_ROOT_ACCESS ),
289 : : m_xServiceManager( rServiceManager ),
290 : : m_bConfigAccessInitialized( sal_False ),
291 [ + - ][ + - ]: 147 : m_bModified( sal_False )
[ + - ]
292 : : {
293 : : // Create configuration hierachical access name
294 : 147 : m_aConfigWindowAccess += aModuleName;
295 : 147 : m_aConfigWindowAccess += rtl::OUString( CONFIGURATION_WINDOWSTATE_ACCESS );
296 [ + - ][ + - ]: 147 : m_xConfigProvider = Reference< XMultiServiceFactory >( rServiceManager->createInstance( SERVICENAME_CFGPROVIDER ), UNO_QUERY );
[ + - ][ + - ]
[ + - ]
297 : :
298 : : // Initialize access array with property names.
299 : 147 : sal_Int32 n = 0;
300 [ + + ]: 2499 : while ( CONFIGURATION_PROPERTIES[n] )
301 : : {
302 [ + - ]: 2352 : m_aPropArray.push_back( ::rtl::OUString::createFromAscii( CONFIGURATION_PROPERTIES[n] ));
303 : 2352 : ++n;
304 : : }
305 : 147 : }
306 : :
307 [ + - ][ + - ]: 137 : ConfigurationAccess_WindowState::~ConfigurationAccess_WindowState()
[ + - ]
308 : : {
309 : : // SAFE
310 [ + - ]: 137 : ResetableGuard aLock( m_aLock );
311 [ + - ]: 137 : Reference< XContainer > xContainer( m_xConfigAccess, UNO_QUERY );
312 [ + - ]: 137 : if ( xContainer.is() )
313 [ + - ][ + - ]: 137 : xContainer->removeContainerListener(m_xConfigListener);
[ + - ]
314 [ - + ]: 274 : }
315 : :
316 : : // XNameAccess
317 : 85907 : Any SAL_CALL ConfigurationAccess_WindowState::getByName( const ::rtl::OUString& rResourceURL )
318 : : throw ( NoSuchElementException, WrappedTargetException, RuntimeException)
319 : : {
320 : : // SAFE
321 [ + - ]: 85907 : ResetableGuard aLock( m_aLock );
322 : :
323 [ + - ]: 85907 : ResourceURLToInfoCache::const_iterator pIter = m_aResourceURLToInfoCache.find( rResourceURL );
324 [ + + ][ + - ]: 85907 : if ( pIter != m_aResourceURLToInfoCache.end() )
325 [ + - ][ + - ]: 80787 : return impl_getSequenceFromStruct( pIter->second );
326 : : else
327 : : {
328 [ + - ]: 5120 : Any a( impl_getWindowStateFromResourceURL( rResourceURL ) );
329 [ - + ]: 5120 : if ( a == Any() )
330 [ # # ]: 0 : throw NoSuchElementException();
331 : : else
332 : 5120 : return a;
333 [ + - ]: 85907 : }
334 : : }
335 : :
336 : 1769 : Sequence< ::rtl::OUString > SAL_CALL ConfigurationAccess_WindowState::getElementNames()
337 : : throw ( RuntimeException )
338 : : {
339 : : // SAFE
340 [ + - ]: 1769 : ResetableGuard aLock( m_aLock );
341 : :
342 [ + + ]: 1769 : if ( !m_bConfigAccessInitialized )
343 : : {
344 [ + - ]: 145 : impl_initializeConfigAccess();
345 : 145 : m_bConfigAccessInitialized = sal_True;
346 : : }
347 : :
348 [ + - ]: 1769 : if ( m_xConfigAccess.is() )
349 [ + - ][ + - ]: 1769 : return m_xConfigAccess->getElementNames();
350 : : else
351 [ # # ][ + - ]: 1769 : return Sequence< ::rtl::OUString > ();
352 : : }
353 : :
354 : 5389 : sal_Bool SAL_CALL ConfigurationAccess_WindowState::hasByName( const ::rtl::OUString& rResourceURL )
355 : : throw (::com::sun::star::uno::RuntimeException)
356 : : {
357 : : // SAFE
358 [ + - ]: 5389 : ResetableGuard aLock( m_aLock );
359 : :
360 [ + - ]: 5389 : ResourceURLToInfoCache::const_iterator pIter = m_aResourceURLToInfoCache.find( rResourceURL );
361 [ + + ][ + - ]: 5389 : if ( pIter != m_aResourceURLToInfoCache.end() )
362 : 3648 : return sal_True;
363 : : else
364 : : {
365 [ + - ]: 1741 : Any a( impl_getWindowStateFromResourceURL( rResourceURL ) );
366 [ + - ]: 1741 : if ( a == Any() )
367 : 1741 : return sal_False;
368 : : else
369 : 1741 : return sal_True;
370 [ + - ]: 5389 : }
371 : : }
372 : :
373 : : // XElementAccess
374 : 0 : Type SAL_CALL ConfigurationAccess_WindowState::getElementType()
375 : : throw ( RuntimeException )
376 : : {
377 : 0 : return( ::getCppuType( (const Sequence< PropertyValue >*)NULL ) );
378 : : }
379 : :
380 : 0 : sal_Bool SAL_CALL ConfigurationAccess_WindowState::hasElements()
381 : : throw ( RuntimeException )
382 : : {
383 : : // SAFE
384 [ # # ]: 0 : ResetableGuard aLock( m_aLock );
385 : :
386 [ # # ]: 0 : if ( !m_bConfigAccessInitialized )
387 : : {
388 [ # # ]: 0 : impl_initializeConfigAccess();
389 : 0 : m_bConfigAccessInitialized = sal_True;
390 : : }
391 : :
392 [ # # ]: 0 : if ( m_xConfigAccess.is() )
393 [ # # ][ # # ]: 0 : return m_xConfigAccess->hasElements();
394 : : else
395 [ # # ]: 0 : return sal_False;
396 : : }
397 : :
398 : : // XNameContainer
399 : 0 : void SAL_CALL ConfigurationAccess_WindowState::removeByName( const ::rtl::OUString& rResourceURL )
400 : : throw( NoSuchElementException, WrappedTargetException, RuntimeException )
401 : : {
402 : : // SAFE
403 [ # # ]: 0 : ResetableGuard aLock( m_aLock );
404 : :
405 [ # # ]: 0 : ResourceURLToInfoCache::iterator pIter = m_aResourceURLToInfoCache.find( rResourceURL );
406 [ # # ][ # # ]: 0 : if ( pIter != m_aResourceURLToInfoCache.end() )
407 [ # # ]: 0 : m_aResourceURLToInfoCache.erase( pIter );
408 : :
409 [ # # ]: 0 : if ( !m_bConfigAccessInitialized )
410 : : {
411 [ # # ]: 0 : impl_initializeConfigAccess();
412 : 0 : m_bConfigAccessInitialized = sal_True;
413 : : }
414 : :
415 : : try
416 : : {
417 : : // Remove must be write-through => remove element from configuration
418 [ # # ]: 0 : Reference< XNameContainer > xNameContainer( m_xConfigAccess, UNO_QUERY );
419 [ # # ]: 0 : if ( xNameContainer.is() )
420 : : {
421 [ # # ]: 0 : aLock.unlock();
422 : :
423 [ # # ][ # # ]: 0 : xNameContainer->removeByName( rResourceURL );
424 [ # # ]: 0 : Reference< XChangesBatch > xFlush( m_xConfigAccess, UNO_QUERY );
425 [ # # ]: 0 : if ( xFlush.is() )
426 [ # # ][ # # ]: 0 : xFlush->commitChanges();
427 [ # # ]: 0 : }
428 : : }
429 [ # # ]: 0 : catch ( const com::sun::star::lang::WrappedTargetException& )
430 : : {
431 [ # # ]: 0 : }
432 : 0 : }
433 : :
434 : 0 : void SAL_CALL ConfigurationAccess_WindowState::insertByName( const ::rtl::OUString& rResourceURL, const css::uno::Any& aPropertySet )
435 : : throw( IllegalArgumentException, ElementExistException, WrappedTargetException, RuntimeException )
436 : : {
437 : : // SAFE
438 [ # # ]: 0 : ResetableGuard aLock( m_aLock );
439 : :
440 [ # # ]: 0 : Sequence< PropertyValue > aPropSet;
441 [ # # ][ # # ]: 0 : if ( aPropertySet >>= aPropSet )
442 : : {
443 [ # # ]: 0 : ResourceURLToInfoCache::const_iterator pIter = m_aResourceURLToInfoCache.find( rResourceURL );
444 [ # # ][ # # ]: 0 : if ( pIter != m_aResourceURLToInfoCache.end() )
445 [ # # ]: 0 : throw ElementExistException();
446 : : else
447 : : {
448 [ # # ]: 0 : if ( !m_bConfigAccessInitialized )
449 : : {
450 [ # # ]: 0 : impl_initializeConfigAccess();
451 : 0 : m_bConfigAccessInitialized = sal_True;
452 : : }
453 : :
454 : : // Try to ask our configuration access
455 [ # # ]: 0 : if ( m_xConfigAccess.is() )
456 : : {
457 [ # # ][ # # ]: 0 : if ( m_xConfigAccess->hasByName( rResourceURL ) )
[ # # ]
458 [ # # ]: 0 : throw ElementExistException();
459 : : else
460 : : {
461 : 0 : WindowStateInfo aWinStateInfo;
462 [ # # ]: 0 : impl_fillStructFromSequence( aWinStateInfo, aPropSet );
463 [ # # ]: 0 : m_aResourceURLToInfoCache.insert( ResourceURLToInfoCache::value_type( rResourceURL, aWinStateInfo ));
464 : :
465 : : // insert must be write-through => insert element into configuration
466 [ # # ]: 0 : Reference< XNameContainer > xNameContainer( m_xConfigAccess, UNO_QUERY );
467 [ # # ]: 0 : if ( xNameContainer.is() )
468 : : {
469 [ # # ]: 0 : Reference< XSingleServiceFactory > xFactory( m_xConfigAccess, UNO_QUERY );
470 [ # # ]: 0 : aLock.unlock();
471 : :
472 : : try
473 : : {
474 [ # # ][ # # ]: 0 : Reference< XPropertySet > xPropSet( xFactory->createInstance(), UNO_QUERY );
[ # # ]
475 [ # # ]: 0 : if ( xPropSet.is() )
476 : : {
477 : 0 : Any a;
478 [ # # ]: 0 : impl_putPropertiesFromStruct( aWinStateInfo, xPropSet );
479 [ # # ]: 0 : a <<= xPropSet;
480 [ # # ][ # # ]: 0 : xNameContainer->insertByName( rResourceURL, a );
481 [ # # ]: 0 : Reference< XChangesBatch > xFlush( xFactory, UNO_QUERY );
482 [ # # ]: 0 : if ( xFlush.is() )
483 [ # # ][ # # ]: 0 : xFlush->commitChanges();
484 [ # # ]: 0 : }
485 : : }
486 [ # # ]: 0 : catch ( const Exception& )
487 : : {
488 : 0 : }
489 : 0 : }
490 : : }
491 : : }
492 : : }
493 : : }
494 : : else
495 [ # # ][ # # ]: 0 : throw IllegalArgumentException();
[ # # ]
496 : 0 : }
497 : :
498 : : // XNameReplace
499 : 3648 : void SAL_CALL ConfigurationAccess_WindowState::replaceByName( const ::rtl::OUString& rResourceURL, const css::uno::Any& aPropertySet )
500 : : throw( IllegalArgumentException, NoSuchElementException, WrappedTargetException, RuntimeException )
501 : : {
502 : : // SAFE
503 [ + - ]: 3648 : ResetableGuard aLock( m_aLock );
504 : :
505 [ + - ]: 3648 : Sequence< PropertyValue > aPropSet;
506 [ + - ][ + - ]: 3648 : if ( aPropertySet >>= aPropSet )
507 : : {
508 [ + - ]: 3648 : ResourceURLToInfoCache::iterator pIter = m_aResourceURLToInfoCache.find( rResourceURL );
509 [ + - ][ + - ]: 3648 : if ( pIter != m_aResourceURLToInfoCache.end() )
510 : : {
511 [ + - ]: 3648 : WindowStateInfo& rWinStateInfo = pIter->second;
512 [ + - ]: 3648 : impl_fillStructFromSequence( rWinStateInfo, aPropSet );
513 : 3648 : m_bModified = sal_True;
514 : : }
515 : : else
516 : : {
517 [ # # ]: 0 : if ( !m_bConfigAccessInitialized )
518 : : {
519 [ # # ]: 0 : impl_initializeConfigAccess();
520 : 0 : m_bConfigAccessInitialized = sal_True;
521 : : }
522 : :
523 : : // Try to ask our configuration access
524 : 0 : Reference< XNameAccess > xNameAccess;
525 [ # # ][ # # ]: 0 : Any a( m_xConfigAccess->getByName( rResourceURL ));
526 : :
527 [ # # ][ # # ]: 0 : if ( a >>= xNameAccess )
528 : : {
529 [ # # ]: 0 : WindowStateInfo& rWinStateInfo( impl_insertCacheAndReturnWinState( rResourceURL, xNameAccess ));
530 [ # # ]: 0 : impl_fillStructFromSequence( rWinStateInfo, aPropSet );
531 : 0 : m_bModified = sal_True;
532 [ # # ]: 0 : pIter = m_aResourceURLToInfoCache.find( rResourceURL );
533 : : }
534 : : else
535 [ # # ]: 0 : throw NoSuchElementException();
536 : : }
537 : :
538 [ + - ][ + - ]: 3648 : if ( m_bModified && pIter != m_aResourceURLToInfoCache.end() )
[ + - ][ + - ]
[ + - # # ]
539 : : {
540 [ + - ]: 3648 : Reference< XNameContainer > xNameContainer( m_xConfigAccess, UNO_QUERY );
541 [ + - ]: 3648 : if ( xNameContainer.is() )
542 : : {
543 [ + - ]: 3648 : WindowStateInfo aWinStateInfo( pIter->second );
544 [ + - ]: 3648 : ::rtl::OUString aResourceURL( pIter->first );
545 : 3648 : m_bModified = sal_False;
546 [ + - ]: 3648 : aLock.unlock();
547 : :
548 : : try
549 : : {
550 : 3648 : Reference< XPropertySet > xPropSet;
551 [ + - ][ + - ]: 3648 : if ( xNameContainer->getByName( aResourceURL ) >>= xPropSet )
[ + - ][ + - ]
552 : : {
553 [ + - ]: 3648 : impl_putPropertiesFromStruct( aWinStateInfo, xPropSet );
554 : :
555 [ + - ]: 3648 : Reference< XChangesBatch > xFlush( m_xConfigAccess, UNO_QUERY );
556 [ + - ]: 3648 : if ( xFlush.is() )
557 [ + - ][ + - ]: 3648 : xFlush->commitChanges();
558 [ # # ]: 3648 : }
559 : : }
560 [ # # ]: 0 : catch ( const Exception& )
561 : : {
562 : 3648 : }
563 : 3648 : }
564 : : }
565 : : }
566 : : else
567 [ + - ][ # # ]: 3648 : throw IllegalArgumentException();
[ + - ]
568 : 3648 : }
569 : :
570 : : // container.XContainerListener
571 : 0 : void SAL_CALL ConfigurationAccess_WindowState::elementInserted( const ContainerEvent& ) throw(RuntimeException)
572 : : {
573 : : // do nothing - next time someone wants to retrieve this node we will find it in the configuration
574 : 0 : }
575 : :
576 : 0 : void SAL_CALL ConfigurationAccess_WindowState::elementRemoved ( const ContainerEvent& ) throw(RuntimeException)
577 : : {
578 : 0 : }
579 : :
580 : 0 : void SAL_CALL ConfigurationAccess_WindowState::elementReplaced( const ContainerEvent& ) throw(RuntimeException)
581 : : {
582 : 0 : }
583 : :
584 : : // lang.XEventListener
585 : 0 : void SAL_CALL ConfigurationAccess_WindowState::disposing( const EventObject& aEvent ) throw(RuntimeException)
586 : : {
587 : : // SAFE
588 : : // remove our reference to the config access
589 [ # # ]: 0 : ResetableGuard aLock( m_aLock );
590 : :
591 [ # # ]: 0 : Reference< XInterface > xIfac1( aEvent.Source, UNO_QUERY );
592 [ # # ]: 0 : Reference< XInterface > xIfac2( m_xConfigAccess, UNO_QUERY );
593 [ # # ][ # # ]: 0 : if ( xIfac1 == xIfac2 )
594 [ # # ]: 0 : m_xConfigAccess.clear();
595 : 0 : }
596 : :
597 : : // private helper methods
598 : 80787 : Any ConfigurationAccess_WindowState::impl_getSequenceFromStruct( const WindowStateInfo& rWinStateInfo )
599 : : {
600 : 80787 : sal_Int32 i( 0 );
601 : 80787 : sal_Int32 nCount( m_aPropArray.size() );
602 [ + - ]: 80787 : Sequence< PropertyValue > aPropSeq;
603 : :
604 [ + + ]: 1373379 : for ( i = 0; i < nCount; i++ )
605 : : {
606 [ + + ]: 1292592 : if ( rWinStateInfo.nMask & ( 1 << i ))
607 : : {
608 : : // put value into the return sequence
609 : 901013 : sal_Int32 nIndex( aPropSeq.getLength());
610 [ + - ]: 901013 : aPropSeq.realloc( nIndex+1 );
611 [ + - ]: 901013 : aPropSeq[nIndex].Name = m_aPropArray[i];
612 : :
613 [ + + + + : 901013 : switch ( i )
+ + + + +
+ + + - +
+ - - ]
614 : : {
615 : : case PROPERTY_LOCKED:
616 [ + - ][ + - ]: 80787 : aPropSeq[nIndex].Value = makeAny( rWinStateInfo.bLocked ); break;
617 : : case PROPERTY_DOCKED:
618 [ + - ][ + - ]: 80787 : aPropSeq[nIndex].Value = makeAny( rWinStateInfo.bDocked ); break;
619 : : case PROPERTY_VISIBLE:
620 [ + - ][ + - ]: 80787 : aPropSeq[nIndex].Value = makeAny( rWinStateInfo.bVisible ); break;
621 : : case PROPERTY_CONTEXT:
622 [ + - ][ + - ]: 80787 : aPropSeq[nIndex].Value = makeAny( rWinStateInfo.bContext ); break;
623 : : case PROPERTY_HIDEFROMMENU:
624 [ + - ][ + - ]: 80787 : aPropSeq[nIndex].Value = makeAny( rWinStateInfo.bHideFromMenu ); break;
625 : : case PROPERTY_NOCLOSE:
626 [ + - ][ + - ]: 80787 : aPropSeq[nIndex].Value = makeAny( rWinStateInfo.bNoClose ); break;
627 : : case PROPERTY_SOFTCLOSE:
628 [ + - ][ + - ]: 80787 : aPropSeq[nIndex].Value = makeAny( rWinStateInfo.bSoftClose ); break;
629 : : case PROPERTY_CONTEXTACTIVE:
630 [ + - ][ + - ]: 80787 : aPropSeq[nIndex].Value = makeAny( rWinStateInfo.bContextActive ); break;
631 : : case PROPERTY_DOCKINGAREA:
632 [ + - ][ + - ]: 40579 : aPropSeq[nIndex].Value = makeAny( rWinStateInfo.aDockingArea ); break;
633 : : case PROPERTY_POS:
634 [ + - ][ + - ]: 6596 : aPropSeq[nIndex].Value = makeAny( rWinStateInfo.aPos ); break;
635 : : case PROPERTY_SIZE:
636 [ + - ][ + - ]: 6490 : aPropSeq[nIndex].Value = makeAny( rWinStateInfo.aSize ); break;
637 : : case PROPERTY_UINAME:
638 [ + - ][ + - ]: 80787 : aPropSeq[nIndex].Value = makeAny( rWinStateInfo.aUIName ); break;
639 : : case PROPERTY_INTERNALSTATE:
640 [ # # ][ # # ]: 0 : aPropSeq[nIndex].Value = makeAny( sal_Int32( rWinStateInfo.nInternalState )); break;
641 : : case PROPERTY_STYLE:
642 [ + - ][ + - ]: 80787 : aPropSeq[nIndex].Value = makeAny( sal_Int16( rWinStateInfo.nStyle )); break;
643 : : case PROPERTY_DOCKPOS:
644 [ + - ][ + - ]: 39478 : aPropSeq[nIndex].Value = makeAny( rWinStateInfo.aDockPos ); break;
645 : : case PROPERTY_DOCKSIZE:
646 [ # # ][ # # ]: 901013 : aPropSeq[nIndex].Value = makeAny( rWinStateInfo.aDockSize ); break;
647 : : default:
648 : : DBG_ASSERT( sal_False, "Wrong value for ConfigurationAccess_WindowState. Who has forgotten to add this new property!" );
649 : : }
650 : : }
651 : : }
652 : :
653 [ + - ][ + - ]: 80787 : return makeAny( aPropSeq );
654 : : }
655 : :
656 : 5120 : Any ConfigurationAccess_WindowState::impl_insertCacheAndReturnSequence( const rtl::OUString& rResourceURL, Reference< XNameAccess >& xNameAccess )
657 : : {
658 : 5120 : sal_Int32 nMask( 0 );
659 : 5120 : sal_Int32 nCount( m_aPropArray.size() );
660 : 5120 : sal_Int32 i( 0 );
661 : 5120 : sal_Int32 nIndex( 0 );
662 [ + - ]: 5120 : Sequence< PropertyValue > aPropSeq;
663 : 5120 : WindowStateInfo aWindowStateInfo;
664 : :
665 [ + + ]: 87040 : for ( i = 0; i < nCount; i++ )
666 : : {
667 : : try
668 : : {
669 : 81920 : bool bAddToSeq( false );
670 [ + - ][ + - ]: 81920 : Any a( xNameAccess->getByName( m_aPropArray[i] ) );
671 [ + + + + : 81920 : switch ( i )
+ + + - ]
672 : : {
673 : : case PROPERTY_LOCKED:
674 : : case PROPERTY_DOCKED:
675 : : case PROPERTY_VISIBLE:
676 : : case PROPERTY_CONTEXT:
677 : : case PROPERTY_HIDEFROMMENU:
678 : : case PROPERTY_NOCLOSE:
679 : : case PROPERTY_SOFTCLOSE:
680 : : case PROPERTY_CONTEXTACTIVE:
681 : : {
682 : 40960 : sal_Bool bValue = sal_Bool();
683 [ + - ]: 40960 : if ( a >>= bValue )
684 : : {
685 : 40960 : sal_Int32 nValue( 1 << i );
686 : 40960 : nMask |= nValue;
687 : 40960 : bAddToSeq = true;
688 [ + + + + : 40960 : switch ( i )
+ + + +
- ]
689 : : {
690 : : case PROPERTY_LOCKED:
691 : 5120 : aWindowStateInfo.bLocked = bValue; break;
692 : : case PROPERTY_DOCKED:
693 : 5120 : aWindowStateInfo.bDocked = bValue; break;
694 : : case PROPERTY_VISIBLE:
695 : 5120 : aWindowStateInfo.bVisible = bValue; break;
696 : : case PROPERTY_CONTEXT:
697 : 5120 : aWindowStateInfo.bContext = bValue; break;
698 : : case PROPERTY_HIDEFROMMENU:
699 : 5120 : aWindowStateInfo.bHideFromMenu = bValue; break;
700 : : case PROPERTY_NOCLOSE:
701 : 5120 : aWindowStateInfo.bNoClose = bValue; break;
702 : : case PROPERTY_SOFTCLOSE:
703 : 5120 : aWindowStateInfo.bSoftClose = bValue; break;
704 : : case PROPERTY_CONTEXTACTIVE:
705 : 40960 : aWindowStateInfo.bContextActive = bValue; break;
706 : : }
707 : : }
708 : : }
709 : 40960 : break;
710 : :
711 : : case PROPERTY_DOCKINGAREA:
712 : : {
713 : 5120 : sal_Int32 nDockingArea = 0;
714 [ + + ]: 5120 : if ( a >>= nDockingArea )
715 : : {
716 [ + - ][ + - ]: 2399 : if (( nDockingArea >= 0 ) &&
717 : : ( nDockingArea <= sal_Int32( DockingArea_DOCKINGAREA_RIGHT )))
718 : : {
719 : 2399 : aWindowStateInfo.aDockingArea = (DockingArea)nDockingArea;
720 : 2399 : nMask |= WINDOWSTATE_MASK_DOCKINGAREA;
721 [ + - ]: 2399 : a = makeAny( aWindowStateInfo.aDockingArea );
722 : 2399 : bAddToSeq = true;
723 : : }
724 : : }
725 : : }
726 : 5120 : break;
727 : :
728 : : case PROPERTY_POS:
729 : : case PROPERTY_DOCKPOS:
730 : : {
731 : 10240 : ::rtl::OUString aString;
732 [ + + ]: 10240 : if ( a >>= aString )
733 : : {
734 : 2285 : sal_Int32 nToken( 0 );
735 : 2285 : ::rtl::OUString aXStr = aString.getToken( 0, ',', nToken );
736 [ + - ]: 2285 : if ( nToken > 0 )
737 : : {
738 : 2285 : com::sun::star::awt::Point aPos;
739 : 2285 : aPos.X = aXStr.toInt32();
740 : 2285 : aPos.Y = aString.getToken( 0, ',', nToken ).toInt32();
741 : :
742 [ + + ]: 2285 : if ( i == PROPERTY_POS )
743 : : {
744 : 72 : aWindowStateInfo.aPos = aPos;
745 : 72 : nMask |= WINDOWSTATE_MASK_POS;
746 : : }
747 : : else
748 : : {
749 : 2213 : aWindowStateInfo.aDockPos = aPos;
750 : 2213 : nMask |= WINDOWSTATE_MASK_DOCKPOS;
751 : : }
752 : :
753 [ + - ]: 2285 : a <<= aPos;
754 : 2285 : bAddToSeq = true;
755 : 2285 : }
756 : 10240 : }
757 : : }
758 : 10240 : break;
759 : :
760 : : case PROPERTY_SIZE:
761 : : case PROPERTY_DOCKSIZE:
762 : : {
763 : 10240 : ::rtl::OUString aString;
764 [ + + ]: 10240 : if ( a >>= aString )
765 : : {
766 : 48 : sal_Int32 nToken( 0 );
767 : 48 : ::rtl::OUString aStr = aString.getToken( 0, ',', nToken );
768 [ + - ]: 48 : if ( nToken > 0 )
769 : : {
770 : 48 : com::sun::star::awt::Size aSize;
771 : 48 : aSize.Width = aStr.toInt32();
772 : 48 : aSize.Height = aString.getToken( 0, ',', nToken ).toInt32();
773 [ + - ]: 48 : if ( i == PROPERTY_SIZE )
774 : : {
775 : 48 : aWindowStateInfo.aSize = aSize;
776 : 48 : nMask |= WINDOWSTATE_MASK_SIZE;
777 : : }
778 : : else
779 : : {
780 : 0 : aWindowStateInfo.aDockSize = aSize;
781 : 0 : nMask |= WINDOWSTATE_MASK_DOCKSIZE;
782 : : }
783 : :
784 [ + - ]: 48 : a <<= aSize;
785 : 48 : bAddToSeq = true;
786 : 48 : }
787 : 10240 : }
788 : : }
789 : 10240 : break;
790 : :
791 : : case PROPERTY_UINAME:
792 : : {
793 : 5120 : ::rtl::OUString aValue;
794 [ + - ]: 5120 : if ( a >>= aValue )
795 : : {
796 : 5120 : nMask |= WINDOWSTATE_MASK_UINAME;
797 : 5120 : aWindowStateInfo.aUIName = aValue;
798 : 5120 : bAddToSeq = true;
799 : 5120 : }
800 : : }
801 : 5120 : break;
802 : :
803 : : case PROPERTY_INTERNALSTATE:
804 : : {
805 : 5120 : sal_uInt32 nValue = 0;
806 [ - + ]: 5120 : if ( a >>= nValue )
807 : : {
808 : 0 : nMask |= WINDOWSTATE_MASK_INTERNALSTATE;
809 : 0 : aWindowStateInfo.nInternalState = nValue;
810 : 0 : bAddToSeq = true;
811 : : }
812 : : }
813 : 5120 : break;
814 : :
815 : : case PROPERTY_STYLE:
816 : : {
817 : 5120 : sal_Int32 nValue = 0;
818 [ + - ]: 5120 : if ( a >>= nValue )
819 : : {
820 : 5120 : nMask |= WINDOWSTATE_MASK_STYLE;
821 : 5120 : aWindowStateInfo.nStyle = sal_uInt16( nValue );
822 : 5120 : bAddToSeq = true;
823 : : }
824 : : }
825 : 5120 : break;
826 : :
827 : : default:
828 : : DBG_ASSERT( sal_False, "Wrong value for ConfigurationAccess_WindowState. Who has forgotten to add this new property!" );
829 : : }
830 : :
831 [ + + ]: 81920 : if ( bAddToSeq )
832 : : {
833 : : // put value into the return sequence
834 : 55932 : nIndex = aPropSeq.getLength();
835 [ + - ]: 55932 : aPropSeq.realloc( nIndex+1 );
836 [ + - ]: 55932 : aPropSeq[nIndex].Name = m_aPropArray[i];
837 [ + - ]: 55932 : aPropSeq[nIndex].Value = a;
838 [ # # # ]: 81920 : }
839 : : }
840 [ # # ]: 0 : catch( const com::sun::star::container::NoSuchElementException& )
841 : : {
842 : : }
843 [ # # ]: 0 : catch ( const com::sun::star::lang::WrappedTargetException& )
844 : : {
845 : : }
846 : : }
847 : :
848 : 5120 : aWindowStateInfo.nMask = nMask;
849 [ + - ]: 5120 : m_aResourceURLToInfoCache.insert( ResourceURLToInfoCache::value_type( rResourceURL, aWindowStateInfo ));
850 [ + - ][ + - ]: 5120 : return makeAny( aPropSeq );
851 : : }
852 : :
853 : 0 : ConfigurationAccess_WindowState::WindowStateInfo& ConfigurationAccess_WindowState::impl_insertCacheAndReturnWinState( const rtl::OUString& rResourceURL, Reference< XNameAccess >& rNameAccess )
854 : : {
855 : 0 : sal_Int32 nMask( 0 );
856 : 0 : sal_Int32 nCount( m_aPropArray.size() );
857 : 0 : sal_Int32 i( 0 );
858 [ # # ]: 0 : Sequence< PropertyValue > aPropSeq;
859 : 0 : WindowStateInfo aWindowStateInfo;
860 : :
861 [ # # ]: 0 : for ( i = 0; i < nCount; i++ )
862 : : {
863 : : try
864 : : {
865 [ # # ][ # # ]: 0 : Any a( rNameAccess->getByName( m_aPropArray[i] ) );
866 [ # # # # : 0 : switch ( i )
# # # # ]
867 : : {
868 : : case PROPERTY_LOCKED:
869 : : case PROPERTY_DOCKED:
870 : : case PROPERTY_VISIBLE:
871 : : case PROPERTY_CONTEXT:
872 : : case PROPERTY_HIDEFROMMENU:
873 : : case PROPERTY_NOCLOSE:
874 : : case PROPERTY_SOFTCLOSE:
875 : : case PROPERTY_CONTEXTACTIVE:
876 : : {
877 : 0 : sal_Bool bValue = sal_Bool();
878 [ # # ]: 0 : if ( a >>= bValue )
879 : : {
880 : 0 : sal_Int32 nValue( 1 << i );
881 : 0 : nMask |= nValue;
882 [ # # # # : 0 : switch ( i )
# # # #
# ]
883 : : {
884 : : case PROPERTY_LOCKED:
885 : 0 : aWindowStateInfo.bLocked = bValue; break;
886 : : case PROPERTY_DOCKED:
887 : 0 : aWindowStateInfo.bDocked = bValue; break;
888 : : case PROPERTY_VISIBLE:
889 : 0 : aWindowStateInfo.bVisible = bValue; break;
890 : : case PROPERTY_CONTEXT:
891 : 0 : aWindowStateInfo.bContext = bValue; break;
892 : : case PROPERTY_HIDEFROMMENU:
893 : 0 : aWindowStateInfo.bHideFromMenu = bValue; break;
894 : : case PROPERTY_NOCLOSE:
895 : 0 : aWindowStateInfo.bNoClose = bValue; break;
896 : : case PROPERTY_SOFTCLOSE:
897 : 0 : aWindowStateInfo.bNoClose = bValue; break;
898 : : case PROPERTY_CONTEXTACTIVE:
899 : 0 : aWindowStateInfo.bContextActive = bValue; break;
900 : : default:
901 : : DBG_ASSERT( sal_False, "Unknown boolean property in WindowState found!" );
902 : : }
903 : : }
904 : : }
905 : 0 : break;
906 : :
907 : : case PROPERTY_DOCKINGAREA:
908 : : {
909 : 0 : sal_Int32 nDockingArea = 0;
910 [ # # ]: 0 : if ( a >>= nDockingArea )
911 : : {
912 [ # # ][ # # ]: 0 : if (( nDockingArea >= 0 ) &&
913 : : ( nDockingArea <= sal_Int32( DockingArea_DOCKINGAREA_RIGHT )))
914 : : {
915 : 0 : aWindowStateInfo.aDockingArea = (DockingArea)nDockingArea;
916 : 0 : nMask |= WINDOWSTATE_MASK_DOCKINGAREA;
917 : : }
918 : : }
919 : : }
920 : 0 : break;
921 : :
922 : : case PROPERTY_POS:
923 : : case PROPERTY_DOCKPOS:
924 : : {
925 : 0 : ::rtl::OUString aString;
926 [ # # ]: 0 : if ( a >>= aString )
927 : : {
928 : 0 : sal_Int32 nToken( 0 );
929 : 0 : ::rtl::OUString aXStr = aString.getToken( 0, ',', nToken );
930 [ # # ]: 0 : if ( nToken > 0 )
931 : : {
932 : 0 : com::sun::star::awt::Point aPos;
933 : 0 : aPos.X = aXStr.toInt32();
934 : 0 : aPos.Y = aString.getToken( 0, ',', nToken ).toInt32();
935 : :
936 [ # # ]: 0 : if ( i == PROPERTY_POS )
937 : : {
938 : 0 : aWindowStateInfo.aPos = aPos;
939 : 0 : nMask |= WINDOWSTATE_MASK_POS;
940 : : }
941 : : else
942 : : {
943 : 0 : aWindowStateInfo.aDockPos = aPos;
944 : 0 : nMask |= WINDOWSTATE_MASK_DOCKPOS;
945 : : }
946 : 0 : }
947 : 0 : }
948 : : }
949 : 0 : break;
950 : :
951 : : case PROPERTY_SIZE:
952 : : case PROPERTY_DOCKSIZE:
953 : : {
954 : 0 : ::rtl::OUString aString;
955 [ # # ]: 0 : if ( a >>= aString )
956 : : {
957 : 0 : sal_Int32 nToken( 0 );
958 : 0 : ::rtl::OUString aStr = aString.getToken( 0, ',', nToken );
959 [ # # ]: 0 : if ( nToken > 0 )
960 : : {
961 : 0 : com::sun::star::awt::Size aSize;
962 : 0 : aSize.Width = aStr.toInt32();
963 : 0 : aSize.Height = aString.getToken( 0, ',', nToken ).toInt32();
964 [ # # ]: 0 : if ( i == PROPERTY_SIZE )
965 : : {
966 : 0 : aWindowStateInfo.aSize = aSize;
967 : 0 : nMask |= WINDOWSTATE_MASK_SIZE;
968 : : }
969 : : else
970 : : {
971 : 0 : aWindowStateInfo.aDockSize = aSize;
972 : 0 : nMask |= WINDOWSTATE_MASK_DOCKSIZE;
973 : : }
974 : 0 : }
975 : 0 : }
976 : : }
977 : 0 : break;
978 : :
979 : : case PROPERTY_UINAME:
980 : : {
981 : 0 : ::rtl::OUString aValue;
982 [ # # ]: 0 : if ( a >>= aValue )
983 : : {
984 : 0 : nMask |= WINDOWSTATE_MASK_UINAME;
985 : 0 : aWindowStateInfo.aUIName = aValue;
986 : 0 : }
987 : : }
988 : 0 : break;
989 : :
990 : : case PROPERTY_INTERNALSTATE:
991 : : {
992 : 0 : sal_Int32 nValue = 0;
993 [ # # ]: 0 : if ( a >>= nValue )
994 : : {
995 : 0 : nMask |= WINDOWSTATE_MASK_INTERNALSTATE;
996 : 0 : aWindowStateInfo.nInternalState = sal_uInt32( nValue );
997 : : }
998 : : }
999 : 0 : break;
1000 : :
1001 : : case PROPERTY_STYLE:
1002 : : {
1003 : 0 : sal_Int32 nValue = 0;
1004 [ # # ]: 0 : if ( a >>= nValue )
1005 : : {
1006 : 0 : nMask |= WINDOWSTATE_MASK_STYLE;
1007 : 0 : aWindowStateInfo.nStyle = sal_uInt16( nValue );
1008 : : }
1009 : : }
1010 : :
1011 : : default:
1012 : : DBG_ASSERT( sal_False, "Wrong value for ConfigurationAccess_WindowState. Who has forgotten to add this new property!" );
1013 : 0 : }
1014 : : }
1015 [ # # ]: 0 : catch( const com::sun::star::container::NoSuchElementException& )
1016 : : {
1017 : : }
1018 [ # # ]: 0 : catch ( const com::sun::star::lang::WrappedTargetException& )
1019 : : {
1020 : : }
1021 : : }
1022 : :
1023 : 0 : aWindowStateInfo.nMask = nMask;
1024 [ # # ]: 0 : ResourceURLToInfoCache::iterator pIter = (m_aResourceURLToInfoCache.insert( ResourceURLToInfoCache::value_type( rResourceURL, aWindowStateInfo ))).first;
1025 [ # # ]: 0 : return pIter->second;
[ # # # ]
[ # # ]
1026 : : }
1027 : :
1028 : 6861 : Any ConfigurationAccess_WindowState::impl_getWindowStateFromResourceURL( const rtl::OUString& rResourceURL )
1029 : : {
1030 [ + + ]: 6861 : if ( !m_bConfigAccessInitialized )
1031 : : {
1032 : 2 : impl_initializeConfigAccess();
1033 : 2 : m_bConfigAccessInitialized = sal_True;
1034 : : }
1035 : :
1036 : : try
1037 : : {
1038 : : // Try to ask our configuration access
1039 [ + - ][ + - ]: 6861 : if ( m_xConfigAccess.is() && m_xConfigAccess->hasByName( rResourceURL ) )
[ + - ][ + + ]
[ + + ]
1040 : : {
1041 : :
1042 [ + - ][ + - ]: 5120 : Reference< XNameAccess > xNameAccess( m_xConfigAccess->getByName( rResourceURL ), UNO_QUERY );
[ + - ]
1043 [ + - ]: 5120 : if ( xNameAccess.is() )
1044 [ + - ][ - + ]: 5120 : return impl_insertCacheAndReturnSequence( rResourceURL, xNameAccess );
[ # # # ]
1045 : : }
1046 : : }
1047 : 0 : catch( const com::sun::star::container::NoSuchElementException& )
1048 : : {
1049 : : }
1050 : 0 : catch ( const com::sun::star::lang::WrappedTargetException& )
1051 : : {
1052 : : }
1053 : :
1054 : 6861 : return Any();
1055 : : }
1056 : :
1057 : 3648 : void ConfigurationAccess_WindowState::impl_fillStructFromSequence( WindowStateInfo& rWinStateInfo, const Sequence< PropertyValue >& rSeq )
1058 : : {
1059 : 3648 : sal_Int32 nCompareCount( m_aPropArray.size() );
1060 : 3648 : sal_Int32 nCount( rSeq.getLength() );
1061 : 3648 : sal_Int32 i( 0 );
1062 : :
1063 [ + + ]: 32832 : for ( i = 0; i < nCount; i++ )
1064 : : {
1065 [ + - ]: 229824 : for ( sal_Int32 j = 0; j < nCompareCount; j++ )
1066 : : {
1067 [ + + ]: 229824 : if ( rSeq[i].Name.equals( m_aPropArray[j] ))
1068 : : {
1069 [ + + + + : 29184 : switch ( j )
+ - - - ]
1070 : : {
1071 : : case PROPERTY_LOCKED:
1072 : : case PROPERTY_DOCKED:
1073 : : case PROPERTY_VISIBLE:
1074 : : case PROPERTY_CONTEXT:
1075 : : case PROPERTY_HIDEFROMMENU:
1076 : : case PROPERTY_NOCLOSE:
1077 : : case PROPERTY_SOFTCLOSE:
1078 : : case PROPERTY_CONTEXTACTIVE:
1079 : : {
1080 : 10944 : sal_Bool bValue = sal_Bool();
1081 [ + - ]: 10944 : if ( rSeq[i].Value >>= bValue )
1082 : : {
1083 : 10944 : sal_Int32 nValue( 1 << j );
1084 : 10944 : rWinStateInfo.nMask |= nValue;
1085 [ + + + - : 10944 : switch ( j )
- - - -
- ]
1086 : : {
1087 : : case PROPERTY_LOCKED:
1088 : 3648 : rWinStateInfo.bLocked = bValue;
1089 : 3648 : break;
1090 : : case PROPERTY_DOCKED:
1091 : 3648 : rWinStateInfo.bDocked = bValue;
1092 : 3648 : break;
1093 : : case PROPERTY_VISIBLE:
1094 : 3648 : rWinStateInfo.bVisible = bValue;
1095 : 3648 : break;
1096 : : case PROPERTY_CONTEXT:
1097 : 0 : rWinStateInfo.bContext = bValue;
1098 : 0 : break;
1099 : : case PROPERTY_HIDEFROMMENU:
1100 : 0 : rWinStateInfo.bHideFromMenu = bValue;
1101 : 0 : break;
1102 : : case PROPERTY_NOCLOSE:
1103 : 0 : rWinStateInfo.bNoClose = bValue;
1104 : 0 : break;
1105 : : case PROPERTY_SOFTCLOSE:
1106 : 0 : rWinStateInfo.bSoftClose = bValue;
1107 : 0 : break;
1108 : : case PROPERTY_CONTEXTACTIVE:
1109 : 0 : rWinStateInfo.bContextActive = bValue;
1110 : 10944 : break;
1111 : : default:
1112 : : DBG_ASSERT( sal_False, "Unknown boolean property in WindowState found!" );
1113 : : }
1114 : : }
1115 : : }
1116 : 10944 : break;
1117 : :
1118 : : case PROPERTY_DOCKINGAREA:
1119 : : {
1120 : : ::com::sun::star::ui::DockingArea eDockingArea;
1121 [ + - ][ + - ]: 3648 : if ( rSeq[i].Value >>= eDockingArea )
1122 : : {
1123 : 3648 : rWinStateInfo.aDockingArea = eDockingArea;
1124 : 3648 : rWinStateInfo.nMask |= WINDOWSTATE_MASK_DOCKINGAREA;
1125 : : }
1126 : : }
1127 : 3648 : break;
1128 : :
1129 : : case PROPERTY_POS:
1130 : : case PROPERTY_DOCKPOS:
1131 : : {
1132 : 7296 : com::sun::star::awt::Point aPoint;
1133 [ + - ][ + - ]: 7296 : if ( rSeq[i].Value >>= aPoint )
1134 : : {
1135 [ + + ]: 7296 : if ( j == PROPERTY_POS )
1136 : : {
1137 : 3648 : rWinStateInfo.aPos = aPoint;
1138 : 3648 : rWinStateInfo.nMask |= WINDOWSTATE_MASK_POS;
1139 : : }
1140 : : else
1141 : : {
1142 : 3648 : rWinStateInfo.aDockPos = aPoint;
1143 : 3648 : rWinStateInfo.nMask |= WINDOWSTATE_MASK_DOCKPOS;
1144 : : }
1145 : : }
1146 : : }
1147 : 7296 : break;
1148 : :
1149 : : case PROPERTY_SIZE:
1150 : : case PROPERTY_DOCKSIZE:
1151 : : {
1152 : 3648 : com::sun::star::awt::Size aSize;
1153 [ + - ][ + - ]: 3648 : if ( rSeq[i].Value >>= aSize )
1154 : : {
1155 [ + - ]: 3648 : if ( j == PROPERTY_SIZE )
1156 : : {
1157 : 3648 : rWinStateInfo.aSize = aSize;
1158 : 3648 : rWinStateInfo.nMask |= WINDOWSTATE_MASK_SIZE;
1159 : : }
1160 : : else
1161 : : {
1162 : 0 : rWinStateInfo.aDockSize = aSize;
1163 : 0 : rWinStateInfo.nMask |= WINDOWSTATE_MASK_DOCKSIZE;
1164 : : }
1165 : : }
1166 : : }
1167 : 3648 : break;
1168 : :
1169 : : case PROPERTY_UINAME:
1170 : : {
1171 : 3648 : ::rtl::OUString aValue;
1172 [ + - ]: 3648 : if ( rSeq[i].Value >>= aValue )
1173 : : {
1174 : 3648 : rWinStateInfo.aUIName = aValue;
1175 : 3648 : rWinStateInfo.nMask |= WINDOWSTATE_MASK_UINAME;
1176 : 3648 : }
1177 : : }
1178 : 3648 : break;
1179 : :
1180 : : case PROPERTY_INTERNALSTATE:
1181 : : {
1182 : 0 : sal_Int32 nValue = 0;
1183 [ # # ]: 0 : if ( rSeq[i].Value >>= nValue )
1184 : : {
1185 : 0 : rWinStateInfo.nInternalState = sal_uInt32( nValue );
1186 : 0 : rWinStateInfo.nMask |= WINDOWSTATE_MASK_INTERNALSTATE;
1187 : : }
1188 : : }
1189 : 0 : break;
1190 : :
1191 : : case PROPERTY_STYLE:
1192 : : {
1193 : 0 : sal_Int32 nValue = 0;
1194 [ # # ]: 0 : if ( rSeq[i].Value >>= nValue )
1195 : : {
1196 : 0 : rWinStateInfo.nStyle = sal_uInt16( nValue );
1197 : 0 : rWinStateInfo.nMask |= WINDOWSTATE_MASK_STYLE;
1198 : : }
1199 : : }
1200 : 0 : break;
1201 : :
1202 : : default:
1203 : : DBG_ASSERT( sal_False, "Wrong value for ConfigurationAccess_WindowState. Who has forgotten to add this new property!" );
1204 : : }
1205 : :
1206 : 29184 : break;
1207 : : }
1208 : : }
1209 : : }
1210 : 3648 : }
1211 : :
1212 : 3648 : void ConfigurationAccess_WindowState::impl_putPropertiesFromStruct( const WindowStateInfo& rWinStateInfo, Reference< XPropertySet >& xPropSet )
1213 : : {
1214 : 3648 : sal_Int32 i( 0 );
1215 : 3648 : sal_Int32 nCount( m_aPropArray.size() );
1216 [ + - ]: 3648 : Sequence< PropertyValue > aPropSeq;
1217 : 3648 : ::rtl::OUString aDelim( "," );
1218 : :
1219 [ + + ]: 62016 : for ( i = 0; i < nCount; i++ )
1220 : : {
1221 [ + + ]: 58368 : if ( rWinStateInfo.nMask & ( 1 << i ))
1222 : : {
1223 : : try
1224 : : {
1225 : : // put values into the property set
1226 [ + + + + : 51072 : switch ( i )
+ + + + +
+ + + - +
- ]
1227 : : {
1228 : : case PROPERTY_LOCKED:
1229 [ + - ][ + - ]: 3648 : xPropSet->setPropertyValue( m_aPropArray[i], makeAny( sal_Bool( rWinStateInfo.bLocked )) ); break;
[ + - ]
1230 : : case PROPERTY_DOCKED:
1231 [ + - ][ + - ]: 3648 : xPropSet->setPropertyValue( m_aPropArray[i], makeAny( sal_Bool( rWinStateInfo.bDocked )) ); break;
[ + - ]
1232 : : case PROPERTY_VISIBLE:
1233 [ + - ][ + - ]: 3648 : xPropSet->setPropertyValue( m_aPropArray[i], makeAny( sal_Bool( rWinStateInfo.bVisible )) ); break;
[ + - ]
1234 : : case PROPERTY_CONTEXT:
1235 [ + - ][ + - ]: 3648 : xPropSet->setPropertyValue( m_aPropArray[i], makeAny( sal_Bool( rWinStateInfo.bContext )) ); break;
[ + - ]
1236 : : case PROPERTY_HIDEFROMMENU:
1237 [ + - ][ + - ]: 3648 : xPropSet->setPropertyValue( m_aPropArray[i], makeAny( sal_Bool( rWinStateInfo.bHideFromMenu )) ); break;
[ + - ]
1238 : : case PROPERTY_NOCLOSE:
1239 [ + - ][ + - ]: 3648 : xPropSet->setPropertyValue( m_aPropArray[i], makeAny( sal_Bool( rWinStateInfo.bNoClose )) ); break;
[ + - ]
1240 : : case PROPERTY_SOFTCLOSE:
1241 [ + - ][ + - ]: 3648 : xPropSet->setPropertyValue( m_aPropArray[i], makeAny( sal_Bool( rWinStateInfo.bSoftClose )) ); break;
[ + - ]
1242 : : case PROPERTY_CONTEXTACTIVE:
1243 [ + - ][ + - ]: 3648 : xPropSet->setPropertyValue( m_aPropArray[i], makeAny( sal_Bool( rWinStateInfo.bContextActive )) ); break;
[ + - ]
1244 : : case PROPERTY_DOCKINGAREA:
1245 [ + - ][ + - ]: 3648 : xPropSet->setPropertyValue( m_aPropArray[i], makeAny( sal_Int16( rWinStateInfo.aDockingArea ) ) ); break;
[ + - ]
1246 : : case PROPERTY_POS:
1247 : : case PROPERTY_DOCKPOS:
1248 : : {
1249 : 7296 : ::rtl::OUString aPosStr;
1250 [ + + ]: 7296 : if ( i == PROPERTY_POS )
1251 : 3648 : aPosStr = ::rtl::OUString::valueOf( rWinStateInfo.aPos.X );
1252 : : else
1253 : 3648 : aPosStr = ::rtl::OUString::valueOf( rWinStateInfo.aDockPos.X );
1254 : 7296 : aPosStr += aDelim;
1255 [ + + ]: 7296 : if ( i == PROPERTY_POS )
1256 : 3648 : aPosStr += ::rtl::OUString::valueOf( rWinStateInfo.aPos.Y );
1257 : : else
1258 : 3648 : aPosStr += ::rtl::OUString::valueOf( rWinStateInfo.aDockPos.Y );
1259 [ + - ][ + - ]: 7296 : xPropSet->setPropertyValue( m_aPropArray[i], makeAny( aPosStr ) );
[ + - ]
1260 : 7296 : break;
1261 : : }
1262 : : case PROPERTY_SIZE:
1263 : : case PROPERTY_DOCKSIZE:
1264 : : {
1265 : 3648 : ::rtl::OUString aSizeStr;
1266 [ + - ]: 3648 : if ( i == PROPERTY_SIZE )
1267 : 3648 : aSizeStr = ( ::rtl::OUString::valueOf( rWinStateInfo.aSize.Width ));
1268 : : else
1269 : 0 : aSizeStr = ( ::rtl::OUString::valueOf( rWinStateInfo.aDockSize.Width ));
1270 : 3648 : aSizeStr += aDelim;
1271 [ + - ]: 3648 : if ( i == PROPERTY_SIZE )
1272 : 3648 : aSizeStr += ::rtl::OUString::valueOf( rWinStateInfo.aSize.Height );
1273 : : else
1274 : 0 : aSizeStr += ::rtl::OUString::valueOf( rWinStateInfo.aDockSize.Height );
1275 [ + - ][ + - ]: 3648 : xPropSet->setPropertyValue( m_aPropArray[i], makeAny( aSizeStr ) );
[ + - ]
1276 : 3648 : break;
1277 : : }
1278 : : case PROPERTY_UINAME:
1279 [ + - ][ + - ]: 3648 : xPropSet->setPropertyValue( m_aPropArray[i], makeAny( rWinStateInfo.aUIName ) ); break;
[ + - ]
1280 : : case PROPERTY_INTERNALSTATE:
1281 [ # # ][ # # ]: 0 : xPropSet->setPropertyValue( m_aPropArray[i], makeAny( sal_Int32( rWinStateInfo.nInternalState )) ); break;
[ # # ]
1282 : : case PROPERTY_STYLE:
1283 [ + - ][ + - ]: 51072 : xPropSet->setPropertyValue( m_aPropArray[i], makeAny( sal_Int32( rWinStateInfo.nStyle )) ); break;
[ + - ][ # # ]
1284 : : default:
1285 : : DBG_ASSERT( sal_False, "Wrong value for ConfigurationAccess_WindowState. Who has forgotten to add this new property!" );
1286 : : }
1287 : : }
1288 [ # # ]: 0 : catch( const Exception& )
1289 : : {
1290 : : }
1291 : : }
1292 [ + - ]: 3648 : }
1293 : 3648 : }
1294 : :
1295 : 147 : sal_Bool ConfigurationAccess_WindowState::impl_initializeConfigAccess()
1296 : : {
1297 [ + - ]: 147 : Sequence< Any > aArgs( 2 );
1298 : 147 : PropertyValue aPropValue;
1299 : :
1300 : : try
1301 : : {
1302 : 147 : aPropValue.Name = rtl::OUString( "nodepath" );
1303 [ + - ]: 147 : aPropValue.Value <<= m_aConfigWindowAccess;
1304 [ + - ][ + - ]: 147 : aArgs[0] <<= aPropValue;
1305 : 147 : aPropValue.Name = rtl::OUString( "lazywrite" );
1306 [ + - ]: 147 : aPropValue.Value <<= sal_True;
1307 [ + - ][ + - ]: 147 : aArgs[1] <<= aPropValue;
1308 : :
1309 [ + - ]: 147 : m_xConfigAccess = Reference< XNameAccess >( m_xConfigProvider->createInstanceWithArguments(
1310 : 147 : SERVICENAME_CFGUPDATEACCESS, aArgs ),
1311 [ + - ][ + - ]: 147 : UNO_QUERY );
[ + - ][ + - ]
1312 [ + - ]: 147 : if ( m_xConfigAccess.is() )
1313 : : {
1314 : : // Add as container listener
1315 [ + - ]: 147 : Reference< XContainer > xContainer( m_xConfigAccess, UNO_QUERY );
1316 [ + - ]: 147 : if ( xContainer.is() )
1317 : : {
1318 [ + - ][ + - ]: 147 : m_xConfigListener = new WeakContainerListener(this);
[ + - ][ + - ]
1319 [ + - ][ + - ]: 147 : xContainer->addContainerListener(m_xConfigListener);
1320 [ # # # ]: 147 : }
1321 : : }
1322 : :
1323 : 147 : return sal_True;
1324 : : }
1325 [ # # ]: 0 : catch ( const WrappedTargetException& )
1326 : : {
1327 : : }
1328 [ # # ]: 0 : catch ( const Exception& )
1329 : : {
1330 : : }
1331 : :
1332 [ + - ]: 147 : return sal_False;
1333 : : }
1334 : :
1335 : :
1336 : : //*****************************************************************************************************************
1337 : : // XInterface, XTypeProvider, XServiceInfo
1338 : : //*****************************************************************************************************************
1339 [ + + ][ + - ]: 16670 : DEFINE_XINTERFACE_4 ( WindowStateConfiguration ,
1340 : : OWeakObject ,
1341 : : DIRECT_INTERFACE( css::lang::XTypeProvider ),
1342 : : DIRECT_INTERFACE( css::lang::XServiceInfo ),
1343 : : DIRECT_INTERFACE( css::container::XNameAccess ),
1344 : : DERIVED_INTERFACE( css::container::XElementAccess, css::container::XNameAccess )
1345 : : )
1346 : :
1347 [ # # ][ # # ]: 0 : DEFINE_XTYPEPROVIDER_4 ( WindowStateConfiguration ,
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
1348 : : css::lang::XTypeProvider ,
1349 : : css::lang::XServiceInfo ,
1350 : : css::container::XNameAccess ,
1351 : : css::container::XElementAccess
1352 : : )
1353 : :
1354 [ + - ][ + - ]: 1726 : DEFINE_XSERVICEINFO_ONEINSTANCESERVICE ( WindowStateConfiguration ,
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ # # ]
[ # # ]
1355 : : ::cppu::OWeakObject ,
1356 : : SERVICENAME_WINDOWSTATECONFIGURATION ,
1357 : : IMPLEMENTATIONNAME_WINDOWSTATECONFIGURATION
1358 : : )
1359 : :
1360 : 113 : DEFINE_INIT_SERVICE ( WindowStateConfiguration, {} )
1361 : :
1362 : 113 : WindowStateConfiguration::WindowStateConfiguration( const Reference< XMultiServiceFactory >& xServiceManager ) :
1363 : : ThreadHelpBase(),
1364 [ + - ][ + - ]: 113 : m_xServiceManager( xServiceManager )
[ + - ]
1365 : : {
1366 [ + - ]: 113 : m_xModuleManager = Reference< XModuleManager >( m_xServiceManager->createInstance( SERVICENAME_MODULEMANAGER ),
1367 [ + - ][ + - ]: 113 : UNO_QUERY );
[ + - ][ + - ]
1368 : 113 : Reference< XNameAccess > xEmptyNameAccess;
1369 [ + - ]: 113 : Reference< XNameAccess > xNameAccess( m_xModuleManager, UNO_QUERY_THROW );
1370 [ + - ]: 113 : Sequence< rtl::OUString > aElementNames;
1371 : : try
1372 : : {
1373 [ + - ][ + - ]: 113 : aElementNames = xNameAccess->getElementNames();
[ + - ][ + - ]
[ # # ]
1374 : : }
1375 [ # # ]: 0 : catch (const ::com::sun::star::uno::RuntimeException &)
1376 : : {
1377 : : }
1378 [ + - ]: 113 : Sequence< PropertyValue > aSeq;
1379 : 113 : ::rtl::OUString aModuleIdentifier;
1380 : :
1381 [ + + ]: 2548 : for ( sal_Int32 i = 0; i < aElementNames.getLength(); i++ )
1382 : : {
1383 [ + - ]: 2435 : aModuleIdentifier = aElementNames[i];
1384 [ + - ][ + - ]: 2435 : if ( xNameAccess->getByName( aModuleIdentifier ) >>= aSeq )
[ + - ][ + - ]
1385 : : {
1386 : 2435 : ::rtl::OUString aWindowStateFileStr;
1387 [ + - ]: 38960 : for ( sal_Int32 y = 0; y < aSeq.getLength(); y++ )
1388 : : {
1389 [ + - ][ + + ]: 38960 : if ( aSeq[y].Name == "ooSetupFactoryWindowStateConfigRef" )
1390 : : {
1391 [ + - ]: 2435 : aSeq[y].Value >>= aWindowStateFileStr;
1392 : 2435 : break;
1393 : : }
1394 : : }
1395 : :
1396 [ + - ]: 2435 : if ( !aWindowStateFileStr.isEmpty() )
1397 : : {
1398 : : // Create first mapping ModuleIdentifier ==> Window state configuration file
1399 [ + - ]: 2435 : m_aModuleToFileHashMap.insert( ModuleToWindowStateFileMap::value_type( aModuleIdentifier, aWindowStateFileStr ));
1400 : :
1401 : : // Create second mapping Command File ==> Window state configuration instance
1402 [ + - ]: 2435 : ModuleToWindowStateConfigHashMap::iterator pIter = m_aModuleToWindowStateHashMap.find( aWindowStateFileStr );
1403 [ + - ][ + + ]: 2435 : if ( pIter == m_aModuleToWindowStateHashMap.end() )
1404 [ + - ][ + - ]: 2435 : m_aModuleToWindowStateHashMap.insert( ModuleToWindowStateConfigHashMap::value_type( aWindowStateFileStr, xEmptyNameAccess ));
[ + - ]
1405 : 2435 : }
1406 : : }
1407 [ + - ][ + - ]: 113 : }
1408 : 113 : }
1409 : :
1410 [ + - ][ + - ]: 103 : WindowStateConfiguration::~WindowStateConfiguration()
[ + - ]
1411 : : {
1412 [ + - ]: 103 : ResetableGuard aLock( m_aLock );
1413 [ + - ]: 103 : m_aModuleToFileHashMap.clear();
1414 [ + - ][ + - ]: 103 : m_aModuleToWindowStateHashMap.clear();
1415 [ - + ]: 206 : }
1416 : :
1417 : 1767 : Any SAL_CALL WindowStateConfiguration::getByName( const ::rtl::OUString& aModuleIdentifier )
1418 : : throw (::com::sun::star::container::NoSuchElementException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException)
1419 : : {
1420 [ + - ]: 1767 : ResetableGuard aLock( m_aLock );
1421 : :
1422 [ + - ]: 1767 : ModuleToWindowStateFileMap::const_iterator pIter = m_aModuleToFileHashMap.find( aModuleIdentifier );
1423 [ + - ][ + - ]: 1767 : if ( pIter != m_aModuleToFileHashMap.end() )
1424 : : {
1425 : 1767 : Any a;
1426 [ + - ]: 1767 : ::rtl::OUString aWindowStateConfigFile( pIter->second );
1427 : :
1428 [ + - ]: 1767 : ModuleToWindowStateConfigHashMap::iterator pModuleIter = m_aModuleToWindowStateHashMap.find( aWindowStateConfigFile );
1429 [ + - ][ + - ]: 1767 : if ( pModuleIter != m_aModuleToWindowStateHashMap.end() )
1430 : : {
1431 [ + - ][ + + ]: 1767 : if ( pModuleIter->second.is() )
1432 [ + - ][ + - ]: 1620 : a = makeAny( pModuleIter->second );
1433 : : else
1434 : : {
1435 : 147 : Reference< XNameAccess > xResourceURLWindowState;
1436 [ + - ]: 147 : ConfigurationAccess_WindowState* pModuleWindowState = new ConfigurationAccess_WindowState( aWindowStateConfigFile, m_xServiceManager );
1437 [ + - ][ + - ]: 147 : xResourceURLWindowState = Reference< XNameAccess >( static_cast< cppu::OWeakObject* >( pModuleWindowState ),UNO_QUERY );
[ + - ]
1438 [ + - ][ + - ]: 147 : pModuleIter->second = xResourceURLWindowState;
1439 [ + - ]: 147 : a <<= xResourceURLWindowState;
1440 : : }
1441 : :
1442 : 3534 : return a;
1443 [ + - ][ - + ]: 1767 : }
1444 : : }
1445 : :
1446 [ + - ][ # # ]: 1767 : throw NoSuchElementException();
1447 : : }
1448 : :
1449 : 0 : Sequence< ::rtl::OUString > SAL_CALL WindowStateConfiguration::getElementNames()
1450 : : throw (::com::sun::star::uno::RuntimeException)
1451 : : {
1452 [ # # ]: 0 : ResetableGuard aLock( m_aLock );
1453 : :
1454 [ # # ]: 0 : Sequence< rtl::OUString > aSeq( m_aModuleToFileHashMap.size() );
1455 : :
1456 : 0 : sal_Int32 n = 0;
1457 [ # # ]: 0 : ModuleToWindowStateFileMap::const_iterator pIter = m_aModuleToFileHashMap.begin();
1458 [ # # ][ # # ]: 0 : while ( pIter != m_aModuleToFileHashMap.end() )
1459 : : {
1460 [ # # ][ # # ]: 0 : aSeq[n] = pIter->first;
1461 : 0 : ++pIter;
1462 : : }
1463 : :
1464 [ # # ]: 0 : return aSeq;
1465 : : }
1466 : :
1467 : 0 : sal_Bool SAL_CALL WindowStateConfiguration::hasByName( const ::rtl::OUString& aName )
1468 : : throw (::com::sun::star::uno::RuntimeException)
1469 : : {
1470 [ # # ]: 0 : ResetableGuard aLock( m_aLock );
1471 : :
1472 [ # # ]: 0 : ModuleToWindowStateFileMap::const_iterator pIter = m_aModuleToFileHashMap.find( aName );
1473 [ # # ][ # # ]: 0 : return ( pIter != m_aModuleToFileHashMap.end() );
1474 : : }
1475 : :
1476 : : // XElementAccess
1477 : 0 : Type SAL_CALL WindowStateConfiguration::getElementType()
1478 : : throw (::com::sun::star::uno::RuntimeException)
1479 : : {
1480 : 0 : return( ::getCppuType( (const Reference< XNameAccess >*)NULL ) );
1481 : : }
1482 : :
1483 : 0 : sal_Bool SAL_CALL WindowStateConfiguration::hasElements()
1484 : : throw (::com::sun::star::uno::RuntimeException)
1485 : : {
1486 : : // We always have at least one module. So it is valid to return true!
1487 : 0 : return sal_True;
1488 : : }
1489 : :
1490 : : } // namespace framework
1491 : :
1492 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|