xref: /trunk/main/sc/source/ui/unoobj/appluno.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 #include "appluno.hxx"
32 #include "sal/types.h"
33 #include <osl/diagnose.h>
34 #include <cppuhelper/factory.hxx>
35 
36 #include <sfx2/app.hxx>
37 #include <sfx2/sfxmodelfactory.hxx>
38 #include "afmtuno.hxx"
39 #include "funcuno.hxx"
40 #include "filtuno.hxx"
41 #include "miscuno.hxx"
42 #include "scmod.hxx"
43 #include "appoptio.hxx"
44 #include "inputopt.hxx"
45 #include "printopt.hxx"
46 #include "userlist.hxx"
47 #include "sc.hrc"           // VAR_ARGS
48 #include "unoguard.hxx"
49 #include "unonames.hxx"
50 #include "funcdesc.hxx"
51 #include <com/sun/star/sheet/FunctionArgument.hpp>
52 
53 using namespace com::sun::star;
54 
55 //------------------------------------------------------------------------
56 
57 // Calc document
58 extern uno::Sequence< rtl::OUString > SAL_CALL ScDocument_getSupportedServiceNames() throw();
59 extern rtl::OUString SAL_CALL ScDocument_getImplementationName() throw();
60 extern uno::Reference< uno::XInterface > SAL_CALL ScDocument_createInstance(
61             const uno::Reference< lang::XMultiServiceFactory > & rSMgr, const sal_uInt64 _nCreationFlags ) throw( uno::Exception );
62 
63 // Calc XML import
64 extern uno::Sequence< rtl::OUString > SAL_CALL ScXMLImport_getSupportedServiceNames() throw();
65 extern rtl::OUString SAL_CALL ScXMLImport_getImplementationName() throw();
66 extern uno::Reference< uno::XInterface > SAL_CALL ScXMLImport_createInstance(
67             const uno::Reference< lang::XMultiServiceFactory > & rSMgr ) throw( uno::Exception );
68 extern uno::Sequence< rtl::OUString > SAL_CALL ScXMLImport_Meta_getSupportedServiceNames() throw();
69 extern rtl::OUString SAL_CALL ScXMLImport_Meta_getImplementationName() throw();
70 extern uno::Reference< uno::XInterface > SAL_CALL ScXMLImport_Meta_createInstance(
71             const uno::Reference< lang::XMultiServiceFactory > & rSMgr ) throw( uno::Exception );
72 extern uno::Sequence< rtl::OUString > SAL_CALL ScXMLImport_Styles_getSupportedServiceNames() throw();
73 extern rtl::OUString SAL_CALL ScXMLImport_Styles_getImplementationName() throw();
74 extern uno::Reference< uno::XInterface > SAL_CALL ScXMLImport_Styles_createInstance(
75             const uno::Reference< lang::XMultiServiceFactory > & rSMgr ) throw( uno::Exception );
76 extern uno::Sequence< rtl::OUString > SAL_CALL ScXMLImport_Content_getSupportedServiceNames() throw();
77 extern rtl::OUString SAL_CALL ScXMLImport_Content_getImplementationName() throw();
78 extern uno::Reference< uno::XInterface > SAL_CALL ScXMLImport_Content_createInstance(
79             const uno::Reference< lang::XMultiServiceFactory > & rSMgr ) throw( uno::Exception );
80 extern uno::Sequence< rtl::OUString > SAL_CALL ScXMLImport_Settings_getSupportedServiceNames() throw();
81 extern rtl::OUString SAL_CALL ScXMLImport_Settings_getImplementationName() throw();
82 extern uno::Reference< uno::XInterface > SAL_CALL ScXMLImport_Settings_createInstance(
83             const uno::Reference< lang::XMultiServiceFactory > & rSMgr ) throw( uno::Exception );
84 
85 // Calc XML export
86 extern uno::Sequence< rtl::OUString > SAL_CALL ScXMLOOoExport_getSupportedServiceNames() throw();
87 extern rtl::OUString SAL_CALL ScXMLOOoExport_getImplementationName() throw();
88 extern uno::Reference< uno::XInterface > SAL_CALL ScXMLOOoExport_createInstance(
89             const uno::Reference< lang::XMultiServiceFactory > & rSMgr ) throw( uno::Exception );
90 extern uno::Sequence< rtl::OUString > SAL_CALL ScXMLOOoExport_Meta_getSupportedServiceNames() throw();
91 extern rtl::OUString SAL_CALL ScXMLOOoExport_Meta_getImplementationName() throw();
92 extern uno::Reference< uno::XInterface > SAL_CALL ScXMLOOoExport_Meta_createInstance(
93             const uno::Reference< lang::XMultiServiceFactory > & rSMgr ) throw( uno::Exception );
94 extern uno::Sequence< rtl::OUString > SAL_CALL ScXMLOOoExport_Styles_getSupportedServiceNames() throw();
95 extern rtl::OUString SAL_CALL ScXMLOOoExport_Styles_getImplementationName() throw();
96 extern uno::Reference< uno::XInterface > SAL_CALL ScXMLOOoExport_Styles_createInstance(
97             const uno::Reference< lang::XMultiServiceFactory > & rSMgr ) throw( uno::Exception );
98 extern uno::Sequence< rtl::OUString > SAL_CALL ScXMLOOoExport_Content_getSupportedServiceNames() throw();
99 extern rtl::OUString SAL_CALL ScXMLOOoExport_Content_getImplementationName() throw();
100 extern uno::Reference< uno::XInterface > SAL_CALL ScXMLOOoExport_Content_createInstance(
101             const uno::Reference< lang::XMultiServiceFactory > & rSMgr ) throw( uno::Exception );
102 extern uno::Sequence< rtl::OUString > SAL_CALL ScXMLOOoExport_Settings_getSupportedServiceNames() throw();
103 extern rtl::OUString SAL_CALL ScXMLOOoExport_Settings_getImplementationName() throw();
104 extern uno::Reference< uno::XInterface > SAL_CALL ScXMLOOoExport_Settings_createInstance(
105             const uno::Reference< lang::XMultiServiceFactory > & rSMgr ) throw( uno::Exception );
106 
107 // Calc XML Oasis export
108 extern uno::Sequence< rtl::OUString > SAL_CALL ScXMLOasisExport_getSupportedServiceNames() throw();
109 extern rtl::OUString SAL_CALL ScXMLOasisExport_getImplementationName() throw();
110 extern uno::Reference< uno::XInterface > SAL_CALL ScXMLOasisExport_createInstance(
111             const uno::Reference< lang::XMultiServiceFactory > & rSMgr ) throw( uno::Exception );
112 extern uno::Sequence< rtl::OUString > SAL_CALL ScXMLOasisExport_Meta_getSupportedServiceNames() throw();
113 extern rtl::OUString SAL_CALL ScXMLOasisExport_Meta_getImplementationName() throw();
114 extern uno::Reference< uno::XInterface > SAL_CALL ScXMLOasisExport_Meta_createInstance(
115             const uno::Reference< lang::XMultiServiceFactory > & rSMgr ) throw( uno::Exception );
116 extern uno::Sequence< rtl::OUString > SAL_CALL ScXMLOasisExport_Styles_getSupportedServiceNames() throw();
117 extern rtl::OUString SAL_CALL ScXMLOasisExport_Styles_getImplementationName() throw();
118 extern uno::Reference< uno::XInterface > SAL_CALL ScXMLOasisExport_Styles_createInstance(
119             const uno::Reference< lang::XMultiServiceFactory > & rSMgr ) throw( uno::Exception );
120 extern uno::Sequence< rtl::OUString > SAL_CALL ScXMLOasisExport_Content_getSupportedServiceNames() throw();
121 extern rtl::OUString SAL_CALL ScXMLOasisExport_Content_getImplementationName() throw();
122 extern uno::Reference< uno::XInterface > SAL_CALL ScXMLOasisExport_Content_createInstance(
123             const uno::Reference< lang::XMultiServiceFactory > & rSMgr ) throw( uno::Exception );
124 extern uno::Sequence< rtl::OUString > SAL_CALL ScXMLOasisExport_Settings_getSupportedServiceNames() throw();
125 extern rtl::OUString SAL_CALL ScXMLOasisExport_Settings_getImplementationName() throw();
126 extern uno::Reference< uno::XInterface > SAL_CALL ScXMLOasisExport_Settings_createInstance(
127             const uno::Reference< lang::XMultiServiceFactory > & rSMgr ) throw( uno::Exception );
128 
129 //------------------------------------------------------------------------
130 
131 //  Anzahl der Funktionen, die als zuletzt benutzt gespeichert werden
132 //! Define mit funcpage.hxx und dwfunctr.hxx zusammenfassen !!!
133 #define LRU_MAX 10
134 
135 //  Spezial-Werte fuer Zoom
136 //! irgendwo zentral
137 #define SC_ZOOMVAL_OPTIMAL      (-1)
138 #define SC_ZOOMVAL_WHOLEPAGE    (-2)
139 #define SC_ZOOMVAL_PAGEWIDTH    (-3)
140 
141 //  Anzahl der PropertyValues in einer Function-Description
142 #define SC_FUNCDESC_PROPCOUNT   5
143 
144 //------------------------------------------------------------------------
145 
146 //  alles ohne Which-ID, Map nur fuer PropertySetInfo
147 
148 static const SfxItemPropertyMapEntry* lcl_GetSettingsPropertyMap()
149 {
150     static SfxItemPropertyMapEntry aSettingsPropertyMap_Impl[] =
151     {
152         {MAP_CHAR_LEN(SC_UNONAME_DOAUTOCP), 0,  &getBooleanCppuType(),              0, 0},
153         {MAP_CHAR_LEN(SC_UNONAME_ENTERED),  0,  &getBooleanCppuType(),              0, 0},
154         {MAP_CHAR_LEN(SC_UNONAME_EXPREF),   0,  &getBooleanCppuType(),              0, 0},
155         {MAP_CHAR_LEN(SC_UNONAME_EXTFMT),   0,  &getBooleanCppuType(),              0, 0},
156         {MAP_CHAR_LEN(SC_UNONAME_LINKUPD),  0,  &getCppuType((sal_Int16*)0),        0, 0},
157         {MAP_CHAR_LEN(SC_UNONAME_MARKHDR),  0,  &getBooleanCppuType(),              0, 0},
158         {MAP_CHAR_LEN(SC_UNONAME_METRIC),   0,  &getCppuType((sal_Int16*)0),        0, 0},
159         {MAP_CHAR_LEN(SC_UNONAME_MOVEDIR),  0,  &getCppuType((sal_Int16*)0),        0, 0},
160         {MAP_CHAR_LEN(SC_UNONAME_MOVESEL),  0,  &getBooleanCppuType(),              0, 0},
161         {MAP_CHAR_LEN(SC_UNONAME_PRALLSH),  0,  &getBooleanCppuType(),              0, 0},
162         {MAP_CHAR_LEN(SC_UNONAME_PREMPTY),  0,  &getBooleanCppuType(),              0, 0},
163         {MAP_CHAR_LEN(SC_UNONAME_RANGEFIN), 0,  &getBooleanCppuType(),              0, 0},
164         {MAP_CHAR_LEN(SC_UNONAME_SCALE),    0,  &getCppuType((sal_Int16*)0),        0, 0},
165         {MAP_CHAR_LEN(SC_UNONAME_STBFUNC),  0,  &getCppuType((sal_Int16*)0),        0, 0},
166         {MAP_CHAR_LEN(SC_UNONAME_ULISTS),   0,  &getCppuType((uno::Sequence<rtl::OUString>*)0), 0, 0},
167         {MAP_CHAR_LEN(SC_UNONAME_PRMETRICS),0,  &getBooleanCppuType(),              0, 0},
168         {MAP_CHAR_LEN(SC_UNONAME_USETABCOL),0,  &getBooleanCppuType(),              0, 0},
169         {MAP_CHAR_LEN(SC_UNONAME_REPLWARN), 0,  &getBooleanCppuType(),              0, 0},
170         {0,0,0,0,0,0}
171     };
172     return aSettingsPropertyMap_Impl;
173 }
174 
175 //------------------------------------------------------------------------
176 
177 #define SCFUNCTIONLISTOBJ_SERVICE       "com.sun.star.sheet.FunctionDescriptions"
178 #define SCRECENTFUNCTIONSOBJ_SERVICE    "com.sun.star.sheet.RecentFunctions"
179 #define SCSPREADSHEETSETTINGS_SERVICE   "com.sun.star.sheet.GlobalSheetSettings"
180 
181 SC_SIMPLE_SERVICE_INFO( ScFunctionListObj, "ScFunctionListObj", SCFUNCTIONLISTOBJ_SERVICE )
182 SC_SIMPLE_SERVICE_INFO( ScRecentFunctionsObj, "ScRecentFunctionsObj", SCRECENTFUNCTIONSOBJ_SERVICE )
183 SC_SIMPLE_SERVICE_INFO( ScSpreadsheetSettings, "ScSpreadsheetSettings", SCSPREADSHEETSETTINGS_SERVICE )
184 
185 //------------------------------------------------------------------------
186 
187 extern "C" {
188 
189 SAL_DLLPUBLIC_EXPORT void SAL_CALL component_getImplementationEnvironment(
190     const sal_Char ** ppEnvTypeName, uno_Environment ** /* ppEnv */ )
191 {
192     *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME;
193 }
194 
195 SAL_DLLPUBLIC_EXPORT void * SAL_CALL component_getFactory(
196     const sal_Char * pImplName, void * pServiceManager, void * /* pRegistryKey */ )
197 {
198     if (!pServiceManager)
199         return NULL;
200 
201     uno::Reference<lang::XSingleServiceFactory> xFactory;
202     rtl::OUString aImpl(rtl::OUString::createFromAscii(pImplName));
203 
204     if ( aImpl == ScSpreadsheetSettings::getImplementationName_Static() )
205         xFactory.set(cppu::createOneInstanceFactory(
206                 reinterpret_cast<lang::XMultiServiceFactory*>(pServiceManager),
207                 ScSpreadsheetSettings::getImplementationName_Static(),
208                 ScSpreadsheetSettings_CreateInstance,
209                 ScSpreadsheetSettings::getSupportedServiceNames_Static() ));
210 
211     if ( aImpl == ScRecentFunctionsObj::getImplementationName_Static() )
212         xFactory.set(cppu::createOneInstanceFactory(
213                 reinterpret_cast<lang::XMultiServiceFactory*>(pServiceManager),
214                 ScRecentFunctionsObj::getImplementationName_Static(),
215                 ScRecentFunctionsObj_CreateInstance,
216                 ScRecentFunctionsObj::getSupportedServiceNames_Static() ));
217 
218     if ( aImpl == ScFunctionListObj::getImplementationName_Static() )
219         xFactory.set(cppu::createOneInstanceFactory(
220                 reinterpret_cast<lang::XMultiServiceFactory*>(pServiceManager),
221                 ScFunctionListObj::getImplementationName_Static(),
222                 ScFunctionListObj_CreateInstance,
223                 ScFunctionListObj::getSupportedServiceNames_Static() ));
224 
225     if ( aImpl == ScAutoFormatsObj::getImplementationName_Static() )
226         xFactory.set(cppu::createOneInstanceFactory(
227                 reinterpret_cast<lang::XMultiServiceFactory*>(pServiceManager),
228                 ScAutoFormatsObj::getImplementationName_Static(),
229                 ScAutoFormatsObj_CreateInstance,
230                 ScAutoFormatsObj::getSupportedServiceNames_Static() ));
231 
232     if ( aImpl == ScFunctionAccess::getImplementationName_Static() )
233         xFactory.set(cppu::createOneInstanceFactory(
234                 reinterpret_cast<lang::XMultiServiceFactory*>(pServiceManager),
235                 ScFunctionAccess::getImplementationName_Static(),
236                 ScFunctionAccess_CreateInstance,
237                 ScFunctionAccess::getSupportedServiceNames_Static() ));
238 
239     if ( aImpl == ScFilterOptionsObj::getImplementationName_Static() )
240         xFactory.set(cppu::createSingleFactory(
241                 reinterpret_cast<lang::XMultiServiceFactory*>(pServiceManager),
242                 ScFilterOptionsObj::getImplementationName_Static(),
243                 ScFilterOptionsObj_CreateInstance,
244                 ScFilterOptionsObj::getSupportedServiceNames_Static() ));
245 
246     if ( aImpl == ScXMLImport_getImplementationName() )
247         xFactory.set(cppu::createSingleFactory(
248                 reinterpret_cast<lang::XMultiServiceFactory*>(pServiceManager),
249                 ScXMLImport_getImplementationName(),
250                 ScXMLImport_createInstance,
251                 ScXMLImport_getSupportedServiceNames() ));
252 
253     if ( aImpl == ScXMLImport_Meta_getImplementationName() )
254         xFactory.set(cppu::createSingleFactory(
255                 reinterpret_cast<lang::XMultiServiceFactory*>(pServiceManager),
256                 ScXMLImport_Meta_getImplementationName(),
257                 ScXMLImport_Meta_createInstance,
258                 ScXMLImport_Meta_getSupportedServiceNames() ));
259 
260     if ( aImpl == ScXMLImport_Styles_getImplementationName() )
261         xFactory.set(cppu::createSingleFactory(
262                 reinterpret_cast<lang::XMultiServiceFactory*>(pServiceManager),
263                 ScXMLImport_Styles_getImplementationName(),
264                 ScXMLImport_Styles_createInstance,
265                 ScXMLImport_Styles_getSupportedServiceNames() ));
266 
267     if ( aImpl == ScXMLImport_Content_getImplementationName() )
268         xFactory.set(cppu::createSingleFactory(
269                 reinterpret_cast<lang::XMultiServiceFactory*>(pServiceManager),
270                 ScXMLImport_Content_getImplementationName(),
271                 ScXMLImport_Content_createInstance,
272                 ScXMLImport_Content_getSupportedServiceNames() ));
273 
274     if ( aImpl == ScXMLImport_Settings_getImplementationName() )
275         xFactory.set(cppu::createSingleFactory(
276                 reinterpret_cast<lang::XMultiServiceFactory*>(pServiceManager),
277                 ScXMLImport_Settings_getImplementationName(),
278                 ScXMLImport_Settings_createInstance,
279                 ScXMLImport_Settings_getSupportedServiceNames() ));
280 
281     if ( aImpl == ScXMLOOoExport_getImplementationName() )
282         xFactory = cppu::createSingleFactory(
283                 reinterpret_cast<lang::XMultiServiceFactory*>(pServiceManager),
284                 ScXMLOOoExport_getImplementationName(),
285                 ScXMLOOoExport_createInstance,
286                 ScXMLOOoExport_getSupportedServiceNames() );
287 
288     if ( aImpl == ScXMLOOoExport_Meta_getImplementationName() )
289         xFactory = cppu::createSingleFactory(
290                 reinterpret_cast<lang::XMultiServiceFactory*>(pServiceManager),
291                 ScXMLOOoExport_Meta_getImplementationName(),
292                 ScXMLOOoExport_Meta_createInstance,
293                 ScXMLOOoExport_Meta_getSupportedServiceNames() );
294 
295     if ( aImpl == ScXMLOOoExport_Styles_getImplementationName() )
296         xFactory = cppu::createSingleFactory(
297                 reinterpret_cast<lang::XMultiServiceFactory*>(pServiceManager),
298                 ScXMLOOoExport_Styles_getImplementationName(),
299                 ScXMLOOoExport_Styles_createInstance,
300                 ScXMLOOoExport_Styles_getSupportedServiceNames() );
301 
302     if ( aImpl == ScXMLOOoExport_Content_getImplementationName() )
303         xFactory = cppu::createSingleFactory(
304                 reinterpret_cast<lang::XMultiServiceFactory*>(pServiceManager),
305                 ScXMLOOoExport_Content_getImplementationName(),
306                 ScXMLOOoExport_Content_createInstance,
307                 ScXMLOOoExport_Content_getSupportedServiceNames() );
308 
309     if ( aImpl == ScXMLOOoExport_Settings_getImplementationName() )
310         xFactory = cppu::createSingleFactory(
311                 reinterpret_cast<lang::XMultiServiceFactory*>(pServiceManager),
312                 ScXMLOOoExport_Settings_getImplementationName(),
313                 ScXMLOOoExport_Settings_createInstance,
314                 ScXMLOOoExport_Settings_getSupportedServiceNames() );
315 
316     if ( aImpl == ScXMLOasisExport_getImplementationName() )
317         xFactory = cppu::createSingleFactory(
318                 reinterpret_cast<lang::XMultiServiceFactory*>(pServiceManager),
319                 ScXMLOasisExport_getImplementationName(),
320                 ScXMLOasisExport_createInstance,
321                 ScXMLOasisExport_getSupportedServiceNames() );
322     if ( aImpl == ScXMLOasisExport_Meta_getImplementationName() )
323         xFactory = cppu::createSingleFactory(
324                 reinterpret_cast<lang::XMultiServiceFactory*>(pServiceManager),
325                 ScXMLOasisExport_Meta_getImplementationName(),
326                 ScXMLOasisExport_Meta_createInstance,
327                 ScXMLOasisExport_Meta_getSupportedServiceNames() );
328     if ( aImpl == ScXMLOasisExport_Styles_getImplementationName() )
329         xFactory = cppu::createSingleFactory(
330                 reinterpret_cast<lang::XMultiServiceFactory*>(pServiceManager),
331                 ScXMLOasisExport_Styles_getImplementationName(),
332                 ScXMLOasisExport_Styles_createInstance,
333                 ScXMLOasisExport_Styles_getSupportedServiceNames() );
334     if ( aImpl == ScXMLOasisExport_Content_getImplementationName() )
335         xFactory = cppu::createSingleFactory(
336                 reinterpret_cast<lang::XMultiServiceFactory*>(pServiceManager),
337                 ScXMLOasisExport_Content_getImplementationName(),
338                 ScXMLOasisExport_Content_createInstance,
339                 ScXMLOasisExport_Content_getSupportedServiceNames() );
340     if ( aImpl == ScXMLOasisExport_Settings_getImplementationName() )
341         xFactory = cppu::createSingleFactory(
342                 reinterpret_cast<lang::XMultiServiceFactory*>(pServiceManager),
343                 ScXMLOasisExport_Settings_getImplementationName(),
344                 ScXMLOasisExport_Settings_createInstance,
345                 ScXMLOasisExport_Settings_getSupportedServiceNames() );
346 
347     if ( aImpl == ScDocument_getImplementationName() )
348         xFactory.set(sfx2::createSfxModelFactory(
349                 reinterpret_cast<lang::XMultiServiceFactory*>(pServiceManager),
350                 ScDocument_getImplementationName(),
351                 ScDocument_createInstance,
352                 ScDocument_getSupportedServiceNames() ));
353 
354     void* pRet = NULL;
355     if (xFactory.is())
356     {
357         xFactory->acquire();
358         pRet = xFactory.get();
359     }
360     return pRet;
361 }
362 
363 }   // extern C
364 
365 //------------------------------------------------------------------------
366 
367 ScSpreadsheetSettings::ScSpreadsheetSettings() :
368     aPropSet( lcl_GetSettingsPropertyMap() )
369 {
370 }
371 
372 ScSpreadsheetSettings::~ScSpreadsheetSettings()
373 {
374 }
375 
376 uno::Reference<uno::XInterface> SAL_CALL ScSpreadsheetSettings_CreateInstance(
377                         const uno::Reference<lang::XMultiServiceFactory>& /* rSMgr */ )
378 {
379     ScUnoGuard aGuard;
380     ScDLL::Init();
381     static uno::Reference<uno::XInterface> xInst((cppu::OWeakObject*)new ScSpreadsheetSettings());
382     return xInst;
383 }
384 
385 rtl::OUString ScSpreadsheetSettings::getImplementationName_Static()
386 {
387     return rtl::OUString::createFromAscii( "stardiv.StarCalc.ScSpreadsheetSettings" );
388 }
389 
390 uno::Sequence<rtl::OUString> ScSpreadsheetSettings::getSupportedServiceNames_Static()
391 {
392     uno::Sequence<rtl::OUString> aRet(1);
393     rtl::OUString* pArray = aRet.getArray();
394     pArray[0] = rtl::OUString::createFromAscii( SCSPREADSHEETSETTINGS_SERVICE );
395     return aRet;
396 }
397 
398 // XPropertySet
399 
400 uno::Reference<beans::XPropertySetInfo> SAL_CALL ScSpreadsheetSettings::getPropertySetInfo()
401                                                         throw(uno::RuntimeException)
402 {
403     ScUnoGuard aGuard;
404     static uno::Reference<beans::XPropertySetInfo> aRef(
405         new SfxItemPropertySetInfo( aPropSet.getPropertyMap() ));
406     return aRef;
407 }
408 
409 void SAL_CALL ScSpreadsheetSettings::setPropertyValue(
410                         const rtl::OUString& aPropertyName, const uno::Any& aValue )
411                 throw(beans::UnknownPropertyException, beans::PropertyVetoException,
412                         lang::IllegalArgumentException, lang::WrappedTargetException,
413                         uno::RuntimeException)
414 {
415     ScUnoGuard aGuard;
416     String aString(aPropertyName);
417 
418     ScModule* pScMod = SC_MOD();
419     ScAppOptions   aAppOpt(pScMod->GetAppOptions());
420     ScInputOptions aInpOpt(pScMod->GetInputOptions());
421     sal_Bool bSaveApp = sal_False;
422     sal_Bool bSaveInp = sal_False;
423     // print options aren't loaded until needed
424 
425     if (aString.EqualsAscii( SC_UNONAME_DOAUTOCP ))
426     {
427         aAppOpt.SetAutoComplete( ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
428         bSaveApp = sal_True;
429     }
430     else if (aString.EqualsAscii( SC_UNONAME_ENTERED ))
431     {
432         aInpOpt.SetEnterEdit( ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
433         bSaveInp = sal_True;
434     }
435     else if (aString.EqualsAscii( SC_UNONAME_EXPREF ))
436     {
437         aInpOpt.SetExpandRefs( ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
438         bSaveInp = sal_True;
439     }
440     else if (aString.EqualsAscii( SC_UNONAME_EXTFMT ))
441     {
442         aInpOpt.SetExtendFormat( ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
443         bSaveInp = sal_True;
444     }
445     else if (aString.EqualsAscii( SC_UNONAME_LINKUPD ))
446     {
447         aAppOpt.SetLinkMode( (ScLkUpdMode) ScUnoHelpFunctions::GetInt16FromAny( aValue ) );
448         bSaveApp = sal_True;
449     }
450     else if (aString.EqualsAscii( SC_UNONAME_MARKHDR ))
451     {
452         aInpOpt.SetMarkHeader( ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
453         bSaveInp = sal_True;
454     }
455     else if (aString.EqualsAscii( SC_UNONAME_MOVESEL ))
456     {
457         aInpOpt.SetMoveSelection( ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
458         bSaveInp = sal_True;
459     }
460     else if (aString.EqualsAscii( SC_UNONAME_RANGEFIN ))
461     {
462         aInpOpt.SetRangeFinder( ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
463         bSaveInp = sal_True;
464     }
465     else if (aString.EqualsAscii( SC_UNONAME_USETABCOL ))
466     {
467         aInpOpt.SetUseTabCol( ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
468         bSaveInp = sal_True;
469     }
470     else if (aString.EqualsAscii( SC_UNONAME_PRMETRICS ))
471     {
472         aInpOpt.SetTextWysiwyg( ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
473         bSaveInp = sal_True;
474     }
475     else if (aString.EqualsAscii( SC_UNONAME_REPLWARN ))
476     {
477         aInpOpt.SetReplaceCellsWarn( ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
478         bSaveInp = sal_True;
479     }
480     else if (aString.EqualsAscii( SC_UNONAME_METRIC ))
481     {
482         aAppOpt.SetAppMetric( (FieldUnit) ScUnoHelpFunctions::GetInt16FromAny( aValue ) );
483         bSaveApp = sal_True;
484     }
485     else if (aString.EqualsAscii( SC_UNONAME_MOVEDIR ))
486     {
487         aInpOpt.SetMoveDir( ScUnoHelpFunctions::GetInt16FromAny( aValue ) );
488         bSaveInp = sal_True;
489     }
490     else if (aString.EqualsAscii( SC_UNONAME_SCALE ))
491     {
492         short nVal = ScUnoHelpFunctions::GetInt16FromAny( aValue );
493         if ( nVal < 0 )
494         {
495             SvxZoomType eType = SVX_ZOOM_PERCENT;
496             switch (nVal)
497             {
498                 case SC_ZOOMVAL_OPTIMAL:    eType = SVX_ZOOM_OPTIMAL;   break;
499                 case SC_ZOOMVAL_WHOLEPAGE:  eType = SVX_ZOOM_WHOLEPAGE; break;
500                 case SC_ZOOMVAL_PAGEWIDTH:  eType = SVX_ZOOM_PAGEWIDTH; break;
501             }
502             aAppOpt.SetZoomType( eType );
503         }
504         else if ( nVal >= MINZOOM && nVal <= MAXZOOM )
505         {
506             aAppOpt.SetZoom( nVal );
507             aAppOpt.SetZoomType( SVX_ZOOM_PERCENT );
508         }
509         bSaveApp = sal_True;
510     }
511     else if (aString.EqualsAscii( SC_UNONAME_STBFUNC ))
512     {
513         aAppOpt.SetStatusFunc( ScUnoHelpFunctions::GetInt16FromAny( aValue ) );
514         bSaveApp = sal_True;
515     }
516     else if (aString.EqualsAscii( SC_UNONAME_ULISTS ))
517     {
518         ScUserList* pUserList = ScGlobal::GetUserList();
519         uno::Sequence<rtl::OUString> aSeq;
520         if ( pUserList && ( aValue >>= aSeq ) )
521         {
522             //  es wird direkt die "lebende" Liste veraendert,
523             //  mehr tut ScGlobal::SetUserList auch nicht
524 
525             pUserList->FreeAll();                   // alle Eintraege raus
526             sal_uInt16 nCount = (sal_uInt16)aSeq.getLength();
527             const rtl::OUString* pAry = aSeq.getConstArray();
528             for (sal_uInt16 i=0; i<nCount; i++)
529             {
530                 String aEntry = pAry[i];
531                 ScUserListData* pData = new ScUserListData(aEntry);
532                 if (!pUserList->Insert(pData))      // hinten anhaengen
533                     delete pData;                   // sollte nicht vorkommen
534             }
535             bSaveApp = sal_True;    // Liste wird mit den App-Optionen gespeichert
536         }
537     }
538     else if (aString.EqualsAscii( SC_UNONAME_PRALLSH ))
539     {
540         ScPrintOptions aPrintOpt(pScMod->GetPrintOptions());
541         aPrintOpt.SetAllSheets( ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
542         pScMod->SetPrintOptions( aPrintOpt );
543     }
544     else if (aString.EqualsAscii( SC_UNONAME_PREMPTY ))
545     {
546         ScPrintOptions aPrintOpt(pScMod->GetPrintOptions());
547         aPrintOpt.SetSkipEmpty( !ScUnoHelpFunctions::GetBoolFromAny( aValue ) );    // reversed
548         pScMod->SetPrintOptions( aPrintOpt );
549         SFX_APP()->Broadcast( SfxSimpleHint( SID_SCPRINTOPTIONS ) );    // update previews
550     }
551 
552     if ( bSaveApp )
553         pScMod->SetAppOptions( aAppOpt );
554     if ( bSaveInp )
555         pScMod->SetInputOptions( aInpOpt );
556 }
557 
558 uno::Any SAL_CALL ScSpreadsheetSettings::getPropertyValue( const rtl::OUString& aPropertyName )
559                 throw(beans::UnknownPropertyException, lang::WrappedTargetException,
560                         uno::RuntimeException)
561 {
562     ScUnoGuard aGuard;
563     String aString = aPropertyName;
564     uno::Any aRet;
565 
566     ScModule* pScMod = SC_MOD();
567     ScAppOptions   aAppOpt = pScMod->GetAppOptions();
568     ScInputOptions aInpOpt = pScMod->GetInputOptions();
569     // print options aren't loaded until needed
570 
571     if (aString.EqualsAscii( SC_UNONAME_DOAUTOCP ))     ScUnoHelpFunctions::SetBoolInAny( aRet, aAppOpt.GetAutoComplete() );
572     else if (aString.EqualsAscii( SC_UNONAME_ENTERED )) ScUnoHelpFunctions::SetBoolInAny( aRet, aInpOpt.GetEnterEdit() );
573     else if (aString.EqualsAscii( SC_UNONAME_EXPREF ))  ScUnoHelpFunctions::SetBoolInAny( aRet, aInpOpt.GetExpandRefs() );
574     else if (aString.EqualsAscii( SC_UNONAME_EXTFMT ))  ScUnoHelpFunctions::SetBoolInAny( aRet, aInpOpt.GetExtendFormat() );
575     else if (aString.EqualsAscii( SC_UNONAME_LINKUPD )) aRet <<= (sal_Int16) aAppOpt.GetLinkMode();
576     else if (aString.EqualsAscii( SC_UNONAME_MARKHDR )) ScUnoHelpFunctions::SetBoolInAny( aRet, aInpOpt.GetMarkHeader() );
577     else if (aString.EqualsAscii( SC_UNONAME_MOVESEL )) ScUnoHelpFunctions::SetBoolInAny( aRet, aInpOpt.GetMoveSelection() );
578     else if (aString.EqualsAscii( SC_UNONAME_RANGEFIN )) ScUnoHelpFunctions::SetBoolInAny( aRet, aInpOpt.GetRangeFinder() );
579     else if (aString.EqualsAscii( SC_UNONAME_USETABCOL )) ScUnoHelpFunctions::SetBoolInAny( aRet, aInpOpt.GetUseTabCol() );
580     else if (aString.EqualsAscii( SC_UNONAME_PRMETRICS )) ScUnoHelpFunctions::SetBoolInAny( aRet, aInpOpt.GetTextWysiwyg() );
581     else if (aString.EqualsAscii( SC_UNONAME_REPLWARN )) ScUnoHelpFunctions::SetBoolInAny( aRet, aInpOpt.GetReplaceCellsWarn() );
582     else if (aString.EqualsAscii( SC_UNONAME_METRIC ))  aRet <<= (sal_Int16) aAppOpt.GetAppMetric();
583     else if (aString.EqualsAscii( SC_UNONAME_MOVEDIR )) aRet <<= (sal_Int16) aInpOpt.GetMoveDir();
584     else if (aString.EqualsAscii( SC_UNONAME_STBFUNC )) aRet <<= (sal_Int16) aAppOpt.GetStatusFunc();
585     else if (aString.EqualsAscii( SC_UNONAME_SCALE ))
586     {
587         sal_Int16 nZoomVal = 0;
588         switch ( aAppOpt.GetZoomType() )
589         {
590             case SVX_ZOOM_PERCENT:   nZoomVal = aAppOpt.GetZoom();    break;
591             case SVX_ZOOM_OPTIMAL:   nZoomVal = SC_ZOOMVAL_OPTIMAL;   break;
592             case SVX_ZOOM_WHOLEPAGE: nZoomVal = SC_ZOOMVAL_WHOLEPAGE; break;
593             case SVX_ZOOM_PAGEWIDTH: nZoomVal = SC_ZOOMVAL_PAGEWIDTH; break;
594             default:
595             {
596                 // added to avoid warnings
597             }
598         }
599         aRet <<= (sal_Int16) nZoomVal;
600     }
601     else if (aString.EqualsAscii( SC_UNONAME_ULISTS ))
602     {
603         ScUserList* pUserList = ScGlobal::GetUserList();
604         if (pUserList)
605         {
606             sal_uInt16 nCount = pUserList->GetCount();
607             uno::Sequence<rtl::OUString> aSeq(nCount);
608             rtl::OUString* pAry = aSeq.getArray();
609             for (sal_uInt16 i=0; i<nCount; i++)
610             {
611                 String aEntry((*pUserList)[i]->GetString());
612                 pAry[i] = aEntry;
613             }
614             aRet <<= aSeq;
615         }
616     }
617     else if (aString.EqualsAscii( SC_UNONAME_PRALLSH ))
618         ScUnoHelpFunctions::SetBoolInAny( aRet, pScMod->GetPrintOptions().GetAllSheets() );
619     else if (aString.EqualsAscii( SC_UNONAME_PREMPTY ))
620         ScUnoHelpFunctions::SetBoolInAny( aRet, !pScMod->GetPrintOptions().GetSkipEmpty() );    // reversed
621 
622     return aRet;
623 }
624 
625 SC_IMPL_DUMMY_PROPERTY_LISTENER( ScSpreadsheetSettings )
626 
627 //------------------------------------------------------------------------
628 
629 ScRecentFunctionsObj::ScRecentFunctionsObj()
630 {
631 }
632 
633 ScRecentFunctionsObj::~ScRecentFunctionsObj()
634 {
635 }
636 
637 // stuff for exService_...
638 
639 uno::Reference<uno::XInterface> SAL_CALL ScRecentFunctionsObj_CreateInstance(
640                         const uno::Reference<lang::XMultiServiceFactory>& /* rSMgr */ )
641 {
642     ScUnoGuard aGuard;
643     ScDLL::Init();
644     static uno::Reference<uno::XInterface> xInst((cppu::OWeakObject*)new ScRecentFunctionsObj());
645     return xInst;
646 }
647 
648 rtl::OUString ScRecentFunctionsObj::getImplementationName_Static()
649 {
650     return rtl::OUString::createFromAscii( "stardiv.StarCalc.ScRecentFunctionsObj" );
651 }
652 
653 uno::Sequence<rtl::OUString> ScRecentFunctionsObj::getSupportedServiceNames_Static()
654 {
655     uno::Sequence<rtl::OUString> aRet(1);
656     rtl::OUString* pArray = aRet.getArray();
657     pArray[0] = rtl::OUString::createFromAscii( SCRECENTFUNCTIONSOBJ_SERVICE );
658     return aRet;
659 }
660 
661 // XRecentFunctions
662 
663 uno::Sequence<sal_Int32> SAL_CALL ScRecentFunctionsObj::getRecentFunctionIds()
664                                                         throw(uno::RuntimeException)
665 {
666     ScUnoGuard aGuard;
667     const ScAppOptions& rOpt = SC_MOD()->GetAppOptions();
668     sal_uInt16 nCount = rOpt.GetLRUFuncListCount();
669     const sal_uInt16* pFuncs = rOpt.GetLRUFuncList();
670     if (pFuncs)
671     {
672         uno::Sequence<sal_Int32> aSeq(nCount);
673         sal_Int32* pAry = aSeq.getArray();
674         for (sal_uInt16 i=0; i<nCount; i++)
675             pAry[i] = pFuncs[i];
676         return aSeq;
677     }
678     return uno::Sequence<sal_Int32>(0);
679 }
680 
681 void SAL_CALL ScRecentFunctionsObj::setRecentFunctionIds(
682                     const uno::Sequence<sal_Int32>& aRecentFunctionIds )
683                                     throw(uno::RuntimeException)
684 {
685     ScUnoGuard aGuard;
686     sal_uInt16 nCount = (sal_uInt16) Min( aRecentFunctionIds.getLength(), (sal_Int32) LRU_MAX );
687     const sal_Int32* pAry = aRecentFunctionIds.getConstArray();
688 
689     sal_uInt16* pFuncs = nCount ? new sal_uInt16[nCount] : NULL;
690     for (sal_uInt16 i=0; i<nCount; i++)
691         pFuncs[i] = (sal_uInt16)pAry[i];        //! auf gueltige Werte testen?
692 
693     ScModule* pScMod = SC_MOD();
694     ScAppOptions aNewOpts(pScMod->GetAppOptions());
695     aNewOpts.SetLRUFuncList(pFuncs, nCount);
696     pScMod->SetAppOptions(aNewOpts);
697 
698     pScMod->RecentFunctionsChanged();       // update function list child window
699 
700     delete[] pFuncs;
701 }
702 
703 sal_Int32 SAL_CALL ScRecentFunctionsObj::getMaxRecentFunctions() throw(uno::RuntimeException)
704 {
705     return LRU_MAX;
706 }
707 
708 //------------------------------------------------------------------------
709 
710 ScFunctionListObj::ScFunctionListObj()
711 {
712 }
713 
714 ScFunctionListObj::~ScFunctionListObj()
715 {
716 }
717 
718 // stuff for exService_...
719 
720 uno::Reference<uno::XInterface> SAL_CALL ScFunctionListObj_CreateInstance(
721                         const uno::Reference<lang::XMultiServiceFactory>& /* rSMgr */ )
722 {
723     ScUnoGuard aGuard;
724     ScDLL::Init();
725     static uno::Reference<uno::XInterface> xInst((cppu::OWeakObject*)new ScFunctionListObj());
726     return xInst;
727 }
728 
729 rtl::OUString ScFunctionListObj::getImplementationName_Static()
730 {
731     return rtl::OUString::createFromAscii( "stardiv.StarCalc.ScFunctionListObj" );
732 }
733 
734 uno::Sequence<rtl::OUString> ScFunctionListObj::getSupportedServiceNames_Static()
735 {
736     uno::Sequence<rtl::OUString> aRet(1);
737     rtl::OUString* pArray = aRet.getArray();
738     pArray[0] = rtl::OUString::createFromAscii( SCFUNCTIONLISTOBJ_SERVICE );
739     return aRet;
740 }
741 
742 
743 static void lcl_FillSequence( uno::Sequence<beans::PropertyValue>& rSequence, const ScFuncDesc& rDesc )
744 {
745     rDesc.initArgumentInfo();   // full argument info is needed
746 
747     DBG_ASSERT( rSequence.getLength() == SC_FUNCDESC_PROPCOUNT, "Falscher Count" );
748 
749     beans::PropertyValue* pArray = rSequence.getArray();
750 
751     pArray[0].Name = rtl::OUString::createFromAscii( SC_UNONAME_ID );
752     pArray[0].Value <<= (sal_Int32) rDesc.nFIndex;
753 
754     pArray[1].Name = rtl::OUString::createFromAscii( SC_UNONAME_CATEGORY );
755     pArray[1].Value <<= (sal_Int32) rDesc.nCategory;
756 
757     pArray[2].Name = rtl::OUString::createFromAscii( SC_UNONAME_NAME );
758     if (rDesc.pFuncName)
759         pArray[2].Value <<= rtl::OUString( *rDesc.pFuncName );
760 
761     pArray[3].Name = rtl::OUString::createFromAscii( SC_UNONAME_DESCRIPTION );
762     if (rDesc.pFuncDesc)
763         pArray[3].Value <<= rtl::OUString( *rDesc.pFuncDesc );
764 
765     pArray[4].Name = rtl::OUString::createFromAscii( SC_UNONAME_ARGUMENTS );
766     if (rDesc.ppDefArgNames && rDesc.ppDefArgDescs && rDesc.pDefArgFlags )
767     {
768         sal_uInt16 nCount = rDesc.nArgCount;
769         if (nCount >= VAR_ARGS)
770             nCount -= VAR_ARGS - 1;
771         sal_uInt16 nSeqCount = rDesc.GetSuppressedArgCount();
772         if (nSeqCount >= VAR_ARGS)
773             nSeqCount -= VAR_ARGS - 1;
774 
775         if (nSeqCount)
776         {
777             uno::Sequence<sheet::FunctionArgument> aArgSeq(nSeqCount);
778             sheet::FunctionArgument* pArgAry = aArgSeq.getArray();
779             for (sal_uInt16 i=0, j=0; i<nCount; i++)
780             {
781                 if (!rDesc.pDefArgFlags[i].bSuppress)
782                 {
783                     String aArgName;
784                     if (rDesc.ppDefArgNames[i]) aArgName = *rDesc.ppDefArgNames[i];
785                     String aArgDesc;
786                     if (rDesc.ppDefArgDescs[i]) aArgDesc = *rDesc.ppDefArgDescs[i];
787                     sheet::FunctionArgument aArgument;
788                     aArgument.Name        = aArgName;
789                     aArgument.Description = aArgDesc;
790                     aArgument.IsOptional  = rDesc.pDefArgFlags[i].bOptional;
791                     pArgAry[j++] = aArgument;
792                 }
793             }
794             pArray[4].Value <<= aArgSeq;
795         }
796     }
797 }
798 
799 // XFunctionDescriptions
800 
801 uno::Sequence<beans::PropertyValue> SAL_CALL ScFunctionListObj::getById( sal_Int32 nId )
802                                 throw(lang::IllegalArgumentException, uno::RuntimeException)
803 {
804     ScUnoGuard aGuard;
805     const ScFunctionList* pFuncList = ScGlobal::GetStarCalcFunctionList();
806     if ( pFuncList )
807     {
808         sal_uInt16 nCount = (sal_uInt16)pFuncList->GetCount();
809         for (sal_uInt16 nIndex=0; nIndex<nCount; nIndex++)
810         {
811             const ScFuncDesc* pDesc = pFuncList->GetFunction(nIndex);
812             if ( pDesc && pDesc->nFIndex == nId )
813             {
814                 uno::Sequence<beans::PropertyValue> aSeq( SC_FUNCDESC_PROPCOUNT );
815                 lcl_FillSequence( aSeq, *pDesc );
816                 return aSeq;
817             }
818         }
819 
820         throw lang::IllegalArgumentException();         // not found
821     }
822     else
823         throw uno::RuntimeException();                  // should not happen
824 
825 //    return uno::Sequence<beans::PropertyValue>(0);
826 }
827 
828 // XNameAccess
829 
830 uno::Any SAL_CALL ScFunctionListObj::getByName( const rtl::OUString& aName )
831             throw(container::NoSuchElementException,
832                     lang::WrappedTargetException, uno::RuntimeException)
833 {
834     ScUnoGuard aGuard;
835     String aNameStr(aName);
836     const ScFunctionList* pFuncList = ScGlobal::GetStarCalcFunctionList();
837     if ( pFuncList )
838     {
839         sal_uInt16 nCount = (sal_uInt16)pFuncList->GetCount();
840         for (sal_uInt16 nIndex=0; nIndex<nCount; nIndex++)
841         {
842             const ScFuncDesc* pDesc = pFuncList->GetFunction(nIndex);
843             //! Case-insensitiv ???
844             if ( pDesc && pDesc->pFuncName && aNameStr == *pDesc->pFuncName )
845             {
846                 uno::Sequence<beans::PropertyValue> aSeq( SC_FUNCDESC_PROPCOUNT );
847                 lcl_FillSequence( aSeq, *pDesc );
848                 return uno::makeAny(aSeq);
849             }
850         }
851 
852         throw container::NoSuchElementException();      // not found
853     }
854     else
855         throw uno::RuntimeException();                  // should not happen
856 
857 //    return uno::Any();
858 }
859 
860 // XIndexAccess
861 
862 sal_Int32 SAL_CALL ScFunctionListObj::getCount() throw(uno::RuntimeException)
863 {
864     ScUnoGuard aGuard;
865     sal_uInt16 nCount = 0;
866     const ScFunctionList* pFuncList = ScGlobal::GetStarCalcFunctionList();
867     if ( pFuncList )
868         nCount = (sal_uInt16)pFuncList->GetCount();
869     return nCount;
870 }
871 
872 uno::Any SAL_CALL ScFunctionListObj::getByIndex( sal_Int32 nIndex )
873                             throw(lang::IndexOutOfBoundsException,
874                                     lang::WrappedTargetException, uno::RuntimeException)
875 {
876     ScUnoGuard aGuard;
877     const ScFunctionList* pFuncList = ScGlobal::GetStarCalcFunctionList();
878     if ( pFuncList )
879     {
880         if ( nIndex >= 0 && nIndex < (sal_Int32)pFuncList->GetCount() )
881         {
882             const ScFuncDesc* pDesc = pFuncList->GetFunction(nIndex);
883             if ( pDesc )
884             {
885                 uno::Sequence<beans::PropertyValue> aSeq( SC_FUNCDESC_PROPCOUNT );
886                 lcl_FillSequence( aSeq, *pDesc );
887                 return uno::makeAny(aSeq);
888             }
889         }
890 
891         throw lang::IndexOutOfBoundsException();        // illegal index
892     }
893     else
894         throw uno::RuntimeException();                  // should not happen
895 
896 //    return uno::Any();
897 }
898 
899 // XEnumerationAccess
900 
901 uno::Reference<container::XEnumeration> SAL_CALL ScFunctionListObj::createEnumeration()
902                                                     throw(uno::RuntimeException)
903 {
904     ScUnoGuard aGuard;
905     return new ScIndexEnumeration(this, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sheet.FunctionDescriptionEnumeration")));
906 }
907 
908 // XElementAccess
909 
910 uno::Type SAL_CALL ScFunctionListObj::getElementType() throw(uno::RuntimeException)
911 {
912     ScUnoGuard aGuard;
913     return getCppuType((uno::Sequence<beans::PropertyValue>*)0);
914 }
915 
916 sal_Bool SAL_CALL ScFunctionListObj::hasElements() throw(uno::RuntimeException)
917 {
918     ScUnoGuard aGuard;
919     return ( getCount() > 0 );
920 }
921 
922 uno::Sequence<rtl::OUString> SAL_CALL ScFunctionListObj::getElementNames() throw(uno::RuntimeException)
923 {
924     ScUnoGuard aGuard;
925     const ScFunctionList* pFuncList = ScGlobal::GetStarCalcFunctionList();
926     if ( pFuncList )
927     {
928         sal_uInt16 nCount = (sal_uInt16)pFuncList->GetCount();
929         uno::Sequence<rtl::OUString> aSeq(nCount);
930         rtl::OUString* pAry = aSeq.getArray();
931         for (sal_uInt16 nIndex=0; nIndex<nCount; nIndex++)
932         {
933             const ScFuncDesc* pDesc = pFuncList->GetFunction(nIndex);
934             if ( pDesc && pDesc->pFuncName )
935                 pAry[nIndex] = *pDesc->pFuncName;
936         }
937         return aSeq;
938     }
939     return uno::Sequence<rtl::OUString>(0);
940 }
941 
942 sal_Bool SAL_CALL ScFunctionListObj::hasByName( const rtl::OUString& aName )
943                                         throw(uno::RuntimeException)
944 {
945     ScUnoGuard aGuard;
946     String aNameStr(aName);
947     const ScFunctionList* pFuncList = ScGlobal::GetStarCalcFunctionList();
948     if ( pFuncList )
949     {
950         sal_uInt16 nCount = (sal_uInt16)pFuncList->GetCount();
951         for (sal_uInt16 nIndex=0; nIndex<nCount; nIndex++)
952         {
953             const ScFuncDesc* pDesc = pFuncList->GetFunction(nIndex);
954             //! Case-insensitiv ???
955             if ( pDesc && pDesc->pFuncName && aNameStr == *pDesc->pFuncName )
956                 return sal_True;
957         }
958     }
959     return sal_False;
960 }
961 
962 //------------------------------------------------------------------------
963 
964 
965 
966 
967