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