xref: /aoo4110/main/sc/source/core/data/global.cxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_sc.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski 
28*b1cdbd2cSJim Jagielski 
29*b1cdbd2cSJim Jagielski // INCLUDE ---------------------------------------------------------------
30*b1cdbd2cSJim Jagielski #include <vcl/svapp.hxx>
31*b1cdbd2cSJim Jagielski #include "scitems.hxx"
32*b1cdbd2cSJim Jagielski #include <svx/algitem.hxx>
33*b1cdbd2cSJim Jagielski #include <editeng/brshitem.hxx>
34*b1cdbd2cSJim Jagielski #include <editeng/editobj.hxx>
35*b1cdbd2cSJim Jagielski #include <editeng/scripttypeitem.hxx>
36*b1cdbd2cSJim Jagielski #include <svl/srchitem.hxx>
37*b1cdbd2cSJim Jagielski #include <editeng/langitem.hxx>
38*b1cdbd2cSJim Jagielski #include <sfx2/docfile.hxx>
39*b1cdbd2cSJim Jagielski #include <sfx2/dispatch.hxx>
40*b1cdbd2cSJim Jagielski #include <sfx2/objsh.hxx>
41*b1cdbd2cSJim Jagielski #include <sfx2/viewfrm.hxx>
42*b1cdbd2cSJim Jagielski #include <sfx2/viewsh.hxx>
43*b1cdbd2cSJim Jagielski #include <svl/stritem.hxx>
44*b1cdbd2cSJim Jagielski #include <svl/zforlist.hxx>
45*b1cdbd2cSJim Jagielski #include <svl/zformat.hxx>
46*b1cdbd2cSJim Jagielski #include <vcl/image.hxx>
47*b1cdbd2cSJim Jagielski #include <vcl/virdev.hxx>
48*b1cdbd2cSJim Jagielski #include <tools/rcid.h>
49*b1cdbd2cSJim Jagielski #include <unotools/charclass.hxx>
50*b1cdbd2cSJim Jagielski #include <stdlib.h>
51*b1cdbd2cSJim Jagielski #include <time.h>
52*b1cdbd2cSJim Jagielski #include <ctype.h>
53*b1cdbd2cSJim Jagielski #include <numeric>
54*b1cdbd2cSJim Jagielski 
55*b1cdbd2cSJim Jagielski 
56*b1cdbd2cSJim Jagielski #include <i18npool/mslangid.hxx>
57*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/Locale.hpp>
58*b1cdbd2cSJim Jagielski #include <comphelper/processfactory.hxx>
59*b1cdbd2cSJim Jagielski #include <unotools/calendarwrapper.hxx>
60*b1cdbd2cSJim Jagielski #include <unotools/collatorwrapper.hxx>
61*b1cdbd2cSJim Jagielski #include <com/sun/star/i18n/CollatorOptions.hpp>
62*b1cdbd2cSJim Jagielski #include <unotools/intlwrapper.hxx>
63*b1cdbd2cSJim Jagielski #include <unotools/syslocale.hxx>
64*b1cdbd2cSJim Jagielski #include <unotools/transliterationwrapper.hxx>
65*b1cdbd2cSJim Jagielski 
66*b1cdbd2cSJim Jagielski #include "global.hxx"
67*b1cdbd2cSJim Jagielski #include "scresid.hxx"
68*b1cdbd2cSJim Jagielski #include "autoform.hxx"
69*b1cdbd2cSJim Jagielski #include "document.hxx"
70*b1cdbd2cSJim Jagielski #include "patattr.hxx"
71*b1cdbd2cSJim Jagielski #include "addincol.hxx"
72*b1cdbd2cSJim Jagielski #include "adiasync.hxx"
73*b1cdbd2cSJim Jagielski #include "userlist.hxx"
74*b1cdbd2cSJim Jagielski #include "interpre.hxx"
75*b1cdbd2cSJim Jagielski #include "strload.hxx"
76*b1cdbd2cSJim Jagielski #include "docpool.hxx"
77*b1cdbd2cSJim Jagielski #include "unitconv.hxx"
78*b1cdbd2cSJim Jagielski #include "compiler.hxx"
79*b1cdbd2cSJim Jagielski #include "parclass.hxx"
80*b1cdbd2cSJim Jagielski #include "funcdesc.hxx"
81*b1cdbd2cSJim Jagielski #include "globstr.hrc"
82*b1cdbd2cSJim Jagielski #include "scfuncs.hrc"
83*b1cdbd2cSJim Jagielski #include "sc.hrc"
84*b1cdbd2cSJim Jagielski #include "scmod.hxx"
85*b1cdbd2cSJim Jagielski #include "appoptio.hxx"
86*b1cdbd2cSJim Jagielski 
87*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
88*b1cdbd2cSJim Jagielski 
89*b1cdbd2cSJim Jagielski #define CLIPST_AVAILABLE	0
90*b1cdbd2cSJim Jagielski #define CLIPST_CAPTURED		1
91*b1cdbd2cSJim Jagielski #define CLIPST_DELETE		2
92*b1cdbd2cSJim Jagielski #define CLIPST_DRAW			3
93*b1cdbd2cSJim Jagielski 
94*b1cdbd2cSJim Jagielski ScDocShellRef*	ScGlobal::pDrawClipDocShellRef = NULL;
95*b1cdbd2cSJim Jagielski SvxSearchItem*	ScGlobal::pSearchItem = NULL;
96*b1cdbd2cSJim Jagielski ScAutoFormat*	ScGlobal::pAutoFormat = NULL;
97*b1cdbd2cSJim Jagielski FuncCollection* ScGlobal::pFuncCollection = NULL;
98*b1cdbd2cSJim Jagielski ScUnoAddInCollection* ScGlobal::pAddInCollection = NULL;
99*b1cdbd2cSJim Jagielski ScUserList*		ScGlobal::pUserList = NULL;
100*b1cdbd2cSJim Jagielski String**		ScGlobal::ppRscString = NULL;
101*b1cdbd2cSJim Jagielski LanguageType    ScGlobal::eLnge = LANGUAGE_SYSTEM;
102*b1cdbd2cSJim Jagielski ::com::sun::star::lang::Locale*		ScGlobal::pLocale = NULL;
103*b1cdbd2cSJim Jagielski SvtSysLocale*   ScGlobal::pSysLocale = NULL;
104*b1cdbd2cSJim Jagielski const CharClass*  ScGlobal::pCharClass = NULL;
105*b1cdbd2cSJim Jagielski const LocaleDataWrapper*  ScGlobal::pLocaleData = NULL;
106*b1cdbd2cSJim Jagielski CalendarWrapper* ScGlobal::pCalendar = NULL;
107*b1cdbd2cSJim Jagielski CollatorWrapper* ScGlobal::pCollator = NULL;
108*b1cdbd2cSJim Jagielski CollatorWrapper* ScGlobal::pCaseCollator = NULL;
109*b1cdbd2cSJim Jagielski ::utl::TransliterationWrapper* ScGlobal::pTransliteration = NULL;
110*b1cdbd2cSJim Jagielski ::utl::TransliterationWrapper* ScGlobal::pCaseTransliteration = NULL;
111*b1cdbd2cSJim Jagielski ::com::sun::star::uno::Reference< ::com::sun::star::i18n::XOrdinalSuffix> ScGlobal::xOrdinalSuffix = NULL;
112*b1cdbd2cSJim Jagielski IntlWrapper*    ScGlobal::pScIntlWrapper = NULL;
113*b1cdbd2cSJim Jagielski sal_Unicode		ScGlobal::cListDelimiter = ',';
114*b1cdbd2cSJim Jagielski String*			ScGlobal::pEmptyString = NULL;
115*b1cdbd2cSJim Jagielski String*			ScGlobal::pStrClipDocName = NULL;
116*b1cdbd2cSJim Jagielski 
117*b1cdbd2cSJim Jagielski SvxBrushItem*	ScGlobal::pEmptyBrushItem = NULL;
118*b1cdbd2cSJim Jagielski SvxBrushItem*	ScGlobal::pButtonBrushItem = NULL;
119*b1cdbd2cSJim Jagielski SvxBrushItem*	ScGlobal::pEmbeddedBrushItem = NULL;
120*b1cdbd2cSJim Jagielski SvxBrushItem*	ScGlobal::pProtectedBrushItem = NULL;
121*b1cdbd2cSJim Jagielski 
122*b1cdbd2cSJim Jagielski ImageList*      ScGlobal::pOutlineBitmaps = NULL;
123*b1cdbd2cSJim Jagielski ImageList*      ScGlobal::pOutlineBitmapsHC = NULL;
124*b1cdbd2cSJim Jagielski 
125*b1cdbd2cSJim Jagielski ScFunctionList* ScGlobal::pStarCalcFunctionList = NULL;
126*b1cdbd2cSJim Jagielski ScFunctionMgr*	ScGlobal::pStarCalcFunctionMgr	= NULL;
127*b1cdbd2cSJim Jagielski 
128*b1cdbd2cSJim Jagielski ScUnitConverter* ScGlobal::pUnitConverter = NULL;
129*b1cdbd2cSJim Jagielski SvNumberFormatter* ScGlobal::pEnglishFormatter = NULL;
130*b1cdbd2cSJim Jagielski 
131*b1cdbd2cSJim Jagielski double			ScGlobal::nScreenPPTX			= 96.0;
132*b1cdbd2cSJim Jagielski double			ScGlobal::nScreenPPTY			= 96.0;
133*b1cdbd2cSJim Jagielski 
134*b1cdbd2cSJim Jagielski sal_uInt16			ScGlobal::nDefFontHeight		= 240;
135*b1cdbd2cSJim Jagielski sal_uInt16			ScGlobal::nStdRowHeight			= 257;
136*b1cdbd2cSJim Jagielski 
137*b1cdbd2cSJim Jagielski long			ScGlobal::nLastRowHeightExtra	= 0;
138*b1cdbd2cSJim Jagielski long			ScGlobal::nLastColWidthExtra	= STD_EXTRA_WIDTH;
139*b1cdbd2cSJim Jagielski 
140*b1cdbd2cSJim Jagielski static sal_uInt16 nPPTZoom = 0;		// ScreenZoom used to determine nScreenPPTX/Y
141*b1cdbd2cSJim Jagielski 
142*b1cdbd2cSJim Jagielski 
143*b1cdbd2cSJim Jagielski class SfxViewShell;
144*b1cdbd2cSJim Jagielski SfxViewShell* pScActiveViewShell = NULL;			//! als Member !!!!!
145*b1cdbd2cSJim Jagielski sal_uInt16 nScClickMouseModifier = 0;					//! dito
146*b1cdbd2cSJim Jagielski sal_uInt16 nScFillModeMouseModifier = 0;				//! dito
147*b1cdbd2cSJim Jagielski 
148*b1cdbd2cSJim Jagielski // Hack: ScGlobal::GetUserList() muss InitAppOptions in der UI aufrufen,
149*b1cdbd2cSJim Jagielski //		 damit UserList aus Cfg geladen wird
150*b1cdbd2cSJim Jagielski 
151*b1cdbd2cSJim Jagielski void global_InitAppOptions();
152*b1cdbd2cSJim Jagielski 
153*b1cdbd2cSJim Jagielski //========================================================================
154*b1cdbd2cSJim Jagielski //
155*b1cdbd2cSJim Jagielski //		statische Funktionen
156*b1cdbd2cSJim Jagielski //
157*b1cdbd2cSJim Jagielski //========================================================================
158*b1cdbd2cSJim Jagielski 
HasAttrChanged(const SfxItemSet & rNewAttrs,const SfxItemSet & rOldAttrs,const sal_uInt16 nWhich)159*b1cdbd2cSJim Jagielski sal_Bool ScGlobal::HasAttrChanged( const SfxItemSet&  rNewAttrs,
160*b1cdbd2cSJim Jagielski 							   const SfxItemSet&  rOldAttrs,
161*b1cdbd2cSJim Jagielski 							   const sal_uInt16		  nWhich )
162*b1cdbd2cSJim Jagielski {
163*b1cdbd2cSJim Jagielski 	sal_Bool				bInvalidate = sal_False;
164*b1cdbd2cSJim Jagielski 	const SfxItemState	eNewState	= rNewAttrs.GetItemState( nWhich );
165*b1cdbd2cSJim Jagielski 	const SfxItemState	eOldState	= rOldAttrs.GetItemState( nWhich );
166*b1cdbd2cSJim Jagielski 
167*b1cdbd2cSJim Jagielski 	//----------------------------------------------------------
168*b1cdbd2cSJim Jagielski 
169*b1cdbd2cSJim Jagielski 	if ( eNewState == eOldState )
170*b1cdbd2cSJim Jagielski 	{
171*b1cdbd2cSJim Jagielski 		// beide Items gesetzt
172*b1cdbd2cSJim Jagielski 		// PoolItems, d.h. Pointer-Vergleich zulaessig
173*b1cdbd2cSJim Jagielski 		if ( SFX_ITEM_SET == eOldState )
174*b1cdbd2cSJim Jagielski 			bInvalidate = (&rNewAttrs.Get( nWhich ) != &rOldAttrs.Get( nWhich ));
175*b1cdbd2cSJim Jagielski 	}
176*b1cdbd2cSJim Jagielski 	else
177*b1cdbd2cSJim Jagielski 	{
178*b1cdbd2cSJim Jagielski 		// ein Default-Item dabei
179*b1cdbd2cSJim Jagielski 		// PoolItems, d.h. Item-Vergleich noetig
180*b1cdbd2cSJim Jagielski 
181*b1cdbd2cSJim Jagielski 		const SfxPoolItem& rOldItem = ( SFX_ITEM_SET == eOldState )
182*b1cdbd2cSJim Jagielski 					? rOldAttrs.Get( nWhich )
183*b1cdbd2cSJim Jagielski 					: rOldAttrs.GetPool()->GetDefaultItem( nWhich );
184*b1cdbd2cSJim Jagielski 
185*b1cdbd2cSJim Jagielski 		const SfxPoolItem& rNewItem = ( SFX_ITEM_SET == eNewState )
186*b1cdbd2cSJim Jagielski 					? rNewAttrs.Get( nWhich )
187*b1cdbd2cSJim Jagielski 					: rNewAttrs.GetPool()->GetDefaultItem( nWhich );
188*b1cdbd2cSJim Jagielski 
189*b1cdbd2cSJim Jagielski         bInvalidate = sal::static_int_cast<sal_Bool>(rNewItem != rOldItem);
190*b1cdbd2cSJim Jagielski 	}
191*b1cdbd2cSJim Jagielski 
192*b1cdbd2cSJim Jagielski 	return bInvalidate;
193*b1cdbd2cSJim Jagielski }
194*b1cdbd2cSJim Jagielski 
GetStandardFormat(SvNumberFormatter & rFormatter,sal_uLong nFormat,short nType)195*b1cdbd2cSJim Jagielski sal_uLong ScGlobal::GetStandardFormat( SvNumberFormatter& rFormatter,
196*b1cdbd2cSJim Jagielski 		sal_uLong nFormat, short nType )
197*b1cdbd2cSJim Jagielski {
198*b1cdbd2cSJim Jagielski 	const SvNumberformat* pFormat = rFormatter.GetEntry( nFormat );
199*b1cdbd2cSJim Jagielski 	if ( pFormat )
200*b1cdbd2cSJim Jagielski 		return rFormatter.GetStandardFormat( nFormat, nType, pFormat->GetLanguage() );
201*b1cdbd2cSJim Jagielski 	return rFormatter.GetStandardFormat( nType, eLnge );
202*b1cdbd2cSJim Jagielski }
203*b1cdbd2cSJim Jagielski 
GetStandardFormat(double fNumber,SvNumberFormatter & rFormatter,sal_uLong nFormat,short nType)204*b1cdbd2cSJim Jagielski sal_uLong ScGlobal::GetStandardFormat( double fNumber, SvNumberFormatter& rFormatter,
205*b1cdbd2cSJim Jagielski 		sal_uLong nFormat, short nType )
206*b1cdbd2cSJim Jagielski {
207*b1cdbd2cSJim Jagielski 	const SvNumberformat* pFormat = rFormatter.GetEntry( nFormat );
208*b1cdbd2cSJim Jagielski 	if ( pFormat )
209*b1cdbd2cSJim Jagielski 		return rFormatter.GetStandardFormat( fNumber, nFormat, nType,
210*b1cdbd2cSJim Jagielski 			pFormat->GetLanguage() );
211*b1cdbd2cSJim Jagielski 	return rFormatter.GetStandardFormat( nType, eLnge );
212*b1cdbd2cSJim Jagielski }
213*b1cdbd2cSJim Jagielski 
214*b1cdbd2cSJim Jagielski 
215*b1cdbd2cSJim Jagielski // static
GetEnglishFormatter()216*b1cdbd2cSJim Jagielski SvNumberFormatter* ScGlobal::GetEnglishFormatter()
217*b1cdbd2cSJim Jagielski {
218*b1cdbd2cSJim Jagielski     if ( !pEnglishFormatter )
219*b1cdbd2cSJim Jagielski     {
220*b1cdbd2cSJim Jagielski         pEnglishFormatter = new SvNumberFormatter(
221*b1cdbd2cSJim Jagielski             ::comphelper::getProcessServiceFactory(), LANGUAGE_ENGLISH_US );
222*b1cdbd2cSJim Jagielski         pEnglishFormatter->SetEvalDateFormat( NF_EVALDATEFORMAT_INTL_FORMAT );
223*b1cdbd2cSJim Jagielski     }
224*b1cdbd2cSJim Jagielski     return pEnglishFormatter;
225*b1cdbd2cSJim Jagielski }
226*b1cdbd2cSJim Jagielski 
227*b1cdbd2cSJim Jagielski 
228*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
229*b1cdbd2cSJim Jagielski 
CheckWidthInvalidate(sal_Bool & bNumFormatChanged,const SfxItemSet & rNewAttrs,const SfxItemSet & rOldAttrs)230*b1cdbd2cSJim Jagielski sal_Bool ScGlobal::CheckWidthInvalidate( sal_Bool& bNumFormatChanged,
231*b1cdbd2cSJim Jagielski 									 const SfxItemSet& rNewAttrs,
232*b1cdbd2cSJim Jagielski 									 const SfxItemSet& rOldAttrs )
233*b1cdbd2cSJim Jagielski {
234*b1cdbd2cSJim Jagielski 	// Ueberpruefen, ob Attributaenderungen in rNewAttrs gegnueber
235*b1cdbd2cSJim Jagielski 	// rOldAttrs die Textbreite an einer Zelle ungueltig machen
236*b1cdbd2cSJim Jagielski 
237*b1cdbd2cSJim Jagielski 	bNumFormatChanged =
238*b1cdbd2cSJim Jagielski 			HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_VALUE_FORMAT );
239*b1cdbd2cSJim Jagielski 	return ( bNumFormatChanged
240*b1cdbd2cSJim Jagielski 		|| HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_LANGUAGE_FORMAT )
241*b1cdbd2cSJim Jagielski 		|| HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_FONT )
242*b1cdbd2cSJim Jagielski 		|| HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_CJK_FONT )
243*b1cdbd2cSJim Jagielski 		|| HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_CTL_FONT )
244*b1cdbd2cSJim Jagielski 		|| HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_FONT_HEIGHT )
245*b1cdbd2cSJim Jagielski 		|| HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_CJK_FONT_HEIGHT )
246*b1cdbd2cSJim Jagielski 		|| HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_CTL_FONT_HEIGHT )
247*b1cdbd2cSJim Jagielski 		|| HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_FONT_WEIGHT )
248*b1cdbd2cSJim Jagielski 		|| HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_CJK_FONT_WEIGHT )
249*b1cdbd2cSJim Jagielski 		|| HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_CTL_FONT_WEIGHT )
250*b1cdbd2cSJim Jagielski 		|| HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_FONT_POSTURE )
251*b1cdbd2cSJim Jagielski 		|| HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_CJK_FONT_POSTURE )
252*b1cdbd2cSJim Jagielski 		|| HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_CTL_FONT_POSTURE )
253*b1cdbd2cSJim Jagielski 		|| HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_FONT_UNDERLINE )
254*b1cdbd2cSJim Jagielski 		|| HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_FONT_OVERLINE )
255*b1cdbd2cSJim Jagielski 		|| HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_FONT_CROSSEDOUT )
256*b1cdbd2cSJim Jagielski 		|| HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_FONT_CONTOUR )
257*b1cdbd2cSJim Jagielski 		|| HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_FONT_SHADOWED )
258*b1cdbd2cSJim Jagielski         || HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_STACKED )
259*b1cdbd2cSJim Jagielski 		|| HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_ROTATE_VALUE )
260*b1cdbd2cSJim Jagielski 		|| HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_ROTATE_MODE )
261*b1cdbd2cSJim Jagielski 		|| HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_LINEBREAK )
262*b1cdbd2cSJim Jagielski 		|| HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_MARGIN )
263*b1cdbd2cSJim Jagielski 		);
264*b1cdbd2cSJim Jagielski }
265*b1cdbd2cSJim Jagielski 
GetSearchItem()266*b1cdbd2cSJim Jagielski const SvxSearchItem& ScGlobal::GetSearchItem()
267*b1cdbd2cSJim Jagielski {
268*b1cdbd2cSJim Jagielski 	if (!pSearchItem)
269*b1cdbd2cSJim Jagielski 	{
270*b1cdbd2cSJim Jagielski 		pSearchItem = new SvxSearchItem( SID_SEARCH_ITEM );
271*b1cdbd2cSJim Jagielski 		pSearchItem->SetAppFlag( SVX_SEARCHAPP_CALC );
272*b1cdbd2cSJim Jagielski 	}
273*b1cdbd2cSJim Jagielski 	return *pSearchItem;
274*b1cdbd2cSJim Jagielski }
275*b1cdbd2cSJim Jagielski 
SetSearchItem(const SvxSearchItem & rNew)276*b1cdbd2cSJim Jagielski void ScGlobal::SetSearchItem( const SvxSearchItem& rNew )
277*b1cdbd2cSJim Jagielski {
278*b1cdbd2cSJim Jagielski 	// Hier waere ein Zuweisungsoperator ganz nett:
279*b1cdbd2cSJim Jagielski 	delete pSearchItem;
280*b1cdbd2cSJim Jagielski 	pSearchItem	= (SvxSearchItem*)rNew.Clone();
281*b1cdbd2cSJim Jagielski 
282*b1cdbd2cSJim Jagielski 	pSearchItem->SetWhich( SID_SEARCH_ITEM );
283*b1cdbd2cSJim Jagielski     pSearchItem->SetAppFlag( SVX_SEARCHAPP_CALC );
284*b1cdbd2cSJim Jagielski }
285*b1cdbd2cSJim Jagielski 
ClearAutoFormat()286*b1cdbd2cSJim Jagielski void ScGlobal::ClearAutoFormat()
287*b1cdbd2cSJim Jagielski {
288*b1cdbd2cSJim Jagielski 	if (pAutoFormat!=NULL)
289*b1cdbd2cSJim Jagielski 	{
290*b1cdbd2cSJim Jagielski 		delete pAutoFormat;
291*b1cdbd2cSJim Jagielski 		pAutoFormat=NULL;
292*b1cdbd2cSJim Jagielski 	}
293*b1cdbd2cSJim Jagielski }
294*b1cdbd2cSJim Jagielski 
GetAutoFormat()295*b1cdbd2cSJim Jagielski ScAutoFormat* ScGlobal::GetAutoFormat()
296*b1cdbd2cSJim Jagielski {
297*b1cdbd2cSJim Jagielski 	if ( !pAutoFormat )
298*b1cdbd2cSJim Jagielski 	{
299*b1cdbd2cSJim Jagielski 		pAutoFormat = new ScAutoFormat;
300*b1cdbd2cSJim Jagielski 		pAutoFormat->Load();
301*b1cdbd2cSJim Jagielski 	}
302*b1cdbd2cSJim Jagielski 
303*b1cdbd2cSJim Jagielski 	return pAutoFormat;
304*b1cdbd2cSJim Jagielski }
305*b1cdbd2cSJim Jagielski 
GetFuncCollection()306*b1cdbd2cSJim Jagielski FuncCollection* ScGlobal::GetFuncCollection()
307*b1cdbd2cSJim Jagielski {
308*b1cdbd2cSJim Jagielski 	if (!pFuncCollection)
309*b1cdbd2cSJim Jagielski 		pFuncCollection = new FuncCollection();
310*b1cdbd2cSJim Jagielski 	return pFuncCollection;
311*b1cdbd2cSJim Jagielski }
312*b1cdbd2cSJim Jagielski 
GetAddInCollection()313*b1cdbd2cSJim Jagielski ScUnoAddInCollection* ScGlobal::GetAddInCollection()
314*b1cdbd2cSJim Jagielski {
315*b1cdbd2cSJim Jagielski 	if (!pAddInCollection)
316*b1cdbd2cSJim Jagielski 		pAddInCollection = new ScUnoAddInCollection();
317*b1cdbd2cSJim Jagielski 	return pAddInCollection;
318*b1cdbd2cSJim Jagielski }
319*b1cdbd2cSJim Jagielski 
GetUserList()320*b1cdbd2cSJim Jagielski ScUserList* ScGlobal::GetUserList()
321*b1cdbd2cSJim Jagielski {
322*b1cdbd2cSJim Jagielski 	// Hack: Cfg-Item an der App ggF. laden
323*b1cdbd2cSJim Jagielski 
324*b1cdbd2cSJim Jagielski 	global_InitAppOptions();
325*b1cdbd2cSJim Jagielski 
326*b1cdbd2cSJim Jagielski 	if (!pUserList)
327*b1cdbd2cSJim Jagielski 		pUserList = new ScUserList();
328*b1cdbd2cSJim Jagielski 	return pUserList;
329*b1cdbd2cSJim Jagielski }
330*b1cdbd2cSJim Jagielski 
SetUserList(const ScUserList * pNewList)331*b1cdbd2cSJim Jagielski void ScGlobal::SetUserList( const ScUserList* pNewList )
332*b1cdbd2cSJim Jagielski {
333*b1cdbd2cSJim Jagielski 	if ( pNewList )
334*b1cdbd2cSJim Jagielski 	{
335*b1cdbd2cSJim Jagielski 		if ( !pUserList )
336*b1cdbd2cSJim Jagielski 			pUserList = new ScUserList( *pNewList );
337*b1cdbd2cSJim Jagielski 		else
338*b1cdbd2cSJim Jagielski 			*pUserList = *pNewList;
339*b1cdbd2cSJim Jagielski 	}
340*b1cdbd2cSJim Jagielski 	else
341*b1cdbd2cSJim Jagielski 	{
342*b1cdbd2cSJim Jagielski 		delete pUserList;
343*b1cdbd2cSJim Jagielski 		pUserList = NULL;
344*b1cdbd2cSJim Jagielski 	}
345*b1cdbd2cSJim Jagielski }
346*b1cdbd2cSJim Jagielski 
GetRscString(sal_uInt16 nIndex)347*b1cdbd2cSJim Jagielski const String& ScGlobal::GetRscString( sal_uInt16 nIndex )
348*b1cdbd2cSJim Jagielski {
349*b1cdbd2cSJim Jagielski 	DBG_ASSERT( nIndex < STR_COUNT, "ScGlobal::GetRscString - invalid string index");
350*b1cdbd2cSJim Jagielski 	if( !ppRscString[ nIndex ] )
351*b1cdbd2cSJim Jagielski 	{
352*b1cdbd2cSJim Jagielski         OpCode eOp = ocNone;
353*b1cdbd2cSJim Jagielski         // Map former globstr.src strings moved to compiler.src
354*b1cdbd2cSJim Jagielski         switch (nIndex)
355*b1cdbd2cSJim Jagielski         {
356*b1cdbd2cSJim Jagielski             case STR_NULL_ERROR:
357*b1cdbd2cSJim Jagielski                 eOp = ocErrNull;
358*b1cdbd2cSJim Jagielski                 break;
359*b1cdbd2cSJim Jagielski             case STR_DIV_ZERO:
360*b1cdbd2cSJim Jagielski                 eOp = ocErrDivZero;
361*b1cdbd2cSJim Jagielski                 break;
362*b1cdbd2cSJim Jagielski             case STR_NO_VALUE:
363*b1cdbd2cSJim Jagielski                 eOp = ocErrValue;
364*b1cdbd2cSJim Jagielski                 break;
365*b1cdbd2cSJim Jagielski             case STR_NOREF_STR:
366*b1cdbd2cSJim Jagielski                 eOp = ocErrRef;
367*b1cdbd2cSJim Jagielski                 break;
368*b1cdbd2cSJim Jagielski             case STR_NO_NAME_REF:
369*b1cdbd2cSJim Jagielski                 eOp = ocErrName;
370*b1cdbd2cSJim Jagielski                 break;
371*b1cdbd2cSJim Jagielski             case STR_NUM_ERROR:
372*b1cdbd2cSJim Jagielski                 eOp = ocErrNum;
373*b1cdbd2cSJim Jagielski                 break;
374*b1cdbd2cSJim Jagielski             case STR_NV_STR:
375*b1cdbd2cSJim Jagielski                 eOp = ocErrNA;
376*b1cdbd2cSJim Jagielski                 break;
377*b1cdbd2cSJim Jagielski             default:
378*b1cdbd2cSJim Jagielski                 ;   // nothing
379*b1cdbd2cSJim Jagielski         }
380*b1cdbd2cSJim Jagielski         if (eOp != ocNone)
381*b1cdbd2cSJim Jagielski             ppRscString[ nIndex ] = new String(
382*b1cdbd2cSJim Jagielski                     ScCompiler::GetNativeSymbol( eOp));
383*b1cdbd2cSJim Jagielski         else
384*b1cdbd2cSJim Jagielski             ppRscString[ nIndex ] = new String(
385*b1cdbd2cSJim Jagielski                     ScRscStrLoader( RID_GLOBSTR, nIndex ).GetString());
386*b1cdbd2cSJim Jagielski 	}
387*b1cdbd2cSJim Jagielski 	return *ppRscString[ nIndex ];
388*b1cdbd2cSJim Jagielski }
389*b1cdbd2cSJim Jagielski 
GetErrorString(sal_uInt16 nErrNumber)390*b1cdbd2cSJim Jagielski String ScGlobal::GetErrorString(sal_uInt16 nErrNumber)
391*b1cdbd2cSJim Jagielski {
392*b1cdbd2cSJim Jagielski 	String sResStr;
393*b1cdbd2cSJim Jagielski 	switch (nErrNumber)
394*b1cdbd2cSJim Jagielski 	{
395*b1cdbd2cSJim Jagielski 		case NOTAVAILABLE          : nErrNumber = STR_NV_STR; break;
396*b1cdbd2cSJim Jagielski 		case errNoRef              : nErrNumber = STR_NO_REF_TABLE; break;
397*b1cdbd2cSJim Jagielski 		case errNoName             : nErrNumber = STR_NO_NAME_REF; break;
398*b1cdbd2cSJim Jagielski 		case errNoAddin            : nErrNumber = STR_NO_ADDIN; break;
399*b1cdbd2cSJim Jagielski 		case errNoMacro            : nErrNumber = STR_NO_MACRO; break;
400*b1cdbd2cSJim Jagielski 		case errDoubleRef          :
401*b1cdbd2cSJim Jagielski 		case errNoValue            : nErrNumber = STR_NO_VALUE; break;
402*b1cdbd2cSJim Jagielski 		case errNoCode             : nErrNumber = STR_NULL_ERROR; break;
403*b1cdbd2cSJim Jagielski 		case errDivisionByZero     : nErrNumber = STR_DIV_ZERO; break;
404*b1cdbd2cSJim Jagielski 		case errIllegalFPOperation : nErrNumber = STR_NUM_ERROR; break;
405*b1cdbd2cSJim Jagielski 
406*b1cdbd2cSJim Jagielski 		default		     : sResStr = GetRscString(STR_ERROR_STR);
407*b1cdbd2cSJim Jagielski 						   sResStr += String::CreateFromInt32( nErrNumber );
408*b1cdbd2cSJim Jagielski 						   nErrNumber = 0;
409*b1cdbd2cSJim Jagielski 						   break;
410*b1cdbd2cSJim Jagielski 	}
411*b1cdbd2cSJim Jagielski 	if( nErrNumber )
412*b1cdbd2cSJim Jagielski 		sResStr = GetRscString( nErrNumber );
413*b1cdbd2cSJim Jagielski 	return sResStr;
414*b1cdbd2cSJim Jagielski }
415*b1cdbd2cSJim Jagielski 
GetLongErrorString(sal_uInt16 nErrNumber)416*b1cdbd2cSJim Jagielski String ScGlobal::GetLongErrorString(sal_uInt16 nErrNumber)
417*b1cdbd2cSJim Jagielski {
418*b1cdbd2cSJim Jagielski 	switch (nErrNumber)
419*b1cdbd2cSJim Jagielski 	{
420*b1cdbd2cSJim Jagielski 		case 0:
421*b1cdbd2cSJim Jagielski 			break;
422*b1cdbd2cSJim Jagielski 		case 1:
423*b1cdbd2cSJim Jagielski 		case errIllegalArgument:
424*b1cdbd2cSJim Jagielski 			nErrNumber = STR_LONG_ERR_ILL_ARG;
425*b1cdbd2cSJim Jagielski 		break;
426*b1cdbd2cSJim Jagielski 		case 2:
427*b1cdbd2cSJim Jagielski 		case 3:
428*b1cdbd2cSJim Jagielski 		case 4:
429*b1cdbd2cSJim Jagielski 		case 5:
430*b1cdbd2cSJim Jagielski 		case errIllegalFPOperation:
431*b1cdbd2cSJim Jagielski 			nErrNumber = STR_LONG_ERR_ILL_FPO;
432*b1cdbd2cSJim Jagielski 		break;
433*b1cdbd2cSJim Jagielski 		case errIllegalChar:
434*b1cdbd2cSJim Jagielski 			nErrNumber = STR_LONG_ERR_ILL_CHAR;
435*b1cdbd2cSJim Jagielski 		break;
436*b1cdbd2cSJim Jagielski 		case errIllegalParameter:
437*b1cdbd2cSJim Jagielski 			nErrNumber = STR_LONG_ERR_ILL_PAR;
438*b1cdbd2cSJim Jagielski 		break;
439*b1cdbd2cSJim Jagielski 		case errSeparator:
440*b1cdbd2cSJim Jagielski 			nErrNumber = STR_LONG_ERR_ILL_SEP;
441*b1cdbd2cSJim Jagielski 		break;
442*b1cdbd2cSJim Jagielski 		case errPair:
443*b1cdbd2cSJim Jagielski 		case errPairExpected:
444*b1cdbd2cSJim Jagielski 			nErrNumber = STR_LONG_ERR_PAIR;
445*b1cdbd2cSJim Jagielski 		break;
446*b1cdbd2cSJim Jagielski 		case errOperatorExpected:
447*b1cdbd2cSJim Jagielski 			nErrNumber = STR_LONG_ERR_OP_EXP;
448*b1cdbd2cSJim Jagielski 		break;
449*b1cdbd2cSJim Jagielski 		case errVariableExpected:
450*b1cdbd2cSJim Jagielski 		case errParameterExpected:
451*b1cdbd2cSJim Jagielski 			nErrNumber = STR_LONG_ERR_VAR_EXP;
452*b1cdbd2cSJim Jagielski 		break;
453*b1cdbd2cSJim Jagielski 		case errCodeOverflow:
454*b1cdbd2cSJim Jagielski 			nErrNumber = STR_LONG_ERR_CODE_OVF;
455*b1cdbd2cSJim Jagielski 		break;
456*b1cdbd2cSJim Jagielski 		case errStringOverflow:
457*b1cdbd2cSJim Jagielski 			nErrNumber = STR_LONG_ERR_STR_OVF;
458*b1cdbd2cSJim Jagielski 		break;
459*b1cdbd2cSJim Jagielski 		case errStackOverflow:
460*b1cdbd2cSJim Jagielski 		case errInterpOverflow:
461*b1cdbd2cSJim Jagielski 			nErrNumber = STR_LONG_ERR_STACK_OVF;
462*b1cdbd2cSJim Jagielski 		break;
463*b1cdbd2cSJim Jagielski 		case errIllegalJump:
464*b1cdbd2cSJim Jagielski 		case errUnknownState:
465*b1cdbd2cSJim Jagielski 		case errUnknownVariable:
466*b1cdbd2cSJim Jagielski 		case errUnknownOpCode:
467*b1cdbd2cSJim Jagielski 		case errUnknownStackVariable:
468*b1cdbd2cSJim Jagielski 		case errUnknownToken:
469*b1cdbd2cSJim Jagielski 		case errNoCode:
470*b1cdbd2cSJim Jagielski 		case errDoubleRef:
471*b1cdbd2cSJim Jagielski 			nErrNumber = STR_LONG_ERR_SYNTAX;
472*b1cdbd2cSJim Jagielski 		break;
473*b1cdbd2cSJim Jagielski 		case errCircularReference:
474*b1cdbd2cSJim Jagielski 			nErrNumber = STR_LONG_ERR_CIRC_REF;
475*b1cdbd2cSJim Jagielski 		break;
476*b1cdbd2cSJim Jagielski 		case errNoConvergence:
477*b1cdbd2cSJim Jagielski 			nErrNumber = STR_LONG_ERR_NO_CONV;
478*b1cdbd2cSJim Jagielski 		break;
479*b1cdbd2cSJim Jagielski 		case errNoRef:
480*b1cdbd2cSJim Jagielski 			nErrNumber = STR_LONG_ERR_NO_REF;
481*b1cdbd2cSJim Jagielski 		break;
482*b1cdbd2cSJim Jagielski 		case errNoName:
483*b1cdbd2cSJim Jagielski 			nErrNumber = STR_LONG_ERR_NO_NAME;
484*b1cdbd2cSJim Jagielski 		break;
485*b1cdbd2cSJim Jagielski         case errNoAddin:
486*b1cdbd2cSJim Jagielski             nErrNumber = STR_LONG_ERR_NO_ADDIN;
487*b1cdbd2cSJim Jagielski 		break;
488*b1cdbd2cSJim Jagielski         case errNoMacro:
489*b1cdbd2cSJim Jagielski             nErrNumber = STR_LONG_ERR_NO_MACRO;
490*b1cdbd2cSJim Jagielski 		break;
491*b1cdbd2cSJim Jagielski         case errDivisionByZero:
492*b1cdbd2cSJim Jagielski             nErrNumber = STR_LONG_ERR_DIV_ZERO;
493*b1cdbd2cSJim Jagielski 		break;
494*b1cdbd2cSJim Jagielski         case errNestedArray:
495*b1cdbd2cSJim Jagielski             nErrNumber = STR_ERR_LONG_NESTED_ARRAY;
496*b1cdbd2cSJim Jagielski         break;
497*b1cdbd2cSJim Jagielski 		case errNoValue:
498*b1cdbd2cSJim Jagielski 			nErrNumber = STR_LONG_ERR_NO_VALUE;
499*b1cdbd2cSJim Jagielski 		break;
500*b1cdbd2cSJim Jagielski 		case NOTAVAILABLE:
501*b1cdbd2cSJim Jagielski 			nErrNumber = STR_LONG_ERR_NV;
502*b1cdbd2cSJim Jagielski 		break;
503*b1cdbd2cSJim Jagielski 		default:
504*b1cdbd2cSJim Jagielski 			nErrNumber = STR_ERROR_STR;
505*b1cdbd2cSJim Jagielski 		break;
506*b1cdbd2cSJim Jagielski 	}
507*b1cdbd2cSJim Jagielski 	String aRes( GetRscString( nErrNumber ) );
508*b1cdbd2cSJim Jagielski 	return aRes;
509*b1cdbd2cSJim Jagielski }
510*b1cdbd2cSJim Jagielski 
GetButtonBrushItem()511*b1cdbd2cSJim Jagielski SvxBrushItem* ScGlobal::GetButtonBrushItem()
512*b1cdbd2cSJim Jagielski {
513*b1cdbd2cSJim Jagielski     pButtonBrushItem->SetColor( Application::GetSettings().GetStyleSettings().GetFaceColor() );
514*b1cdbd2cSJim Jagielski     return pButtonBrushItem;
515*b1cdbd2cSJim Jagielski }
516*b1cdbd2cSJim Jagielski 
GetEmptyString()517*b1cdbd2cSJim Jagielski const String& ScGlobal::GetEmptyString()
518*b1cdbd2cSJim Jagielski {
519*b1cdbd2cSJim Jagielski 	return *pEmptyString;
520*b1cdbd2cSJim Jagielski }
521*b1cdbd2cSJim Jagielski 
GetOutlineSymbols(bool bHC)522*b1cdbd2cSJim Jagielski ImageList* ScGlobal::GetOutlineSymbols( bool bHC )
523*b1cdbd2cSJim Jagielski {
524*b1cdbd2cSJim Jagielski     ImageList*& rpImageList = bHC ? pOutlineBitmapsHC : pOutlineBitmaps;
525*b1cdbd2cSJim Jagielski     if( !rpImageList )
526*b1cdbd2cSJim Jagielski         rpImageList = new ImageList( ScResId( bHC ? RID_OUTLINEBITMAPS_H : RID_OUTLINEBITMAPS ) );
527*b1cdbd2cSJim Jagielski     return rpImageList;
528*b1cdbd2cSJim Jagielski }
529*b1cdbd2cSJim Jagielski 
Init()530*b1cdbd2cSJim Jagielski void ScGlobal::Init()
531*b1cdbd2cSJim Jagielski {
532*b1cdbd2cSJim Jagielski 	pEmptyString = new String;
533*b1cdbd2cSJim Jagielski 
534*b1cdbd2cSJim Jagielski 	//	Die Default-Sprache fuer Zahlenformate (ScGlobal::eLnge)
535*b1cdbd2cSJim Jagielski 	//	muss immer LANGUAGE_SYSTEM sein
536*b1cdbd2cSJim Jagielski 	//!	Dann kann auch die Variable raus
537*b1cdbd2cSJim Jagielski 	eLnge = LANGUAGE_SYSTEM;
538*b1cdbd2cSJim Jagielski 
539*b1cdbd2cSJim Jagielski 	//!	Wenn Sortierung etc. von der Sprache der installierten Offfice-Version
540*b1cdbd2cSJim Jagielski     //! abhaengen sollen, hier "Application::GetSettings().GetUILanguage()"
541*b1cdbd2cSJim Jagielski     pSysLocale = new SvtSysLocale;
542*b1cdbd2cSJim Jagielski     pCharClass = pSysLocale->GetCharClassPtr();
543*b1cdbd2cSJim Jagielski     pLocaleData = pSysLocale->GetLocaleDataPtr();
544*b1cdbd2cSJim Jagielski 
545*b1cdbd2cSJim Jagielski 	ppRscString = new String *[ STR_COUNT ];
546*b1cdbd2cSJim Jagielski 	for( sal_uInt16 nC = 0 ; nC < STR_COUNT ; nC++ ) ppRscString[ nC ] = NULL;
547*b1cdbd2cSJim Jagielski 
548*b1cdbd2cSJim Jagielski     pEmptyBrushItem = new SvxBrushItem( Color( COL_TRANSPARENT ), ATTR_BACKGROUND );
549*b1cdbd2cSJim Jagielski     pButtonBrushItem = new SvxBrushItem( Color(), ATTR_BACKGROUND );
550*b1cdbd2cSJim Jagielski     pEmbeddedBrushItem = new SvxBrushItem( Color( COL_LIGHTCYAN ), ATTR_BACKGROUND );
551*b1cdbd2cSJim Jagielski     pProtectedBrushItem = new SvxBrushItem( Color( COL_LIGHTGRAY ), ATTR_BACKGROUND );
552*b1cdbd2cSJim Jagielski 
553*b1cdbd2cSJim Jagielski 	UpdatePPT(NULL);
554*b1cdbd2cSJim Jagielski 	//ScCompiler::InitSymbolsNative();
555*b1cdbd2cSJim Jagielski     // ScParameterClassification _after_ Compiler, needs function resources if
556*b1cdbd2cSJim Jagielski     // arguments are to be merged in, which in turn need strings of function
557*b1cdbd2cSJim Jagielski     // names from the compiler.
558*b1cdbd2cSJim Jagielski     ScParameterClassification::Init();
559*b1cdbd2cSJim Jagielski 	srand( (unsigned) time( NULL ) );		// Random Seed Init fuer Interpreter
560*b1cdbd2cSJim Jagielski 
561*b1cdbd2cSJim Jagielski 	InitAddIns();
562*b1cdbd2cSJim Jagielski 
563*b1cdbd2cSJim Jagielski 	pStrClipDocName = new String( ScResId( SCSTR_NONAME ) );
564*b1cdbd2cSJim Jagielski 	*pStrClipDocName += '1';
565*b1cdbd2cSJim Jagielski 
566*b1cdbd2cSJim Jagielski 	//	ScDocumentPool::InitVersionMaps() ist schon vorher gerufen worden
567*b1cdbd2cSJim Jagielski }
568*b1cdbd2cSJim Jagielski 
UpdatePPT(OutputDevice * pDev)569*b1cdbd2cSJim Jagielski void ScGlobal::UpdatePPT( OutputDevice* pDev )
570*b1cdbd2cSJim Jagielski {
571*b1cdbd2cSJim Jagielski 	sal_uInt16 nCurrentZoom = Application::GetSettings().GetStyleSettings().GetScreenZoom();
572*b1cdbd2cSJim Jagielski 	if ( nCurrentZoom != nPPTZoom )
573*b1cdbd2cSJim Jagielski 	{
574*b1cdbd2cSJim Jagielski 		//	Screen PPT values must be updated when ScreenZoom has changed.
575*b1cdbd2cSJim Jagielski 		//	If called from Window::DataChanged, the window is passed as pDev,
576*b1cdbd2cSJim Jagielski 		//	to make sure LogicToPixel uses a device which already uses the new zoom.
577*b1cdbd2cSJim Jagielski 		//	For the initial settings, NULL is passed and GetDefaultDevice used.
578*b1cdbd2cSJim Jagielski 
579*b1cdbd2cSJim Jagielski 		if ( !pDev )
580*b1cdbd2cSJim Jagielski 			pDev = Application::GetDefaultDevice();
581*b1cdbd2cSJim Jagielski 		Point aPix1000 = pDev->LogicToPixel( Point(1000,1000), MAP_TWIP );
582*b1cdbd2cSJim Jagielski 		nScreenPPTX = aPix1000.X() / 1000.0;
583*b1cdbd2cSJim Jagielski 		nScreenPPTY = aPix1000.Y() / 1000.0;
584*b1cdbd2cSJim Jagielski 		nPPTZoom = nCurrentZoom;
585*b1cdbd2cSJim Jagielski 	}
586*b1cdbd2cSJim Jagielski }
587*b1cdbd2cSJim Jagielski 
GetClipDocName()588*b1cdbd2cSJim Jagielski const String& ScGlobal::GetClipDocName()
589*b1cdbd2cSJim Jagielski {
590*b1cdbd2cSJim Jagielski 	return *pStrClipDocName;
591*b1cdbd2cSJim Jagielski }
592*b1cdbd2cSJim Jagielski 
SetClipDocName(const String & rNew)593*b1cdbd2cSJim Jagielski void ScGlobal::SetClipDocName( const String& rNew )
594*b1cdbd2cSJim Jagielski {
595*b1cdbd2cSJim Jagielski 	*pStrClipDocName = rNew;
596*b1cdbd2cSJim Jagielski }
597*b1cdbd2cSJim Jagielski 
598*b1cdbd2cSJim Jagielski 
InitTextHeight(SfxItemPool * pPool)599*b1cdbd2cSJim Jagielski void ScGlobal::InitTextHeight(SfxItemPool* pPool)
600*b1cdbd2cSJim Jagielski {
601*b1cdbd2cSJim Jagielski 	if (!pPool)
602*b1cdbd2cSJim Jagielski 	{
603*b1cdbd2cSJim Jagielski 		DBG_ERROR("kein Pool bei ScGlobal::InitTextHeight");
604*b1cdbd2cSJim Jagielski 		return;
605*b1cdbd2cSJim Jagielski 	}
606*b1cdbd2cSJim Jagielski 
607*b1cdbd2cSJim Jagielski 	const ScPatternAttr* pPattern = (const ScPatternAttr*)&pPool->GetDefaultItem(ATTR_PATTERN);
608*b1cdbd2cSJim Jagielski 	if (!pPattern)
609*b1cdbd2cSJim Jagielski 	{
610*b1cdbd2cSJim Jagielski 		DBG_ERROR("kein Default-Pattern bei ScGlobal::InitTextHeight");
611*b1cdbd2cSJim Jagielski 		return;
612*b1cdbd2cSJim Jagielski 	}
613*b1cdbd2cSJim Jagielski 
614*b1cdbd2cSJim Jagielski //	String aTestString('X');
615*b1cdbd2cSJim Jagielski 	OutputDevice* pDefaultDev = Application::GetDefaultDevice();
616*b1cdbd2cSJim Jagielski 	VirtualDevice aVirtWindow( *pDefaultDev );
617*b1cdbd2cSJim Jagielski 	aVirtWindow.SetMapMode(MAP_PIXEL);
618*b1cdbd2cSJim Jagielski 	Font aDefFont;
619*b1cdbd2cSJim Jagielski 	pPattern->GetFont(aDefFont, SC_AUTOCOL_BLACK, &aVirtWindow);		// font color doesn't matter here
620*b1cdbd2cSJim Jagielski 	aVirtWindow.SetFont(aDefFont);
621*b1cdbd2cSJim Jagielski 	nDefFontHeight = (sal_uInt16) aVirtWindow.PixelToLogic(Size(0, aVirtWindow.GetTextHeight()),
622*b1cdbd2cSJim Jagielski 								MAP_TWIP).Height();
623*b1cdbd2cSJim Jagielski 
624*b1cdbd2cSJim Jagielski 	const SvxMarginItem* pMargin = (const SvxMarginItem*)&pPattern->GetItem(ATTR_MARGIN);
625*b1cdbd2cSJim Jagielski 
626*b1cdbd2cSJim Jagielski 	nStdRowHeight = (sal_uInt16) ( nDefFontHeight +
627*b1cdbd2cSJim Jagielski 								pMargin->GetTopMargin() + pMargin->GetBottomMargin()
628*b1cdbd2cSJim Jagielski 								- STD_ROWHEIGHT_DIFF );
629*b1cdbd2cSJim Jagielski }
630*b1cdbd2cSJim Jagielski 
Clear()631*b1cdbd2cSJim Jagielski void ScGlobal::Clear()
632*b1cdbd2cSJim Jagielski {
633*b1cdbd2cSJim Jagielski 	// asyncs _vor_ ExitExternalFunc zerstoeren!
634*b1cdbd2cSJim Jagielski 	theAddInAsyncTbl.DeleteAndDestroy( 0, theAddInAsyncTbl.Count() );
635*b1cdbd2cSJim Jagielski 	ExitExternalFunc();
636*b1cdbd2cSJim Jagielski 	DELETEZ(pAutoFormat);
637*b1cdbd2cSJim Jagielski 	DELETEZ(pSearchItem);
638*b1cdbd2cSJim Jagielski 	DELETEZ(pFuncCollection);
639*b1cdbd2cSJim Jagielski 	DELETEZ(pAddInCollection);
640*b1cdbd2cSJim Jagielski 	DELETEZ(pUserList);
641*b1cdbd2cSJim Jagielski 
642*b1cdbd2cSJim Jagielski 	for( sal_uInt16 nC = 0 ; nC < STR_COUNT ; nC++ )
643*b1cdbd2cSJim Jagielski 		if( ppRscString ) delete ppRscString[ nC ];
644*b1cdbd2cSJim Jagielski 	delete[] ppRscString;
645*b1cdbd2cSJim Jagielski 	ppRscString = NULL;
646*b1cdbd2cSJim Jagielski 
647*b1cdbd2cSJim Jagielski 	DELETEZ(pStarCalcFunctionList);		// vor ResMgr zerstoeren!
648*b1cdbd2cSJim Jagielski 	DELETEZ(pStarCalcFunctionMgr);
649*b1cdbd2cSJim Jagielski     ScParameterClassification::Exit();
650*b1cdbd2cSJim Jagielski 	ScCompiler::DeInit();
651*b1cdbd2cSJim Jagielski 	ScInterpreter::GlobalExit();			// statischen Stack loeschen
652*b1cdbd2cSJim Jagielski 
653*b1cdbd2cSJim Jagielski 	DELETEZ(pEmptyBrushItem);
654*b1cdbd2cSJim Jagielski 	DELETEZ(pButtonBrushItem);
655*b1cdbd2cSJim Jagielski 	DELETEZ(pEmbeddedBrushItem);
656*b1cdbd2cSJim Jagielski 	DELETEZ(pProtectedBrushItem);
657*b1cdbd2cSJim Jagielski     DELETEZ(pOutlineBitmaps);
658*b1cdbd2cSJim Jagielski     DELETEZ(pOutlineBitmapsHC);
659*b1cdbd2cSJim Jagielski //	DELETEZ(pAnchorBitmap);
660*b1cdbd2cSJim Jagielski //	DELETEZ(pGrayAnchorBitmap);
661*b1cdbd2cSJim Jagielski     DELETEZ(pEnglishFormatter);
662*b1cdbd2cSJim Jagielski     DELETEZ(pCaseTransliteration);
663*b1cdbd2cSJim Jagielski     DELETEZ(pTransliteration);
664*b1cdbd2cSJim Jagielski 	DELETEZ(pCaseCollator);
665*b1cdbd2cSJim Jagielski 	DELETEZ(pCollator);
666*b1cdbd2cSJim Jagielski 	DELETEZ(pCalendar);
667*b1cdbd2cSJim Jagielski     //! do NOT delete pCharClass since it is a pointer to the single SvtSysLocale instance
668*b1cdbd2cSJim Jagielski     pCharClass = NULL;
669*b1cdbd2cSJim Jagielski     //! do NOT delete pLocaleData since it is a pointer to the single SvtSysLocale instance
670*b1cdbd2cSJim Jagielski     pLocaleData = NULL;
671*b1cdbd2cSJim Jagielski     DELETEZ(pSysLocale);
672*b1cdbd2cSJim Jagielski 	DELETEZ(pLocale);
673*b1cdbd2cSJim Jagielski     DELETEZ(pScIntlWrapper);
674*b1cdbd2cSJim Jagielski 	DELETEZ(pStrClipDocName);
675*b1cdbd2cSJim Jagielski 
676*b1cdbd2cSJim Jagielski 	DELETEZ(pUnitConverter);
677*b1cdbd2cSJim Jagielski 
678*b1cdbd2cSJim Jagielski 	ScDocumentPool::DeleteVersionMaps();
679*b1cdbd2cSJim Jagielski 
680*b1cdbd2cSJim Jagielski 	DELETEZ(pEmptyString);
681*b1cdbd2cSJim Jagielski }
682*b1cdbd2cSJim Jagielski 
683*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
684*b1cdbd2cSJim Jagielski 
685*b1cdbd2cSJim Jagielski // static
GetCharsetValue(const String & rCharSet)686*b1cdbd2cSJim Jagielski CharSet ScGlobal::GetCharsetValue( const String& rCharSet )
687*b1cdbd2cSJim Jagielski {
688*b1cdbd2cSJim Jagielski 	// new TextEncoding values
689*b1cdbd2cSJim Jagielski 	if ( CharClass::isAsciiNumeric( rCharSet ) )
690*b1cdbd2cSJim Jagielski 	{
691*b1cdbd2cSJim Jagielski 		sal_Int32 nVal = rCharSet.ToInt32();
692*b1cdbd2cSJim Jagielski 		if ( !nVal || nVal == RTL_TEXTENCODING_DONTKNOW )
693*b1cdbd2cSJim Jagielski 			return gsl_getSystemTextEncoding();
694*b1cdbd2cSJim Jagielski 		return (CharSet) nVal;
695*b1cdbd2cSJim Jagielski 	}
696*b1cdbd2cSJim Jagielski 	// old CharSet values for compatibility
697*b1cdbd2cSJim Jagielski 	else if	(rCharSet.EqualsIgnoreCaseAscii("ANSI")		) return RTL_TEXTENCODING_MS_1252;
698*b1cdbd2cSJim Jagielski 	else if (rCharSet.EqualsIgnoreCaseAscii("MAC")		) return RTL_TEXTENCODING_APPLE_ROMAN;
699*b1cdbd2cSJim Jagielski 	else if (rCharSet.EqualsIgnoreCaseAscii("IBMPC")	) return RTL_TEXTENCODING_IBM_850;
700*b1cdbd2cSJim Jagielski 	else if (rCharSet.EqualsIgnoreCaseAscii("IBMPC_437")) return RTL_TEXTENCODING_IBM_437;
701*b1cdbd2cSJim Jagielski 	else if (rCharSet.EqualsIgnoreCaseAscii("IBMPC_850")) return RTL_TEXTENCODING_IBM_850;
702*b1cdbd2cSJim Jagielski 	else if (rCharSet.EqualsIgnoreCaseAscii("IBMPC_860")) return RTL_TEXTENCODING_IBM_860;
703*b1cdbd2cSJim Jagielski 	else if (rCharSet.EqualsIgnoreCaseAscii("IBMPC_861")) return RTL_TEXTENCODING_IBM_861;
704*b1cdbd2cSJim Jagielski 	else if (rCharSet.EqualsIgnoreCaseAscii("IBMPC_863")) return RTL_TEXTENCODING_IBM_863;
705*b1cdbd2cSJim Jagielski 	else if (rCharSet.EqualsIgnoreCaseAscii("IBMPC_865")) return RTL_TEXTENCODING_IBM_865;
706*b1cdbd2cSJim Jagielski //	else if (rCharSet.EqualsIgnoreCaseAscii("SYSTEM")	) return gsl_getSystemTextEncoding();
707*b1cdbd2cSJim Jagielski 	else return gsl_getSystemTextEncoding();
708*b1cdbd2cSJim Jagielski }
709*b1cdbd2cSJim Jagielski 
710*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
711*b1cdbd2cSJim Jagielski 
712*b1cdbd2cSJim Jagielski // static
GetCharsetString(CharSet eVal)713*b1cdbd2cSJim Jagielski String ScGlobal::GetCharsetString( CharSet eVal )
714*b1cdbd2cSJim Jagielski {
715*b1cdbd2cSJim Jagielski 	const sal_Char* pChar;
716*b1cdbd2cSJim Jagielski 	switch ( eVal )
717*b1cdbd2cSJim Jagielski 	{
718*b1cdbd2cSJim Jagielski 		// old CharSet strings for compatibility
719*b1cdbd2cSJim Jagielski 		case RTL_TEXTENCODING_MS_1252:		pChar = "ANSI";			break;
720*b1cdbd2cSJim Jagielski 		case RTL_TEXTENCODING_APPLE_ROMAN:	pChar = "MAC";			break;
721*b1cdbd2cSJim Jagielski 		// IBMPC == IBMPC_850
722*b1cdbd2cSJim Jagielski 		case RTL_TEXTENCODING_IBM_437:		pChar = "IBMPC_437";	break;
723*b1cdbd2cSJim Jagielski 		case RTL_TEXTENCODING_IBM_850:		pChar = "IBMPC_850";	break;
724*b1cdbd2cSJim Jagielski 		case RTL_TEXTENCODING_IBM_860:		pChar = "IBMPC_860";	break;
725*b1cdbd2cSJim Jagielski 		case RTL_TEXTENCODING_IBM_861:		pChar = "IBMPC_861";	break;
726*b1cdbd2cSJim Jagielski 		case RTL_TEXTENCODING_IBM_863:		pChar = "IBMPC_863";	break;
727*b1cdbd2cSJim Jagielski 		case RTL_TEXTENCODING_IBM_865:		pChar = "IBMPC_865";	break;
728*b1cdbd2cSJim Jagielski 		case RTL_TEXTENCODING_DONTKNOW:		pChar = "SYSTEM";		break;
729*b1cdbd2cSJim Jagielski 		// new string of TextEncoding value
730*b1cdbd2cSJim Jagielski 		default:
731*b1cdbd2cSJim Jagielski 			return String::CreateFromInt32( eVal );
732*b1cdbd2cSJim Jagielski 	}
733*b1cdbd2cSJim Jagielski 	return String::CreateFromAscii(pChar);
734*b1cdbd2cSJim Jagielski }
735*b1cdbd2cSJim Jagielski 
736*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
737*b1cdbd2cSJim Jagielski 
HasStarCalcFunctionList()738*b1cdbd2cSJim Jagielski bool ScGlobal::HasStarCalcFunctionList()
739*b1cdbd2cSJim Jagielski {
740*b1cdbd2cSJim Jagielski     return ( pStarCalcFunctionList != NULL );
741*b1cdbd2cSJim Jagielski }
742*b1cdbd2cSJim Jagielski 
GetStarCalcFunctionList()743*b1cdbd2cSJim Jagielski ScFunctionList* ScGlobal::GetStarCalcFunctionList()
744*b1cdbd2cSJim Jagielski {
745*b1cdbd2cSJim Jagielski 	if ( !pStarCalcFunctionList )
746*b1cdbd2cSJim Jagielski 		pStarCalcFunctionList = new	ScFunctionList;
747*b1cdbd2cSJim Jagielski 
748*b1cdbd2cSJim Jagielski 	return pStarCalcFunctionList;
749*b1cdbd2cSJim Jagielski }
750*b1cdbd2cSJim Jagielski 
751*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
752*b1cdbd2cSJim Jagielski 
GetStarCalcFunctionMgr()753*b1cdbd2cSJim Jagielski ScFunctionMgr* ScGlobal::GetStarCalcFunctionMgr()
754*b1cdbd2cSJim Jagielski {
755*b1cdbd2cSJim Jagielski 	if ( !pStarCalcFunctionMgr )
756*b1cdbd2cSJim Jagielski 		pStarCalcFunctionMgr = new ScFunctionMgr;
757*b1cdbd2cSJim Jagielski 
758*b1cdbd2cSJim Jagielski 	return pStarCalcFunctionMgr;
759*b1cdbd2cSJim Jagielski }
760*b1cdbd2cSJim Jagielski 
ResetFunctionList()761*b1cdbd2cSJim Jagielski void ScGlobal::ResetFunctionList()
762*b1cdbd2cSJim Jagielski {
763*b1cdbd2cSJim Jagielski     // FunctionMgr has pointers into FunctionList, must also be updated
764*b1cdbd2cSJim Jagielski 
765*b1cdbd2cSJim Jagielski     DELETEZ( pStarCalcFunctionMgr );
766*b1cdbd2cSJim Jagielski     DELETEZ( pStarCalcFunctionList );
767*b1cdbd2cSJim Jagielski }
768*b1cdbd2cSJim Jagielski 
769*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
770*b1cdbd2cSJim Jagielski 
771*b1cdbd2cSJim Jagielski // static
GetUnitConverter()772*b1cdbd2cSJim Jagielski ScUnitConverter* ScGlobal::GetUnitConverter()
773*b1cdbd2cSJim Jagielski {
774*b1cdbd2cSJim Jagielski 	if ( !pUnitConverter )
775*b1cdbd2cSJim Jagielski 		pUnitConverter = new ScUnitConverter;
776*b1cdbd2cSJim Jagielski 
777*b1cdbd2cSJim Jagielski 	return pUnitConverter;
778*b1cdbd2cSJim Jagielski }
779*b1cdbd2cSJim Jagielski 
780*b1cdbd2cSJim Jagielski 
781*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
782*b1cdbd2cSJim Jagielski 
783*b1cdbd2cSJim Jagielski // static
UnicodeStrChr(const sal_Unicode * pStr,sal_Unicode c)784*b1cdbd2cSJim Jagielski const sal_Unicode* ScGlobal::UnicodeStrChr( const sal_Unicode* pStr,
785*b1cdbd2cSJim Jagielski 			sal_Unicode c )
786*b1cdbd2cSJim Jagielski {
787*b1cdbd2cSJim Jagielski 	if ( !pStr )
788*b1cdbd2cSJim Jagielski 		return NULL;
789*b1cdbd2cSJim Jagielski 	while ( *pStr )
790*b1cdbd2cSJim Jagielski 	{
791*b1cdbd2cSJim Jagielski 		if ( *pStr == c )
792*b1cdbd2cSJim Jagielski 			return pStr;
793*b1cdbd2cSJim Jagielski 		pStr++;
794*b1cdbd2cSJim Jagielski 	}
795*b1cdbd2cSJim Jagielski 	return NULL;
796*b1cdbd2cSJim Jagielski }
797*b1cdbd2cSJim Jagielski 
798*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------
799*b1cdbd2cSJim Jagielski 
AddToken(String & rTokenList,const String & rToken,sal_Unicode cSep,xub_StrLen nSepCount,bool bForceSep)800*b1cdbd2cSJim Jagielski void ScGlobal::AddToken( String& rTokenList, const String& rToken, sal_Unicode cSep, xub_StrLen nSepCount, bool bForceSep )
801*b1cdbd2cSJim Jagielski {
802*b1cdbd2cSJim Jagielski     if( bForceSep || (rToken.Len() && rTokenList.Len()) )
803*b1cdbd2cSJim Jagielski         rTokenList.Expand( rTokenList.Len() + nSepCount, cSep );
804*b1cdbd2cSJim Jagielski     rTokenList.Append( rToken );
805*b1cdbd2cSJim Jagielski }
806*b1cdbd2cSJim Jagielski 
IsQuoted(const String & rString,sal_Unicode cQuote)807*b1cdbd2cSJim Jagielski bool ScGlobal::IsQuoted( const String& rString, sal_Unicode cQuote )
808*b1cdbd2cSJim Jagielski {
809*b1cdbd2cSJim Jagielski     return (rString.Len() >= 2) && (rString.GetChar( 0 ) == cQuote) && (rString.GetChar( rString.Len() - 1 ) == cQuote);
810*b1cdbd2cSJim Jagielski }
811*b1cdbd2cSJim Jagielski 
AddQuotes(String & rString,sal_Unicode cQuote,bool bEscapeEmbedded)812*b1cdbd2cSJim Jagielski void ScGlobal::AddQuotes( String& rString, sal_Unicode cQuote, bool bEscapeEmbedded )
813*b1cdbd2cSJim Jagielski {
814*b1cdbd2cSJim Jagielski     if (bEscapeEmbedded)
815*b1cdbd2cSJim Jagielski     {
816*b1cdbd2cSJim Jagielski         sal_Unicode pQ[3];
817*b1cdbd2cSJim Jagielski         pQ[0] = pQ[1] = cQuote;
818*b1cdbd2cSJim Jagielski         pQ[2] = 0;
819*b1cdbd2cSJim Jagielski         String aQuotes( pQ );
820*b1cdbd2cSJim Jagielski         rString.SearchAndReplaceAll( cQuote, aQuotes);
821*b1cdbd2cSJim Jagielski     }
822*b1cdbd2cSJim Jagielski     rString.Insert( cQuote, 0 ).Append( cQuote );
823*b1cdbd2cSJim Jagielski }
824*b1cdbd2cSJim Jagielski 
EraseQuotes(String & rString,sal_Unicode cQuote,bool bUnescapeEmbedded)825*b1cdbd2cSJim Jagielski void ScGlobal::EraseQuotes( String& rString, sal_Unicode cQuote, bool bUnescapeEmbedded )
826*b1cdbd2cSJim Jagielski {
827*b1cdbd2cSJim Jagielski     if ( IsQuoted( rString, cQuote ) )
828*b1cdbd2cSJim Jagielski     {
829*b1cdbd2cSJim Jagielski         rString.Erase( rString.Len() - 1 ).Erase( 0, 1 );
830*b1cdbd2cSJim Jagielski         if (bUnescapeEmbedded)
831*b1cdbd2cSJim Jagielski         {
832*b1cdbd2cSJim Jagielski             sal_Unicode pQ[3];
833*b1cdbd2cSJim Jagielski             pQ[0] = pQ[1] = cQuote;
834*b1cdbd2cSJim Jagielski             pQ[2] = 0;
835*b1cdbd2cSJim Jagielski             String aQuotes( pQ );
836*b1cdbd2cSJim Jagielski             rString.SearchAndReplaceAll( aQuotes, cQuote);
837*b1cdbd2cSJim Jagielski         }
838*b1cdbd2cSJim Jagielski     }
839*b1cdbd2cSJim Jagielski }
840*b1cdbd2cSJim Jagielski 
FindUnquoted(const String & rString,sal_Unicode cChar,xub_StrLen nStart,sal_Unicode cQuote)841*b1cdbd2cSJim Jagielski xub_StrLen ScGlobal::FindUnquoted( const String& rString, sal_Unicode cChar, xub_StrLen nStart, sal_Unicode cQuote )
842*b1cdbd2cSJim Jagielski {
843*b1cdbd2cSJim Jagielski     const sal_Unicode* const pStart = rString.GetBuffer();
844*b1cdbd2cSJim Jagielski     const sal_Unicode* const pStop = pStart + rString.Len();
845*b1cdbd2cSJim Jagielski     const sal_Unicode* p = pStart + nStart;
846*b1cdbd2cSJim Jagielski     bool bQuoted = false;
847*b1cdbd2cSJim Jagielski     while (p < pStop)
848*b1cdbd2cSJim Jagielski     {
849*b1cdbd2cSJim Jagielski         if (*p == cChar && !bQuoted)
850*b1cdbd2cSJim Jagielski             return sal::static_int_cast< xub_StrLen >( p - pStart );
851*b1cdbd2cSJim Jagielski         else if (*p == cQuote)
852*b1cdbd2cSJim Jagielski         {
853*b1cdbd2cSJim Jagielski             if (!bQuoted)
854*b1cdbd2cSJim Jagielski                 bQuoted = true;
855*b1cdbd2cSJim Jagielski             else if (p < pStop-1 && *(p+1) == cQuote)
856*b1cdbd2cSJim Jagielski                 ++p;
857*b1cdbd2cSJim Jagielski             else
858*b1cdbd2cSJim Jagielski                 bQuoted = false;
859*b1cdbd2cSJim Jagielski         }
860*b1cdbd2cSJim Jagielski         ++p;
861*b1cdbd2cSJim Jagielski     }
862*b1cdbd2cSJim Jagielski     return STRING_NOTFOUND;
863*b1cdbd2cSJim Jagielski }
864*b1cdbd2cSJim Jagielski 
FindUnquoted(const sal_Unicode * pString,sal_Unicode cChar,sal_Unicode cQuote)865*b1cdbd2cSJim Jagielski const sal_Unicode* ScGlobal::FindUnquoted( const sal_Unicode* pString, sal_Unicode cChar, sal_Unicode cQuote )
866*b1cdbd2cSJim Jagielski {
867*b1cdbd2cSJim Jagielski     const sal_Unicode* p = pString;
868*b1cdbd2cSJim Jagielski     bool bQuoted = false;
869*b1cdbd2cSJim Jagielski     while (*p)
870*b1cdbd2cSJim Jagielski     {
871*b1cdbd2cSJim Jagielski         if (*p == cChar && !bQuoted)
872*b1cdbd2cSJim Jagielski             return p;
873*b1cdbd2cSJim Jagielski         else if (*p == cQuote)
874*b1cdbd2cSJim Jagielski         {
875*b1cdbd2cSJim Jagielski             if (!bQuoted)
876*b1cdbd2cSJim Jagielski                 bQuoted = true;
877*b1cdbd2cSJim Jagielski             else if (*(p+1) == cQuote)
878*b1cdbd2cSJim Jagielski                 ++p;
879*b1cdbd2cSJim Jagielski             else
880*b1cdbd2cSJim Jagielski                 bQuoted = false;
881*b1cdbd2cSJim Jagielski         }
882*b1cdbd2cSJim Jagielski         ++p;
883*b1cdbd2cSJim Jagielski     }
884*b1cdbd2cSJim Jagielski     return NULL;
885*b1cdbd2cSJim Jagielski }
886*b1cdbd2cSJim Jagielski 
887*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
888*b1cdbd2cSJim Jagielski 
EETextObjEqual(const EditTextObject * pObj1,const EditTextObject * pObj2)889*b1cdbd2cSJim Jagielski sal_Bool ScGlobal::EETextObjEqual( const EditTextObject* pObj1,
890*b1cdbd2cSJim Jagielski 							   const EditTextObject* pObj2 )
891*b1cdbd2cSJim Jagielski {
892*b1cdbd2cSJim Jagielski 	if ( pObj1 == pObj2 )				// both empty or the same object
893*b1cdbd2cSJim Jagielski 		return sal_True;
894*b1cdbd2cSJim Jagielski 
895*b1cdbd2cSJim Jagielski 	if ( pObj1 && pObj2 )
896*b1cdbd2cSJim Jagielski 	{
897*b1cdbd2cSJim Jagielski 		//	first test for equal text content
898*b1cdbd2cSJim Jagielski 		sal_uInt16 nParCount = pObj1->GetParagraphCount();
899*b1cdbd2cSJim Jagielski 		if ( nParCount != pObj2->GetParagraphCount() )
900*b1cdbd2cSJim Jagielski 			return sal_False;
901*b1cdbd2cSJim Jagielski 		for (sal_uInt16 nPar=0; nPar<nParCount; nPar++)
902*b1cdbd2cSJim Jagielski 			if ( pObj1->GetText(nPar) != pObj2->GetText(nPar) )
903*b1cdbd2cSJim Jagielski 				return sal_False;
904*b1cdbd2cSJim Jagielski 
905*b1cdbd2cSJim Jagielski 		SvMemoryStream	aStream1;
906*b1cdbd2cSJim Jagielski 		SvMemoryStream	aStream2;
907*b1cdbd2cSJim Jagielski 		pObj1->Store( aStream1 );
908*b1cdbd2cSJim Jagielski 		pObj2->Store( aStream2 );
909*b1cdbd2cSJim Jagielski 		sal_uLong nSize = aStream1.Tell();
910*b1cdbd2cSJim Jagielski 		if ( aStream2.Tell() == nSize )
911*b1cdbd2cSJim Jagielski 			if ( !memcmp( aStream1.GetData(), aStream2.GetData(), (sal_uInt16) nSize ) )
912*b1cdbd2cSJim Jagielski 				return sal_True;
913*b1cdbd2cSJim Jagielski 	}
914*b1cdbd2cSJim Jagielski 
915*b1cdbd2cSJim Jagielski 	return sal_False;
916*b1cdbd2cSJim Jagielski }
917*b1cdbd2cSJim Jagielski 
OpenURL(const String & rURL,const String & rTarget)918*b1cdbd2cSJim Jagielski void ScGlobal::OpenURL( const String& rURL, const String& rTarget )
919*b1cdbd2cSJim Jagielski {
920*b1cdbd2cSJim Jagielski 	//	OpenURL wird immer ueber irgendwelche Umwege durch Mausklicks im GridWindow
921*b1cdbd2cSJim Jagielski 	//	aufgerufen, darum stimmen pScActiveViewShell und nScClickMouseModifier.
922*b1cdbd2cSJim Jagielski 
923*b1cdbd2cSJim Jagielski 	SfxStringItem aUrl( SID_FILE_NAME, rURL );
924*b1cdbd2cSJim Jagielski 	SfxStringItem aTarget( SID_TARGETNAME, rTarget );
925*b1cdbd2cSJim Jagielski 
926*b1cdbd2cSJim Jagielski 	if ( nScClickMouseModifier & KEY_MOD1 )		// control-click -> into new window
927*b1cdbd2cSJim Jagielski 		aTarget.SetValue(
928*b1cdbd2cSJim Jagielski 			String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("_blank")) );
929*b1cdbd2cSJim Jagielski 
930*b1cdbd2cSJim Jagielski 	SfxViewFrame* pFrame = NULL;
931*b1cdbd2cSJim Jagielski 	String aReferName;
932*b1cdbd2cSJim Jagielski 	if ( pScActiveViewShell )
933*b1cdbd2cSJim Jagielski 	{
934*b1cdbd2cSJim Jagielski 		pFrame = pScActiveViewShell->GetViewFrame();
935*b1cdbd2cSJim Jagielski 		SfxMedium* pMed = pFrame->GetObjectShell()->GetMedium();
936*b1cdbd2cSJim Jagielski 		if (pMed)
937*b1cdbd2cSJim Jagielski 			aReferName = pMed->GetName();
938*b1cdbd2cSJim Jagielski 	}
939*b1cdbd2cSJim Jagielski 
940*b1cdbd2cSJim Jagielski 	SfxFrameItem aFrm( SID_DOCFRAME, pFrame );
941*b1cdbd2cSJim Jagielski 	SfxStringItem aReferer( SID_REFERER, aReferName );
942*b1cdbd2cSJim Jagielski 
943*b1cdbd2cSJim Jagielski 	SfxBoolItem aNewView( SID_OPEN_NEW_VIEW, sal_False );
944*b1cdbd2cSJim Jagielski 	SfxBoolItem aBrowsing( SID_BROWSE, sal_True );
945*b1cdbd2cSJim Jagielski 
946*b1cdbd2cSJim Jagielski 	//	kein SID_SILENT mehr wegen Bug #42525# (war angeblich sowieso falsch)
947*b1cdbd2cSJim Jagielski 
948*b1cdbd2cSJim Jagielski 	SfxViewFrame* pViewFrm = SfxViewFrame::Current();
949*b1cdbd2cSJim Jagielski 	if (pViewFrm)
950*b1cdbd2cSJim Jagielski 		pViewFrm->GetDispatcher()->Execute( SID_OPENDOC,
951*b1cdbd2cSJim Jagielski 									SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD,
952*b1cdbd2cSJim Jagielski 									&aUrl, &aTarget,
953*b1cdbd2cSJim Jagielski 									&aFrm, &aReferer,
954*b1cdbd2cSJim Jagielski 									&aNewView, &aBrowsing,
955*b1cdbd2cSJim Jagielski 									0L );
956*b1cdbd2cSJim Jagielski }
957*b1cdbd2cSJim Jagielski 
958*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
959*b1cdbd2cSJim Jagielski 
IsSystemRTL()960*b1cdbd2cSJim Jagielski sal_Bool ScGlobal::IsSystemRTL()
961*b1cdbd2cSJim Jagielski {
962*b1cdbd2cSJim Jagielski     return MsLangId::isRightToLeft( Application::GetSettings().GetLanguage() );
963*b1cdbd2cSJim Jagielski }
964*b1cdbd2cSJim Jagielski 
GetDefaultScriptType()965*b1cdbd2cSJim Jagielski sal_uInt8 ScGlobal::GetDefaultScriptType()
966*b1cdbd2cSJim Jagielski {
967*b1cdbd2cSJim Jagielski 	//	Used when text contains only WEAK characters.
968*b1cdbd2cSJim Jagielski 	//	Script type of office language is used then (same as GetEditDefaultLanguage,
969*b1cdbd2cSJim Jagielski 	//	to get consistent behavior of text in simple cells and EditEngine,
970*b1cdbd2cSJim Jagielski 	//	also same as GetAppLanguage() in Writer)
971*b1cdbd2cSJim Jagielski 
972*b1cdbd2cSJim Jagielski 	return (sal_uInt8) SvtLanguageOptions::GetScriptTypeOfLanguage( Application::GetSettings().GetLanguage() );
973*b1cdbd2cSJim Jagielski }
974*b1cdbd2cSJim Jagielski 
GetEditDefaultLanguage()975*b1cdbd2cSJim Jagielski LanguageType ScGlobal::GetEditDefaultLanguage()
976*b1cdbd2cSJim Jagielski {
977*b1cdbd2cSJim Jagielski 	//	used for EditEngine::SetDefaultLanguage
978*b1cdbd2cSJim Jagielski 
979*b1cdbd2cSJim Jagielski 	return Application::GetSettings().GetLanguage();
980*b1cdbd2cSJim Jagielski }
981*b1cdbd2cSJim Jagielski 
GetScriptedWhichID(sal_uInt8 nScriptType,sal_uInt16 nWhich)982*b1cdbd2cSJim Jagielski sal_uInt16 ScGlobal::GetScriptedWhichID( sal_uInt8 nScriptType, sal_uInt16 nWhich )
983*b1cdbd2cSJim Jagielski {
984*b1cdbd2cSJim Jagielski     switch ( nScriptType )
985*b1cdbd2cSJim Jagielski     {
986*b1cdbd2cSJim Jagielski         case SCRIPTTYPE_LATIN:
987*b1cdbd2cSJim Jagielski 	    case SCRIPTTYPE_ASIAN:
988*b1cdbd2cSJim Jagielski         case SCRIPTTYPE_COMPLEX:
989*b1cdbd2cSJim Jagielski         break;      // take exact matches
990*b1cdbd2cSJim Jagielski         default:    // prefer one, first COMPLEX, then ASIAN
991*b1cdbd2cSJim Jagielski             if ( nScriptType & SCRIPTTYPE_COMPLEX )
992*b1cdbd2cSJim Jagielski                 nScriptType = SCRIPTTYPE_COMPLEX;
993*b1cdbd2cSJim Jagielski             else if ( nScriptType & SCRIPTTYPE_ASIAN )
994*b1cdbd2cSJim Jagielski                 nScriptType = SCRIPTTYPE_ASIAN;
995*b1cdbd2cSJim Jagielski     }
996*b1cdbd2cSJim Jagielski     switch ( nScriptType )
997*b1cdbd2cSJim Jagielski     {
998*b1cdbd2cSJim Jagielski         case SCRIPTTYPE_COMPLEX:
999*b1cdbd2cSJim Jagielski         {
1000*b1cdbd2cSJim Jagielski             switch ( nWhich )
1001*b1cdbd2cSJim Jagielski             {
1002*b1cdbd2cSJim Jagielski                 case ATTR_FONT:
1003*b1cdbd2cSJim Jagielski                 case ATTR_CJK_FONT:
1004*b1cdbd2cSJim Jagielski                     nWhich = ATTR_CTL_FONT;
1005*b1cdbd2cSJim Jagielski                 break;
1006*b1cdbd2cSJim Jagielski                 case ATTR_FONT_HEIGHT:
1007*b1cdbd2cSJim Jagielski                 case ATTR_CJK_FONT_HEIGHT:
1008*b1cdbd2cSJim Jagielski                     nWhich = ATTR_CTL_FONT_HEIGHT;
1009*b1cdbd2cSJim Jagielski                 break;
1010*b1cdbd2cSJim Jagielski                 case ATTR_FONT_WEIGHT:
1011*b1cdbd2cSJim Jagielski                 case ATTR_CJK_FONT_WEIGHT:
1012*b1cdbd2cSJim Jagielski                     nWhich = ATTR_CTL_FONT_WEIGHT;
1013*b1cdbd2cSJim Jagielski                 break;
1014*b1cdbd2cSJim Jagielski                 case ATTR_FONT_POSTURE:
1015*b1cdbd2cSJim Jagielski                 case ATTR_CJK_FONT_POSTURE:
1016*b1cdbd2cSJim Jagielski                     nWhich = ATTR_CTL_FONT_POSTURE;
1017*b1cdbd2cSJim Jagielski                 break;
1018*b1cdbd2cSJim Jagielski             }
1019*b1cdbd2cSJim Jagielski         }
1020*b1cdbd2cSJim Jagielski         break;
1021*b1cdbd2cSJim Jagielski 	    case SCRIPTTYPE_ASIAN:
1022*b1cdbd2cSJim Jagielski         {
1023*b1cdbd2cSJim Jagielski             switch ( nWhich )
1024*b1cdbd2cSJim Jagielski             {
1025*b1cdbd2cSJim Jagielski                 case ATTR_FONT:
1026*b1cdbd2cSJim Jagielski                 case ATTR_CTL_FONT:
1027*b1cdbd2cSJim Jagielski                     nWhich = ATTR_CJK_FONT;
1028*b1cdbd2cSJim Jagielski                 break;
1029*b1cdbd2cSJim Jagielski                 case ATTR_FONT_HEIGHT:
1030*b1cdbd2cSJim Jagielski                 case ATTR_CTL_FONT_HEIGHT:
1031*b1cdbd2cSJim Jagielski                     nWhich = ATTR_CJK_FONT_HEIGHT;
1032*b1cdbd2cSJim Jagielski                 break;
1033*b1cdbd2cSJim Jagielski                 case ATTR_FONT_WEIGHT:
1034*b1cdbd2cSJim Jagielski                 case ATTR_CTL_FONT_WEIGHT:
1035*b1cdbd2cSJim Jagielski                     nWhich = ATTR_CJK_FONT_WEIGHT;
1036*b1cdbd2cSJim Jagielski                 break;
1037*b1cdbd2cSJim Jagielski                 case ATTR_FONT_POSTURE:
1038*b1cdbd2cSJim Jagielski                 case ATTR_CTL_FONT_POSTURE:
1039*b1cdbd2cSJim Jagielski                     nWhich = ATTR_CJK_FONT_POSTURE;
1040*b1cdbd2cSJim Jagielski                 break;
1041*b1cdbd2cSJim Jagielski             }
1042*b1cdbd2cSJim Jagielski         }
1043*b1cdbd2cSJim Jagielski         break;
1044*b1cdbd2cSJim Jagielski         default:
1045*b1cdbd2cSJim Jagielski         {
1046*b1cdbd2cSJim Jagielski             switch ( nWhich )
1047*b1cdbd2cSJim Jagielski             {
1048*b1cdbd2cSJim Jagielski                 case ATTR_CTL_FONT:
1049*b1cdbd2cSJim Jagielski                 case ATTR_CJK_FONT:
1050*b1cdbd2cSJim Jagielski                     nWhich = ATTR_FONT;
1051*b1cdbd2cSJim Jagielski                 break;
1052*b1cdbd2cSJim Jagielski                 case ATTR_CTL_FONT_HEIGHT:
1053*b1cdbd2cSJim Jagielski                 case ATTR_CJK_FONT_HEIGHT:
1054*b1cdbd2cSJim Jagielski                     nWhich = ATTR_FONT_HEIGHT;
1055*b1cdbd2cSJim Jagielski                 break;
1056*b1cdbd2cSJim Jagielski                 case ATTR_CTL_FONT_WEIGHT:
1057*b1cdbd2cSJim Jagielski                 case ATTR_CJK_FONT_WEIGHT:
1058*b1cdbd2cSJim Jagielski                     nWhich = ATTR_FONT_WEIGHT;
1059*b1cdbd2cSJim Jagielski                 break;
1060*b1cdbd2cSJim Jagielski                 case ATTR_CTL_FONT_POSTURE:
1061*b1cdbd2cSJim Jagielski                 case ATTR_CJK_FONT_POSTURE:
1062*b1cdbd2cSJim Jagielski                     nWhich = ATTR_FONT_POSTURE;
1063*b1cdbd2cSJim Jagielski                 break;
1064*b1cdbd2cSJim Jagielski             }
1065*b1cdbd2cSJim Jagielski         }
1066*b1cdbd2cSJim Jagielski     }
1067*b1cdbd2cSJim Jagielski     return nWhich;
1068*b1cdbd2cSJim Jagielski }
1069*b1cdbd2cSJim Jagielski 
1070*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
1071*b1cdbd2cSJim Jagielski 
AddLanguage(SfxItemSet & rSet,SvNumberFormatter & rFormatter)1072*b1cdbd2cSJim Jagielski void ScGlobal::AddLanguage( SfxItemSet& rSet, SvNumberFormatter& rFormatter )
1073*b1cdbd2cSJim Jagielski {
1074*b1cdbd2cSJim Jagielski     DBG_ASSERT( rSet.GetItemState( ATTR_LANGUAGE_FORMAT, sal_False ) == SFX_ITEM_DEFAULT,
1075*b1cdbd2cSJim Jagielski         "ScGlobal::AddLanguage - language already added");
1076*b1cdbd2cSJim Jagielski 
1077*b1cdbd2cSJim Jagielski     const SfxPoolItem* pHardItem;
1078*b1cdbd2cSJim Jagielski     if ( rSet.GetItemState( ATTR_VALUE_FORMAT, sal_False, &pHardItem ) == SFX_ITEM_SET )
1079*b1cdbd2cSJim Jagielski     {
1080*b1cdbd2cSJim Jagielski         const SvNumberformat* pHardFormat = rFormatter.GetEntry(
1081*b1cdbd2cSJim Jagielski             ((const SfxUInt32Item*)pHardItem)->GetValue() );
1082*b1cdbd2cSJim Jagielski 
1083*b1cdbd2cSJim Jagielski         sal_uLong nParentFmt = 0;   // pool default
1084*b1cdbd2cSJim Jagielski         const SfxItemSet* pParent = rSet.GetParent();
1085*b1cdbd2cSJim Jagielski         if ( pParent )
1086*b1cdbd2cSJim Jagielski             nParentFmt = ((const SfxUInt32Item&)pParent->Get( ATTR_VALUE_FORMAT )).GetValue();
1087*b1cdbd2cSJim Jagielski         const SvNumberformat* pParFormat = rFormatter.GetEntry( nParentFmt );
1088*b1cdbd2cSJim Jagielski 
1089*b1cdbd2cSJim Jagielski         if ( pHardFormat && pParFormat &&
1090*b1cdbd2cSJim Jagielski                 (pHardFormat->GetLanguage() != pParFormat->GetLanguage()) )
1091*b1cdbd2cSJim Jagielski             rSet.Put( SvxLanguageItem( pHardFormat->GetLanguage(), ATTR_LANGUAGE_FORMAT ) );
1092*b1cdbd2cSJim Jagielski     }
1093*b1cdbd2cSJim Jagielski }
1094*b1cdbd2cSJim Jagielski 
1095*b1cdbd2cSJim Jagielski 
1096*b1cdbd2cSJim Jagielski 
1097*b1cdbd2cSJim Jagielski 
1098*b1cdbd2cSJim Jagielski 
1099*b1cdbd2cSJim Jagielski //===================================================================
1100*b1cdbd2cSJim Jagielski // class ScFunctionList:
1101*b1cdbd2cSJim Jagielski //===================================================================
1102*b1cdbd2cSJim Jagielski 
1103*b1cdbd2cSJim Jagielski //===================================================================
1104*b1cdbd2cSJim Jagielski //		class ScFuncRes
1105*b1cdbd2cSJim Jagielski // fuer temporaere Objekte zum Holen der Resourcen
1106*b1cdbd2cSJim Jagielski 
1107*b1cdbd2cSJim Jagielski class ScFuncRes : public Resource
1108*b1cdbd2cSJim Jagielski {
1109*b1cdbd2cSJim Jagielski public:
1110*b1cdbd2cSJim Jagielski 	ScFuncRes( ResId&, ScFuncDesc*, bool & rbSuppressed );
1111*b1cdbd2cSJim Jagielski 
1112*b1cdbd2cSJim Jagielski private:
1113*b1cdbd2cSJim Jagielski 	sal_uInt16 GetNum();
1114*b1cdbd2cSJim Jagielski };
1115*b1cdbd2cSJim Jagielski 
1116*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
1117*b1cdbd2cSJim Jagielski 
ScFuncRes(ResId & aRes,ScFuncDesc * pDesc,bool & rbSuppressed)1118*b1cdbd2cSJim Jagielski ScFuncRes::ScFuncRes( ResId &aRes, ScFuncDesc* pDesc, bool & rbSuppressed )
1119*b1cdbd2cSJim Jagielski  : Resource(aRes)
1120*b1cdbd2cSJim Jagielski {
1121*b1cdbd2cSJim Jagielski     rbSuppressed = (bool)GetNum();
1122*b1cdbd2cSJim Jagielski 	pDesc->nCategory = GetNum();
1123*b1cdbd2cSJim Jagielski 	pDesc->sHelpId = ReadByteStringRes();		//! Hack, see scfuncs.src
1124*b1cdbd2cSJim Jagielski 	pDesc->nArgCount = GetNum();
1125*b1cdbd2cSJim Jagielski 	sal_uInt16 nArgs = pDesc->nArgCount;
1126*b1cdbd2cSJim Jagielski 	if (nArgs >= PAIRED_VAR_ARGS)
1127*b1cdbd2cSJim Jagielski 	    nArgs -= PAIRED_VAR_ARGS - 2;
1128*b1cdbd2cSJim Jagielski 	else if (nArgs >= VAR_ARGS)
1129*b1cdbd2cSJim Jagielski         nArgs -= VAR_ARGS - 1;
1130*b1cdbd2cSJim Jagielski 	if (nArgs)
1131*b1cdbd2cSJim Jagielski 	{
1132*b1cdbd2cSJim Jagielski 		pDesc->pDefArgFlags = new ScFuncDesc::ParameterFlags[nArgs];
1133*b1cdbd2cSJim Jagielski 		for (sal_uInt16 i = 0; i < nArgs; i++)
1134*b1cdbd2cSJim Jagielski         {
1135*b1cdbd2cSJim Jagielski             pDesc->pDefArgFlags[i].bOptional = (bool)GetNum();
1136*b1cdbd2cSJim Jagielski         }
1137*b1cdbd2cSJim Jagielski 	}
1138*b1cdbd2cSJim Jagielski     // Need to read the value from the resource even if nArgs==0 to advance the
1139*b1cdbd2cSJim Jagielski     // resource position pointer, so this can't be in the if(nArgs) block above.
1140*b1cdbd2cSJim Jagielski     sal_uInt16 nSuppressed = GetNum();
1141*b1cdbd2cSJim Jagielski     if (nSuppressed)
1142*b1cdbd2cSJim Jagielski     {
1143*b1cdbd2cSJim Jagielski         if (nSuppressed > nArgs)
1144*b1cdbd2cSJim Jagielski         {
1145*b1cdbd2cSJim Jagielski             DBG_ERROR3( "ScFuncRes: suppressed parameters count mismatch on OpCode %u: suppressed %d > params %d",
1146*b1cdbd2cSJim Jagielski                     aRes.GetId(), (int)nSuppressed, (int)nArgs);
1147*b1cdbd2cSJim Jagielski             nSuppressed = nArgs;    // sanitize
1148*b1cdbd2cSJim Jagielski         }
1149*b1cdbd2cSJim Jagielski         for (sal_uInt16 i=0; i < nSuppressed; ++i)
1150*b1cdbd2cSJim Jagielski         {
1151*b1cdbd2cSJim Jagielski             sal_uInt16 nParam = GetNum();
1152*b1cdbd2cSJim Jagielski             if (nParam < nArgs)
1153*b1cdbd2cSJim Jagielski             {
1154*b1cdbd2cSJim Jagielski                 if (pDesc->nArgCount >= PAIRED_VAR_ARGS && nParam >= nArgs-2)
1155*b1cdbd2cSJim Jagielski                 {
1156*b1cdbd2cSJim Jagielski                     DBG_ERROR3( "ScFuncRes: PAIRED_VAR_ARGS parameters can't be suppressed, on OpCode %u: param %d >= arg %d-2",
1157*b1cdbd2cSJim Jagielski                             aRes.GetId(), (int)nParam, (int)nArgs);
1158*b1cdbd2cSJim Jagielski                 }
1159*b1cdbd2cSJim Jagielski                 else if (pDesc->nArgCount >= VAR_ARGS && nParam == nArgs-1)
1160*b1cdbd2cSJim Jagielski                 {
1161*b1cdbd2cSJim Jagielski                     DBG_ERROR3( "ScFuncRes: VAR_ARGS parameters can't be suppressed, on OpCode %u: param %d == arg %d-1",
1162*b1cdbd2cSJim Jagielski                             aRes.GetId(), (int)nParam, (int)nArgs);
1163*b1cdbd2cSJim Jagielski                 }
1164*b1cdbd2cSJim Jagielski                 else
1165*b1cdbd2cSJim Jagielski                 {
1166*b1cdbd2cSJim Jagielski                     pDesc->pDefArgFlags[nParam].bSuppress = true;
1167*b1cdbd2cSJim Jagielski                     pDesc->bHasSuppressedArgs = true;
1168*b1cdbd2cSJim Jagielski                 }
1169*b1cdbd2cSJim Jagielski             }
1170*b1cdbd2cSJim Jagielski             else
1171*b1cdbd2cSJim Jagielski             {
1172*b1cdbd2cSJim Jagielski                 DBG_ERROR3( "ScFuncRes: suppressed parameter exceeds count on OpCode %u: param %d >= args %d",
1173*b1cdbd2cSJim Jagielski                         aRes.GetId(), (int)nParam, (int)nArgs);
1174*b1cdbd2cSJim Jagielski             }
1175*b1cdbd2cSJim Jagielski         }
1176*b1cdbd2cSJim Jagielski     }
1177*b1cdbd2cSJim Jagielski 
1178*b1cdbd2cSJim Jagielski     pDesc->pFuncName = new String( ScCompiler::GetNativeSymbol( static_cast<OpCode>( aRes.GetId())));
1179*b1cdbd2cSJim Jagielski 	pDesc->pFuncDesc = new String(ScResId(1));
1180*b1cdbd2cSJim Jagielski 
1181*b1cdbd2cSJim Jagielski 	if (nArgs)
1182*b1cdbd2cSJim Jagielski 	{
1183*b1cdbd2cSJim Jagielski 		pDesc->ppDefArgNames = new String*[nArgs];
1184*b1cdbd2cSJim Jagielski 		pDesc->ppDefArgDescs = new String*[nArgs];
1185*b1cdbd2cSJim Jagielski 		for (sal_uInt16 i = 0; i < nArgs; i++)
1186*b1cdbd2cSJim Jagielski 		{
1187*b1cdbd2cSJim Jagielski 			pDesc->ppDefArgNames[i] = new String(ScResId(2*(i+1)  ));
1188*b1cdbd2cSJim Jagielski 			pDesc->ppDefArgDescs[i] = new String(ScResId(2*(i+1)+1));
1189*b1cdbd2cSJim Jagielski 		}
1190*b1cdbd2cSJim Jagielski 	}
1191*b1cdbd2cSJim Jagielski 
1192*b1cdbd2cSJim Jagielski 	FreeResource();
1193*b1cdbd2cSJim Jagielski }
1194*b1cdbd2cSJim Jagielski 
1195*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
1196*b1cdbd2cSJim Jagielski 
GetNum()1197*b1cdbd2cSJim Jagielski sal_uInt16 ScFuncRes::GetNum()
1198*b1cdbd2cSJim Jagielski {
1199*b1cdbd2cSJim Jagielski 	return ReadShortRes();
1200*b1cdbd2cSJim Jagielski }
1201*b1cdbd2cSJim Jagielski 
1202*b1cdbd2cSJim Jagielski //=========================================================================
1203*b1cdbd2cSJim Jagielski 
1204*b1cdbd2cSJim Jagielski // um an die protected von Resource ranzukommen
1205*b1cdbd2cSJim Jagielski class ScResourcePublisher : public Resource
1206*b1cdbd2cSJim Jagielski {
1207*b1cdbd2cSJim Jagielski private:
FreeResource()1208*b1cdbd2cSJim Jagielski     void			FreeResource() { Resource::FreeResource(); }
1209*b1cdbd2cSJim Jagielski public:
ScResourcePublisher(const ScResId & rId)1210*b1cdbd2cSJim Jagielski 		ScResourcePublisher( const ScResId& rId ) : Resource( rId ) {}
~ScResourcePublisher()1211*b1cdbd2cSJim Jagielski         ~ScResourcePublisher() { FreeResource(); }
IsAvailableRes(const ResId & rId) const1212*b1cdbd2cSJim Jagielski 	sal_Bool			IsAvailableRes( const ResId& rId ) const
1213*b1cdbd2cSJim Jagielski 						{ return Resource::IsAvailableRes( rId ); }
1214*b1cdbd2cSJim Jagielski 
1215*b1cdbd2cSJim Jagielski };
1216*b1cdbd2cSJim Jagielski 
1217*b1cdbd2cSJim Jagielski 
ScFunctionList()1218*b1cdbd2cSJim Jagielski ScFunctionList::ScFunctionList() :
1219*b1cdbd2cSJim Jagielski 		nMaxFuncNameLen	( 0 )
1220*b1cdbd2cSJim Jagielski {
1221*b1cdbd2cSJim Jagielski 	ScFuncDesc*		pDesc	= NULL;
1222*b1cdbd2cSJim Jagielski 	xub_StrLen		nStrLen = 0;
1223*b1cdbd2cSJim Jagielski 	FuncCollection*	pFuncColl;
1224*b1cdbd2cSJim Jagielski 	sal_uInt16 i,j;
1225*b1cdbd2cSJim Jagielski 	sal_uInt16 nDescBlock[] =
1226*b1cdbd2cSJim Jagielski 	{
1227*b1cdbd2cSJim Jagielski 		RID_SC_FUNCTION_DESCRIPTIONS1,
1228*b1cdbd2cSJim Jagielski 		RID_SC_FUNCTION_DESCRIPTIONS2
1229*b1cdbd2cSJim Jagielski 	};
1230*b1cdbd2cSJim Jagielski 	const sal_uInt16 nBlocks = sizeof(nDescBlock) / sizeof(sal_uInt16);
1231*b1cdbd2cSJim Jagielski 
1232*b1cdbd2cSJim Jagielski 	aFunctionList.Clear();
1233*b1cdbd2cSJim Jagielski 
1234*b1cdbd2cSJim Jagielski 	for ( sal_uInt16 k = 0; k < nBlocks; k++ )
1235*b1cdbd2cSJim Jagielski 	{
1236*b1cdbd2cSJim Jagielski         ::std::auto_ptr<ScResourcePublisher> pBlock( new ScResourcePublisher( ScResId( nDescBlock[k] ) ) );
1237*b1cdbd2cSJim Jagielski         // Browse for all possible OpCodes. This is not the fastest method, but
1238*b1cdbd2cSJim Jagielski         // otherwise the sub resources within the resource blocks and the
1239*b1cdbd2cSJim Jagielski         // resource blocks themselfs would had to be ordered according to
1240*b1cdbd2cSJim Jagielski         // OpCodes, which is utopian..
1241*b1cdbd2cSJim Jagielski 		for (i = 0; i <= SC_OPCODE_LAST_OPCODE_ID; i++)
1242*b1cdbd2cSJim Jagielski 		{
1243*b1cdbd2cSJim Jagielski 			ScResId aRes(i);
1244*b1cdbd2cSJim Jagielski 			aRes.SetRT(RSC_RESOURCE);
1245*b1cdbd2cSJim Jagielski             // Sub resource of OpCode available?
1246*b1cdbd2cSJim Jagielski 			if (pBlock->IsAvailableRes(aRes))
1247*b1cdbd2cSJim Jagielski 			{
1248*b1cdbd2cSJim Jagielski 				pDesc = new ScFuncDesc;
1249*b1cdbd2cSJim Jagielski                 bool bSuppressed = false;
1250*b1cdbd2cSJim Jagielski 				ScFuncRes aSubRes( aRes, pDesc, bSuppressed);
1251*b1cdbd2cSJim Jagielski                 // Instead of dealing with this exceptional case at 1001 places
1252*b1cdbd2cSJim Jagielski                 // we simply don't add an entirely suppressed function to the
1253*b1cdbd2cSJim Jagielski                 // list and delete it.
1254*b1cdbd2cSJim Jagielski                 if (bSuppressed)
1255*b1cdbd2cSJim Jagielski                     delete pDesc;
1256*b1cdbd2cSJim Jagielski                 else
1257*b1cdbd2cSJim Jagielski                 {
1258*b1cdbd2cSJim Jagielski                     pDesc->nFIndex = i;
1259*b1cdbd2cSJim Jagielski                     aFunctionList.Insert( pDesc, LIST_APPEND );
1260*b1cdbd2cSJim Jagielski 
1261*b1cdbd2cSJim Jagielski                     nStrLen = (*(pDesc->pFuncName)).Len();
1262*b1cdbd2cSJim Jagielski                     if (nStrLen > nMaxFuncNameLen)
1263*b1cdbd2cSJim Jagielski                         nMaxFuncNameLen = nStrLen;
1264*b1cdbd2cSJim Jagielski                 }
1265*b1cdbd2cSJim Jagielski 			}
1266*b1cdbd2cSJim Jagielski 		}
1267*b1cdbd2cSJim Jagielski 	}
1268*b1cdbd2cSJim Jagielski 
1269*b1cdbd2cSJim Jagielski 	sal_uInt16 nNextId = SC_OPCODE_LAST_OPCODE_ID + 1;		// FuncID for AddIn functions
1270*b1cdbd2cSJim Jagielski 
1271*b1cdbd2cSJim Jagielski 	// Auswertung AddIn-Liste
1272*b1cdbd2cSJim Jagielski 	String aDefArgNameValue(RTL_CONSTASCII_STRINGPARAM("value"));
1273*b1cdbd2cSJim Jagielski 	String aDefArgNameString(RTL_CONSTASCII_STRINGPARAM("string"));
1274*b1cdbd2cSJim Jagielski 	String aDefArgNameValues(RTL_CONSTASCII_STRINGPARAM("values"));
1275*b1cdbd2cSJim Jagielski 	String aDefArgNameStrings(RTL_CONSTASCII_STRINGPARAM("strings"));
1276*b1cdbd2cSJim Jagielski 	String aDefArgNameCells(RTL_CONSTASCII_STRINGPARAM("cells"));
1277*b1cdbd2cSJim Jagielski 	String aDefArgNameNone(RTL_CONSTASCII_STRINGPARAM("none"));
1278*b1cdbd2cSJim Jagielski 	String aDefArgDescValue(RTL_CONSTASCII_STRINGPARAM("a value"));
1279*b1cdbd2cSJim Jagielski 	String aDefArgDescString(RTL_CONSTASCII_STRINGPARAM("a string"));
1280*b1cdbd2cSJim Jagielski 	String aDefArgDescValues(RTL_CONSTASCII_STRINGPARAM("array of values"));
1281*b1cdbd2cSJim Jagielski 	String aDefArgDescStrings(RTL_CONSTASCII_STRINGPARAM("array of strings"));
1282*b1cdbd2cSJim Jagielski 	String aDefArgDescCells(RTL_CONSTASCII_STRINGPARAM("range of cells"));
1283*b1cdbd2cSJim Jagielski 	String aDefArgDescNone(RTL_CONSTASCII_STRINGPARAM("none"));
1284*b1cdbd2cSJim Jagielski 	String aArgName, aArgDesc;
1285*b1cdbd2cSJim Jagielski 	pFuncColl = ScGlobal::GetFuncCollection();
1286*b1cdbd2cSJim Jagielski 	for (i = 0; i < pFuncColl->GetCount(); i++)
1287*b1cdbd2cSJim Jagielski 	{
1288*b1cdbd2cSJim Jagielski 		pDesc = new ScFuncDesc;
1289*b1cdbd2cSJim Jagielski 		FuncData *pAddInFuncData = (FuncData*)pFuncColl->At(i);
1290*b1cdbd2cSJim Jagielski 		sal_uInt16 nArgs = pAddInFuncData->GetParamCount() - 1;
1291*b1cdbd2cSJim Jagielski 		pAddInFuncData->GetParamDesc( aArgName, aArgDesc, 0 );
1292*b1cdbd2cSJim Jagielski 		  pDesc->nFIndex     = nNextId++;				//  ??? OpCode vergeben
1293*b1cdbd2cSJim Jagielski 		  pDesc->nCategory   = ID_FUNCTION_GRP_ADDINS;
1294*b1cdbd2cSJim Jagielski 		  pDesc->pFuncName   = new String(pAddInFuncData->GetInternalName());
1295*b1cdbd2cSJim Jagielski 		  pDesc->pFuncName->ToUpperAscii();
1296*b1cdbd2cSJim Jagielski 		  pDesc->pFuncDesc   = new String( aArgDesc );
1297*b1cdbd2cSJim Jagielski 		*(pDesc->pFuncDesc) += '\n';
1298*b1cdbd2cSJim Jagielski 		  pDesc->pFuncDesc->AppendAscii(RTL_CONSTASCII_STRINGPARAM( "( AddIn: " ));
1299*b1cdbd2cSJim Jagielski 		*(pDesc->pFuncDesc) += pAddInFuncData->GetModuleName();
1300*b1cdbd2cSJim Jagielski 		  pDesc->pFuncDesc->AppendAscii(RTL_CONSTASCII_STRINGPARAM( " )" ));
1301*b1cdbd2cSJim Jagielski 		  pDesc->nArgCount   = nArgs;
1302*b1cdbd2cSJim Jagielski 		if (nArgs)
1303*b1cdbd2cSJim Jagielski 		{
1304*b1cdbd2cSJim Jagielski 			pDesc->pDefArgFlags  = new ScFuncDesc::ParameterFlags[nArgs];
1305*b1cdbd2cSJim Jagielski 			pDesc->ppDefArgNames = new String*[nArgs];
1306*b1cdbd2cSJim Jagielski 			pDesc->ppDefArgDescs = new String*[nArgs];
1307*b1cdbd2cSJim Jagielski 			for (j = 0; j < nArgs; j++)
1308*b1cdbd2cSJim Jagielski 			{
1309*b1cdbd2cSJim Jagielski 				pDesc->pDefArgFlags[j].bOptional = false;
1310*b1cdbd2cSJim Jagielski                 pDesc->pDefArgFlags[j].bSuppress = false;
1311*b1cdbd2cSJim Jagielski 				pAddInFuncData->GetParamDesc( aArgName, aArgDesc, j+1 );
1312*b1cdbd2cSJim Jagielski 				if ( aArgName.Len() )
1313*b1cdbd2cSJim Jagielski 					pDesc->ppDefArgNames[j] = new String( aArgName );
1314*b1cdbd2cSJim Jagielski 				else
1315*b1cdbd2cSJim Jagielski 				{
1316*b1cdbd2cSJim Jagielski 					switch (pAddInFuncData->GetParamType(j+1))
1317*b1cdbd2cSJim Jagielski 					{
1318*b1cdbd2cSJim Jagielski 						case PTR_DOUBLE:
1319*b1cdbd2cSJim Jagielski 							pDesc->ppDefArgNames[j] = new String( aDefArgNameValue );
1320*b1cdbd2cSJim Jagielski 							break;
1321*b1cdbd2cSJim Jagielski 						case PTR_STRING:
1322*b1cdbd2cSJim Jagielski 							pDesc->ppDefArgNames[j] = new String( aDefArgNameString );
1323*b1cdbd2cSJim Jagielski 							break;
1324*b1cdbd2cSJim Jagielski 						case PTR_DOUBLE_ARR:
1325*b1cdbd2cSJim Jagielski 							pDesc->ppDefArgNames[j] = new String( aDefArgNameValues );
1326*b1cdbd2cSJim Jagielski 							break;
1327*b1cdbd2cSJim Jagielski 						case PTR_STRING_ARR:
1328*b1cdbd2cSJim Jagielski 							pDesc->ppDefArgNames[j] = new String( aDefArgNameStrings );
1329*b1cdbd2cSJim Jagielski 							break;
1330*b1cdbd2cSJim Jagielski 						case PTR_CELL_ARR:
1331*b1cdbd2cSJim Jagielski 							pDesc->ppDefArgNames[j] = new String( aDefArgNameCells );
1332*b1cdbd2cSJim Jagielski 							break;
1333*b1cdbd2cSJim Jagielski 						default:
1334*b1cdbd2cSJim Jagielski 							pDesc->ppDefArgNames[j] = new String( aDefArgNameNone );
1335*b1cdbd2cSJim Jagielski 							break;
1336*b1cdbd2cSJim Jagielski 					}
1337*b1cdbd2cSJim Jagielski 				}
1338*b1cdbd2cSJim Jagielski 				if ( aArgDesc.Len() )
1339*b1cdbd2cSJim Jagielski 					pDesc->ppDefArgDescs[j] = new String( aArgDesc );
1340*b1cdbd2cSJim Jagielski 				else
1341*b1cdbd2cSJim Jagielski 				{
1342*b1cdbd2cSJim Jagielski 					switch (pAddInFuncData->GetParamType(j+1))
1343*b1cdbd2cSJim Jagielski 					{
1344*b1cdbd2cSJim Jagielski 						case PTR_DOUBLE:
1345*b1cdbd2cSJim Jagielski 							pDesc->ppDefArgDescs[j] = new String( aDefArgDescValue );
1346*b1cdbd2cSJim Jagielski 							break;
1347*b1cdbd2cSJim Jagielski 						case PTR_STRING:
1348*b1cdbd2cSJim Jagielski 							pDesc->ppDefArgDescs[j] = new String( aDefArgDescString );
1349*b1cdbd2cSJim Jagielski 							break;
1350*b1cdbd2cSJim Jagielski 						case PTR_DOUBLE_ARR:
1351*b1cdbd2cSJim Jagielski 							pDesc->ppDefArgDescs[j] = new String( aDefArgDescValues );
1352*b1cdbd2cSJim Jagielski 							break;
1353*b1cdbd2cSJim Jagielski 						case PTR_STRING_ARR:
1354*b1cdbd2cSJim Jagielski 							pDesc->ppDefArgDescs[j] = new String( aDefArgDescStrings );
1355*b1cdbd2cSJim Jagielski 							break;
1356*b1cdbd2cSJim Jagielski 						case PTR_CELL_ARR:
1357*b1cdbd2cSJim Jagielski 							pDesc->ppDefArgDescs[j] = new String( aDefArgDescCells );
1358*b1cdbd2cSJim Jagielski 							break;
1359*b1cdbd2cSJim Jagielski 						default:
1360*b1cdbd2cSJim Jagielski 							pDesc->ppDefArgDescs[j] = new String( aDefArgDescNone );
1361*b1cdbd2cSJim Jagielski 							break;
1362*b1cdbd2cSJim Jagielski 					}
1363*b1cdbd2cSJim Jagielski 				}
1364*b1cdbd2cSJim Jagielski 			}
1365*b1cdbd2cSJim Jagielski 		}
1366*b1cdbd2cSJim Jagielski //		pDesc->nHelpId    = 0;
1367*b1cdbd2cSJim Jagielski 
1368*b1cdbd2cSJim Jagielski 		aFunctionList.Insert(pDesc, LIST_APPEND);
1369*b1cdbd2cSJim Jagielski 		nStrLen = (*(pDesc->pFuncName)).Len();
1370*b1cdbd2cSJim Jagielski 		if ( nStrLen > nMaxFuncNameLen)
1371*b1cdbd2cSJim Jagielski 			nMaxFuncNameLen = nStrLen;
1372*b1cdbd2cSJim Jagielski 	}
1373*b1cdbd2cSJim Jagielski 
1374*b1cdbd2cSJim Jagielski 	//	StarOne AddIns
1375*b1cdbd2cSJim Jagielski 
1376*b1cdbd2cSJim Jagielski 	ScUnoAddInCollection* pUnoAddIns = ScGlobal::GetAddInCollection();
1377*b1cdbd2cSJim Jagielski 	long nUnoCount = pUnoAddIns->GetFuncCount();
1378*b1cdbd2cSJim Jagielski 	for (long nFunc=0; nFunc<nUnoCount; nFunc++)
1379*b1cdbd2cSJim Jagielski 	{
1380*b1cdbd2cSJim Jagielski 		pDesc = new ScFuncDesc;
1381*b1cdbd2cSJim Jagielski 		pDesc->nFIndex = nNextId++;
1382*b1cdbd2cSJim Jagielski 
1383*b1cdbd2cSJim Jagielski 		if ( pUnoAddIns->FillFunctionDesc( nFunc, *pDesc ) )
1384*b1cdbd2cSJim Jagielski 		{
1385*b1cdbd2cSJim Jagielski 			aFunctionList.Insert(pDesc, LIST_APPEND);
1386*b1cdbd2cSJim Jagielski 			nStrLen = (*(pDesc->pFuncName)).Len();
1387*b1cdbd2cSJim Jagielski 			if (nStrLen > nMaxFuncNameLen)
1388*b1cdbd2cSJim Jagielski 				nMaxFuncNameLen = nStrLen;
1389*b1cdbd2cSJim Jagielski 		}
1390*b1cdbd2cSJim Jagielski 		else
1391*b1cdbd2cSJim Jagielski 			delete pDesc;
1392*b1cdbd2cSJim Jagielski 	}
1393*b1cdbd2cSJim Jagielski }
1394*b1cdbd2cSJim Jagielski 
1395*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
1396*b1cdbd2cSJim Jagielski 
~ScFunctionList()1397*b1cdbd2cSJim Jagielski ScFunctionList::~ScFunctionList()
1398*b1cdbd2cSJim Jagielski {
1399*b1cdbd2cSJim Jagielski 	const ScFuncDesc* pDesc = First();
1400*b1cdbd2cSJim Jagielski 	while (pDesc)
1401*b1cdbd2cSJim Jagielski 	{
1402*b1cdbd2cSJim Jagielski 		delete pDesc;
1403*b1cdbd2cSJim Jagielski 		pDesc = Next();
1404*b1cdbd2cSJim Jagielski 	}
1405*b1cdbd2cSJim Jagielski }
1406*b1cdbd2cSJim Jagielski 
1407*b1cdbd2cSJim Jagielski 
1408*b1cdbd2cSJim Jagielski //========================================================================
1409*b1cdbd2cSJim Jagielski // class ScFuncDesc:
1410*b1cdbd2cSJim Jagielski 
ScFuncDesc()1411*b1cdbd2cSJim Jagielski ScFuncDesc::ScFuncDesc() :
1412*b1cdbd2cSJim Jagielski         pFuncName       (NULL),
1413*b1cdbd2cSJim Jagielski         pFuncDesc       (NULL),
1414*b1cdbd2cSJim Jagielski         ppDefArgNames   (NULL),
1415*b1cdbd2cSJim Jagielski         ppDefArgDescs   (NULL),
1416*b1cdbd2cSJim Jagielski         pDefArgFlags    (NULL),
1417*b1cdbd2cSJim Jagielski         nFIndex         (0),
1418*b1cdbd2cSJim Jagielski         nCategory       (0),
1419*b1cdbd2cSJim Jagielski         nArgCount       (0),
1420*b1cdbd2cSJim Jagielski         bIncomplete     (false),
1421*b1cdbd2cSJim Jagielski         bHasSuppressedArgs(false)
1422*b1cdbd2cSJim Jagielski {}
1423*b1cdbd2cSJim Jagielski 
1424*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
1425*b1cdbd2cSJim Jagielski 
~ScFuncDesc()1426*b1cdbd2cSJim Jagielski ScFuncDesc::~ScFuncDesc()
1427*b1cdbd2cSJim Jagielski {
1428*b1cdbd2cSJim Jagielski     Clear();
1429*b1cdbd2cSJim Jagielski }
1430*b1cdbd2cSJim Jagielski 
1431*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
1432*b1cdbd2cSJim Jagielski 
Clear()1433*b1cdbd2cSJim Jagielski void ScFuncDesc::Clear()
1434*b1cdbd2cSJim Jagielski {
1435*b1cdbd2cSJim Jagielski     sal_uInt16 nArgs = nArgCount;
1436*b1cdbd2cSJim Jagielski     if (nArgs >= PAIRED_VAR_ARGS) nArgs -= PAIRED_VAR_ARGS - 2;
1437*b1cdbd2cSJim Jagielski     else if (nArgs >= VAR_ARGS) nArgs -= VAR_ARGS - 1;
1438*b1cdbd2cSJim Jagielski     if (nArgs)
1439*b1cdbd2cSJim Jagielski     {
1440*b1cdbd2cSJim Jagielski         for (sal_uInt16 i=0; i<nArgs; i++ )
1441*b1cdbd2cSJim Jagielski         {
1442*b1cdbd2cSJim Jagielski             delete ppDefArgNames[i];
1443*b1cdbd2cSJim Jagielski             delete ppDefArgDescs[i];
1444*b1cdbd2cSJim Jagielski         }
1445*b1cdbd2cSJim Jagielski         delete [] ppDefArgNames;
1446*b1cdbd2cSJim Jagielski         delete [] ppDefArgDescs;
1447*b1cdbd2cSJim Jagielski         delete [] pDefArgFlags;
1448*b1cdbd2cSJim Jagielski     }
1449*b1cdbd2cSJim Jagielski     nArgCount = 0;
1450*b1cdbd2cSJim Jagielski     ppDefArgNames = NULL;
1451*b1cdbd2cSJim Jagielski     ppDefArgDescs = NULL;
1452*b1cdbd2cSJim Jagielski     pDefArgFlags = NULL;
1453*b1cdbd2cSJim Jagielski 
1454*b1cdbd2cSJim Jagielski     delete pFuncName;
1455*b1cdbd2cSJim Jagielski     pFuncName = NULL;
1456*b1cdbd2cSJim Jagielski 
1457*b1cdbd2cSJim Jagielski     delete pFuncDesc;
1458*b1cdbd2cSJim Jagielski     pFuncDesc = NULL;
1459*b1cdbd2cSJim Jagielski 
1460*b1cdbd2cSJim Jagielski     nFIndex = 0;
1461*b1cdbd2cSJim Jagielski     nCategory = 0;
1462*b1cdbd2cSJim Jagielski     sHelpId = "";
1463*b1cdbd2cSJim Jagielski     bIncomplete = false;
1464*b1cdbd2cSJim Jagielski     bHasSuppressedArgs = false;
1465*b1cdbd2cSJim Jagielski }
1466*b1cdbd2cSJim Jagielski 
1467*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
1468*b1cdbd2cSJim Jagielski 
GetParamList() const1469*b1cdbd2cSJim Jagielski String ScFuncDesc::GetParamList() const
1470*b1cdbd2cSJim Jagielski {
1471*b1cdbd2cSJim Jagielski     const String& sep = ScCompiler::GetNativeSymbol(ocSep);
1472*b1cdbd2cSJim Jagielski 
1473*b1cdbd2cSJim Jagielski     String aSig;
1474*b1cdbd2cSJim Jagielski 
1475*b1cdbd2cSJim Jagielski     if ( nArgCount > 0 )
1476*b1cdbd2cSJim Jagielski     {
1477*b1cdbd2cSJim Jagielski         if ( nArgCount < VAR_ARGS )
1478*b1cdbd2cSJim Jagielski         {
1479*b1cdbd2cSJim Jagielski             sal_uInt16 nLastSuppressed = nArgCount;
1480*b1cdbd2cSJim Jagielski             sal_uInt16 nLastAdded = nArgCount;
1481*b1cdbd2cSJim Jagielski             for ( sal_uInt16 i=0; i<nArgCount; i++ )
1482*b1cdbd2cSJim Jagielski             {
1483*b1cdbd2cSJim Jagielski                 if (pDefArgFlags[i].bSuppress)
1484*b1cdbd2cSJim Jagielski                     nLastSuppressed = i;
1485*b1cdbd2cSJim Jagielski                 else
1486*b1cdbd2cSJim Jagielski                 {
1487*b1cdbd2cSJim Jagielski                     nLastAdded = i;
1488*b1cdbd2cSJim Jagielski                     aSig += *(ppDefArgNames[i]);
1489*b1cdbd2cSJim Jagielski                     if ( i != nArgCount-1 )
1490*b1cdbd2cSJim Jagielski                     {
1491*b1cdbd2cSJim Jagielski                         aSig.Append(sep);
1492*b1cdbd2cSJim Jagielski                         aSig.AppendAscii(RTL_CONSTASCII_STRINGPARAM( " " ));
1493*b1cdbd2cSJim Jagielski                     }
1494*b1cdbd2cSJim Jagielski                 }
1495*b1cdbd2cSJim Jagielski             }
1496*b1cdbd2cSJim Jagielski             // If only suppressed parameters follow the last added parameter,
1497*b1cdbd2cSJim Jagielski             // remove one "; "
1498*b1cdbd2cSJim Jagielski             if (nLastSuppressed < nArgCount && nLastAdded < nLastSuppressed &&
1499*b1cdbd2cSJim Jagielski                     aSig.Len() >= 2)
1500*b1cdbd2cSJim Jagielski                 aSig.Erase( aSig.Len() - 2 );
1501*b1cdbd2cSJim Jagielski         }
1502*b1cdbd2cSJim Jagielski         else if ( nArgCount < PAIRED_VAR_ARGS)
1503*b1cdbd2cSJim Jagielski         {
1504*b1cdbd2cSJim Jagielski             sal_uInt16 nFix = nArgCount - VAR_ARGS;
1505*b1cdbd2cSJim Jagielski             for ( sal_uInt16 nArg = 0; nArg < nFix; nArg++ )
1506*b1cdbd2cSJim Jagielski             {
1507*b1cdbd2cSJim Jagielski                 if (!pDefArgFlags[nArg].bSuppress)
1508*b1cdbd2cSJim Jagielski                 {
1509*b1cdbd2cSJim Jagielski                     aSig += *(ppDefArgNames[nArg]);
1510*b1cdbd2cSJim Jagielski                     aSig.Append(sep);
1511*b1cdbd2cSJim Jagielski                     aSig.AppendAscii(RTL_CONSTASCII_STRINGPARAM( " " ));
1512*b1cdbd2cSJim Jagielski                 }
1513*b1cdbd2cSJim Jagielski             }
1514*b1cdbd2cSJim Jagielski             /* NOTE: Currently there are no suppressed var args parameters. If
1515*b1cdbd2cSJim Jagielski              * there were, we'd have to cope with it here and above for the fix
1516*b1cdbd2cSJim Jagielski              * parameters. For now parameters are always added, so no special
1517*b1cdbd2cSJim Jagielski              * treatment of a trailing "; " necessary. */
1518*b1cdbd2cSJim Jagielski             aSig += *(ppDefArgNames[nFix]);
1519*b1cdbd2cSJim Jagielski             aSig += '1';
1520*b1cdbd2cSJim Jagielski             aSig.Append(sep);
1521*b1cdbd2cSJim Jagielski             aSig.AppendAscii(RTL_CONSTASCII_STRINGPARAM( " " ));
1522*b1cdbd2cSJim Jagielski             aSig += *(ppDefArgNames[nFix]);
1523*b1cdbd2cSJim Jagielski             aSig += '2';
1524*b1cdbd2cSJim Jagielski             aSig.Append(sep);
1525*b1cdbd2cSJim Jagielski             aSig.AppendAscii(RTL_CONSTASCII_STRINGPARAM( " ... " ));
1526*b1cdbd2cSJim Jagielski         }
1527*b1cdbd2cSJim Jagielski         else
1528*b1cdbd2cSJim Jagielski         {
1529*b1cdbd2cSJim Jagielski             sal_uInt16 nFix = nArgCount - PAIRED_VAR_ARGS;
1530*b1cdbd2cSJim Jagielski             for ( sal_uInt16 nArg = 0; nArg < nFix; nArg++ )
1531*b1cdbd2cSJim Jagielski             {
1532*b1cdbd2cSJim Jagielski                 if (!pDefArgFlags[nArg].bSuppress)
1533*b1cdbd2cSJim Jagielski                 {
1534*b1cdbd2cSJim Jagielski                     aSig += *(ppDefArgNames[nArg]);
1535*b1cdbd2cSJim Jagielski                     aSig.Append(sep);
1536*b1cdbd2cSJim Jagielski                     aSig.AppendAscii(RTL_CONSTASCII_STRINGPARAM( " " ));
1537*b1cdbd2cSJim Jagielski                 }
1538*b1cdbd2cSJim Jagielski             }
1539*b1cdbd2cSJim Jagielski 
1540*b1cdbd2cSJim Jagielski             aSig += *(ppDefArgNames[nFix]);
1541*b1cdbd2cSJim Jagielski             aSig += '1';
1542*b1cdbd2cSJim Jagielski             aSig.AppendAscii(RTL_CONSTASCII_STRINGPARAM( ", " ));
1543*b1cdbd2cSJim Jagielski             aSig += *(ppDefArgNames[nFix+1]);
1544*b1cdbd2cSJim Jagielski             aSig += '1';
1545*b1cdbd2cSJim Jagielski             aSig.Append(sep);
1546*b1cdbd2cSJim Jagielski             aSig.AppendAscii(RTL_CONSTASCII_STRINGPARAM( " " ));
1547*b1cdbd2cSJim Jagielski             aSig += *(ppDefArgNames[nFix]);
1548*b1cdbd2cSJim Jagielski             aSig += '2';
1549*b1cdbd2cSJim Jagielski             aSig.AppendAscii(RTL_CONSTASCII_STRINGPARAM( ", " ));
1550*b1cdbd2cSJim Jagielski             aSig += *(ppDefArgNames[nFix+1]);
1551*b1cdbd2cSJim Jagielski             aSig += '2';
1552*b1cdbd2cSJim Jagielski             aSig.Append(sep);
1553*b1cdbd2cSJim Jagielski             aSig.AppendAscii(RTL_CONSTASCII_STRINGPARAM( " ... " ));
1554*b1cdbd2cSJim Jagielski         }
1555*b1cdbd2cSJim Jagielski     }
1556*b1cdbd2cSJim Jagielski 
1557*b1cdbd2cSJim Jagielski     return aSig;
1558*b1cdbd2cSJim Jagielski }
1559*b1cdbd2cSJim Jagielski 
1560*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
1561*b1cdbd2cSJim Jagielski 
GetSignature() const1562*b1cdbd2cSJim Jagielski String ScFuncDesc::GetSignature() const
1563*b1cdbd2cSJim Jagielski {
1564*b1cdbd2cSJim Jagielski 	String aSig;
1565*b1cdbd2cSJim Jagielski 
1566*b1cdbd2cSJim Jagielski 	if(pFuncName)
1567*b1cdbd2cSJim Jagielski 	{
1568*b1cdbd2cSJim Jagielski 		aSig = *pFuncName;
1569*b1cdbd2cSJim Jagielski 
1570*b1cdbd2cSJim Jagielski         String aParamList( GetParamList() );
1571*b1cdbd2cSJim Jagielski         if( aParamList.Len() )
1572*b1cdbd2cSJim Jagielski         {
1573*b1cdbd2cSJim Jagielski 			aSig.AppendAscii(RTL_CONSTASCII_STRINGPARAM( "( " ));
1574*b1cdbd2cSJim Jagielski             aSig.Append( aParamList );
1575*b1cdbd2cSJim Jagielski             // U+00A0 (NBSP) prevents automatic line break
1576*b1cdbd2cSJim Jagielski             aSig.Append( static_cast< sal_Unicode >(0xA0) ).Append( ')' );
1577*b1cdbd2cSJim Jagielski 		}
1578*b1cdbd2cSJim Jagielski 		else
1579*b1cdbd2cSJim Jagielski 			aSig.AppendAscii(RTL_CONSTASCII_STRINGPARAM( "()" ));
1580*b1cdbd2cSJim Jagielski 	}
1581*b1cdbd2cSJim Jagielski 	return aSig;
1582*b1cdbd2cSJim Jagielski }
1583*b1cdbd2cSJim Jagielski 
1584*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
1585*b1cdbd2cSJim Jagielski 
getFormula(const::std::vector<::rtl::OUString> & _aArguments) const1586*b1cdbd2cSJim Jagielski ::rtl::OUString ScFuncDesc::getFormula( const ::std::vector< ::rtl::OUString >& _aArguments ) const
1587*b1cdbd2cSJim Jagielski {
1588*b1cdbd2cSJim Jagielski     const String& sep = ScCompiler::GetNativeSymbol(ocSep);
1589*b1cdbd2cSJim Jagielski 
1590*b1cdbd2cSJim Jagielski 	::rtl::OUStringBuffer aFormula;
1591*b1cdbd2cSJim Jagielski 
1592*b1cdbd2cSJim Jagielski 	if(pFuncName)
1593*b1cdbd2cSJim Jagielski 	{
1594*b1cdbd2cSJim Jagielski 		aFormula.append( *pFuncName );
1595*b1cdbd2cSJim Jagielski 
1596*b1cdbd2cSJim Jagielski 		aFormula.appendAscii( "(" );
1597*b1cdbd2cSJim Jagielski         ::std::vector< ::rtl::OUString >::const_iterator aIter = _aArguments.begin();
1598*b1cdbd2cSJim Jagielski         ::std::vector< ::rtl::OUString >::const_iterator aEnd = _aArguments.end();
1599*b1cdbd2cSJim Jagielski 
1600*b1cdbd2cSJim Jagielski 		if ( nArgCount > 0 && aIter != aEnd )
1601*b1cdbd2cSJim Jagielski 		{
1602*b1cdbd2cSJim Jagielski 			sal_Bool bLastArg = ( aIter->getLength() == 0 );
1603*b1cdbd2cSJim Jagielski 
1604*b1cdbd2cSJim Jagielski             while( aIter != aEnd && !bLastArg )
1605*b1cdbd2cSJim Jagielski             {
1606*b1cdbd2cSJim Jagielski 				aFormula.append( *(aIter) );
1607*b1cdbd2cSJim Jagielski                 if ( aIter != (aEnd-1) )
1608*b1cdbd2cSJim Jagielski 				{
1609*b1cdbd2cSJim Jagielski 					bLastArg = !( (aIter+1)->getLength() > 0 );
1610*b1cdbd2cSJim Jagielski 					if ( !bLastArg )
1611*b1cdbd2cSJim Jagielski 						aFormula.append( sep );
1612*b1cdbd2cSJim Jagielski 				}
1613*b1cdbd2cSJim Jagielski 
1614*b1cdbd2cSJim Jagielski                 ++aIter;
1615*b1cdbd2cSJim Jagielski 			}
1616*b1cdbd2cSJim Jagielski 		}
1617*b1cdbd2cSJim Jagielski 
1618*b1cdbd2cSJim Jagielski 		aFormula.appendAscii( ")" );
1619*b1cdbd2cSJim Jagielski 	}
1620*b1cdbd2cSJim Jagielski 	return aFormula.makeStringAndClear();
1621*b1cdbd2cSJim Jagielski }
1622*b1cdbd2cSJim Jagielski 
1623*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
1624*b1cdbd2cSJim Jagielski 
GetSuppressedArgCount() const1625*b1cdbd2cSJim Jagielski sal_uInt16 ScFuncDesc::GetSuppressedArgCount() const
1626*b1cdbd2cSJim Jagielski {
1627*b1cdbd2cSJim Jagielski     if (!bHasSuppressedArgs || !pDefArgFlags)
1628*b1cdbd2cSJim Jagielski         return nArgCount;
1629*b1cdbd2cSJim Jagielski 
1630*b1cdbd2cSJim Jagielski     sal_uInt16 nArgs = nArgCount;
1631*b1cdbd2cSJim Jagielski     if (nArgs >= PAIRED_VAR_ARGS)
1632*b1cdbd2cSJim Jagielski 	    nArgs -= PAIRED_VAR_ARGS - 2;
1633*b1cdbd2cSJim Jagielski 	else if (nArgs >= VAR_ARGS)
1634*b1cdbd2cSJim Jagielski         nArgs -= VAR_ARGS - 1;
1635*b1cdbd2cSJim Jagielski     sal_uInt16 nCount = nArgs;
1636*b1cdbd2cSJim Jagielski     for (sal_uInt16 i=0; i < nArgs; ++i)
1637*b1cdbd2cSJim Jagielski     {
1638*b1cdbd2cSJim Jagielski         if (pDefArgFlags[i].bSuppress)
1639*b1cdbd2cSJim Jagielski             --nCount;
1640*b1cdbd2cSJim Jagielski     }
1641*b1cdbd2cSJim Jagielski     if (nArgCount >= PAIRED_VAR_ARGS)
1642*b1cdbd2cSJim Jagielski         nCount += PAIRED_VAR_ARGS - 2;
1643*b1cdbd2cSJim Jagielski     else if (nArgCount >= VAR_ARGS)
1644*b1cdbd2cSJim Jagielski         nCount += VAR_ARGS - 1;
1645*b1cdbd2cSJim Jagielski     return nCount;
1646*b1cdbd2cSJim Jagielski }
1647*b1cdbd2cSJim Jagielski 
1648*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
1649*b1cdbd2cSJim Jagielski 
getFunctionName() const1650*b1cdbd2cSJim Jagielski ::rtl::OUString ScFuncDesc::getFunctionName() const
1651*b1cdbd2cSJim Jagielski {
1652*b1cdbd2cSJim Jagielski     ::rtl::OUString sRet;
1653*b1cdbd2cSJim Jagielski     if ( pFuncName )
1654*b1cdbd2cSJim Jagielski         sRet = *pFuncName;
1655*b1cdbd2cSJim Jagielski     return sRet;
1656*b1cdbd2cSJim Jagielski }
1657*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
getCategory() const1658*b1cdbd2cSJim Jagielski const formula::IFunctionCategory* ScFuncDesc::getCategory() const
1659*b1cdbd2cSJim Jagielski {
1660*b1cdbd2cSJim Jagielski     return ScGlobal::GetStarCalcFunctionMgr()->getCategory(nCategory);
1661*b1cdbd2cSJim Jagielski }
1662*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
getDescription() const1663*b1cdbd2cSJim Jagielski ::rtl::OUString ScFuncDesc::getDescription() const
1664*b1cdbd2cSJim Jagielski {
1665*b1cdbd2cSJim Jagielski     ::rtl::OUString sRet;
1666*b1cdbd2cSJim Jagielski     if ( pFuncDesc )
1667*b1cdbd2cSJim Jagielski         sRet = *pFuncDesc;
1668*b1cdbd2cSJim Jagielski     return sRet;
1669*b1cdbd2cSJim Jagielski }
1670*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
1671*b1cdbd2cSJim Jagielski // GetSuppressedArgCount
getSuppressedArgumentCount() const1672*b1cdbd2cSJim Jagielski xub_StrLen ScFuncDesc::getSuppressedArgumentCount() const
1673*b1cdbd2cSJim Jagielski {
1674*b1cdbd2cSJim Jagielski     return GetSuppressedArgCount();
1675*b1cdbd2cSJim Jagielski }
1676*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
1677*b1cdbd2cSJim Jagielski //
fillVisibleArgumentMapping(::std::vector<sal_uInt16> & _rArguments) const1678*b1cdbd2cSJim Jagielski void ScFuncDesc::fillVisibleArgumentMapping(::std::vector<sal_uInt16>& _rArguments) const
1679*b1cdbd2cSJim Jagielski {
1680*b1cdbd2cSJim Jagielski     if (!bHasSuppressedArgs || !pDefArgFlags)
1681*b1cdbd2cSJim Jagielski     {
1682*b1cdbd2cSJim Jagielski         _rArguments.resize( nArgCount);
1683*b1cdbd2cSJim Jagielski         ::std::vector<sal_uInt16>::iterator it = _rArguments.begin();
1684*b1cdbd2cSJim Jagielski         for( sal_uInt16 n = 0; n < nArgCount; ++n, ++it )
1685*b1cdbd2cSJim Jagielski             *it = n;
1686*b1cdbd2cSJim Jagielski     }
1687*b1cdbd2cSJim Jagielski 
1688*b1cdbd2cSJim Jagielski     _rArguments.reserve( nArgCount);
1689*b1cdbd2cSJim Jagielski     sal_uInt16 nArgs = nArgCount;
1690*b1cdbd2cSJim Jagielski     if (nArgs >= PAIRED_VAR_ARGS)
1691*b1cdbd2cSJim Jagielski 	    nArgs -= PAIRED_VAR_ARGS - 2;
1692*b1cdbd2cSJim Jagielski 	else if (nArgs >= VAR_ARGS)
1693*b1cdbd2cSJim Jagielski         nArgs -= VAR_ARGS - 1;
1694*b1cdbd2cSJim Jagielski     for (sal_uInt16 i=0; i < nArgs; ++i)
1695*b1cdbd2cSJim Jagielski     {
1696*b1cdbd2cSJim Jagielski         if (!pDefArgFlags[i].bSuppress)
1697*b1cdbd2cSJim Jagielski             _rArguments.push_back(i);
1698*b1cdbd2cSJim Jagielski     }
1699*b1cdbd2cSJim Jagielski }
1700*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
initArgumentInfo() const1701*b1cdbd2cSJim Jagielski void ScFuncDesc::initArgumentInfo()  const
1702*b1cdbd2cSJim Jagielski {
1703*b1cdbd2cSJim Jagielski     // get the full argument description
1704*b1cdbd2cSJim Jagielski     // (add-in has to be instantiated to get the type information)
1705*b1cdbd2cSJim Jagielski 
1706*b1cdbd2cSJim Jagielski     if ( bIncomplete && pFuncName )
1707*b1cdbd2cSJim Jagielski     {
1708*b1cdbd2cSJim Jagielski         ScUnoAddInCollection& rAddIns = *ScGlobal::GetAddInCollection();
1709*b1cdbd2cSJim Jagielski         String aIntName = rAddIns.FindFunction( *pFuncName, sal_True );         // pFuncName is upper-case
1710*b1cdbd2cSJim Jagielski 
1711*b1cdbd2cSJim Jagielski         if ( aIntName.Len() )
1712*b1cdbd2cSJim Jagielski         {
1713*b1cdbd2cSJim Jagielski             // GetFuncData with bComplete=true loads the component and updates
1714*b1cdbd2cSJim Jagielski             // the global function list if needed.
1715*b1cdbd2cSJim Jagielski 
1716*b1cdbd2cSJim Jagielski             rAddIns.GetFuncData( aIntName, true );
1717*b1cdbd2cSJim Jagielski         }
1718*b1cdbd2cSJim Jagielski 
1719*b1cdbd2cSJim Jagielski         if ( bIncomplete )
1720*b1cdbd2cSJim Jagielski         {
1721*b1cdbd2cSJim Jagielski             DBG_ERRORFILE( "couldn't initialize add-in function" );
1722*b1cdbd2cSJim Jagielski             const_cast<ScFuncDesc*>(this)->bIncomplete = sal_False;         // even if there was an error, don't try again
1723*b1cdbd2cSJim Jagielski         }
1724*b1cdbd2cSJim Jagielski     }
1725*b1cdbd2cSJim Jagielski }
1726*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
getSignature() const1727*b1cdbd2cSJim Jagielski ::rtl::OUString ScFuncDesc::getSignature() const
1728*b1cdbd2cSJim Jagielski {
1729*b1cdbd2cSJim Jagielski     return GetSignature();
1730*b1cdbd2cSJim Jagielski }
1731*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
getHelpId() const1732*b1cdbd2cSJim Jagielski rtl::OString ScFuncDesc::getHelpId() const
1733*b1cdbd2cSJim Jagielski {
1734*b1cdbd2cSJim Jagielski     return sHelpId;
1735*b1cdbd2cSJim Jagielski }
1736*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
1737*b1cdbd2cSJim Jagielski 
1738*b1cdbd2cSJim Jagielski // parameter
getParameterCount() const1739*b1cdbd2cSJim Jagielski sal_uInt32 ScFuncDesc::getParameterCount() const
1740*b1cdbd2cSJim Jagielski {
1741*b1cdbd2cSJim Jagielski     return nArgCount;
1742*b1cdbd2cSJim Jagielski }
1743*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
getParameterName(sal_uInt32 _nPos) const1744*b1cdbd2cSJim Jagielski ::rtl::OUString ScFuncDesc::getParameterName(sal_uInt32 _nPos) const
1745*b1cdbd2cSJim Jagielski {
1746*b1cdbd2cSJim Jagielski     return *(ppDefArgNames[_nPos]);
1747*b1cdbd2cSJim Jagielski }
1748*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
getParameterDescription(sal_uInt32 _nPos) const1749*b1cdbd2cSJim Jagielski ::rtl::OUString ScFuncDesc::getParameterDescription(sal_uInt32 _nPos) const
1750*b1cdbd2cSJim Jagielski {
1751*b1cdbd2cSJim Jagielski     return *(ppDefArgDescs[_nPos]);
1752*b1cdbd2cSJim Jagielski }
1753*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
isParameterOptional(sal_uInt32 _nPos) const1754*b1cdbd2cSJim Jagielski bool ScFuncDesc::isParameterOptional(sal_uInt32 _nPos) const
1755*b1cdbd2cSJim Jagielski {
1756*b1cdbd2cSJim Jagielski     return pDefArgFlags[_nPos].bOptional;
1757*b1cdbd2cSJim Jagielski }
1758*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
1759*b1cdbd2cSJim Jagielski //========================================================================
1760*b1cdbd2cSJim Jagielski // class ScFunctionMgr:
1761*b1cdbd2cSJim Jagielski 
ScFunctionMgr()1762*b1cdbd2cSJim Jagielski ScFunctionMgr::ScFunctionMgr()
1763*b1cdbd2cSJim Jagielski 	:	pFuncList	( ScGlobal::GetStarCalcFunctionList() ),
1764*b1cdbd2cSJim Jagielski 		pCurCatList	( NULL )
1765*b1cdbd2cSJim Jagielski {
1766*b1cdbd2cSJim Jagielski 	DBG_ASSERT( pFuncList, "Funktionsliste nicht gefunden." );
1767*b1cdbd2cSJim Jagielski 	sal_uLong		nCount	= pFuncList->GetCount();
1768*b1cdbd2cSJim Jagielski 	const ScFuncDesc*	pDesc;
1769*b1cdbd2cSJim Jagielski 	List*		pRootList;
1770*b1cdbd2cSJim Jagielski 	sal_uLong		n;
1771*b1cdbd2cSJim Jagielski 
1772*b1cdbd2cSJim Jagielski 	for ( sal_uInt16 i=0; i<MAX_FUNCCAT; i++ )					// Kategorie-Listen erstellen
1773*b1cdbd2cSJim Jagielski 		aCatLists[i] = new List;
1774*b1cdbd2cSJim Jagielski 
1775*b1cdbd2cSJim Jagielski 	pRootList = aCatLists[0];								// Gesamtliste ("Alle") erstellen
1776*b1cdbd2cSJim Jagielski     CollatorWrapper* pCaseCollator = ScGlobal::GetCaseCollator();
1777*b1cdbd2cSJim Jagielski 	for ( n=0; n<nCount; n++ )
1778*b1cdbd2cSJim Jagielski 	{
1779*b1cdbd2cSJim Jagielski 		sal_uLong nTmpCnt=0;
1780*b1cdbd2cSJim Jagielski 		pDesc = pFuncList->GetFunction(n);
1781*b1cdbd2cSJim Jagielski 		for (nTmpCnt = 0; nTmpCnt < n; nTmpCnt++)
1782*b1cdbd2cSJim Jagielski 		{
1783*b1cdbd2cSJim Jagielski 			// ist zwar case-sensitiv, aber Umlaute muessen richtig einsortiert werden
1784*b1cdbd2cSJim Jagielski 
1785*b1cdbd2cSJim Jagielski 			const ScFuncDesc*	pTmpDesc = (const ScFuncDesc*)pRootList->GetObject(nTmpCnt);
1786*b1cdbd2cSJim Jagielski 			if ( pCaseCollator->compareString(*pDesc->pFuncName, *pTmpDesc->pFuncName ) == COMPARE_LESS )
1787*b1cdbd2cSJim Jagielski 				break;
1788*b1cdbd2cSJim Jagielski 		}
1789*b1cdbd2cSJim Jagielski 		pRootList->Insert((void*)pDesc, nTmpCnt);					// Einsortieren
1790*b1cdbd2cSJim Jagielski 	}
1791*b1cdbd2cSJim Jagielski 
1792*b1cdbd2cSJim Jagielski 	for ( n=0; n<nCount; n++ )								// in Gruppenlisten kopieren
1793*b1cdbd2cSJim Jagielski 	{
1794*b1cdbd2cSJim Jagielski 		pDesc = (const ScFuncDesc*)pRootList->GetObject(n);
1795*b1cdbd2cSJim Jagielski 		DBG_ASSERT((pDesc->nCategory) < MAX_FUNCCAT, "Unbekannte Kategorie");
1796*b1cdbd2cSJim Jagielski 		if ((pDesc->nCategory) < MAX_FUNCCAT)
1797*b1cdbd2cSJim Jagielski 			aCatLists[pDesc->nCategory]->Insert((void*)pDesc, LIST_APPEND);
1798*b1cdbd2cSJim Jagielski 	}
1799*b1cdbd2cSJim Jagielski }
1800*b1cdbd2cSJim Jagielski 
1801*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
1802*b1cdbd2cSJim Jagielski 
~ScFunctionMgr()1803*b1cdbd2cSJim Jagielski ScFunctionMgr::~ScFunctionMgr()
1804*b1cdbd2cSJim Jagielski {
1805*b1cdbd2cSJim Jagielski 	for (sal_uInt16 i = 0; i < MAX_FUNCCAT; i++)
1806*b1cdbd2cSJim Jagielski 		delete aCatLists[i];
1807*b1cdbd2cSJim Jagielski //  delete pFuncList;       // Macht spaeter die App
1808*b1cdbd2cSJim Jagielski }
1809*b1cdbd2cSJim Jagielski 
1810*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
1811*b1cdbd2cSJim Jagielski 
Get(const String & rFName) const1812*b1cdbd2cSJim Jagielski const ScFuncDesc* ScFunctionMgr::Get( const String& rFName ) const
1813*b1cdbd2cSJim Jagielski {
1814*b1cdbd2cSJim Jagielski 	const ScFuncDesc*	pDesc = NULL;
1815*b1cdbd2cSJim Jagielski 	if (rFName.Len() <= pFuncList->GetMaxFuncNameLen())
1816*b1cdbd2cSJim Jagielski 		for (pDesc = First(0); pDesc; pDesc = Next())
1817*b1cdbd2cSJim Jagielski 			if (rFName.EqualsIgnoreCaseAscii(*(pDesc->pFuncName)))
1818*b1cdbd2cSJim Jagielski 				break;
1819*b1cdbd2cSJim Jagielski 	return pDesc;
1820*b1cdbd2cSJim Jagielski }
1821*b1cdbd2cSJim Jagielski 
1822*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
1823*b1cdbd2cSJim Jagielski 
Get(sal_uInt16 nFIndex) const1824*b1cdbd2cSJim Jagielski const ScFuncDesc* ScFunctionMgr::Get( sal_uInt16 nFIndex ) const
1825*b1cdbd2cSJim Jagielski {
1826*b1cdbd2cSJim Jagielski 	const ScFuncDesc*	pDesc;
1827*b1cdbd2cSJim Jagielski 	for (pDesc = First(0); pDesc; pDesc = Next())
1828*b1cdbd2cSJim Jagielski 		if (pDesc->nFIndex == nFIndex)
1829*b1cdbd2cSJim Jagielski 			break;
1830*b1cdbd2cSJim Jagielski 	return pDesc;
1831*b1cdbd2cSJim Jagielski }
1832*b1cdbd2cSJim Jagielski 
1833*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
1834*b1cdbd2cSJim Jagielski 
First(sal_uInt16 nCategory) const1835*b1cdbd2cSJim Jagielski const ScFuncDesc*	ScFunctionMgr::First( sal_uInt16 nCategory ) const
1836*b1cdbd2cSJim Jagielski {
1837*b1cdbd2cSJim Jagielski 	DBG_ASSERT( nCategory < MAX_FUNCCAT, "Unbekannte Kategorie" );
1838*b1cdbd2cSJim Jagielski 
1839*b1cdbd2cSJim Jagielski 	if ( nCategory < MAX_FUNCCAT )
1840*b1cdbd2cSJim Jagielski 	{
1841*b1cdbd2cSJim Jagielski 		pCurCatList = aCatLists[nCategory];
1842*b1cdbd2cSJim Jagielski 		return (const ScFuncDesc*)pCurCatList->First();
1843*b1cdbd2cSJim Jagielski 	}
1844*b1cdbd2cSJim Jagielski 	else
1845*b1cdbd2cSJim Jagielski 	{
1846*b1cdbd2cSJim Jagielski 		pCurCatList = NULL;
1847*b1cdbd2cSJim Jagielski 		return NULL;
1848*b1cdbd2cSJim Jagielski 	}
1849*b1cdbd2cSJim Jagielski }
1850*b1cdbd2cSJim Jagielski 
1851*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
1852*b1cdbd2cSJim Jagielski 
Next() const1853*b1cdbd2cSJim Jagielski const ScFuncDesc* ScFunctionMgr::Next() const
1854*b1cdbd2cSJim Jagielski {
1855*b1cdbd2cSJim Jagielski 	if ( pCurCatList )
1856*b1cdbd2cSJim Jagielski 		return (const ScFuncDesc*)pCurCatList->Next();
1857*b1cdbd2cSJim Jagielski 	else
1858*b1cdbd2cSJim Jagielski 		return NULL;
1859*b1cdbd2cSJim Jagielski }
getCount() const1860*b1cdbd2cSJim Jagielski sal_uInt32 ScFunctionMgr::getCount() const
1861*b1cdbd2cSJim Jagielski {
1862*b1cdbd2cSJim Jagielski     return MAX_FUNCCAT - 1;
1863*b1cdbd2cSJim Jagielski }
getCategory(sal_uInt32 nCategory) const1864*b1cdbd2cSJim Jagielski const formula::IFunctionCategory* ScFunctionMgr::getCategory(sal_uInt32 nCategory) const
1865*b1cdbd2cSJim Jagielski {
1866*b1cdbd2cSJim Jagielski     formula::IFunctionCategory* pRet = NULL;
1867*b1cdbd2cSJim Jagielski     if ( nCategory < (MAX_FUNCCAT-1) )
1868*b1cdbd2cSJim Jagielski 	{
1869*b1cdbd2cSJim Jagielski 		 pRet = new ScFunctionCategory(const_cast<ScFunctionMgr*>(this),aCatLists[nCategory+1],nCategory); // aCatLists[0] is "all"
1870*b1cdbd2cSJim Jagielski     }
1871*b1cdbd2cSJim Jagielski     return pRet;
1872*b1cdbd2cSJim Jagielski }
1873*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
getFunctionByName(const::rtl::OUString & _sFunctionName) const1874*b1cdbd2cSJim Jagielski const formula::IFunctionDescription* ScFunctionMgr::getFunctionByName(const ::rtl::OUString& _sFunctionName) const
1875*b1cdbd2cSJim Jagielski {
1876*b1cdbd2cSJim Jagielski     return Get(_sFunctionName);
1877*b1cdbd2cSJim Jagielski }
1878*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
fillLastRecentlyUsedFunctions(::std::vector<const formula::IFunctionDescription * > & _rLastRUFunctions) const1879*b1cdbd2cSJim Jagielski void ScFunctionMgr::fillLastRecentlyUsedFunctions(::std::vector< const formula::IFunctionDescription*>& _rLastRUFunctions) const
1880*b1cdbd2cSJim Jagielski {
1881*b1cdbd2cSJim Jagielski #define LRU_MAX 10
1882*b1cdbd2cSJim Jagielski 
1883*b1cdbd2cSJim Jagielski     const ScAppOptions& rAppOpt = SC_MOD()->GetAppOptions();
1884*b1cdbd2cSJim Jagielski 	sal_uInt16 nLRUFuncCount = Min( rAppOpt.GetLRUFuncListCount(), (sal_uInt16)LRU_MAX );
1885*b1cdbd2cSJim Jagielski 	sal_uInt16*	pLRUListIds = rAppOpt.GetLRUFuncList();
1886*b1cdbd2cSJim Jagielski 
1887*b1cdbd2cSJim Jagielski 	if ( pLRUListIds )
1888*b1cdbd2cSJim Jagielski 	{
1889*b1cdbd2cSJim Jagielski 		for ( sal_uInt16 i=0; i<nLRUFuncCount; i++ )
1890*b1cdbd2cSJim Jagielski 			_rLastRUFunctions.push_back( Get( pLRUListIds[i] ) );
1891*b1cdbd2cSJim Jagielski 	}
1892*b1cdbd2cSJim Jagielski }
1893*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
GetCategoryName(sal_uInt32 _nCategoryNumber)1894*b1cdbd2cSJim Jagielski String ScFunctionMgr::GetCategoryName(sal_uInt32 _nCategoryNumber )
1895*b1cdbd2cSJim Jagielski {
1896*b1cdbd2cSJim Jagielski     if ( _nCategoryNumber > SC_FUNCGROUP_COUNT )
1897*b1cdbd2cSJim Jagielski     {
1898*b1cdbd2cSJim Jagielski         DBG_ERROR("Invalid category number!");
1899*b1cdbd2cSJim Jagielski         return String();
1900*b1cdbd2cSJim Jagielski     } // if ( _nCategoryNumber >= SC_FUNCGROUP_COUNT )
1901*b1cdbd2cSJim Jagielski 
1902*b1cdbd2cSJim Jagielski     ::std::auto_ptr<ScResourcePublisher> pCategories( new ScResourcePublisher( ScResId( RID_FUNCTION_CATEGORIES ) ) );
1903*b1cdbd2cSJim Jagielski     return String(ScResId((sal_uInt16)_nCategoryNumber));
1904*b1cdbd2cSJim Jagielski }
getSingleToken(const formula::IFunctionManager::EToken _eToken) const1905*b1cdbd2cSJim Jagielski sal_Unicode ScFunctionMgr::getSingleToken(const formula::IFunctionManager::EToken _eToken) const
1906*b1cdbd2cSJim Jagielski {
1907*b1cdbd2cSJim Jagielski     switch(_eToken)
1908*b1cdbd2cSJim Jagielski     {
1909*b1cdbd2cSJim Jagielski         case eOk:
1910*b1cdbd2cSJim Jagielski             return ScCompiler::GetNativeSymbol(ocOpen).GetChar(0);
1911*b1cdbd2cSJim Jagielski         case eClose:
1912*b1cdbd2cSJim Jagielski             return ScCompiler::GetNativeSymbol(ocClose).GetChar(0);
1913*b1cdbd2cSJim Jagielski         case eSep:
1914*b1cdbd2cSJim Jagielski             return ScCompiler::GetNativeSymbol(ocSep).GetChar(0);
1915*b1cdbd2cSJim Jagielski         case eArrayOpen:
1916*b1cdbd2cSJim Jagielski             return ScCompiler::GetNativeSymbol(ocArrayOpen).GetChar(0);
1917*b1cdbd2cSJim Jagielski         case eArrayClose:
1918*b1cdbd2cSJim Jagielski             return ScCompiler::GetNativeSymbol(ocArrayClose).GetChar(0);
1919*b1cdbd2cSJim Jagielski     } // switch(_eToken)
1920*b1cdbd2cSJim Jagielski     return 0;
1921*b1cdbd2cSJim Jagielski }
1922*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
getCount() const1923*b1cdbd2cSJim Jagielski sal_uInt32 ScFunctionCategory::getCount() const
1924*b1cdbd2cSJim Jagielski {
1925*b1cdbd2cSJim Jagielski     return m_pCategory->Count();
1926*b1cdbd2cSJim Jagielski }
1927*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
getFunctionManager() const1928*b1cdbd2cSJim Jagielski const formula::IFunctionManager* ScFunctionCategory::getFunctionManager() const
1929*b1cdbd2cSJim Jagielski {
1930*b1cdbd2cSJim Jagielski     return m_pMgr;
1931*b1cdbd2cSJim Jagielski }
1932*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
getName() const1933*b1cdbd2cSJim Jagielski ::rtl::OUString ScFunctionCategory::getName() const
1934*b1cdbd2cSJim Jagielski {
1935*b1cdbd2cSJim Jagielski     if ( !m_sName.getLength() )
1936*b1cdbd2cSJim Jagielski         m_sName = ScFunctionMgr::GetCategoryName(m_nCategory+1);
1937*b1cdbd2cSJim Jagielski     return m_sName;
1938*b1cdbd2cSJim Jagielski }
1939*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
getFunction(sal_uInt32 _nPos) const1940*b1cdbd2cSJim Jagielski const formula::IFunctionDescription* ScFunctionCategory::getFunction(sal_uInt32 _nPos) const
1941*b1cdbd2cSJim Jagielski {
1942*b1cdbd2cSJim Jagielski     const ScFuncDesc*	pDesc = NULL;
1943*b1cdbd2cSJim Jagielski     sal_uInt32 i = 0;
1944*b1cdbd2cSJim Jagielski 	for (pDesc = (const ScFuncDesc*)m_pCategory->First(); i < _nPos &&  pDesc; pDesc = (const ScFuncDesc*)m_pCategory->Next(),++i)
1945*b1cdbd2cSJim Jagielski         ;
1946*b1cdbd2cSJim Jagielski 	return pDesc;
1947*b1cdbd2cSJim Jagielski }
1948*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
getNumber() const1949*b1cdbd2cSJim Jagielski sal_uInt32 ScFunctionCategory::getNumber() const
1950*b1cdbd2cSJim Jagielski {
1951*b1cdbd2cSJim Jagielski     return m_nCategory;
1952*b1cdbd2cSJim Jagielski }
1953*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
1954*b1cdbd2cSJim Jagielski 
1955*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
1956*b1cdbd2cSJim Jagielski 
GetpTransliteration()1957*b1cdbd2cSJim Jagielski utl::TransliterationWrapper* ScGlobal::GetpTransliteration() //add by CHINA001
1958*b1cdbd2cSJim Jagielski {
1959*b1cdbd2cSJim Jagielski     if ( !pTransliteration )
1960*b1cdbd2cSJim Jagielski     {
1961*b1cdbd2cSJim Jagielski         const LanguageType eOfficeLanguage = Application::GetSettings().GetLanguage();
1962*b1cdbd2cSJim Jagielski         pTransliteration = new ::utl::TransliterationWrapper(
1963*b1cdbd2cSJim Jagielski             ::comphelper::getProcessServiceFactory(), SC_TRANSLITERATION_IGNORECASE );
1964*b1cdbd2cSJim Jagielski         pTransliteration->loadModuleIfNeeded( eOfficeLanguage );
1965*b1cdbd2cSJim Jagielski     }
1966*b1cdbd2cSJim Jagielski 	DBG_ASSERT(
1967*b1cdbd2cSJim Jagielski 		pTransliteration,
1968*b1cdbd2cSJim Jagielski 		"ScGlobal::GetpTransliteration() called before ScGlobal::Init()");
1969*b1cdbd2cSJim Jagielski 	return pTransliteration;
1970*b1cdbd2cSJim Jagielski }
1971*b1cdbd2cSJim Jagielski 
GetpLocaleData()1972*b1cdbd2cSJim Jagielski const LocaleDataWrapper* ScGlobal::GetpLocaleData()
1973*b1cdbd2cSJim Jagielski {
1974*b1cdbd2cSJim Jagielski 	DBG_ASSERT(
1975*b1cdbd2cSJim Jagielski 		pLocaleData,
1976*b1cdbd2cSJim Jagielski 		"ScGlobal::GetpLocaleData() called before ScGlobal::Init()");
1977*b1cdbd2cSJim Jagielski 	return pLocaleData;
1978*b1cdbd2cSJim Jagielski }
GetCalendar()1979*b1cdbd2cSJim Jagielski CalendarWrapper*     ScGlobal::GetCalendar()
1980*b1cdbd2cSJim Jagielski {
1981*b1cdbd2cSJim Jagielski     if ( !pCalendar )
1982*b1cdbd2cSJim Jagielski     {
1983*b1cdbd2cSJim Jagielski         pCalendar = new CalendarWrapper( ::comphelper::getProcessServiceFactory() );
1984*b1cdbd2cSJim Jagielski 	    pCalendar->loadDefaultCalendar( *GetLocale() );
1985*b1cdbd2cSJim Jagielski     }
1986*b1cdbd2cSJim Jagielski     return pCalendar;
1987*b1cdbd2cSJim Jagielski }
GetCollator()1988*b1cdbd2cSJim Jagielski CollatorWrapper*		ScGlobal::GetCollator()
1989*b1cdbd2cSJim Jagielski {
1990*b1cdbd2cSJim Jagielski     if ( !pCollator )
1991*b1cdbd2cSJim Jagielski     {
1992*b1cdbd2cSJim Jagielski         pCollator = new CollatorWrapper( ::comphelper::getProcessServiceFactory() );
1993*b1cdbd2cSJim Jagielski 	    pCollator->loadDefaultCollator( *GetLocale(), SC_COLLATOR_IGNORES );
1994*b1cdbd2cSJim Jagielski     } // if ( !pCollator )
1995*b1cdbd2cSJim Jagielski     return pCollator;
1996*b1cdbd2cSJim Jagielski }
GetCaseCollator()1997*b1cdbd2cSJim Jagielski CollatorWrapper*		ScGlobal::GetCaseCollator()
1998*b1cdbd2cSJim Jagielski {
1999*b1cdbd2cSJim Jagielski     if ( !pCaseCollator )
2000*b1cdbd2cSJim Jagielski     {
2001*b1cdbd2cSJim Jagielski         pCaseCollator = new CollatorWrapper( ::comphelper::getProcessServiceFactory() );
2002*b1cdbd2cSJim Jagielski 	    pCaseCollator->loadDefaultCollator( *GetLocale(), 0 );
2003*b1cdbd2cSJim Jagielski     } // if ( !pCaseCollator )
2004*b1cdbd2cSJim Jagielski     return pCaseCollator;
2005*b1cdbd2cSJim Jagielski }
GetCaseTransliteration()2006*b1cdbd2cSJim Jagielski ::utl::TransliterationWrapper* ScGlobal::GetCaseTransliteration()
2007*b1cdbd2cSJim Jagielski {
2008*b1cdbd2cSJim Jagielski     if ( !pCaseTransliteration )
2009*b1cdbd2cSJim Jagielski     {
2010*b1cdbd2cSJim Jagielski         const LanguageType eOfficeLanguage = Application::GetSettings().GetLanguage();
2011*b1cdbd2cSJim Jagielski         pCaseTransliteration = new ::utl::TransliterationWrapper(::comphelper::getProcessServiceFactory(), SC_TRANSLITERATION_CASESENSE );
2012*b1cdbd2cSJim Jagielski         pCaseTransliteration->loadModuleIfNeeded( eOfficeLanguage );
2013*b1cdbd2cSJim Jagielski     } // if ( !pCaseTransliteration )
2014*b1cdbd2cSJim Jagielski     return pCaseTransliteration;
2015*b1cdbd2cSJim Jagielski }
GetScIntlWrapper()2016*b1cdbd2cSJim Jagielski IntlWrapper*         ScGlobal::GetScIntlWrapper()
2017*b1cdbd2cSJim Jagielski {
2018*b1cdbd2cSJim Jagielski     if ( !pScIntlWrapper )
2019*b1cdbd2cSJim Jagielski     {
2020*b1cdbd2cSJim Jagielski         pScIntlWrapper = new IntlWrapper( ::comphelper::getProcessServiceFactory(), *GetLocale() );
2021*b1cdbd2cSJim Jagielski     }
2022*b1cdbd2cSJim Jagielski     return pScIntlWrapper;
2023*b1cdbd2cSJim Jagielski }
GetLocale()2024*b1cdbd2cSJim Jagielski ::com::sun::star::lang::Locale*		ScGlobal::GetLocale()
2025*b1cdbd2cSJim Jagielski {
2026*b1cdbd2cSJim Jagielski     if ( !pLocale )
2027*b1cdbd2cSJim Jagielski     {
2028*b1cdbd2cSJim Jagielski         pLocale = new ::com::sun::star::lang::Locale( Application::GetSettings().GetLocale());
2029*b1cdbd2cSJim Jagielski     }
2030*b1cdbd2cSJim Jagielski     return pLocale;
2031*b1cdbd2cSJim Jagielski }
2032*b1cdbd2cSJim Jagielski 
2033