diff -r 000000000000 -r 3ee3dfdd8d69 extras/converter/Ui/Src/CCnvRatesForm.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/extras/converter/Ui/Src/CCnvRatesForm.cpp Mon Jan 18 20:20:33 2010 +0200 @@ -0,0 +1,844 @@ +/* +* 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: +* This is the implementation of the class defined in CCnvRatesForm.h +* +*/ + + + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include "CCnvRatesForm.h" +#include "CCnvApplication.h" + +#include + +#include +#include "Converter.hrh" + +#include //Header to be included for getting CEikEdwin Text to a number + +//CONSTANTS for Max Number of Added Currency +const TInt KMaxNumberAddCurrency = 40; + +CCnvRatesForm::CCnvRatesForm( TBool* aWantsRelaunch, TBool* aShouldExit, + TBool* aModelChanged, TCnvCategory& aCategory ) + : iWantsRelaunch( aWantsRelaunch ), iShouldExit( aShouldExit ), + iModelChanged( aModelChanged ), iCategory( aCategory ), + iLastUsedEditorId(-1) + { + } + +CCnvRatesForm::CCnvRatesForm() + { + + //Member variable set to False in the Constructor + iEKeyOk = EFalse; + } + +CCnvRatesForm::~CCnvRatesForm() + { + iFormIdMapArray.Close(); + iFormIdEdwinMapArray.Close(); + SetDefaultTitle(); + } + +void CCnvRatesForm::ConstructL() + { + // Use base class to construct menubar + CAknDialog::ConstructL( R_CNV_RATESFORM_MENUBAR ); + iCategory.CreateTempUnitArrayForRestore(); + iCategory.GetDefaultUnits( iSrcUnitIndexForRestore , iDesUnitIndexForRestore ); + iHistoryBaseUnit = iCategory.BaseUnit(); + } + +void CCnvRatesForm::GetHelpContext( TCoeHelpContext& aContext ) const + { + aContext.iMajor = KUidCnv; + aContext.iContext = KCNV_HLP_RATES; + } + +void CCnvRatesForm::ProcessCommandL( TInt aCommandId ) + { + // Base class handles EAknFormCmdSave among the other things + CAknForm::ProcessCommandL( aCommandId ); + + switch ( aCommandId ) + { + case ECmdAddCurrency: + { + AddNewCurrencyL(); + break; + } + case ECmdDeleteCurrency: + { + DeleteCurrencyL(); + break; + } + case ECmdChangeCurrencyName: + { + CmdChangeCurrencyNameL(); + break; + } + case ECmdSetAsBaseCurrency: + { + CmdSetAsBaseCurrencyL(); + break; + } + case EAknCmdHelp: + { + iEikonEnv->EikAppUi()->HandleCommandL( EAknCmdHelp ); + break; + } + case EEikCmdExit: + { + *iShouldExit = ETrue; + TryExitL( EAknSoftkeyBack ); + break; + } + default: + { + break; + } + } + } + +// Takes any action required when the current line is changed to aControlId. +void CCnvRatesForm::LineChangedL( TInt aControlId ) + { + + CEikFloatingPointEditor* editor = + static_cast< CEikFloatingPointEditor* >( Control( aControlId ) ); + + //editor->ClearSelectionL(); + editor->SetCursorPosL( editor->Text()->DocumentLength(), ETrue ); + + if ( iLastUsedEditorId > 0 ) + { + editor =static_cast ( Control( iLastUsedEditorId ) ); + TBuf editorText; + editor->GetText( editorText ); + + // Use local value for different area + TBuf<1> localeZero; + localeZero.AppendNum( 0 ); + AknTextUtils::LanguageSpecificNumberConversion( localeZero ); + if ( editorText.Length() > 1 && editorText[0] == localeZero[0] ) + { + // remove all leading zeroes + while ( editorText.Length() > 0 && editorText[0] == localeZero[0] ) + { + editorText.Delete( 0, 1 ); + } + // if too many zeroes removed, insert one. + TLocale locale; + if ( editorText.Length() == 0 || + TChar( editorText[0] ) == locale.DecimalSeparator() ) + { + editorText.Insert( 0, localeZero ); + } + editor->SetTextL( &editorText ); + editor->DrawDeferred(); + } + } + iLastUsedEditorId = aControlId; + } + +void CCnvRatesForm::DoNotSaveFormDataL() + { + iCategory.RestoreUnitArray(); + iCategory.SetDefaultUnits( iSrcUnitIndexForRestore , iDesUnitIndexForRestore ); + iCategory.SetBaseUnit( iHistoryBaseUnit ); + } + +// Saves values from form fields back to the model +TBool CCnvRatesForm::SaveFormDataL() + { + SetEditableL( ETrue ); + + const MDesCArray* names = iCategory.MdcArray(); + TInt len( names->MdcaCount() ); + TInt formIdIndex = 0; + for( TInt i = 0; i < len; i ++ ) + { + + if( i != iCategory.BaseUnit() ) + { + TInt formId = iFormIdMapArray[formIdIndex]; + //A seperate formIdIndex is maintained for the form as iFormIdMapArray + //does not have an index for Base Unit + formIdIndex++; + + TReal value = 0; //Contains the value of the editor + + if(KErrNotFound != iFormIdEdwinMapArray.Find(formId)) + { + TBuf<32> edText; + GetEdwinText( edText, formId ); + TInt64 power = 1; + TBool fraction = EFalse; + TChar ch; + + for(TInt i = 0; i < edText.Length(); i++) + { + ch = edText[i]; + + if(ch == '+') + { + if( i != 0 ) + { + value = 0; + break; + } + } + + else if(ch == '.') + { + fraction = ETrue; + } + else if(IsDigit(ch)) + { + value = value * 10 + ch.GetNumericValue(); + if(fraction) + { + power = power * 10; + } + } + } + value = value / power; + + } + else + { + value = FloatEditorValue( formId ); + } + iCategory.SetUnitFactor( i, /*FloatEditorValue( formId )*/value ); + } + } + + *iModelChanged = ETrue; + return ETrue; + } + +// Sets the focus to the topmost line of the form when the dialog is activated +void CCnvRatesForm::SetInitialCurrentLine() + { + CEikDialog::SetInitialCurrentLine(); + TRAP_IGNORE(TryChangeFocusToL( IdOfFocusControl() ) ); + } + +void CCnvRatesForm::PreLayoutDynInitL() + { + SetTitleL( ETrue ); + + const MDesCArray* currencies = iCategory.MdcArray(); + TInt len( currencies->MdcaCount() ); + + for( TInt i = 0; i < len; i++ ) + { + if( i != iCategory.BaseUnit() ) + { + // form controls don't like id = 0, so we need to do id += 1.. + CCoeControl* control = + CreateLineByTypeL( currencies->MdcaPoint( i ), + ActivePageId(), + i + 1, + EEikCtFlPtEd, + NULL ); + //Keep the id's of the form in an array so that deletion based on form ids is not a problem. + iFormIdMapArray.Append(i+1); + CEikFloatingPointEditor* editor = + static_cast< CEikFloatingPointEditor* >( control ); + editor->ConstructL( 0, 9e99, 12 ); // 9e99 = max TReal + TReal value( iCategory.UnitFactor( i ) ); + editor->SetValueL( &value ); + } + } + } + +void CCnvRatesForm::CmdChangeCurrencyNameL() + { + // 16 is long enough, current edit window max length is 13 + // (defined in R_CNV_UNITNAME_QUERY ) + TBuf< 16 > newName; + TBool nameOk( EFalse ); + + TInt controlId = IdOfFocusControl(); + TInt index = controlId - 1; + + index = iFormIdMapArray.Find( controlId ); //get the index where the id i + + TUint uintindex = index ;//To remove warnings + + if( uintindex >= iCategory.BaseUnit()) + { + index++; + } + const MDesCArray* names = iCategory.MdcArray(); + newName.Copy( names->MdcaPoint( index ).Left( MAXCURRENCYNAMELENGTH ) ); + + + TCurrencyType type = NewCurrencyNameDialogL( newName, nameOk ); + + if(nameOk) + { + iCategory.SetUnitName( index , newName , type); + Line( controlId )->SetCaptionL( newName ); + Line( controlId )->DrawDeferred(); + nameOk = ETrue; + *iModelChanged = ETrue; + } + } + + +void CCnvRatesForm::CmdSetAsBaseCurrencyL() + { + CAknQueryDialog* dlg = CAknQueryDialog::NewL(); + + if( dlg->ExecuteLD( R_CNV_CONFIRMATION_QUERY ) ) + { + // form controls don't like ID = 0, so IDs are unit id + 1; + TInt baseUnit; + TUint baseUnitIndex; //To remove warnings + //Get the current id of the form. + TInt currentFocusIndex = IdOfFocusControl(); + //Find the id in the map array + baseUnit = iFormIdMapArray.Find(currentFocusIndex); + baseUnitIndex = baseUnit; //To remove warnings + //adjust the baseUnitIndxex to the index in the Currency Category array.. + if( baseUnitIndex >= iCategory.BaseUnit()) + { + baseUnit++; + } + iHistoryBaseUnit = baseUnit; + iCategory.SetBaseUnit( baseUnit ); + + // Reset all currency rates to 1 + TInt len( iCategory.MdcArray()->MdcaCount() ); + for( TInt i = 0; i < len; i++ ) + { + iCategory.SetUnitFactor( i, 1.0 ); + } + + // Except the base unit factor is set to 1.0 + iCategory.SetUnitFactor( baseUnit, 1.0 ); + + // We have to destroy and relaunch the form + *iWantsRelaunch = ETrue; + delete this; + } + } + + +// Reset the title to default. Don't want a leave. +// If it fails, it fails. For use in the destructor. +void CCnvRatesForm::SetDefaultTitle() + { + TRAP_IGNORE(SetTitleL( EFalse ) ); + } + +void CCnvRatesForm::SetTitleL( TBool aNonDefault ) + { + CAknTitlePane* title = static_cast< CAknTitlePane* >( + iEikonEnv->AppUiFactory()->StatusPane()-> + ControlL( TUid::Uid( EEikStatusPaneUidTitle ) ) ); + + if( aNonDefault ) + { + TInt baseUnit = iCategory.BaseUnit(); + const MDesCArray* currencies = iCategory.MdcArray(); + TPtrC unitName = currencies->MdcaPoint( baseUnit ); + // stuff it into the title text's placeholder + HBufC* titleText = StringLoader::LoadL( R_CNV_RATESFORM_TITLE, + unitName, iEikonEnv ); + TPtr titleTextPtr = titleText->Des(); + CleanupStack::PushL( titleText ); + AknTextUtils::DisplayTextLanguageSpecificNumberConversion(titleTextPtr); + title->SetTextL( *titleText ); + CleanupStack::PopAndDestroy( titleText ); // titleText + } + else + { + title->SetTextToDefaultL(); + } + } + +void CCnvRatesForm::DynInitMenuPaneL( TInt aResourceId, CEikMenuPane* aMenuPane ) + { + //No delete option for more than two currencies + const MDesCArray* names = iCategory.MdcArray(); + TInt count = names->MdcaCount(); + + if (aResourceId == R_CNV_RATESFORM_MENUPANE) + { + + if(count <= 2) + { + aMenuPane->SetItemDimmed(ECmdDeleteCurrency, ETrue); + + } + else + { + aMenuPane->SetItemDimmed(ECmdDeleteCurrency, EFalse); + } + if(count >= KMaxNumberAddCurrency ) + { + aMenuPane->SetItemDimmed(ECmdAddCurrency, ETrue); + } + else + { + aMenuPane->SetItemDimmed(ECmdAddCurrency, EFalse); + } + if (!FeatureManager::FeatureSupported(KFeatureIdHelp)) + { + aMenuPane->SetItemDimmed(EAknCmdHelp, ETrue); + } + } + } +//New methods which will imlement add and delete currency implementation +void CCnvRatesForm::AddNewCurrencyL() + { + //_LIT(KDefaultText,"Foreign"); + //TBuf<16> newFieldPtr; + //newFieldPtr.Format(KDefaultText); + HBufC* foreignText = StringLoader::LoadLC( R_QTN_CNV_FOREIGN,iEikonEnv ); + TBuf<16> newFieldPtr; + + newFieldPtr.Copy(foreignText->Left(MAXCURRENCYNAMELENGTH)); + + TBool nameEntered(EFalse); + TCurrencyType type = NewCurrencyNameDialogL( newFieldPtr, nameEntered, ETrue ); + + TInt id = IdOfFocusControl(); //Get the focus controls id + TInt index = iFormIdMapArray.Find(id); //get the index where the id i + TInt indexOfCurrency = index; + TUint uintindex = indexOfCurrency;//To remove warnings + + if( uintindex >= iCategory.BaseUnit()) + { + indexOfCurrency++; + } + + if(nameEntered)//Dont add any field if the user cancels the dialog + { + TReal real = 1.0; + + iCategory.AddNewCurrencyL( indexOfCurrency + 1, newFieldPtr, real, type); + + //TInt newItemId = 0; + TInt newItemId = iFormIdMapArray[0]; + + //Get the largest formId present now in the form... + for(TInt i = 0; i < iFormIdMapArray.Count() ; i++ ) + { + if( newItemId < iFormIdMapArray[i]) + newItemId = iFormIdMapArray[i]; + } + + newItemId++; + + //Update the new FormId into the form id map array + if( index + 1 < iFormIdMapArray.Count() ) + { + iFormIdMapArray.Insert(newItemId,index + 1 ); + } + else + { + iFormIdMapArray.Append(newItemId); + } + + //Update the arrray which holds the CEikEdwin ids... + iFormIdEdwinMapArray.Append(newItemId); + + + CCoeControl* control = CreateLineByTypeL(newFieldPtr, ActivePageId(), + newItemId , EEikCtFlPtEd, NULL ) ; + CEikEdwin* edwin = STATIC_CAST( CEikEdwin*, control ); + + CEikFloatingPointEditor* fpEditor = STATIC_CAST( + CEikFloatingPointEditor*, control ); + fpEditor->SetMinMax( 0, 9e99 ); + edwin->ConstructL( EEikEdwinNoHorizScrolling | EEikEdwinResizable, 10, 12, 10 ); + edwin->SetAknEditorNumericKeymap( EAknEditorConverterNumberModeKeymap ); + + edwin->SetAknEditorAllowedInputModes( EAknEditorNumericInputMode ); + + edwin->SetAknEditorInputMode( EAknEditorNumericInputMode ); + edwin->SetAknEditorSpecialCharacterTable( 0 ); + + edwin->CreateTextViewL(); + Line( newItemId )->ActivateL(); + + // Set the editor's value at last and use a number instead of the fixed character. + SetFloatEditorValueL( IdOfFocusControl(), 1 ); + + *iModelChanged = ETrue; + } + CleanupStack::PopAndDestroy(); // foreignText HBufC + } + + +void CCnvRatesForm::DeleteCurrencyL() + { + + + TInt LineForDeletion = IdOfFocusControl(); + + TInt indexOfCurrency = iFormIdMapArray.Find(LineForDeletion); + TUint index = indexOfCurrency; //To remove warnings + + + if( index >= iCategory.BaseUnit()) + { + indexOfCurrency++; + } + + const MDesCArray* names = iCategory.MdcArray(); + + TBuf<16> currentName; + currentName.Copy( names->MdcaPoint( indexOfCurrency ).Left( MAXCURRENCYNAMELENGTH ) ); + + HBufC* confirmDelete = StringLoader::LoadLC( + R_QTN_CNV_CONFIRM_DELETE,currentName); + + CAknQueryDialog* dlg = CAknQueryDialog::NewL(); + dlg->SetPromptL( *confirmDelete); + + if( dlg->ExecuteLD( R_CNV_CONFIRMATION_QUERY ) ) + { + SetFormFlag( EDeleting, ETrue ); + + if (LineForDeletion) + { + iCategory.DeleteCurrencyL( indexOfCurrency ); + DeleteLine(LineForDeletion); + //SetFormFlag( EUnsavedEdit, ETrue ); + TInt index = iFormIdMapArray.Find(LineForDeletion); + iFormIdMapArray.Remove(index); + + if( index == iFormIdMapArray.Count()) + { + iLastUsedEditorId = iFormIdMapArray[index - 1]; + } + else + { + iLastUsedEditorId = iFormIdMapArray[index]; + } + } + + DrawNow(); + SetFormFlag( EDeleting, EFalse ); + *iModelChanged = ETrue; + } + CleanupStack::PopAndDestroy(); // confirmDelete; + } + +//This function launches a dialog to get the new currency name. +//Note can also be used for Rename Currency, but will be made use, afte the raised for that has been fixed +TCurrencyType CCnvRatesForm::NewCurrencyNameDialogL( TDes& aField, TBool& aNameEntered, TBool aIsAddNewCurrency ) + { + TBool nameOk( EFalse ); + TCurrencyType type = ENameChanged; + //TInt index = IdOfFocusControl() - 1; + TInt controlId = IdOfFocusControl(); + TInt index = iFormIdMapArray.Find( controlId ); //get the index where the id i + TUint uintindex = index ; //To remove warnings + if ( uintindex >= iCategory.BaseUnit() ) //get correct index + { + index++; + } + + const MDesCArray* names = iCategory.MdcArray(); + do + { + CAknTextQueryDialog* dlg = + new( ELeave ) CAknTextQueryDialog( aField ); + CleanupStack::PushL(dlg); + + if( dlg->ExecuteLD( R_CNV_UNITNAME_QUERY ) != EAknSoftkeyOk ) + { + aNameEntered = EFalse; + CleanupStack::Pop(dlg); // dlg + return type; + } + CleanupStack::Pop(dlg); // dlg + + // Search through all the names to see if the new name already exists + TInt len( names->MdcaCount() ); + TBool nameExists( EFalse ); + //Set the index larger than all when a new is added, make it compare with + //all of the item to judge if the name is already used + if ( aIsAddNewCurrency ) + { + index = len; + } + + for( TInt i = 0; i < len; i ++ ) + { + if( names->MdcaPoint( i ).Compare( aField ) == 0 ) + { + if ( i != index ) + { + nameExists = ETrue; + break; + } + } + } + + if( nameExists ) + { + // display error + HBufC* label = StringLoader::LoadLC( + R_QTN_FLDR_NAME_ALREADY_USED, aField ); + CAknErrorNote* note = new( ELeave ) CAknErrorNote( ETrue ); + note->ExecuteLD( *label ); + CleanupStack::PopAndDestroy(); // label; + } + else + { + nameOk = ETrue; + } + } + + while ( !nameOk ); + + HBufC* homeText = StringLoader::LoadLC( R_QTN_CNV_HOME,iEikonEnv ); + HBufC* foreignText = StringLoader::LoadLC( R_QTN_CNV_FOREIGN,iEikonEnv ); + TBuf<16> defaultTextPtr; + TBuf<16> homeTextPtr; + TInt equal; + + defaultTextPtr.Copy(foreignText->Left(MAXCURRENCYNAMELENGTH)); + homeTextPtr.Copy(homeText->Left(MAXCURRENCYNAMELENGTH)); + equal = defaultTextPtr.Compare(aField); + if(equal==0) + type = EForeign; + + equal = homeTextPtr.Compare(aField); + if(equal==0) + type = EHome; + + aNameEntered = nameOk; + CleanupStack::PopAndDestroy(); // foreignText HBufC + CleanupStack::PopAndDestroy(); // HomeText HBufC + + return type; + } +// +//ShowInvalidValueNoteL(TInt aEditorId) +// +void CCnvRatesForm::ShowInvalidValueNoteL(TInt aEditorId, TBool aSetValue) + { + HBufC* label = iCoeEnv->AllocReadResourceLC( + R_CNV_MAINFORM_INVALIDVALUE ); + CAknErrorNote* note = new( ELeave ) CAknErrorNote(ETrue); + note->ExecuteLD( *label ); + CleanupStack::PopAndDestroy(); // label; + if ( aSetValue ) + { + SetFloatEditorValueL( aEditorId, 0.0 ); + } + } + +// +//IsVaildNumberEntered(TInt aEditorId) +// +TBool CCnvRatesForm::IsVaildNumberEntered(TInt aEditorId) + { + + CEikFloatingPointEditor* editor = + static_cast< CEikFloatingPointEditor* >( Control( aEditorId ) ); + + if( editor->TextLength() == 0 ) + { + return EFalse; + } + + TReal real; + CAknNumericEdwin::TValidationStatus validationStatus = editor->GetValueAsReal(real); + + // The enter number is not valid if GetValueAsReal function's return value is not EValueValid + if( validationStatus != CAknNumericEdwin::EValueValid /* && validationStatus != CAknNumericEdwin::EValueTooLarge */ ) + { + return EFalse; + } + return ETrue; + + } + + +TBool CCnvRatesForm::OkToExitL(TInt aButtonId) + { + //Check for validity of the rates entered + TInt aControlId( IdOfFocusControl() ); + if(!IsVaildNumberEntered(aControlId)) + { + ShowInvalidValueNoteL(aControlId, ETrue ); + } + //Check which one of the two buttons'Options' or 'MSK' is pressed + if (aButtonId == EAknSoftkeyOptions && iEKeyOk) + { + //Make the variable False + iEKeyOk = EFalse; + return EFalse; + } + else + // Call the Base Class OkToExitL() + return CAknForm::OkToExitL(aButtonId); + + } +// +//OfferKeyEventL +// +TKeyResponse CCnvRatesForm::OfferKeyEventL(const TKeyEvent& aKeyEvent, TEventCode aType) +{ + + // Make the variable 'iEKeyOk' to True if and only if MSK is pressed. + if(aKeyEvent.iScanCode == EStdKeyDevice3 && aType == EEventKeyDown) + { + iEKeyOk = ETrue; + } + if(aKeyEvent.iScanCode == EStdKeyDevice0 && aType == EEventKeyDown && iEKeyOk) + { + iEKeyOk = EFalse; + } + + + TInt controlId1( IdOfFocusControl() ); + if(aType == EEventKeyDown) + { + if((aKeyEvent.iScanCode == EStdKeyDevice0) + ||(aKeyEvent.iScanCode == EStdKeyDevice1)||(aKeyEvent.iScanCode == EStdKeyDevice3) ) + { + if(!IsVaildNumberEntered(controlId1)) + { + iError=ETrue; + return EKeyWasConsumed; + } + } + } + + if(aType == EEventKeyUp && iError) + { + if((aKeyEvent.iScanCode == EStdKeyDevice0) + ||(aKeyEvent.iScanCode == EStdKeyDevice1)||(aKeyEvent.iScanCode == EStdKeyDevice3)) + { + ShowInvalidValueNoteL(controlId1, ETrue); + iError = EFalse; + return EKeyWasConsumed; + } + } + + // Return EKeyWasNotConsumed if OfferKeyEventL() does not handle any event. + if ( aType != EEventKey ) + { + return EKeyWasNotConsumed; + } + + if ( ( aKeyEvent.iScanCode == EStdKeyDownArrow ) || ( aKeyEvent.iScanCode == EStdKeyUpArrow ) ) + { + TInt controlId( IdOfFocusControl() ); + if ( !IsVaildNumberEntered( controlId ) ) + { + ShowInvalidValueNoteL( controlId, ETrue); + return EKeyWasConsumed; + } + } + return CAknForm::OfferKeyEventL( aKeyEvent, aType ); +} + +// ---------------------------------------------------- +// CCnvRatesForm::IsDigit +// Converts the digit from any digit mode (devangiri or arabic) +// to western digit and checks whether it is a valid digit or not. +// ---------------------------------------------------- +// +TBool CCnvRatesForm::IsDigit(TUint aChar) + { + TBuf<1> digit; + digit.Append(aChar); + + AknTextUtils::ConvertDigitsTo(digit , EDigitTypeWestern); + + TChar ch = digit[0]; + return ch.IsDigit(); + } + + +// ---------------------------------------------------- +// CCnvRatesForm::PrepareForFocusTransitionL +// Used for touch UI to display the invalid note if number +// is invalid +// ---------------------------------------------------- +// +void CCnvRatesForm::PrepareForFocusTransitionL() + { + // Check if touch is enabled or not + if ( !AknLayoutUtils::PenEnabled() ) + { + CAknForm::PrepareForFocusTransitionL(); + return; + } + + // Get the focus of the current control line + TInt controlId( IdOfFocusControl() ); + // Check for validity of the rate entered + if (!IsVaildNumberEntered( controlId ) ) + { + ShowInvalidValueNoteL(controlId, EFalse); + } + + // Delete the radix point if it is excrescent + else + { + CEikFloatingPointEditor* editor = + static_cast ( Control( controlId ) ); + TBuf< KEditorTextMaxLength > editorText; + editor->GetText( editorText ); + TInt editorTextLength = editorText.Length(); + TLocale local; + if ( editorText[ editorTextLength - 1 ] == local.DecimalSeparator() ) + { + editorText.Delete( editorTextLength - 1 , 1 ); + editor->SetTextL( &editorText ); + } + } + CAknForm::PrepareForFocusTransitionL(); + } + + +// ---------------------------------------------------- +// CCnvRatesForm::ActivateL +// Sets the control as ready to be drawn. +// ---------------------------------------------------- +// +void CCnvRatesForm::ActivateL() + { + CAknForm::ActivateL(); + CEikFloatingPointEditor* editor = + static_cast< CEikFloatingPointEditor* >( Control( IdOfFocusControl() ) ); + editor->SetCursorPosL( editor->Text()->DocumentLength(), ETrue ); + } +//End of file + +