uifw/AvKon/src/AknNumEdwin.cpp
changeset 0 2f259fa3e83a
child 16 71dd06cfe933
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uifw/AvKon/src/AknNumEdwin.cpp	Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,302 @@
+/*
+* Copyright (c) 2002 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:   Numeric Editor derived from Uikon's CEikEdwin
+*
+*
+*/
+
+
+// INCLUDES
+
+#include <barsread.h>  // Resource reading
+
+#include <eikon.hrh>
+#include <eikctl.rsg>
+#include <eikenv.h>
+
+#include "AknNumEdwin.h"
+#include "avkon.hrh"
+#include "AknDef.h"
+
+#include <aknenv.h>
+#include <AknSettingCache.h>
+#include <numberconversion.h>
+#include <AknUtils.h>
+
+	_LIT(KEmptyText, "" );
+
+// INTERNAL CLASS DEFINITIONS
+
+
+// CLASS IMPLEMENTATIONS
+
+
+EXPORT_C CAknIntegerEdwin* CAknIntegerEdwin::NewL( TInt aMin, TInt aMax, TInt aTextLimit )
+    {
+    CAknIntegerEdwin* self = new ( ELeave ) CAknIntegerEdwin;
+    CleanupStack::PushL( self );
+    self->ConstructL( aMin, aMax, aTextLimit);
+    CleanupStack::Pop();
+    return self;
+    }
+
+EXPORT_C void CAknIntegerEdwin::ConstructFromResourceL(TResourceReader& aReader)
+	{
+	const TInt edwinFlags=0; 
+
+	CalculateWidth(20);  // overridden by later layout code
+
+	TInt textLimit = aReader.ReadInt16();
+	TInt minValue = aReader.ReadInt32();
+	TInt maxValue = aReader.ReadInt32();
+	iUnsetValue = aReader.ReadInt32();
+
+// possible extensions
+	TInt dummy =  aReader.ReadInt32();
+	dummy = aReader.ReadInt32();
+
+	CommonConstructL(minValue, maxValue, textLimit, edwinFlags, iUnsetValue);
+	}
+
+EXPORT_C void CAknIntegerEdwin::ConstructL(TInt aMin, TInt aMax, TInt aTextLimit)
+	{
+	const TInt edwinFlags=0; 
+
+	CommonConstructL(aMin, aMax, aTextLimit, edwinFlags, KMaxTInt);
+	}
+
+void CAknIntegerEdwin::CommonConstructL(TInt aMin, TInt aMax, TInt aMaxChars, TInt aFlags, TInt aUnset)
+	{
+	iDigitType = EDigitTypeWestern;
+
+	const TInt numberOfLines=1;
+
+	// Enforce maximum number of digits for numeric Edwin - Otherwise CEikEdwin treats maxlimit of 0 as no limit.
+	TInt maxLimit(aMaxChars);
+	if( (maxLimit==0) || (maxLimit>EAknMaxIntegerDigits) )
+		maxLimit = EAknMaxIntegerDigits;
+
+	CEikEdwin::ConstructL(aFlags, aMaxChars, maxLimit, numberOfLines);
+	SetMinimumIntegerValue(aMin);
+	SetMaximumIntegerValue(aMax);
+
+	SetAknEditorCase(EAknEditorUpperCase);
+	SetAknEditorAllowedInputModes(EAknEditorNumericInputMode);
+	SetAknEditorInputMode(EAknEditorNumericInputMode);
+	SetAknEditorSpecialCharacterTable(0);
+	SetAknEditorFlags(EAknEditorFlagFixedCase | EAknEditorFlagNoT9);
+	// Only plain numbers
+	// The EAknEditorPlainNumberModeKeymap does not support - -sign so
+	// we have to use the converter mapping
+	SetAknEditorNumericKeymap(EAknEditorConverterNumberModeKeymap);
+
+	iUnsetValue = aUnset;
+	SetValueL(iUnsetValue);
+	RefreshFromLocale();
+	}
+
+EXPORT_C void CAknIntegerEdwin::SetValueL( TInt aValue )
+	{
+	if ( aValue != iUnsetValue )
+		{
+		HBufC* formatBuffer = HBufC::NewMaxLC( EAknMaxIntegerDigits );
+		TPtr formatPtr = formatBuffer->Des();
+		formatPtr.Format(KAknIntegerFormat, aValue);
+		
+        // Latin only editor doesn't need conversion
+        if ( !( AknEdwinFlags() & EAknEditorFlagLatinInputModesOnly ) )
+            {
+            NumberConversion::ConvertDigits(formatPtr, iDigitType);
+            }
+
+		SetTextL( &formatPtr );
+		CleanupStack::Pop(); // formatBuffer
+		delete formatBuffer;
+		}
+	else
+		{
+		SetTextL( &KEmptyText );
+		}
+	}
+
+EXPORT_C TKeyResponse CAknIntegerEdwin::OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType)
+	{
+	TKeyEvent modifiedKeyEvent(aKeyEvent);
+	TEventCode modifiedEventCode(aType);
+    
+    // FEP already should input converted numbers, so there's no need for this.
+	//MapKeyEvent(modifiedKeyEvent, modifiedEventCode, iDigitType);
+	return CAknNumericEdwin::OfferKeyEventL(modifiedKeyEvent, modifiedEventCode);
+	}
+
+
+EXPORT_C CAknIntegerEdwin::TValidationStatus CAknIntegerEdwin::GetTextAsInteger( TInt& aValue )
+	{
+
+	TValidationStatus state = EValueNotParsed;
+
+	// Create a normalised western version of the string.
+	TBuf<EAknMaxIntegerDigits> normalisedText;
+	GetText(normalisedText);
+	NumberConversion::ConvertDigits(normalisedText, EDigitTypeWestern);
+
+	// Use TextLength() for this test, because stray paragraph marks may lurk in the TPtrC buffer
+	if ( TextLength() == 0 )
+		{
+		state = EEmpty;
+		aValue = iUnsetValue;
+		}
+	else 
+		{
+		TLex lex( normalisedText );
+
+		if ( lex.Val(aValue) == KErrNone && lex.Remainder().Length() == 0 )
+			{
+			state = EValueValid;
+
+			// Test the range:
+			if ( aValue < iMinimumValue )
+				state = EValueTooSmall;
+			else if ( aValue > iMaximumValue )
+				state = EValueTooLarge;
+			}
+		else
+			{
+			state = EValueNotParsed;
+			aValue = iUnsetValue;
+			}
+
+		}
+
+	return state;
+
+	}
+
+
+
+EXPORT_C void CAknIntegerEdwin::SetMinimumIntegerValue( TInt aMinimum )
+	{
+	iMinimumValue = aMinimum;
+	}
+
+EXPORT_C void CAknIntegerEdwin::SetMaximumIntegerValue( TInt aMaximum )
+	{
+	iMaximumValue = aMaximum;
+	}
+
+EXPORT_C void CAknIntegerEdwin::SetUnsetValue( TInt aUnsetValue )
+	{
+	iUnsetValue = aUnsetValue;
+	}
+
+
+EXPORT_C void CAknIntegerEdwin::PrepareForFocusLossL()
+	{
+	// TInt resId = 0;
+	TInt value;
+	TValidationStatus state = GetTextAsInteger( value );
+
+	switch (state )
+		{
+		case EValueValid:
+		break;
+
+		case EEmpty:
+		break;
+
+		case EValueTooSmall:
+		// resId=R_EIK_TBUF_FNUMBER_BELOW_MIN;
+		value = iMinimumValue;
+		break;
+
+		case EValueTooLarge:
+		// resId=R_EIK_TBUF_FNUMBER_ABOVE_MAX;
+		value = iMaximumValue;
+		break;
+
+		case EValueNotParsed:
+
+		break;
+
+		default:
+		break;
+		}
+
+	}
+
+EXPORT_C void CAknIntegerEdwin::HandleResourceChange(TInt aType)
+	{
+	if(aType==KEikInputLanguageChange)
+		{
+		RefreshFromLocale();
+		return;
+		}
+	CAknNumericEdwin::HandleResourceChange(aType);
+	}
+
+void CAknIntegerEdwin::RefreshFromLocale()
+	{
+	iDigitType = AknTextUtils::NumericEditorDigitType();
+
+	TInt value;
+	if( GetTextAsInteger(value) != EValueValid)
+		return;
+
+	TRAP_IGNORE(SetValueL(value) ); // shouldn't leave with OOM because text string is the same size as previous.
+	}
+	
+EXPORT_C void CAknIntegerEdwin::HandlePointerEventL(const TPointerEvent& aPointerEvent) 
+    { 
+    CAknNumericEdwin::HandlePointerEventL(aPointerEvent); 
+    }	
+
+EXPORT_C void* CAknIntegerEdwin::ExtensionInterface( TUid /*aInterface*/ ) 
+    { 
+    return NULL;
+    }
+
+EXPORT_C void CAknIntegerEdwin::Reserved_3()
+	{
+	}
+    
+EXPORT_C TBool CAknIntegerEdwin::CheckNumber()
+    {
+    
+    TInt value;
+	TValidationStatus state = GetTextAsInteger( value );
+
+	switch (state )
+		{
+		case EValueTooSmall:
+		    {
+		    TRAP_IGNORE( SetValueL( iMinimumValue ) );
+		    TRAP_IGNORE( SelectAllL() );
+		    DrawDeferred();
+		    return EFalse;
+		    }
+		case EValueTooLarge:
+            {
+		    TRAP_IGNORE( SetValueL( iMaximumValue ) );
+        	TRAP_IGNORE( SelectAllL() );
+		    DrawDeferred();
+		    return EFalse;
+            }	
+		default:
+		break;
+		}
+		
+    return ETrue;
+    }
+    
+// End of File