extras/calcsoft/src/CalcEdit.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:29:54 +0100
branchRCL_3
changeset 24 10c6e6d6e4d9
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

/*
* 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:  Source file of "editor sub-pane", CCalcEditorSubPane class 
*                which derived from CCoeControl class. 
*                Role of this class is to draw editor.
*
*/


// INCLUDE FILES
#include <AknUtils.h>
#include <Calcsoft.rsg>
#include <avkon.hrh>
#include <aknsoundsystem.h>
#include    <applayout.cdl.h>
#include <AknIconUtils.h>
#include    <AknsDrawUtils.h>
#include  <aknlayoutscalable_avkon.cdl.h>  

#include <AknLayout2ScalableDef.h>
#include <AvkonInternalCRKeys.h>
#include    <aknlayoutscalable_apps.cdl.h>

#include "CalcAppUi.h"
#include "CalcCont.h"
#include "CalcDoc.h"
#include "CalcEdit.h"
#include "CalcEnv.h"
#include "CalcDrawingConst.laf" // for drawing information.
#include "fbs.h"
#include <PtiKeyMappings.h>

#include <PtiDefs.h>
#include <PtiEngine.h>
#include <AknFepInternalCRKeys.h>
#include <layoutmetadata.cdl.h>

//  LOCAL CONSTANTS AND MACROS  

// If const TChar is used, complie error occurs in THUMB build.
// To avoid this, #define is used.
#define KCalcHashBtn '#' 
#define KZero 0.0 

// ================= MEMBER FUNCTIONS =======================

// Two-phased constructor.
CCalcEditorSubPane* CCalcEditorSubPane::NewL(
                    CCalcContainer* aContainer)
    {
    CCalcEditorSubPane* self = new (ELeave) CCalcEditorSubPane();
    CleanupStack::PushL(self);
    self->ConstructL(aContainer);
    CleanupStack::Pop(self); 
    return self;
    }




// Destructor
CCalcEditorSubPane::~CCalcEditorSubPane()
    {
    iQwertyModeStatusProperty.Close();
    delete iEngine;
    delete iCRKey;
    }


// ---------------------------------------------------------
// CCalcEditorSubPane::EditLine
// Return reference of editor line which has been edited by user.
// (other items were commented in a header).
// ---------------------------------------------------------
//
const TCalcEditLine& CCalcEditorSubPane::EditLine() const
    {
    return iEditLine;
    }

// ---------------------------------------------------------
// CCalcEditorSubPane::SetEditorNumber
// Set TReal64 type editor number.
// (other items were commented in a header). 
// ---------------------------------------------------------
//
void CCalcEditorSubPane::SetOperator(
     TCalcEditLine::TCalcOperatorType aType)
    {
    iEditLine.SetOperator(aType);
    }

// ---------------------------------------------------------
// CCalcEditorSubPane::SetEditorNumber
// Set TReal64 type editor number.
// (other items were commented in a header). 
// ---------------------------------------------------------
//
void CCalcEditorSubPane::SetEditorNumber(TReal64 aNewNumber)
    {
    iEditorNumber = aNewNumber;
    iEditLine.SetNumber(aNewNumber);
    }
        
// ---------------------------------------------------------
// CCalcEditorSubPane::EditorNumber
// Return TReal64 type editor number
// (other items were commented in a header). 
// ---------------------------------------------------------
//
TReal64 CCalcEditorSubPane::EditorNumber() const
    {
    return iEditorNumber;
    }

// ---------------------------------------------------------
// CCalcEditorSubPane::ResetL
// Clear editor.
// (other items were commented in a header).
// ---------------------------------------------------------
//
void CCalcEditorSubPane::ResetL()
    {
    iEditLine.AllClear();  
    iEditLine.ClearL();
    }

// ---------------------------------------------------------
// CCalcEditorSubPane::ClearOperand
// Clear operand
// (other items were commented in a header).
// ---------------------------------------------------------
//
void CCalcEditorSubPane::ClearOperand()
    {
    iEditLine.ClearOperand();  
    }


// ---------------------------------------------------------
// CCalcEditorSubPane::ClearLastInput
// Clear last input.
// (other items were commented in a header).
// ---------------------------------------------------------
//
void CCalcEditorSubPane::ClearLastInputL()
    {
    const TPtrC number(iEditLine.NumberString());
    
    if (number.Length() == 1 && 
        iCalcContainer->View()->State() == CCalcView::EOperandOnly)
        {
        iCalcContainer->InputClearL();
        }
    else
        {
        if (iEditLine.CheckZeroL())
            {
            iCalcContainer->InputClearL();
            }
        else
            {
            ClearL();
            if (iEditLine.CheckZeroL() && 
                iCalcContainer->View()->State() == CCalcView::EOperandOnly)
                {
                iCalcContainer->InputClearL();
                }
            }
        }
    }

// ---------------------------------------------------------
// CCalcEditorSubPane::OfferShortPressClearKeyEventL
// Handle short-press-clear-key and CBA-clear-key event.
// (other items were commented in a header).
// ---------------------------------------------------------
//
void CCalcEditorSubPane::OfferShortPressClearKeyEventL()
    {
    CCalcView* view = iCalcContainer->View();
    CCalcView::TStateNo state(view->State());
    CCalcView::TKindOfInput latestInput(view->LatestInput());

    switch (latestInput)
        {
        case (CCalcView::EMemoryRecall):
        case (CCalcView::EOperator):
            {
            if (state == CCalcView::EOperandOnly ||
                iEditLine.CheckZeroL())
                {
                iCalcContainer->InputClearL();
                }
            else 
                {
                ClearOperand();
                }
            break;
            }
        case (CCalcView::EMemorySave):
            {
            if (state != CCalcView::EOperandAndOperator ||
                iEditLine.CheckZeroL())
                {
                iCalcContainer->InputClearL();
                }
            else
                {
                ClearOperand();
                }
            break;
            }
        case (CCalcView::EEqual):
            {
            iCalcContainer->InputClearL();
            break;
            }
        default:
            {
            ClearLastInputL();
            break;
            }
        }
    }

// ---------------------------------------------------------
// CCalcEditorSubPane::DoChangeSign
// Changing sign.
// This is not called when editor number is 0. 
// (other items were commented in a header).
// ---------------------------------------------------------
//
void CCalcEditorSubPane::DoChangeSignL(
     CCalcView::TStateNo aState)
    {
    // If current state is other than State1, "+/-" command is ignored.
    if (aState != CCalcView::EInitialMode)
        {
        if (aState == CCalcView::ESelectResult)
            {
            // "=" is disappeared from editor.
            iEditLine.SetOperator(TCalcEditLine::ECalcOperatorNone);  
            }
        
        iEditLine.ChangeSignL();
        iEditorNumber = iEditorNumber * (-1);
        DrawNow();
        }
    }

// ---------------------------------------------------------
// CCalcEditorSubPane::DoMemoryRecallOrLastResult
// Update editor number to memory or last result.
// (other items were commented in a header).
// ---------------------------------------------------------
//
void CCalcEditorSubPane::DoMemoryRecallOrLastResult(
                    TReal64 aMemoryOrLastResult, 
                    CCalcView::TStateNo aState)
    {
    if (aState == CCalcView::ESelectResult)
        {
        // "=" is disappeared from editor.
        iEditLine.SetOperator(TCalcEditLine::ECalcOperatorNone);
        }
    
    iEditLine.SetNumber(aMemoryOrLastResult);
    iEditorNumber = aMemoryOrLastResult;
    DrawNow();
    }


// ---------------------------------------------------------
// CCalcEditorSubPane::NotifyChangeDecimal
// Call when decimal separator is changed.
// (other items were commented in a header).
// ---------------------------------------------------------
//
void CCalcEditorSubPane::NotifyChangeDecimal(TChar aOld, TChar aNew)
    {
    iEditLine.ChangeDecimal(aOld, aNew);
    DrawNow();
    }
    
// ---------------------------------------------------------
// CCalcEditorSubPane::IsQwertyKeypadActive
// Called to check qwerty keypad is active or not
// (other items were commented in a header).
// ---------------------------------------------------------
//

TInt CCalcEditorSubPane::IsQwertyKeypadActive()
	{
 	TInt value = 0;
    iQwertyModeStatusProperty.Get(value);
    return value;
	}


// ---------------------------------------------------------
// CCalcEditorSubPane::OfferKeyEventL
// This function is called by CCalcContainer::OfferKeyEventL()
// when inputted key is number or "#". 
// (other items were commented in a header).
// ---------------------------------------------------------
//
TKeyResponse CCalcEditorSubPane::OfferKeyEventL
                ( const TKeyEvent& aKeyEvent,  
                  TEventCode aType )           
    {
	
    if (aType != EEventKey)
        {
        return EKeyWasNotConsumed;
        }
	TPtiKey keyQwertyValue = (TPtiKey)aKeyEvent.iScanCode;
    TChar decimal(iCalcAppEnv->DecimalSeparator());
#ifdef RD_INTELLIGENT_TEXT_INPUT
    TChar keyCode( aKeyEvent.iCode );
#else 
    TChar keyCode(aKeyEvent.iScanCode);
#endif
    TChar decimalkey(aKeyEvent.iCode);
    
    if( iDecimalCounter < KCalcMaxNumberWidth  )
    {
    	iAllowedDecimal.Append(decimal);
    	iDecimalCounter++;	
    }
    
		if(IsQwertyKeypadActive())
		{
 
#ifdef RD_INTELLIGENT_TEXT_INPUT
            if( MapDecimal(aKeyEvent) || MapDecimal(aKeyEvent) ||aKeyEvent.iCode == KCalcHashBtn )
                {
                keyCode = decimal;
                }		    	
#else
		    if(MapDecimal(keyQwertyValue,EPtiCaseUpper) || MapDecimal(keyQwertyValue,EPtiCaseLower) ||aKeyEvent.iCode == KCalcHashBtn )
		      {
		      keyCode = decimal;
		      }
#endif
                  //}
		}
	else
		{
		if (aKeyEvent.iCode == KCalcHashBtn)
	        {
	        keyCode = decimal;
	        }	
		}
    
    TKeyResponse response(EKeyWasNotConsumed);
    CCalcView* view = iCalcContainer->View();
    
    if (keyCode.IsDigit() || keyCode == decimal)
        {
        DrawDeferred();
        iCalcContainer->ProcessPreinputL();
        view->iLastResultSetected = EFalse;
        // Append input to editor space if editor space is not full.
        TRAPD(errorCode, iEditLine.AppendL(keyCode));

        //  If editor space is full, error message is shown.
        if (errorCode)  
            {
            CAknKeySoundSystem* soundSystem = 
                iCalcAppEnv->AppUi()->KeySounds();
            if (soundSystem)
                {
                soundSystem->PlaySound(EAvkonSIDInformationTone);
                }
            }
        else
            {
            if (iEditLine.CheckZeroL() && 
                iEditLine.Operator() == TCalcEditLine::ECalcOperatorNone)
                {
                view->UpdateState(CCalcView::EAllClear);
                }
            else
                {
                view->UpdateState(CCalcView::EOperand);
                }
            iEditorNumber = iEditLine.NumberL();
            }
		
		// Enable ChangeSign and Square root buttons
		// if there is no 0 in the editor.
		iCalcContainer->SetChangeSignEnableL();
		iCalcContainer->SetSqrtEnableL();
        iCalcContainer->SetClearKeyEnable();
        
		// Enable the Percent button if the calculator
		// is in correct state and there is no 0 in the editor.
		if ( iCalcContainer->GetState() == CCalcView::EOperandAndOperator || 
			 iCalcContainer->GetState() == CCalcView::EOperandAndOperatorAndOperand )
			if (keyCode.IsDigit())
				iCalcContainer->SetPercentEnableL();
		
			response = EKeyWasConsumed;
        }
    else if (decimalkey == EKeyBackspace)   
        {view->iLastResultSetected = EFalse;
        DrawDeferred();
        //  If Clear-Key is pressed long, number editor and operand
        // is clear and the state is set initial one.
        if (aKeyEvent.iRepeats)  
            {
            iCalcContainer->InputClearL();
            }
        // If Clear-key is pressed short, the latest input is deleted.
        else   
            {
            OfferShortPressClearKeyEventL();
            }
        iEditorNumber = iEditLine.NumberL();
        iCalcContainer->SetChangeSignEnableL();
		iCalcContainer->SetSqrtEnableL();
        iCalcContainer->SetClearKeyEnable();
        		
        if ( iCalcContainer->GetState() == CCalcView::EOperandAndOperator || 
        	 iCalcContainer->GetState() == CCalcView::EOperandAndOperatorAndOperand ||
        	 iEditorNumber == KZero )
            iCalcContainer->SetPercentEnableL();
        response = EKeyWasConsumed;
        }
        	
    return response;
    }

// C++ default constructor can NOT contain any code, that
// might leave.
//
CCalcEditorSubPane::CCalcEditorSubPane()
    {
  
    }

// Second-phase constructor
void CCalcEditorSubPane::ConstructL
        (CCalcContainer* aContainer) 
    {
    // The state is set initial one.
    // Number editor is set "0".
    iEditLine.ClearL();
    iEditorNumber = 0.0;

    SetContainerWindowL(*aContainer);
    
    iCalcContainer = aContainer;  
    // Load calc_display bitmap 
    iCalcAppEnv = CCalcAppEnv::Static();
    iCalcSideLDisplay = iCalcAppEnv->DisplaySideLBitmap();
    iCalcCenterDisplay = iCalcAppEnv->DisplayCenterBitmap();
    iCalcSideRDisplay = iCalcAppEnv->DisplaySideRBitmap();
    iIsQwertyActive = 0;
    User::LeaveIfError(iQwertyModeStatusProperty.Attach(KCRUidAvkon, KAknQwertyInputModeActive));
  
    // Try to get the English key mappings. If those are not available, use the 
    // mappings of the current input language. The order is this because all mappings
    // do not necessarily contain all characters neeeded by the Calculator.
    iLanguage = ELangEnglish;
    iEngine = CPtiEngine::NewL(ETrue);
    iCoreLanguage = static_cast<CPtiCoreLanguage*>(iEngine->GetLanguage( iLanguage ));

    if( !iCoreLanguage )
        {
        iCRKey = CRepository::NewL(KCRUidAknFep);
        TInt ret = iCRKey->Get(KAknFepInputTxtLang,iLanguage);
        if( ret!= KErrNone )
            {
            //Exit application if server is busy( Error Raised )
            iAvkonViewAppUi->Exit();
            }
            iCoreLanguage = static_cast<CPtiCoreLanguage*>(iEngine->GetLanguage(iLanguage));
        }
    
    RProperty::Get( KCRUidAvkon, KAknKeyBoardLayout, iKeyboardType );

    if( iCoreLanguage )
        {
#ifdef RD_INTELLIGENT_TEXT_INPUT
        if ( iKeyboardType == EPtiKeyboardHalfQwerty)
           {
           iHalfQwertyKeyMappings = static_cast<CPtiHalfQwertyKeyMappings*>(iCoreLanguage->GetHalfQwertyKeymappings());
           }
       else
#endif
          {
          iQwertyKeyMappings = static_cast<CPtiQwertyKeyMappings*>(iCoreLanguage->GetQwertyKeymappings());
          }
        }
    
#ifdef RD_INTELLIGENT_TEXT_INPUT
        
    if ( iKeyboardType == EPtiKeyboardHalfQwerty )
        { 
        iEngine->ActivateLanguageL( iLanguage, EPtiEngineHalfQwerty );
        }
    else if ( IsQwertyKeypadActive())
        { 
        iEngine->ActivateLanguageL( iLanguage, EPtiEngineQwerty );
        } 
       
  //      RProperty::Get( KCRUidAvkon, KAknKeyBoardLayout, iKeyboardType );
        iEngine->SetKeyboardType( TPtiKeyboardType (iKeyboardType ));
        
#endif
        
    // UI language is used to determine the used number format.
    iUiLanguage = User::Language();
    iDecimalCounter = 0;
    }
    
// ---------------------------------------------------------
// CCalcEditorSubPane::IsQwertyActive
// (other items were commented in a header).
// ---------------------------------------------------------
//
void CCalcEditorSubPane::IsQwertyActive()
    {
    iIsQwertyActive = 1;
    }
    
// ---------------------------------------------------------
// CCalcEditorSubPane::IsQwertyNotActive
// (other items were commented in a header).
// ---------------------------------------------------------
//
void CCalcEditorSubPane::IsQwertyNotActive()
    {
    iIsQwertyActive = 0;
    } 

// ---------------------------------------------------------
// CCalcEditorSubPane::ClearL
// Clear 1 charactor from editor.
// (other items were commented in a header).
// ---------------------------------------------------------
//
void CCalcEditorSubPane::ClearL()
    {
    iEditLine.ClearL();
    }

// ---------------------------------------------------------
// CCalcEditorSubPane::SizeChanged
// Size of control is set. 
// (other items were commented in a header).
// ---------------------------------------------------------
//
void CCalcEditorSubPane::SizeChanged()
    {
    TRect parentRect(iCalcContainer->Rect());
    TRect EditorPaneRect(iCalcContainer->EditorPane()->Rect());
    

	if (!(AknLayoutUtils::ScalableLayoutInterfaceAvailable()))
		{
		iLayoutText[ECalcEditorOperandShadow].LayoutText(
			parentRect,AppLayout::Calculator_texts_Line_1(),iCalcAppEnv->NumberShadowFont());
		}


                    
     	if (AknLayoutUtils::ScalableLayoutInterfaceAvailable())
			{
                        if( iUiLanguage == ELangFarsi || iUiLanguage == ELangUrdu || iUiLanguage == ELangArabic
                            || iUiLanguage == ELangHindi )
				{
				TAknTextLineLayout layout1; 
			    if( AknLayoutUtils::PenEnabled() )
    	        {
    	            layout1	= AknLayoutScalable_Apps:: calc_display_pane_t1(enTouch_enabled).LayoutLine();
    	        }
    	        else
    	        {
    	            layout1	= AknLayoutScalable_Apps:: calc_display_pane_t1(enTouch_disabled).LayoutLine();    
    	        }     
				// Do this only in A&H etc. variants...
				layout1.iFont &= 0xFFFFFFF0; // clear first 4 bits (font category)
				layout1.iFont |= 0x00000001; // set first 4 bits to primary font category value (=1)					

                // When the pen enable and the current screen is transverse,
                // Enlarge the size of parent rect.
                if ( AknLayoutUtils::PenEnabled() && Layout_Meta_Data::IsLandscapeOrientation() )
                    {
                    TRect enlargeEditorPaneRect;
                    enlargeEditorPaneRect = EditorPaneRect;
                    // Enlarging the parent rect, so that the editor could display a long number absolutely.
                    enlargeEditorPaneRect.iBr.iX += EEnlargeFive;
                    enlargeEditorPaneRect.iTl.iX -= EEnlargeTwenty;
                    iLayoutText[ECalcEditorOperand].LayoutText( enlargeEditorPaneRect,
					                                 layout1, iCalcAppEnv->NumberFont() );
                    }
                else
                    {
				iLayoutText[ECalcEditorOperand].LayoutText(EditorPaneRect,
						layout1,iCalcAppEnv->NumberFont());
                    }
				}
			else
				{
				 if( AknLayoutUtils::PenEnabled() )
				 {
                    // If the current screen is transverse,enlarge the size of parent rect.
                    if ( Layout_Meta_Data::IsLandscapeOrientation() )
                        {
                        TRect enlargeEditorPaneRect;
                        enlargeEditorPaneRect = EditorPaneRect;
                        // Enlarging the parent rect, so that the editor could display a long number absolutely.
                        enlargeEditorPaneRect.iBr.iX += EEnlargeFive;
                        enlargeEditorPaneRect.iTl.iX -= EEnlargeTwenty;
                        iLayoutText[ECalcEditorOperand].LayoutText( enlargeEditorPaneRect,
                             AknLayoutScalable_Apps::calc_display_pane_t1( enTouch_enabled ).LayoutLine(), iCalcAppEnv->NumberFont() );
                        }
                    else
                        {
				    iLayoutText[ECalcEditorOperand].LayoutText(EditorPaneRect,
					AknLayoutScalable_Apps::calc_display_pane_t1(enTouch_enabled).LayoutLine(),iCalcAppEnv->NumberFont());    
                        }   
				 }
				 else
				 {
				    iLayoutText[ECalcEditorOperand].LayoutText(EditorPaneRect,
					AknLayoutScalable_Apps::calc_display_pane_t1(enTouch_disabled).LayoutLine(),iCalcAppEnv->NumberFont());    
				 }
				}
			}
		else
			{
       		// Set layout for number
    		iLayoutText[ECalcEditorOperand].LayoutText(
            	parentRect,AppLayout::Calculator_texts_Line_2(),iCalcAppEnv->NumberFont());  
       		}


	if (!(AknLayoutUtils::ScalableLayoutInterfaceAvailable()))
		{
		iLayoutText[ECalcEditorOperatorShadow].LayoutText(
			parentRect,AppLayout::Calculator_texts_Line_3(),iCalcAppEnv->OperatorShadowFont());   
		}


     if (AknLayoutUtils::ScalableLayoutInterfaceAvailable())
		{
    	    if( AknLayoutUtils::PenEnabled() )
    	    {
    	        iLayoutText[ECalcEditorOperator].LayoutText(EditorPaneRect,
    			AknLayoutScalable_Apps::calc_display_pane_t2(enTouch_enabled).LayoutLine(),iCalcAppEnv->OperatorFont());
    	    }
    	    else
    	    {
    	        iLayoutText[ECalcEditorOperator].LayoutText(EditorPaneRect,
    			AknLayoutScalable_Apps::calc_display_pane_t2(enTouch_disabled).LayoutLine(),iCalcAppEnv->OperatorFont());
    	    }
		}
	
	else
       	{
       		// Set layout for operator
    	iLayoutText[ECalcEditorOperator].LayoutText(
                parentRect,AppLayout::Calculator_texts_Line_4(),iCalcAppEnv->OperatorFont());   
       	} 
                        
    if (AknLayoutUtils::ScalableLayoutInterfaceAvailable())
		{
		    if( AknLayoutUtils::PenEnabled() )
		    {
		        iLayoutText[ECalcEditorMemory].LayoutText(EditorPaneRect,
				AknLayoutScalable_Apps::calc_display_pane_t3(enTouch_enabled).LayoutLine(),NULL);    
		    }
		    else
		    {
		        iLayoutText[ECalcEditorMemory].LayoutText(EditorPaneRect,
				AknLayoutScalable_Apps::calc_display_pane_t3(enTouch_disabled).LayoutLine(),NULL);
		    }
		}
	else
		{
		//	Set layout for memory indicator shadow
		iLayoutText[ECalcEditorMemoryShadow].LayoutText(
			parentRect,AppLayout::Calculator_texts_Line_5(),NULL);
		// Set layout for memory indicator
		iLayoutText[ECalcEditorMemory].LayoutText(
			parentRect,AppLayout::Calculator_texts_Line_6(),NULL); 
		}
	
	if( AknLayoutUtils::ScalableLayoutInterfaceAvailable() )
		{               
		TAknWindowLineLayout layoutOfDisplay;
		if( AknLayoutUtils::PenEnabled() )
		{
		    layoutOfDisplay =  AknLayoutScalable_Apps:: bg_calc_display_pane(enTouch_enabled).LayoutLine();    
		}
		else
		{
		    layoutOfDisplay =  AknLayoutScalable_Apps:: bg_calc_display_pane(enTouch_enabled).LayoutLine();    
		}
		
		TAknWindowLineLayout layoutOfSideLDisplay = AknLayoutScalable_Apps:: bg_calc_display_pane_g1().LayoutLine();              
		TAknWindowLineLayout layoutOfCenterDisplay = AknLayoutScalable_Apps:: bg_calc_display_pane_g2().LayoutLine();             
		TAknWindowLineLayout layoutOfSideRDisplay  = AknLayoutScalable_Apps:: bg_calc_display_pane_g3().LayoutLine();
		TAknLayoutRect rectParent;
		rectParent.LayoutRect(iCalcContainer->EditorPane()->Rect(),layoutOfDisplay) ;
		iSideLDisplayLayout.LayoutRect(rectParent.Rect(),layoutOfSideLDisplay);
		iCenterDisplayLayout.LayoutRect(rectParent.Rect(),layoutOfCenterDisplay);          
		iSideRDisplayLayout.LayoutRect(rectParent.Rect(),layoutOfSideRDisplay);  
		}
    }


// ---------------------------------------------------------
// CCalcEditorSubPane::Draw
// Drawing editor
// (other items were commented in a header).
// ---------------------------------------------------------
//
void CCalcEditorSubPane::Draw
              (const TRect& aRect) const   
    {
    // Get a graphics context
     CWindowGc& gc = SystemGc();
    gc.Clear(aRect);
    gc.SetClippingRect(aRect);
    // Draw calc_display outline
    TRect rect(Rect()); 
    MAknsSkinInstance* skin = AknsUtils::SkinInstance();
	AknsDrawUtils::Background( skin, AknsDrawUtils::ControlContext(this), this, gc, rect );
                                   
    AknIconUtils::SetSize(iCalcSideLDisplay->Bitmap(),iSideLDisplayLayout.Rect().Size(),EAspectRatioNotPreserved);
	AknIconUtils::SetSize(iCalcSideLDisplay->Mask(), iSideLDisplayLayout.Rect().Size(),EAspectRatioNotPreserved);  
	
	AknIconUtils::SetSize(iCalcCenterDisplay->Bitmap(),iCenterDisplayLayout.Rect().Size(),EAspectRatioNotPreserved);
	AknIconUtils::SetSize(iCalcCenterDisplay->Mask(), iCenterDisplayLayout.Rect().Size(),EAspectRatioNotPreserved);        
                    
    AknIconUtils::SetSize(iCalcSideRDisplay->Bitmap(),iSideRDisplayLayout.Rect().Size(),EAspectRatioNotPreserved);
	AknIconUtils::SetSize(iCalcSideRDisplay->Mask(), iSideRDisplayLayout.Rect().Size(),EAspectRatioNotPreserved);     

	iSideLDisplayLayout.DrawImage(gc, iCalcSideLDisplay->Bitmap(),iCalcSideLDisplay->Mask());
	iCenterDisplayLayout.DrawImage(gc,iCalcCenterDisplay->Bitmap(),iCalcCenterDisplay->Mask());
	iSideRDisplayLayout.DrawImage(gc, iCalcSideRDisplay->Bitmap(),iCalcSideRDisplay->Mask());
	
	TRgb shadowcolor ;
	AknsUtils::GetCachedColor( skin,shadowcolor, KAknsIIDQsnTextColors, EAknsCIQsnTextColorsCG31);
	
	TRgb color;
    AknsUtils::GetCachedColor( skin, color, KAknsIIDQsnTextColors, EAknsCIQsnTextColorsCG30);
    TBuf<256> keyvalue ;

    if (iUiLanguage == ELangFarsi || iUiLanguage == ELangArabic 
            || iUiLanguage == ELangHindi || iUiLanguage == ELangUrdu)
	    {
	    TPtrC number(iEditLine.NumberString());
	    keyvalue.Append(number);
	    AknTextUtils::LanguageSpecificNumberConversion  (keyvalue);
	    }

	if (!(AknLayoutUtils::ScalableLayoutInterfaceAvailable()))
		{
                    if ( iUiLanguage == ELangArabic || iUiLanguage == ELangUrdu )
		    {
		        TInt len = keyvalue.Length();
			    TInt pos = KErrNotFound;
			    TBuf<1> ch;
			    ch.Append(iCalcAppEnv->MinusIndicator());
			    if( (pos = keyvalue.Locate(iCalcAppEnv->MinusIndicator())) != KErrNotFound &&
			         pos == keyvalue.LocateReverse(iCalcAppEnv->MinusIndicator()))
			    {
			     keyvalue.Delete( pos, 1 );
			     keyvalue.Insert( 0, ch );	 
			    }
			iLayoutText[ECalcEditorOperandShadow].DrawText(gc, keyvalue,EFalse,shadowcolor);
			}
                    else if( iUiLanguage == ELangHindi || iUiLanguage == ELangFarsi )
			{
			 iLayoutText[ECalcEditorOperandShadow].DrawText(gc, keyvalue,EFalse,shadowcolor);	
			}
		else 
			{
			iLayoutText[ECalcEditorOperandShadow].DrawText(gc, iEditLine.NumberString(),EFalse,shadowcolor);	
			}
		}

    if ( iUiLanguage == ELangArabic || iUiLanguage == ELangUrdu )
	    {
	        TInt len = keyvalue.Length();
		    TInt pos = KErrNotFound;
		    TBuf<1> ch;
		    ch.Append(iCalcAppEnv->MinusIndicator());
		    if( (pos = keyvalue.Locate(iCalcAppEnv->MinusIndicator())) != KErrNotFound &&
		         pos == keyvalue.LocateReverse(iCalcAppEnv->MinusIndicator()))
		    {
		     keyvalue.Delete( pos, 1 );
		     keyvalue.Insert( 0, ch );	 
		    }
	    iLayoutText[ECalcEditorOperand].DrawText(gc, keyvalue,EFalse,color);
		}
    else if( iUiLanguage == ELangHindi || iUiLanguage == ELangFarsi )
		{
	    iLayoutText[ECalcEditorOperand].DrawText(gc, keyvalue,EFalse,color);
		}
    else
	    {
		iLayoutText[ECalcEditorOperand].DrawText(gc, iEditLine.NumberString(),EFalse,color);
		}

	TCalcEditLine::TCalcOperatorType operatorType(
		iEditLine.Operator());
	TPtrC operatorString(
		iCalcAppEnv->EditorOperator(operatorType));

	if (!(AknLayoutUtils::ScalableLayoutInterfaceAvailable()))
		{
		iLayoutText[ECalcEditorOperatorShadow].DrawText(gc,operatorString,EFalse,shadowcolor);
		}

   	iLayoutText[ECalcEditorOperator].DrawText(gc, operatorString,EFalse,color);
    CCalcDocument* calcDocument = 
        STATIC_CAST(CCalcDocument*, iCalcAppEnv->AppUi()->Document());
    if (calcDocument->HasMemory())
        {
        TPtrC mIndicatorShadow(
            iCalcAppEnv->MemoryIndicatorShadow());
        TPtrC mIndicator(iCalcAppEnv->MemoryIndicator());


	if (!(AknLayoutUtils::ScalableLayoutInterfaceAvailable()))
		{
		iLayoutText[ECalcEditorMemoryShadow].DrawText(gc, mIndicatorShadow);
		}


        iLayoutText[ECalcEditorMemory].DrawText(gc, mIndicator);
        }
    }
    
// ---------------------------------------------------------
// CCalcEditorSubPane::MapNumericChar
// Redraw percent button, either normal or dimmed.
// (other items were commented in a header).
// ---------------------------------------------------------
//		
#ifdef RD_INTELLIGENT_TEXT_INPUT
TBool CCalcEditorSubPane::MapDecimal( TKeyEvent aKeyEvent )
    {
    const TInt KMaxNumCharsPerCase = 50;
    TBuf<KMaxNumCharsPerCase> keys;

    TPtiKey aKey = ( TPtiKey )aKeyEvent.iScanCode;
    if( !keys.Length() )
            {
            keys.Append( aKeyEvent.iCode );
            }

    if ( keys.Length() > 0 )
        {
        TUint16 firstChar = keys[0];
        switch ( firstChar )		
            {
            case KPtiPinyinMarker:
            case KPtiStrokeMarker:
            case KPtiZhuyinMarker:
            case KPtiCangjieMarker:
            case KPtiGetAllMarker:
            if ( keys.Length() > 1 )
                {
                firstChar = keys[1];
                }
            default:
                break;
            }
        TInt loc = iAllowedDecimal.Locate( firstChar );

                if ( ( loc != KErrNotFound ) )/*|| (HandleSpeciallyForChineseNubers(aKey, aCase)))*/
            {
            return ETrue;
            }
        }
    return EFalse;
    }

#else
TBool CCalcEditorSubPane::MapDecimal( TPtiKey aKey, TPtiTextCase aCase )	
    {
    const TInt KMaxNumCharsPerCase = 50;
    TBuf<KMaxNumCharsPerCase> keys;

    iQwertyKeyMappings->GetDataForKey( aKey, keys, aCase );

    if ( keys.Length() > 0 )
        {
        TUint16 firstChar = keys[0];
        switch ( firstChar )
            {
            case KPtiPinyinMarker:
            case KPtiStrokeMarker:
            case KPtiZhuyinMarker:
            case KPtiCangjieMarker:
            case KPtiGetAllMarker:
                if ( keys.Length() > 1 )
                    {
                    firstChar = keys[1];
                    }
            default:
                break;
            }
        TInt loc = iAllowedDecimal.Locate( firstChar );

                if ( ( loc != KErrNotFound ) )/*|| (HandleSpeciallyForChineseNubers(aKey, aCase)))*/
            {
            return ETrue;
            }
        }
    return EFalse;
    }
#endif
	
// ---------------------------------------------------------
// CCalcEditorSubPane::EditPaneRect
// This function gives the editor pane layout.
// (other items were commented in a header).
// ---------------------------------------------------------
//

TRect CCalcEditorSubPane::EditPaneRect()
   {
   TRect parentRect(Rect()); 
   return 	parentRect;
   }
   
// ---------------------------------------------------------
// CCalcEditorSubPane::HandlePointerEventL
// Handled when there is a pen input in EditorPane.
// (other items were commented in a header).
// ---------------------------------------------------------
//   
void CCalcEditorSubPane::HandlePointerEventL
            ( const TPointerEvent& aPointerEvent )           
    {
    TRect memoryLayoutRect = iLayoutText[ECalcEditorMemory].TextRect();
    CCalcDocument* calcDocument = 
        STATIC_CAST( CCalcDocument*, iCalcAppEnv->AppUi()->Document() );
    if( ( memoryLayoutRect.Contains( aPointerEvent.iPosition ) ) && ( calcDocument->HasMemory() ) )
        {
        // When we set the memory value to the editor, 
        // We should change the menu item "Lase Result"'s flag to "EFalse".
        iCalcContainer->View()->iLastResultSetected = EFalse;
        iCalcContainer->View()->HandleMemoryRecallL();
        }

    }

// End of file  CALCEDIT_CPP