diff -r 000000000000 -r 2f259fa3e83a uifw/eikctl/src/EIKFPNE.CPP --- /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 + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +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 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 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 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 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 (iValueiMax) + { + 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 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() + {}