xref: /trunk/main/sc/source/core/tool/appoptio.cxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_sc.hxx"
30 
31 
32 
33 //------------------------------------------------------------------
34 
35 #include <vcl/svapp.hxx>
36 
37 #include <com/sun/star/uno/Any.hxx>
38 #include <com/sun/star/uno/Sequence.hxx>
39 
40 #include "cfgids.hxx"
41 #include "appoptio.hxx"
42 #include "rechead.hxx"
43 #include "scresid.hxx"
44 #include "global.hxx"
45 #include "userlist.hxx"
46 #include "sc.hrc"
47 #include <formula/compiler.hrc>
48 #include "miscuno.hxx"
49 
50 using namespace utl;
51 using namespace rtl;
52 using namespace com::sun::star::uno;
53 
54 // STATIC DATA -----------------------------------------------------------
55 
56 #define SC_VERSION ((sal_uInt16)304)
57 
58 //========================================================================
59 //      ScAppOptions - Applikations-Optionen
60 //========================================================================
61 
62 ScAppOptions::ScAppOptions() : pLRUList( NULL )
63 {
64     SetDefaults();
65 }
66 
67 //------------------------------------------------------------------------
68 
69 ScAppOptions::ScAppOptions( const ScAppOptions& rCpy ) : pLRUList( NULL )
70 {
71     *this = rCpy;
72 }
73 
74 //------------------------------------------------------------------------
75 
76 ScAppOptions::~ScAppOptions()
77 {
78     delete [] pLRUList;
79 }
80 
81 //------------------------------------------------------------------------
82 
83 void ScAppOptions::SetDefaults()
84 {
85     if ( ScOptionsUtil::IsMetricSystem() )
86         eMetric     = FUNIT_CM;             // default for countries with metric system
87     else
88         eMetric     = FUNIT_INCH;           // default for others
89 
90     nZoom           = 100;
91     eZoomType       = SVX_ZOOM_PERCENT;
92     bSynchronizeZoom = sal_True;
93     nStatusFunc     = SUBTOTAL_FUNC_SUM;
94     bAutoComplete   = sal_True;
95     bDetectiveAuto  = sal_True;
96 
97     delete [] pLRUList;
98     pLRUList = new sal_uInt16[5];               // sinnvoll vorbelegen
99     pLRUList[0] = SC_OPCODE_SUM;
100     pLRUList[1] = SC_OPCODE_AVERAGE;
101     pLRUList[2] = SC_OPCODE_MIN;
102     pLRUList[3] = SC_OPCODE_MAX;
103     pLRUList[4] = SC_OPCODE_IF;
104     nLRUFuncCount = 5;
105 
106     nTrackContentColor = COL_TRANSPARENT;
107     nTrackInsertColor  = COL_TRANSPARENT;
108     nTrackDeleteColor  = COL_TRANSPARENT;
109     nTrackMoveColor    = COL_TRANSPARENT;
110     eLinkMode          = LM_ON_DEMAND;
111 
112     nDefaultObjectSizeWidth = 8000;
113     nDefaultObjectSizeHeight = 5000;
114 
115     mbShowSharedDocumentWarning = true;
116 }
117 
118 //------------------------------------------------------------------------
119 
120 const ScAppOptions& ScAppOptions::operator=( const ScAppOptions& rCpy )
121 {
122     eMetric         = rCpy.eMetric;
123     eZoomType       = rCpy.eZoomType;
124     bSynchronizeZoom = rCpy.bSynchronizeZoom;
125     nZoom           = rCpy.nZoom;
126     SetLRUFuncList( rCpy.pLRUList, rCpy.nLRUFuncCount );
127     nStatusFunc     = rCpy.nStatusFunc;
128     bAutoComplete   = rCpy.bAutoComplete;
129     bDetectiveAuto  = rCpy.bDetectiveAuto;
130     nTrackContentColor = rCpy.nTrackContentColor;
131     nTrackInsertColor  = rCpy.nTrackInsertColor;
132     nTrackDeleteColor  = rCpy.nTrackDeleteColor;
133     nTrackMoveColor    = rCpy.nTrackMoveColor;
134     eLinkMode       = rCpy.eLinkMode;
135     nDefaultObjectSizeWidth = rCpy.nDefaultObjectSizeWidth;
136     nDefaultObjectSizeHeight = rCpy.nDefaultObjectSizeHeight;
137     mbShowSharedDocumentWarning = rCpy.mbShowSharedDocumentWarning;
138     return *this;
139 }
140 
141 //------------------------------------------------------------------------
142 
143 void ScAppOptions::SetLRUFuncList( const sal_uInt16* pList, const sal_uInt16 nCount )
144 {
145     delete [] pLRUList;
146 
147     nLRUFuncCount = nCount;
148 
149     if ( nLRUFuncCount > 0 )
150     {
151         pLRUList = new sal_uInt16[nLRUFuncCount];
152 
153         for ( sal_uInt16 i=0; i<nLRUFuncCount; i++ )
154             pLRUList[i] = pList[i];
155     }
156     else
157         pLRUList = NULL;
158 }
159 
160 //==================================================================
161 //  Config Item containing app options
162 //==================================================================
163 
164 void lcl_SetLastFunctions( ScAppOptions& rOpt, const Any& rValue )
165 {
166     Sequence<sal_Int32> aSeq;
167     if ( rValue >>= aSeq )
168     {
169         long nCount = aSeq.getLength();
170         if ( nCount < USHRT_MAX )
171         {
172             const sal_Int32* pArray = aSeq.getConstArray();
173             sal_uInt16* pUShorts = new sal_uInt16[nCount];
174             for (long i=0; i<nCount; i++)
175                 pUShorts[i] = (sal_uInt16) pArray[i];
176 
177             rOpt.SetLRUFuncList( pUShorts, sal::static_int_cast<sal_uInt16>(nCount) );
178 
179             delete[] pUShorts;
180         }
181     }
182 }
183 
184 void lcl_GetLastFunctions( Any& rDest, const ScAppOptions& rOpt )
185 {
186     long nCount = rOpt.GetLRUFuncListCount();
187     sal_uInt16* pUShorts = rOpt.GetLRUFuncList();
188     if ( nCount && pUShorts )
189     {
190         Sequence<sal_Int32> aSeq( nCount );
191         sal_Int32* pArray = aSeq.getArray();
192         for (long i=0; i<nCount; i++)
193             pArray[i] = pUShorts[i];
194         rDest <<= aSeq;
195     }
196     else
197         rDest <<= Sequence<sal_Int32>(0);   // empty
198 }
199 
200 void lcl_SetSortList( const Any& rValue )
201 {
202     Sequence<OUString> aSeq;
203     if ( rValue >>= aSeq )
204     {
205         long nCount = aSeq.getLength();
206         const OUString* pArray = aSeq.getConstArray();
207         ScUserList aList;
208 
209         //  if setting is "default", keep default values from ScUserList ctor
210         //! mark "default" in a safe way
211         sal_Bool bDefault = ( nCount == 1 &&
212                         pArray[0].equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "NULL" ) ) );
213 
214         if (!bDefault)
215         {
216             aList.FreeAll();
217 
218             for (long i=0; i<nCount; i++)
219             {
220                 ScUserListData* pNew = new ScUserListData( pArray[i] );
221                 if ( !aList.Insert(pNew) )
222                     delete pNew;
223             }
224         }
225 
226         ScGlobal::SetUserList( &aList );
227     }
228 }
229 
230 void lcl_GetSortList( Any& rDest )
231 {
232     const ScUserList* pUserList = ScGlobal::GetUserList();
233     if (pUserList)
234     {
235         long nCount = pUserList->GetCount();
236         Sequence<OUString> aSeq( nCount );
237         OUString* pArray = aSeq.getArray();
238         for (long i=0; i<nCount; i++)
239             pArray[i] = (*pUserList)[sal::static_int_cast<sal_uInt16>(i)]->GetString();
240         rDest <<= aSeq;
241     }
242     else
243         rDest <<= Sequence<OUString>(0);    // empty
244 }
245 
246 //------------------------------------------------------------------
247 
248 #define CFGPATH_LAYOUT      "Office.Calc/Layout"
249 
250 #define SCLAYOUTOPT_MEASURE         0
251 #define SCLAYOUTOPT_STATUSBAR       1
252 #define SCLAYOUTOPT_ZOOMVAL         2
253 #define SCLAYOUTOPT_ZOOMTYPE        3
254 #define SCLAYOUTOPT_SYNCZOOM        4
255 #define SCLAYOUTOPT_COUNT           5
256 
257 #define CFGPATH_INPUT       "Office.Calc/Input"
258 
259 #define SCINPUTOPT_LASTFUNCS        0
260 #define SCINPUTOPT_AUTOINPUT        1
261 #define SCINPUTOPT_DET_AUTO         2
262 #define SCINPUTOPT_COUNT            3
263 
264 #define CFGPATH_REVISION    "Office.Calc/Revision/Color"
265 
266 #define SCREVISOPT_CHANGE           0
267 #define SCREVISOPT_INSERTION        1
268 #define SCREVISOPT_DELETION         2
269 #define SCREVISOPT_MOVEDENTRY       3
270 #define SCREVISOPT_COUNT            4
271 
272 #define CFGPATH_CONTENT     "Office.Calc/Content/Update"
273 
274 #define SCCONTENTOPT_LINK           0
275 #define SCCONTENTOPT_COUNT          1
276 
277 #define CFGPATH_SORTLIST    "Office.Calc/SortList"
278 
279 #define SCSORTLISTOPT_LIST          0
280 #define SCSORTLISTOPT_COUNT         1
281 
282 #define CFGPATH_MISC        "Office.Calc/Misc"
283 
284 #define SCMISCOPT_DEFOBJWIDTH       0
285 #define SCMISCOPT_DEFOBJHEIGHT      1
286 #define SCMISCOPT_SHOWSHAREDDOCWARN 2
287 #define SCMISCOPT_COUNT             3
288 
289 
290 Sequence<OUString> ScAppCfg::GetLayoutPropertyNames()
291 {
292     static const char* aPropNames[] =
293     {
294         "Other/MeasureUnit/NonMetric",  // SCLAYOUTOPT_MEASURE
295         "Other/StatusbarFunction",      // SCLAYOUTOPT_STATUSBAR
296         "Zoom/Value",                   // SCLAYOUTOPT_ZOOMVAL
297         "Zoom/Type",                    // SCLAYOUTOPT_ZOOMTYPE
298         "Zoom/Synchronize"              // SCLAYOUTOPT_SYNCZOOM
299     };
300     Sequence<OUString> aNames(SCLAYOUTOPT_COUNT);
301     OUString* pNames = aNames.getArray();
302     for(int i = 0; i < SCLAYOUTOPT_COUNT; i++)
303         pNames[i] = OUString::createFromAscii(aPropNames[i]);
304 
305     //  adjust for metric system
306     if (ScOptionsUtil::IsMetricSystem())
307         pNames[SCLAYOUTOPT_MEASURE] = OUString::createFromAscii( "Other/MeasureUnit/Metric" );
308 
309     return aNames;
310 }
311 
312 Sequence<OUString> ScAppCfg::GetInputPropertyNames()
313 {
314     static const char* aPropNames[] =
315     {
316         "LastFunctions",            // SCINPUTOPT_LASTFUNCS
317         "AutoInput",                // SCINPUTOPT_AUTOINPUT
318         "DetectiveAuto"             // SCINPUTOPT_DET_AUTO
319     };
320     Sequence<OUString> aNames(SCINPUTOPT_COUNT);
321     OUString* pNames = aNames.getArray();
322     for(int i = 0; i < SCINPUTOPT_COUNT; i++)
323         pNames[i] = OUString::createFromAscii(aPropNames[i]);
324 
325     return aNames;
326 }
327 
328 Sequence<OUString> ScAppCfg::GetRevisionPropertyNames()
329 {
330     static const char* aPropNames[] =
331     {
332         "Change",                   // SCREVISOPT_CHANGE
333         "Insertion",                // SCREVISOPT_INSERTION
334         "Deletion",                 // SCREVISOPT_DELETION
335         "MovedEntry"                // SCREVISOPT_MOVEDENTRY
336     };
337     Sequence<OUString> aNames(SCREVISOPT_COUNT);
338     OUString* pNames = aNames.getArray();
339     for(int i = 0; i < SCREVISOPT_COUNT; i++)
340         pNames[i] = OUString::createFromAscii(aPropNames[i]);
341 
342     return aNames;
343 }
344 
345 Sequence<OUString> ScAppCfg::GetContentPropertyNames()
346 {
347     static const char* aPropNames[] =
348     {
349         "Link"                      // SCCONTENTOPT_LINK
350     };
351     Sequence<OUString> aNames(SCCONTENTOPT_COUNT);
352     OUString* pNames = aNames.getArray();
353     for(int i = 0; i < SCCONTENTOPT_COUNT; i++)
354         pNames[i] = OUString::createFromAscii(aPropNames[i]);
355 
356     return aNames;
357 }
358 
359 Sequence<OUString> ScAppCfg::GetSortListPropertyNames()
360 {
361     static const char* aPropNames[] =
362     {
363         "List"                      // SCSORTLISTOPT_LIST
364     };
365     Sequence<OUString> aNames(SCSORTLISTOPT_COUNT);
366     OUString* pNames = aNames.getArray();
367     for(int i = 0; i < SCSORTLISTOPT_COUNT; i++)
368         pNames[i] = OUString::createFromAscii(aPropNames[i]);
369 
370     return aNames;
371 }
372 
373 Sequence<OUString> ScAppCfg::GetMiscPropertyNames()
374 {
375     static const char* aPropNames[] =
376     {
377         "DefaultObjectSize/Width",      // SCMISCOPT_DEFOBJWIDTH
378         "DefaultObjectSize/Height",     // SCMISCOPT_DEFOBJHEIGHT
379         "SharedDocument/ShowWarning"    // SCMISCOPT_SHOWSHAREDDOCWARN
380     };
381     Sequence<OUString> aNames(SCMISCOPT_COUNT);
382     OUString* pNames = aNames.getArray();
383     for(int i = 0; i < SCMISCOPT_COUNT; i++)
384         pNames[i] = OUString::createFromAscii(aPropNames[i]);
385 
386     return aNames;
387 }
388 
389 
390 ScAppCfg::ScAppCfg() :
391     aLayoutItem( OUString::createFromAscii( CFGPATH_LAYOUT ) ),
392     aInputItem( OUString::createFromAscii( CFGPATH_INPUT ) ),
393     aRevisionItem( OUString::createFromAscii( CFGPATH_REVISION ) ),
394     aContentItem( OUString::createFromAscii( CFGPATH_CONTENT ) ),
395     aSortListItem( OUString::createFromAscii( CFGPATH_SORTLIST ) ),
396     aMiscItem( OUString::createFromAscii( CFGPATH_MISC ) )
397 {
398     sal_Int32 nIntVal = 0;
399 
400     Sequence<OUString> aNames;
401     Sequence<Any> aValues;
402     const Any* pValues = NULL;
403 
404     aNames = GetLayoutPropertyNames();
405     aValues = aLayoutItem.GetProperties(aNames);
406     aLayoutItem.EnableNotification(aNames);
407     pValues = aValues.getConstArray();
408     DBG_ASSERT(aValues.getLength() == aNames.getLength(), "GetProperties failed");
409     if(aValues.getLength() == aNames.getLength())
410     {
411         for(int nProp = 0; nProp < aNames.getLength(); nProp++)
412         {
413             DBG_ASSERT(pValues[nProp].hasValue(), "property value missing");
414             if(pValues[nProp].hasValue())
415             {
416                 switch(nProp)
417                 {
418                     case SCLAYOUTOPT_MEASURE:
419                         if (pValues[nProp] >>= nIntVal) SetAppMetric( (FieldUnit) nIntVal );
420                         break;
421                     case SCLAYOUTOPT_STATUSBAR:
422                         if (pValues[nProp] >>= nIntVal) SetStatusFunc( (sal_uInt16) nIntVal );
423                         break;
424                     case SCLAYOUTOPT_ZOOMVAL:
425                         if (pValues[nProp] >>= nIntVal) SetZoom( (sal_uInt16) nIntVal );
426                         break;
427                     case SCLAYOUTOPT_ZOOMTYPE:
428                         if (pValues[nProp] >>= nIntVal) SetZoomType( (SvxZoomType) nIntVal );
429                         break;
430                     case SCLAYOUTOPT_SYNCZOOM:
431                         SetSynchronizeZoom( ScUnoHelpFunctions::GetBoolFromAny( pValues[nProp] ) );
432                         break;
433                 }
434             }
435         }
436     }
437     aLayoutItem.SetCommitLink( LINK( this, ScAppCfg, LayoutCommitHdl ) );
438 
439     aNames = GetInputPropertyNames();
440     aValues = aInputItem.GetProperties(aNames);
441     aInputItem.EnableNotification(aNames);
442     pValues = aValues.getConstArray();
443     DBG_ASSERT(aValues.getLength() == aNames.getLength(), "GetProperties failed");
444     if(aValues.getLength() == aNames.getLength())
445     {
446         for(int nProp = 0; nProp < aNames.getLength(); nProp++)
447         {
448             DBG_ASSERT(pValues[nProp].hasValue(), "property value missing");
449             if(pValues[nProp].hasValue())
450             {
451                 switch(nProp)
452                 {
453                     case SCINPUTOPT_LASTFUNCS:
454                         lcl_SetLastFunctions( *this, pValues[nProp] );
455                         break;
456                     case SCINPUTOPT_AUTOINPUT:
457                         SetAutoComplete( ScUnoHelpFunctions::GetBoolFromAny( pValues[nProp] ) );
458                         break;
459                     case SCINPUTOPT_DET_AUTO:
460                         SetDetectiveAuto( ScUnoHelpFunctions::GetBoolFromAny( pValues[nProp] ) );
461                         break;
462                 }
463             }
464         }
465     }
466     aInputItem.SetCommitLink( LINK( this, ScAppCfg, InputCommitHdl ) );
467 
468     aNames = GetRevisionPropertyNames();
469     aValues = aRevisionItem.GetProperties(aNames);
470     aRevisionItem.EnableNotification(aNames);
471     pValues = aValues.getConstArray();
472     DBG_ASSERT(aValues.getLength() == aNames.getLength(), "GetProperties failed");
473     if(aValues.getLength() == aNames.getLength())
474     {
475         for(int nProp = 0; nProp < aNames.getLength(); nProp++)
476         {
477             DBG_ASSERT(pValues[nProp].hasValue(), "property value missing");
478             if(pValues[nProp].hasValue())
479             {
480                 switch(nProp)
481                 {
482                     case SCREVISOPT_CHANGE:
483                         if (pValues[nProp] >>= nIntVal) SetTrackContentColor( (sal_uInt32) nIntVal );
484                         break;
485                     case SCREVISOPT_INSERTION:
486                         if (pValues[nProp] >>= nIntVal) SetTrackInsertColor( (sal_uInt32) nIntVal );
487                         break;
488                     case SCREVISOPT_DELETION:
489                         if (pValues[nProp] >>= nIntVal) SetTrackDeleteColor( (sal_uInt32) nIntVal );
490                         break;
491                     case SCREVISOPT_MOVEDENTRY:
492                         if (pValues[nProp] >>= nIntVal) SetTrackMoveColor( (sal_uInt32) nIntVal );
493                         break;
494                 }
495             }
496         }
497     }
498     aRevisionItem.SetCommitLink( LINK( this, ScAppCfg, RevisionCommitHdl ) );
499 
500     aNames = GetContentPropertyNames();
501     aValues = aContentItem.GetProperties(aNames);
502     aContentItem.EnableNotification(aNames);
503     pValues = aValues.getConstArray();
504     DBG_ASSERT(aValues.getLength() == aNames.getLength(), "GetProperties failed");
505     if(aValues.getLength() == aNames.getLength())
506     {
507         for(int nProp = 0; nProp < aNames.getLength(); nProp++)
508         {
509             DBG_ASSERT(pValues[nProp].hasValue(), "property value missing");
510             if(pValues[nProp].hasValue())
511             {
512                 switch(nProp)
513                 {
514                     case SCCONTENTOPT_LINK:
515                         if (pValues[nProp] >>= nIntVal) SetLinkMode( (ScLkUpdMode) nIntVal );
516                         break;
517                 }
518             }
519         }
520     }
521     aContentItem.SetCommitLink( LINK( this, ScAppCfg, ContentCommitHdl ) );
522 
523     aNames = GetSortListPropertyNames();
524     aValues = aSortListItem.GetProperties(aNames);
525     aSortListItem.EnableNotification(aNames);
526     pValues = aValues.getConstArray();
527     DBG_ASSERT(aValues.getLength() == aNames.getLength(), "GetProperties failed");
528     if(aValues.getLength() == aNames.getLength())
529     {
530         for(int nProp = 0; nProp < aNames.getLength(); nProp++)
531         {
532             DBG_ASSERT(pValues[nProp].hasValue(), "property value missing");
533             if(pValues[nProp].hasValue())
534             {
535                 switch(nProp)
536                 {
537                     case SCSORTLISTOPT_LIST:
538                         lcl_SetSortList( pValues[nProp] );
539                         break;
540                 }
541             }
542         }
543     }
544     aSortListItem.SetCommitLink( LINK( this, ScAppCfg, SortListCommitHdl ) );
545 
546     aNames = GetMiscPropertyNames();
547     aValues = aMiscItem.GetProperties(aNames);
548     aMiscItem.EnableNotification(aNames);
549     pValues = aValues.getConstArray();
550     DBG_ASSERT(aValues.getLength() == aNames.getLength(), "GetProperties failed");
551     if(aValues.getLength() == aNames.getLength())
552     {
553         for(int nProp = 0; nProp < aNames.getLength(); nProp++)
554         {
555             DBG_ASSERT(pValues[nProp].hasValue(), "property value missing");
556             if(pValues[nProp].hasValue())
557             {
558                 switch(nProp)
559                 {
560                     case SCMISCOPT_DEFOBJWIDTH:
561                         if (pValues[nProp] >>= nIntVal) SetDefaultObjectSizeWidth( nIntVal );
562                         break;
563                     case SCMISCOPT_DEFOBJHEIGHT:
564                         if (pValues[nProp] >>= nIntVal) SetDefaultObjectSizeHeight( nIntVal );
565                         break;
566                     case SCMISCOPT_SHOWSHAREDDOCWARN:
567                         SetShowSharedDocumentWarning( ScUnoHelpFunctions::GetBoolFromAny( pValues[nProp] ) );
568                         break;
569                 }
570             }
571         }
572     }
573     aMiscItem.SetCommitLink( LINK( this, ScAppCfg, MiscCommitHdl ) );
574 }
575 
576 IMPL_LINK( ScAppCfg, LayoutCommitHdl, void *, EMPTYARG )
577 {
578     Sequence<OUString> aNames = GetLayoutPropertyNames();
579     Sequence<Any> aValues(aNames.getLength());
580     Any* pValues = aValues.getArray();
581 
582     for(int nProp = 0; nProp < aNames.getLength(); nProp++)
583     {
584         switch(nProp)
585         {
586             case SCLAYOUTOPT_MEASURE:
587                 pValues[nProp] <<= (sal_Int32) GetAppMetric();
588                 break;
589             case SCLAYOUTOPT_STATUSBAR:
590                 pValues[nProp] <<= (sal_Int32) GetStatusFunc();
591                 break;
592             case SCLAYOUTOPT_ZOOMVAL:
593                 pValues[nProp] <<= (sal_Int32) GetZoom();
594                 break;
595             case SCLAYOUTOPT_ZOOMTYPE:
596                 pValues[nProp] <<= (sal_Int32) GetZoomType();
597                 break;
598             case SCLAYOUTOPT_SYNCZOOM:
599                 ScUnoHelpFunctions::SetBoolInAny( pValues[nProp], GetSynchronizeZoom() );
600                 break;
601         }
602     }
603     aLayoutItem.PutProperties(aNames, aValues);
604 
605     return 0;
606 }
607 
608 IMPL_LINK( ScAppCfg, InputCommitHdl, void *, EMPTYARG )
609 {
610     Sequence<OUString> aNames = GetInputPropertyNames();
611     Sequence<Any> aValues(aNames.getLength());
612     Any* pValues = aValues.getArray();
613 
614     for(int nProp = 0; nProp < aNames.getLength(); nProp++)
615     {
616         switch(nProp)
617         {
618             case SCINPUTOPT_LASTFUNCS:
619                 lcl_GetLastFunctions( pValues[nProp], *this );
620                 break;
621             case SCINPUTOPT_AUTOINPUT:
622                 ScUnoHelpFunctions::SetBoolInAny( pValues[nProp], GetAutoComplete() );
623                 break;
624             case SCINPUTOPT_DET_AUTO:
625                 ScUnoHelpFunctions::SetBoolInAny( pValues[nProp], GetDetectiveAuto() );
626                 break;
627         }
628     }
629     aInputItem.PutProperties(aNames, aValues);
630 
631     return 0;
632 }
633 
634 IMPL_LINK( ScAppCfg, RevisionCommitHdl, void *, EMPTYARG )
635 {
636     Sequence<OUString> aNames = GetRevisionPropertyNames();
637     Sequence<Any> aValues(aNames.getLength());
638     Any* pValues = aValues.getArray();
639 
640     for(int nProp = 0; nProp < aNames.getLength(); nProp++)
641     {
642         switch(nProp)
643         {
644             case SCREVISOPT_CHANGE:
645                 pValues[nProp] <<= (sal_Int32) GetTrackContentColor();
646                 break;
647             case SCREVISOPT_INSERTION:
648                 pValues[nProp] <<= (sal_Int32) GetTrackInsertColor();
649                 break;
650             case SCREVISOPT_DELETION:
651                 pValues[nProp] <<= (sal_Int32) GetTrackDeleteColor();
652                 break;
653             case SCREVISOPT_MOVEDENTRY:
654                 pValues[nProp] <<= (sal_Int32) GetTrackMoveColor();
655                 break;
656         }
657     }
658     aRevisionItem.PutProperties(aNames, aValues);
659 
660     return 0;
661 }
662 
663 IMPL_LINK( ScAppCfg, ContentCommitHdl, void *, EMPTYARG )
664 {
665     Sequence<OUString> aNames = GetContentPropertyNames();
666     Sequence<Any> aValues(aNames.getLength());
667     Any* pValues = aValues.getArray();
668 
669     for(int nProp = 0; nProp < aNames.getLength(); nProp++)
670     {
671         switch(nProp)
672         {
673             case SCCONTENTOPT_LINK:
674                 pValues[nProp] <<= (sal_Int32) GetLinkMode();
675                 break;
676         }
677     }
678     aContentItem.PutProperties(aNames, aValues);
679 
680     return 0;
681 }
682 
683 IMPL_LINK( ScAppCfg, SortListCommitHdl, void *, EMPTYARG )
684 {
685     Sequence<OUString> aNames = GetSortListPropertyNames();
686     Sequence<Any> aValues(aNames.getLength());
687     Any* pValues = aValues.getArray();
688 
689     for(int nProp = 0; nProp < aNames.getLength(); nProp++)
690     {
691         switch(nProp)
692         {
693             case SCSORTLISTOPT_LIST:
694                 lcl_GetSortList( pValues[nProp] );
695                 break;
696         }
697     }
698     aSortListItem.PutProperties(aNames, aValues);
699 
700     return 0;
701 }
702 
703 IMPL_LINK( ScAppCfg, MiscCommitHdl, void *, EMPTYARG )
704 {
705     Sequence<OUString> aNames = GetMiscPropertyNames();
706     Sequence<Any> aValues(aNames.getLength());
707     Any* pValues = aValues.getArray();
708 
709     for(int nProp = 0; nProp < aNames.getLength(); nProp++)
710     {
711         switch(nProp)
712         {
713             case SCMISCOPT_DEFOBJWIDTH:
714                 pValues[nProp] <<= (sal_Int32) GetDefaultObjectSizeWidth();
715                 break;
716             case SCMISCOPT_DEFOBJHEIGHT:
717                 pValues[nProp] <<= (sal_Int32) GetDefaultObjectSizeHeight();
718                 break;
719             case SCMISCOPT_SHOWSHAREDDOCWARN:
720                 ScUnoHelpFunctions::SetBoolInAny( pValues[nProp], GetShowSharedDocumentWarning() );
721                 break;
722         }
723     }
724     aMiscItem.PutProperties(aNames, aValues);
725 
726     return 0;
727 }
728 
729 void ScAppCfg::SetOptions( const ScAppOptions& rNew )
730 {
731     *(ScAppOptions*)this = rNew;
732     OptionsChanged();
733 }
734 
735 void ScAppCfg::OptionsChanged()
736 {
737     aLayoutItem.SetModified();
738     aInputItem.SetModified();
739     aRevisionItem.SetModified();
740     aContentItem.SetModified();
741     aSortListItem.SetModified();
742     aMiscItem.SetModified();
743 }
744 
745 
746