xref: /aoo41x/main/vcl/source/control/longcurr.cxx (revision 9f62ea84)
1*9f62ea84SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*9f62ea84SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*9f62ea84SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*9f62ea84SAndrew Rist  * distributed with this work for additional information
6*9f62ea84SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*9f62ea84SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*9f62ea84SAndrew Rist  * "License"); you may not use this file except in compliance
9*9f62ea84SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*9f62ea84SAndrew Rist  *
11*9f62ea84SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*9f62ea84SAndrew Rist  *
13*9f62ea84SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*9f62ea84SAndrew Rist  * software distributed under the License is distributed on an
15*9f62ea84SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*9f62ea84SAndrew Rist  * KIND, either express or implied.  See the License for the
17*9f62ea84SAndrew Rist  * specific language governing permissions and limitations
18*9f62ea84SAndrew Rist  * under the License.
19*9f62ea84SAndrew Rist  *
20*9f62ea84SAndrew Rist  *************************************************************/
21*9f62ea84SAndrew Rist 
22*9f62ea84SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_vcl.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include <sot/object.hxx>
28cdf0e10cSrcweir #define _TOOLS_BIGINT
29cdf0e10cSrcweir #include <sot/factory.hxx>
30cdf0e10cSrcweir #include <tools/debug.hxx>
31cdf0e10cSrcweir #include <tools/bigint.hxx>
32cdf0e10cSrcweir 
33cdf0e10cSrcweir #include <tools/rc.h>
34cdf0e10cSrcweir 
35cdf0e10cSrcweir #include <vcl/event.hxx>
36cdf0e10cSrcweir #include <vcl/svapp.hxx>
37cdf0e10cSrcweir #include <vcl/longcurr.hxx>
38cdf0e10cSrcweir 
39cdf0e10cSrcweir #include <svdata.hxx>
40cdf0e10cSrcweir 
41cdf0e10cSrcweir #include <unotools/localedatawrapper.hxx>
42cdf0e10cSrcweir 
43cdf0e10cSrcweir 
44cdf0e10cSrcweir // =======================================================================
45cdf0e10cSrcweir 
46cdf0e10cSrcweir #define FORMAT_LONGCURRENCY 	 4
47cdf0e10cSrcweir 
48cdf0e10cSrcweir // =======================================================================
49cdf0e10cSrcweir 
ImplPower10(sal_uInt16 n)50cdf0e10cSrcweir static BigInt ImplPower10( sal_uInt16 n )
51cdf0e10cSrcweir {
52cdf0e10cSrcweir 	sal_uInt16 i;
53cdf0e10cSrcweir 	BigInt	 nValue = 1;
54cdf0e10cSrcweir 
55cdf0e10cSrcweir 	for ( i=0; i < n; i++ )
56cdf0e10cSrcweir 		nValue *= 10;
57cdf0e10cSrcweir 
58cdf0e10cSrcweir 	return nValue;
59cdf0e10cSrcweir }
60cdf0e10cSrcweir 
61cdf0e10cSrcweir // -----------------------------------------------------------------------
62cdf0e10cSrcweir 
ImplGetCurr(const LocaleDataWrapper & rLocaleDataWrapper,const BigInt & rNumber,sal_uInt16 nDigits,const String & rCurrSymbol,sal_Bool bShowThousandSep)63cdf0e10cSrcweir static XubString ImplGetCurr( const LocaleDataWrapper& rLocaleDataWrapper, const BigInt &rNumber, sal_uInt16 nDigits, const String& rCurrSymbol, sal_Bool bShowThousandSep )
64cdf0e10cSrcweir {
65cdf0e10cSrcweir 	DBG_ASSERT( nDigits < 10, "LongCurrency duerfen nur maximal 9 Nachkommastellen haben" );
66cdf0e10cSrcweir 
67cdf0e10cSrcweir 	if ( rNumber.IsZero() || (long)rNumber )
68cdf0e10cSrcweir 		return rLocaleDataWrapper.getCurr( (long)rNumber, nDigits, rCurrSymbol, bShowThousandSep );
69cdf0e10cSrcweir 
70cdf0e10cSrcweir 	BigInt aTmp( ImplPower10( nDigits ) );
71cdf0e10cSrcweir 	BigInt aInteger( rNumber );
72cdf0e10cSrcweir 	aInteger.Abs();
73cdf0e10cSrcweir 	aInteger  /= aTmp;
74cdf0e10cSrcweir 	BigInt aFraction( rNumber );
75cdf0e10cSrcweir 	aFraction.Abs();
76cdf0e10cSrcweir 	aFraction %= aTmp;
77cdf0e10cSrcweir 	if ( !aInteger.IsZero() )
78cdf0e10cSrcweir 	{
79cdf0e10cSrcweir 		aFraction += aTmp;
80cdf0e10cSrcweir 		aTmp	   = 1000000000L;
81cdf0e10cSrcweir 	}
82cdf0e10cSrcweir 	if ( rNumber.IsNeg() )
83cdf0e10cSrcweir 		aFraction *= -1;
84cdf0e10cSrcweir 
85cdf0e10cSrcweir 	XubString aTemplate = rLocaleDataWrapper.getCurr( (long)aFraction, nDigits, rCurrSymbol, bShowThousandSep );
86cdf0e10cSrcweir 	while( !aInteger.IsZero() )
87cdf0e10cSrcweir 	{
88cdf0e10cSrcweir 		aFraction  = aInteger;
89cdf0e10cSrcweir 		aFraction %= aTmp;
90cdf0e10cSrcweir 		aInteger  /= aTmp;
91cdf0e10cSrcweir 		if( !aInteger.IsZero() )
92cdf0e10cSrcweir 			aFraction += aTmp;
93cdf0e10cSrcweir 
94cdf0e10cSrcweir 		XubString aFractionStr = rLocaleDataWrapper.getNum( (long)aFraction, 0 );
95cdf0e10cSrcweir 
96cdf0e10cSrcweir 		xub_StrLen nSPos = aTemplate.Search( '1' );
97cdf0e10cSrcweir 		if ( aFractionStr.Len() == 1 )
98cdf0e10cSrcweir 			aTemplate.SetChar( nSPos, aFractionStr.GetChar( 0 ) );
99cdf0e10cSrcweir 		else
100cdf0e10cSrcweir 		{
101cdf0e10cSrcweir 			aTemplate.Erase( nSPos, 1 );
102cdf0e10cSrcweir 			aTemplate.Insert( aFractionStr, nSPos );
103cdf0e10cSrcweir 		}
104cdf0e10cSrcweir 	}
105cdf0e10cSrcweir 
106cdf0e10cSrcweir 	return aTemplate;
107cdf0e10cSrcweir }
108cdf0e10cSrcweir 
109cdf0e10cSrcweir // -----------------------------------------------------------------------
110cdf0e10cSrcweir 
ImplNumericProcessKeyInput(Edit *,const KeyEvent & rKEvt,sal_Bool bStrictFormat,sal_Bool bThousandSep,const LocaleDataWrapper & rLocaleDataWrapper)111cdf0e10cSrcweir static sal_Bool ImplNumericProcessKeyInput( Edit*, const KeyEvent& rKEvt,
112cdf0e10cSrcweir 										sal_Bool bStrictFormat, sal_Bool bThousandSep,
113cdf0e10cSrcweir 										const LocaleDataWrapper& rLocaleDataWrapper )
114cdf0e10cSrcweir {
115cdf0e10cSrcweir 	if ( !bStrictFormat )
116cdf0e10cSrcweir 		return sal_False;
117cdf0e10cSrcweir 	else
118cdf0e10cSrcweir 	{
119cdf0e10cSrcweir 		sal_Unicode cChar = rKEvt.GetCharCode();
120cdf0e10cSrcweir 		sal_uInt16		nGroup = rKEvt.GetKeyCode().GetGroup();
121cdf0e10cSrcweir 
122cdf0e10cSrcweir 		if ( (nGroup == KEYGROUP_FKEYS) || (nGroup == KEYGROUP_CURSOR) ||
123cdf0e10cSrcweir 			 (nGroup == KEYGROUP_MISC) ||
124cdf0e10cSrcweir 			 ((cChar >= '0') && (cChar <= '9')) ||
125cdf0e10cSrcweir 			 (bThousandSep && (cChar == rLocaleDataWrapper.getNumThousandSep())) ||
126cdf0e10cSrcweir 			 (cChar == rLocaleDataWrapper.getNumDecimalSep() ) ||
127cdf0e10cSrcweir 			 (cChar == '-') )
128cdf0e10cSrcweir 			return sal_False;
129cdf0e10cSrcweir 		else
130cdf0e10cSrcweir 			return sal_True;
131cdf0e10cSrcweir 	}
132cdf0e10cSrcweir }
133cdf0e10cSrcweir 
134cdf0e10cSrcweir // -----------------------------------------------------------------------
135cdf0e10cSrcweir 
ImplNumericGetValue(const XubString & rStr,BigInt & rValue,sal_uInt16 nDecDigits,const LocaleDataWrapper & rLocaleDataWrapper,sal_Bool bCurrency=sal_False)136cdf0e10cSrcweir static sal_Bool ImplNumericGetValue( const XubString& rStr, BigInt& rValue,
137cdf0e10cSrcweir 								 sal_uInt16 nDecDigits, const LocaleDataWrapper& rLocaleDataWrapper,
138cdf0e10cSrcweir 								 sal_Bool bCurrency = sal_False )
139cdf0e10cSrcweir {
140cdf0e10cSrcweir 	XubString	aStr = rStr;
141cdf0e10cSrcweir 	XubString	aStr1;
142cdf0e10cSrcweir 	XubString	aStr2;
143cdf0e10cSrcweir 	sal_uInt16		nDecPos;
144cdf0e10cSrcweir 	sal_Bool		bNegative = sal_False;
145cdf0e10cSrcweir 	xub_StrLen	i;
146cdf0e10cSrcweir 
147cdf0e10cSrcweir 	// Reaktion auf leeren String
148cdf0e10cSrcweir 	if ( !rStr.Len() )
149cdf0e10cSrcweir 		return sal_False;
150cdf0e10cSrcweir 
151cdf0e10cSrcweir 	// Fuehrende und nachfolgende Leerzeichen entfernen
152cdf0e10cSrcweir 	aStr.EraseLeadingAndTrailingChars( ' ' );
153cdf0e10cSrcweir 
154cdf0e10cSrcweir 	// Position des Dezimalpunktes suchen
155cdf0e10cSrcweir 	nDecPos = aStr.Search( rLocaleDataWrapper.getNumDecimalSep() );
156cdf0e10cSrcweir 
157cdf0e10cSrcweir 	if ( nDecPos != STRING_NOTFOUND )
158cdf0e10cSrcweir 	{
159cdf0e10cSrcweir 		aStr1 = aStr.Copy( 0, nDecPos );
160cdf0e10cSrcweir 		aStr2 = aStr.Copy( nDecPos+1 );
161cdf0e10cSrcweir 	}
162cdf0e10cSrcweir 	else
163cdf0e10cSrcweir 		aStr1 = aStr;
164cdf0e10cSrcweir 
165cdf0e10cSrcweir 	// Negativ ?
166cdf0e10cSrcweir 	if ( bCurrency )
167cdf0e10cSrcweir 	{
168cdf0e10cSrcweir 		if ( (aStr.GetChar( 0 ) == '(') && (aStr.GetChar( aStr.Len()-1 ) == ')') )
169cdf0e10cSrcweir 			bNegative = sal_True;
170cdf0e10cSrcweir 		if ( !bNegative )
171cdf0e10cSrcweir 		{
172cdf0e10cSrcweir 			for ( i=0; i < aStr.Len(); i++ )
173cdf0e10cSrcweir 			{
174cdf0e10cSrcweir 				if ( (aStr.GetChar( i ) >= '0') && (aStr.GetChar( i ) <= '9') )
175cdf0e10cSrcweir 					break;
176cdf0e10cSrcweir 				else if ( aStr.GetChar( i ) == '-' )
177cdf0e10cSrcweir 				{
178cdf0e10cSrcweir 					bNegative = sal_True;
179cdf0e10cSrcweir 					break;
180cdf0e10cSrcweir 				}
181cdf0e10cSrcweir 			}
182cdf0e10cSrcweir 		}
183cdf0e10cSrcweir 		if ( !bNegative && bCurrency && aStr.Len() )
184cdf0e10cSrcweir 		{
185cdf0e10cSrcweir 			sal_uInt16 nFormat = rLocaleDataWrapper.getCurrNegativeFormat();
186cdf0e10cSrcweir 			if ( (nFormat == 3) || (nFormat == 6)  ||
187cdf0e10cSrcweir 				 (nFormat == 7) || (nFormat == 10) )
188cdf0e10cSrcweir 			{
189cdf0e10cSrcweir 				for ( i = (sal_uInt16)(aStr.Len()-1); i > 0; i++ )
190cdf0e10cSrcweir 				{
191cdf0e10cSrcweir 					if ( (aStr.GetChar( i ) >= '0') && (aStr.GetChar( i ) <= '9') )
192cdf0e10cSrcweir 						break;
193cdf0e10cSrcweir 					else if ( aStr.GetChar( i ) == '-' )
194cdf0e10cSrcweir 					{
195cdf0e10cSrcweir 						bNegative = sal_True;
196cdf0e10cSrcweir 						break;
197cdf0e10cSrcweir 					}
198cdf0e10cSrcweir 				}
199cdf0e10cSrcweir 			}
200cdf0e10cSrcweir 		}
201cdf0e10cSrcweir 	}
202cdf0e10cSrcweir 	else
203cdf0e10cSrcweir 	{
204cdf0e10cSrcweir 		if ( aStr1.GetChar( 0 ) == '-' )
205cdf0e10cSrcweir 			bNegative = sal_True;
206cdf0e10cSrcweir 	}
207cdf0e10cSrcweir 
208cdf0e10cSrcweir 	// Alle unerwuenschten Zeichen rauswerfen
209cdf0e10cSrcweir 	for ( i=0; i < aStr1.Len(); )
210cdf0e10cSrcweir 	{
211cdf0e10cSrcweir 		if ( (aStr1.GetChar( i ) >= '0') && (aStr1.GetChar( i ) <= '9') )
212cdf0e10cSrcweir 			i++;
213cdf0e10cSrcweir 		else
214cdf0e10cSrcweir 			aStr1.Erase( i, 1 );
215cdf0e10cSrcweir 	}
216cdf0e10cSrcweir 	for ( i=0; i < aStr2.Len(); )
217cdf0e10cSrcweir 	{
218cdf0e10cSrcweir 		if ( (aStr2.GetChar( i ) >= '0') && (aStr2.GetChar( i ) <= '9') )
219cdf0e10cSrcweir 			i++;
220cdf0e10cSrcweir 		else
221cdf0e10cSrcweir 			aStr2.Erase( i, 1 );
222cdf0e10cSrcweir 	}
223cdf0e10cSrcweir 
224cdf0e10cSrcweir 	if ( !aStr1.Len() && !aStr2.Len() )
225cdf0e10cSrcweir 		return sal_False;
226cdf0e10cSrcweir 
227cdf0e10cSrcweir 	if ( !aStr1.Len() )
228cdf0e10cSrcweir 		aStr1.Insert( '0' );
229cdf0e10cSrcweir 	if ( bNegative )
230cdf0e10cSrcweir 		aStr1.Insert( '-', 0 );
231cdf0e10cSrcweir 
232cdf0e10cSrcweir 	// Nachkommateil zurechtstutzen und dabei runden
233cdf0e10cSrcweir 	sal_Bool bRound = sal_False;
234cdf0e10cSrcweir 	if ( aStr2.Len() > nDecDigits )
235cdf0e10cSrcweir 	{
236cdf0e10cSrcweir 		if ( aStr2.GetChar( nDecDigits ) >= '5' )
237cdf0e10cSrcweir 			bRound = sal_True;
238cdf0e10cSrcweir 		aStr2.Erase( nDecDigits );
239cdf0e10cSrcweir 	}
240cdf0e10cSrcweir 	if ( aStr2.Len() < nDecDigits )
241cdf0e10cSrcweir 		aStr2.Expand( nDecDigits, '0' );
242cdf0e10cSrcweir 
243cdf0e10cSrcweir 	aStr  = aStr1;
244cdf0e10cSrcweir 	aStr += aStr2;
245cdf0e10cSrcweir 
246cdf0e10cSrcweir 	// Bereichsueberpruefung
247cdf0e10cSrcweir 	BigInt nValue( aStr );
248cdf0e10cSrcweir 	if ( bRound )
249cdf0e10cSrcweir 	{
250cdf0e10cSrcweir 		if ( !bNegative )
251cdf0e10cSrcweir 			nValue+=1;
252cdf0e10cSrcweir 		else
253cdf0e10cSrcweir 			nValue-=1;
254cdf0e10cSrcweir 	}
255cdf0e10cSrcweir 
256cdf0e10cSrcweir 	rValue = nValue;
257cdf0e10cSrcweir 
258cdf0e10cSrcweir 	return sal_True;
259cdf0e10cSrcweir }
260cdf0e10cSrcweir 
261cdf0e10cSrcweir // =======================================================================
262cdf0e10cSrcweir 
ImplLongCurrencyProcessKeyInput(Edit * pEdit,const KeyEvent & rKEvt,sal_Bool,sal_Bool bUseThousandSep,const LocaleDataWrapper & rLocaleDataWrapper)263cdf0e10cSrcweir static sal_Bool ImplLongCurrencyProcessKeyInput( Edit* pEdit, const KeyEvent& rKEvt,
264cdf0e10cSrcweir 											 sal_Bool, sal_Bool bUseThousandSep, const LocaleDataWrapper& rLocaleDataWrapper )
265cdf0e10cSrcweir {
266cdf0e10cSrcweir 	// Es gibt hier kein sinnvolles StrictFormat, also alle
267cdf0e10cSrcweir 	// Zeichen erlauben
268cdf0e10cSrcweir 	return ImplNumericProcessKeyInput( pEdit, rKEvt, sal_False, bUseThousandSep, rLocaleDataWrapper  );
269cdf0e10cSrcweir }
270cdf0e10cSrcweir 
271cdf0e10cSrcweir // -----------------------------------------------------------------------
272cdf0e10cSrcweir 
ImplLongCurrencyGetValue(const XubString & rStr,BigInt & rValue,sal_uInt16 nDecDigits,const LocaleDataWrapper & rLocaleDataWrapper)273cdf0e10cSrcweir inline sal_Bool ImplLongCurrencyGetValue( const XubString& rStr, BigInt& rValue,
274cdf0e10cSrcweir 									  sal_uInt16 nDecDigits, const LocaleDataWrapper& rLocaleDataWrapper )
275cdf0e10cSrcweir {
276cdf0e10cSrcweir 	// Zahlenwert holen
277cdf0e10cSrcweir 	return ImplNumericGetValue( rStr, rValue, nDecDigits, rLocaleDataWrapper, sal_True );
278cdf0e10cSrcweir }
279cdf0e10cSrcweir 
280cdf0e10cSrcweir // -----------------------------------------------------------------------
281cdf0e10cSrcweir 
ImplLongCurrencyReformat(const XubString & rStr,BigInt nMin,BigInt nMax,sal_uInt16 nDecDigits,const LocaleDataWrapper & rLocaleDataWrapper,String & rOutStr,LongCurrencyFormatter & rFormatter)282cdf0e10cSrcweir sal_Bool ImplLongCurrencyReformat( const XubString& rStr, BigInt nMin, BigInt nMax,
283cdf0e10cSrcweir 							   sal_uInt16 nDecDigits,
284cdf0e10cSrcweir 							   const LocaleDataWrapper& rLocaleDataWrapper, String& rOutStr,
285cdf0e10cSrcweir 							   LongCurrencyFormatter& rFormatter )
286cdf0e10cSrcweir {
287cdf0e10cSrcweir 	BigInt nValue;
288cdf0e10cSrcweir 	if ( !ImplNumericGetValue( rStr, nValue, nDecDigits, rLocaleDataWrapper, sal_True ) )
289cdf0e10cSrcweir 		return sal_True;
290cdf0e10cSrcweir 	else
291cdf0e10cSrcweir 	{
292cdf0e10cSrcweir 		BigInt nTempVal = nValue;
293cdf0e10cSrcweir 		if ( nTempVal > nMax )
294cdf0e10cSrcweir 			nTempVal = nMax;
295cdf0e10cSrcweir 		else if ( nTempVal < nMin )
296cdf0e10cSrcweir 			nTempVal = nMin;
297cdf0e10cSrcweir 
298cdf0e10cSrcweir 		if ( rFormatter.GetErrorHdl().IsSet() && (nValue != nTempVal) )
299cdf0e10cSrcweir 		{
300cdf0e10cSrcweir             rFormatter.mnCorrectedValue = nTempVal;
301cdf0e10cSrcweir 			if ( !rFormatter.GetErrorHdl().Call( &rFormatter ) )
302cdf0e10cSrcweir 			{
303cdf0e10cSrcweir                 rFormatter.mnCorrectedValue = 0;
304cdf0e10cSrcweir 				return sal_False;
305cdf0e10cSrcweir 			}
306cdf0e10cSrcweir 			else
307cdf0e10cSrcweir             {
308cdf0e10cSrcweir                 rFormatter.mnCorrectedValue = 0;
309cdf0e10cSrcweir             }
310cdf0e10cSrcweir 		}
311cdf0e10cSrcweir 
312cdf0e10cSrcweir 		rOutStr = ImplGetCurr( rLocaleDataWrapper, nTempVal, nDecDigits, rFormatter.GetCurrencySymbol(), rFormatter.IsUseThousandSep() );
313cdf0e10cSrcweir 		return sal_True;
314cdf0e10cSrcweir 	}
315cdf0e10cSrcweir }
316cdf0e10cSrcweir 
317cdf0e10cSrcweir 
318cdf0e10cSrcweir // =======================================================================
319cdf0e10cSrcweir 
ImpInit()320cdf0e10cSrcweir void LongCurrencyFormatter::ImpInit()
321cdf0e10cSrcweir {
322cdf0e10cSrcweir 	mnFieldValue		= 0;
323cdf0e10cSrcweir 	mnLastValue 		= 0;
324cdf0e10cSrcweir 	mnMin				= 0;
325cdf0e10cSrcweir 	mnMax				= 0x7FFFFFFF;
326cdf0e10cSrcweir 	mnMax			   *= 0x7FFFFFFF;
327cdf0e10cSrcweir 	mnCorrectedValue	= 0;
328cdf0e10cSrcweir     mnDecimalDigits     = 0;
329cdf0e10cSrcweir 	mnType				= FORMAT_LONGCURRENCY;
330cdf0e10cSrcweir     mbThousandSep       = sal_True;
331cdf0e10cSrcweir 	SetDecimalDigits( 0 );
332cdf0e10cSrcweir }
333cdf0e10cSrcweir 
334cdf0e10cSrcweir // -----------------------------------------------------------------------
335cdf0e10cSrcweir 
LongCurrencyFormatter()336cdf0e10cSrcweir LongCurrencyFormatter::LongCurrencyFormatter()
337cdf0e10cSrcweir {
338cdf0e10cSrcweir 	ImpInit();
339cdf0e10cSrcweir }
340cdf0e10cSrcweir 
341cdf0e10cSrcweir // -----------------------------------------------------------------------
342cdf0e10cSrcweir 
ImplLoadRes(const ResId & rResId)343cdf0e10cSrcweir void LongCurrencyFormatter::ImplLoadRes( const ResId& rResId )
344cdf0e10cSrcweir {
345cdf0e10cSrcweir 	ImpInit();
346cdf0e10cSrcweir 
347cdf0e10cSrcweir 	ResMgr* 	pMgr = rResId.GetResMgr();
348cdf0e10cSrcweir     if( pMgr )
349cdf0e10cSrcweir     {
350cdf0e10cSrcweir         sal_uLong		nMask = pMgr->ReadLong();
351cdf0e10cSrcweir 
352cdf0e10cSrcweir         if ( NUMERICFORMATTER_MIN & nMask )
353cdf0e10cSrcweir             mnMin = pMgr->ReadLong();
354cdf0e10cSrcweir 
355cdf0e10cSrcweir         if ( NUMERICFORMATTER_MAX & nMask )
356cdf0e10cSrcweir             mnMax = pMgr->ReadLong();
357cdf0e10cSrcweir 
358cdf0e10cSrcweir         if ( NUMERICFORMATTER_STRICTFORMAT & nMask )
359cdf0e10cSrcweir             SetStrictFormat(  (sal_Bool)pMgr->ReadShort() );
360cdf0e10cSrcweir 
361cdf0e10cSrcweir         if ( NUMERICFORMATTER_DECIMALDIGITS & nMask )
362cdf0e10cSrcweir             SetDecimalDigits( pMgr->ReadShort() );
363cdf0e10cSrcweir 
364cdf0e10cSrcweir         if ( NUMERICFORMATTER_VALUE & nMask )
365cdf0e10cSrcweir         {
366cdf0e10cSrcweir             mnFieldValue = pMgr->ReadLong();
367cdf0e10cSrcweir             if ( mnFieldValue > mnMax )
368cdf0e10cSrcweir                 mnFieldValue = mnMax;
369cdf0e10cSrcweir             else if ( mnFieldValue < mnMin )
370cdf0e10cSrcweir                 mnFieldValue = mnMin;
371cdf0e10cSrcweir             mnLastValue = mnFieldValue;
372cdf0e10cSrcweir         }
373cdf0e10cSrcweir     }
374cdf0e10cSrcweir }
375cdf0e10cSrcweir 
376cdf0e10cSrcweir // -----------------------------------------------------------------------
377cdf0e10cSrcweir 
~LongCurrencyFormatter()378cdf0e10cSrcweir LongCurrencyFormatter::~LongCurrencyFormatter()
379cdf0e10cSrcweir {
380cdf0e10cSrcweir }
381cdf0e10cSrcweir 
382cdf0e10cSrcweir // -----------------------------------------------------------------------
383cdf0e10cSrcweir 
SetCurrencySymbol(const String & rStr)384cdf0e10cSrcweir void LongCurrencyFormatter::SetCurrencySymbol( const String& rStr )
385cdf0e10cSrcweir {
386cdf0e10cSrcweir     maCurrencySymbol= rStr;
387cdf0e10cSrcweir     ReformatAll();
388cdf0e10cSrcweir }
389cdf0e10cSrcweir 
390cdf0e10cSrcweir // -----------------------------------------------------------------------
391cdf0e10cSrcweir 
GetCurrencySymbol() const392cdf0e10cSrcweir String LongCurrencyFormatter::GetCurrencySymbol() const
393cdf0e10cSrcweir {
394cdf0e10cSrcweir     return maCurrencySymbol.Len() ? maCurrencySymbol : GetLocaleDataWrapper().getCurrSymbol();
395cdf0e10cSrcweir }
396cdf0e10cSrcweir 
397cdf0e10cSrcweir // -----------------------------------------------------------------------
398cdf0e10cSrcweir 
SetValue(BigInt nNewValue)399cdf0e10cSrcweir void LongCurrencyFormatter::SetValue( BigInt nNewValue )
400cdf0e10cSrcweir {
401cdf0e10cSrcweir 	SetUserValue( nNewValue );
402cdf0e10cSrcweir 	mnFieldValue = mnLastValue;
403cdf0e10cSrcweir 	SetEmptyFieldValueData( sal_False );
404cdf0e10cSrcweir }
405cdf0e10cSrcweir 
406cdf0e10cSrcweir // -----------------------------------------------------------------------
407cdf0e10cSrcweir 
SetUserValue(BigInt nNewValue)408cdf0e10cSrcweir void LongCurrencyFormatter::SetUserValue( BigInt nNewValue )
409cdf0e10cSrcweir {
410cdf0e10cSrcweir 	if ( nNewValue > mnMax )
411cdf0e10cSrcweir 		nNewValue = mnMax;
412cdf0e10cSrcweir 	else if ( nNewValue < mnMin )
413cdf0e10cSrcweir 		nNewValue = mnMin;
414cdf0e10cSrcweir 	mnLastValue = nNewValue;
415cdf0e10cSrcweir 
416cdf0e10cSrcweir 	if ( !GetField() )
417cdf0e10cSrcweir 		return;
418cdf0e10cSrcweir 
419cdf0e10cSrcweir 	XubString aStr = ImplGetCurr( GetLocaleDataWrapper(), nNewValue, GetDecimalDigits(), GetCurrencySymbol(), IsUseThousandSep() );
420cdf0e10cSrcweir 	if ( GetField()->HasFocus() )
421cdf0e10cSrcweir 	{
422cdf0e10cSrcweir 		Selection aSelection = GetField()->GetSelection();
423cdf0e10cSrcweir 		GetField()->SetText( aStr );
424cdf0e10cSrcweir 		GetField()->SetSelection( aSelection );
425cdf0e10cSrcweir 	}
426cdf0e10cSrcweir 	else
427cdf0e10cSrcweir 		GetField()->SetText( aStr );
428cdf0e10cSrcweir 	MarkToBeReformatted( sal_False );
429cdf0e10cSrcweir }
430cdf0e10cSrcweir 
431cdf0e10cSrcweir // -----------------------------------------------------------------------
432cdf0e10cSrcweir 
GetValue() const433cdf0e10cSrcweir BigInt LongCurrencyFormatter::GetValue() const
434cdf0e10cSrcweir {
435cdf0e10cSrcweir 	if ( !GetField() )
436cdf0e10cSrcweir 		return 0;
437cdf0e10cSrcweir 
438cdf0e10cSrcweir 	BigInt nTempValue;
439cdf0e10cSrcweir 	if ( ImplLongCurrencyGetValue( GetField()->GetText(), nTempValue, GetDecimalDigits(), GetLocaleDataWrapper() ) )
440cdf0e10cSrcweir 	{
441cdf0e10cSrcweir 		if ( nTempValue > mnMax )
442cdf0e10cSrcweir 			nTempValue = mnMax;
443cdf0e10cSrcweir 		else if ( nTempValue < mnMin )
444cdf0e10cSrcweir 			nTempValue = mnMin;
445cdf0e10cSrcweir 		return nTempValue;
446cdf0e10cSrcweir 	}
447cdf0e10cSrcweir 	else
448cdf0e10cSrcweir 		return mnLastValue;
449cdf0e10cSrcweir }
450cdf0e10cSrcweir 
451cdf0e10cSrcweir // -----------------------------------------------------------------------
452cdf0e10cSrcweir 
Reformat()453cdf0e10cSrcweir void LongCurrencyFormatter::Reformat()
454cdf0e10cSrcweir {
455cdf0e10cSrcweir 	if ( !GetField() )
456cdf0e10cSrcweir 		return;
457cdf0e10cSrcweir 
458cdf0e10cSrcweir 	if ( !GetField()->GetText().Len() && ImplGetEmptyFieldValue() )
459cdf0e10cSrcweir 		return;
460cdf0e10cSrcweir 
461cdf0e10cSrcweir 	XubString aStr;
462cdf0e10cSrcweir 	sal_Bool bOK = ImplLongCurrencyReformat( GetField()->GetText(), mnMin, mnMax,
463cdf0e10cSrcweir 										 GetDecimalDigits(), GetLocaleDataWrapper(), aStr, *this );
464cdf0e10cSrcweir 	if ( !bOK )
465cdf0e10cSrcweir 		return;
466cdf0e10cSrcweir 
467cdf0e10cSrcweir 	if ( aStr.Len() )
468cdf0e10cSrcweir 	{
469cdf0e10cSrcweir 		GetField()->SetText( aStr );
470cdf0e10cSrcweir 		MarkToBeReformatted( sal_False );
471cdf0e10cSrcweir 		ImplLongCurrencyGetValue( aStr, mnLastValue, GetDecimalDigits(), GetLocaleDataWrapper() );
472cdf0e10cSrcweir 	}
473cdf0e10cSrcweir 	else
474cdf0e10cSrcweir 		SetValue( mnLastValue );
475cdf0e10cSrcweir }
476cdf0e10cSrcweir 
477cdf0e10cSrcweir // -----------------------------------------------------------------------
478cdf0e10cSrcweir 
ReformatAll()479cdf0e10cSrcweir void LongCurrencyFormatter::ReformatAll()
480cdf0e10cSrcweir {
481cdf0e10cSrcweir 	Reformat();
482cdf0e10cSrcweir }
483cdf0e10cSrcweir 
484cdf0e10cSrcweir // -----------------------------------------------------------------------
485cdf0e10cSrcweir 
SetMin(BigInt nNewMin)486cdf0e10cSrcweir void LongCurrencyFormatter::SetMin( BigInt nNewMin )
487cdf0e10cSrcweir {
488cdf0e10cSrcweir 	mnMin = nNewMin;
489cdf0e10cSrcweir 	ReformatAll();
490cdf0e10cSrcweir }
491cdf0e10cSrcweir 
492cdf0e10cSrcweir // -----------------------------------------------------------------------
493cdf0e10cSrcweir 
SetMax(BigInt nNewMax)494cdf0e10cSrcweir void LongCurrencyFormatter::SetMax( BigInt nNewMax )
495cdf0e10cSrcweir {
496cdf0e10cSrcweir 	mnMax = nNewMax;
497cdf0e10cSrcweir 	ReformatAll();
498cdf0e10cSrcweir }
499cdf0e10cSrcweir 
500cdf0e10cSrcweir // -----------------------------------------------------------------------
501cdf0e10cSrcweir 
SetUseThousandSep(sal_Bool b)502cdf0e10cSrcweir void LongCurrencyFormatter::SetUseThousandSep( sal_Bool b )
503cdf0e10cSrcweir {
504cdf0e10cSrcweir     mbThousandSep = b;
505cdf0e10cSrcweir     ReformatAll();
506cdf0e10cSrcweir }
507cdf0e10cSrcweir 
508cdf0e10cSrcweir 
509cdf0e10cSrcweir // -----------------------------------------------------------------------
510cdf0e10cSrcweir 
SetDecimalDigits(sal_uInt16 nDigits)511cdf0e10cSrcweir void LongCurrencyFormatter::SetDecimalDigits( sal_uInt16 nDigits )
512cdf0e10cSrcweir {
513cdf0e10cSrcweir //	DBG_ASSERT( nDigits < 10, "LongCurrency duerfen nur maximal 9 Nachkommastellen haben" );
514cdf0e10cSrcweir 
515cdf0e10cSrcweir 	if ( nDigits > 9 )
516cdf0e10cSrcweir 		nDigits = 9;
517cdf0e10cSrcweir 
518cdf0e10cSrcweir 	mnDecimalDigits = nDigits;
519cdf0e10cSrcweir 	ReformatAll();
520cdf0e10cSrcweir }
521cdf0e10cSrcweir 
522cdf0e10cSrcweir // -----------------------------------------------------------------------
523cdf0e10cSrcweir 
GetDecimalDigits() const524cdf0e10cSrcweir sal_uInt16 LongCurrencyFormatter::GetDecimalDigits() const
525cdf0e10cSrcweir {
526cdf0e10cSrcweir 	return mnDecimalDigits;
527cdf0e10cSrcweir }
528cdf0e10cSrcweir 
529cdf0e10cSrcweir // -----------------------------------------------------------------------
530cdf0e10cSrcweir 
IsValueModified() const531cdf0e10cSrcweir sal_Bool LongCurrencyFormatter::IsValueModified() const
532cdf0e10cSrcweir {
533cdf0e10cSrcweir 	if ( ImplGetEmptyFieldValue() )
534cdf0e10cSrcweir 		return !IsEmptyValue();
535cdf0e10cSrcweir 	else if ( GetValue() != mnFieldValue )
536cdf0e10cSrcweir 		return sal_True;
537cdf0e10cSrcweir 	else
538cdf0e10cSrcweir 		return sal_False;
539cdf0e10cSrcweir }
540cdf0e10cSrcweir 
541cdf0e10cSrcweir // -----------------------------------------------------------------------
542cdf0e10cSrcweir 
SetEmptyValue()543cdf0e10cSrcweir void LongCurrencyFormatter::SetEmptyValue()
544cdf0e10cSrcweir {
545cdf0e10cSrcweir 	GetField()->SetText( ImplGetSVEmptyStr() );
546cdf0e10cSrcweir 	SetEmptyFieldValueData( sal_True );
547cdf0e10cSrcweir }
548cdf0e10cSrcweir 
549cdf0e10cSrcweir // -----------------------------------------------------------------------
550cdf0e10cSrcweir 
Normalize(BigInt nValue) const551cdf0e10cSrcweir BigInt LongCurrencyFormatter::Normalize( BigInt nValue ) const
552cdf0e10cSrcweir {
553cdf0e10cSrcweir 	return (nValue * ImplPower10( GetDecimalDigits() ) );
554cdf0e10cSrcweir }
555cdf0e10cSrcweir 
556cdf0e10cSrcweir // -----------------------------------------------------------------------
557cdf0e10cSrcweir 
Denormalize(BigInt nValue) const558cdf0e10cSrcweir BigInt LongCurrencyFormatter::Denormalize( BigInt nValue ) const
559cdf0e10cSrcweir {
560cdf0e10cSrcweir 	BigInt nFactor = ImplPower10( GetDecimalDigits() );
561cdf0e10cSrcweir 	BigInt nTmp    = nFactor;
562cdf0e10cSrcweir 	nTmp /= 2;
563cdf0e10cSrcweir 	nTmp += nValue;
564cdf0e10cSrcweir 	nTmp /= nFactor;
565cdf0e10cSrcweir 	return nTmp;
566cdf0e10cSrcweir }
567cdf0e10cSrcweir 
568cdf0e10cSrcweir // =======================================================================
569cdf0e10cSrcweir 
ImplNewLongCurrencyFieldValue(LongCurrencyField * pField,BigInt nNewValue)570cdf0e10cSrcweir void ImplNewLongCurrencyFieldValue( LongCurrencyField* pField, BigInt nNewValue )
571cdf0e10cSrcweir {
572cdf0e10cSrcweir 	Selection aSelect = pField->GetSelection();
573cdf0e10cSrcweir 	aSelect.Justify();
574cdf0e10cSrcweir 	XubString aText = pField->GetText();
575cdf0e10cSrcweir 	sal_Bool bLastSelected = ((xub_StrLen)aSelect.Max() == aText.Len()) ? sal_True : sal_False;
576cdf0e10cSrcweir 
577cdf0e10cSrcweir 	BigInt nOldLastValue  = pField->mnLastValue;
578cdf0e10cSrcweir 	pField->SetUserValue( nNewValue );
579cdf0e10cSrcweir 	pField->mnLastValue  = nOldLastValue;
580cdf0e10cSrcweir 
581cdf0e10cSrcweir 	if ( bLastSelected )
582cdf0e10cSrcweir 	{
583cdf0e10cSrcweir 		if ( !aSelect.Len() )
584cdf0e10cSrcweir 			aSelect.Min() = SELECTION_MAX;
585cdf0e10cSrcweir 		aSelect.Max() = SELECTION_MAX;
586cdf0e10cSrcweir 	}
587cdf0e10cSrcweir 	pField->SetSelection( aSelect );
588cdf0e10cSrcweir 	pField->SetModifyFlag();
589cdf0e10cSrcweir 	pField->Modify();
590cdf0e10cSrcweir }
591cdf0e10cSrcweir 
592cdf0e10cSrcweir // =======================================================================
593cdf0e10cSrcweir 
LongCurrencyField(Window * pParent,WinBits nWinStyle)594cdf0e10cSrcweir LongCurrencyField::LongCurrencyField( Window* pParent, WinBits nWinStyle ) :
595cdf0e10cSrcweir 	SpinField( pParent, nWinStyle )
596cdf0e10cSrcweir {
597cdf0e10cSrcweir 	SetField( this );
598cdf0e10cSrcweir 	mnSpinSize	 = 1;
599cdf0e10cSrcweir 	mnFirst 	 = mnMin;
600cdf0e10cSrcweir 	mnLast		 = mnMax;
601cdf0e10cSrcweir 
602cdf0e10cSrcweir 	Reformat();
603cdf0e10cSrcweir }
604cdf0e10cSrcweir 
605cdf0e10cSrcweir // -----------------------------------------------------------------------
606cdf0e10cSrcweir 
LongCurrencyField(Window * pParent,const ResId & rResId)607cdf0e10cSrcweir LongCurrencyField::LongCurrencyField( Window* pParent, const ResId& rResId ) :
608cdf0e10cSrcweir 	SpinField( WINDOW_NUMERICFIELD )
609cdf0e10cSrcweir {
610cdf0e10cSrcweir 	rResId.SetRT( RSC_NUMERICFIELD );
611cdf0e10cSrcweir 	WinBits nStyle = ImplInitRes( rResId ) ;
612cdf0e10cSrcweir 	SpinField::ImplInit( pParent, nStyle );
613cdf0e10cSrcweir 
614cdf0e10cSrcweir 	SetField( this );
615cdf0e10cSrcweir 	mnSpinSize	 = 1;
616cdf0e10cSrcweir 	mnFirst 	 = mnMin;
617cdf0e10cSrcweir 	mnLast		 = mnMax;
618cdf0e10cSrcweir 
619cdf0e10cSrcweir 	Reformat();
620cdf0e10cSrcweir 
621cdf0e10cSrcweir 	if ( !(nStyle & WB_HIDE) )
622cdf0e10cSrcweir 		Show();
623cdf0e10cSrcweir }
624cdf0e10cSrcweir 
625cdf0e10cSrcweir // -----------------------------------------------------------------------
626cdf0e10cSrcweir 
ImplLoadRes(const ResId & rResId)627cdf0e10cSrcweir void LongCurrencyField::ImplLoadRes( const ResId& rResId )
628cdf0e10cSrcweir {
629cdf0e10cSrcweir 	SpinField::ImplLoadRes( rResId );
630cdf0e10cSrcweir 	LongCurrencyFormatter::ImplLoadRes( ResId( (RSHEADER_TYPE *)GetClassRes(), *rResId.GetResMgr() ) );
631cdf0e10cSrcweir 
632cdf0e10cSrcweir 	sal_uLong nMask = ReadLongRes();
633cdf0e10cSrcweir 	if ( CURRENCYFIELD_FIRST & nMask )
634cdf0e10cSrcweir 		mnFirst = ReadLongRes();
635cdf0e10cSrcweir 
636cdf0e10cSrcweir 	if ( CURRENCYFIELD_LAST & nMask )
637cdf0e10cSrcweir 		mnLast = ReadLongRes();
638cdf0e10cSrcweir 
639cdf0e10cSrcweir 	if ( CURRENCYFIELD_SPINSIZE & nMask )
640cdf0e10cSrcweir 		mnSpinSize = ReadLongRes();
641cdf0e10cSrcweir }
642cdf0e10cSrcweir 
643cdf0e10cSrcweir // -----------------------------------------------------------------------
644cdf0e10cSrcweir 
~LongCurrencyField()645cdf0e10cSrcweir LongCurrencyField::~LongCurrencyField()
646cdf0e10cSrcweir {
647cdf0e10cSrcweir }
648cdf0e10cSrcweir 
649cdf0e10cSrcweir // -----------------------------------------------------------------------
650cdf0e10cSrcweir 
PreNotify(NotifyEvent & rNEvt)651cdf0e10cSrcweir long LongCurrencyField::PreNotify( NotifyEvent& rNEvt )
652cdf0e10cSrcweir {
653cdf0e10cSrcweir 	if( rNEvt.GetType() == EVENT_KEYINPUT )
654cdf0e10cSrcweir 	{
655cdf0e10cSrcweir 		if ( ImplLongCurrencyProcessKeyInput( GetField(), *rNEvt.GetKeyEvent(), IsStrictFormat(), IsUseThousandSep(), GetLocaleDataWrapper() ) )
656cdf0e10cSrcweir 			return 1;
657cdf0e10cSrcweir 	}
658cdf0e10cSrcweir 	return SpinField::PreNotify( rNEvt );
659cdf0e10cSrcweir }
660cdf0e10cSrcweir 
661cdf0e10cSrcweir // -----------------------------------------------------------------------
662cdf0e10cSrcweir 
Notify(NotifyEvent & rNEvt)663cdf0e10cSrcweir long LongCurrencyField::Notify( NotifyEvent& rNEvt )
664cdf0e10cSrcweir {
665cdf0e10cSrcweir 	if( rNEvt.GetType() == EVENT_GETFOCUS )
666cdf0e10cSrcweir 	{
667cdf0e10cSrcweir 		MarkToBeReformatted( sal_False );
668cdf0e10cSrcweir 	}
669cdf0e10cSrcweir 	else if( rNEvt.GetType() == EVENT_LOSEFOCUS )
670cdf0e10cSrcweir 	{
671cdf0e10cSrcweir 		if ( MustBeReformatted() )
672cdf0e10cSrcweir 		{
673cdf0e10cSrcweir 			Reformat();
674cdf0e10cSrcweir 			SpinField::Modify();
675cdf0e10cSrcweir 		}
676cdf0e10cSrcweir 	}
677cdf0e10cSrcweir 	return SpinField::Notify( rNEvt );
678cdf0e10cSrcweir }
679cdf0e10cSrcweir 
680cdf0e10cSrcweir // -----------------------------------------------------------------------
681cdf0e10cSrcweir 
Modify()682cdf0e10cSrcweir void LongCurrencyField::Modify()
683cdf0e10cSrcweir {
684cdf0e10cSrcweir 	MarkToBeReformatted( sal_True );
685cdf0e10cSrcweir 	SpinField::Modify();
686cdf0e10cSrcweir }
687cdf0e10cSrcweir 
688cdf0e10cSrcweir // -----------------------------------------------------------------------
689cdf0e10cSrcweir 
Up()690cdf0e10cSrcweir void LongCurrencyField::Up()
691cdf0e10cSrcweir {
692cdf0e10cSrcweir 	BigInt nValue = GetValue();
693cdf0e10cSrcweir 	nValue += mnSpinSize;
694cdf0e10cSrcweir 	if ( nValue > mnMax )
695cdf0e10cSrcweir 		nValue = mnMax;
696cdf0e10cSrcweir 
697cdf0e10cSrcweir 	ImplNewLongCurrencyFieldValue( this, nValue );
698cdf0e10cSrcweir 	SpinField::Up();
699cdf0e10cSrcweir }
700cdf0e10cSrcweir 
701cdf0e10cSrcweir // -----------------------------------------------------------------------
702cdf0e10cSrcweir 
Down()703cdf0e10cSrcweir void LongCurrencyField::Down()
704cdf0e10cSrcweir {
705cdf0e10cSrcweir 	BigInt nValue = GetValue();
706cdf0e10cSrcweir 	nValue -= mnSpinSize;
707cdf0e10cSrcweir 	if ( nValue < mnMin )
708cdf0e10cSrcweir 		nValue = mnMin;
709cdf0e10cSrcweir 
710cdf0e10cSrcweir 	ImplNewLongCurrencyFieldValue( this, nValue );
711cdf0e10cSrcweir 	SpinField::Down();
712cdf0e10cSrcweir }
713cdf0e10cSrcweir 
714cdf0e10cSrcweir // -----------------------------------------------------------------------
715cdf0e10cSrcweir 
First()716cdf0e10cSrcweir void LongCurrencyField::First()
717cdf0e10cSrcweir {
718cdf0e10cSrcweir 	ImplNewLongCurrencyFieldValue( this, mnFirst );
719cdf0e10cSrcweir 	SpinField::First();
720cdf0e10cSrcweir }
721cdf0e10cSrcweir 
722cdf0e10cSrcweir // -----------------------------------------------------------------------
723cdf0e10cSrcweir 
Last()724cdf0e10cSrcweir void LongCurrencyField::Last()
725cdf0e10cSrcweir {
726cdf0e10cSrcweir 	ImplNewLongCurrencyFieldValue( this, mnLast );
727cdf0e10cSrcweir 	SpinField::Last();
728cdf0e10cSrcweir }
729cdf0e10cSrcweir 
730cdf0e10cSrcweir // =======================================================================
731cdf0e10cSrcweir 
LongCurrencyBox(Window * pParent,WinBits nWinStyle)732cdf0e10cSrcweir LongCurrencyBox::LongCurrencyBox( Window* pParent, WinBits nWinStyle ) :
733cdf0e10cSrcweir 	ComboBox( pParent, nWinStyle )
734cdf0e10cSrcweir {
735cdf0e10cSrcweir 	SetField( this );
736cdf0e10cSrcweir 	Reformat();
737cdf0e10cSrcweir }
738cdf0e10cSrcweir 
739cdf0e10cSrcweir // -----------------------------------------------------------------------
740cdf0e10cSrcweir 
LongCurrencyBox(Window * pParent,const ResId & rResId)741cdf0e10cSrcweir LongCurrencyBox::LongCurrencyBox( Window* pParent, const ResId& rResId ) :
742cdf0e10cSrcweir 	ComboBox( WINDOW_NUMERICFIELD )
743cdf0e10cSrcweir {
744cdf0e10cSrcweir 	SetField( this );
745cdf0e10cSrcweir 	WinBits nStyle = ImplInitRes( rResId ) ;
746cdf0e10cSrcweir 	ComboBox::ImplLoadRes( rResId );
747cdf0e10cSrcweir     ImplInit( pParent, nStyle );
748cdf0e10cSrcweir 	LongCurrencyFormatter::ImplLoadRes( rResId );
749cdf0e10cSrcweir 	Reformat();
750cdf0e10cSrcweir 
751cdf0e10cSrcweir 	if ( !(nStyle & WB_HIDE) )
752cdf0e10cSrcweir 		Show();
753cdf0e10cSrcweir }
754cdf0e10cSrcweir 
755cdf0e10cSrcweir // -----------------------------------------------------------------------
756cdf0e10cSrcweir 
~LongCurrencyBox()757cdf0e10cSrcweir LongCurrencyBox::~LongCurrencyBox()
758cdf0e10cSrcweir {
759cdf0e10cSrcweir }
760cdf0e10cSrcweir 
761cdf0e10cSrcweir // -----------------------------------------------------------------------
762cdf0e10cSrcweir 
PreNotify(NotifyEvent & rNEvt)763cdf0e10cSrcweir long LongCurrencyBox::PreNotify( NotifyEvent& rNEvt )
764cdf0e10cSrcweir {
765cdf0e10cSrcweir 	if( rNEvt.GetType() == EVENT_KEYINPUT )
766cdf0e10cSrcweir 	{
767cdf0e10cSrcweir 		if ( ImplLongCurrencyProcessKeyInput( GetField(), *rNEvt.GetKeyEvent(), IsStrictFormat(), IsUseThousandSep(), GetLocaleDataWrapper() ) )
768cdf0e10cSrcweir 			return 1;
769cdf0e10cSrcweir 	}
770cdf0e10cSrcweir 	return ComboBox::PreNotify( rNEvt );
771cdf0e10cSrcweir }
772cdf0e10cSrcweir 
773cdf0e10cSrcweir // -----------------------------------------------------------------------
774cdf0e10cSrcweir 
Notify(NotifyEvent & rNEvt)775cdf0e10cSrcweir long LongCurrencyBox::Notify( NotifyEvent& rNEvt )
776cdf0e10cSrcweir {
777cdf0e10cSrcweir 	if( rNEvt.GetType() == EVENT_GETFOCUS )
778cdf0e10cSrcweir 	{
779cdf0e10cSrcweir 		MarkToBeReformatted( sal_False );
780cdf0e10cSrcweir 	}
781cdf0e10cSrcweir 	else if( rNEvt.GetType() == EVENT_LOSEFOCUS )
782cdf0e10cSrcweir 	{
783cdf0e10cSrcweir 		if ( MustBeReformatted() )
784cdf0e10cSrcweir 		{
785cdf0e10cSrcweir 			Reformat();
786cdf0e10cSrcweir 			ComboBox::Modify();
787cdf0e10cSrcweir 		}
788cdf0e10cSrcweir 	}
789cdf0e10cSrcweir 	return ComboBox::Notify( rNEvt );
790cdf0e10cSrcweir }
791cdf0e10cSrcweir 
792cdf0e10cSrcweir // -----------------------------------------------------------------------
793cdf0e10cSrcweir 
Modify()794cdf0e10cSrcweir void LongCurrencyBox::Modify()
795cdf0e10cSrcweir {
796cdf0e10cSrcweir 	MarkToBeReformatted( sal_True );
797cdf0e10cSrcweir 	ComboBox::Modify();
798cdf0e10cSrcweir }
799cdf0e10cSrcweir 
800cdf0e10cSrcweir // -----------------------------------------------------------------------
801cdf0e10cSrcweir 
ReformatAll()802cdf0e10cSrcweir void LongCurrencyBox::ReformatAll()
803cdf0e10cSrcweir {
804cdf0e10cSrcweir 	XubString aStr;
805cdf0e10cSrcweir 	SetUpdateMode( sal_False );
806cdf0e10cSrcweir 	sal_uInt16 nEntryCount = GetEntryCount();
807cdf0e10cSrcweir 	for ( sal_uInt16 i=0; i < nEntryCount; i++ )
808cdf0e10cSrcweir 	{
809cdf0e10cSrcweir 		ImplLongCurrencyReformat( GetEntry( i ), mnMin, mnMax,
810cdf0e10cSrcweir 								  GetDecimalDigits(), GetLocaleDataWrapper(),
811cdf0e10cSrcweir 								  aStr, *this );
812cdf0e10cSrcweir 		RemoveEntry( i );
813cdf0e10cSrcweir 		InsertEntry( aStr, i );
814cdf0e10cSrcweir 	}
815cdf0e10cSrcweir 	LongCurrencyFormatter::Reformat();
816cdf0e10cSrcweir 	SetUpdateMode( sal_True );
817cdf0e10cSrcweir }
818cdf0e10cSrcweir 
819cdf0e10cSrcweir // -----------------------------------------------------------------------
820cdf0e10cSrcweir 
InsertValue(BigInt nValue,sal_uInt16 nPos)821cdf0e10cSrcweir void LongCurrencyBox::InsertValue( BigInt nValue, sal_uInt16 nPos )
822cdf0e10cSrcweir {
823cdf0e10cSrcweir 	XubString aStr = ImplGetCurr( GetLocaleDataWrapper(), nValue, GetDecimalDigits(), GetCurrencySymbol(), IsUseThousandSep() );
824cdf0e10cSrcweir 	ComboBox::InsertEntry( aStr, nPos );
825cdf0e10cSrcweir }
826cdf0e10cSrcweir 
827cdf0e10cSrcweir // -----------------------------------------------------------------------
828cdf0e10cSrcweir 
RemoveValue(BigInt nValue)829cdf0e10cSrcweir void LongCurrencyBox::RemoveValue( BigInt nValue )
830cdf0e10cSrcweir {
831cdf0e10cSrcweir 	XubString aStr = ImplGetCurr( GetLocaleDataWrapper(), nValue, GetDecimalDigits(), GetCurrencySymbol(), IsUseThousandSep() );
832cdf0e10cSrcweir 	ComboBox::RemoveEntry( aStr );
833cdf0e10cSrcweir }
834cdf0e10cSrcweir 
835cdf0e10cSrcweir // -----------------------------------------------------------------------
836cdf0e10cSrcweir 
GetValue(sal_uInt16 nPos) const837cdf0e10cSrcweir BigInt LongCurrencyBox::GetValue( sal_uInt16 nPos ) const
838cdf0e10cSrcweir {
839cdf0e10cSrcweir 	BigInt nValue = 0;
840cdf0e10cSrcweir 	ImplLongCurrencyGetValue( ComboBox::GetEntry( nPos ), nValue,
841cdf0e10cSrcweir 							  GetDecimalDigits(), GetLocaleDataWrapper() );
842cdf0e10cSrcweir 	return nValue;
843cdf0e10cSrcweir }
844cdf0e10cSrcweir 
845cdf0e10cSrcweir // -----------------------------------------------------------------------
846cdf0e10cSrcweir 
GetValuePos(BigInt nValue) const847cdf0e10cSrcweir sal_uInt16 LongCurrencyBox::GetValuePos( BigInt nValue ) const
848cdf0e10cSrcweir {
849cdf0e10cSrcweir 	XubString aStr = ImplGetCurr( GetLocaleDataWrapper(), nValue, GetDecimalDigits(), GetCurrencySymbol(), IsUseThousandSep() );
850cdf0e10cSrcweir 	return ComboBox::GetEntryPos( aStr );
851cdf0e10cSrcweir }
852cdf0e10cSrcweir 
853cdf0e10cSrcweir // =======================================================================
854