diff -r 000000000000 -r 2f259fa3e83a uifw/AvKon/src/AknNumEdwin.cpp --- /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 // Resource reading + +#include +#include +#include + +#include "AknNumEdwin.h" +#include "avkon.hrh" +#include "AknDef.h" + +#include +#include +#include +#include + + _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 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