extras/calcsoft/src/CalcCont.cpp
changeset 0 3ee3dfdd8d69
child 10 ebe992a85829
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/extras/calcsoft/src/CalcCont.cpp	Mon Jan 18 20:20:33 2010 +0200
@@ -0,0 +1,1165 @@
+/*
+* 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 "CCalcContainer",  CCalcContainer class 
+*                which derived from CCoeControl class. Role of this class 
+*                is to update the calculator data and display on user's input.
+*
+*/
+
+
+// INCLUDE FILES
+#include    <aknkeys.h>
+#include    <AknUtils.h>   // AknLayoutUtils::LayoutControl 
+#include    <Calcsoft.rsg>
+
+#include	<layoutmetadata.cdl.h>
+
+// For skin support. 
+#include    <AknsDrawUtils.h>
+#include    <AknsConstants.h>
+#include    <AknsUtils.h>
+#include    <AknsBasicBackgroundControlContext.h>
+#include    <applayout.cdl.h>
+#include    <aknlayoutscalable_apps.cdl.h>
+#include    <csxhelp/calc.hlp.hrh> // for help context of Calculator
+#include    "CalcApp.h" 
+
+#include    "CalcAppUi.h"
+#include    "CalcCont.h"
+#include    "CalcDoc.h"
+#include    "CalcEdit.h"
+#include    "CalcFunc.h"
+#include    "CalcOutSheet.h"
+#include    "calc.hrh"
+#include    "CalcView.h"
+#include	"CalcEnv.h"
+#include    "CalcHistory.h"
+#include    "CalcDrawingConst.laf" // for layout information
+
+
+#include <AknDef.h>
+#include <eiksbfrm.h> 
+#include <eikscrlb.h>
+
+
+#define KEY_CODE_VAL 57 //for all number inputs
+#define ASCII_ZERO 48
+
+//  LOCAL CONSTANTS AND MACROS  
+const TInt KCallBackDelay(1000000); // In microseconds
+const TInt KCallBackInterval(1000000); // In microseconds
+const TInt KCallBackPriority(CActive::EPriorityUserInput);
+
+// Count of controls in Calculator.
+// Controls are editor pane, output sheet, and function map.
+// Therefore, this count is 3.  
+const TInt KCalcCountOfControls(3);
+
+// Define index of control
+enum TCalcControlIndex
+    {
+    ECalcControlFunctionMap,
+    ECalcControlOutputSheet,
+	ECalcControlEditorPane
+    };
+
+// If const TChar is used, complie error occurs in THUMB build.
+// To avoid this, #define is used.
+#define KCalcAsteriskBtn '*'
+
+
+// ================= MEMBER FUNCTIONS =======================
+
+// Two-phased constructor.
+CCalcContainer* CCalcContainer::NewL(
+                    CCalcView* aView)
+    {
+    CCalcContainer* self = new (ELeave) CCalcContainer();
+    CleanupStack::PushL(self);
+    self->ConstructL(aView);
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+
+// Destructor
+CCalcContainer::~CCalcContainer()
+    {
+    delete iEditorPane;
+    delete iFuncmapPane;
+    delete iSheetPane;
+
+    delete iTimeout;
+
+    if ( iTimeoutChr )
+    	{
+        delete iTimeoutChr;
+        iTimeoutChr = NULL;
+    	}
+    if ( iTimeoutShift )
+    	{
+        delete iTimeoutShift;
+        iTimeoutShift = NULL;
+    	}
+
+    delete iSkinContext;
+    }
+
+// ---------------------------------------------------------
+// CCalcContainer::ProcessPreinputL
+// This function is called when decimal point or a digit is inputted.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCalcContainer::ProcessPreinputL()
+    {
+    TInt currentState = iView->State();
+    CCalcView::TKindOfInput latestInput(iView->LatestInput());
+
+    if (currentState == CCalcView::ESelectResult)  
+                              // State 5 : User has selected result
+        {
+        iEditorPane->ResetL();  // Set editline "0"
+        iView->UpdateState(CCalcView::EAllClear);
+        iCalcDocument->AddEmptyLine();
+        iSheetPane->ScrollToBottomL();
+        ScrollArrowUpdate();
+        }
+    else if (currentState == CCalcView::EOperandAndOperator ||  
+                                           // State 3 : operand and operator
+             latestInput == CCalcView::EMemoryRecall  ||
+             latestInput == CCalcView::EMemorySave)
+        {   
+        iEditorPane->ClearOperand();
+        }
+    }
+
+// ---------------------------------------------------------
+// CCalcContainer::InputClearL
+// This function should be called when editor is cleared.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCalcContainer::InputClearL()
+    {
+    iEditorPane->ResetL();
+    iView->UpdateState(CCalcView::EAllClear);
+    
+    const TCalcEditLine lastLine((*(iCalcDocument->History()))[0]);  
+                                              // Get latest historical line.
+    const TPtrC number(lastLine.NumberString());
+    
+    //  If latest historical line is not empty,
+    // empty line is added in the history and the history is shown.
+    if ( number.Length() )
+        {
+        iCalcDocument->AddEmptyLine();
+        iSheetPane->ScrollToBottomL();
+        ScrollArrowUpdate();
+        }
+    }
+
+// ---------------------------------------------------------
+// CCalcContainer::ScrollArrowUpdate
+// This function should be called when OutputSheet is scrolled
+// or history is added.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCalcContainer::ScrollArrowUpdate()
+    {
+    iFuncmapPane->RedrawScrollButtons();
+    }
+
+// ---------------------------------------------------------
+// CCalcContainer::SetChangeSignEnableL
+// This function is called when number of editor is changed.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCalcContainer::SetChangeSignEnableL()
+    {
+    TCalcEditLine editLine(iEditorPane->EditLine());
+    TBool changeSignEnable(ETrue);
+    
+    if (editLine.NumberL() == 0.0)
+        {
+        changeSignEnable = EFalse;    
+        }
+    
+    iFuncmapPane->SetChangeSignEnable(changeSignEnable);
+    }
+
+// ---------------------------------------------------------
+// CCalcContainer::SetClearKeyEnable
+// This function is called when number of editor is changed.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCalcContainer::SetClearKeyEnable() 
+    {
+    TCalcEditLine editLine( iEditorPane->EditLine() );
+    TBool clearKeyEnable( ETrue );
+    
+    // eitline's number is 0.0 and length is 1  and the no operator
+    TRAP_IGNORE(
+        {
+        if ( editLine.CheckZeroL() && ( editLine.Operator() ==
+            TCalcEditLine::ECalcOperatorNone ) )
+            {
+            clearKeyEnable = EFalse; 
+            }
+        }
+    )
+    iFuncmapPane->SetClearKeyEnable( clearKeyEnable );
+    }
+
+// ---------------------------------------------------------
+// CCalcContainer::SetChangeSignDisable
+// This function is called when Operator +, - , *, / key is pressed.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCalcContainer::SetChangeSignDisable()
+    {
+    
+    TBool changeSignEnable(EFalse);
+    iFuncmapPane->SetChangeSignEnable(changeSignEnable);
+    
+    }
+
+// ---------------------------------------------------------
+// CCalcContainer::SetSqrtEnableL
+// This function is called when number of editor is changed.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCalcContainer::SetSqrtEnableL()
+    {
+	TCalcEditLine editLine(iEditorPane->EditLine());
+	TBool sqrtEnable(ETrue);
+    
+    if (editLine.NumberL() == 0.0)
+        {
+        sqrtEnable = EFalse;    
+		}
+	iFuncmapPane->SetSqrtEnable(sqrtEnable);
+	}
+
+// ---------------------------------------------------------
+// CCalcContainer::SetPercentEnableL
+// This function is called when number of editor is changed.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCalcContainer::SetPercentEnableL()
+    {
+	TCalcEditLine editLine(iEditorPane->EditLine());
+	TBool percentEnable(ETrue);
+    
+    if (editLine.NumberL() == 0.0)
+        {
+        percentEnable = EFalse;    
+		}
+	iFuncmapPane->SetPercentEnable(percentEnable);
+	}
+
+
+// ---------------------------------------------------------
+// CCalcContainer::TimeoutCallbackL
+// If no key is pressed after pressing *-button and a few time
+// passes, this function is called    
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TInt CCalcContainer::TimeoutCallbackL(
+                         TAny* aObject)
+    {
+    STATIC_CAST(CCalcContainer*, aObject)->DoTimeoutL();
+    return 0;
+    }
+
+// ---------------------------------------------------------
+// CCalcContainer::TimeoutCallbackL
+// If no key is pressed after pressing */button and a few time
+// passes, this function is called    
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TInt CCalcContainer::TimeoutCallbackChrL(
+                         TAny* aObject)
+    {
+    STATIC_CAST( CCalcContainer*, aObject )->DoTimeoutChrL();
+    return 0;
+    }
+// ---------------------------------------------------------
+// CCalcContainer::TimeoutCallbackL
+// If no key is pressed after pressing +#button and a few time
+// passes, this function is called    
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TInt CCalcContainer::TimeoutCallbackShiftL(
+                         TAny* aObject)
+    {
+    STATIC_CAST(CCalcContainer*, aObject)->DoTimeoutShiftL();
+    return 0;
+    }
+
+// ---------------------------------------------------------
+// CCalcContainer::NotifyChangeDecimal
+// Call when decimal separator is changed.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCalcContainer::NotifyChangeDecimal(TChar aOld, TChar aNew)
+    {
+    iEditorPane->NotifyChangeDecimal(aOld, aNew);
+    iSheetPane->DrawNow();
+    }
+
+
+// ---------------------------------------------------------
+// CCalcContainer::GetHelpContext
+// This function is called when Help application is launched.  
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCalcContainer::GetHelpContext(
+                TCoeHelpContext& aContext) const
+    {
+    aContext.iMajor = KUidCalc;
+    aContext.iContext = KCALC_HLP_MAIN;
+    }
+
+// C++ default constructor can NOT contain any code, that
+// might leave.
+//
+CCalcContainer::CCalcContainer():
+    iPrevInput(EKeyNull) 
+    {
+    }
+
+// Second-phase constructor
+void CCalcContainer::ConstructL(
+                     CCalcView* aView)
+    {
+    iView = aView;
+    CCalcAppUi* appui = CCalcAppEnv::Static()->AppUi();
+    iCalcDocument = STATIC_CAST(CCalcDocument*, appui->Document());
+    
+    // Make a window-owning control.
+    CreateWindowL();
+    
+    
+    
+    iFuncmapPane = CCalcFuncmapSubPane::NewL(this);
+    iSheetPane = CCalcOutputSheet::NewL(this);
+	iEditorPane = CCalcEditorSubPane::NewL(this);
+
+    iTimeout = CPeriodic::NewL(KCallBackPriority);
+ 
+    iTimeoutChr = CPeriodic::NewL( KCallBackPriority );
+    iTimeoutShift = CPeriodic::NewL( KCallBackPriority );
+
+    TRect rect(0, 0, 0, 0); 
+    // Temporary rect is passed. Correct rect is set in SizeChanged.
+    iSkinContext = CAknsBasicBackgroundControlContext::NewL(
+        KAknsIIDQsnBgAreaMainCalc, rect, EFalse);
+        iValue = 0;
+
+    // Set status pane layout usual.
+    CEikonEnv::Static()->AppUiFactory()->StatusPane()->SwitchLayoutL( R_AVKON_STATUS_PANE_LAYOUT_USUAL ); 
+    }
+    
+void CCalcContainer::ActivateL()
+    {
+    
+    CCoeControl::ActivateL();   
+    SetChangeSignEnableL();
+    SetSqrtEnableL();
+    SetPercentEnableL();
+    ScrollArrowUpdate();
+    SetClearKeyEnable(); 
+    }
+    
+
+// ---------------------------------------------------------
+// CCalcContainer::DoTimeoutL
+// If no key is pressed until timeout of *-key,
+// this function is called.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCalcContainer::DoTimeoutL()
+    {
+    iTimeout->Cancel();
+    iFuncmapPane->NotifyTimeoutL(); 
+    }
+
+// ---------------------------------------------------------
+// CCalcContainer::DoTimeoutL
+// If no key is pressed until timeout of */key,
+// this function is called.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCalcContainer::DoTimeoutChrL()
+    {
+    iTimeoutChr->Cancel();
+    iFuncmapPane->NotifyTimeoutL(); 
+    }
+// ---------------------------------------------------------
+// CCalcContainer::DoTimeoutL
+// If no key is pressed until timeout of +#key,
+// this function is called.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCalcContainer::DoTimeoutShiftL()
+    {
+    iTimeoutShift->Cancel();
+    iFuncmapPane->NotifyTimeoutL(); 
+    }
+
+// ---------------------------------------------------------
+// CCalcContainer::HandleAsterKeyTimeoutForKeyPressL
+// Called when any key is pressed.
+// If timeout notifier for *-key is active, make calculation or
+// stop notifier according to user's input.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TBool CCalcContainer::HandleAsterKeyTimeoutForKeyPressL(
+     const TKeyEvent& aKeyEvent, TEventCode aType)
+    {
+    if (!(iTimeout->IsActive()))
+        {
+        return EFalse;
+        }
+
+    TBool ret(EFalse);
+    
+    if (aKeyEvent.iModifiers & EModifierShift)
+        {
+        // Stop timer for *-key and make calculaiton.
+        DoTimeoutL();
+        }
+
+    if (aType == EEventKey)
+        {
+        switch (aKeyEvent.iCode)
+            {
+            // Stop timer and no calculation is made 
+            // if pressed arrow or OK key.
+            // This depends on spec of Editing.
+            case EKeyLeftArrow:
+            case EKeyRightArrow:
+            case EKeyUpArrow:
+            case EKeyDownArrow:
+            case EKeyOK:
+                {
+                DoTimeoutL();
+                ret = ETrue;
+                break;
+                }
+            // Stop timer if *-key is pressed. 
+            // If release *-key, reset timer for the key.       
+            case KCalcAsteriskBtn:
+                {
+                iTimeout->Cancel();
+                break;
+                }
+            default:
+                {
+                // Stop timer for *-key and make calculaiton.
+                DoTimeoutL();
+                break;
+                }
+            }
+        }
+    return ret;
+    }
+
+// ---------------------------------------------------------
+// CCalcContainer::HandleAsterKeyTimeoutForKeyPressL
+// Called when any key is pressed.
+// If timeout notifier for */key is active, make calculation or
+// stop notifier according to user's input.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TBool CCalcContainer::HandleChrKeyTimeoutForKeyPressL(
+     const TKeyEvent& aKeyEvent, TEventCode aType )
+    {
+    if ( !( iTimeoutChr->IsActive() ) )
+        {
+        return EFalse;
+        }
+
+    TBool ret( EFalse );
+    
+    if ( aKeyEvent.iModifiers & EModifierShift )
+        {
+        DoTimeoutChrL();
+        }
+    if ( aKeyEvent.iModifiers & EModifierFunc )
+        {
+        // Stop timer for */key and make calculaiton.
+        iTimeoutChr->Cancel();
+        } 
+
+    if ( aType == EEventKey )
+        {
+        switch ( aKeyEvent.iCode )
+            {
+            // Stop timer and no calculation is made 
+            // if pressed arrow or OK key.
+            // This depends on spec of Editing.
+            case EKeyLeftArrow:
+            case EKeyRightArrow:
+            case EKeyUpArrow:
+            case EKeyDownArrow:
+            case EKeyOK:
+                {
+                DoTimeoutChrL();
+                ret = ETrue;
+                break;
+                }
+            default:
+                {
+                // Stop timer for */key and make calculaiton.
+                DoTimeoutChrL();
+                break;
+                }
+            }
+        }
+    return ret;
+    }
+// ---------------------------------------------------------
+// CCalcContainer::HandleAsterKeyTimeoutForKeyPressL
+// Called when any key is pressed.
+// If timeout notifier for +#key is active, make calculation or
+// stop notifier according to user's input.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TBool CCalcContainer::HandleShiftKeyTimeoutForKeyPressL(
+     const TKeyEvent& aKeyEvent, TEventCode aType )
+    {
+    if ( !( iTimeoutShift->IsActive() ) )
+        {
+        return EFalse;
+        }
+
+    TBool ret( EFalse );
+    
+    if ( aKeyEvent.iModifiers & EModifierShift )
+        {
+        // Stop timer for +#key and make calculaiton.
+        iTimeoutShift->Cancel();
+        }
+    if ( aKeyEvent.iModifiers & EModifierFunc )
+        {
+        DoTimeoutShiftL();
+        }    
+
+    if ( aType == EEventKey )
+        {
+        switch ( aKeyEvent.iCode )
+            {
+            // Stop timer and no calculation is made 
+            // if pressed arrow or OK key.
+            // This depends on spec of Editing.
+            case EKeyLeftArrow:
+            case EKeyRightArrow:
+            case EKeyUpArrow:
+            case EKeyDownArrow:
+            case EKeyOK:
+                {
+                DoTimeoutShiftL();
+                ret = ETrue;
+                break;
+                }
+            default:
+                {
+                // Stop timer for +#key and make calculaiton.
+                DoTimeoutShiftL();
+                break;
+                }
+            }
+        }
+    return ret;
+    }
+
+// ---------------------------------------------------------
+// CCalcContainer::CountComponentControls
+// Return count of control components.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TInt CCalcContainer::CountComponentControls() const
+    {
+    return KCalcCountOfControls ;
+    }
+
+// ---------------------------------------------------------
+// CCalcContainer::ComponentControl
+// Return control pointer which correspond to argument aIndex 
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+CCoeControl* CCalcContainer::ComponentControl
+                ( TInt aIndex ) const   
+    {
+    CCoeControl* control = NULL; 
+        
+    switch (aIndex)
+        {
+        case ECalcControlEditorPane:
+            {
+            control = iEditorPane;
+            break;
+            }
+        case ECalcControlFunctionMap:
+            {
+            control = iFuncmapPane;
+            break;
+            }
+        case ECalcControlOutputSheet:
+            {
+            control = iSheetPane;
+            break;
+            }
+        default:
+            {         
+            break;
+            }
+        }
+
+    return control;
+    }
+
+// ---------------------------------------------------------
+// CCalcContainer::OfferKeyEventL
+// This function is called when a key is pressed.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TKeyResponse CCalcContainer::OfferKeyEventL
+                ( const TKeyEvent& aKeyEvent,  
+                  TEventCode aType )           
+    {
+    switch (aType)
+        {
+        case EEventKeyDown:
+        case EEventKey:
+            {
+            if (aKeyEvent.iScanCode != EStdKeyLeftArrow &&
+            aKeyEvent.iScanCode != EStdKeyRightArrow &&
+            aKeyEvent.iScanCode != EStdKeyUpArrow &&
+            aKeyEvent.iScanCode != EStdKeyDownArrow &&
+            aKeyEvent.iCode != EKeyOK)
+                {
+                iFuncmapPane->NotifyOtherThanOkKeyPressed();
+                }
+            iPrevInput = aKeyEvent.iCode;
+
+            if(!(iFuncmapPane->IsQwertyKeypadActive()))
+             {
+            if (HandleAsterKeyTimeoutForKeyPressL(aKeyEvent, aType))
+                {
+                return EKeyWasConsumed;
+                }
+            }
+#ifdef RD_INTELLIGENT_TEXT_INPUT
+            else
+                {
+                if ( iFuncmapPane->GetKeyboardType() == EPtiKeyboardHalfQwerty )
+                	{
+                    if ( HandleChrKeyTimeoutForKeyPressL( aKeyEvent, aType ) )
+                        {
+                        return EKeyWasConsumed;
+                        }  
+                    if ( HandleShiftKeyTimeoutForKeyPressL( aKeyEvent, aType ) )
+                        {
+                        return EKeyWasConsumed;
+                        } 
+                    }
+                }
+#endif
+
+            iValue =1 ;
+            break;
+            }
+        case EEventKeyUp:
+            {
+            if(!(iFuncmapPane->IsQwertyKeypadActive()))
+             {
+            	
+            if (iPrevInput == KCalcAsteriskBtn && !iTimeout->IsActive() && iValue ==1 )
+                {
+                TCallBack callback(TimeoutCallbackL, this);
+                iTimeout->Start((TTimeIntervalMicroSeconds32) KCallBackDelay,
+                                (TTimeIntervalMicroSeconds32) KCallBackInterval, 
+                                callback);
+                }
+            }
+#ifdef RD_INTELLIGENT_TEXT_INPUT  
+            else
+                {
+                if ( iFuncmapPane->GetKeyboardType() == EPtiKeyboardHalfQwerty )
+                	{
+                    if ( aKeyEvent.iScanCode == EStdKeyLeftFunc && !iTimeoutChr->IsActive() && iValue == 1 )
+                        {
+                        TCallBack callback( TimeoutCallbackChrL, this );
+                        iTimeoutChr->Start( ( TTimeIntervalMicroSeconds32 ) KCallBackDelay,
+                                     ( TTimeIntervalMicroSeconds32 ) KCallBackInterval, 
+                                     callback );
+                        }
+                    if ( aKeyEvent.iScanCode == EStdKeyLeftShift && !iTimeoutShift->IsActive() && iValue == 1 )
+                        {
+                        TCallBack callback( TimeoutCallbackShiftL, this );
+                        iTimeoutShift->Start( ( TTimeIntervalMicroSeconds32 ) KCallBackDelay,
+                                     ( TTimeIntervalMicroSeconds32 ) KCallBackInterval, 
+                                     callback );
+                        }
+            	    }
+                }
+#endif
+
+            iFuncmapPane->NotifyReleaseKeyL();
+            iValue =0;
+            
+            DrawNow(); //redraw screen when a button up
+            break;
+            }
+        default:
+            {
+            break;
+            }
+        }
+
+    TKeyResponse keyResponse(iFuncmapPane->OfferKeyEventL(aKeyEvent, aType));
+    if (keyResponse == EKeyWasNotConsumed)
+        {
+        if(iFuncmapPane->IsQwertyKeypadActive())
+             {
+             iEditorPane->IsQwertyActive();
+             }
+        else
+        	{
+        	iEditorPane->IsQwertyNotActive();	
+        	}
+        // Edit buffer of line
+        keyResponse = iEditorPane->OfferKeyEventL(aKeyEvent, aType);
+        }
+    return keyResponse;
+    }
+
+// ---------------------------------------------------------
+// CCalcContainer::HandleResourceChange
+// Notifier for changing language
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCalcContainer::HandleResourceChange(TInt aType)
+    {
+    TRAP_IGNORE( HandleResourceChangeCalSoftL( aType ) );
+    }
+
+// ---------------------------------------------------------
+// CCalcContainer::HandleResourceChange
+// Notifier for changing language
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCalcContainer::HandleResourceChangeCalSoftL(TInt aType)
+    {
+    if ((aType == KEikDynamicLayoutVariantSwitch) || (aType == KAknsMessageSkinChange) )
+        {
+         	    
+	     TRect mainPaneRect ;
+	     TRect statusPaneRect;
+	     TBool signstate = EFalse;
+	     TBool sqrtstate = EFalse;
+	     TBool percentstate = EFalse;
+        TBool clearstate = EFalse;
+        	     
+        if ( Layout_Meta_Data::IsLandscapeOrientation() )
+            {
+            // when calculator is in Landscape layout, the statuspane displays     
+            iEikonEnv->AppUiFactory()->StatusPane()
+                ->SwitchLayoutL( R_AVKON_STATUS_PANE_LAYOUT_USUAL );
+            AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, mainPaneRect );
+            }
+        else
+            {
+            AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, mainPaneRect );
+            AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EStatusPane, statusPaneRect );
+            mainPaneRect.iTl = statusPaneRect.iTl;
+            }
+	    
+	    
+	    //check if funcpane already exists
+
+      TInt selected = 0;
+	    if(iFuncmapPane)
+	    {
+	    	//store the  states of the buttons
+	        signstate = iFuncmapPane->GetChangeSignButtonState();
+	        sqrtstate = iFuncmapPane->GetSqrtButtonState();
+	        percentstate = iFuncmapPane->GetPercentButtonState();
+
+            selected = iFuncmapPane->GetSelectedButtonId();
+            
+            clearstate = iFuncmapPane->GetClearButtonState(); 
+         	
+         	//delete the function pane
+	        delete(iFuncmapPane);
+	        iFuncmapPane =  NULL;
+	        
+	    }
+        //Reload the bitmaps
+        (CCalcAppEnv::Static())->SetSkinChangedValue(EFalse);
+        (CCalcAppEnv::Static())->UpdateAknConstArrayForFuncMap();
+        (CCalcAppEnv::Static())->LoadFuncMapBitmapL();
+	    
+        //Create the new pane
+        iFuncmapPane = CCalcFuncmapSubPane::NewL(this); 
+
+        if ( AknLayoutUtils::PenEnabled() )
+        {		    
+        iFuncmapPane->SetHighlightButton( 0, selected );   
+        }
+        
+        iFuncmapPane->ActivateL();
+        
+        SetRect(mainPaneRect);
+        iFuncmapPane->NotifyLangChange();
+        DrawNow();
+
+        //Restore the states of the buttons
+        iFuncmapPane->SetChangeSignEnable(signstate);
+        iFuncmapPane->SetSqrtEnable(sqrtstate);
+        iFuncmapPane->SetPercentEnable(percentstate);
+        iFuncmapPane->SetClearKeyEnable( clearstate );
+        
+        //Update scroll bar here
+        ScrollArrowUpdate();
+				iSheetPane->HandleResourceChange(aType);
+        }
+    else
+        {
+        
+        CCoeControl::HandleResourceChange(aType);
+        }
+      
+    }
+ 
+
+// ---------------------------------------------------------
+// CCalcContainer::SizeChanged
+// Control size is set.
+// This function is called when the size changes.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCalcContainer::SizeChanged()
+    {
+    TRect parentRect(Rect());
+    
+    if (iSkinContext)
+        {
+        iSkinContext->SetRect(parentRect);
+        }
+
+    
+	if( AknLayoutUtils::ScalableLayoutInterfaceAvailable() )
+		{
+    		 
+    		// Set layout of function map subpane, output sheet  and editor sub pane.		
+    	    if( AknLayoutUtils::PenEnabled() )
+    	    {
+    	        if (Layout_Meta_Data::IsLandscapeOrientation())
+    	        {
+    	        
+    	        	AknLayoutUtils::LayoutControl(
+    			    iFuncmapPane, parentRect, AknLayoutScalable_Apps::grid_calc_pane(enTouch_with_lsc).LayoutLine());
+    			    
+    	            AknLayoutUtils::LayoutControl(
+    		    	iSheetPane, parentRect,AknLayoutScalable_Apps::calc_paper_pane(enTouch_with_lsc).LayoutLine());
+    		    		
+    		        AknLayoutUtils::LayoutControl(
+    			    iEditorPane, parentRect,AknLayoutScalable_Apps::calc_display_pane(enTouch_with_lsc).LayoutLine());
+    	        }
+    	        else
+    	        {
+    	            AknLayoutUtils::LayoutControl(
+    			    iFuncmapPane, parentRect, AknLayoutScalable_Apps::grid_calc_pane(enTouch_with_prt).LayoutLine());
+    			    
+    	            AknLayoutUtils::LayoutControl(
+    		    	iSheetPane, parentRect,AknLayoutScalable_Apps::calc_paper_pane(enTouch_with_prt).LayoutLine());
+    		    	
+    		    	AknLayoutUtils::LayoutControl(
+    			    iEditorPane, parentRect,AknLayoutScalable_Apps::calc_display_pane(enTouch_with_prt).LayoutLine());
+    	        }
+    	    }
+    	    else
+    	    {
+    	        AknLayoutUtils::LayoutControl(
+    			    iFuncmapPane, parentRect, AknLayoutScalable_Apps::grid_calc_pane(enTouch_disabled).LayoutLine());
+    			    
+    		    AknLayoutUtils::LayoutControl(
+    			iSheetPane, parentRect,AknLayoutScalable_Apps::calc_paper_pane(enTouch_disabled).LayoutLine());
+    			
+    			AknLayoutUtils::LayoutControl(
+    			iEditorPane, parentRect,AknLayoutScalable_Apps::calc_display_pane(enTouch_disabled).LayoutLine());
+    		    
+    	    }	
+
+		}
+	else
+		{
+    // Set layout of function map subpane.
+    AknLayoutUtils::LayoutControl(
+	iFuncmapPane, parentRect, AppLayout::grid_calc_pane());	
+	
+	
+    // Set layout of output sheet.
+    AknLayoutUtils::LayoutControl(
+		 iSheetPane, parentRect,AppLayout::gqn_graf_calc_paper());
+	
+	// Set layout of editor subpane.
+    AknLayoutUtils::LayoutControl(
+        iEditorPane, parentRect,AppLayout::Calculator_elements_Line_1());
+		}	
+	}
+
+// ---------------------------------------------------------
+// CCalcContainer::Draw
+// Clear whole screen. After this, draw editor, output sheet,
+// and function map.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCalcContainer::Draw(const TRect& aRect) const
+    {
+    CWindowGc& gc = SystemGc();
+    gc.Clear(aRect);
+
+    // Drawing skin
+    if (iSkinContext)
+        {
+        MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+        
+        AknsDrawUtils::Background(
+            skin, iSkinContext, this, gc, aRect);
+        }
+     
+    }
+
+// ---------------------------------------------------------
+// CCalcContainer::MopSupplyObject()
+// Pass skin information if need.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TTypeUid::Ptr CCalcContainer::MopSupplyObject(TTypeUid aId)
+    {
+    if (aId.iUid == MAknsControlContext::ETypeId && iSkinContext)
+        {
+        return MAknsControlContext::SupplyMopObject(aId, iSkinContext);
+        }
+
+    return CCoeControl::MopSupplyObject(aId);
+    }
+
+// ---------------------------------------------------------
+// CCalcContainer::ShowSqrtButton()
+// Enable (or disable) the square root button.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCalcContainer::ShowSqrtButton(TBool aEnable)
+	{
+		iFuncmapPane->SetSqrtEnable(aEnable);
+	}	
+
+// ---------------------------------------------------------
+// CCalcContainer::ShowPercentButton()
+// Enable (or disable) the percent button.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCalcContainer::ShowPercentButton(TBool aEnable)
+	{
+		iFuncmapPane->SetPercentEnable(aEnable);
+	}
+
+// ---------------------------------------------------------
+// CCalcContainer::GetState()
+// Returns the state of the calculator.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+CCalcView::TStateNo CCalcContainer::GetState()
+{
+	return (iView->State());
+}
+
+// ---------------------------------------------------------
+// CCalcContainer::HandlePointerEventL
+// Handled when pen input occured.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCalcContainer::HandlePointerEventL
+                ( const TPointerEvent& aPointerEvent )           
+    {
+    CCoeControl::HandlePointerEventL( aPointerEvent );
+    }
+    
+
+// ---------------------------------------------------------
+// ---------------------------------------------------------
+// CCalcContainer::HandleMiddleSoftKey()
+// Handled when MSK is selected.
+// ---------------------------------------------------------
+//
+void CCalcContainer::HandleMiddleSoftKey()
+                
+	{
+	TRAP_IGNORE( iFuncmapPane->HandleMiddleSoftKeyOREKeyOKL() );
+	}
+
+// ---------------------------------------------------------
+// ---------------------------------------------------------
+// SetOperatorFromTouchL
+// Handle digit inputs
+// ---------------------------------------------------------
+//
+void CCalcContainer::SetOperatorFromTouchL(TInt akey )
+{
+	  //Simulate events as events are occurring from the KB Events
+	  TKeyEvent eventkey;
+	  TEventCode keycode;
+    keycode = EEventKeyDown;
+    eventkey.iCode = 0;
+    eventkey.iScanCode = ASCII_ZERO + akey;
+    
+    //First send Keydown event
+   	OfferKeyEventL(eventkey,keycode);
+#ifdef RD_INTELLIGENT_TEXT_INPUT
+    eventkey.iCode = ASCII_ZERO + akey;
+#else
+    eventkey.iCode = KEY_CODE_VAL;
+#endif
+    keycode = EEventKey;
+    
+    //Next send EventKey
+    OfferKeyEventL(eventkey,keycode);
+    
+    
+    //Finally send Keyup
+    eventkey.iScanCode = ASCII_ZERO + akey;
+    keycode = EEventKeyUp;
+    OfferKeyEventL(eventkey,keycode);
+}
+
+// ---------------------------------------------------------
+// ---------------------------------------------------------
+// ClearInputKeyL
+// Handle 'c' input key from Touch
+// ---------------------------------------------------------
+//
+void CCalcContainer::ClearInputKeyL(TInt aRepeat)
+{
+	  //Simulate events as events are occurring from the KB Events
+	TKeyEvent eventkey;
+	TEventCode keycode;
+    keycode = EEventKeyDown;
+    eventkey.iCode = 0; 
+    eventkey.iScanCode = 1; //for clear input key
+    eventkey.iRepeats = aRepeat;
+    
+    //First send Keydown event
+    OfferKeyEventL(eventkey,keycode);
+    eventkey.iCode = 8;  //clear input key icode
+    keycode = EEventKey;
+    
+    //Next send EventKey
+    OfferKeyEventL(eventkey,keycode);
+    keycode = EEventKeyUp;
+    
+     //Finally send Keyup
+    OfferKeyEventL(eventkey,keycode);    
+    
+}
+
+
+// ---------------------------------------------------------
+// ---------------------------------------------------------
+// SetSeparatorFromTouch
+// Handle '.' input key from Touch
+// ---------------------------------------------------------
+//
+void CCalcContainer::SetSeparatorFromTouchL()
+{
+    // set the right iCode and iScanCode for
+    // decimal point
+    if ( iFuncmapPane->IsQwertyKeypadActive() )
+        {
+        // Simulate events as events are occurring from the KB Events
+        TKeyEvent eventkey;
+        TEventCode keycode = EEventKeyDown;
+        eventkey.iCode = 0;
+#ifdef RD_INTELLIGENT_TEXT_INPUT  
+        if ( iFuncmapPane->GetKeyboardType() == EPtiKeyboardHalfQwerty )
+        	{
+            eventkey.iScanCode = 126;  //scan code for separator
+        	}
+        else
+#endif
+        	{
+            eventkey.iScanCode = 122;  //scan code for separator
+        	}
+
+        // First send Keydown event
+        OfferKeyEventL( eventkey, keycode );
+        eventkey.iCode = 46;  // icode for separator
+        keycode = EEventKey;
+
+        // Next send EventKey
+        OfferKeyEventL( eventkey, keycode );
+        }
+    else
+        {
+        // Simulate events as events are occurring from the KB Events	
+        TKeyEvent eventkey;
+        TEventCode keycode = EEventKeyDown;
+        eventkey.iCode = 0;
+        eventkey.iScanCode = 127;  // scan code for separator
+
+        // First send Keydown event
+        OfferKeyEventL( eventkey, keycode );
+        eventkey.iCode = 35;  // icode for separator
+        keycode = EEventKey;
+
+        // Next send EventKey
+        OfferKeyEventL( eventkey, keycode );
+        }     
+}
+   
+//  End of File  CALCCONT_CPP