xref: /trunk/main/unotools/source/config/workingsetoptions.cxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_unotools.hxx"
30 #ifndef GCC
31 #endif
32 
33 //_________________________________________________________________________________________________________________
34 //  includes
35 //_________________________________________________________________________________________________________________
36 
37 #include <unotools/workingsetoptions.hxx>
38 #include <unotools/configmgr.hxx>
39 #include <unotools/configitem.hxx>
40 #include <tools/debug.hxx>
41 #include <com/sun/star/uno/Any.hxx>
42 #include <com/sun/star/uno/Sequence.hxx>
43 
44 #include <itemholder1.hxx>
45 
46 //_________________________________________________________________________________________________________________
47 //  namespaces
48 //_________________________________________________________________________________________________________________
49 
50 using namespace ::utl                   ;
51 using namespace ::rtl                   ;
52 using namespace ::osl                   ;
53 using namespace ::com::sun::star::uno   ;
54 
55 //_________________________________________________________________________________________________________________
56 //  const
57 //_________________________________________________________________________________________________________________
58 
59 #define ROOTNODE_WORKINGSET             OUString(RTL_CONSTASCII_USTRINGPARAM("Office.Common/WorkingSet"))
60 #define DEFAULT_WINDOWLIST              Sequence< OUString >()
61 
62 #define PROPERTYNAME_WINDOWLIST         OUString(RTL_CONSTASCII_USTRINGPARAM("WindowList"       ))
63 
64 #define PROPERTYHANDLE_WINDOWLIST       0
65 
66 #define PROPERTYCOUNT                   1
67 
68 //_________________________________________________________________________________________________________________
69 //  private declarations!
70 //_________________________________________________________________________________________________________________
71 
72 class SvtWorkingSetOptions_Impl : public ConfigItem
73 {
74     //-------------------------------------------------------------------------------------------------------------
75     //  public methods
76     //-------------------------------------------------------------------------------------------------------------
77 
78     public:
79 
80         //---------------------------------------------------------------------------------------------------------
81         //  constructor / destructor
82         //---------------------------------------------------------------------------------------------------------
83 
84          SvtWorkingSetOptions_Impl();
85         ~SvtWorkingSetOptions_Impl();
86 
87         //---------------------------------------------------------------------------------------------------------
88         //  overloaded methods of baseclass
89         //---------------------------------------------------------------------------------------------------------
90 
91         /*-****************************************************************************************************//**
92             @short      called for notify of configmanager
93             @descr      These method is called from the ConfigManager before application ends or from the
94                         PropertyChangeListener if the sub tree broadcasts changes. You must update your
95                         internal values.
96 
97             @seealso    baseclass ConfigItem
98 
99             @param      "seqPropertyNames" is the list of properties which should be updated.
100             @return     -
101 
102             @onerror    -
103         *//*-*****************************************************************************************************/
104 
105         virtual void Notify( const Sequence< OUString >& seqPropertyNames );
106 
107         /*-****************************************************************************************************//**
108             @short      write changes to configuration
109             @descr      These method writes the changed values into the sub tree
110                         and should always called in our destructor to guarantee consistency of config data.
111 
112             @seealso    baseclass ConfigItem
113 
114             @param      -
115             @return     -
116 
117             @onerror    -
118         *//*-*****************************************************************************************************/
119 
120         virtual void Commit();
121 
122         //---------------------------------------------------------------------------------------------------------
123         //  public interface
124         //---------------------------------------------------------------------------------------------------------
125 
126         /*-****************************************************************************************************//**
127             @short      access method to get internal values
128             @descr      These method give us a chance to regulate acces to ouer internal values.
129                         It's not used in the moment - but it's possible for the feature!
130 
131             @seealso    -
132 
133             @param      -
134             @return     -
135 
136             @onerror    -
137         *//*-*****************************************************************************************************/
138 
139         Sequence< OUString >    GetWindowList(                                              ) const ;
140         void                    SetWindowList( const Sequence< OUString >&  seqWindowList   )       ;
141 
142     //-------------------------------------------------------------------------------------------------------------
143     //  private methods
144     //-------------------------------------------------------------------------------------------------------------
145 
146     private:
147 
148         /*-****************************************************************************************************//**
149             @short      return list of key names of ouer configuration management which represent oue module tree
150             @descr      These methods return a static const list of key names. We need it to get needed values from our
151                         configuration management.
152 
153             @seealso    -
154 
155             @param      -
156             @return     A list of needed configuration keys is returned.
157 
158             @onerror    -
159         *//*-*****************************************************************************************************/
160 
161         static Sequence< OUString > GetPropertyNames();
162 
163     //-------------------------------------------------------------------------------------------------------------
164     //  private member
165     //-------------------------------------------------------------------------------------------------------------
166 
167     private:
168 
169         Sequence< OUString >    m_seqWindowList     ;
170 };
171 
172 //_________________________________________________________________________________________________________________
173 //  definitions
174 //_________________________________________________________________________________________________________________
175 
176 //*****************************************************************************************************************
177 //  constructor
178 //*****************************************************************************************************************
179 SvtWorkingSetOptions_Impl::SvtWorkingSetOptions_Impl()
180     // Init baseclasses first
181     :   ConfigItem          ( ROOTNODE_WORKINGSET   )
182     // Init member then.
183     ,   m_seqWindowList     ( DEFAULT_WINDOWLIST    )
184 {
185     // Use our static list of configuration keys to get his values.
186     Sequence< OUString >    seqNames    = GetPropertyNames  (           );
187     Sequence< Any >         seqValues   = GetProperties     ( seqNames  );
188 
189     // Safe impossible cases.
190     // We need values from ALL configuration keys.
191     // Follow assignment use order of values in relation to our list of key names!
192     DBG_ASSERT( !(seqNames.getLength()!=seqValues.getLength()), "SvtWorkingSetOptions_Impl::SvtWorkingSetOptions_Impl()\nI miss some values of configuration keys!\n" );
193 
194     // Copy values from list in right order to ouer internal member.
195     sal_Int32 nPropertyCount = seqValues.getLength();
196     for( sal_Int32 nProperty=0; nProperty<nPropertyCount; ++nProperty )
197     {
198         // Safe impossible cases.
199         // Check any for valid value.
200         DBG_ASSERT( !(seqValues[nProperty].hasValue()==sal_False), "SvtWorkingSetOptions_Impl::SvtWorkingSetOptions_Impl()\nInvalid property value detected!\n" );
201         switch( nProperty )
202         {
203             case PROPERTYHANDLE_WINDOWLIST      :   {
204                                                         DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_SEQUENCE), "SvtWorkingSetOptions_Impl::SvtWorkingSetOptions_Impl()\nWho has changed the value type of \"Office.Common\\WorkingSet\\WindowList\"?" );
205                                                         seqValues[nProperty] >>= m_seqWindowList;
206                                                     }
207                                                     break;
208         }
209     }
210 
211     // Enable notification mechanism of ouer baseclass.
212     // We need it to get information about changes outside these class on ouer used configuration keys!
213     EnableNotification( seqNames );
214 }
215 
216 //*****************************************************************************************************************
217 //  destructor
218 //*****************************************************************************************************************
219 SvtWorkingSetOptions_Impl::~SvtWorkingSetOptions_Impl()
220 {
221     // We must save our current values .. if user forget it!
222     if( IsModified() == sal_True )
223     {
224         Commit();
225     }
226 }
227 
228 //*****************************************************************************************************************
229 //  public method
230 //*****************************************************************************************************************
231 void SvtWorkingSetOptions_Impl::Notify( const Sequence< OUString >& seqPropertyNames )
232 {
233     // Use given list of updated properties to get his values from configuration directly!
234     Sequence< Any > seqValues = GetProperties( seqPropertyNames );
235     // Safe impossible cases.
236     // We need values from ALL notified configuration keys.
237     DBG_ASSERT( !(seqPropertyNames.getLength()!=seqValues.getLength()), "SvtWorkingSetOptions_Impl::Notify()\nI miss some values of configuration keys!\n" );
238     // Step over list of property names and get right value from coreesponding value list to set it on internal members!
239     sal_Int32 nCount = seqPropertyNames.getLength();
240     for( sal_Int32 nProperty=0; nProperty<nCount; ++nProperty )
241     {
242         if( seqPropertyNames[nProperty] == PROPERTYNAME_WINDOWLIST )
243         {
244             DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_SEQUENCE), "SvtWorkingSetOptions_Impl::Notify()\nWho has changed the value type of \"Office.Common\\WorkingSet\\WindowList\"?" );
245             seqValues[nProperty] >>= m_seqWindowList;
246         }
247         #if OSL_DEBUG_LEVEL > 1
248         else DBG_ASSERT( sal_False, "SvtWorkingSetOptions_Impl::Notify()\nUnkown property detected ... I can't handle these!\n" );
249         #endif
250     }
251 }
252 
253 //*****************************************************************************************************************
254 //  public method
255 //*****************************************************************************************************************
256 void SvtWorkingSetOptions_Impl::Commit()
257 {
258     // Get names of supported properties, create a list for values and copy current values to it.
259     Sequence< OUString >    seqNames    = GetPropertyNames  ();
260     sal_Int32               nCount      = seqNames.getLength();
261     Sequence< Any >         seqValues   ( nCount );
262     for( sal_Int32 nProperty=0; nProperty<nCount; ++nProperty )
263     {
264         switch( nProperty )
265         {
266             case PROPERTYHANDLE_WINDOWLIST      :   {
267                                                         seqValues[nProperty] <<= m_seqWindowList;
268                                                     }
269                                                     break;
270         }
271     }
272     // Set properties in configuration.
273     PutProperties( seqNames, seqValues );
274 }
275 
276 //*****************************************************************************************************************
277 //  public method
278 //*****************************************************************************************************************
279 Sequence< OUString > SvtWorkingSetOptions_Impl::GetWindowList() const
280 {
281     return m_seqWindowList;
282 }
283 
284 //*****************************************************************************************************************
285 //  public method
286 //*****************************************************************************************************************
287 void SvtWorkingSetOptions_Impl::SetWindowList( const Sequence< OUString >& seqWindowList )
288 {
289     m_seqWindowList = seqWindowList;
290     SetModified();
291 }
292 
293 //*****************************************************************************************************************
294 //  private method
295 //*****************************************************************************************************************
296 Sequence< OUString > SvtWorkingSetOptions_Impl::GetPropertyNames()
297 {
298     // Build static list of configuration key names.
299     static const OUString pProperties[] =
300     {
301         PROPERTYNAME_WINDOWLIST ,
302     };
303     // Initialize return sequence with these list ...
304     static const Sequence< OUString > seqPropertyNames( pProperties, PROPERTYCOUNT );
305     // ... and return it.
306     return seqPropertyNames;
307 }
308 
309 //*****************************************************************************************************************
310 //  initialize static member
311 //  DON'T DO IT IN YOUR HEADER!
312 //  see definition for further informations
313 //*****************************************************************************************************************
314 SvtWorkingSetOptions_Impl*  SvtWorkingSetOptions::m_pDataContainer  = NULL  ;
315 sal_Int32                   SvtWorkingSetOptions::m_nRefCount       = 0     ;
316 
317 //*****************************************************************************************************************
318 //  constructor
319 //*****************************************************************************************************************
320 SvtWorkingSetOptions::SvtWorkingSetOptions()
321 {
322     // Global access, must be guarded (multithreading!).
323     MutexGuard aGuard( GetOwnStaticMutex() );
324     // Increase ouer refcount ...
325     ++m_nRefCount;
326     // ... and initialize ouer data container only if it not already exist!
327     if( m_pDataContainer == NULL )
328     {
329         m_pDataContainer = new SvtWorkingSetOptions_Impl;
330         ItemHolder1::holdConfigItem(E_WORKINGSETOPTIONS);
331     }
332 }
333 
334 //*****************************************************************************************************************
335 //  destructor
336 //*****************************************************************************************************************
337 SvtWorkingSetOptions::~SvtWorkingSetOptions()
338 {
339     // Global access, must be guarded (multithreading!)
340     MutexGuard aGuard( GetOwnStaticMutex() );
341     // Decrease ouer refcount.
342     --m_nRefCount;
343     // If last instance was deleted ...
344     // we must destroy ouer static data container!
345     if( m_nRefCount <= 0 )
346     {
347         delete m_pDataContainer;
348         m_pDataContainer = NULL;
349     }
350 }
351 
352 //*****************************************************************************************************************
353 //  public method
354 //*****************************************************************************************************************
355 Sequence< OUString > SvtWorkingSetOptions::GetWindowList() const
356 {
357     MutexGuard aGuard( GetOwnStaticMutex() );
358     return m_pDataContainer->GetWindowList();
359 }
360 
361 //*****************************************************************************************************************
362 //  public method
363 //*****************************************************************************************************************
364 void SvtWorkingSetOptions::SetWindowList( const Sequence< OUString >& seqWindowList )
365 {
366     MutexGuard aGuard( GetOwnStaticMutex() );
367     m_pDataContainer->SetWindowList( seqWindowList );
368 }
369 
370 //*****************************************************************************************************************
371 //  private method
372 //*****************************************************************************************************************
373 Mutex& SvtWorkingSetOptions::GetOwnStaticMutex()
374 {
375     // Initialize static mutex only for one time!
376     static Mutex* pMutex = NULL;
377     // If these method first called (Mutex not already exist!) ...
378     if( pMutex == NULL )
379     {
380         // ... we must create a new one. Protect follow code with the global mutex -
381         // It must be - we create a static variable!
382         MutexGuard aGuard( Mutex::getGlobalMutex() );
383         // We must check our pointer again - because it can be that another instance of ouer class will be fastr then these!
384         if( pMutex == NULL )
385         {
386             // Create the new mutex and set it for return on static variable.
387             static Mutex aMutex;
388             pMutex = &aMutex;
389         }
390     }
391     // Return new created or already existing mutex object.
392     return *pMutex;
393 }
394