landmarksui/uicontrols/src/CLmkDecimalEditor.cpp
branchRCL_3
changeset 36 1fc85118c3ae
parent 34 8173571d354e
child 37 870918037e16
--- a/landmarksui/uicontrols/src/CLmkDecimalEditor.cpp	Thu Aug 19 09:48:36 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,703 +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 <barsread.h>
-#include <eikenv.h>
-#include <NumberConversion.h>
-#include <AknUtils.h>
-#include <aknsoundsystem.h>
-#include <AknAppUi.h>
-#include <AknTextDecorationMetrics.h>
-#include <eikctl.rsg>
-#include <e32math.h>
-
-#include "CLmkDecimalEditor.h"
-
-
-_LIT(KMinus,"-");
-
-namespace EUtils
-	{
-	LOCAL_D TBool IsAnyDigit(TChar aCharacter)
-		{
-		return ( aCharacter.GetNumericValue() != KErrNotFound);
-		}
-	}
-
-
-// ---------------------------------------------------------
-// CLmkDecimalEditor::CLmkDecimalEditor
-// ---------------------------------------------------------
-//
-CLmkDecimalEditor::CLmkDecimalEditor(TInt aMinimumValue, TInt aMaximumValue, TUint32 aFlags)
-									:iMinimumValue(aMinimumValue),
-									 iMaximumValue(aMaximumValue),
-									 iFlags(aFlags),
-									 iDigitType(EDigitTypeWestern)
-	{
-	TBuf<16> minText;
-	minText.AppendNum(aMinimumValue);
-	TBuf<16> maxText;
-	maxText.AppendNum(aMaximumValue);
-	iMaxDigits=Max(minText.Length(),maxText.Length());
-
-	iMaxDigitsMinimumValue=minText.Length();
-	iMaxDigitsMaximumValue=maxText.Length();
-	iEnv = CEikonEnv::Static();
-	}
-
-// ---------------------------------------------------------
-// CLmkDecimalEditor::~CLmkDecimalEditor
-// ---------------------------------------------------------
-//
-CLmkDecimalEditor::~CLmkDecimalEditor()
-	{
-	delete iText;
-	}
-
-// ---------------------------------------------------------
-// CLmkDecimalEditor::NewL
-// ---------------------------------------------------------
-//
-CLmkDecimalEditor* CLmkDecimalEditor::NewL(const CFont& aFont, TResourceReader& aResourceReader)
-	{
-	TInt minimumValue=aResourceReader.ReadInt32();
-	TInt maximumValue=aResourceReader.ReadInt32();
-	TUint32 flags=aResourceReader.ReadUint8();
-	return NewL(aFont, minimumValue, maximumValue, maximumValue, flags, 0);
-	}
-
-// ---------------------------------------------------------
-// CLmkDecimalEditor::NewL
-// ---------------------------------------------------------
-//
-CLmkDecimalEditor* CLmkDecimalEditor::NewL(const CFont& aFont, TInt aMinimumValue, TInt aMaximumValue, TInt aInitialValue, TUint32 aFlags, TInt aNumberOfZeros)
-	{
-	CLmkDecimalEditor* number=new(ELeave) CLmkDecimalEditor(aMinimumValue, aMaximumValue, aFlags);
-	CleanupStack::PushL(number);
-	number->iText=HBufC::NewL(number->MaximumNumberOfDigits()+((aMinimumValue<0)? 1: 0));
-	number->ConstructL(aNumberOfZeros);
-	number->SetValue(aInitialValue, aFont);
-	CleanupStack::Pop();
-	return number;
-	}
-
-// ---------------------------------------------------------
-// CLmkDecimalEditor::InvalidFieldAlert
-// ---------------------------------------------------------
-//
-void CLmkDecimalEditor::InvalidFieldAlert() const
-	{
-    CAknKeySoundSystem* soundPlayer = (static_cast<CAknAppUi*>(iEnv->AppUi()))->KeySounds();
-    if(soundPlayer)
-        {
-        soundPlayer->PlaySound(EAvkonSIDWarningTone);
-        }
-    }
-
-// ---------------------------------------------------------
-// CLmkDecimalEditor::AdditionalWidthForHighlights
-// ---------------------------------------------------------
-//
-TInt CLmkDecimalEditor::AdditionalWidthForHighlights(const CFont& aFont) const
-    {
-    TInt addedWidth(0);
-    if ( IsEditable() )
-        {
-        TInt rightHighlight(0);
-        TAknTextDecorationMetrics metrics( &aFont );
-        // Width is increased only by leftHighlight.  This is a compromise in that glyphs already have
-        // spacing within them to achieve character spacing. This spacing is generally (for numbers) on the right.
-        metrics.GetLeftAndRightMargins( addedWidth, rightHighlight ); // rightHighlight is not used
-        }
-    return addedWidth;
-    }
-
-// ---------------------------------------------------------
-// CLmkDecimalEditor::WidthInPixels
-// ---------------------------------------------------------
-//
-TInt CLmkDecimalEditor::WidthInPixels(const CFont& aFont) const
-	{
-	return Max( iMinimumWidthInPixels, aFont.TextWidthInPixels(Text()) + AdditionalWidthForHighlights(aFont) );
-	}
-
-// ---------------------------------------------------------
-// CLmkDecimalEditor::ConstructL
-// ---------------------------------------------------------
-//
-void CLmkDecimalEditor::ConstructL(TInt aNumberOfZeros)
-	{
-	iNudgeCharMinus=iEnv->NudgeCharMinus();
-	iNudgeCharPlus=iEnv->NudgeCharPlus();
-	iNumberOfZeros = aNumberOfZeros;
-	}
-
-// ---------------------------------------------------------
-// CLmkDecimalEditor::SetMinimumAndMaximum
-// ---------------------------------------------------------
-//
-void CLmkDecimalEditor::SetMinimumAndMaximum(TInt aMinimumValue, TInt aMaximumValue, const CFont& aFont)
-	{
-	TBuf<16> minText;
-	minText.AppendNum(aMinimumValue);
-	TBuf<16> maxText;
-	maxText.AppendNum(aMaximumValue);
-	TInt minTextLength=minText.Length();
-	TInt maxTextLength=maxText.Length();
-	iMinimumValue=aMinimumValue;
-	iMaximumValue=aMaximumValue;
-	TInt value=ValueFromText();
-	if (value<aMinimumValue||!NumberOfDigits())
-		SetTextToValue(aMinimumValue, aFont);
-	else if (value>aMaximumValue)
-		SetTextToValue(aMaximumValue, aFont);
-	}
-
-// ---------------------------------------------------------
-// CLmkDecimalEditor::GetMinimumAndMaximum
-// ---------------------------------------------------------
-//
-void CLmkDecimalEditor::GetMinimumAndMaximum(TInt& aMinimumValue, TInt& aMaximumValue) const
-	{
-	aMinimumValue=iMinimumValue;
-	aMaximumValue=iMaximumValue;
-	}
-
-// ---------------------------------------------------------
-// CLmkDecimalEditor::SetValue
-// ---------------------------------------------------------
-//
-void CLmkDecimalEditor::SetValue(TInt aValue, const CFont& aFont)
-	{
-	SetTextToValue(aValue, aFont);
-	}
-
-// ---------------------------------------------------------
-// CLmkDecimalEditor::Value
-// ---------------------------------------------------------
-//
-TReal CLmkDecimalEditor::Value() const
-	{
-	TInt numberOfDigits = NumberOfDigits();
-	TReal retVal(0);
-	TReal temp(0);
-
-    if (numberOfDigits == 0)
-        {
-        InvalidFieldAlert();
-        }
-
-    TInt value = ValueFromText();
-    if (value < iMinimumValue)
-        {
-		InvalidFieldAlert();
-	    iEnv->LeaveWithInfoMsg(R_EIK_TBUF_NUMBER_BELOW_MIN, iMinimumValue);
-        }
-    if (value > iMaximumValue)
-		{
-	    iEnv->LeaveWithInfoMsg(R_EIK_TBUF_NUMBER_ABOVE_MAX, iMaximumValue);
-        }
-    Math::Pow10(temp, numberOfDigits * (-1));
-    retVal = value * temp;
-    return retVal;
-	}
-
-// ---------------------------------------------------------
-// CLmkDecimalEditor::IsValid
-// ---------------------------------------------------------
-//
-TBool CLmkDecimalEditor::IsValid() const
-	{
-	return (NumberOfDigits() != 0);
-	}
-
-// ---------------------------------------------------------
-// CLmkDecimalEditor::NormalizeDigit
-// ---------------------------------------------------------
-//
-TChar CLmkDecimalEditor::NormalizeDigit(TChar aChar)
-	{
-	TBuf<1> buf;
-	buf.Append(aChar);
-	NumberConversion::ConvertDigits(buf, iDigitType);
-	return buf[0];
-	}
-
-// ---------------------------------------------------------
-// CLmkDecimalEditor::ZeroCharacter
-// ---------------------------------------------------------
-//
-TText CLmkDecimalEditor::ZeroCharacter() const
-		{
-		return TText(iDigitType);
-		}
-
-// ---------------------------------------------------------
-// CLmkDecimalEditor::NegativeCharacter
-// ---------------------------------------------------------
-//
-TText CLmkDecimalEditor::NegativeCharacter() const
-		{
-		return TText('-');
-		}
-
-// ---------------------------------------------------------
-// CLmkDecimalEditor::IsTextNull
-// ---------------------------------------------------------
-//
-TBool CLmkDecimalEditor::IsTextNull() const
-	{
-	return ( Text().Length() < 1 );
-	}
-
-// ---------------------------------------------------------
-// CLmkDecimalEditor::MaximumWidthInPixels
-// ---------------------------------------------------------
-//
-TInt CLmkDecimalEditor::MaximumWidthInPixels(const CFont& aFont, TBool aShrinkToMinimumSize)
-	{
-	if (aShrinkToMinimumSize)
-		{
-		TBuf<16> minText;
-		minText.AppendNum(iMinimumValue);
-		TBuf<16> maxText;
-		maxText.AppendNum(iMaximumValue);
-
-		iMaxDigits=Max(2,Max(minText.Length(),maxText.Length()));
-		}
-	return (MaximumNumberOfDigits()*TFindWidthOfWidestDigitType(DigitType()).MaximumWidthInPixels(aFont)) + AdditionalWidthForHighlights(aFont) /*+((iMinimumValueCateredForInFieldWidth<0)? aFont.TextWidthInPixels(_L("-")): 0)*/;
-	}
-
-// ---------------------------------------------------------
-// CLmkDecimalEditor::InputCapabilities
-// ---------------------------------------------------------
-//
-TCoeInputCapabilities CLmkDecimalEditor::InputCapabilities() const
-	{
-	TUint inputCapabilities=TCoeInputCapabilities::ENone;
-	if (iMinimumValue<0)
-		{
-		inputCapabilities|=TCoeInputCapabilities::EWesternNumericIntegerNegative;
-		}
-	if (iMaximumValue>0)
-		{
-		inputCapabilities|=TCoeInputCapabilities::EWesternNumericIntegerPositive;
-		}
-	return TCoeInputCapabilities(inputCapabilities);
-	}
-
-// ---------------------------------------------------------
-// CLmkDecimalEditor::Text
-// ---------------------------------------------------------
-//
-const TDesC& CLmkDecimalEditor::Text() const
-	{
-	if (IsUninitialised())
-		return KNullDesC();
-	else
-		return *iText;
-	}
-
-// ---------------------------------------------------------
-// CLmkDecimalEditor::IsEditable
-// ---------------------------------------------------------
-//
-TBool CLmkDecimalEditor::IsEditable() const
-	{
-	return ETrue;
-	}
-
-// ---------------------------------------------------------
-// CLmkDecimalEditor::HighlightType
-// ---------------------------------------------------------
-//
-CEikMfneField::THighlightType CLmkDecimalEditor::HighlightType() const
-	{
-	return (iFlags&EIsBeingEditedWithCursor)? ECursor: EInverseVideo;
-	}
-
-// ---------------------------------------------------------
-// CLmkDecimalEditor::HandleKey
-// ---------------------------------------------------------
-//
-void CLmkDecimalEditor::HandleKey(const CFont& aFont, const TKeyEvent& aKeyEvent, TBool aInterpretLeftAndRightAsEarEvents, TBool& aDataAltered, TInt& aHighlightIncrement)
-	{
-	TChar ch=aKeyEvent.iCode;
-
-	TPtr text=iText->Des();
-	TInt textLength=text.Length();
-	TBool nudgeTen=EFalse;
-	switch (ch)
-		{
-	case EKeyLeftArrow:
-	case EKeyRightArrow:
-		if (!aInterpretLeftAndRightAsEarEvents)
-			HandleLeftOrRightArrow(ch, aDataAltered, aHighlightIncrement);
-		else
-			{
-		doAdjust:
-			const TInt nudge=(nudgeTen? 10 : 1);
-			TInt newValue;
-
-
-			if ((textLength==0) || ! EUtils::IsAnyDigit( TChar(text[textLength-1]) ) )
-				newValue=0;
-			else
-				newValue=ValueFromText()+((ch==EKeyLeftArrow)? -nudge: nudge);
-			if (newValue>=iMaximumValue)
-				newValue=iMaximumValue;
-			else if (newValue<=iMinimumValue)
-				newValue=iMinimumValue;
-			SetTextToValue(newValue, aFont);
-			aHighlightIncrement=0;// Always highlight the field being nudged
-			aDataAltered=ETrue;
-			SetUninitialised(EFalse);
-			iFlags&=~EIsBeingEditedWithCursor;
-			}
-		break;
-    case EKeyDownArrow:
-    case EKeyUpArrow:
-        {
-		if (IsUninitialised())
-			{
-			SetUninitialised(EFalse);
-			}
-		else
-			{
-		        const TInt nudge=(nudgeTen? 10 : 1);
-        		TInt newValue;
-
-
-		        if ((textLength==0) || ! EUtils::IsAnyDigit( TChar(text[textLength-1])) )
-        		    newValue=0;
-        		else
-            			newValue=ValueFromText()+((ch==EKeyDownArrow)? -nudge: nudge);
-
-	 		if (newValue>iMaximumValue)
-            			newValue=iMinimumValue;
-        		else if (newValue<iMinimumValue)
-		            newValue=iMaximumValue;
-       			SetTextToValue(newValue, aFont);
-        		aHighlightIncrement=0;// Always highlight the field being nudged
-        		aDataAltered=ETrue;
-        		iFlags&=~EIsBeingEditedWithCursor;
-			}
-		aDataAltered=ETrue;
-        }
-        break;
-    case EKeyBackspace:
-		if (textLength)
-			{
-			iFlags|=EIsBeingEditedWithCursor;
-			text.SetLength(textLength-1);
-			if (text==KMinus)
-				text.SetLength(0);
-			aDataAltered=ETrue;
-			SetUninitialised(EFalse);
-			}
-		break;
-	case '+':
-		break;
-	case '-':
-        if (iMinimumValue < 0)
-            {
-			if (~iFlags&EIsBeingEditedWithCursor)
-				{
-				iFlags|=EIsBeingEditedWithCursor;
-				text.SetLength(0);
-				}
-			if (text.Length()==0)
-				{
-				text.Append('-');
-				aDataAltered=ETrue;
-				SetUninitialised(EFalse);
-				}
-			}
-		break;
-	default:
-		TBuf<2> nudgeTenChars;
-		CCoeEnv::Static()->ReadResource(nudgeTenChars,R_EIK_TBUF_NUDGE_TEN_CHARS);
-
-		if ( EUtils::IsAnyDigit(ch) )
-			{
-			if (~iFlags&EIsBeingEditedWithCursor)
-				{
-				iFlags|=EIsBeingEditedWithCursor;
-				text.SetLength(0);
-				}
-			text.Append(NormalizeDigit(ch) );
-			aDataAltered=ETrue;
-			SetUninitialised(EFalse);
-			if (NumberOfDigits()>=MaximumNumberOfDigits())
-				aHighlightIncrement=1;
-			}
-		if (ch==iNudgeCharMinus)
-			{
-			ch=EKeyLeftArrow;
-			goto doAdjust;
-			}
-		else if (ch==iNudgeCharPlus)
-			{
-			ch=EKeyRightArrow;
-			goto doAdjust;
-			}
-		else if (ch==((TUint)nudgeTenChars[0]))
-			{
-			ch=EKeyLeftArrow;
-			nudgeTen=ETrue;
-			goto doAdjust;
-			}
-		else if (ch==((TUint)nudgeTenChars[1]))
-			{
-			ch=EKeyRightArrow;
-			nudgeTen=ETrue;
-			goto doAdjust;
-			}
-		break;
-		}
-	}
-
-// ---------------------------------------------------------
-// CLmkDecimalEditor::HandleDeHighlight
-// ---------------------------------------------------------
-//
-void CLmkDecimalEditor::HandleDeHighlight(const CFont& aFont, CEikonEnv& aEikonEnv, TBool& aDataAltered, TBool& aError)
-	{
-	iFlags&=~EIsBeingEditedWithCursor;
-	if (NumberOfDigits()==0)
-		{
-		SetTextToValue(iMaximumValue, aFont);
-		aDataAltered=ETrue;
-		aError=ETrue;
-		aEikonEnv.InfoMsg(R_EIK_TBUF_NO_NUMBER_ENTERED);
-		return;
-		}
-	TInt value=ValueFromText();
-    if ((value<iMinimumValue) || (value>iMaximumValue))
-        {
-        TBool succeeded = ConvertsIntoValidValue(value);
-        if ( !succeeded )
-            {
-            aDataAltered=ETrue;
-            aError=ETrue;
-            if (value<iMinimumValue)
-                {
-                SetTextToValue(iMinimumValue, aFont);
-				InvalidFieldAlert();
-                aEikonEnv.InfoMsg(R_EIK_TBUF_NUMBER_BELOW_MIN, iMinimumValue);
-                return;
-                }
-            if (value>iMaximumValue)
-                {
-				InvalidFieldAlert();
-                SetTextToValue(iMaximumValue, aFont);
-                aEikonEnv.InfoMsg(R_EIK_TBUF_NUMBER_ABOVE_MAX, iMaximumValue);
-                return;
-                }
-            }
-        }
-	TBuf<128> oldText=*iText;
-	TBool unInit = IsUninitialised();
-	//SetTextToValue(value, aFont);
-	if (oldText!=*iText)
-		aDataAltered=ETrue;
-	else
-		SetUninitialised(unInit);
-	}
-
-// ---------------------------------------------------------
-// CLmkDecimalEditor::MaximumNumberOfDigits
-// ---------------------------------------------------------
-//
-TInt CLmkDecimalEditor::MaximumNumberOfDigits() const
-	{
-	return Max(2,iMaxDigits);
-	}
-
-// ---------------------------------------------------------
-// CLmkDecimalEditor::NumberOfDigits
-// ---------------------------------------------------------
-//
-TInt CLmkDecimalEditor::NumberOfDigits() const
-	{
-	return iText->Length();
-	}
-
-// ---------------------------------------------------------
-// CLmkDecimalEditor::SetTextToValue
-// ---------------------------------------------------------
-//
-void CLmkDecimalEditor::SetTextToValue(TInt aValue, const CFont& aFont)
-	{
-	SetUninitialised(EFalse);
-	TPtr text=iText->Des();
-	text.SetLength(0);
-	if (aValue<0)
-		{
-		text.Append('-');
-		aValue=-aValue;
-		}
-	TInt firstUnsetCharacter=text.Length();
-	text.SetLength(firstUnsetCharacter+MaximumNumberOfDigits());
-	TInt lastUnsetCharacter=text.Length()-1;
-	if (aValue==0)
-		text[lastUnsetCharacter--]=ZeroCharacter();
-	else
-		{
-		for (; aValue; aValue/=10)
-			text[lastUnsetCharacter--]=(TText)(ZeroCharacter()+(aValue%10));
-		}
-	while(iNumberOfZeros--)
-		{
-		text[lastUnsetCharacter--]=(TText)(ZeroCharacter());
-		}
-	iNumberOfZeros = 0;
-
-	if (lastUnsetCharacter>=firstUnsetCharacter)
-		{
-		if (iFlags&EFillWithLeadingZeros)
-			while (lastUnsetCharacter>=firstUnsetCharacter) text[lastUnsetCharacter--]=ZeroCharacter();
-		else
-			text.Delete(firstUnsetCharacter, (lastUnsetCharacter+1)-firstUnsetCharacter);
-		}
-	if (iFlags&EPreserveOldWidthBeforeEditing)
-		iMinimumWidthInPixels = WidthInPixels(aFont);
-	}
-
-// ---------------------------------------------------------
-// CLmkDecimalEditor::ValueFromText
-// ---------------------------------------------------------
-//
-TInt CLmkDecimalEditor::ValueFromText() const
-	{
-	if (!NumberOfDigits())
-		return iMinimumValue;
-	TInt i=0;
-	TInt valueFromText=0;
-	TBool isNegative=EFalse;
-	switch ((*iText)[i])
-		{
-	case '-':
-		++i;
-		isNegative=ETrue;
-		break;
-		}
-	TInt textLength=iText->Length();
-	for (; i<textLength; ++i)
-		{
-		TText digit=(*iText)[i];
-		if (i>=textLength-2)
-			{
-			if (!isNegative && valueFromText>(KMaxTInt32/10))
-				return KMaxTInt32;
-			else if (isNegative && (-valueFromText)<(KMinTInt32/10))
-				return KMinTInt32;
-			}
-		valueFromText=(valueFromText*10)+(TInt)(digit-ZeroCharacter());
-		}
-	if (isNegative==EFalse && valueFromText<0)
-		return KMaxTInt32;// Deals with overflow
-	if (isNegative)
-		valueFromText=-valueFromText;
-	return valueFromText;
-	}
-
-// ---------------------------------------------------------
-// CLmkDecimalEditor::ConvertsIntoValidValue
-// ---------------------------------------------------------
-//
-TBool CLmkDecimalEditor::ConvertsIntoValidValue(TInt& aValue) const
-	{
-	if ((iFlags&ERepresentsYear) && (aValue>=0) && (aValue<100))
-		{
-		TTime homeTime;
-		homeTime.HomeTime();
-		TInt currentYear=homeTime.DateTime().Year();
-		if (currentYear>0)
-			{
-			TInt yearsSinceStartOfCurrentCentury=currentYear%100;
-			TInt newValue=(currentYear-yearsSinceStartOfCurrentCentury)+aValue;
-            // If two digit year is given, 2000 + aValue is expected.
-    		aValue=newValue;
-			if ((newValue>=iMinimumValue) && (newValue<=iMaximumValue))
-				{
-				return ETrue;
-				}
-			}
-		}
-	return EFalse;
-	}
-
-// ---------------------------------------------------------
-// CLmkDecimalEditor::SetUninitialised
-// ---------------------------------------------------------
-//
-void CLmkDecimalEditor::SetUninitialised(TBool aUninitialised)
-	{
-	if (aUninitialised)
-		iFlags |= EIsUninitialised;
-	else
-		iFlags &= ~EIsUninitialised;
-	}
-
-// ---------------------------------------------------------
-// CLmkDecimalEditor::IsUninitialised
-// ---------------------------------------------------------
-//
-TBool CLmkDecimalEditor::IsUninitialised() const
-	{
-	return iFlags & EIsUninitialised;
-	}
-
-// ---------------------------------------------------------
-// CLmkDecimalEditor::RefreshDigitType
-// ---------------------------------------------------------
-//
-void CLmkDecimalEditor::RefreshDigitType( const CFont& aFont)
-	{
-	SetDigitType( AknTextUtils::NumericEditorDigitType(), aFont);
-	}
-
-// ---------------------------------------------------------
-// CLmkDecimalEditor::SetDigitType
-// ---------------------------------------------------------
-//
-void CLmkDecimalEditor::SetDigitType(TDigitType aDigitType, const CFont& aFont)
-	{
-	TInt value = Value();
-	iDigitType = aDigitType;
-	SetTextToValue(value, aFont);
-	}
-
-// ---------------------------------------------------------
-// CLmkDecimalEditor::DigitType
-// ---------------------------------------------------------
-//
-TDigitType CLmkDecimalEditor::DigitType() const
-	{
-	return iDigitType;
-	}
-