browserui/browser/BrowserAppSrc/BrowserContentViewContainer.cpp
branchRCL_3
changeset 65 8e6fa1719340
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browserui/browser/BrowserAppSrc/BrowserContentViewContainer.cpp	Wed Sep 01 12:31:04 2010 +0100
@@ -0,0 +1,903 @@
+/*
+* 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 the License "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: 
+*
+*
+*/
+
+#include "BrowserContentViewContainer.h"
+#include "BrowserAppUi.h"
+#include "BrowserAppViewBase.h"
+#include "BrowserGotoPane.h"
+#include "CommonConstants.h"
+#include "BrowserContentView.h"
+#include "Display.h"
+#include "Preferences.h"
+#include "BrowserUtil.h"
+
+#include "BrowserPreferences.h"
+#include "BrowserWindow.h"
+#include "BrowserWindowManager.h"
+#include <FeatMgr.h>
+
+#include <LayoutMetaData.cdl.h> // For Layout_Meta_Data landscape/portrait status
+
+#include <eikrted.h>
+#include <eikbctrl.h>
+#include <Eikmenub.h>
+
+#include <aknutils.h>
+
+#include "BrowserUIVariant.hrh"
+
+#ifdef __SERIES60_HELP
+// Context-Sensitve Help File
+#include "BrowserApplication.h"
+#include <csxhelp/ope.hlp.hrh>
+#include <csxhelp/browser.hlp.hrh>
+#endif // __SERIES60_HELP
+
+#include "eikon.hrh"
+
+
+//Constant
+// The interval zoom tooltip is visible, it will disappear after KZoomLevelShowTime seconds
+const TInt KZoomLevelShowTime( 2 * 1000 ); // 2 seconds
+
+//---------------------------------------------------------------------------
+// CBrowserContentViewContainer::NewL()
+// ---------------------------------------------------------------------------
+//
+CBrowserContentViewContainer*
+CBrowserContentViewContainer::NewL(CBrowserContentView* aView,
+                                   MApiProvider& aApiProvider )
+    {
+    CBrowserContentViewContainer* container =
+        new (ELeave) CBrowserContentViewContainer( aView, aApiProvider );
+    CleanupStack::PushL( container );
+    container->ConstructL();
+    CleanupStack::Pop(); // container
+
+    return container;
+    }
+
+//---------------------------------------------------------------------------
+// CBrowserContentViewContainer::CBrowserContentViewContainer()
+// ---------------------------------------------------------------------------
+//
+CBrowserContentViewContainer::
+CBrowserContentViewContainer(CBrowserContentView* aView,
+                             MApiProvider& aApiProvider ) :
+    iView( aView ),
+    iApiProvider( aApiProvider )
+    {
+    }
+
+//---------------------------------------------------------------------------
+// CBrowserContentViewContainer::~CBrowserContentViewContainer()
+// ---------------------------------------------------------------------------
+//
+CBrowserContentViewContainer::~CBrowserContentViewContainer()
+    {
+    delete iGotoPane;
+    delete iFindKeywordPane;
+    iView = NULL; // Not owned
+
+    iShortCutFuncMap.Close();
+    }
+
+//---------------------------------------------------------------------------
+// CBrowserContentViewContainer::ConstructL()
+// ---------------------------------------------------------------------------
+//
+void CBrowserContentViewContainer::ConstructL()
+    {
+    CreateWindowL();
+
+#if defined(BRDO_MULTITOUCH_ENABLED_FF) && !defined (__WINSCW__)       
+    //Enable advance pointer info for multi-touch.
+    Window().EnableAdvancedPointers();
+#endif  
+    
+    SetAllowStrayPointers();
+    SetMopParent( iView );
+
+    }
+
+// -----------------------------------------------------------------------------
+// CBrowserContentViewContainer::HandlePointerEventL
+// Handles pointer events
+// -----------------------------------------------------------------------------
+void CBrowserContentViewContainer::HandlePointerEventL(const TPointerEvent& aPointerEvent)
+    {
+     switch ( aPointerEvent.iType )
+        {
+        case TPointerEvent::EButton1Down:
+            {
+            // Do nothing
+            break;
+            }
+        case TPointerEvent::EDrag:
+            {
+            // Do nothing
+            break;
+            }
+        case TPointerEvent::EButton1Up:
+            {
+            // Close the zoom silder when the user selects anywhere in the
+            // BrowserContainerView
+            if ( iView->ZoomSliderVisible() )
+                {
+                iView->MakeZoomSliderVisibleL( EFalse );
+                }
+            break;
+            }
+        default:
+            {
+            break;
+            }
+        }   // end of switch
+
+    // Must pass the pointer event to the CoeControl
+    CCoeControl::HandlePointerEventL( aPointerEvent );
+    }
+
+//---------------------------------------------------------------------------
+// CBrowserContentViewContainer::OfferKeyEventL()
+// ---------------------------------------------------------------------------
+//
+TKeyResponse CBrowserContentViewContainer::OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType)
+    {
+    CBrowserAppUi* ui = CBrowserAppUi::Static();
+    TKeyResponse result( EKeyWasNotConsumed );
+
+    if (ui->OfferApplicationSpecificKeyEventL(aKeyEvent, aType) == EKeyWasConsumed)
+        {
+        return EKeyWasConsumed;
+        }
+
+    // For Short Cut
+    if (!iShortCutFuncsReady)
+    {
+        CreateShortCutFuncsHashTable();
+        iShortCutFuncsReady = ETrue;
+    }
+
+    // Turn off some controls, if we receive events
+    if ( aType == EEventKey )
+        {
+        // Turn off the keymap if on
+        if ( iView->KeymapIsUp() )
+            {
+            iView->HandleCommandL( EWmlCmdHideShortcutKeymap );
+            }
+
+        // Turn off the zoom slider if on
+        if ( iView->ZoomSliderVisible() )
+            {
+            iView->MakeZoomSliderVisibleL( EFalse );
+            }
+        }
+
+    // If goto pane is visible, offer key events to it
+    if ( iGotoPane->IsVisible() )
+        {
+        return iGotoPane->OfferKeyEventL( aKeyEvent, aType );
+        }
+
+    TKeyEvent keyEvent( aKeyEvent );
+    TBrCtlDefs::TBrCtlElementType elementtype =
+        iApiProvider.BrCtlInterface().FocusedElementType();
+
+    // Don't allow virtual keyboard backspace key event to close the window
+    // And don't close window if editing in an input box or textarea input 
+    if ( !AknLayoutUtils::PenEnabled() && aType == EEventKey
+        && keyEvent.iCode == EKeyBackspace
+        && elementtype != TBrCtlDefs::EElementActivatedInputBox 
+        && elementtype != TBrCtlDefs::EElementTextAreaBox )
+        {
+        if ( iApiProvider.Preferences().UiLocalFeatureSupported(
+                                                    KBrowserMultipleWindows ) )
+            {
+            TInt winCount = iApiProvider.WindowMgr().WindowCount();
+            if ( ( winCount > 1 ) && ( !iView->IsMiniatureViewUp() ) )
+                {
+                ui->CloseWindowL();
+                result = EKeyWasConsumed;
+                }
+            }
+        }
+
+    // Handle zooming events
+    // 1. RemConInterface will translate dedicated HW key press to OfferKeyEventL().
+    // See eikon.hrh for mapping.
+    // 2. When the browser is in Zoom Mode (slider or tooltip displayed), the
+    // navi-keys will zoom.
+    if ( aType == EEventKey )
+        {
+        // Handle dedicated HW key zoom-in: if not in zoom mode, HW zoom key takes
+        // zooming immediately without going to zoom mode
+        // if it's already in zoom mode, then HW zoom key acts the same as up
+        // and down navigation key mode
+        // Zoom mode can display tooltip (current) or slider (future)
+        if ( iView->isZoomMode() )
+            {
+            }
+        else if (!iView->IsHistoryViewUp() && !iView->IsMiniatureViewUp())
+            {
+            // Not in zoom mode, or history view, or page overview, and HW zoom key
+            // pressed -  zoom immediately without entering zoom mode.
+            if ( keyEvent.iCode == EKeyZoomIn )
+                {
+                iApiProvider.BrCtlInterface().HandleCommandL(
+                        (TInt)TBrCtlDefs::ECommandZoomIn +
+                        (TInt)TBrCtlDefs::ECommandIdBase );
+                iView->ZoomImagesInL(KZoomLevelShowTime);
+                result = EKeyWasConsumed;
+                }
+            // Handle dedicated HW key zoom-out
+            else if ( keyEvent.iCode == EKeyZoomOut )
+                {
+                iApiProvider.BrCtlInterface().HandleCommandL(
+                        (TInt)TBrCtlDefs::ECommandZoomOut +
+                        (TInt)TBrCtlDefs::ECommandIdBase );
+                iView->ZoomImagesOutL(KZoomLevelShowTime);
+                result = EKeyWasConsumed;
+                }
+            }
+
+        }   // End of handling key events for zooming
+
+    
+    // Web Engine opens the highlighted link into a new window. (long press)
+    // Currently the option is disabled and the link is opened in the same window
+    // The commented part below enables the "Open link in new window" option on long press.
+    // UI change request AHUN-6U3NT4, S60 bug AHUN-6UYT6N
+
+    TBool aEnterKeyForLinksActivation = (keyEvent.iCode == EKeyEnter) && 
+        (iApiProvider.Preferences().EnterKeyMode() == TBrCtlDefs::EEnterKeyCanActivateLink);
+    if ( aType == EEventKey && 
+         (keyEvent.iCode == EKeyOK || aEnterKeyForLinksActivation) )
+        {
+        if ( keyEvent.iRepeats && iSelectionKeyPressed )
+            {
+
+            TInt command( KErrNotFound );
+            switch( elementtype )
+                {
+                case TBrCtlDefs::EElementAnchor:
+                    {
+    //                command = TBrCtlDefs::ECommandOpenNewWindow;
+                      command = TBrCtlDefs::ECommandOpen;
+                    break;
+                    }
+                default: break;
+                }
+    //        if ( command == TBrCtlDefs::ECommandOpenNewWindow &&
+    //          iApiProvider.Preferences().UiLocalFeatureSupported( KBrowserMultipleWindows ) &&
+    //          !iApiProvider.Preferences().UiLocalFeatureSupported( KBrowserMinimalMultipleWindows ))
+              if ( command == TBrCtlDefs::ECommandOpen)
+                {
+                iSelectionKeyPressed = EFalse;
+                keyEvent.iCode = EKeyNull;
+                result = EKeyWasConsumed;
+                iApiProvider.BrCtlInterface().HandleCommandL(
+                    command + TBrCtlDefs::ECommandIdBase );
+                }
+            }
+        }
+
+    // stop the event handling when find item was actived
+    if ( (keyEvent.iScanCode == EStdKeyDevice3 || 
+          keyEvent.iScanCode == EStdKeyXXX ||
+          aEnterKeyForLinksActivation)
+        && aType == EEventKeyDown && !iView->FindItemIsInProgress() )
+        {
+        iSelectionKeyPressed = ETrue;
+        keyEvent.iCode = EKeyNull;
+        }
+
+    // Ignore key event in zoom mode
+    if ( result == EKeyWasNotConsumed && !iView->isZoomMode())
+        {
+        if ( !iView->PenEnabled() && iView->FullScreenMode() && keyEvent.iRepeats) 
+            {
+                iView->setFullScreenFlag();
+                iView->EnableFullScreenModeL( EFalse );
+            }
+        TRAP_IGNORE(result = iApiProvider.BrCtlInterface().OfferKeyEventL(keyEvent, aType));
+        }
+
+    /**
+    * When checking long or short key presses, iScanCode must be used, because
+    * when EEventKeyUp/EEventKeyUp are handled, the iCode is not available.
+    * iIsKeyLongPressed must be checked in short key presses because, when the
+    * button is released short key code will be called again. And that time it
+    * must be ignored.
+    */
+
+    /**
+    // This key is inactive, only for testing short / long key presses.
+    if ( keyEvent.iScanCode == 48 && keyEvent.iRepeats && !iIsKeyLongPressed)
+        {
+        iEikonEnv->InfoMsg(_L("0 Long"));
+        iIsKeyLongPressed = ETrue;
+        keyEvent.iCode = EKeyNull;
+        result = EKeyWasConsumed;
+        }
+    if ( aType == EEventKeyUp && keyEvent.iScanCode == 48 && !keyEvent.iRepeats)
+        {
+        if ( !iIsKeyLongPressed )
+            {
+            iEikonEnv->InfoMsg(_L("0 Short"));
+            keyEvent.iCode = EKeyNull;
+            result = EKeyWasConsumed;
+            }
+        iIsKeyLongPressed = EFalse;
+        }
+    **/
+
+    /*
+    * Not processing short keys, if the History view, or the
+    * Miniature View ( old name: Thumbnail View ) is up,
+    * except short key: '8'.
+    */
+    if (!iApiProvider.Preferences().AccessKeys())
+    {
+        // Key short press, activate function based on keyEvent.iCode
+        if ( aType == EEventKey && result == EKeyWasNotConsumed )
+            {
+            if (!AknLayoutUtils::PenEnabled())
+                {
+                if (iView->isZoomMode())
+                    {
+                    result = EKeyWasConsumed;
+                    }
+                else
+                    {
+                    if (iApiProvider.Preferences().ShortcutKeysForQwerty())
+                        {
+                        result = InvokeFunction ( keyEvent.iCode );
+                        }
+                    else
+                        {
+                        if ( !iView->IsMiniatureViewUp() && !iView->IsHistoryViewUp() )
+                            {
+                            TInt function = -1;
+                            switch(keyEvent.iCode)
+                                {
+                                case '0':
+                                    {
+                                    function = ShortcutsCommandDecodeMatrix[iApiProvider.Preferences().ShortcutKey0Cmd()][KShortcutsCommandDecodeMatrixCmdVal];
+                                    break;
+                                    }
+                                case '1':
+                                    {
+                                    function = ShortcutsCommandDecodeMatrix[iApiProvider.Preferences().ShortcutKey1Cmd()][KShortcutsCommandDecodeMatrixCmdVal];
+                                    break;
+                                    }
+                                case '2':
+                                    {
+                                    function = ShortcutsCommandDecodeMatrix[iApiProvider.Preferences().ShortcutKey2Cmd()][KShortcutsCommandDecodeMatrixCmdVal];
+                                    break;
+                                    }
+                                case '3':
+                                    {
+                                    function = ShortcutsCommandDecodeMatrix[iApiProvider.Preferences().ShortcutKey3Cmd()][KShortcutsCommandDecodeMatrixCmdVal];
+                                    break;
+                                    }
+                                case '4':
+                                    {
+                                    function = ShortcutsCommandDecodeMatrix[iApiProvider.Preferences().ShortcutKey4Cmd()][KShortcutsCommandDecodeMatrixCmdVal];
+                                    break;
+                                    }
+                                case '5':
+                                    {
+                                    function = ShortcutsCommandDecodeMatrix[iApiProvider.Preferences().ShortcutKey5Cmd()][KShortcutsCommandDecodeMatrixCmdVal];
+                                    break;
+                                    }
+                                case '6':
+                                    {
+                                    function = ShortcutsCommandDecodeMatrix[iApiProvider.Preferences().ShortcutKey6Cmd()][KShortcutsCommandDecodeMatrixCmdVal];
+                                    break;
+                                    }
+                                case '7':
+                                    {
+                                    function = ShortcutsCommandDecodeMatrix[iApiProvider.Preferences().ShortcutKey7Cmd()][KShortcutsCommandDecodeMatrixCmdVal];
+                                    break;
+                                    }
+                                case '8':
+                                    {
+                                    function = ShortcutsCommandDecodeMatrix[iApiProvider.Preferences().ShortcutKey8Cmd()][KShortcutsCommandDecodeMatrixCmdVal];
+                                    break;
+                                    }
+                                case '9':
+                                    {
+                                    function = ShortcutsCommandDecodeMatrix[iApiProvider.Preferences().ShortcutKey9Cmd()][KShortcutsCommandDecodeMatrixCmdVal];
+                                    break;
+                                    }
+                                case '*':
+                                    {
+                                    function = ShortcutsCommandDecodeMatrix[iApiProvider.Preferences().ShortcutKeyStarCmd()][KShortcutsCommandDecodeMatrixCmdVal];
+                                    break;
+                                    }
+                                case '#':
+                                    {
+                                    function = ShortcutsCommandDecodeMatrix[iApiProvider.Preferences().ShortcutKeyHashCmd()][KShortcutsCommandDecodeMatrixCmdVal];
+                                    break;
+                                    }
+                                default:
+                                    {
+                                    break;
+                                    }
+                                }
+
+                            if (function != -1)
+                                {
+                                iView->HandleCommandL(function);
+                                result = EKeyWasConsumed;
+                                }
+                            }
+                        } //endof handle shortcut keys
+
+                    if (result == EKeyWasConsumed)
+                        {
+                            keyEvent.iCode = EKeyNull;
+                        }
+                    }
+                }
+            }
+
+            if ( iView->IsHistoryViewUp() && result == EKeyWasConsumed )
+                {
+                if (    ( aType == EEventKey || aType == EEventKeyUp )
+                     && (    keyEvent.iCode == EKeyLeftUpArrow       // Northwest
+                          || keyEvent.iCode == EStdKeyDevice10       //   : Extra KeyEvent supports diagonal event simulator wedge
+                          || keyEvent.iCode == EKeyLeftArrow         // West
+                          || keyEvent.iCode == EKeyLeftDownArrow     // Southwest
+                          || keyEvent.iCode == EStdKeyDevice13       //   : Extra KeyEvent supports diagonal event simulator wedge
+
+                          || keyEvent.iCode == EKeyRightUpArrow      // Northeast
+                          || keyEvent.iCode == EStdKeyDevice11       //   : Extra KeyEvent supports diagonal event simulator wedge
+                          || keyEvent.iCode == EKeyRightArrow        // East
+                          || keyEvent.iCode == EKeyRightDownArrow    // Southeast
+                          || keyEvent.iCode == EStdKeyDevice12 ) )   //   : Extra KeyEvent supports diagonal event simulator wedge
+                    {
+                    iView->UpdateTitleL( iApiProvider );
+                    }
+                }
+
+            // If in zoom mode, then show the zoom tooltip
+            if (iView->isZoomMode() && result == EKeyWasConsumed )
+                {
+                iView->SetZoomLevelTitleTextL(R_BROWSER_ZOOM_LEVEL);
+                }
+
+        }   // if (!iApiProvider.Preferences().AccessKeys())
+
+    if ( result == EKeyWasNotConsumed &&
+         (keyEvent.iScanCode == EStdKeyDevice3 || keyEvent.iScanCode == EStdKeyXXX) &&
+         aType == EEventKeyUp  &&
+         iSelectionKeyPressed )
+        {
+        // Selection key was released and it is not a long press!
+        iSelectionKeyPressed = EFalse;
+        aType = EEventKey;
+        keyEvent.iCode = EKeyOK;
+
+        // first offer event to browser control, e.g. link activation
+        // result = iApiProvider.BrCtlInterface().OfferKeyEventL(keyEvent, aType);
+
+        iView->ResetPreviousViewFlag();
+        }
+    return result;
+    }
+
+//---------------------------------------------------------------------------
+// CBrowserContentViewContainer::FocusChanged()
+// ---------------------------------------------------------------------------
+//
+void CBrowserContentViewContainer::FocusChanged(TDrawNow aDrawNow)
+    {
+    // do not proceed further if a browser app exit is in progress
+    if ( iApiProvider.ExitInProgress() )
+        {
+        return;
+        }
+
+    if ( iApiProvider.StartedUp() )
+        iApiProvider.BrCtlInterface().SetFocus(IsFocused());
+    if ( iGotoPane->IsVisible() )
+        {
+        TRAP_IGNORE(iGotoPane->EnableKeyEventHandlerL( IsFocused() ));
+        }
+
+    CCoeControl::FocusChanged( aDrawNow );
+    }
+
+//---------------------------------------------------------------------------
+// CBrowserContentViewContainer::SizeChanged()
+// ---------------------------------------------------------------------------
+//
+void CBrowserContentViewContainer::SizeChanged()
+    {
+    // BrCtl could be uninitialized
+    if ( iApiProvider.StartedUp() )
+        {
+        if(iApiProvider.LastActiveViewId() != KUidBrowserFeedsFeedViewId)
+            {
+            const TRect& oldRect = iApiProvider.BrCtlInterface().Rect();
+            iApiProvider.BrCtlInterface().SetRect( TRect( oldRect.iTl, Size() ) );
+            }
+        }
+    
+    if ( iFindKeywordPane->IsVisible() )
+        iFindKeywordPane->HandleFindSizeChanged();
+    if ( iGotoPane->IsVisible() ) 
+        iGotoPane->HandleFindSizeChanged();
+    
+    }
+
+//---------------------------------------------------------------------------
+// CBrowserContentViewContainer::CountComponentControls()
+// ---------------------------------------------------------------------------
+//
+TInt CBrowserContentViewContainer::CountComponentControls() const
+    {
+    TInt ctrls = 0;
+    ctrls++;        // iGotoPane
+    if ( iApiProvider.StartedUp() )
+        {
+        ctrls++;
+        }
+    ctrls++;        // iFindKeywordPane
+    return ctrls;
+    }
+
+//---------------------------------------------------------------------------
+// CBrowserContentViewContainer::ComponentControl()
+// ---------------------------------------------------------------------------
+//
+CCoeControl* CBrowserContentViewContainer::ComponentControl( TInt aIndex ) const
+    {
+    CCoeControl *ctrl = NULL;
+    switch( aIndex )
+        {
+        case 0:
+            {
+            ctrl = iGotoPane;
+            break;
+            }
+        case 1:
+            {
+            if ( iApiProvider.StartedUp() )
+                ctrl = &(iApiProvider.BrCtlInterface());
+            break;
+            }
+        case 2:
+            {
+            ctrl = iFindKeywordPane;
+            break;
+            }
+
+        default:
+            break;
+        }
+    return ctrl;
+    }
+
+//---------------------------------------------------------------------------
+// CBrowserContentViewContainer::ShutDownGotoURLEditorL()
+// ---------------------------------------------------------------------------
+//
+void CBrowserContentViewContainer::ShutDownGotoURLEditorL()
+    {
+    iGotoPane->MakeVisible( EFalse );
+    iGotoPane->SetFocus( EFalse );
+    SetFocus( ETrue );
+    }
+
+
+//---------------------------------------------------------------------------
+// CBrowserContentViewContainer::ShutDownFindKeywordEditorL()
+// ---------------------------------------------------------------------------
+//
+void CBrowserContentViewContainer::ShutDownFindKeywordEditorL()
+    {
+    iFindKeywordPane->MakeVisible( EFalse );
+    iFindKeywordPane->SetFocus( EFalse );
+    SetFocus( ETrue );
+    }
+
+
+//---------------------------------------------------------------------------
+// CBrowserContentViewContainer::HandleResourceChange()
+// ---------------------------------------------------------------------------
+//
+void CBrowserContentViewContainer::HandleResourceChange(TInt aType)
+    {
+    CCoeControl::HandleResourceChange( aType );
+    if ( aType == KEikDynamicLayoutVariantSwitch)
+        {
+        if (!iView->FindItemIsInProgress())
+            {
+            iView->HandleStatusPaneCallBack();
+            iApiProvider.Display().RestoreTitleL();
+            }
+
+        iView->SetContentContainerRect();
+        
+        if( iApiProvider.Preferences().SearchFeature() )
+          {
+          iGotoPane->SetTextModeItalicL();
+          // To Avoid Flickring, only when layout changed. 
+          iGotoPane->DrawNow();
+          }
+        
+        DrawDeferred();
+
+        // For Touch only-If find pane open, force toolbar to show since avkon disables
+        // touch toolbar whenever a dialog is open and a rotate event is handled.
+        // ** This workaround was provided by Avkon toolbar group
+        if ( AknLayoutUtils::PenEnabled() &&
+             iFindKeywordPane->IsVisible() &&
+             iView->Toolbar() )
+            {
+            iView->Toolbar()->DrawableWindow()->SetOrdinalPosition( 0 );
+            }
+        }
+    }
+
+
+//---------------------------------------------------------------------------
+// CBrowserContentViewContainer::CreateShortCutFuncsHashTable()
+// ---------------------------------------------------------------------------
+//
+void CBrowserContentViewContainer::CreateShortCutFuncsHashTable()
+    {
+    InsertFuncToHashTable(iApiProvider.Preferences().ShortCutFuncHomePg(), EWmlSettingsShortCutsActivateHomepage);
+    InsertFuncToHashTable(iApiProvider.Preferences().ShortCutFuncBkMark(), EWmlSettingsShortCutsActivateBkmkview);
+    InsertFuncToHashTable(iApiProvider.Preferences().ShortCutFuncFindKeyWord(), EWmlSettingsShortCutsShowFindKeyword);
+    InsertFuncToHashTable(iApiProvider.Preferences().ShortCutFuncPrePage(), EWmlSettingsShortCutsGotoPreviousPage);
+    InsertFuncToHashTable(iApiProvider.Preferences().ShortCutFuncSwitchWin(), EWmlSettingsShortCutsShowSwitchWindowList);
+    InsertFuncToHashTable(iApiProvider.Preferences().ShortCutFuncMiniImage(), EWmlSettingsShortCutsShowMiniature);
+    InsertFuncToHashTable(iApiProvider.Preferences().ShortCutFuncFullScreen(), EWmlSettingsShortCutsShowFullScreen);
+    InsertFuncToHashTable(iApiProvider.Preferences().ShortCutFuncGoAddr(), EWmlSettingsShortCutsGotoPane);
+    InsertFuncToHashTable(iApiProvider.Preferences().ShortCutFuncZoomIn(), EWmlSettingsShortCutsZoomIn);
+    InsertFuncToHashTable(iApiProvider.Preferences().ShortCutFuncZoomOut(), EWmlSettingsShortCutsZoomOut);
+    // InsertFuncToHashTable(iApiProvider.Preferences().ShortCutFuncZoomMode(), EWmlSettingsShortCutsZoomMode);
+    }
+
+//---------------------------------------------------------------------------
+// CBrowserContentViewContainer::InsertFuncToHashTable()
+// ---------------------------------------------------------------------------
+//
+void CBrowserContentViewContainer::InsertFuncToHashTable(HBufC* aKeyStr, TInt aFunc)
+    {
+
+    __ASSERT_DEBUG( (aKeyStr != NULL), Util::Panic( Util::EUninitializedData ));
+
+        if (aKeyStr->Length() == 0)
+        {
+            return;
+        }
+
+        TBuf<4> key1Str; //  Ex.: 0075
+        TBuf<4> key2Str; //  Ex.: 0032
+
+        // Get the position of the separator ',' character from '0075, 0032'.
+        TInt pos = aKeyStr->LocateF( ',' );
+        if ( ( pos != KErrNotFound ) )
+        {    //we have two string
+            // Extract the first unicode string
+            key1Str.Copy( aKeyStr->Des().Left( pos ) );
+            TUint key1 = MyAtoi(key1Str);
+
+            // Extract the second unicode string; second "-1" below is for remove space
+            key2Str.Copy( aKeyStr->Des().Right( aKeyStr->Des().Length() - pos - 1 -1) );
+            TUint key2 = MyAtoi(key2Str);
+
+            // insert key and function
+            iShortCutFuncMap.Insert(key1, aFunc);
+            iShortCutFuncMap.Insert(key2, aFunc);
+        }
+        else
+        {    //we only have one string
+            // Extract the first unicode string
+            key1Str.Copy( aKeyStr->Des() );
+            TUint key1 = MyAtoi(key1Str);
+            // insert key and function
+            iShortCutFuncMap.Insert(key1, aFunc);
+        }
+    }
+
+//---------------------------------------------------------------------------
+// CBrowserContentViewContainer::MyAtoi()
+// ---------------------------------------------------------------------------
+//
+TUint CBrowserContentViewContainer::MyAtoi(TPtrC aData)
+    {
+        TLex lex(aData);
+        TUint dataValue = 0;
+        lex.Val(dataValue, EHex);
+        return dataValue;
+    }
+
+//---------------------------------------------------------------------------
+// CBrowserContentViewContainer::InvokeFunction()
+// ---------------------------------------------------------------------------
+//
+TKeyResponse CBrowserContentViewContainer::InvokeFunction(TUint aCode)
+    {
+    TInt function = -1;
+    // if error, no function defined for this shortcut key
+    TRAPD( err, function = iShortCutFuncMap.FindL(aCode) );
+    if ( err != KErrNone )
+        {
+            return EKeyWasNotConsumed;
+        }
+
+    TBool embedded = iApiProvider.IsEmbeddedModeOn();
+
+    if ( !iView->IsMiniatureViewUp() && !iView->IsHistoryViewUp() )
+    {
+        CBrowserAppUi* ui = CBrowserAppUi::Static();
+
+        switch(function)
+            {
+            case EWmlSettingsShortCutsActivateHomepage:
+                {
+                TBool homepage = iApiProvider.Preferences().UiLocalFeatureSupported( KBrowserUiHomePageSetting );
+                // home page
+                if ( homepage )
+                    {
+                    //
+                    TWmlSettingsHomePage pgtype = iApiProvider.Preferences().HomePageType();
+
+                    if ( !(embedded || pgtype == EWmlSettingsHomePageBookmarks) )
+                        {
+                        ui->LaunchHomePageL();
+                        }
+                    else
+                        {
+                        if ( pgtype == EWmlSettingsHomePageBookmarks )
+                            {
+                            iApiProvider.SetViewToBeActivatedIfNeededL( KUidBrowserBookmarksViewId );
+                            }
+                        }
+                    }
+                return EKeyWasConsumed;
+                }
+            case EWmlSettingsShortCutsActivateBkmkview:
+                {
+                if ( !embedded )
+                {
+                    iApiProvider.SetViewToBeActivatedIfNeededL( KUidBrowserBookmarksViewId );
+                }
+                return EKeyWasConsumed;
+                }
+            case EWmlSettingsShortCutsGotoPane:
+                {
+                iView->LaunchGotoAddressEditorL();
+                iView->MenuBar()->MenuPane()->MakeVisible(EFalse);
+                return EKeyWasConsumed;
+                }
+            case EWmlSettingsShortCutsShowFindKeyword:
+                {
+                if (!iView->ApiProvider().WindowMgr().CurrentWindow()->HasWMLContent(ETrue /* is current page wml?*/))
+                    {
+                    iView->LaunchFindKeywordEditorL();
+                    iView->MenuBar()->MenuPane()->MakeVisible(EFalse);
+                    }
+                return EKeyWasConsumed;
+                }
+            case EWmlSettingsShortCutsShowSwitchWindowList:
+                {
+                if (!iView->ApiProvider().WindowMgr().CurrentWindow()->HasWMLContent(EFalse /*is any page wml?*/))
+                    {
+                    if (iApiProvider.Preferences().UiLocalFeatureSupported( KBrowserMultipleWindows ) &&
+                        !iApiProvider.Preferences().UiLocalFeatureSupported( KBrowserMinimalMultipleWindows ) &&
+                        iApiProvider.WindowMgr().WindowCount() > 1)
+                        {
+                        iApiProvider.SetViewToBeActivatedIfNeededL( KUidBrowserWindowSelectionViewId );
+                        }
+                    else
+                        {
+                        if (iApiProvider.WindowMgr().WindowCount() > 1)
+                            {
+                            ui->SwitchWindowL();
+                            }
+                        }
+                    }
+                return EKeyWasConsumed;
+                }
+
+            case EWmlSettingsShortCutsZoomOut:
+                {
+                iView->ZoomImagesOutL();
+                return EKeyWasConsumed;
+                }
+
+            case EWmlSettingsShortCutsZoomIn:
+                {
+                iView->ZoomImagesInL();
+                return EKeyWasConsumed;
+                }
+
+            case EWmlSettingsShortCutsGotoPreviousPage:
+                {
+                if ( iApiProvider.BrCtlInterface().NavigationAvailable( TBrCtlDefs::ENavigationBack ) )
+                    {
+                        iApiProvider.LoadObserver().DoStartLoad( CBrowserLoadObserver::ELoadUrlTypeOther );
+                        iApiProvider.BrCtlInterface().HandleCommandL( (TInt)TBrCtlDefs::ECommandOneStepBack +
+                                                            (TInt)TBrCtlDefs::ECommandIdBase );
+                    }
+                return EKeyWasConsumed;
+                }
+
+            case EWmlSettingsShortCutsShowFullScreen:
+                {
+                iView->HandleCommandL(EWmlCmdEnterFullScreenBrowsing);
+                return EKeyWasConsumed;
+                }
+          }
+    } // END if ( !iView->IsMiniatureViewUp() && !iView->IsHistoryViewUp() && !iView->isZoomMode())
+
+
+    if ( function == EWmlSettingsShortCutsShowMiniature && !iView->IsHistoryViewUp() )
+        {   // Process short key '8' only if History view is not shown.
+            if (!iView->ApiProvider().WindowMgr().CurrentWindow()->HasWMLContent(ETrue /* is current page wml?*/))
+                {
+                iApiProvider.BrCtlInterface().HandleCommandL(
+                        (TInt)TBrCtlDefs::ECommandShowThumbnailView + (TInt)TBrCtlDefs::ECommandIdBase );
+                }
+            return EKeyWasConsumed;
+        }
+
+    return EKeyWasNotConsumed;
+   }
+
+
+
+#ifdef __SERIES60_HELP
+// ---------------------------------------------------------
+// CBrowserContentViewContainer::GetHelpContext()
+// ---------------------------------------------------------
+//
+void CBrowserContentViewContainer::GetHelpContext( TCoeHelpContext& aContext ) const
+    {
+    const TUid KUidOperatorMenuApp = { 0x10008D5E };
+    aContext.iMajor = KUidBrowserApplication;
+    if ( iApiProvider.IsEmbeddedModeOn() )
+        {
+        if ( CBrowserAppUi::Static()->IsEmbeddedInOperatorMenu() )
+            {
+            aContext.iMajor = KUidOperatorMenuApp;
+            aContext.iContext = KOPERATOR_HLP_OPTIONS_LIST;
+            }
+        else
+            {
+            aContext.iContext = KOSS_HLP_PAGEVIEW_EMBED;
+            }
+
+        }
+    else
+        {
+        aContext.iContext = KOSS_HLP_PAGEVIEW;
+        }
+    }
+
+#endif // __SERIES60_HELP
+
+// End of File