extras/calcsoft/src/CalcEdit.cpp
branchRCL_3
changeset 21 10c6e6d6e4d9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/extras/calcsoft/src/CalcEdit.cpp	Wed Sep 01 12:29:54 2010 +0100
@@ -0,0 +1,969 @@
+/*
+* 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