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 <vcl/svapp.hxx>
21 : #include <svl/zforlist.hxx>
22 :
23 : #include <com/sun/star/uno/Any.hxx>
24 : #include <com/sun/star/uno/Sequence.hxx>
25 :
26 : #include "cfgids.hxx"
27 : #include "docoptio.hxx"
28 : #include "rechead.hxx"
29 : #include "scresid.hxx"
30 : #include "sc.hrc"
31 : #include "miscuno.hxx"
32 : #include "global.hxx"
33 : #include "globstr.hrc"
34 :
35 : using namespace utl;
36 : using namespace com::sun::star::uno;
37 : using ::rtl::OUString;
38 :
39 : //------------------------------------------------------------------------
40 :
41 : #define SC_VERSION ((sal_uInt16)251)
42 :
43 0 : TYPEINIT1(ScTpCalcItem, SfxPoolItem);
44 :
45 : //------------------------------------------------------------------------
46 :
47 : using sc::HMMToTwips;
48 : using sc::TwipsToHMM;
49 : using sc::TwipsToEvenHMM;
50 :
51 : //------------------------------------------------------------------------
52 :
53 390 : static sal_uInt16 lcl_GetDefaultTabDist()
54 : {
55 390 : if ( ScOptionsUtil::IsMetricSystem() )
56 0 : return 709; // 1,25 cm
57 : else
58 390 : return 720; // 1/2"
59 : }
60 :
61 : //========================================================================
62 : // ScDocOptions - Dokument-Optionen
63 : //========================================================================
64 :
65 390 : ScDocOptions::ScDocOptions()
66 : {
67 390 : ResetDocOptions();
68 390 : }
69 :
70 : //------------------------------------------------------------------------
71 :
72 859 : ScDocOptions::ScDocOptions( const ScDocOptions& rCpy )
73 : : fIterEps( rCpy.fIterEps ),
74 : nIterCount( rCpy.nIterCount ),
75 : nPrecStandardFormat( rCpy.nPrecStandardFormat ),
76 : nDay( rCpy.nDay ),
77 : nMonth( rCpy.nMonth ),
78 : nYear( rCpy.nYear ),
79 : nYear2000( rCpy.nYear2000 ),
80 : nTabDistance( rCpy.nTabDistance ),
81 : bIsIgnoreCase( rCpy.bIsIgnoreCase ),
82 : bIsIter( rCpy.bIsIter ),
83 : bCalcAsShown( rCpy.bCalcAsShown ),
84 : bMatchWholeCell( rCpy.bMatchWholeCell ),
85 : bDoAutoSpell( rCpy.bDoAutoSpell ),
86 : bLookUpColRowNames( rCpy.bLookUpColRowNames ),
87 859 : bFormulaRegexEnabled( rCpy.bFormulaRegexEnabled )
88 : {
89 859 : }
90 :
91 : //------------------------------------------------------------------------
92 :
93 1078 : ScDocOptions::~ScDocOptions()
94 : {
95 1078 : }
96 :
97 : //------------------------------------------------------------------------
98 :
99 390 : void ScDocOptions::ResetDocOptions()
100 : {
101 390 : bIsIgnoreCase = false;
102 390 : bIsIter = false;
103 390 : nIterCount = 100;
104 390 : fIterEps = 1.0E-3;
105 390 : nPrecStandardFormat = SvNumberFormatter::UNLIMITED_PRECISION;
106 390 : nDay = 30;
107 390 : nMonth = 12;
108 390 : nYear = 1899;
109 390 : nYear2000 = SvNumberFormatter::GetYear2000Default();
110 390 : nTabDistance = lcl_GetDefaultTabDist();
111 390 : bCalcAsShown = false;
112 390 : bMatchWholeCell = true;
113 390 : bDoAutoSpell = false;
114 390 : bLookUpColRowNames = true;
115 390 : bFormulaRegexEnabled= true;
116 390 : }
117 :
118 : //========================================================================
119 : // ScTpCalcItem - Daten fuer die CalcOptions-TabPage
120 : //========================================================================
121 :
122 : //------------------------------------------------------------------------
123 :
124 0 : ScTpCalcItem::ScTpCalcItem( sal_uInt16 nWhichP, const ScDocOptions& rOpt )
125 : : SfxPoolItem ( nWhichP ),
126 0 : theOptions ( rOpt )
127 : {
128 0 : }
129 :
130 : //------------------------------------------------------------------------
131 :
132 0 : ScTpCalcItem::ScTpCalcItem( const ScTpCalcItem& rItem )
133 : : SfxPoolItem ( rItem ),
134 0 : theOptions ( rItem.theOptions )
135 : {
136 0 : }
137 :
138 : //------------------------------------------------------------------------
139 :
140 0 : ScTpCalcItem::~ScTpCalcItem()
141 : {
142 0 : }
143 :
144 : //------------------------------------------------------------------------
145 :
146 0 : String ScTpCalcItem::GetValueText() const
147 : {
148 0 : return rtl::OUString("ScTpCalcItem");
149 : }
150 :
151 : //------------------------------------------------------------------------
152 :
153 0 : int ScTpCalcItem::operator==( const SfxPoolItem& rItem ) const
154 : {
155 : OSL_ENSURE( SfxPoolItem::operator==( rItem ), "unequal Which or Type" );
156 :
157 0 : const ScTpCalcItem& rPItem = (const ScTpCalcItem&)rItem;
158 :
159 0 : return ( theOptions == rPItem.theOptions );
160 : }
161 :
162 : //------------------------------------------------------------------------
163 :
164 0 : SfxPoolItem* ScTpCalcItem::Clone( SfxItemPool * ) const
165 : {
166 0 : return new ScTpCalcItem( *this );
167 : }
168 :
169 : //==================================================================
170 : // Config Item containing document options
171 : //==================================================================
172 :
173 : #define CFGPATH_CALC "Office.Calc/Calculate"
174 :
175 : #define SCCALCOPT_ITER_ITER 0
176 : #define SCCALCOPT_ITER_STEPS 1
177 : #define SCCALCOPT_ITER_MINCHG 2
178 : #define SCCALCOPT_DATE_DAY 3
179 : #define SCCALCOPT_DATE_MONTH 4
180 : #define SCCALCOPT_DATE_YEAR 5
181 : #define SCCALCOPT_DECIMALS 6
182 : #define SCCALCOPT_CASESENSITIVE 7
183 : #define SCCALCOPT_PRECISION 8
184 : #define SCCALCOPT_SEARCHCRIT 9
185 : #define SCCALCOPT_FINDLABEL 10
186 : #define SCCALCOPT_REGEX 11
187 : #define SCCALCOPT_COUNT 12
188 :
189 : #define CFGPATH_DOCLAYOUT "Office.Calc/Layout/Other"
190 :
191 : #define SCDOCLAYOUTOPT_TABSTOP 0
192 : #define SCDOCLAYOUTOPT_COUNT 1
193 :
194 4 : Sequence<OUString> ScDocCfg::GetCalcPropertyNames()
195 : {
196 : static const char* aPropNames[] =
197 : {
198 : "IterativeReference/Iteration", // SCCALCOPT_ITER_ITER
199 : "IterativeReference/Steps", // SCCALCOPT_ITER_STEPS
200 : "IterativeReference/MinimumChange", // SCCALCOPT_ITER_MINCHG
201 : "Other/Date/DD", // SCCALCOPT_DATE_DAY
202 : "Other/Date/MM", // SCCALCOPT_DATE_MONTH
203 : "Other/Date/YY", // SCCALCOPT_DATE_YEAR
204 : "Other/DecimalPlaces", // SCCALCOPT_DECIMALS
205 : "Other/CaseSensitive", // SCCALCOPT_CASESENSITIVE
206 : "Other/Precision", // SCCALCOPT_PRECISION
207 : "Other/SearchCriteria", // SCCALCOPT_SEARCHCRIT
208 : "Other/FindLabel", // SCCALCOPT_FINDLABEL
209 : "Other/RegularExpressions", // SCCALCOPT_REGEX
210 : };
211 4 : Sequence<OUString> aNames(SCCALCOPT_COUNT);
212 4 : OUString* pNames = aNames.getArray();
213 52 : for(int i = 0; i < SCCALCOPT_COUNT; i++)
214 48 : pNames[i] = OUString::createFromAscii(aPropNames[i]);
215 :
216 4 : return aNames;
217 : }
218 :
219 4 : Sequence<OUString> ScDocCfg::GetLayoutPropertyNames()
220 : {
221 : static const char* aPropNames[] =
222 : {
223 : "TabStop/NonMetric" // SCDOCLAYOUTOPT_TABSTOP
224 : };
225 4 : Sequence<OUString> aNames(SCDOCLAYOUTOPT_COUNT);
226 4 : OUString* pNames = aNames.getArray();
227 8 : for(int i = 0; i < SCDOCLAYOUTOPT_COUNT; i++)
228 4 : pNames[i] = OUString::createFromAscii(aPropNames[i]);
229 :
230 : // adjust for metric system
231 4 : if (ScOptionsUtil::IsMetricSystem())
232 0 : pNames[SCDOCLAYOUTOPT_TABSTOP] = OUString(RTL_CONSTASCII_USTRINGPARAM( "TabStop/Metric") );
233 :
234 4 : return aNames;
235 : }
236 :
237 4 : ScDocCfg::ScDocCfg() :
238 : aCalcItem( OUString(RTL_CONSTASCII_USTRINGPARAM( CFGPATH_CALC )) ),
239 4 : aLayoutItem(OUString(RTL_CONSTASCII_USTRINGPARAM(CFGPATH_DOCLAYOUT)))
240 : {
241 4 : sal_Int32 nIntVal = 0;
242 :
243 4 : Sequence<OUString> aNames;
244 4 : Sequence<Any> aValues;
245 4 : const Any* pValues = NULL;
246 :
247 : sal_uInt16 nDateDay, nDateMonth, nDateYear;
248 4 : GetDate( nDateDay, nDateMonth, nDateYear );
249 :
250 4 : aNames = GetCalcPropertyNames();
251 4 : aValues = aCalcItem.GetProperties(aNames);
252 4 : aCalcItem.EnableNotification(aNames);
253 4 : pValues = aValues.getConstArray();
254 : OSL_ENSURE(aValues.getLength() == aNames.getLength(), "GetProperties failed");
255 4 : if(aValues.getLength() == aNames.getLength())
256 : {
257 4 : double fDoubleVal = 0;
258 52 : for(int nProp = 0; nProp < aNames.getLength(); nProp++)
259 : {
260 : OSL_ENSURE(pValues[nProp].hasValue(), "property value missing");
261 48 : if(pValues[nProp].hasValue())
262 : {
263 48 : switch(nProp)
264 : {
265 : case SCCALCOPT_ITER_ITER:
266 4 : SetIter( ScUnoHelpFunctions::GetBoolFromAny( pValues[nProp] ) );
267 4 : break;
268 : case SCCALCOPT_ITER_STEPS:
269 4 : if (pValues[nProp] >>= nIntVal) SetIterCount( (sal_uInt16) nIntVal );
270 4 : break;
271 : case SCCALCOPT_ITER_MINCHG:
272 4 : if (pValues[nProp] >>= fDoubleVal) SetIterEps( fDoubleVal );
273 4 : break;
274 : case SCCALCOPT_DATE_DAY:
275 4 : if (pValues[nProp] >>= nIntVal) nDateDay = (sal_uInt16) nIntVal;
276 4 : break;
277 : case SCCALCOPT_DATE_MONTH:
278 4 : if (pValues[nProp] >>= nIntVal) nDateMonth = (sal_uInt16) nIntVal;
279 4 : break;
280 : case SCCALCOPT_DATE_YEAR:
281 4 : if (pValues[nProp] >>= nIntVal) nDateYear = (sal_uInt16) nIntVal;
282 4 : break;
283 : case SCCALCOPT_DECIMALS:
284 4 : if (pValues[nProp] >>= nIntVal) SetStdPrecision( (sal_uInt16) nIntVal );
285 4 : break;
286 : case SCCALCOPT_CASESENSITIVE:
287 : // content is reversed
288 4 : SetIgnoreCase( !ScUnoHelpFunctions::GetBoolFromAny( pValues[nProp] ) );
289 4 : break;
290 : case SCCALCOPT_PRECISION:
291 4 : SetCalcAsShown( ScUnoHelpFunctions::GetBoolFromAny( pValues[nProp] ) );
292 4 : break;
293 : case SCCALCOPT_SEARCHCRIT:
294 4 : SetMatchWholeCell( ScUnoHelpFunctions::GetBoolFromAny( pValues[nProp] ) );
295 4 : break;
296 : case SCCALCOPT_FINDLABEL:
297 4 : SetLookUpColRowNames( ScUnoHelpFunctions::GetBoolFromAny( pValues[nProp] ) );
298 4 : break;
299 : case SCCALCOPT_REGEX :
300 4 : SetFormulaRegexEnabled( ScUnoHelpFunctions::GetBoolFromAny( pValues[nProp] ) );
301 4 : break;
302 : }
303 : }
304 : }
305 : }
306 4 : aCalcItem.SetCommitLink( LINK( this, ScDocCfg, CalcCommitHdl ) );
307 :
308 4 : SetDate( nDateDay, nDateMonth, nDateYear );
309 :
310 4 : aNames = GetLayoutPropertyNames();
311 4 : aValues = aLayoutItem.GetProperties(aNames);
312 4 : aLayoutItem.EnableNotification(aNames);
313 4 : pValues = aValues.getConstArray();
314 : OSL_ENSURE(aValues.getLength() == aNames.getLength(), "GetProperties failed");
315 4 : if(aValues.getLength() == aNames.getLength())
316 : {
317 8 : for(int nProp = 0; nProp < aNames.getLength(); nProp++)
318 : {
319 : OSL_ENSURE(pValues[nProp].hasValue(), "property value missing");
320 4 : if(pValues[nProp].hasValue())
321 : {
322 4 : switch(nProp)
323 : {
324 : case SCDOCLAYOUTOPT_TABSTOP:
325 : // TabDistance in ScDocOptions is in twips
326 4 : if (pValues[nProp] >>= nIntVal)
327 4 : SetTabDistance( (sal_uInt16) HMMToTwips( nIntVal ) );
328 4 : break;
329 : }
330 : }
331 : }
332 : }
333 4 : aLayoutItem.SetCommitLink( LINK( this, ScDocCfg, LayoutCommitHdl ) );
334 4 : }
335 :
336 0 : IMPL_LINK_NOARG(ScDocCfg, CalcCommitHdl)
337 : {
338 0 : Sequence<OUString> aNames = GetCalcPropertyNames();
339 0 : Sequence<Any> aValues(aNames.getLength());
340 0 : Any* pValues = aValues.getArray();
341 :
342 : sal_uInt16 nDateDay, nDateMonth, nDateYear;
343 0 : GetDate( nDateDay, nDateMonth, nDateYear );
344 :
345 0 : for(int nProp = 0; nProp < aNames.getLength(); nProp++)
346 : {
347 0 : switch(nProp)
348 : {
349 : case SCCALCOPT_ITER_ITER:
350 0 : ScUnoHelpFunctions::SetBoolInAny( pValues[nProp], IsIter() );
351 0 : break;
352 : case SCCALCOPT_ITER_STEPS:
353 0 : pValues[nProp] <<= (sal_Int32) GetIterCount();
354 0 : break;
355 : case SCCALCOPT_ITER_MINCHG:
356 0 : pValues[nProp] <<= (double) GetIterEps();
357 0 : break;
358 : case SCCALCOPT_DATE_DAY:
359 0 : pValues[nProp] <<= (sal_Int32) nDateDay;
360 0 : break;
361 : case SCCALCOPT_DATE_MONTH:
362 0 : pValues[nProp] <<= (sal_Int32) nDateMonth;
363 0 : break;
364 : case SCCALCOPT_DATE_YEAR:
365 0 : pValues[nProp] <<= (sal_Int32) nDateYear;
366 0 : break;
367 : case SCCALCOPT_DECIMALS:
368 0 : pValues[nProp] <<= (sal_Int32) GetStdPrecision();
369 0 : break;
370 : case SCCALCOPT_CASESENSITIVE:
371 : // content is reversed
372 0 : ScUnoHelpFunctions::SetBoolInAny( pValues[nProp], !IsIgnoreCase() );
373 0 : break;
374 : case SCCALCOPT_PRECISION:
375 0 : ScUnoHelpFunctions::SetBoolInAny( pValues[nProp], IsCalcAsShown() );
376 0 : break;
377 : case SCCALCOPT_SEARCHCRIT:
378 0 : ScUnoHelpFunctions::SetBoolInAny( pValues[nProp], IsMatchWholeCell() );
379 0 : break;
380 : case SCCALCOPT_FINDLABEL:
381 0 : ScUnoHelpFunctions::SetBoolInAny( pValues[nProp], IsLookUpColRowNames() );
382 0 : break;
383 : case SCCALCOPT_REGEX :
384 0 : ScUnoHelpFunctions::SetBoolInAny( pValues[nProp], IsFormulaRegexEnabled() );
385 : }
386 : }
387 0 : aCalcItem.PutProperties(aNames, aValues);
388 :
389 0 : return 0;
390 : }
391 :
392 0 : IMPL_LINK_NOARG(ScDocCfg, LayoutCommitHdl)
393 : {
394 0 : Sequence<OUString> aNames = GetLayoutPropertyNames();
395 0 : Sequence<Any> aValues(aNames.getLength());
396 0 : Any* pValues = aValues.getArray();
397 :
398 0 : for(int nProp = 0; nProp < aNames.getLength(); nProp++)
399 : {
400 0 : switch(nProp)
401 : {
402 : case SCDOCLAYOUTOPT_TABSTOP:
403 : // TabDistance in ScDocOptions is in twips
404 : // use only even numbers, so defaults don't get changed
405 : // by modifying other settings in the same config item
406 0 : pValues[nProp] <<= (sal_Int32) TwipsToEvenHMM( GetTabDistance() );
407 0 : break;
408 : }
409 : }
410 0 : aLayoutItem.PutProperties(aNames, aValues);
411 :
412 0 : return 0;
413 : }
414 :
415 0 : void ScDocCfg::SetOptions( const ScDocOptions& rNew )
416 : {
417 0 : *(ScDocOptions*)this = rNew;
418 :
419 0 : aCalcItem.SetModified();
420 0 : aLayoutItem.SetModified();
421 0 : }
422 :
423 :
424 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|