uifw/eikctl/src/EIKFPNE.CPP
changeset 0 2f259fa3e83a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uifw/eikctl/src/EIKFPNE.CPP	Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,484 @@
+/*
+* Copyright (c) 1997-2001 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+#include <eikfpne.h>
+
+#include <e32math.h>
+#include <eikpanic.h>
+#include <barsread.h>
+#include <eikenv.h>
+#include <eikon.hrh>
+#include <eikctl.rsg>
+#include <AknUtils.h>
+#include <AknDef.h>
+
+#include <AknTasHook.h>
+const TInt KMaxFloatAndFixedNumberOfDigits = 32;
+
+
+
+TInt TenToThePower(TInt n)// mostly, n small, eg 2, so integer arithmetic more efficient than real
+	{
+    TInt ret=1;
+    while (n--)
+        ret*=10;
+	return (ret);
+	}
+
+
+const TInt KFloatingPointEditorDefaultEdwinFlags = 
+	EEikEdwinNoLineOrParaBreaks | 
+	EEikEdwinAutoSelection;
+
+const TInt KFixedPointEditorDefaultEdwinFlags = 
+	EEikEdwinNoLineOrParaBreaks | 
+	EEikEdwinAutoSelection ;
+
+// class CEikFloatingPointEditor ////////////////////////////////////////////////////////////
+
+EXPORT_C CEikFloatingPointEditor::CEikFloatingPointEditor()
+	{
+    iEdwinInternalFlags=ENumericCharacters;
+    AKNTASHOOK_ADD( this, "CEikFloatingPointEditor" );
+	}
+
+EXPORT_C void CEikFloatingPointEditor::ConstructL(const TReal& aMin,const TReal& aMax,TInt aTextLimit)
+	{
+
+	// Enforce absolute maximum digits on ediwn
+	TInt maxDigits = aTextLimit;
+	if((maxDigits==0) || (maxDigits>KMaxFloatAndFixedNumberOfDigits))
+		maxDigits = KMaxFloatAndFixedNumberOfDigits;
+
+	SetMinMax(aMin,aMax);
+	CEikEdwin::ConstructL(KFloatingPointEditorDefaultEdwinFlags,aTextLimit,maxDigits,1);
+	SetAknEditorNumericKeymap(EAknEditorConverterNumberModeKeymap);
+	SetAknEditorAllowedInputModes(EAknEditorNumericInputMode);
+	SetAknEditorInputMode(EAknEditorNumericInputMode);
+	SetAknEditorSpecialCharacterTable(0);
+	}
+
+EXPORT_C void CEikFloatingPointEditor::PrepareForFocusLossL()
+	{
+
+	TReal value;
+	TValidationStatus validationStatus = GetValueAsReal(value);
+
+    TReal* pReal=NULL;
+
+	switch (validationStatus)
+		{
+		case EValueValid:
+			iValue = value;
+			break;
+
+		case EValueTooSmall:
+			pReal=(&iMin);
+			break;
+
+		case EValueTooLarge:
+			pReal=(&iMax);
+			break;
+
+		case EValueNotParsed:
+		case EEmpty:
+			pReal=(&iMin);
+			break;
+		};
+
+	if (validationStatus != EValueValid)
+		{
+		SetValueL(pReal);
+        User::Leave(KLeaveWithoutAlert); 
+		}
+	}
+
+EXPORT_C TCoeInputCapabilities CEikFloatingPointEditor::InputCapabilities() const
+	{
+	TCoeInputCapabilities inputCapabilities = CEikEdwin::InputCapabilities();
+	inputCapabilities.SetCapabilities(TCoeInputCapabilities::EWesternNumericReal|TCoeInputCapabilities::ENavigation);
+	return inputCapabilities;
+	}
+
+EXPORT_C TKeyResponse CEikFloatingPointEditor::OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType)
+	{
+	TKeyEvent keyEvent(aKeyEvent);
+	TEventCode eventCode(aType);
+
+	return CAknNumericEdwin::OfferKeyEventL(keyEvent, eventCode);
+	}
+
+EXPORT_C void CEikFloatingPointEditor::ConstructFromResourceL(TResourceReader& aReader)
+	{
+	TInt textLimit=aReader.ReadUint16();
+	TReal min=aReader.ReadReal64();
+	TReal max=aReader.ReadReal64();
+	TReal defaultValue=aReader.ReadReal64(); // does not work with queries !!!
+	ConstructL(min,max,textLimit);
+    // added to give a default value, to work with forms.  Unsure if this is desirable.
+	if ((min>defaultValue)||(defaultValue>max)) 
+		defaultValue=min;
+	SetValueL(&defaultValue);
+	}
+
+EXPORT_C CAknNumericEdwin::TValidationStatus CEikFloatingPointEditor::GetValueAsReal( TReal& aValue )
+    {
+	TValidationStatus state = EValueNotParsed;
+
+	// Normalise text to western, so that Tlex will work
+	TBuf<KMaxFloatAndFixedNumberOfDigits> text;
+	GetText(text);
+	AknTextUtils::ConvertDigitsTo(text, EDigitTypeWestern);
+
+	// Use TextLength() for this test, because stray paragraph marks may lurk in the TPtrC buffer
+	if ( TextLength() == 0 )
+		{
+		state = EEmpty;
+		}
+	else 
+		{
+		TLex lex( text );
+
+		if ( lex.Val(aValue) == KErrNone && lex.Remainder().Length() == 0 )
+			{
+			state = EValueValid;
+
+			// Test the range:
+			if ( aValue < iMin )
+                {
+				state = EValueTooSmall;
+                }
+			else if ( aValue > iMax )
+                {
+				state = EValueTooLarge;
+                }
+			}
+		else
+			{
+			state = EValueNotParsed;
+			}
+
+		}
+
+	return state;
+    
+    }
+
+EXPORT_C TReal CEikFloatingPointEditor::Value() const
+	{
+	return iValue;// assumes model already checked for validity
+	}
+
+EXPORT_C void CEikFloatingPointEditor::SetValueL(const TReal* aValue)
+	{
+    if (!aValue)
+        {
+		SetTextL(NULL);
+        return;
+        }
+
+	iValue=*aValue;
+	// !! Now check for validity?
+	TBuf<EAknMaxIntegerDigits> des;
+	TRealFormat format(iTextLimit);
+	format.iType|=KAllowThreeDigitExp;
+	des.Num(iValue,format);
+
+	AknTextUtils::ConvertDigitsTo(des, AknTextUtils::NumericEditorDigitType());
+
+	SetTextL(&des);
+	if ( !(iEdwinUserFlags&ENoAutoSelection) )
+		{
+        SetCursorPosL(des.Length(), ETrue);
+        }
+	else
+		{
+		SetCursorPosL(des.Length(), EFalse);
+		}
+    DrawNow();
+	}
+
+EXPORT_C void CEikFloatingPointEditor::SetMinMax(TReal aMin,TReal aMax)
+	{
+	iMin=aMin;
+	iMax=aMax;
+	__ASSERT_DEBUG(iMin<=iMax, Panic(EEikPanicInvalidBounds) );
+	}
+
+EXPORT_C void CEikFloatingPointEditor::GetMinMax(TReal& aMin, TReal& aMax) const
+	{
+	aMin=iMin;
+	aMax=iMax;
+	}
+
+EXPORT_C void CEikFloatingPointEditor::HandleResourceChange(TInt aType)
+	{
+	if(aType==KEikInputLanguageChange)
+		{
+		// get and set the same value will refresh the edwin text on a locale change
+		TReal value;
+		if( GetValueAsReal(value) == CAknNumericEdwin::EValueValid)
+			{
+			TRAP_IGNORE(SetValueL(&value));
+			}
+		}
+	CAknNumericEdwin::HandleResourceChange(aType);
+	}
+
+EXPORT_C void CEikFloatingPointEditor::HandlePointerEventL(const TPointerEvent& aPointerEvent) 
+    { 
+    CAknNumericEdwin::HandlePointerEventL(aPointerEvent); 
+    }
+
+EXPORT_C void* CEikFloatingPointEditor::ExtensionInterface( TUid /*aInterface*/ )
+    {
+    return NULL;
+    }
+
+EXPORT_C void CEikFloatingPointEditor::Reserved_3()
+	{}
+
+// class CEikFixedPointEditor ///////////////////////////////////////////////////////////////////
+
+EXPORT_C CEikFixedPointEditor::CEikFixedPointEditor()
+	{
+    iEdwinInternalFlags=ENumericCharacters;
+	}
+
+EXPORT_C void CEikFixedPointEditor::ConstructL(TInt aMin,TInt aMax)
+	{
+	SetMinMax(aMin,aMax);
+	iTextLimit=RequiredNumberOfCharacters();
+
+	SetAknEditorNumericKeymap(EAknEditorConverterNumberModeKeymap); 
+	SetAknEditorAllowedInputModes(EAknEditorNumericInputMode);
+	SetAknEditorInputMode(EAknEditorNumericInputMode);
+	SetAknEditorSpecialCharacterTable(0);
+
+	CEikEdwin::ConstructL(KFixedPointEditorDefaultEdwinFlags,iTextLimit,iTextLimit,1);
+	}
+
+EXPORT_C void CEikFixedPointEditor::ConstructFromResourceL(TResourceReader& aReader)
+	{
+	iDecimalPlaces=aReader.ReadUint16();
+	TInt min=aReader.ReadInt32();
+	TInt max=aReader.ReadInt32();
+	TInt defaultValue = aReader.ReadInt32();
+
+	__ASSERT_DEBUG(min<=max, Panic(EEikPanicInvalidBounds) );
+
+	ConstructL(min, max );
+
+	// added to give a default value, to work with forms.  Unsure if this is desirable.
+	if ((min>defaultValue)||(defaultValue>max)) 
+		defaultValue=min;
+	SetValueL(&defaultValue);
+	}
+
+
+
+EXPORT_C CAknNumericEdwin::TValidationStatus CEikFixedPointEditor::GetValueAsInteger( TInt& aValue )
+    {
+	TValidationStatus state = EValueNotParsed;    
+	// Normalise text to western, so that Tlex will work
+	TBuf<KMaxFloatAndFixedNumberOfDigits> text;
+	GetText(text);
+	AknTextUtils::ConvertDigitsTo(text, EDigitTypeWestern);
+
+	// Use TextLength() for this test, because stray paragraph marks may lurk in the TPtrC buffer
+	if ( TextLength() == 0 )
+		{
+		state = EEmpty;
+		}
+	else 
+		{
+		TLex lex( text );
+        TReal real;
+		if ( lex.Val( real ) == KErrNone )
+			{
+			state = EValueValid;
+	        real*=TenToThePower(iDecimalPlaces);
+	        real+=(real>0)?0.5:(-0.5);
+	        Math::Int((TInt32&)iValue, real);
+
+			// Test the range:
+			if ( iValue < iMin )
+                {
+				state = EValueTooSmall;
+                }
+			else if ( iValue > iMax )
+                {
+				state = EValueTooLarge;
+                }
+            else
+                {
+                aValue = iValue;                
+                }
+			}
+		else
+			{
+			state = EValueNotParsed;
+			}
+
+		}
+
+	return state;
+    
+    }
+
+TInt CEikFixedPointEditor::RequiredNumberOfCharacters() const
+	{
+	TInt absMax=(iMax >= -iMin) ? iMax : -iMin;
+	TInt numberOfCharacters=0;
+	while (absMax!=0)
+		{
+		++numberOfCharacters;
+		absMax/=10;
+		}
+	if (numberOfCharacters<iDecimalPlaces+1)
+		numberOfCharacters=iDecimalPlaces+1;// if bounds ensure leading digits will be zero, still need enough characters
+	++numberOfCharacters;// one character for the decimal point
+	if (iMin<0)
+		++numberOfCharacters;// one character for the minus sign
+	return numberOfCharacters;
+	}
+
+EXPORT_C void CEikFixedPointEditor::PrepareForFocusLossL()
+	{
+	TBuf<KMaxFloatAndFixedNumberOfDigits> string;
+	GetText(string);
+
+	// Convert to western so that TLex works
+	AknTextUtils::ConvertDigitsTo(string, EDigitTypeWestern);
+	TLex lex(string);
+	TReal real;
+	TInt err=lex.Val(real);
+	if (err==KErrGeneral || err==KErrArgument || lex.Remainder().Length())
+        {
+        // Change value to minimum
+        SetValueL( &iMin );
+        User::Leave( KErrNone );
+        }
+	real*=TenToThePower(iDecimalPlaces);
+	real+=(real>0)?0.5:(-0.5);
+	Math::Int((TInt32&)iValue, real);
+    if (iValue<iMin)
+		{
+        SetValueL( &iMin );
+        User::Leave( KErrNone );
+		}
+    else if (iValue>iMax)
+		{
+        SetValueL( &iMax );
+        User::Leave( KErrNone );
+		}
+	}
+
+
+EXPORT_C TCoeInputCapabilities CEikFixedPointEditor::InputCapabilities() const
+	{
+	TCoeInputCapabilities inputCapabilities = CEikEdwin::InputCapabilities();
+	inputCapabilities.SetCapabilities(TCoeInputCapabilities::EWesternNumericReal|TCoeInputCapabilities::ENavigation);
+	return inputCapabilities;
+	}
+
+EXPORT_C TInt CEikFixedPointEditor::Value() const
+	{
+	return iValue;
+	}
+
+EXPORT_C void CEikFixedPointEditor::SetValueL(const TInt* aValue)
+	{
+    if (!aValue)
+        {
+		SetTextL(NULL);
+        return;
+        }
+	iValue=*aValue;
+	//
+	TRealFormat format(iTextLimit,iDecimalPlaces);
+	format.iType|=KDoNotUseTriads;
+	//
+	TReal real=(TReal)iValue;
+	real/=TenToThePower(iDecimalPlaces);
+	TBuf<KMaxFloatAndFixedNumberOfDigits> string;
+	string.Num(real,format);
+
+	AknTextUtils::ConvertDigitsTo(string, AknTextUtils::NumericEditorDigitType());
+
+	SetTextL(&string);
+    DrawNow();
+	}
+
+EXPORT_C void CEikFixedPointEditor::SetMinMax(TInt aMin, TInt aMax)
+	{
+	iMin=aMin;
+	iMax=aMax;
+	__ASSERT_DEBUG(iMin<=iMax, Panic(EEikPanicInvalidBounds) );
+	}
+
+EXPORT_C void CEikFixedPointEditor::GetMinMax(TInt& aMin, TInt& aMax) const
+	{
+	aMin=iMin;
+	aMax=iMax;
+	}
+
+EXPORT_C void CEikFixedPointEditor::SetDecimalPlaces(TInt aDecimalPlaces)
+	{
+	iDecimalPlaces=aDecimalPlaces;
+	}
+
+EXPORT_C TInt CEikFixedPointEditor::DecimalPlaces() const
+	{
+	return iDecimalPlaces;
+	}
+
+EXPORT_C TKeyResponse CEikFixedPointEditor::OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType)
+	{
+	TKeyEvent keyEvent(aKeyEvent);
+	TEventCode eventCode(aType);
+
+	return CAknNumericEdwin::OfferKeyEventL(keyEvent, eventCode);
+	}
+
+EXPORT_C void CEikFixedPointEditor::HandleResourceChange(TInt aType)
+	{
+	if(aType==KEikInputLanguageChange)
+		{
+		// get and set the same value will refresh the edwin text on a locale change
+		TInt value;
+		if( GetValueAsInteger(value) == CAknNumericEdwin::EValueValid)
+			{
+			TRAP_IGNORE(SetValueL(&value));
+			}
+		}
+	CAknNumericEdwin::HandleResourceChange(aType);
+	}
+	
+EXPORT_C void CEikFixedPointEditor::HandlePointerEventL(const TPointerEvent& aPointerEvent) 
+    { 
+    CAknNumericEdwin::HandlePointerEventL(aPointerEvent); 
+    }	
+
+EXPORT_C void* CEikFixedPointEditor::ExtensionInterface( TUid /*aInterface*/ )
+    {
+    return NULL;
+    }
+
+EXPORT_C void CEikFixedPointEditor::Reserved_3()
+	{}