extras/calcsoft/src/CalcFunc.cpp
branchRCL_3
changeset 24 10c6e6d6e4d9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/extras/calcsoft/src/CalcFunc.cpp	Wed Sep 01 12:29:54 2010 +0100
@@ -0,0 +1,2048 @@
+/*
+* 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:  The Function-Map subpane class, CCalcFuncmapSubPane
+*                Derived from CCoeControl.
+*                CCalcFuncmapSubPane is container class of CCalcCommandButton.
+*
+*/
+
+
+
+// INCLUDE FILES
+
+#include <AknUtils.h>
+#include <aknViewAppUi.h>
+
+#include <AknsSkinInstance.h> 
+#include <aknpopuplayout.h> 
+#include <Calcsoft.rsg>
+#include <layoutmetadata.cdl.h>
+#include "CalcFunc.h"
+//#include "CalcCmdBtn.h"
+#include "CalcEnv.h"
+#include "CalcCont.h"
+#include "CalcView.h"
+#include "CalcOutSheet.h"
+#include "calc.hrh"
+#include "CalcDrawingConst.laf"
+#include "CalcView.h"
+#include <applayout.cdl.h>
+#include <aknlayoutscalable_apps.cdl.h>
+#include <AvkonInternalCRKeys.h>
+#include <PtiDefs.h>
+#include <PtiEngine.h>
+#include <PtiKeyMappings.h>
+#include <AknFepInternalCRKeys.h>
+#include <aknbutton.h>
+#include <AknsDrawUtils.h>
+#include <aknnotewrappers.h> 
+#include <featmgr.h>      // Feature Manager
+
+//enum to hold the values of button states
+enum
+{
+    EnNormal = 0,
+    EnPressed,
+    EnDimmed
+};
+//  LOCAL CONSTANTS AND MACROS  
+const TInt KButtonsInColumn(2);      // The number of column of a button
+const TInt KButtonsInRow(KCountOfButtons / KButtonsInColumn);
+const TInt KButtonsInColumnTouch(4);      // The number of column of a button in Touch layout
+const TInt KButtonsInRowTouch(KCountOfButtonsTouch / KButtonsInColumnTouch);
+                                     // The number of row of a button
+const TInt KButtonsIdTblTouch[] =         // The command ID of a button in Touch Layout
+               { 
+               ECalcCmdCancel,          // C
+               ECalcCmdSeven,          // 7
+               ECalcCmdFour,          // 4
+               ECalcCmdOne,          // 1
+               ECalcCmdZero,          // 0
+               ECalcCmdSqrt,          // Sqrt
+               ECalcCmdEight,          // 8
+               ECalcCmdFive,          // 5
+               ECalcCmdTwo,          // 2
+               ECalcCmdSeparator,          // .
+               ECalcCmdPercent,         // %    
+               ECalcCmdNine,          // 9
+               ECalcCmdSix,          // 6
+               ECalcCmdThree,          // 3
+               ECalcCmdChangeSign,   // +/- 
+               ECalcCmdDivide,       // /
+               ECalcCmdMultiply,     // *
+               ECalcCmdSubtract,     // -
+               ECalcCmdAdd,          // +
+               ECalcCmdResult       // =
+                };
+                
+const TInt KButtonsIdTbl[] =         // The command ID of a button in non Touch Layout
+               { 
+               ECalcCmdAdd,          // +
+               ECalcCmdSubtract,     // -
+               ECalcCmdMultiply,     // *
+               ECalcCmdDivide,       // /
+               ECalcCmdChangeSign,   // +/- 
+               ECalcCmdResult,       // =
+               ECalcCmdSqrt,          // Sqrt
+               ECalcCmdPercent,         // %
+               ECalcCmdScrollUp,     // Scroll-up
+               ECalcCmdScrollDown    // Scroll-down
+                };
+
+
+// If const TChar is used, complie error occurs in THUMB build.
+// To avoid this, #define is used.
+#define KCalcAsteriskBtn '*'
+
+
+// ================= MEMBER FUNCTIONS =======================
+
+// Two-phased constructor.
+CCalcFuncmapSubPane* CCalcFuncmapSubPane::NewL(
+                     CCalcContainer* aContainer)
+    {
+    CCalcFuncmapSubPane* self = new (ELeave) CCalcFuncmapSubPane();
+    CleanupStack::PushL(self);
+    self->ConstructL(aContainer);
+    CleanupStack::Pop(self); 
+    return self;
+    }
+
+
+// Destructor
+CCalcFuncmapSubPane::~CCalcFuncmapSubPane()
+    {
+        for (TInt count(0); count < KCountOfButtonsTouch; count++)
+            {
+                if(iButtons[count])
+                {
+                     delete iButtons[count];    
+                }
+                
+            }
+   
+    // delete of button controls
+       iQwertyModeStatusProperty.Close();
+       delete iEngine;
+       delete iCRKey;
+    }
+
+// ---------------------------------------------------------
+// CCalcFuncmapSubPane::SetScrollupEnable
+// \ scroll up and down button on scrolling enable.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCalcFuncmapSubPane::RedrawScrollButtons()
+    {
+    CCalcOutputSheet* outputSheet = iContainer->OutputSheet();
+    SetScrollupEnable(outputSheet->CanUp());
+    SetScrolldownEnable(outputSheet->CanDown());
+    }
+
+
+
+// ---------------------------------------------------------
+// CCalcFuncmapSubPane::SetChangeSignEnable
+// Redraw ChangeSign button on ChangeSign enable.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCalcFuncmapSubPane::SetChangeSignEnable
+                            (TBool aEnable)
+    {
+
+                /*Get the selected pointer 
+                button -> different layouts, different values*/
+        CAknButton* button = NULL;
+        if( AknLayoutUtils::PenEnabled() )
+        {
+            button = iButtons[ECmdTChangeSign];
+        }
+        else
+        {
+            button = iButtons[EChangeSignButton];
+        }
+        
+        //Set to dimmed state
+        button->SetDimmed( !aEnable );
+        button->DrawNow();
+        iIsChangeSignDimmed = aEnable;
+    }
+
+// ---------------------------------------------------------
+// CCalcFuncmapSubPane::SetClearKeyEnable
+// Redraw ClearKey button on ClearKey enable.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCalcFuncmapSubPane::SetClearKeyEnable( TBool aEnable )
+    {
+    if ( AknLayoutUtils::PenEnabled() )
+        {
+        CAknButton* button = NULL;
+        button = iButtons[ECmdTCancel];
+
+        if ( button )
+            {
+            button->SetDimmed( !aEnable );   
+            button->DrawNow();
+            }      
+        }
+    iIsClearKeyEnabled = aEnable;
+   }
+
+// ---------------------------------------------------------
+// CCalcFuncmapSubPane::NotifyTimeoutL
+// If no key is pressed until timeout of *-key,
+// this function is called.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCalcFuncmapSubPane::NotifyTimeoutL()
+    {
+
+      /*Get the selected pointer 
+        button -> different layouts, different values*/
+    CAknButton* button = iButtons[iSelected];    
+    if( !AknLayoutUtils::PenEnabled() )
+        {
+#ifdef RD_INTELLIGENT_TEXT_INPUT  
+        if ( iKeyboardType == EPtiKeyboardHalfQwerty )
+            {
+            if( ( iLastKeyCode == EStdKeyLeftShift && iDecimalPoint ) || ( iLastKeyCode == EStdKeyLeftFunc && iDecimalPoint ))
+                {
+                iContainer->SetSeparatorFromTouchL();
+                }
+            else
+                {
+                iContainer->View()->HandleCommandL( KButtonsIdTbl[iSelected] );
+                }
+            }
+        else
+#endif
+            {
+            iContainer->View()->HandleCommandL( KButtonsIdTbl[iSelected] );
+            }
+        }
+    else
+        {
+        iContainer->View()->HandleCommandL( KButtonsIdTblTouch[iSelected] );
+        }   
+   
+#ifdef RD_INTELLIGENT_TEXT_INPUT  
+    if ( iKeyboardType == EPtiKeyboardHalfQwerty )
+        {
+        iLastKeyCode = 0;
+        }
+#endif
+    
+    //Set to dimmed state
+    button->SetDimmed( EFalse );
+    DrawDeferred();    
+    }
+
+// ---------------------------------------------------------
+// CCalcFuncmapSubPane::NotifyReleaseKeyL
+// Notify any key is released. If pressed button exists.
+// command which is releated is executed.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCalcFuncmapSubPane::NotifyReleaseKeyL()
+    {
+                /*Get the selected pointer 
+                button -> different layouts, different values*/
+        CAknButton* button = iButtons[iSelected];
+        CAknButtonState* state = button->State(EnNormal);          
+        
+        if(state->Flags() == EnPressed)
+        {
+          TKeyEvent aKeyEvent;
+          aKeyEvent.iScanCode = EStdKeyEnter;
+          TEventCode aType = EEventKeyUp;
+          //trigger offerkeyeventl to this button
+          button->OfferKeyEventL(aKeyEvent,aType);
+          state->SetFlags(EnNormal);    
+          button->DrawNow();
+        }
+      if( !AknLayoutUtils::PenEnabled() )
+           {
+             if(iSelected == EScrollUp)
+            {
+                CCalcOutputSheet* outputSheet = iContainer->OutputSheet();
+                if(!outputSheet->CanUp())
+                {
+                    RedrawHighlight(EScrollUp,EScrollDown);
+                    iSelected = EScrollDown;
+                }
+            }
+            
+          if(iSelected == EScrollDown)
+            {
+                CCalcOutputSheet* outputSheet = iContainer->OutputSheet();
+                if(!outputSheet->CanDown())
+                {
+                    RedrawHighlight(EScrollDown,EScrollUp);
+                    iSelected = EScrollUp;
+                }
+            }
+            
+           }
+
+       }
+
+// ---------------------------------------------------------
+// CCalcFuncmapSubPane::NotifyOtherThanOkKeyPressed
+// If key other than OK-key is pressed this function is called.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCalcFuncmapSubPane::NotifyOtherThanOkKeyPressed()
+    {
+    //for (TInt cnt(0); cnt < iCountOfButtons; cnt++)
+        {
+          //Get the pointer for the button
+         CAknButton* button = iButtons[iSelected];
+         CAknButtonState* state = button->State(EnNormal);
+         if(state->Flags() == EnPressed)
+            {
+          state->SetFlags(EnNormal);
+          button->DrawNow();
+            }
+        }
+
+    }
+
+// ---------------------------------------------------------
+// CCalcFuncmapSubPane::NotifyLangChange
+// Called if language is changed.
+// Change layout according to the language.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCalcFuncmapSubPane::NotifyLangChange()
+    {
+    // Write code here.
+    SetLayout();
+    DrawNow();
+    }
+
+
+// ---------------------------------------------------------
+// CCalcFuncmapSubPane::IsQwertyKeypadActive
+// Called to check qwerty keypad is active or not
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+ TInt CCalcFuncmapSubPane::IsQwertyKeypadActive()
+  {
+     TInt value = 0;
+    
+    iQwertyModeStatusProperty.Get(value);
+    
+    return value;
+ }
+
+// ---------------------------------------------------------
+// CCalcFuncmapSubPane::HandleControlEventL
+// Observer event from avkon button change
+// (other items were commented in a header).
+// ---------------------------------------------------------
+void CCalcFuncmapSubPane::HandleControlEventL(CCoeControl* aControl,TCoeEvent aEventType)
+    {    
+    iIsKeyLongPress = EFalse;   
+    if ( aEventType != EEventStateChanged && aEventType != CAknButton::ELongPressEvent )
+        {
+        return;
+        }
+    else if ( aEventType == CAknButton::ELongPressEvent )
+        {
+        iIsKeyLongPress = ETrue;
+        }
+        
+    //Get the selected button
+    CAknButton* button = (CAknButton*)aControl;
+
+    for ( TInt i = 0; i < KCountOfButtons; ++i )
+        {
+        if ( button == iButtons[i] )
+            {
+            if(iSelected != i)
+            return;
+            
+            //break;
+            }
+        }    
+
+    // Check if the button has been pressed.
+    CAknButtonState* state = button->State(EnNormal);
+    if ( aEventType == EEventStateChanged && state->Flags() == EnNormal )
+        {
+        iInputData = ETrue;
+        }
+    
+    if ( !button->IsDimmed() )
+        {
+                //handles all the commands for the buttons
+            if( !AknLayoutUtils::PenEnabled() )
+            {
+            iContainer->View()->HandleCommandL(KButtonsIdTbl[iSelected]);
+            if(iSelected == EScrollUp)
+            {
+                CCalcOutputSheet* outputSheet = iContainer->OutputSheet();
+                if(!outputSheet->CanUp())
+                {
+                    RedrawHighlight(EScrollUp,EScrollDown);
+                    iSelected = EScrollDown;
+                }
+            }
+            else if(iSelected == EScrollDown)
+            {
+                CCalcOutputSheet* outputSheet = iContainer->OutputSheet();
+                if(!outputSheet->CanDown())
+                {
+                    RedrawHighlight(EScrollDown,EScrollUp);
+                    iSelected = EScrollUp;
+                }
+            }
+            }
+            else
+            {
+            // Input data if the button has been pressed or long pressed.
+            if ( iInputData || iIsKeyLongPress )
+                {
+                iContainer->View()->HandleCommandL(KButtonsIdTblTouch[iSelected]);
+                iInputData = EFalse;
+                }
+            }   
+
+        } 
+    if( iErrorCode != KErrNone )
+        {
+        ErrorMsgL( iErrorCode );
+        iErrorCode = KErrNone;
+        }
+    }
+
+// ---------------------------------------------------------
+// CCalcFuncmapSubPane::OfferKeyEventL
+// This function is called by CCalcContainer::OfferKeyEventL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TKeyResponse CCalcFuncmapSubPane::OfferKeyEventL(const TKeyEvent& aKeyEvent, TEventCode aType)
+{
+    TKeyResponse exitCode(EKeyWasNotConsumed);
+       
+    TPtiKey keyQwertyValue = (TPtiKey)aKeyEvent.iScanCode;
+    
+    if(IsQwertyKeypadActive())  
+        {
+#ifdef RD_INTELLIGENT_TEXT_INPUT  
+        if ( iKeyboardType == EPtiKeyboardHalfQwerty )
+            {
+            TBuf<KMaxNumCharsPerCase> keys;
+            TInt firstoperator(-1);
+            TInt secondoperator(-1);
+                   
+            TInt oldSelect( iSelected );
+            
+            if ( ( aKeyEvent.iScanCode == EStdKeyLeftFunc && aType == EEventKeyDown ) || 
+                 ( aKeyEvent.iScanCode == EStdKeyLeftShift && aType == EEventKeyDown ) )
+                 {            
+                 iEngine->MappingDataForKey( keyQwertyValue, keys, EPtiCaseFnLower  );
+                 MapDataForChrShiftKey( keys, firstoperator, secondoperator);
+                 if ( (secondoperator == -1) && (firstoperator != -1))
+                     {
+                     if ( AknLayoutUtils::PenEnabled() )
+                         {
+                         iSelected = firstoperator;    
+                         }
+                     else
+                         {
+                         if ( firstoperator == ECmdTSeparator )
+                             {
+                             iDecimalPoint = ETrue;
+                             }
+                         else
+                             {
+                             iSelected = firstoperator;
+                             iDecimalPoint = EFalse;
+                             }
+                         }                     
+                     }
+                 else if ( (firstoperator == -1) && (secondoperator != -1) )
+                     {
+                     if ( AknLayoutUtils::PenEnabled() )
+                         {
+                         iSelected = secondoperator;    
+                         }
+                     else
+                         {
+                         if ( secondoperator == ECmdTSeparator )
+                             {
+                             iDecimalPoint = ETrue;
+                             }
+                         else
+                             {
+                             iSelected = secondoperator;
+                             iDecimalPoint = EFalse;
+                             }
+                         }                     
+                     }
+                 else if ( (firstoperator != -1) && (secondoperator != -1) )
+                     {
+                     if ( iLastKeyCode == aKeyEvent.iScanCode )
+                         {
+                         if ( AknLayoutUtils::PenEnabled() )
+                             {
+                             if ( iSelected == firstoperator )
+                                 {
+                                 iSelected = secondoperator;
+                                 }
+                             else
+                                 {
+                                 iSelected = firstoperator;
+                                 }
+                             }
+                         else
+                             {
+                              if ( firstoperator == ECmdTSeparator || secondoperator == ECmdTSeparator )
+                                  {
+                                  if ( iDecimalPoint )
+                                      {
+                                      iDecimalPoint = EFalse;
+                                      if ( firstoperator == ECmdTSeparator )
+                                          {
+                                          iSelected = secondoperator;
+                                          }
+                                      else
+                                          {
+                                          iSelected = firstoperator;
+                                          }                           
+                                      }
+                                  else
+                                      {
+                                      iDecimalPoint = ETrue;
+                                      }
+                                  }
+                              else
+                                  {
+                                  if ( iSelected == firstoperator )
+                                      {
+                                      iSelected = secondoperator;
+                                      }
+                                  else
+                                      {
+                                      iSelected = firstoperator;
+                                      }                      
+                                  }
+                             }
+                         }
+                     else
+                         {
+                         if ( AknLayoutUtils::PenEnabled() )
+                             {
+                             iSelected = firstoperator;    
+                             }
+                         else
+                             {
+                             if ( firstoperator == ECmdTSeparator )
+                                 {
+                                 iDecimalPoint = ETrue;
+                                 }
+                             else
+                                 {
+                                 iSelected = firstoperator;
+                                 iDecimalPoint = EFalse;
+                                 }
+                             }
+
+                         }
+                     }
+                     RedrawHighlight( oldSelect, iSelected );
+                     iLastKeyCode = aKeyEvent.iScanCode;
+                     exitCode = EKeyWasConsumed;
+                     
+                     iIsShiftKeyPressed = ETrue;
+                 }
+            }
+         else
+#endif
+            {
+            //For Multiplication operator in Qwerty keypad
+            if(((aKeyEvent.iScanCode == EStdKeyLeftShift) || (aKeyEvent.iScanCode == EStdKeyRightShift)) && aType == EEventKeyDown)
+                {
+                 if(iShiftKeyPressed == EPtiCaseLower )
+                     {
+                        iShiftKeyPressed = EPtiCaseUpper;
+                        iShiftKey = 0;
+                        iValue = ETrue;
+                     }
+                  
+                 else
+                     {
+                    iShiftKeyPressed = EPtiCaseLower;
+                     }
+                exitCode = EKeyWasConsumed;     
+                
+                iIsShiftKeyPressed = ETrue;
+                }
+            else if((aKeyEvent.iScanCode == EStdKeyLeftShift || aKeyEvent.iScanCode == EStdKeyRightShift)&& aType == EEventKeyUp)
+                {
+                        /*if(((iLanguage == ELangFrench) || (iLanguage == ELangTaiwanChinese) || 
+                            (iLanguage == ELangCzech) || (iLanguage == ELangSlovak))&& iShiftKey >= 1)*/
+                                if( iShiftKey >= 1 )
+                    {
+                    iShiftKeyPressed = EPtiCaseLower;
+                    }
+                iValue = EFalse;
+                exitCode = EKeyWasConsumed; 
+                
+                iIsShiftKeyPressed = ETrue;
+                }
+            }
+          //else
+     if ( !iIsShiftKeyPressed )
+        {
+        if (aType != EEventKey)
+        {
+            if (aType == EEventKeyDown)
+                {
+                    iIsOfferKeyEvent = ETrue;        
+                }
+                else if (aType == EEventKeyUp)
+                {
+                    iIsOfferKeyEvent = EFalse;        
+                }
+            // when users press send key, EKeyWasNotConsumed is returned to system
+            // to open dialer 
+            if ( aKeyEvent.iScanCode == EStdKeyYes )
+                {
+                return EKeyWasNotConsumed;
+                }
+        return EKeyWasConsumed;
+        }
+#ifdef RD_INTELLIGENT_TEXT_INPUT
+        if( MapNumericCharL( aKeyEvent ) )
+            {
+            exitCode = EKeyWasConsumed;
+            iShiftKeyPressed = EPtiCaseLower;
+            }
+#else
+        if(MapNumericCharL(keyQwertyValue,iShiftKeyPressed))
+            {
+            exitCode = EKeyWasConsumed;
+            iShiftKeyPressed = EPtiCaseLower;        
+            }
+#endif
+        else 
+            {
+#ifdef RD_INTELLIGENT_TEXT_INPUT
+            if( MapNumerics( aKeyEvent ) || aKeyEvent.iCode == EKeyBackspace )
+                {
+                exitCode = EKeyWasNotConsumed;
+                iShiftKeyPressed = EPtiCaseLower;
+                
+                                /*if((iLanguage == ELangFrench) || (iLanguage == ELangTaiwanChinese) || 
+                                         (iLanguage == ELangCzech) || (iLanguage == ELangSlovak))*/
+                    {
+                    if( !iValue )
+                    iShiftKeyPressed = EPtiCaseLower;
+
+                    else
+                    iShiftKeyPressed = EPtiCaseUpper;
+                    iShiftKey++;
+                    }
+                }
+#else
+            if(MapNumerics(keyQwertyValue,iShiftKeyPressed) || aKeyEvent.iCode == EKeyBackspace)
+                {
+                exitCode = EKeyWasNotConsumed;
+                iShiftKeyPressed = EPtiCaseLower;
+
+                                /*if((iLanguage == ELangFrench) || (iLanguage == ELangTaiwanChinese) || 
+                                         (iLanguage == ELangCzech) || (iLanguage == ELangSlovak))*/
+                    {
+                    if(!iValue)
+                    iShiftKeyPressed = EPtiCaseLower;
+                    
+                    else
+                    iShiftKeyPressed = EPtiCaseUpper;
+                    iShiftKey++;    
+                    }
+                }
+#endif
+            else
+                {
+                exitCode = EKeyWasConsumed;    
+                iShiftKeyPressed = EPtiCaseLower;
+                }
+            
+            }
+
+        }        
+
+    // handle Enter key event    
+    if ( aKeyEvent.iCode == EKeyEnter )
+        {
+        exitCode = EKeyWasConsumed;
+        HandleMiddleSoftKeyOREKeyOKL();
+        iShiftKeyPressed = EPtiCaseLower;
+        return exitCode;
+        }
+    
+    iIsShiftKeyPressed = EFalse;
+        
+    }
+ 
+/*    if(aKeyEvent.iCode == EKeyOK)
+    {
+       
+        HandleMiddleSoftKeyOREKeyOKL();
+        exitCode = EKeyWasConsumed;
+    }   
+    else if (aType == EEventKey)*/
+    if (aType == EEventKey)
+    {
+        TInt oldSelect(iSelected);
+        TInt row(iSelected % iButtonsInRow);
+        TInt column(iSelected / iButtonsInRow);
+        iIsOfferKeyEvent = EFalse; 
+        switch(aKeyEvent.iCode)
+        {
+            case EKeyLeftArrow:
+            {
+                
+                do
+                {   
+                   
+                        column--;
+                        
+                        if(column < 0)
+                        {
+                            column = iButtonsInColumn -1;
+                            row--;
+
+                            if( row < 0 )
+                            {
+                                row = iButtonsInRow -1;
+                            }
+                        }
+                    
+                    iSelected = row + column * iButtonsInRow;
+
+                }while( iButtons[iSelected]->IsDimmed() );
+                
+                RedrawHighlight( oldSelect, iSelected, ETrue );
+
+                exitCode = EKeyWasConsumed;
+                break;
+            }
+            
+            case EKeyRightArrow:
+            {
+                               
+                do
+                {   
+                        column++;
+                        
+                        if(column == iButtonsInColumn)
+                        {
+                            column = 0;
+                            row++;
+                            
+                            if( row >= iButtonsInRow )
+                            {
+                                row = 0;
+                            }
+                        }
+                    
+                    iSelected = row + column * iButtonsInRow;
+
+                }while( iButtons[iSelected]->IsDimmed() );
+                
+                RedrawHighlight( oldSelect, iSelected, ETrue );
+                exitCode = EKeyWasConsumed;
+                break;
+            }
+            
+            case EKeyUpArrow:
+            {
+                
+                SetNextCursorPosForUpArrow(oldSelect);
+
+                RedrawHighlight( oldSelect, iSelected, ETrue );
+                exitCode = EKeyWasConsumed;
+                break;
+            }
+            
+            case EKeyDownArrow:
+            {
+                
+                SetNextCursorPosForDownArrow(oldSelect);
+ 
+                RedrawHighlight( oldSelect, iSelected, ETrue );
+                exitCode = EKeyWasConsumed;
+                break;
+            }
+
+            case EKeyOK:
+            {
+            if ( !AknLayoutUtils::PenEnabled() )
+                {
+                // get and judge the state of button
+                CAknButton* button = iButtons[iSelected];
+                CAknButtonState* state = button->State( EnNormal ); 
+                if ( ( iSelected == EScrollUp || iSelected == EScrollDown ) 
+                    && ( state->Flags() == EnPressed ) )
+                    {
+                    iContainer->View()->HandleCommandL( KButtonsIdTbl[iSelected] );
+                    // when the history arrives the top or bottom,the button should be set dimmed
+                    CCalcOutputSheet* outputSheet = iContainer->OutputSheet();
+                    if ( !( outputSheet->CanDown() ) && iSelected == EScrollDown )
+                        {
+                        button->SetDimmed( ETrue );
+                        DrawDeferred();  
+                        }
+                    if ( !( outputSheet->CanUp() ) && iSelected == EScrollUp )
+                        {
+                        button->SetDimmed( ETrue );
+                        DrawDeferred();  
+                        }   
+                    }
+                }
+                break;
+            }
+            default:
+            {
+               if(!IsQwertyKeypadActive())
+             {
+                if(aKeyEvent.iCode == KCalcAsteriskBtn)
+                {
+                    if(iLastKeyCode == aKeyEvent.iCode)
+                    {
+                        row++;
+                        
+                        if(row == iButtonsInRow - 1)  // Equal is not contained in a loop.
+                        {
+                            row = 0;
+                        }
+                        iSelected = row + column * iButtonsInRow;
+                    }
+                    else
+                    {
+                        if(AknLayoutUtils::PenEnabled())
+                            {
+                              iSelected = ECmdTAdd;    
+                            }
+                        else
+                            {
+                              iSelected = EPlusButton;    
+                            }    
+                        
+                    }
+                    RedrawHighlight( oldSelect, iSelected);
+                    exitCode = EKeyWasConsumed;
+                }
+             }
+            break;
+            }
+        }
+        iLastKeyCode = aKeyEvent.iCode;
+        
+    }
+    else if (aType == EEventKeyDown)
+    {
+    iIsOfferKeyEvent = ETrue; 
+    // If the enter key has been pressed, set the button and input data.
+    if ( aKeyEvent.iCode == EKeyEnter || aKeyEvent.iScanCode == EStdKeyEnter )
+        {
+        exitCode = EKeyWasConsumed;
+        HandleMiddleSoftKeyOREKeyOKL();
+        iShiftKeyPressed = EPtiCaseLower;
+        return exitCode;
+        }       
+    }
+    else if (aType == EEventKeyUp)
+    {
+    iIsOfferKeyEvent = EFalse;
+    // Release the button when enter key released.
+    if ( aKeyEvent.iCode == EKeyEnter || aKeyEvent.iScanCode == EStdKeyEnter )
+        {
+        NotifyReleaseKeyL();
+        }
+    }
+    
+   
+    return exitCode;
+}
+
+
+// C++ default constructor can NOT contain any code, that
+// might leave.
+//
+CCalcFuncmapSubPane::CCalcFuncmapSubPane()
+    {
+    }
+
+
+// default constructor can leave.
+void CCalcFuncmapSubPane::ConstructL
+      (CCalcContainer* aContainer) 
+    {
+    iSelected = 0;    
+    iContainer = aContainer;
+    iIsOfferKeyEvent = EFalse;
+    iErrorCode = KErrNone;
+    iShowDrawHight = EFalse;
+    iInputData = EFalse;
+    SetContainerWindowL(*iContainer);
+    // Read character sequence tables, such as -, +.
+    iCalcAppEnv = CCalcAppEnv::Static();
+    iIsChangeSignDimmed = ETrue;
+    
+       if( AknLayoutUtils::PenEnabled() )
+    {
+        iCountOfButtons = KCountOfButtonsTouch;
+        iButtonsInRow = KButtonsInRowTouch;
+        iButtonsInColumn = KButtonsInColumnTouch;
+      
+    }
+    else
+    {
+        iCountOfButtons = KCountOfButtons;
+        iButtonsInRow = KButtonsInRow;
+        iButtonsInColumn = KButtonsInColumn;  
+        
+    }
+    
+
+    for (TInt count = 0; count < iCountOfButtons; count++)
+        {        
+        //Create the AknButtons
+        if(AknLayoutUtils::PenEnabled())
+            {
+                iButtons[count] = CAknButton::NewL(
+            iCalcAppEnv->UnpressedButtonBmp(count),
+            NULL,
+            NULL,
+            NULL,
+            _L(""),
+            _L(""),
+            // Report the observer when the button recieve the key down event.
+            KAknButtonReportOnKeyDown, 
+            0
+            );     
+            
+            }
+        else
+            {
+            
+                iButtons[count] = CAknButton::NewL(
+            iCalcAppEnv->UnpressedButtonBmp(count),
+            NULL,
+            iCalcAppEnv->PressedButtonBmp(count),
+            NULL,
+            _L(""),
+            _L(""),
+            // Report the observer when the button recieve the key down event.
+            KAknButtonReportOnKeyDown,
+            0
+            );     
+            /*if((count == ESqrtButton) && !iIsChangeSignDimmed)
+            {
+                iButtons[count]->SetDimmed(ETrue);
+            }*/
+            
+            }
+        
+        iButtons[count]->SetContainerWindowL( *this );
+        iButtons[count]->SetObserver( this );     
+        }
+
+    if ( AknLayoutUtils::PenEnabled() )
+        {
+        iButtons[ECmdTCancel]->SetButtonFlags( KAknButtonReportOnLongPress );
+        }
+    iSelected = 0;
+    RedrawHighlight( iSelected, iSelected );
+
+    User::LeaveIfError(iQwertyModeStatusProperty.Attach(KCRUidAvkon, KAknQwertyInputModeActive));
+   
+    iShiftKeyPressed = EPtiCaseLower;
+    iShiftKey         = 0;
+
+     // 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());
+          }
+        }
+
+        // UI language is used to determine the used number format.
+        iUiLanguage = User::Language();
+  
+        
+#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
+    
+    iIsShiftKeyPressed = EFalse;
+
+    }
+
+//    ---------------------------------------------------------
+// CCalcFuncmapSubPane::RefreshButtonIcons
+// This function is called by CCalcContainer::OfferKeyEventL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCalcFuncmapSubPane::RefreshButtonIcons()
+{
+    /*for (TInt count(0); count < iCountOfButtons; count++)
+        {
+        iButtons[count]->SetBitmapIcons(iCalcAppEnv->UnpressedButtonBmp(count),
+            iCalcAppEnv->PressedButtonBmp(count),
+            iCalcAppEnv->InactiveButtonBmp(count));
+        }*/
+}
+// ---------------------------------------------------------
+// CCalcFuncmapSubPane::SetScrollupEnable
+// Redraw scroll-up button on scrolling enable.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCalcFuncmapSubPane::SetScrollupEnable
+                     (TBool aEnable)  
+    {
+        //Enabling/Disabling of scroll up buttons only for Non-Touch   
+    if(!AknLayoutUtils::PenEnabled())
+    {
+        CAknButton* scrollUp = iButtons[EScrollUp];
+        scrollUp->SetDimmed( !aEnable );
+        scrollUp->DrawNow();         
+    }
+    
+    }
+
+
+// ---------------------------------------------------------
+// CCalcFuncmapSubPane::SetScrolldownEnable
+// Redraw scroll-down button on scrolling enable.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCalcFuncmapSubPane::SetScrolldownEnable
+                     (TBool aEnable) 
+    {
+    //Enabling/Disabling of scroll down buttons only for Non-Touch
+    if(!AknLayoutUtils::PenEnabled())
+    {       
+    CAknButton* scrollDown = iButtons[EScrollDown];
+    scrollDown->SetDimmed( !aEnable );
+    scrollDown->DrawNow();
+    }
+    }
+
+
+// ---------------------------------------------------------
+// CCalcFuncmapSubPane::SetNextCursorPosForUpArrow
+// Set next cursor position whwn pressing uparrow key.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCalcFuncmapSubPane::SetNextCursorPosForUpArrow(TInt aOldPos)
+{
+    
+    TInt row(aOldPos % iButtonsInRow);
+    TInt column(aOldPos / iButtonsInRow);
+
+    do
+    {   row--;
+
+        if(row < 0)
+        {
+            column--;
+        
+            if(column < 0)
+            {
+                column = iButtonsInColumn -1;
+            }
+            row = iButtonsInRow - 1;
+        }
+        iSelected = row + column * iButtonsInRow;
+    
+    }while( iButtons[iSelected]->IsDimmed() );
+}
+
+// ---------------------------------------------------------
+// CCalcFuncmapSubPane::SetNextCursorPosForDownArrow
+// Set next cursor position whwn pressing downarrow key.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCalcFuncmapSubPane::SetNextCursorPosForDownArrow(TInt aOldPos)
+{
+    TInt row(aOldPos % iButtonsInRow);
+    TInt column(aOldPos / iButtonsInRow);
+
+    do
+    {   row++;
+
+        if(row == iButtonsInRow)  // KButtonsInRow is equal to "number of rows in column"
+        {
+            row = 0;
+
+            //move focus from last item to first item, column should be added one
+            column++;     
+        
+            if( column == iButtonsInColumn )  
+            {
+                column = 0;
+            }
+        }
+        iSelected = row + column * iButtonsInRow;
+    
+    }while( iButtons[iSelected]->IsDimmed() );
+}
+
+
+// ---------------------------------------------------------
+// CCalcFuncmapSubPane::RedrawHighlight
+// An old highlight rectangle is erased and 
+// a new highlight rectangle is drawn.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCalcFuncmapSubPane::RedrawHighlight
+      (TUint aOldId,            // The button chosen before
+       TUint aNewId)            // The button chosen newly
+    {
+    // The State of each button is set.
+    CAknButton* button = iButtons[aOldId];
+    CAknButtonState* state = button->State(EnNormal);          
+        
+    if(state->Flags() == EnPressed)
+        {
+        TKeyEvent aKeyEvent;
+        aKeyEvent.iScanCode = EStdKeyEnter;
+        TEventCode aType = EEventKeyUp;
+        //trigger offerkeyeventl to this button
+        TRAP_IGNORE(button->OfferKeyEventL(aKeyEvent,aType));
+        state->SetFlags(EnNormal);
+         }
+
+    if( aOldId != aNewId )
+        {
+        button->SetFocus( EFalse, EDrawNow );
+        button = iButtons[aNewId];        
+        }
+    }
+
+// ---------------------------------------------------------
+// CCalcFuncmapSubPane::RedrawHighlight
+// An old highlight rectangle is erased and 
+// a new highlight rectangle is drawn.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCalcFuncmapSubPane::RedrawHighlight
+      (TUint aOldId,            // The button chosen before
+       TUint aNewId,
+       TBool aShowHightlight)       // The button chosen newly
+    {
+    // The State of each button is set.
+    CAknButton* button = iButtons[aOldId];
+    CAknButtonState* state = button->State(EnNormal);          
+    iShowDrawHight = ETrue;
+    if( state->Flags() == EnPressed )
+        {
+        TKeyEvent aKeyEvent;
+        aKeyEvent.iScanCode = EStdKeyEnter;
+        TEventCode aType = EEventKeyUp;
+        //trigger offerkeyeventl to this button
+        TRAP_IGNORE(button->OfferKeyEventL(aKeyEvent,aType));
+        state->SetFlags(EnNormal);
+         }
+        if( aOldId != aNewId )
+        {       
+        button->SetFocus( EFalse, EDrawNow );      
+        button = iButtons[aNewId];        
+        button->SetFocus( ETrue, EDrawNow );
+        }  
+    }
+// ---------------------------------------------------------
+// CCalcFuncmapSubPane::SetLayout
+// Set functionmap button layout.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+
+
+void CCalcFuncmapSubPane::SetLayout()
+    {
+    TRect parentRect(Rect());    
+    
+     TInt t = 0;
+     if( AknLayoutUtils::PenEnabled()  )
+        {
+            for (TInt count(0); count < KButtonsInColumnTouch; count++)
+            {
+            for (TInt row(0); row < 5; row++)   
+                  { 
+                  
+                   TAknWindowLineLayout area;
+                 TAknWindowLineLayout area1;
+
+                 TAknWindowLineLayout areaG2;
+                 TAknWindowLineLayout areaGraphics;
+                 
+                     area= AknLayoutScalable_Apps::toolbar_button_pane_cp01(1).LayoutLine();
+                   areaG2= AknLayoutScalable_Apps::cell_calc_pane_g2(1).LayoutLine();
+                     if (Layout_Meta_Data::IsLandscapeOrientation())
+                        {
+                            area1 = AknLayoutScalable_Apps::cell_calc_pane(count,row,enTouch_with_prt).LayoutLine();
+                        }
+                     else
+                        {
+                           area1 = AknLayoutScalable_Apps::cell_calc_pane(count,row,enTouch_enabled).LayoutLine();
+                        }   
+
+                    areaGraphics = area1;
+                    areaGraphics.iW = areaGraphics.iW - areaG2.il - areaG2.ir;
+                    areaGraphics.iH = areaG2.iH;
+                
+                    area1.il = area1.il + area.il;
+                    area1.ir = area1.ir - area.ir;
+                    area1.it = area1.it + area.it;
+                    area1.ib = area1.ib - area.ib;
+                    area1.iW = area1.iW - area.il - area.ir;
+                    area1.iH = area1.iH - area.it - area.ib;
+                
+                 
+                //A change in values here
+                if ( Layout_Meta_Data::IsLandscapeOrientation() )
+                {
+                AknLayoutUtils::LayoutControl(
+                iButtons[t], parentRect,/*AknLayoutScalable_Apps::cell_calc_pane(count,Row,enTouch_with_prt).LayoutLine()*/area1 );
+                }
+                else
+                {
+                AknLayoutUtils::LayoutControl(
+                iButtons[t], parentRect,/*AknLayoutScalable_Apps::cell_calc_pane(count,Row,enTouch_enabled).LayoutLine()*/area1 );
+                }
+
+                TSize iconSize( areaGraphics.iW, areaGraphics.iH );
+                iButtons[t]->SetIconSize( iconSize );
+                TRect rect = iButtons[t]->Rect();
+                rect.iBr.iX += 5;
+                rect.iBr.iY += 5; 
+                rect.iTl.iX -= 5;
+                rect.iTl.iY -= 5;
+
+                if ( FeatureManager::FeatureSupported( KFeatureIdRockerKey ) )
+                {
+                iButtons[t]->SetHighlightRect( rect );
+                }
+                t++;
+                  }
+            }
+            
+       }
+            
+        
+        else
+            {
+             for (TInt count(0); count < KButtonsInColumn; count++)
+                {
+                for (TInt row(0); row < 5; row++)   
+                       {               
+                           AknLayoutUtils::LayoutControl(
+                        iButtons[t], parentRect, AknLayoutScalable_Apps::cell_calc_pane( count, row ).LayoutLine());
+                        iButtons[t]->SetHighlightRect( iButtons[t]->Rect() );
+                        t++;
+                       }
+                       
+                }
+            }
+                
+        
+    }
+
+
+
+
+// ---------------------------------------------------------
+// CCalcFuncmapSubPane::CountComponentControls
+// The count of child control is returned.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TInt CCalcFuncmapSubPane::CountComponentControls() const
+    {
+    return iCountOfButtons;
+    }
+
+// ---------------------------------------------------------
+// CCalcFuncmapSubPane::ComponentControl
+// Child control's pointer corresponding to the specified index is returned.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+CCoeControl* CCalcFuncmapSubPane::ComponentControl
+              (TInt aIndex) const 
+    {
+    return iButtons[aIndex];
+    }
+
+// ---------------------------------------------------------
+// CCalcFuncmapSubPane::GetButtonBitmapControl
+// This function is called when the size changes.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+/*CCalcCommandButton*/CAknButton* CCalcFuncmapSubPane::GetButtonBitmapControl
+                                    (TInt aIndex)
+    {
+        return iButtons[aIndex];
+    }
+
+// ---------------------------------------------------------
+// CCalcFuncmapSubPane::SizeChanged
+// This function is called when the size changes.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCalcFuncmapSubPane::SizeChanged()
+    {
+    SetLayout();
+    }
+
+
+// ---------------------------------------------------------
+// CCalcFuncmapSubPane::SetSqrtEnable
+// Redraw square root button, either normal or dimmed.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCalcFuncmapSubPane::SetSqrtEnable(TBool aEnable)
+{
+    //Get the sqrt button
+    CAknButton* button = NULL;
+     if( !AknLayoutUtils::PenEnabled()  )
+        {
+         button = iButtons[ESqrtButton];     
+        }
+      else
+        {
+         button = iButtons[ECmdTSqrt];    
+        }  
+    if( button )
+        {
+         button->SetDimmed(!aEnable);   
+         button->DrawNow();
+        }
+    iIsSqrtDimmed = aEnable;
+    }
+
+
+// ---------------------------------------------------------
+// CCalcFuncmapSubPane::SetPercentEnable
+// Redraw percent button, either normal or dimmed.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCalcFuncmapSubPane::SetPercentEnable(TBool aEnable)
+{
+    //Get the percent button
+    CAknButton* button = NULL;
+     if( !AknLayoutUtils::PenEnabled()  )
+        {
+         button = iButtons[EPercentButton];     
+        }
+      else
+        {
+         button = iButtons[ECmdTPercent];    
+        }  
+    if( button )
+        {
+         button->SetDimmed(!aEnable);   
+         button->DrawNow();
+       }
+    iIsPercentDimmed = aEnable;
+}
+
+// ---------------------------------------------------------
+// CCalcFuncmapSubPane::MapNumericChar
+// Redraw percent button, either normal or dimmed.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//        
+#ifdef RD_INTELLIGENT_TEXT_INPUT
+TBool CCalcFuncmapSubPane::MapNumericCharL( TKeyEvent aKeyEvent )
+    {
+    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 loc1 = KAllowedOperatorPlus().Locate( firstChar );
+        if ( loc1 != KErrNotFound )
+            {
+            iContainer->View()->HandleCommandL( KButtonsIdTbl[0] );
+            return ETrue;
+            }
+        TInt loc2 = KAllowedOperatorMinus().Locate( firstChar );
+        if ( loc2 != KErrNotFound )
+            {
+            iContainer->View()->HandleCommandL( KButtonsIdTbl[1] );
+            return ETrue;
+            }
+        TInt loc3 = KAllowedOperatorStar().Locate( firstChar );
+        if ( loc3 != KErrNotFound )
+            {
+            iContainer->View()->HandleCommandL( KButtonsIdTbl[2] );
+            return ETrue;
+            }
+        TInt loc4 = KAllowedOperatorDivide().Locate( firstChar );
+        if ( loc4 != KErrNotFound )
+            {
+            iContainer->View()->HandleCommandL( KButtonsIdTbl[3] );
+            return ETrue;
+            }
+        TInt loc5 = KAllowedOperatorEquals().Locate( firstChar );
+        if ( loc5 != KErrNotFound )
+            {
+            iContainer->View()->HandleCommandL( KButtonsIdTbl[5] );
+            return ETrue;
+            }
+        TInt loc6 = KAllowedOperatorPercent().Locate( firstChar );
+        if ( loc6 != KErrNotFound &&  GetPercentButtonState() )
+            {
+            iContainer->View()->HandleCommandL( KButtonsIdTbl[7] );
+            return ETrue;
+            }
+
+              }
+        
+    return EFalse;
+    }
+
+#else
+TBool CCalcFuncmapSubPane::MapNumericCharL( TPtiKey aKey, TPtiTextCase aCase )    
+    {
+    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 loc1 = KAllowedOperatorPlus().Locate( firstChar );
+        if ( loc1 != KErrNotFound )
+            {
+            iContainer->View()->HandleCommandL( KButtonsIdTbl[0] );
+            return ETrue;
+            }
+        TInt loc2 = KAllowedOperatorMinus().Locate( firstChar );
+        if ( loc2 != KErrNotFound )
+            {
+            iContainer->View()->HandleCommandL( KButtonsIdTbl[1] );
+            return ETrue;
+            }
+        TInt loc3 = KAllowedOperatorStar().Locate( firstChar );
+        if ( loc3 != KErrNotFound )
+            {
+            iContainer->View()->HandleCommandL( KButtonsIdTbl[2] );
+            return ETrue;
+            }
+        TInt loc4 = KAllowedOperatorDivide().Locate( firstChar );
+        if ( loc4 != KErrNotFound )
+            {
+            iContainer->View()->HandleCommandL( KButtonsIdTbl[3] );
+            return ETrue;
+            }
+        TInt loc5 = KAllowedOperatorEquals().Locate( firstChar );
+        if ( loc5 != KErrNotFound )
+            {
+            iContainer->View()->HandleCommandL( KButtonsIdTbl[5] );
+            return ETrue;
+            }
+        TInt loc6 = KAllowedOperatorPercent().Locate( firstChar );
+        if ( loc6 != KErrNotFound &&  GetPercentButtonState() )
+            {
+            iContainer->View()->HandleCommandL( KButtonsIdTbl[7] );
+            return ETrue;
+            }
+
+              }
+        
+    return EFalse;
+    }
+#endif       
+    
+// ---------------------------------------------------------
+// CCalcFuncmapSubPane::MapNumericChar
+// Redraw percent button, either normal or dimmed.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//        
+#ifdef RD_INTELLIGENT_TEXT_INPUT
+TBool CCalcFuncmapSubPane::MapNumerics( TKeyEvent aKeyEvent )
+    {
+    
+    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 = KAllowedNumericChars().Locate( firstChar );
+        if ( loc != KErrNotFound )
+            {
+            return ETrue;
+            }
+        }
+    return EFalse;
+    }
+
+#else
+TBool CCalcFuncmapSubPane::MapNumerics( TPtiKey aKey, TPtiTextCase aCase )    
+    {
+
+    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 = KAllowedNumericChars().Locate( firstChar );
+        if ( loc != KErrNotFound )
+            {
+            return ETrue;
+            }
+        }
+    return EFalse;
+    }
+#endif
+        
+// ---------------------------------------------------------
+// CCalcFuncmapSubPane::HandlePointerEventL
+// Handles apen input in Function Pane. .
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCalcFuncmapSubPane::HandlePointerEventL
+                ( const TPointerEvent& aPointerEvent )           
+    {
+    if ( !AknLayoutUtils::PenEnabled() )
+        {
+        return;
+        }
+    TInt oldSelect( iSelected );
+    TInt buttonValue = CalculatingCorrectButton( aPointerEvent );
+    if ( !iButtons[buttonValue]->IsDimmed() )
+        {
+        iSelected = buttonValue;
+        if ( iButtons[buttonValue]->Rect().Contains( aPointerEvent.iPosition ) )
+            {
+            RedrawHighlight( oldSelect, iSelected );
+            }
+        else
+            {
+            //when user drag outside of button,the Button Up event is missed always.
+            //Because the pointer is out of the button and it can't get the pointer
+            //event any more. We simulate the button up event to release the button
+            //when user drag out of button
+            if( aPointerEvent.iType == TPointerEvent::EDrag )
+                {
+                TPointerEvent event = aPointerEvent;
+                event.iType = TPointerEvent::EButton1Up;
+                iInputData = EFalse;
+                if( iErrorCode != KErrNone )
+                   {
+                   ErrorMsgL( iErrorCode );
+                   iErrorCode = KErrNone;
+                   }
+                CCoeControl::HandlePointerEventL( event );
+                return;
+                }
+            }
+
+
+        if( aPointerEvent.iType == TPointerEvent::EButton1Up )
+            {
+            iInputData = EFalse;
+            if( iErrorCode != KErrNone )
+                {
+                ErrorMsgL( iErrorCode );
+                iErrorCode = KErrNone;
+                }
+            }
+        }
+
+        CCoeControl::HandlePointerEventL( aPointerEvent );
+        
+    }
+    
+// ---------------------------------------------------------
+// CCalcFuncmapSubPane::SetErrorCode
+// Call from container  when an error code is display.
+// ---------------------------------------------------------
+//        
+void  CCalcFuncmapSubPane::SetErrorCode(TInt aError)
+    {
+    iErrorCode = aError;
+    }
+
+// ---------------------------------------------------------
+// CCalcFuncmapSubPane::ErrorMsgL
+// Call when there is an error release event.
+// ---------------------------------------------------------
+//    
+void CCalcFuncmapSubPane::ErrorMsgL(TInt aErrorCode) 
+    {
+    TInt resourceId(0);
+
+    switch (aErrorCode)
+        {
+        case KErrOverflow:
+            {
+            resourceId = R_CALC_ERROR_OUTOFRANGE;
+            break;
+            }
+        case KErrDivideByZero:
+            {
+            resourceId = R_CALC_ERROR_DIVISIONBYZERO;
+
+             // UpdateState( EOperator );
+            break;
+            }
+        case KErrNotSupported:
+            {
+            resourceId = R_CALC_ERROR_NEGATIVEVALUESQRT;
+            break;
+            }
+        default:
+            {
+            return;
+            }
+        }
+    
+    //Localisation of scalable UI.
+    HBufC* message = iCoeEnv->AllocReadResourceLC( resourceId ) ;
+    CAknErrorNote* note = new (ELeave) CAknErrorNote();
+    note->ExecuteLD( *message );
+    CleanupStack::PopAndDestroy( message );
+    
+    }
+// ---------------------------------------------------------
+// CCalcFuncmapSubPane::FunctionPaneRect
+// This function gives the layout of Function Pnae.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+
+TRect CCalcFuncmapSubPane::FunctionPaneRect()
+   {
+   TRect parentRect(Rect()); 
+   return     parentRect;
+   }
+   
+// ---------------------------------------------------------
+// CCalcFuncmapSubPane::CalculatingCorrectButton
+// Handled when there is Pen Input.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+
+TInt CCalcFuncmapSubPane::CalculatingCorrectButton
+                    (const TPointerEvent& aPointerEvent)
+   {
+    TInt selected = iSelected;
+    
+    //Function that calculates the correct button where the pointer event had occurred
+    for(TInt i = 0; i<iCountOfButtons; i++)
+    {
+           if(iButtons[i]->Rect().Contains(aPointerEvent.iPosition))
+           {
+               selected = i;
+           }
+    }
+    return selected;
+   }
+
+// ---------------------------------------------------------
+// CCalcFuncmapSubPane::HandleMiddleSoftKeyOREKeyOK
+// Handled when MSK or EKeyOk is selected.
+// ---------------------------------------------------------
+//
+
+void CCalcFuncmapSubPane::HandleMiddleSoftKeyOREKeyOKL()
+   {
+     //get the selected button id
+    CAknButton* button = iButtons[iSelected];
+    //put the button in the pressed state
+    CAknButtonState* state = button->State(EnNormal);
+    //Put the button in pressed state
+    
+    TKeyEvent aKeyEvent;
+    aKeyEvent.iScanCode = EStdKeyEnter;
+    TEventCode aType = EEventKeyDown;
+    button->OfferKeyEventL(aKeyEvent,aType);
+
+    //put to pressed state
+    state->SetFlags(EnPressed);
+    button->DrawNow();
+
+   }
+   
+// ---------------------------------------------------------
+// CCalcFuncmapSubPane::GetChangeSignButtonState
+// Returns the state of change sign button
+// ---------------------------------------------------------
+//
+TBool CCalcFuncmapSubPane::GetChangeSignButtonState()
+{
+    return(iIsChangeSignDimmed);
+}
+
+// ---------------------------------------------------------
+// CCalcFuncmapSubPane::GetClearButtonState
+// Returns the state of Clear button
+// ---------------------------------------------------------
+//
+TBool CCalcFuncmapSubPane::GetClearButtonState()
+    {
+    return( iIsClearKeyEnabled );
+    } 
+
+// ---------------------------------------------------------
+// CCalcFuncmapSubPane::GetSqrtButtonState
+// Returns the state of square root button
+// ---------------------------------------------------------
+//
+TBool CCalcFuncmapSubPane::GetSqrtButtonState()
+{
+    return(iIsSqrtDimmed);
+}
+
+// ---------------------------------------------------------
+// CCalcFuncmapSubPane::GetPercentButtonState
+// returns the state of percent button
+// ---------------------------------------------------------
+//
+TBool CCalcFuncmapSubPane::GetPercentButtonState()
+{
+    return(iIsPercentDimmed);
+}
+
+// ---------------------------------------------------------
+// CCalcFuncmapSubPane::GetSelectedButtonId
+// returns the id of current button
+// ---------------------------------------------------------
+//
+TInt CCalcFuncmapSubPane::GetSelectedButtonId()
+    {
+    return iSelected;
+    }
+   
+// ---------------------------------------------------------
+// CCalcFuncmapSubPane::SetHighlightButton
+// set highlight button
+// ---------------------------------------------------------
+//
+void CCalcFuncmapSubPane::SetHighlightButton( TUint aOldId, TUint aNewId )
+    {
+    iSelected = aNewId;
+    RedrawHighlight( aOldId, aNewId );
+    }
+
+// ---------------------------------------------------------
+// CCalcFuncmapSubPane::IsClearKeyLongPressed
+// Find Clear is long Pressed.
+// ---------------------------------------------------------
+//
+TBool CCalcFuncmapSubPane::IsKeyLongPressed()
+    {
+    return iIsKeyLongPress;
+    }
+
+// ---------------------------------------------------------
+// CCalcFuncmapSubPane::MapDataForChrShiftKey
+// Redraw percent button, either normal or dimmed.
+// ---------------------------------------------------------
+//
+void CCalcFuncmapSubPane::MapDataForChrShiftKey( TDes& aOperators, TInt& aFirstOperator, TInt& aSecondOperator)
+    { 
+    if( aOperators.Length() > 0 )
+        {
+        TUint16 firstChar = aOperators[0];
+        TUint16 secondChar = firstChar;
+        
+        if ( aOperators.Length() > 1 )
+            {
+            secondChar = aOperators[1];
+            }
+        
+        switch ( firstChar )
+            {
+            case KPtiPinyinMarker:
+            case KPtiStrokeMarker:
+            case KPtiZhuyinMarker:
+            case KPtiCangjieMarker:
+            case KPtiGetAllMarker:
+                if ( aOperators.Length() > 2 )
+                    {
+                    firstChar = aOperators[1];
+                    secondChar = aOperators[2];
+                    }
+                else
+                    {
+                    firstChar = aOperators[1];
+                    secondChar = firstChar;
+                    }
+                break;
+            default:
+                break;
+        
+        }
+        
+       MapOperators( firstChar, aFirstOperator );
+
+       MapOperators( secondChar, aSecondOperator );
+       
+       }
+    }
+
+// ---------------------------------------------------------
+// CCalcFuncmapSubPane::MapOperators
+// Redraw percent button, either normal or dimmed.
+// ---------------------------------------------------------
+//
+TBool CCalcFuncmapSubPane::MapOperators( TUint16 aOperator, TInt& aResult)
+    {
+    TInt loc1 = KAllowedOperatorPlus().Locate( aOperator );
+    if ( loc1 != KErrNotFound )
+        {
+        if ( AknLayoutUtils::PenEnabled() )
+            {
+            aResult = ECmdTAdd;
+            }
+        else
+            {
+            aResult = EPlusButton;
+            }
+        return ETrue;
+        }
+    TInt loc2 = KAllowedOperatorMinus().Locate( aOperator );
+    if ( loc2 != KErrNotFound )
+        {
+        if ( AknLayoutUtils::PenEnabled() )
+            {
+            aResult = ECmdTSubtract;
+            }
+        else
+            {
+            aResult = EMinusButton;
+            }
+        return ETrue;
+        }
+    TInt loc3 = KAllowedOperatorStar().Locate( aOperator );
+    if ( loc3 != KErrNotFound )
+        {
+        if ( AknLayoutUtils::PenEnabled() )
+            {
+            aResult = ECmdTMultiply;
+            }
+        else
+            {
+            aResult = EMultiplyButton;
+            }
+        return ETrue;
+        }
+    TInt loc4 = KAllowedOperatorDivide().Locate( aOperator );
+    if ( loc4 != KErrNotFound )
+        {
+        if ( AknLayoutUtils::PenEnabled() )
+            {
+            aResult = ECmdTDivide;
+            }
+        else
+            {
+            aResult = EDivideButton;
+            }
+        return ETrue;
+        }
+    TInt loc5 = KAllowedOperatorEquals().Locate( aOperator );
+    if ( loc5 != KErrNotFound )
+        {
+        if ( AknLayoutUtils::PenEnabled() )
+            {
+            aResult = ECmdTResult;
+            }
+        else
+            {
+            aResult = EEqualButton;
+            }
+        return ETrue;
+        }
+    TInt loc6 = KAllowedOperatorPercent().Locate( aOperator );
+    if ( loc6 != KErrNotFound )
+        {
+        if ( AknLayoutUtils::PenEnabled() )
+            {
+            aResult = ECmdTPercent;
+            }
+        else
+            { 
+            aResult = EPercentButton;
+            }
+        return ETrue;
+        }
+    TInt loc7 = KAllowedOperatorDecimal().Locate( aOperator );
+    if ( loc7 != KErrNotFound )
+        {
+        aResult = ECmdTSeparator;
+        return ETrue;
+        }
+    return EFalse;
+    }
+
+// ---------------------------------------------------------
+// CCalcFuncmapSubPane::GetKeyboardType
+// Returns the type of keyboard
+// ---------------------------------------------------------
+//
+TBool CCalcFuncmapSubPane::GetKeyboardType()
+    {
+    return iKeyboardType;
+    }
+
+// End of file