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