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