diff -r 8173571d354e -r 1fc85118c3ae landmarksui/uicontrols/src/CLmkMfneFloat.cpp --- a/landmarksui/uicontrols/src/CLmkMfneFloat.cpp Thu Aug 19 09:48:36 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,580 +0,0 @@ -/* -* Copyright (c) 2005 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: LandmarksUi Content File - -* -*/ - - - - - - - - -// INCLUDE FILES -#include -#include "CLmkMfneFloat.h" -#include - -namespace { - -const TInt KNumOtherSymbols = 2; // +/- and decimal point - -_LIT(KMinus,"-"); - -const TInt KEventCodeStarSign(42); -const TInt KEventCodeMinusSign(45); -const TInt KKeyToMatchPoint = 35; // Shift/Hash -const TInt KPointKeyFromQwerty = 46; - -#if defined(_DEBUG) -void Panic(TInt aReason) - { - _LIT(KPanicCategory, "LMK_MFNE_FLT"); - User::Panic(KPanicCategory, aReason); - } -#endif - -TReal Nan() - { - TRealX nan; - nan.SetNaN(); - return nan; - } - -TBool IsAnyDigit(TChar aCharacter) - { - return (aCharacter.GetNumericValue() != KErrNotFound); - } - -void TrimRightmostChar(TDes& aText) - { - if (aText.Length()) - { - aText.SetLength(aText.Length() - 1); - } - } -} - -// --------------------------------------------------------- -// CLmkMfneFloat::CLmkMfneFloat -// --------------------------------------------------------- -// -CLmkMfneFloat::CLmkMfneFloat( - TInt aMaxDigits, - TInt aMaxDecimalDigits) - : - iMaxDigits(aMaxDigits), - iMaxDecimalDigits(aMaxDecimalDigits) - { - __ASSERT_DEBUG(aMaxDigits > 0, Panic(KErrArgument)); - __ASSERT_DEBUG(aMaxDecimalDigits > 0, Panic(KErrArgument)); - __ASSERT_DEBUG(aMaxDecimalDigits <= aMaxDigits, Panic(KErrArgument)); - } - -// --------------------------------------------------------- -// CLmkMfneFloat::~CLmkMfneFloat -// --------------------------------------------------------- -// -CLmkMfneFloat::~CLmkMfneFloat() - { - delete iText; - } - -// --------------------------------------------------------- -// CLmkMfneFloat::NewL -// --------------------------------------------------------- -// -CLmkMfneFloat* CLmkMfneFloat::NewL( - TInt aMaxDigits, - TInt aMaxDecimalDigits) - { - CLmkMfneFloat* number = new(ELeave) - CLmkMfneFloat(aMaxDigits, aMaxDecimalDigits); - - CleanupStack::PushL(number); - number->ConstructL(); - CleanupStack::Pop(); - - return number; - } - -// --------------------------------------------------------- -// CLmkMfneFloat::ConstructL -// --------------------------------------------------------- -// -void CLmkMfneFloat::ConstructL() - { - iText = HBufC::NewL(MaxNumOfChars()); - } - -// --------------------------------------------------------- -// CLmkMfneFloat::SetLimits -// --------------------------------------------------------- -// -TBool CLmkMfneFloat::SetLimits( - TReal aMinimumValue, - TReal aMaximumValue) - { - __ASSERT_DEBUG( - Math::IsNaN(aMinimumValue) || - Math::IsNaN(aMaximumValue) || - (aMinimumValue < aMaximumValue), Panic(KErrArgument)); - - iMinimumValue = aMinimumValue; - iMaximumValue = aMaximumValue; - - return EnsureValueInLimits(ValueFromText(*iText)); - } - -// --------------------------------------------------------- -// CLmkMfneFloat::GetLimits -// --------------------------------------------------------- -// -void CLmkMfneFloat::GetLimits( - TReal& aMinimumValue, - TReal& aMaximumValue) const - { - aMinimumValue = iMinimumValue; - aMaximumValue = iMaximumValue; - } - -// --------------------------------------------------------- -// CLmkMfneFloat::SetValue -// --------------------------------------------------------- -// -void CLmkMfneFloat::SetValue(TReal aValue) - { - TPtr ptr(iText->Des()); - TextFromValue(aValue, ptr); - AknTextUtils::DisplayTextLanguageSpecificNumberConversion( ptr ); - EnsureValueInLimits(aValue); - iIsBeingEditedWithCursor = EFalse; - } - -// --------------------------------------------------------- -// CLmkMfneFloat::Value -// --------------------------------------------------------- -// -TReal CLmkMfneFloat::Value() const - { - return ValueFromText(*iText); - } - -// --------------------------------------------------------- -// CLmkMfneFloat::MaximumWidthInPixels -// --------------------------------------------------------- -// -TInt CLmkMfneFloat::MaximumWidthInPixels( - const CFont& aFont, - TBool /*aShrinkToMinimumSize*/) - { - TLocale locale; - TInt digitWidth = - TFindWidthOfWidestDigitType(locale.DigitType()).MaximumWidthInPixels(aFont); - - return MaxNumOfChars() * digitWidth; - } - -// --------------------------------------------------------- -// CLmkMfneFloat::InputCapabilities -// --------------------------------------------------------- -// -TCoeInputCapabilities CLmkMfneFloat::InputCapabilities() const - { - return TCoeInputCapabilities(TCoeInputCapabilities::EWesternNumericReal); - } - -// --------------------------------------------------------- -// CLmkMfneFloat::IsEditable -// --------------------------------------------------------- -// -TBool CLmkMfneFloat::IsEditable() const - { - return ETrue; - } - -// --------------------------------------------------------- -// CLmkMfneFloat::HandleHighlight -// --------------------------------------------------------- -// -void CLmkMfneFloat::HandleHighlight() - { - iFocus = ETrue; - if ((iText->Length() == 0)) - { - iIsBeingEditedWithCursor = ETrue; - } - } - -// --------------------------------------------------------- -// CLmkMfneFloat::HighlightType -// --------------------------------------------------------- -// -CEikMfneField::THighlightType CLmkMfneFloat::HighlightType() const - { - if (iFocus) - { - return iIsBeingEditedWithCursor ? ECursor : EInverseVideo; - } - else - { - return EInverseVideo; - } - } - -// --------------------------------------------------------- -// CLmkMfneFloat::HandleDeHighlight -// --------------------------------------------------------- -// -void CLmkMfneFloat::HandleDeHighlight( - const CFont& /*aFont*/, - CEikonEnv& /*aEikonEnv*/, - TBool& aDataAltered, - TBool& /*aError*/) - { - iIsBeingEditedWithCursor = EFalse; - iFocus = EFalse; - - TPtr text(iText->Des()); - if (Math::IsNaN(ValueFromText(text))) - { - text.Zero(); - aDataAltered = ETrue; - } - } - -// --------------------------------------------------------- -// CLmkMfneFloat::HandleKey -// --------------------------------------------------------- -// -void CLmkMfneFloat::HandleKey( - const CFont& /*aFont*/, - const TKeyEvent& aKeyEvent, - TBool /*aInterpretLeftAndRightAsEarEvents*/, - TBool& aDataAltered, - TInt& aHighlightIncrement) - { - TChar ch = aKeyEvent.iCode; - TPtr text = iText->Des(); - - switch (ch) - { - case EKeyLeftArrow: - case EKeyRightArrow: - HandleLeftOrRightArrow(ch, aDataAltered, aHighlightIncrement); - break; - - case EKeyBackspace: - if (text.Length()) - { - iIsBeingEditedWithCursor = ETrue; - TrimRightmostChar(text); - if (text == KMinus) - { - text.Zero(); - } - aDataAltered=ETrue; - } - break; - - case KEventCodeStarSign: - case KEventCodeMinusSign: - // if negative values allowed - if (Math::IsNaN(iMinimumValue) || iMinimumValue < 0) - { - if (!iIsBeingEditedWithCursor) - { - iIsBeingEditedWithCursor = ETrue; - text.Zero(); - } - - if (text.Length() == 0) - { - text.Append(KMinus); - aDataAltered=ETrue; - } - } - break; - - default: - TLocale locale; - TChar point = locale.DecimalSeparator(); - - if ((ch == KKeyToMatchPoint || ch == KPointKeyFromQwerty ) && (iIsBeingEditedWithCursor)) - { - if (IsDecimalSeparatorAllowed(text)) - { - text.Append(point); - aDataAltered = ETrue; - } - } - - if (IsAnyDigit(ch)) - { - if (!iIsBeingEditedWithCursor) - { - iIsBeingEditedWithCursor = ETrue; - text.Zero(); - aDataAltered=ETrue; - } - - if (IsMoreDigitsAllowed(text)) - { - text.Append(ch); - aDataAltered = ETrue; - - // check that value is within limits - if (EnsureValueInLimits(ValueFromText(text))) - { - // value is changed, make whole field selected - iIsBeingEditedWithCursor = EFalse; - } - } - else - { - aHighlightIncrement = 1; - } - } - break; - } - } - -// --------------------------------------------------------- -// CLmkMfneFloat::EnsureValueInLimits -// --------------------------------------------------------- -// -TBool CLmkMfneFloat::EnsureValueInLimits(TReal aValue) - { - if ( !Math::IsNaN(aValue)) - { - TPtr ptr(iText->Des()); - if (aValue < iMinimumValue) - { - TextFromValue(iMinimumValue, ptr); - return ETrue; - } - - if (aValue > iMaximumValue) - { - TextFromValue(iMaximumValue, ptr); - return ETrue; - } - } - return EFalse; - } - -// --------------------------------------------------------- -// CLmkMfneFloat::Text -// --------------------------------------------------------- -// -const TDesC& CLmkMfneFloat::Text() const - { - TPtr ptr = (iText->Des()); - AknTextUtils::DisplayTextLanguageSpecificNumberConversion( ptr ); - return *iText; - } - -// --------------------------------------------------------- -// CLmkMfneFloat::MaxNumOfChars -// --------------------------------------------------------- -// -TInt CLmkMfneFloat::MaxNumOfChars() const - { - return iMaxDigits + KNumOtherSymbols; - } - -// --------------------------------------------------------- -// CLmkMfneFloat::TextHasDecimalSeparator -// --------------------------------------------------------- -// -TBool CLmkMfneFloat::IsDecimalSeparatorAllowed(const TDesC& aText) const - { - if (Math::IsNaN(ValueFromText(aText))) - { - return EFalse; - } - - TLocale locale; - TChar point = locale.DecimalSeparator(); - TInt i = 0; - while (i < aText.Length()) - { - if (TChar(aText[i++]) == point) - { - return EFalse; - } - } - - return (aText.Length() < MaxNumOfChars()); - } - -// --------------------------------------------------------- -// CLmkMfneFloat::ValueFromText -// --------------------------------------------------------- -// -TBool CLmkMfneFloat::IsMoreDigitsAllowed(const TDesC& aText) const - { - // check that number of allowed digits is less then iMaxDigits - TInt digits = 0, decimalDigits = 0; - TInt isDecimalPart = EFalse; - TLocale locale; - TChar point = locale.DecimalSeparator(); - - // if string starts with 0, then only decimal point is allowed - _LIT(KSingleZero, "0"); - _LIT(KMinusZero, "-0"); - - if (aText == KSingleZero || aText == KMinusZero) - { - return EFalse; - } - - // other cases - check total amount of digits - // and amount of decimal digits - for (TInt i = 0; i < aText.Length(); i++) - { - if (IsAnyDigit(aText[i])) - { - digits++; - } - if (isDecimalPart) - { - decimalDigits++; - } - if (aText[i] == point) - { - isDecimalPart = ETrue; - } - } - return ((digits < iMaxDigits) && (decimalDigits < iMaxDecimalDigits)); - } - -// --------------------------------------------------------- -// CLmkMfneFloat::ValueFromText -// --------------------------------------------------------- -// -TReal CLmkMfneFloat::ValueFromText(const TDesC& aText) const - { - if (aText.Length() == 0) - { - return Nan(); - } - - TBool isNegative(EFalse); - TInt integer(0); - TInt integerDigits(0); - TBool fractionPart(EFalse); - TInt fraction(0); - TInt fractionDigits(0); - TLocale locale; - - for (TInt i = 0; i < aText.Length(); i++) - { - TChar ch(aText[i]); - if (ch == '-') - { - __ASSERT_DEBUG(i == 0, Panic(KErrGeneral)); - isNegative = ETrue; - continue; - } - - if (ch == locale.DecimalSeparator()) - { - __ASSERT_DEBUG(fractionPart == EFalse, Panic(KErrGeneral)); - fractionPart = ETrue; - continue; - } - - TInt val = ch.GetNumericValue(); - if (val >= 0) - { - if (!fractionPart) - { - integer = integer * 10 + val; - integerDigits++; - } - else - { - fraction = fraction * 10 + val; - fractionDigits++; - } - } - } - - // integer part must contain at least "0". - if (integerDigits < 1) - { - return Nan(); - } - - TReal value(fraction); - for (TInt i = 0; i < fractionDigits; i++) - { - value /= 10; - } - - value += TReal(integer); - return (isNegative) ? -value : value; - } - -// --------------------------------------------------------- -// CLmkMfneFloat::TextFromValue -// --------------------------------------------------------- -// -void CLmkMfneFloat::TextFromValue(TReal aValue, TDes& aText) const - { - aText.SetLength(0); - - if (Math::IsNaN(aValue)) - { - return; - } - - TRealFormat format; - format.iType = KRealFormatFixed; - format.iTriLen = 0; // no triad separations - format.iWidth = MaxNumOfChars(); - format.iPlaces = (aValue == 0) ? 0 : iMaxDecimalDigits; - - // convert real value to a string - aText.Num(aValue, format); - - // cut trailing zeroes from decimal part - TLocale locale; - TInt pointIndex = aText.Locate(locale.DecimalSeparator()); - if (pointIndex != KErrNotFound) - { - TInt newLength = aText.Length(); - for (TInt i = aText.Length() - 1; i > pointIndex; i--) - { - if (aText[i] == '0') - { - newLength--; - } - else - { - break; - } - } - - // if only decimal point left, cut it also - if (aText[newLength-1] == locale.DecimalSeparator()) - { - newLength--; - } - - aText.SetLength(newLength); - } - }