Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*
3 : : * This file is part of the LibreOffice project.
4 : : *
5 : : * This Source Code Form is subject to the terms of the Mozilla Public
6 : : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : : *
9 : : * This file incorporates work covered by the following license notice:
10 : : *
11 : : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : : * contributor license agreements. See the NOTICE file distributed
13 : : * with this work for additional information regarding copyright
14 : : * ownership. The ASF licenses this file to you under the Apache
15 : : * License, Version 2.0 (the "License"); you may not use this file
16 : : * except in compliance with the License. You may obtain a copy of
17 : : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : : */
19 : :
20 : : #include <unotools/compatibility.hxx>
21 : : #include <unotools/configmgr.hxx>
22 : : #include <unotools/configitem.hxx>
23 : : #include <unotools/syslocale.hxx>
24 : : #include <tools/debug.hxx>
25 : : #include <com/sun/star/uno/Any.hxx>
26 : : #include <com/sun/star/uno/Sequence.hxx>
27 : :
28 : : #include <vector>
29 : :
30 : : #include <itemholder1.hxx>
31 : :
32 : : #include <algorithm>
33 : :
34 : : //_________________________________________________________________________________________________________________
35 : : // namespaces
36 : : //_________________________________________________________________________________________________________________
37 : :
38 : : using namespace ::std;
39 : : using namespace ::utl;
40 : : using namespace ::rtl;
41 : : using namespace ::osl;
42 : : using namespace ::com::sun::star::uno;
43 : : using namespace ::com::sun::star::beans;
44 : :
45 : : #define ROOTNODE_OPTIONS OUString( RTL_CONSTASCII_USTRINGPARAM( "Office.Compatibility/" ) )
46 : : #define PATHDELIMITER OUString( RTL_CONSTASCII_USTRINGPARAM( "/" ) )
47 : : #define SETNODE_ALLFILEFORMATS OUString( RTL_CONSTASCII_USTRINGPARAM( "AllFileFormats" ) )
48 : :
49 : : #define PROPERTYNAME_NAME COMPATIBILITY_PROPERTYNAME_NAME
50 : : #define PROPERTYNAME_MODULE COMPATIBILITY_PROPERTYNAME_MODULE
51 : : #define PROPERTYNAME_USEPRTMETRICS COMPATIBILITY_PROPERTYNAME_USEPRTMETRICS
52 : : #define PROPERTYNAME_ADDSPACING COMPATIBILITY_PROPERTYNAME_ADDSPACING
53 : : #define PROPERTYNAME_ADDSPACINGATPAGES COMPATIBILITY_PROPERTYNAME_ADDSPACINGATPAGES
54 : : #define PROPERTYNAME_USEOURTABSTOPS COMPATIBILITY_PROPERTYNAME_USEOURTABSTOPS
55 : : #define PROPERTYNAME_NOEXTLEADING COMPATIBILITY_PROPERTYNAME_NOEXTLEADING
56 : : #define PROPERTYNAME_USELINESPACING COMPATIBILITY_PROPERTYNAME_USELINESPACING
57 : : #define PROPERTYNAME_ADDTABLESPACING COMPATIBILITY_PROPERTYNAME_ADDTABLESPACING
58 : : #define PROPERTYNAME_USEOBJPOS COMPATIBILITY_PROPERTYNAME_USEOBJECTPOSITIONING
59 : : #define PROPERTYNAME_USEOURTEXTWRAP COMPATIBILITY_PROPERTYNAME_USEOURTEXTWRAPPING
60 : : #define PROPERTYNAME_CONSIDERWRAPSTYLE COMPATIBILITY_PROPERTYNAME_CONSIDERWRAPPINGSTYLE
61 : : #define PROPERTYNAME_EXPANDWORDSPACE COMPATIBILITY_PROPERTYNAME_EXPANDWORDSPACE
62 : :
63 : : #define PROPERTYCOUNT 13
64 : :
65 : : #define OFFSET_NAME 0
66 : : #define OFFSET_MODULE 1
67 : : #define OFFSET_USEPRTMETRICS 2
68 : : #define OFFSET_ADDSPACING 3
69 : : #define OFFSET_ADDSPACINGATPAGES 4
70 : : #define OFFSET_USEOURTABSTOPS 5
71 : : #define OFFSET_NOEXTLEADING 6
72 : : #define OFFSET_USELINESPACING 7
73 : : #define OFFSET_ADDTABLESPACING 8
74 : : #define OFFSET_USEOBJPOS 9
75 : : #define OFFSET_USEOURTEXTWRAPPING 10
76 : : #define OFFSET_CONSIDERWRAPPINGSTYLE 11
77 : : #define OFFSET_EXPANDWORDSPACE 12
78 : :
79 : : //_________________________________________________________________________________________________________________
80 : : // private declarations!
81 : : //_________________________________________________________________________________________________________________
82 : :
83 : : /*-****************************************************************************************************************
84 : : @descr struct to hold information about one compatibility entry
85 : : ****************************************************************************************************************-*/
86 : 657 : struct SvtCompatibilityEntry
87 : : {
88 : : public:
89 : 146 : SvtCompatibilityEntry() :
90 : : bUsePrtMetrics( false ), bAddSpacing( false ),
91 : : bAddSpacingAtPages( false ), bUseOurTabStops( false ),
92 : : bNoExtLeading( false ), bUseLineSpacing( false ),
93 : : bAddTableSpacing( false ), bUseObjPos( false ),
94 : : bUseOurTextWrapping( false ), bConsiderWrappingStyle( false ),
95 : 146 : bExpandWordSpace( true ) {}
96 : 0 : SvtCompatibilityEntry(
97 : : const OUString& _rName, const OUString& _rNewModule ) :
98 : : sName( _rName ), sModule( _rNewModule ),
99 : : bUsePrtMetrics( false ), bAddSpacing( false ),
100 : : bAddSpacingAtPages( false ), bUseOurTabStops( false ),
101 : : bNoExtLeading( false ), bUseLineSpacing( false ),
102 : : bAddTableSpacing( false ), bUseObjPos( false ),
103 : : bUseOurTextWrapping( false ), bConsiderWrappingStyle( false ),
104 : 0 : bExpandWordSpace( true ) {}
105 : :
106 : 0 : inline void SetUsePrtMetrics( bool _bSet ) { bUsePrtMetrics = _bSet; }
107 : 0 : inline void SetAddSpacing( bool _bSet ) { bAddSpacing = _bSet; }
108 : 0 : inline void SetAddSpacingAtPages( bool _bSet ) { bAddSpacingAtPages = _bSet; }
109 : 0 : inline void SetUseOurTabStops( bool _bSet ) { bUseOurTabStops = _bSet; }
110 : 0 : inline void SetNoExtLeading( bool _bSet ) { bNoExtLeading = _bSet; }
111 : 0 : inline void SetUseLineSpacing( bool _bSet ) { bUseLineSpacing = _bSet; }
112 : 0 : inline void SetAddTableSpacing( bool _bSet ) { bAddTableSpacing = _bSet; }
113 : 0 : inline void SetUseObjPos( bool _bSet ) { bUseObjPos = _bSet; }
114 : 0 : inline void SetUseOurTextWrapping( bool _bSet ) { bUseOurTextWrapping = _bSet; }
115 : 0 : inline void SetConsiderWrappingStyle( bool _bSet ) { bConsiderWrappingStyle = _bSet; }
116 : 0 : inline void SetExpandWordSpace( bool _bSet ) { bExpandWordSpace = _bSet; }
117 : :
118 : : public:
119 : : OUString sName;
120 : : OUString sModule;
121 : : bool bUsePrtMetrics;
122 : : bool bAddSpacing;
123 : : bool bAddSpacingAtPages;
124 : : bool bUseOurTabStops;
125 : : bool bNoExtLeading;
126 : : bool bUseLineSpacing;
127 : : bool bAddTableSpacing;
128 : : bool bUseObjPos;
129 : : bool bUseOurTextWrapping;
130 : : bool bConsiderWrappingStyle;
131 : : bool bExpandWordSpace;
132 : : };
133 : :
134 : : /*-****************************************************************************************************************
135 : : @descr support simple menu structures and operations on it
136 : : ****************************************************************************************************************-*/
137 : 146 : class SvtCompatibility
138 : : {
139 : : public:
140 : : //---------------------------------------------------------------------------------------------------------
141 : : // append one entry
142 : 146 : void AppendEntry( const SvtCompatibilityEntry& rEntry )
143 : : {
144 : 146 : lEntries.push_back( rEntry );
145 : 146 : }
146 : :
147 : : //---------------------------------------------------------------------------------------------------------
148 : : // the only way to free memory!
149 : 0 : void Clear()
150 : : {
151 : 0 : lEntries.clear();
152 : 0 : }
153 : :
154 : : //---------------------------------------------------------------------------------------------------------
155 : : // convert internal list to external format
156 : 0 : Sequence< Sequence< PropertyValue > > GetList() const
157 : : {
158 : 0 : sal_Int32 nCount = (sal_Int32)lEntries.size();
159 : 0 : sal_Int32 nStep = 0;
160 [ # # ]: 0 : Sequence< PropertyValue > lProperties( PROPERTYCOUNT );
161 [ # # ]: 0 : Sequence< Sequence< PropertyValue > > lResult( nCount );
162 : 0 : const vector< SvtCompatibilityEntry >* pList = &lEntries;
163 : :
164 [ # # ][ # # ]: 0 : lProperties[ OFFSET_NAME ].Name = PROPERTYNAME_NAME;
165 [ # # ][ # # ]: 0 : lProperties[ OFFSET_MODULE ].Name = PROPERTYNAME_MODULE;
166 [ # # ][ # # ]: 0 : lProperties[ OFFSET_USEPRTMETRICS ].Name = PROPERTYNAME_USEPRTMETRICS;
167 [ # # ][ # # ]: 0 : lProperties[ OFFSET_ADDSPACING ].Name = PROPERTYNAME_ADDSPACING;
168 [ # # ][ # # ]: 0 : lProperties[ OFFSET_ADDSPACINGATPAGES ].Name = PROPERTYNAME_ADDSPACINGATPAGES;
169 [ # # ][ # # ]: 0 : lProperties[ OFFSET_USEOURTABSTOPS ].Name = PROPERTYNAME_USEOURTABSTOPS;
170 [ # # ][ # # ]: 0 : lProperties[ OFFSET_NOEXTLEADING ].Name = PROPERTYNAME_NOEXTLEADING;
171 [ # # ][ # # ]: 0 : lProperties[ OFFSET_USELINESPACING ].Name = PROPERTYNAME_USELINESPACING;
172 [ # # ][ # # ]: 0 : lProperties[ OFFSET_ADDTABLESPACING ].Name = PROPERTYNAME_ADDTABLESPACING;
173 [ # # ][ # # ]: 0 : lProperties[ OFFSET_USEOBJPOS ].Name = PROPERTYNAME_USEOBJPOS;
174 [ # # ][ # # ]: 0 : lProperties[ OFFSET_USEOURTEXTWRAPPING ].Name = PROPERTYNAME_USEOURTEXTWRAP;
175 [ # # ][ # # ]: 0 : lProperties[ OFFSET_CONSIDERWRAPPINGSTYLE ].Name = PROPERTYNAME_CONSIDERWRAPSTYLE;
176 [ # # ][ # # ]: 0 : lProperties[ OFFSET_EXPANDWORDSPACE ].Name = PROPERTYNAME_EXPANDWORDSPACE;
177 : :
178 [ # # ][ # # ]: 0 : for ( vector< SvtCompatibilityEntry >::const_iterator pItem = pList->begin();
179 : 0 : pItem != pList->end(); ++pItem )
180 : : {
181 [ # # ][ # # ]: 0 : lProperties[ OFFSET_NAME ].Value <<= pItem->sName;
182 [ # # ][ # # ]: 0 : lProperties[ OFFSET_MODULE ].Value <<= pItem->sModule;
183 [ # # ][ # # ]: 0 : lProperties[ OFFSET_USEPRTMETRICS ].Value <<= pItem->bUsePrtMetrics;
184 [ # # ][ # # ]: 0 : lProperties[ OFFSET_ADDSPACING ].Value <<= pItem->bAddSpacing;
185 [ # # ][ # # ]: 0 : lProperties[ OFFSET_ADDSPACINGATPAGES ].Value <<= pItem->bAddSpacingAtPages;
186 [ # # ][ # # ]: 0 : lProperties[ OFFSET_USEOURTABSTOPS ].Value <<= pItem->bUseOurTabStops;
187 [ # # ][ # # ]: 0 : lProperties[ OFFSET_NOEXTLEADING ].Value <<= pItem->bNoExtLeading;
188 [ # # ][ # # ]: 0 : lProperties[ OFFSET_USELINESPACING ].Value <<= pItem->bUseLineSpacing;
189 [ # # ][ # # ]: 0 : lProperties[ OFFSET_ADDTABLESPACING ].Value <<= pItem->bAddTableSpacing;
190 [ # # ][ # # ]: 0 : lProperties[ OFFSET_USEOBJPOS ].Value <<= pItem->bUseObjPos;
191 [ # # ][ # # ]: 0 : lProperties[ OFFSET_USEOURTEXTWRAPPING ].Value <<= pItem->bUseOurTextWrapping;
192 [ # # ][ # # ]: 0 : lProperties[ OFFSET_CONSIDERWRAPPINGSTYLE ].Value <<= pItem->bConsiderWrappingStyle;
193 [ # # ][ # # ]: 0 : lProperties[ OFFSET_EXPANDWORDSPACE ].Value <<= pItem->bExpandWordSpace;
194 [ # # ][ # # ]: 0 : lResult[ nStep ] = lProperties;
195 : 0 : ++nStep;
196 : : }
197 : :
198 [ # # ]: 0 : return lResult;
199 : : }
200 : :
201 : 0 : int size() const
202 : : {
203 : 0 : return lEntries.size();
204 : : }
205 : :
206 : 0 : const SvtCompatibilityEntry& operator[]( int i ) const
207 : : {
208 : 0 : return lEntries[i];
209 : : }
210 : :
211 : : private:
212 : : vector< SvtCompatibilityEntry > lEntries;
213 : : };
214 : :
215 : : class SvtCompatibilityOptions_Impl : public ConfigItem
216 : : {
217 : : //-------------------------------------------------------------------------------------------------------------
218 : : // public methods
219 : : //-------------------------------------------------------------------------------------------------------------
220 : :
221 : : public:
222 : :
223 : : //---------------------------------------------------------------------------------------------------------
224 : : // constructor / destructor
225 : : //---------------------------------------------------------------------------------------------------------
226 : :
227 : : SvtCompatibilityOptions_Impl();
228 : : ~SvtCompatibilityOptions_Impl();
229 : :
230 : : void SetDefault( OUString sName, bool bValue );
231 : :
232 : : //---------------------------------------------------------------------------------------------------------
233 : : // overloaded methods of baseclass
234 : : //---------------------------------------------------------------------------------------------------------
235 : :
236 : : /*-****************************************************************************************************//**
237 : : @short called for notify of configmanager
238 : : @descr These method is called from the ConfigManager before application ends or from the
239 : : PropertyChangeListener if the sub tree broadcasts changes. You must update your
240 : : internal values.
241 : :
242 : : @seealso baseclass ConfigItem
243 : :
244 : : @param "lPropertyNames" is the list of properties which should be updated.
245 : : @return -
246 : :
247 : : @onerror -
248 : : *//*-*****************************************************************************************************/
249 : :
250 : : virtual void Notify( const Sequence< OUString >& lPropertyNames );
251 : :
252 : : /*-****************************************************************************************************//**
253 : : @short write changes to configuration
254 : : @descr These method writes the changed values into the sub tree
255 : : and should always called in our destructor to guarantee consistency of config data.
256 : :
257 : : @seealso baseclass ConfigItem
258 : :
259 : : @param -
260 : : @return -
261 : :
262 : : @onerror -
263 : : *//*-*****************************************************************************************************/
264 : :
265 : : virtual void Commit();
266 : :
267 : : //---------------------------------------------------------------------------------------------------------
268 : : // public interface
269 : : //---------------------------------------------------------------------------------------------------------
270 : :
271 : : /*-****************************************************************************************************//**
272 : : @short base implementation of public interface for "SvtCompatibilityOptions"!
273 : : @descr These class is used as static member of "SvtCompatibilityOptions" ...
274 : : => The code exist only for one time and isn't duplicated for every instance!
275 : :
276 : : @seealso -
277 : :
278 : : @param -
279 : : @return -
280 : :
281 : : @onerror -
282 : : *//*-*****************************************************************************************************/
283 : :
284 : : void Clear();
285 : : Sequence< Sequence< PropertyValue > > GetList() const;
286 : : void AppendItem( const ::rtl::OUString& _sName,
287 : : const ::rtl::OUString& _sModule,
288 : : bool _bUsePrtMetrics,
289 : : bool _bAddSpacing,
290 : : bool _bAddSpacingAtPages,
291 : : bool _bUseOurTabStops,
292 : : bool _bNoExtLeading,
293 : : bool _bUseLineSpacing,
294 : : bool _bAddTableSpacing,
295 : : bool _bUseObjPos,
296 : : bool _bUseOurTextWrapping,
297 : : bool _bConsiderWrappingStyle,
298 : : bool _bExpandWordSpace );
299 : :
300 : 1549 : inline bool IsUsePrtDevice() const { return m_aDefOptions.bUsePrtMetrics; }
301 : 1549 : inline bool IsAddSpacing() const { return m_aDefOptions.bAddSpacing; }
302 : 1549 : inline bool IsAddSpacingAtPages() const { return m_aDefOptions.bAddSpacingAtPages; }
303 : 1549 : inline bool IsUseOurTabStops() const { return m_aDefOptions.bUseOurTabStops; }
304 : 1549 : inline bool IsNoExtLeading() const { return m_aDefOptions.bNoExtLeading; }
305 : 1549 : inline bool IsUseLineSpacing() const { return m_aDefOptions.bUseLineSpacing; }
306 : 1549 : inline bool IsAddTableSpacing() const { return m_aDefOptions.bAddTableSpacing; }
307 : 1549 : inline bool IsUseObjPos() const { return m_aDefOptions.bUseObjPos; }
308 : 1549 : inline bool IsUseOurTextWrapping() const { return m_aDefOptions.bUseOurTextWrapping; }
309 : 1549 : inline bool IsConsiderWrappingStyle() const { return m_aDefOptions.bConsiderWrappingStyle; }
310 : 1549 : inline bool IsExpandWordSpace() const { return m_aDefOptions.bExpandWordSpace; }
311 : :
312 : : //-------------------------------------------------------------------------------------------------------------
313 : : // private methods
314 : : //-------------------------------------------------------------------------------------------------------------
315 : :
316 : : private:
317 : :
318 : : /*-****************************************************************************************************//**
319 : : @short return list of key names of our configuration management which represent one module tree
320 : : @descr These methods return the current list of key names! We need it to get needed values from our
321 : : configuration management and support dynamical menu item lists!
322 : :
323 : : @seealso -
324 : :
325 : : @param -
326 : : @return A list of configuration key names is returned.
327 : :
328 : : @onerror -
329 : : *//*-*****************************************************************************************************/
330 : :
331 : : Sequence< OUString > impl_GetPropertyNames( Sequence< OUString >& rItems );
332 : :
333 : : /*-****************************************************************************************************//**
334 : : @short expand the list for all well known properties to destination
335 : : @descr -
336 : : @attention -
337 : :
338 : : @seealso method impl_GetPropertyNames()
339 : :
340 : : @param "lSource" , original list
341 : : @param "lDestination" , destination of operation
342 : : @return A list of configuration key names is returned.
343 : :
344 : : @onerror -
345 : : *//*-*****************************************************************************************************/
346 : :
347 : : void impl_ExpandPropertyNames( const Sequence< OUString >& lSource,
348 : : Sequence< OUString >& lDestination );
349 : :
350 : : //-------------------------------------------------------------------------------------------------------------
351 : : // private member
352 : : //-------------------------------------------------------------------------------------------------------------
353 : :
354 : : private:
355 : :
356 : : SvtCompatibility m_aOptions;
357 : : SvtCompatibilityEntry m_aDefOptions;
358 : : };
359 : :
360 : : //*****************************************************************************************************************
361 : : // constructor
362 : : //*****************************************************************************************************************
363 : 73 : SvtCompatibilityOptions_Impl::SvtCompatibilityOptions_Impl()
364 : : // Init baseclasses first
365 [ + - ][ + - ]: 73 : : ConfigItem( ROOTNODE_OPTIONS )
366 : : // Init member then...
367 : : {
368 : : // Get names and values of all accessable menu entries and fill internal structures.
369 : : // See impl_GetPropertyNames() for further informations.
370 [ + - ]: 73 : Sequence< OUString > lNodes;
371 [ + - ]: 73 : Sequence< OUString > lNames = impl_GetPropertyNames( lNodes );
372 : 73 : sal_uInt32 nCount = lNodes.getLength();
373 [ + - ]: 73 : Sequence< Any > lValues = GetProperties( lNames );
374 : :
375 : : // Safe impossible cases.
376 : : // We need values from ALL configuration keys.
377 : : // Follow assignment use order of values in relation to our list of key names!
378 : : DBG_ASSERT( !( lNames.getLength()!=lValues.getLength() ), "SvtCompatibilityOptions_Impl::SvtCompatibilityOptions_Impl()\nI miss some values of configuration keys!\n" );
379 : :
380 : 73 : SvtCompatibilityEntry aItem;
381 : 73 : sal_uInt32 nItem = 0;
382 : 73 : sal_uInt32 nPosition = 0;
383 : :
384 : : // Get names/values for new menu.
385 : : // 4 subkeys for every item!
386 : 73 : bool bDefaultFound = false;
387 [ + + ]: 219 : for( nItem = 0; nItem < nCount; ++nItem )
388 : : {
389 [ + - ]: 146 : aItem.sName = lNodes[ nItem ];
390 [ + - ]: 146 : lValues[ nPosition++ ] >>= aItem.sModule;
391 [ + - ]: 146 : lValues[ nPosition++ ] >>= aItem.bUsePrtMetrics;
392 [ + - ]: 146 : lValues[ nPosition++ ] >>= aItem.bAddSpacing;
393 [ + - ]: 146 : lValues[ nPosition++ ] >>= aItem.bAddSpacingAtPages;
394 [ + - ]: 146 : lValues[ nPosition++ ] >>= aItem.bUseOurTabStops;
395 [ + - ]: 146 : lValues[ nPosition++ ] >>= aItem.bNoExtLeading;
396 [ + - ]: 146 : lValues[ nPosition++ ] >>= aItem.bUseLineSpacing;
397 [ + - ]: 146 : lValues[ nPosition++ ] >>= aItem.bAddTableSpacing;
398 [ + - ]: 146 : lValues[ nPosition++ ] >>= aItem.bUseObjPos;
399 [ + - ]: 146 : lValues[ nPosition++ ] >>= aItem.bUseOurTextWrapping;
400 [ + - ]: 146 : lValues[ nPosition++ ] >>= aItem.bConsiderWrappingStyle;
401 [ + - ]: 146 : lValues[ nPosition++ ] >>= aItem.bExpandWordSpace;
402 [ + - ]: 146 : m_aOptions.AppendEntry( aItem );
403 : :
404 [ + + ][ + - ]: 146 : if ( !bDefaultFound && aItem.sName.equals( COMPATIBILITY_DEFAULT_NAME ) != sal_False )
[ + - ][ + + ]
[ + + # # ]
405 : : {
406 [ + - ]: 73 : SvtSysLocale aSysLocale;
407 [ + - ]: 73 : com::sun::star::lang::Locale aLocale = aSysLocale.GetLocale();
408 [ + - ][ + - ]: 73 : if ( aLocale.Language == "zh" || aLocale.Language == "ja" || aLocale.Language == "ko" )
[ - + ][ - + ]
409 : 0 : aItem.bExpandWordSpace = false;
410 : :
411 : 73 : m_aDefOptions = aItem;
412 [ + - ]: 73 : bDefaultFound = true;
413 : : }
414 [ + - ][ + - ]: 73 : }
[ + - ]
415 : 73 : }
416 : :
417 : : //*****************************************************************************************************************
418 : : // destructor
419 : : //*****************************************************************************************************************
420 : 73 : SvtCompatibilityOptions_Impl::~SvtCompatibilityOptions_Impl()
421 : : {
422 : : // We must save our current values .. if user forget it!
423 [ + - ][ - + ]: 73 : if( IsModified() == sal_True )
424 : : {
425 [ # # ]: 0 : Commit();
426 : : }
427 [ - + ]: 146 : }
428 : :
429 : 0 : void SvtCompatibilityOptions_Impl::SetDefault( OUString sName, bool bValue )
430 : : {
431 [ # # ]: 0 : if ( COMPATIBILITY_PROPERTYNAME_USEPRTMETRICS.equals( sName ) )
432 : 0 : m_aDefOptions.SetUsePrtMetrics( bValue );
433 [ # # ]: 0 : else if ( COMPATIBILITY_PROPERTYNAME_ADDSPACING.equals( sName ) )
434 : 0 : m_aDefOptions.SetAddSpacing( bValue );
435 [ # # ]: 0 : else if ( COMPATIBILITY_PROPERTYNAME_ADDSPACINGATPAGES.equals( sName ) )
436 : 0 : m_aDefOptions.SetAddSpacingAtPages( bValue );
437 [ # # ]: 0 : else if ( COMPATIBILITY_PROPERTYNAME_USEOURTABSTOPS.equals( sName ) )
438 : 0 : m_aDefOptions.SetUseOurTabStops( bValue );
439 [ # # ]: 0 : else if ( COMPATIBILITY_PROPERTYNAME_NOEXTLEADING.equals( sName ) )
440 : 0 : m_aDefOptions.SetNoExtLeading( bValue );
441 [ # # ]: 0 : else if ( COMPATIBILITY_PROPERTYNAME_USELINESPACING.equals( sName ) )
442 : 0 : m_aDefOptions.SetUseLineSpacing( bValue );
443 [ # # ]: 0 : else if ( COMPATIBILITY_PROPERTYNAME_ADDTABLESPACING.equals( sName ) )
444 : 0 : m_aDefOptions.SetAddTableSpacing( bValue );
445 [ # # ]: 0 : else if ( COMPATIBILITY_PROPERTYNAME_USEOBJECTPOSITIONING.equals( sName ) )
446 : 0 : m_aDefOptions.SetUseObjPos( bValue );
447 [ # # ]: 0 : else if ( COMPATIBILITY_PROPERTYNAME_USEOURTEXTWRAPPING.equals( sName ) )
448 : 0 : m_aDefOptions.SetUseOurTextWrapping( bValue );
449 [ # # ]: 0 : else if ( COMPATIBILITY_PROPERTYNAME_CONSIDERWRAPPINGSTYLE.equals( sName ) )
450 : 0 : m_aDefOptions.SetConsiderWrappingStyle( bValue );
451 [ # # ]: 0 : else if ( COMPATIBILITY_PROPERTYNAME_EXPANDWORDSPACE.equals( sName ) )
452 : 0 : m_aDefOptions.SetExpandWordSpace( bValue );
453 : 0 : }
454 : :
455 : : //*****************************************************************************************************************
456 : : // public method
457 : : //*****************************************************************************************************************
458 : 0 : void SvtCompatibilityOptions_Impl::Notify( const Sequence< OUString >& )
459 : : {
460 : : DBG_ASSERT( sal_False, "SvtCompatibilityOptions_Impl::Notify()\nNot implemented yet! I don't know how I can handle a dynamical list of unknown properties ...\n" );
461 : 0 : }
462 : :
463 : : //*****************************************************************************************************************
464 : : // public method
465 : : //*****************************************************************************************************************
466 : 0 : void SvtCompatibilityOptions_Impl::Commit()
467 : : {
468 : : // Write all properties!
469 : : // Delete complete set first.
470 [ # # ][ # # ]: 0 : ClearNodeSet( SETNODE_ALLFILEFORMATS );
471 : :
472 : 0 : SvtCompatibilityEntry aItem;
473 : 0 : OUString sNode;
474 [ # # ]: 0 : Sequence< PropertyValue > lPropertyValues( PROPERTYCOUNT - 1 );
475 : 0 : sal_uInt32 nItem = 0;
476 : 0 : sal_uInt32 nNewCount = m_aOptions.size();
477 [ # # ]: 0 : for( nItem = 0; nItem < nNewCount; ++nItem )
478 : : {
479 [ # # ]: 0 : aItem = m_aOptions[ nItem ];
480 [ # # ][ # # ]: 0 : sNode = SETNODE_ALLFILEFORMATS + PATHDELIMITER + aItem.sName + PATHDELIMITER;
[ # # ]
481 : :
482 [ # # ][ # # ]: 0 : lPropertyValues[ OFFSET_MODULE - 1 ].Name = sNode + PROPERTYNAME_MODULE;
483 [ # # ][ # # ]: 0 : lPropertyValues[ OFFSET_USEPRTMETRICS - 1 ].Name = sNode + PROPERTYNAME_USEPRTMETRICS;
484 [ # # ][ # # ]: 0 : lPropertyValues[ OFFSET_ADDSPACING - 1 ].Name = sNode + PROPERTYNAME_ADDSPACING;
485 [ # # ][ # # ]: 0 : lPropertyValues[ OFFSET_ADDSPACINGATPAGES - 1 ].Name = sNode + PROPERTYNAME_ADDSPACINGATPAGES;
486 [ # # ][ # # ]: 0 : lPropertyValues[ OFFSET_USEOURTABSTOPS - 1 ].Name = sNode + PROPERTYNAME_USEOURTABSTOPS;
487 [ # # ][ # # ]: 0 : lPropertyValues[ OFFSET_NOEXTLEADING - 1 ].Name = sNode + PROPERTYNAME_NOEXTLEADING;
488 [ # # ][ # # ]: 0 : lPropertyValues[ OFFSET_USELINESPACING - 1 ].Name = sNode + PROPERTYNAME_USELINESPACING;
489 [ # # ][ # # ]: 0 : lPropertyValues[ OFFSET_ADDTABLESPACING - 1 ].Name = sNode + PROPERTYNAME_ADDTABLESPACING;
490 [ # # ][ # # ]: 0 : lPropertyValues[ OFFSET_USEOBJPOS - 1 ].Name = sNode + PROPERTYNAME_USEOBJPOS;
491 [ # # ][ # # ]: 0 : lPropertyValues[ OFFSET_USEOURTEXTWRAPPING - 1 ].Name = sNode + PROPERTYNAME_USEOURTEXTWRAP;
492 [ # # ][ # # ]: 0 : lPropertyValues[ OFFSET_CONSIDERWRAPPINGSTYLE - 1 ].Name = sNode + PROPERTYNAME_CONSIDERWRAPSTYLE;
493 [ # # ][ # # ]: 0 : lPropertyValues[ OFFSET_EXPANDWORDSPACE - 1 ].Name = sNode + PROPERTYNAME_EXPANDWORDSPACE;
494 : :
495 [ # # ][ # # ]: 0 : lPropertyValues[ OFFSET_MODULE - 1 ].Value <<= aItem.sModule;
496 [ # # ][ # # ]: 0 : lPropertyValues[ OFFSET_USEPRTMETRICS - 1 ].Value <<= aItem.bUsePrtMetrics;
497 [ # # ][ # # ]: 0 : lPropertyValues[ OFFSET_ADDSPACING - 1 ].Value <<= aItem.bAddSpacing;
498 [ # # ][ # # ]: 0 : lPropertyValues[ OFFSET_ADDSPACINGATPAGES - 1 ].Value <<= aItem.bAddSpacingAtPages;
499 [ # # ][ # # ]: 0 : lPropertyValues[ OFFSET_USEOURTABSTOPS - 1 ].Value <<= aItem.bUseOurTabStops;
500 [ # # ][ # # ]: 0 : lPropertyValues[ OFFSET_NOEXTLEADING - 1 ].Value <<= aItem.bNoExtLeading;
501 [ # # ][ # # ]: 0 : lPropertyValues[ OFFSET_USELINESPACING - 1 ].Value <<= aItem.bUseLineSpacing;
502 [ # # ][ # # ]: 0 : lPropertyValues[ OFFSET_ADDTABLESPACING - 1 ].Value <<= aItem.bAddTableSpacing;
503 [ # # ][ # # ]: 0 : lPropertyValues[ OFFSET_USEOBJPOS - 1 ].Value <<= aItem.bUseObjPos;
504 [ # # ][ # # ]: 0 : lPropertyValues[ OFFSET_USEOURTEXTWRAPPING - 1 ].Value <<= aItem.bUseOurTextWrapping;
505 [ # # ][ # # ]: 0 : lPropertyValues[ OFFSET_CONSIDERWRAPPINGSTYLE - 1 ].Value <<= aItem.bConsiderWrappingStyle;
506 [ # # ][ # # ]: 0 : lPropertyValues[ OFFSET_EXPANDWORDSPACE - 1 ].Value <<= aItem.bExpandWordSpace;
507 : :
508 [ # # ][ # # ]: 0 : SetSetProperties( SETNODE_ALLFILEFORMATS, lPropertyValues );
[ # # ][ # # ]
509 [ # # ]: 0 : }
510 : 0 : }
511 : :
512 : : //*****************************************************************************************************************
513 : : // public method
514 : : //*****************************************************************************************************************
515 : 0 : void SvtCompatibilityOptions_Impl::Clear()
516 : : {
517 : 0 : m_aOptions.Clear();
518 : 0 : SetModified();
519 : 0 : }
520 : :
521 : : //*****************************************************************************************************************
522 : : // public method
523 : : //*****************************************************************************************************************
524 : 0 : Sequence< Sequence< PropertyValue > > SvtCompatibilityOptions_Impl::GetList() const
525 : : {
526 : 0 : Sequence< Sequence< PropertyValue > > lReturn;
527 [ # # ][ # # ]: 0 : lReturn = m_aOptions.GetList();
[ # # ]
528 : 0 : return lReturn;
529 : : }
530 : :
531 : : //*****************************************************************************************************************
532 : : // public method
533 : : //*****************************************************************************************************************
534 : :
535 : 0 : void SvtCompatibilityOptions_Impl::AppendItem( const ::rtl::OUString& _sName,
536 : : const ::rtl::OUString& _sModule,
537 : : bool _bUsePrtMetrics,
538 : : bool _bAddSpacing,
539 : : bool _bAddSpacingAtPages,
540 : : bool _bUseOurTabStops,
541 : : bool _bNoExtLeading,
542 : : bool _bUseLineSpacing,
543 : : bool _bAddTableSpacing,
544 : : bool _bUseObjPos,
545 : : bool _bUseOurTextWrapping,
546 : : bool _bConsiderWrappingStyle,
547 : : bool _bExpandWordSpace )
548 : : {
549 : 0 : SvtCompatibilityEntry aItem( _sName, _sModule );
550 : 0 : aItem.SetUsePrtMetrics( _bUsePrtMetrics );
551 : 0 : aItem.SetAddSpacing( _bAddSpacing );
552 : 0 : aItem.SetAddSpacingAtPages( _bAddSpacingAtPages );
553 : 0 : aItem.SetUseOurTabStops( _bUseOurTabStops );
554 : 0 : aItem.SetNoExtLeading( _bNoExtLeading );
555 : 0 : aItem.SetUseLineSpacing( _bUseLineSpacing );
556 : 0 : aItem.SetAddTableSpacing( _bAddTableSpacing );
557 : 0 : aItem.SetUseObjPos( _bUseObjPos );
558 : 0 : aItem.SetUseOurTextWrapping( _bUseOurTextWrapping );
559 : 0 : aItem.SetConsiderWrappingStyle( _bConsiderWrappingStyle );
560 : 0 : aItem.SetExpandWordSpace( _bExpandWordSpace );
561 [ # # ]: 0 : m_aOptions.AppendEntry( aItem );
562 : :
563 : : // default item reset?
564 [ # # ][ # # ]: 0 : if ( _sName.equals( COMPATIBILITY_DEFAULT_NAME ) != sal_False )
565 : 0 : m_aDefOptions = aItem;
566 : :
567 [ # # ]: 0 : SetModified();
568 : 0 : }
569 : :
570 : : //*****************************************************************************************************************
571 : : // private method
572 : : //*****************************************************************************************************************
573 : 73 : Sequence< OUString > SvtCompatibilityOptions_Impl::impl_GetPropertyNames( Sequence< OUString >& rItems )
574 : : {
575 : : // First get ALL names of current existing list items in configuration!
576 [ + - ][ + - ]: 73 : rItems = GetNodeNames( SETNODE_ALLFILEFORMATS );
[ + - ]
577 : : // expand list to result list ...
578 : 73 : Sequence< OUString > lProperties( rItems.getLength() * ( PROPERTYCOUNT - 1 ) );
579 [ + - ]: 73 : impl_ExpandPropertyNames( rItems, lProperties );
580 : : // Return result.
581 : 73 : return lProperties;
582 : : }
583 : :
584 : : //*****************************************************************************************************************
585 : : // private method
586 : : //*****************************************************************************************************************
587 : 73 : void SvtCompatibilityOptions_Impl::impl_ExpandPropertyNames(
588 : : const Sequence< OUString >& lSource, Sequence< OUString >& lDestination )
589 : : {
590 : 73 : OUString sFixPath;
591 : 73 : sal_Int32 nDestStep = 0;
592 : 73 : sal_Int32 nSourceCount = lSource.getLength();
593 : : // Copy entries to destination and expand every item with 2 supported sub properties.
594 [ + + ]: 219 : for( sal_Int32 nSourceStep = 0; nSourceStep < nSourceCount; ++nSourceStep )
595 : : {
596 [ + - ]: 146 : sFixPath = SETNODE_ALLFILEFORMATS;
597 [ + - ]: 146 : sFixPath += PATHDELIMITER;
598 : 146 : sFixPath += lSource[ nSourceStep ];
599 [ + - ]: 146 : sFixPath += PATHDELIMITER;
600 : :
601 [ + - ]: 146 : lDestination[nDestStep] = sFixPath;
602 [ + - ][ + - ]: 146 : lDestination[nDestStep] += PROPERTYNAME_MODULE;
603 : 146 : ++nDestStep;
604 [ + - ]: 146 : lDestination[nDestStep] = sFixPath;
605 [ + - ][ + - ]: 146 : lDestination[nDestStep] += PROPERTYNAME_USEPRTMETRICS;
606 : 146 : ++nDestStep;
607 [ + - ]: 146 : lDestination[nDestStep] = sFixPath;
608 [ + - ][ + - ]: 146 : lDestination[nDestStep] += PROPERTYNAME_ADDSPACING;
609 : 146 : ++nDestStep;
610 [ + - ]: 146 : lDestination[nDestStep] = sFixPath;
611 [ + - ][ + - ]: 146 : lDestination[nDestStep] += PROPERTYNAME_ADDSPACINGATPAGES;
612 : 146 : ++nDestStep;
613 [ + - ]: 146 : lDestination[nDestStep] = sFixPath;
614 [ + - ][ + - ]: 146 : lDestination[nDestStep] += PROPERTYNAME_USEOURTABSTOPS;
615 : 146 : ++nDestStep;
616 [ + - ]: 146 : lDestination[nDestStep] = sFixPath;
617 [ + - ][ + - ]: 146 : lDestination[nDestStep] += PROPERTYNAME_NOEXTLEADING;
618 : 146 : ++nDestStep;
619 [ + - ]: 146 : lDestination[nDestStep] = sFixPath;
620 [ + - ][ + - ]: 146 : lDestination[nDestStep] += PROPERTYNAME_USELINESPACING;
621 : 146 : ++nDestStep;
622 [ + - ]: 146 : lDestination[nDestStep] = sFixPath;
623 [ + - ][ + - ]: 146 : lDestination[nDestStep] += PROPERTYNAME_ADDTABLESPACING;
624 : 146 : ++nDestStep;
625 [ + - ]: 146 : lDestination[nDestStep] = sFixPath;
626 [ + - ][ + - ]: 146 : lDestination[nDestStep] += PROPERTYNAME_USEOBJPOS;
627 : 146 : ++nDestStep;
628 [ + - ]: 146 : lDestination[nDestStep] = sFixPath;
629 [ + - ][ + - ]: 146 : lDestination[nDestStep] += PROPERTYNAME_USEOURTEXTWRAP;
630 : 146 : ++nDestStep;
631 [ + - ]: 146 : lDestination[nDestStep] = sFixPath;
632 [ + - ][ + - ]: 146 : lDestination[nDestStep] += PROPERTYNAME_CONSIDERWRAPSTYLE;
633 : 146 : ++nDestStep;
634 [ + - ]: 146 : lDestination[nDestStep] = sFixPath;
635 [ + - ][ + - ]: 146 : lDestination[nDestStep] += PROPERTYNAME_EXPANDWORDSPACE;
636 : 146 : ++nDestStep;
637 : 73 : }
638 : 73 : }
639 : :
640 : : //*****************************************************************************************************************
641 : : // initialize static member
642 : : // DON'T DO IT IN YOUR HEADER!
643 : : // see definition for further informations
644 : : //*****************************************************************************************************************
645 : : SvtCompatibilityOptions_Impl* SvtCompatibilityOptions::m_pDataContainer = NULL;
646 : : sal_Int32 SvtCompatibilityOptions::m_nRefCount = 0;
647 : :
648 : : //*****************************************************************************************************************
649 : : // constructor
650 : : //*****************************************************************************************************************
651 : 1622 : SvtCompatibilityOptions::SvtCompatibilityOptions()
652 : : {
653 : : // Global access, must be guarded (multithreading!).
654 [ + - ][ + - ]: 1622 : MutexGuard aGuard( GetOwnStaticMutex() );
655 : : // Increase ouer refcount ...
656 : 1622 : ++m_nRefCount;
657 : : // ... and initialize ouer data container only if it not already exist!
658 [ + + ]: 1622 : if( m_pDataContainer == NULL )
659 : : {
660 [ + - ][ + - ]: 73 : m_pDataContainer = new SvtCompatibilityOptions_Impl;
661 [ + - ]: 73 : ItemHolder1::holdConfigItem(E_COMPATIBILITY);
662 [ + - ]: 1622 : }
663 : 1622 : }
664 : :
665 : : //*****************************************************************************************************************
666 : : // destructor
667 : : //*****************************************************************************************************************
668 : 1622 : SvtCompatibilityOptions::~SvtCompatibilityOptions()
669 : : {
670 : : // Global access, must be guarded (multithreading!)
671 [ + - ][ + - ]: 1622 : MutexGuard aGuard( GetOwnStaticMutex() );
672 : : // Decrease ouer refcount.
673 : 1622 : --m_nRefCount;
674 : : // If last instance was deleted ...
675 : : // we must destroy ouer static data container!
676 [ + + ]: 1622 : if( m_nRefCount <= 0 )
677 : : {
678 [ + - ][ + - ]: 73 : delete m_pDataContainer;
679 : 73 : m_pDataContainer = NULL;
680 [ + - ]: 1622 : }
681 [ - + ]: 1695 : }
682 : :
683 : : //*****************************************************************************************************************
684 : : // public method
685 : : //*****************************************************************************************************************
686 : 0 : void SvtCompatibilityOptions::Clear()
687 : : {
688 [ # # ][ # # ]: 0 : MutexGuard aGuard( GetOwnStaticMutex() );
689 [ # # ][ # # ]: 0 : m_pDataContainer->Clear();
690 : 0 : }
691 : :
692 : 0 : void SvtCompatibilityOptions::SetDefault( ::rtl::OUString sName, bool bValue )
693 : : {
694 [ # # ]: 0 : m_pDataContainer->SetDefault( sName, bValue );
695 : 0 : }
696 : :
697 : : //*****************************************************************************************************************
698 : : // public method
699 : : //*****************************************************************************************************************
700 : 0 : void SvtCompatibilityOptions::AppendItem( const ::rtl::OUString& sName,
701 : : const ::rtl::OUString& sModule,
702 : : bool bUsePrtMetrics,
703 : : bool bAddSpacing,
704 : : bool bAddSpacingAtPages,
705 : : bool bUseOurTabStops,
706 : : bool bNoExtLeading,
707 : : bool bUseLineSpacing,
708 : : bool bAddTableSpacing,
709 : : bool bUseObjPos,
710 : : bool bUseOurTextWrapping,
711 : : bool bConsiderWrappingStyle,
712 : : bool bExpandWordSpace )
713 : : {
714 [ # # ][ # # ]: 0 : MutexGuard aGuard( GetOwnStaticMutex() );
715 : : m_pDataContainer->AppendItem(
716 : : sName, sModule, bUsePrtMetrics, bAddSpacing,
717 : : bAddSpacingAtPages, bUseOurTabStops, bNoExtLeading,
718 : : bUseLineSpacing, bAddTableSpacing, bUseObjPos,
719 [ # # ][ # # ]: 0 : bUseOurTextWrapping, bConsiderWrappingStyle, bExpandWordSpace );
720 : 0 : }
721 : :
722 : 1549 : bool SvtCompatibilityOptions::IsUsePrtDevice() const
723 : : {
724 [ + - ][ + - ]: 1549 : MutexGuard aGuard( GetOwnStaticMutex() );
725 [ + - ]: 1549 : return m_pDataContainer->IsUsePrtDevice();
726 : : }
727 : :
728 : 1549 : bool SvtCompatibilityOptions::IsAddSpacing() const
729 : : {
730 [ + - ][ + - ]: 1549 : MutexGuard aGuard( GetOwnStaticMutex() );
731 [ + - ]: 1549 : return m_pDataContainer->IsAddSpacing();
732 : : }
733 : :
734 : 1549 : bool SvtCompatibilityOptions::IsAddSpacingAtPages() const
735 : : {
736 [ + - ][ + - ]: 1549 : MutexGuard aGuard( GetOwnStaticMutex() );
737 [ + - ]: 1549 : return m_pDataContainer->IsAddSpacingAtPages();
738 : : }
739 : :
740 : 1549 : bool SvtCompatibilityOptions::IsUseOurTabStops() const
741 : : {
742 [ + - ][ + - ]: 1549 : MutexGuard aGuard( GetOwnStaticMutex() );
743 [ + - ]: 1549 : return m_pDataContainer->IsUseOurTabStops();
744 : : }
745 : :
746 : 1549 : bool SvtCompatibilityOptions::IsNoExtLeading() const
747 : : {
748 [ + - ][ + - ]: 1549 : MutexGuard aGuard( GetOwnStaticMutex() );
749 [ + - ]: 1549 : return m_pDataContainer->IsNoExtLeading();
750 : : }
751 : :
752 : 1549 : bool SvtCompatibilityOptions::IsUseLineSpacing() const
753 : : {
754 [ + - ][ + - ]: 1549 : MutexGuard aGuard( GetOwnStaticMutex() );
755 [ + - ]: 1549 : return m_pDataContainer->IsUseLineSpacing();
756 : : }
757 : :
758 : 1549 : bool SvtCompatibilityOptions::IsAddTableSpacing() const
759 : : {
760 [ + - ][ + - ]: 1549 : MutexGuard aGuard( GetOwnStaticMutex() );
761 [ + - ]: 1549 : return m_pDataContainer->IsAddTableSpacing();
762 : : }
763 : :
764 : 1549 : bool SvtCompatibilityOptions::IsUseObjectPositioning() const
765 : : {
766 [ + - ][ + - ]: 1549 : MutexGuard aGuard( GetOwnStaticMutex() );
767 [ + - ]: 1549 : return m_pDataContainer->IsUseObjPos();
768 : : }
769 : :
770 : 1549 : bool SvtCompatibilityOptions::IsUseOurTextWrapping() const
771 : : {
772 [ + - ][ + - ]: 1549 : MutexGuard aGuard( GetOwnStaticMutex() );
773 [ + - ]: 1549 : return m_pDataContainer->IsUseOurTextWrapping();
774 : : }
775 : :
776 : 1549 : bool SvtCompatibilityOptions::IsConsiderWrappingStyle() const
777 : : {
778 [ + - ][ + - ]: 1549 : MutexGuard aGuard( GetOwnStaticMutex() );
779 [ + - ]: 1549 : return m_pDataContainer->IsConsiderWrappingStyle();
780 : : }
781 : :
782 : 1549 : bool SvtCompatibilityOptions::IsExpandWordSpace() const
783 : : {
784 [ + - ][ + - ]: 1549 : MutexGuard aGuard( GetOwnStaticMutex() );
785 [ + - ]: 1549 : return m_pDataContainer->IsExpandWordSpace();
786 : : }
787 : :
788 : 0 : Sequence< Sequence< PropertyValue > > SvtCompatibilityOptions::GetList() const
789 : : {
790 [ # # ][ # # ]: 0 : MutexGuard aGuard( GetOwnStaticMutex() );
791 [ # # ][ # # ]: 0 : return m_pDataContainer->GetList();
792 : : }
793 : :
794 : : namespace
795 : : {
796 : : class theCompatibilityOptionsMutex : public rtl::Static<osl::Mutex, theCompatibilityOptionsMutex>{};
797 : : }
798 : :
799 : : //*****************************************************************************************************************
800 : : // private method
801 : : //*****************************************************************************************************************
802 : 20283 : Mutex& SvtCompatibilityOptions::GetOwnStaticMutex()
803 : : {
804 : 20283 : return theCompatibilityOptionsMutex::get();
805 : : }
806 : :
807 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|