webengine/osswebengine/WebKit/s60/webview/WebView.cpp
changeset 10 a359256acfc6
parent 5 10e98eab6f85
child 11 c8a366e56285
equal deleted inserted replaced
5:10e98eab6f85 10:a359256acfc6
    95 
    95 
    96 #include "PlatformFontCache.h"
    96 #include "PlatformFontCache.h"
    97 #include "WebPageFullScreenHandler.h"
    97 #include "WebPageFullScreenHandler.h"
    98 #include "eikon.hrh"
    98 #include "eikon.hrh"
    99 #include "WebScrollbarDrawer.h"
    99 #include "WebScrollbarDrawer.h"
   100 
   100 #include "EventNames.h"
   101 
   101 
   102 using namespace WebCore;
   102 using namespace WebCore;
       
   103 using namespace EventNames;
   103 
   104 
   104 const int KRepaintDelayLoading = 500*1000; // dont do repaints more often than this during loading (0.5s)
   105 const int KRepaintDelayLoading = 500*1000; // dont do repaints more often than this during loading (0.5s)
   105 const int KRepaintDelayComplete = 100*1000; // faster updates after load so dynamic scripts etc have better frame rate (0.1s)
   106 const int KRepaintDelayComplete = 100*1000; // faster updates after load so dynamic scripts etc have better frame rate (0.1s)
   106 const int KRepaintDelayNavNone = 70*1000;
   107 const int KRepaintDelayNavNone = 70*1000;
   107 const int KNormalScrollRange = 60;
   108 const int KNormalScrollRange = 60;
   191 , m_pageFullScreenHandler(NULL)
   192 , m_pageFullScreenHandler(NULL)
   192 , m_viewIsScrolling(false)
   193 , m_viewIsScrolling(false)
   193 , m_ptrbuffer(0)
   194 , m_ptrbuffer(0)
   194 , m_showCursor(false)
   195 , m_showCursor(false)
   195 , m_allowRepaints(true)
   196 , m_allowRepaints(true)
       
   197 , m_prevEditMode(false)
   196 {
   198 {
   197 }
   199 }
   198 
   200 
   199 WebView::~WebView()
   201 WebView::~WebView()
   200 {
   202 {
   534 
   536 
   535     rect.Move(-p);
   537     rect.Move(-p);
   536 
   538 
   537       // draw to back buffer
   539       // draw to back buffer
   538 
   540 
   539 
   541     if(m_widgetextension && !IsVisible())
       
   542         return;
   540     if(!(   m_widgetextension && m_widgetextension->IsWidgetPublising())) {
   543     if(!(   m_widgetextension && m_widgetextension->IsWidgetPublising())) {
   541         mainFrame()->frameView()->draw( *m_webcorecontext, rect );
   544         mainFrame()->frameView()->draw( *m_webcorecontext, rect );
   542         if ( zoomLevel < m_minZoomLevel ) zoomLevel = m_minZoomLevel;
   545         if ( zoomLevel < m_minZoomLevel ) zoomLevel = m_minZoomLevel;
   543         zoomLevelChanged( zoomLevel );
   546         zoomLevelChanged( zoomLevel );
   544     }
   547     }
   577             f->view()->layout();
   580             f->view()->layout();
   578             f = f->tree()->traverseNext();
   581             f = f->tree()->traverseNext();
   579         }
   582         }
   580         layoutPending = false;
   583         layoutPending = false;
   581     }
   584     }
   582     if (!layoutPending) {
   585     
       
   586     if ( !layoutPending || !isLoading()) {
   583         bool needsDraw = false;
   587         bool needsDraw = false;
   584         m_repaints.Tidy();
   588         m_repaints.Tidy();
   585         for (int i=0; i<m_repaints.Count(); ++i) {
   589         for (int i=0; i<m_repaints.Count(); ++i) {
   586             TRect r = m_repaints[i];
   590             TRect r = m_repaints[i];
   587             if (r.Intersects(viewRect)) {
   591             if (r.Intersects(viewRect)) {
   652 // WebView::collectOffscreenbitmap
   656 // WebView::collectOffscreenbitmap
   653 // Get offscreen bitmap
   657 // Get offscreen bitmap
   654 //-------------------------------------------------------------------------------
   658 //-------------------------------------------------------------------------------
   655 void WebView::collectOffscreenbitmapL(CFbsBitmap& snapshot)
   659 void WebView::collectOffscreenbitmapL(CFbsBitmap& snapshot)
   656 {
   660 {
   657     if ( snapshot.Handle() == 0) {
   661     if(   m_widgetextension && m_widgetextension->IsWidgetPublising()) {
   658         // Create bitmap only once
   662         if ( snapshot.Handle() == 0) {
   659         (snapshot).Create(m_brctl->Size(), StaticObjectsContainer::instance()->webSurface()->displayMode());
   663             // Create bitmap only once
   660     }
   664             (snapshot).Create(m_brctl->Size(), StaticObjectsContainer::instance()->webSurface()->displayMode());
   661     CFbsBitmapDevice* device = CFbsBitmapDevice::NewL( &snapshot);
   665         }
   662     CleanupStack::PushL(device);
   666         CFbsBitmapDevice* device = CFbsBitmapDevice::NewL( &snapshot);
   663 
   667         CleanupStack::PushL(device);
   664     WebCoreGraphicsContext* gc = WebCoreGraphicsContext::NewL( device, &snapshot, mainFrame()->frameView());
   668 
   665     CleanupStack::PushL(gc);
   669         WebCoreGraphicsContext* gc = WebCoreGraphicsContext::NewL( device, &snapshot, mainFrame()->frameView());
   666     
   670         CleanupStack::PushL(gc);
   667     if( snapshot.Handle() != 0 ){
   671 
   668         // Clear previous offscreen bitmap
   672         if( snapshot.Handle() != 0 ) {
   669         // frameView->draw might clear the bitmap.
   673             // Clear previous offscreen bitmap
   670         gc->gc().Clear();
   674             // frameView->draw might clear the bitmap.
   671     } else if (snapshot.SizeInPixels()!=m_brctl->Size()){
   675             gc->gc().Clear();
   672           snapshot.Resize(m_brctl->Size());
   676         }
   673     }
   677         if (snapshot.SizeInPixels()!=m_brctl->Size()) {
   674     mainFrame()->frameView()->draw( *gc, mainFrame()->frameView()->visibleRect() );
   678             snapshot.Resize(m_brctl->Size());
   675 
   679         }
   676     CleanupStack::PopAndDestroy(2);
   680         mainFrame()->frameView()->draw( *gc, mainFrame()->frameView()->visibleRect() );
       
   681 
       
   682        CleanupStack::PopAndDestroy(2);
       
   683     }
   677 
   684 
   678 }
   685 }
   679 
   686 
   680 //-------------------------------------------------------------------------------
   687 //-------------------------------------------------------------------------------
   681 // WebView::scheduleRepaint
   688 // WebView::scheduleRepaint
   825 
   832 
   826 
   833 
   827 bool WebView::isNaviKey(const TKeyEvent& keyevent)
   834 bool WebView::isNaviKey(const TKeyEvent& keyevent)
   828 {
   835 {
   829     return (    keyevent.iCode == EKeyUpArrow         // North
   836     return (    keyevent.iCode == EKeyUpArrow         // North
       
   837              || keyevent.iCode == EStdKeyUpArrow      //   :
   830              || keyevent.iCode == EKeyRightUpArrow    // Northeast
   838              || keyevent.iCode == EKeyRightUpArrow    // Northeast
   831              || keyevent.iCode == EStdKeyDevice11     //   : Extra KeyEvent supports diagonal event simulator wedge
   839              || keyevent.iCode == EStdKeyDevice11     //   :
   832              || keyevent.iCode == EKeyRightArrow      // East
   840              || keyevent.iCode == EKeyRightArrow      // East
       
   841              || keyevent.iCode == EStdKeyRightArrow   //   :
   833              || keyevent.iCode == EKeyRightDownArrow  // Southeast
   842              || keyevent.iCode == EKeyRightDownArrow  // Southeast
   834              || keyevent.iCode == EStdKeyDevice12     //   : Extra KeyEvent supports diagonal event simulator wedge
   843              || keyevent.iCode == EStdKeyDevice12     //   :
   835              || keyevent.iCode == EKeyDownArrow       // South
   844              || keyevent.iCode == EKeyDownArrow       // South
       
   845              || keyevent.iCode == EStdKeyDownArrow    //   :
   836              || keyevent.iCode == EKeyLeftDownArrow   // Southwest
   846              || keyevent.iCode == EKeyLeftDownArrow   // Southwest
   837              || keyevent.iCode == EStdKeyDevice13     //   : Extra KeyEvent supports diagonal event simulator wedge
   847              || keyevent.iCode == EStdKeyDevice13     //   :
   838              || keyevent.iCode == EKeyLeftArrow       // West
   848              || keyevent.iCode == EKeyLeftArrow       // West
       
   849              || keyevent.iCode == EStdKeyLeftArrow    //   :
   839              || keyevent.iCode == EKeyLeftUpArrow     // Northwest
   850              || keyevent.iCode == EKeyLeftUpArrow     // Northwest
   840              || keyevent.iCode == EStdKeyDevice10); 
   851              || keyevent.iCode == EStdKeyDevice10 );  //   :
   841 }
   852 }
   842 
   853 
   843 bool WebView::handleEditable(const TKeyEvent& keyevent, TEventCode eventcode, Frame* frame )
   854 bool WebView::handleEditable(const TKeyEvent& keyevent, TEventCode eventcode, Frame* frame )
   844 {
   855 {
   845     bool consumed = false;
   856     bool consumed = false;
   906             page()->focusController()->setFocusedNode(n, frame);
   917             page()->focusController()->setFocusedNode(n, frame);
   907         }
   918         }
   908     }
   919     }
   909 }
   920 }
   910 
   921 
       
   922 bool WebView::needDeactivateEditable(const TKeyEvent& keyevent, TEventCode eventcode)
       
   923 {
       
   924     bool upOrDown = ((keyevent.iCode == EKeyDevice3) ||
       
   925                     (keyevent.iCode == EKeyUpArrow) ||
       
   926                     (keyevent.iCode == EStdKeyUpArrow) ||
       
   927                     (keyevent.iCode == EKeyRightUpArrow) ||
       
   928                     (keyevent.iCode == EKeyDownArrow) ||
       
   929                     (keyevent.iCode == EStdKeyDownArrow) ||
       
   930                     (keyevent.iCode == EKeyLeftDownArrow));
       
   931     bool inEditState  = (m_isEditable && (m_focusedElementType == TBrCtlDefs::EElementActivatedInputBox));
       
   932     bool isSelectBoxActive = (m_focusedElementType == TBrCtlDefs::EElementSelectBox);
       
   933     bool deactivateInputBox = (inEditState && upOrDown);
       
   934     bool deactivateSelectBox = (isSelectBoxActive && isNaviKey(keyevent));
       
   935 
       
   936     return deactivateInputBox || deactivateSelectBox; 
       
   937 }
       
   938 
       
   939 
       
   940 bool WebView::deactivateEditable()
       
   941 {
       
   942     setFocusNone();
       
   943     m_prevEditMode = true;
       
   944     setEditable( EFalse );
       
   945     return true;
       
   946 }
       
   947 
   911 bool WebView::handleEventKeyL(const TKeyEvent& keyevent, TEventCode eventcode, Frame* frame)
   948 bool WebView::handleEventKeyL(const TKeyEvent& keyevent, TEventCode eventcode, Frame* frame)
   912 {
   949 {
   913     WebCursor* cursor = StaticObjectsContainer::instance()->webCursor();
   950     WebCursor* cursor = StaticObjectsContainer::instance()->webCursor();
   914     bool consumed = false;
   951     bool consumed = false;
   915 
   952     bool tabbedNavigation = (m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeTabbed);
       
   953     bool navigationNone = (m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeNone); 
   916     TKeyEvent oldKeyEvent(m_currentEventKey);
   954     TKeyEvent oldKeyEvent(m_currentEventKey);
   917     oldKeyEvent.iCode = keyevent.iCode; 
   955     oldKeyEvent.iCode = keyevent.iCode; 
   918     TEventCode oldKeyCode = m_currentEventCode;
   956     TEventCode oldKeyCode = m_currentEventCode;
   919     bool downEventConsumed = false;
   957     bool downEventConsumed = false;
   920     m_currentEventKey = keyevent;
   958     m_currentEventKey = keyevent;
   921     m_currentEventCode = eventcode;
   959     m_currentEventCode = eventcode;
   922 
   960 
   923     if (m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeNone) {
   961     if (navigationNone) {
   924         consumed = handleInputElement(keyevent, eventcode, frame);
   962         consumed = handleInputElement(keyevent, eventcode, frame);
   925         if (!consumed)
   963         if (!consumed)
   926             consumed = sendKeyEventToEngine(keyevent, eventcode, frame);
   964             consumed = sendKeyEventToEngine(keyevent, eventcode, frame);
   927     }
   965     }
   928     else {
   966     else {
   929         if (keyevent.iCode == EKeyDevice3) {
   967         if (needDeactivateEditable(keyevent, eventcode)) {
   930                 // pass it to webcore
   968             consumed = deactivateEditable();
   931             sendMouseEventToEngine(TPointerEvent::EButton1Down, 
   969             handleKeyNavigation(keyevent, eventcode, frame);
   932 	                            cursor->position(), frame);
   970         }
   933 
   971         else if (keyevent.iCode == EKeyDevice3) {
   934             // mimic ccb's behavior of onFocus
   972             sendMouseEventToEngine(TPointerEvent::EButton1Down,
       
   973                                    cursor->position(), frame);
       
   974                 // mimic ccb's behavior of onFocus
   935             setFocusedNode(frame);
   975             setFocusedNode(frame);
   936 
   976             if (oldKeyCode == EEventKeyDown && 
       
   977                 (m_focusedElementType != TBrCtlDefs::EElementActivatedInputBox)){
       
   978                 sendKeyEventToEngine(oldKeyEvent, EEventKeyDown, frame);
       
   979             }
       
   980            
   937            // Toolbar is activated on long key press only if the element
   981            // Toolbar is activated on long key press only if the element
   938            // type is EElementNone during EEventKeyDown and EEventKey.
   982            // type is EElementNone during EEventKeyDown and EEventKey.
   939            // This prevents toolbar from popping up in DHTML pages. Also,
   983            // This prevents toolbar from popping up in DHTML pages. Also,
   940            // toolbar is activated when the user is not in fast scroll
   984            // toolbar is activated when the user is not in fast scroll
   941            // mode, or in page overview mode, or on wml page.
   985            // mode, or in page overview mode, or on wml page.
   945                launchToolBarL();
   989                launchToolBarL();
   946            }
   990            }
   947            consumed = true;
   991            consumed = true;
   948         } 
   992         } 
   949         else if (isNaviKey(keyevent)) {
   993         else if (isNaviKey(keyevent)) {
   950 
   994             consumed = handleNaviKeyEvent(oldKeyEvent, oldKeyCode, frame);
   951             if (oldKeyCode == EEventKeyDown){
       
   952                 // Keydown event is automatically generated before each keypress event, but in this case
       
   953                 // we don't send a keypress event, so send a keydown event explicitly.
       
   954                 downEventConsumed = sendKeyEventToEngine(oldKeyEvent, EEventKeyDown, frame);
       
   955             }
       
   956           
       
   957           
       
   958             if (m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeTabbed) {
       
   959                 consumed = downEventConsumed || handleTabbedNavigation(keyevent, eventcode);
       
   960             }
       
   961             else {
       
   962                 consumed = handleKeyNavigation(keyevent, eventcode, frame);
       
   963             } 
       
   964         } // if (m_brctl->settings()->getNavigationType()
   995         } // if (m_brctl->settings()->getNavigationType()
   965         else { // Not an arrow key..
   996         else { // Not an arrow key..
   966                  // activate hovered input element by just start typing
   997                  // activate hovered input element by just start typing
   967               consumed = handleInputElement(keyevent, eventcode, frame);
   998             consumed = !m_isEditable && handleInputElement(keyevent, eventcode, frame);
   968         }
   999         }
   969         if (!consumed && !(m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeTabbed && isNaviKey(keyevent))) {
  1000         if (!consumed && !(tabbedNavigation && isNaviKey(keyevent))) {
   970             consumed = sendKeyEventToEngine(keyevent, eventcode, frame);
  1001             consumed = sendKeyEventToEngine(keyevent, eventcode, frame);
   971         }
  1002         }
       
  1003     }
       
  1004     return consumed;
       
  1005 }
       
  1006 
       
  1007 bool WebView::handleNaviKeyEvent(const TKeyEvent& keyevent, TEventCode eventcode, Frame* frame)  
       
  1008 {
       
  1009     bool downEventConsumed = false;
       
  1010     bool consumed = false;
       
  1011     bool tabbedNavigation = (m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeTabbed);
       
  1012     /*
       
  1013      * For each platform keyDown event EventHandler::keEvent() generates 
       
  1014      * keydown and keypress.
       
  1015      * For keypress event we need a char code and since we don't 
       
  1016      * have it at the time of EEventKeyDown we pospond it until EEventKey 
       
  1017      * and send it here.
       
  1018      */
       
  1019     if (eventcode == EEventKeyDown){
       
  1020         downEventConsumed = sendKeyEventToEngine(keyevent, EEventKeyDown, frame);
       
  1021     }
       
  1022 
       
  1023     if (m_isEditable && !downEventConsumed && m_webfeptexteditor->validateTextFormat()) {
       
  1024         setFocusNone();
       
  1025     }
       
  1026 
       
  1027     if (tabbedNavigation) {
       
  1028         consumed = downEventConsumed || handleTabbedNavigation(m_currentEventKey, m_currentEventCode);
       
  1029     }
       
  1030     else {  
       
  1031         consumed = (!m_isEditable &&  //avoid showing the cursor when we are in the input box 
       
  1032                     handleKeyNavigation(keyevent, eventcode, frame)) ||
       
  1033                     downEventConsumed;
   972     }
  1034     }
   973     return consumed;
  1035     return consumed;
   974 }
  1036 }
   975 
  1037 
   976 
  1038 
   982         m_focusedElementType == TBrCtlDefs::EElementTextAreaBox) {
  1044         m_focusedElementType == TBrCtlDefs::EElementTextAreaBox) {
   983         sendMousedEvent = true;
  1045         sendMousedEvent = true;
   984     }
  1046     }
   985     else if (m_focusedElementType == TBrCtlDefs::EElementSelectBox ||
  1047     else if (m_focusedElementType == TBrCtlDefs::EElementSelectBox ||
   986         m_focusedElementType == TBrCtlDefs::EElementSelectMultiBox) {
  1048         m_focusedElementType == TBrCtlDefs::EElementSelectMultiBox) {
   987         if (m_brctl->settings()->getNavigationType() != SettingsContainer::NavigationTypeNone || keyevent.iCode == EKeyDevice3) {
  1049         if (m_brctl->settings()->getNavigationType() != SettingsContainer::NavigationTypeNone || 
       
  1050             keyevent.iCode == EKeyDevice3) {
   988             sendMousedEvent = true;
  1051             sendMousedEvent = true;
   989         }
  1052         }
   990     }
  1053     }
   991     if (sendMousedEvent) {
  1054     if (sendMousedEvent) {
   992         sendMouseEventToEngine(TPointerEvent::EButton1Down, cursor->position(), frame);
  1055         sendMouseEventToEngine(TPointerEvent::EButton1Down, cursor->position(), frame);
   993         sendMouseEventToEngine(TPointerEvent::EButton1Up, cursor->position(), frame);
  1056         sendMouseEventToEngine(TPointerEvent::EButton1Up, cursor->position(), frame);
   994     
  1057 
   995         if (m_focusedElementType == TBrCtlDefs::EElementInputBox || 
  1058         if (m_focusedElementType == TBrCtlDefs::EElementInputBox ||
   996             m_focusedElementType == TBrCtlDefs::EElementTextAreaBox) {
  1059             m_focusedElementType == TBrCtlDefs::EElementTextAreaBox || 
       
  1060             m_focusedElementType == TBrCtlDefs::EElementActivatedInputBox) {
   997             if (!m_fepTimer) {
  1061             if (!m_fepTimer) {
   998                 m_fepTimer = new WebCore::Timer<WebView>(this, &WebView::fepTimerFired);
  1062                 m_fepTimer = new WebCore::Timer<WebView>(this, &WebView::fepTimerFired);
   999             }
  1063             }
  1000 
  1064 
  1001             m_fepTimer->startOneShot(0.2f);
  1065             m_fepTimer->startOneShot(0.2f);
  1018     // start fast scrolling
  1082     // start fast scrolling
  1019     m_showCursor = true;
  1083     m_showCursor = true;
  1020     if (!cursor->isVisible()) {
  1084     if (!cursor->isVisible()) {
  1021         cursor->cursorUpdate(true);
  1085         cursor->cursorUpdate(true);
  1022     }
  1086     }
  1023     
  1087 
  1024     m_savedPosition = mainFrame()->frameView()->contentPos();
  1088     if(!pageView()) {
       
  1089        m_savedPosition = mainFrame()->frameView()->contentPos();
       
  1090     }
       
  1091 
  1025     cursor->scrollAndMoveCursor(keyevent.iCode, m_scrollingSpeed, fastscroll);
  1092     cursor->scrollAndMoveCursor(keyevent.iCode, m_scrollingSpeed, fastscroll);
  1026     updateScrollbars();
  1093     updateScrollbars();
  1027     if (!fastscroll) {
  1094     if (!fastscroll) {
  1028         m_fastScrollTimer->Start(KCursorInitialDelay,KCursorUpdateFrquency,TCallBack(&scrollTimerCb,this));
  1095         m_fastScrollTimer->Start(KCursorInitialDelay,KCursorUpdateFrquency,TCallBack(&scrollTimerCb,this));
  1029         m_scrollingStartTime.HomeTime();
  1096         m_scrollingStartTime.HomeTime();
  1057 {
  1124 {
  1058     int horizontal = 0;
  1125     int horizontal = 0;
  1059     int vertical = 0;
  1126     int vertical = 0;
  1060     switch(keyevent.iCode) {
  1127     switch(keyevent.iCode) {
  1061         case EKeyUpArrow:             // North
  1128         case EKeyUpArrow:             // North
       
  1129         case EStdKeyUpArrow:          //   :
  1062             vertical = -1;
  1130             vertical = -1;
  1063             break;
  1131             break;
  1064 
  1132 
  1065         case EKeyRightUpArrow:        // Northeast
  1133         case EKeyRightUpArrow:        // Northeast
  1066         case EStdKeyDevice11:         //   : Extra KeyEvent supports diagonal event simulator wedge
  1134         case EStdKeyDevice11:         //   :
  1067             vertical   = -1;
  1135             vertical   = -1;
  1068             horizontal = +1;
  1136             horizontal = +1;
  1069             break;
  1137             break;
  1070 
  1138 
  1071         case EKeyRightArrow:          // East
  1139         case EKeyRightArrow:          // East
       
  1140         case EStdKeyRightArrow:       //   :
  1072             horizontal = +1;
  1141             horizontal = +1;
  1073             break;
  1142             break;
  1074 
  1143 
  1075         case EKeyRightDownArrow:      // Southeast
  1144         case EKeyRightDownArrow:      // Southeast
  1076         case EStdKeyDevice12:         //   : Extra KeyEvent supports diagonal event simulator wedge
  1145         case EStdKeyDevice12:         //   :
  1077             vertical   = +1;
  1146             vertical   = +1;
  1078             horizontal = +1;
  1147             horizontal = +1;
  1079             break;
  1148             break;
  1080 
  1149 
  1081         case EKeyDownArrow:           // South
  1150         case EKeyDownArrow:           // South
       
  1151         case EStdKeyDownArrow:        //   :
  1082             vertical   = +1;
  1152             vertical   = +1;
  1083             break;
  1153             break;
  1084 
  1154 
  1085         case EKeyLeftDownArrow:       // Southwest
  1155         case EKeyLeftDownArrow:       // Southwest
  1086         case EStdKeyDevice13:         //   : Extra KeyEvent supports diagonal event simulator wedge
  1156         case EStdKeyDevice13:         //   : Extra KeyEvent supports diagonal event simulator wedge
  1087             vertical   = +1;
  1157             vertical   = +1;
  1088             horizontal = -1;
  1158             horizontal = -1;
  1089             break;
  1159             break;
  1090 
  1160 
  1091         case EKeyLeftArrow:           // West
  1161         case EKeyLeftArrow:           // West
       
  1162         case EStdKeyLeftArrow:        //   :
  1092             horizontal = -1;
  1163             horizontal = -1;
  1093             break;
  1164             break;
  1094 
  1165 
  1095         case EKeyLeftUpArrow:         // Northwest
  1166         case EKeyLeftUpArrow:         // Northwest
  1096         case EStdKeyDevice10:         //   : Extra KeyEvent supports diagonal event simulator wedge
  1167         case EStdKeyDevice10:         //   : Extra KeyEvent supports diagonal event simulator wedge
  1122         if (!inPageViewMode()) {
  1193         if (!inPageViewMode()) {
  1123             delay = 0;
  1194             delay = 0;
  1124         }
  1195         }
  1125     }
  1196     }
  1126     m_pageScrollHandler->scrollbarDrawer()->fadeScrollbar(delay);
  1197     m_pageScrollHandler->scrollbarDrawer()->fadeScrollbar(delay);
  1127 
  1198     TKeyEvent correctedKeyEvent(keyevent);
  1128     if ( (keyevent.iScanCode == EStdKeyDevice3) || 
  1199     correctedKeyEvent.iCode = correctKeyCode();
       
  1200     TEventCode eventCodeUp = eventcode;
       
  1201     TEventCode eventCodeDown = EEventKeyDown;
       
  1202     //If we adjusted iCode we have to reset it to 0 after we
       
  1203     //create PlatformKeyEventSymbian when we send the key event.
       
  1204     //Otherwise the character will be drawn twice - by fep editor and by
       
  1205     //WebEditorClient. These two custom eventcodes serves as indicator that 
       
  1206     //PlatformKeyEventSymbian::m_symbianEvent.iCode nee to be reset to 0.
       
  1207     if (correctedKeyEvent.iCode != m_currentEventKey.iCode) {
       
  1208         eventCodeDown = (TEventCode)(EEventUser + 1);
       
  1209         eventCodeUp = (TEventCode)(EEventUser + 2);    
       
  1210     }
       
  1211     
       
  1212     if ( (keyevent.iScanCode == EStdKeyDevice3) ||
  1129        (keyevent.iScanCode == EStdKeyEnter) ) {
  1213        (keyevent.iScanCode == EStdKeyEnter) ) {
  1130     // pass it to webcore
  1214        // pass it to webcore
  1131     
  1215 
  1132         if (m_focusedElementType == TBrCtlDefs::EElementInputBox || 
  1216         if (( m_focusedElementType == TBrCtlDefs::EElementInputBox ||
  1133             m_focusedElementType == TBrCtlDefs::EElementTextAreaBox) {
  1217             m_focusedElementType == TBrCtlDefs::EElementTextAreaBox) && 
  1134             setEditable(true);
  1218             m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeTabbed ) {
       
  1219             if (!m_prevEditMode) {
       
  1220                 setEditable(true);
       
  1221             }
       
  1222             else {
       
  1223                 m_prevEditMode = false;
       
  1224             }
  1135         }
  1225         }
  1136         if (m_brctl->settings()->getNavigationType() != SettingsContainer::NavigationTypeNone) {
  1226         if (m_brctl->settings()->getNavigationType() != SettingsContainer::NavigationTypeNone) {
  1137             sendMouseEventToEngine(TPointerEvent::EButton1Up, cursor->position(), frame);
  1227             if (!sendKeyEventToEngine(correctedKeyEvent, eventcode, frame)) {
       
  1228                 sendMouseEventToEngine(TPointerEvent::EButton1Up, cursor->position(), frame);
       
  1229             }
  1138             consumed = true;
  1230             consumed = true;
  1139         }
  1231         }
  1140     }
  1232     }
  1141 
  1233 
  1142     if (!consumed) {
  1234     if (!consumed) {
  1143 
  1235         if (m_currentEventCode == EEventKeyDown) {
  1144         TKeyEvent correctedKeyEvent(keyevent);
  1236             sendKeyEventToEngine(correctedKeyEvent, eventCodeDown, frame);
  1145         correctedKeyEvent.iCode = m_currentEventKey.iCode; 
  1237         }
  1146         sendKeyEventToEngine(correctedKeyEvent, eventcode, frame);
  1238         sendKeyEventToEngine(correctedKeyEvent, eventCodeUp, frame);
  1147     }
  1239     }
  1148     m_currentEventKey = KNullKeyEvent;
  1240     m_currentEventKey = KNullKeyEvent;
  1149     m_currentEventCode = EEventNull;
  1241     m_currentEventCode = EEventNull;
  1150     return consumed;
  1242     return consumed;
  1151 }
  1243 }
  1152 
  1244 
  1153 
  1245 
  1154 bool WebView::sendKeyEventToEngine(const TKeyEvent& keyevent, 
  1246 TUint WebView::correctKeyCode()
       
  1247 {
       
  1248     TUint code = m_currentEventKey.iCode;
       
  1249     // if fep editor was invoked then it consume TKeyEvent and as
       
  1250     // result we have KeyEvent.iCode == 0. So we assume here that 
       
  1251     // if element is editable and no iCode in KeyEvent then fep editor
       
  1252     // already put the right character into the input area and we can get 
       
  1253     // the correct iCode from the last entered char. 
       
  1254     if (m_isEditable && !m_currentEventKey.iCode && m_webfeptexteditor) {
       
  1255         TInt len = m_webfeptexteditor->DocumentLengthForFep();
       
  1256         if (len > 0) {
       
  1257             TBuf<2> data;
       
  1258             m_webfeptexteditor->GetEditorContentForFep(data, len - 1, 1);
       
  1259             if (data.Length() > 0) {
       
  1260                 code = data[0];
       
  1261             }
       
  1262         }
       
  1263     }
       
  1264     
       
  1265     return code;
       
  1266 }
       
  1267 
       
  1268 bool WebView::sendKeyEventToEngine(const TKeyEvent& keyevent,
  1155                                    TEventCode eventcode, Frame* frame)
  1269                                    TEventCode eventcode, Frame* frame)
  1156 {
  1270 {
       
  1271     bool tabbedNavigation = (m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeTabbed);
       
  1272     Node* targetNode = frame->document()->focusedNode();
       
  1273     bool hasOnKeyDown = false;
       
  1274     bool hasOnKeyUp = false;
       
  1275     bool hasOnKeyPress = false;    
       
  1276     
       
  1277     for (Node* n = targetNode; n; n = n->parentNode()) {
       
  1278         EventTargetNode* tnode = static_cast<EventTargetNode*>(n);
       
  1279         hasOnKeyDown = tnode->getHTMLEventListener(keydownEvent);
       
  1280         hasOnKeyUp = tnode->getHTMLEventListener(keyupEvent);
       
  1281         hasOnKeyPress = tnode->getHTMLEventListener(keypressEvent);
       
  1282         if (hasOnKeyDown || hasOnKeyUp || hasOnKeyPress) {
       
  1283             break;
       
  1284         }
       
  1285     }
       
  1286     
       
  1287     
       
  1288     if (!m_isEditable && !(hasOnKeyDown || hasOnKeyUp || hasOnKeyPress)) {
       
  1289         frame->document()->setFocusedNode(NULL);
       
  1290     }
  1157     bool consumed = frame->eventHandler()->keyEvent(PlatformKeyboardEvent(keyevent,eventcode));
  1291     bool consumed = frame->eventHandler()->keyEvent(PlatformKeyboardEvent(keyevent,eventcode));
  1158     if (!consumed && eventcode == EEventKey && 
  1292     frame->document()->setFocusedNode(targetNode);
       
  1293 
       
  1294     if (!consumed && eventcode == EEventKey &&
  1159         (m_brctl->capabilities() & TBrCtlDefs::ECapabilityAccessKeys)) {
  1295         (m_brctl->capabilities() & TBrCtlDefs::ECapabilityAccessKeys)) {
  1160         TKeyEvent ke = keyevent;
  1296         TKeyEvent ke = keyevent;
  1161         TChar c(ke.iCode);
  1297         TChar c(ke.iCode);
  1162         // Not consumed by WebCore, is alphanumeric and does not have any modifier
  1298         // Not consumed by WebCore, is alphanumeric and does not have any modifier
  1163         if (c.IsAlphaDigit() && 
  1299         if (c.IsAlphaDigit() && 
  1193     bool consumed = false;
  1329     bool consumed = false;
  1194     Frame* coreFrame = core(mainFrame());
  1330     Frame* coreFrame = core(mainFrame());
  1195     if (!coreFrame)
  1331     if (!coreFrame)
  1196         return EKeyWasNotConsumed;
  1332         return EKeyWasNotConsumed;
  1197     coreFrame = page()->focusController()->focusedOrMainFrame();
  1333     coreFrame = page()->focusController()->focusedOrMainFrame();
  1198    
  1334 
  1199     // edit events
  1335     switch( eventcode ) {
  1200     if (m_isEditable) {
  1336     case EEventKeyDown:
  1201         consumed = handleEditable(keyevent, eventcode, coreFrame);
  1337         handleEventKeyDown(keyevent, eventcode, coreFrame);
  1202     }
  1338         break;
  1203     
  1339     case EEventKey:
  1204     // scroll events
  1340         consumed = handleEventKeyL(keyevent, eventcode, coreFrame);
  1205     if (!consumed) {
  1341         break;
  1206         switch( eventcode ) {
  1342     case EEventKeyUp:
  1207         case EEventKeyDown:
  1343         consumed = handleEventKeyUp(keyevent, eventcode, coreFrame);
  1208             handleEventKeyDown(keyevent, eventcode, coreFrame);
  1344         break;
  1209             break;
  1345     }
  1210         case EEventKey:
  1346 
  1211             if (keyevent.iScanCode != m_currentEventKey.iScanCode ) return EKeyWasNotConsumed;
       
  1212             consumed = handleEventKeyL(keyevent, eventcode, coreFrame);
       
  1213             break;
       
  1214         case EEventKeyUp:
       
  1215             consumed = handleEventKeyUp(keyevent, eventcode, coreFrame);
       
  1216             break;
       
  1217         }
       
  1218     }
       
  1219 
  1347 
  1220     return (consumed) ? EKeyWasConsumed : EKeyWasNotConsumed;
  1348     return (consumed) ? EKeyWasConsumed : EKeyWasNotConsumed;
  1221 }
  1349 }
  1222 
  1350 
  1223 
  1351 
  1233 {
  1361 {
  1234     TPoint scrollDelta = mainFrame()->frameView()->contentPos() - m_savedPosition;
  1362     TPoint scrollDelta = mainFrame()->frameView()->contentPos() - m_savedPosition;
  1235     scrollDelta.iX *= 100;
  1363     scrollDelta.iX *= 100;
  1236     scrollDelta.iY *= 100;
  1364     scrollDelta.iY *= 100;
  1237     if (!inPageViewMode()) {
  1365     if (!inPageViewMode()) {
  1238         if (scrollDelta.iX == 0 && scrollDelta.iY == 0) {
  1366         m_pageScrollHandler->scrollbarDrawer()->drawScrollbar(this, scrollDelta);
  1239             m_pageScrollHandler->scrollbarDrawer()->drawScrollbar(this);
       
  1240         }
       
  1241         else {
       
  1242             m_pageScrollHandler->scrollbarDrawer()->drawScrollbar(this, scrollDelta);
       
  1243         }
       
  1244     }
  1367     }
  1245 }
  1368 }
  1246 
  1369 
  1247 
  1370 
  1248 void WebView::openPageViewL()
  1371 void WebView::openPageViewL()
  1252         return;
  1375         return;
  1253     if (!m_pageView) {
  1376     if (!m_pageView) {
  1254         m_pageView = CPageView::NewL(*this);
  1377         m_pageView = CPageView::NewL(*this);
  1255         MakeVisible(EFalse);
  1378         MakeVisible(EFalse);
  1256         m_savedPosition = mainFrame()->frameView()->contentPos();
  1379         m_savedPosition = mainFrame()->frameView()->contentPos();
       
  1380         m_pageViewStartPosition = m_savedPosition;
  1257         m_brctl->reportStateChanged(TBrCtlDefs::EStateThumbnailView, ETrue);
  1381         m_brctl->reportStateChanged(TBrCtlDefs::EStateThumbnailView, ETrue);
  1258     }
  1382     }
  1259 }
  1383 }
  1260 
  1384 
  1261 void WebView::closePageView()
  1385 void WebView::closePageView()
  1274 void WebView::cancelPageView()
  1398 void WebView::cancelPageView()
  1275 {
  1399 {
  1276     if ( m_brctl->capabilities() & TBrCtlDefs::ECapabilityWebKitLite )
  1400     if ( m_brctl->capabilities() & TBrCtlDefs::ECapabilityWebKitLite )
  1277         return;
  1401         return;
  1278     if (m_pageView) {
  1402     if (m_pageView) {
  1279         mainFrame()->frameView()->scrollTo(m_savedPosition);
  1403 		mainFrame()->frameView()->scrollTo(m_pageViewStartPosition);
  1280         closePageView();
  1404         closePageView();
  1281     }
  1405     }
  1282 }
  1406 }
  1283 
  1407 
  1284 //-------------------------------------------------------------------------------
  1408 //-------------------------------------------------------------------------------
  1543             r = mainFrame()->frameView()->toDocCoords(r);
  1667             r = mainFrame()->frameView()->toDocCoords(r);
  1544             if (mainFrame()->frameView()->isScaled())
  1668             if (mainFrame()->frameView()->isScaled())
  1545                 r.Grow(1, 1);
  1669                 r.Grow(1, 1);
  1546             m_repaints.AddRect(r);
  1670             m_repaints.AddRect(r);
  1547         }
  1671         }
       
  1672         
       
  1673         region.Close();
  1548     }
  1674     }
  1549     else {
  1675     else {
  1550         TRect r(to, bufSize);
  1676         TRect r(to, bufSize);
  1551         r = mainFrame()->frameView()->toDocCoords(r);
  1677         r = mainFrame()->frameView()->toDocCoords(r);
  1552         if (mainFrame()->frameView()->isScaled())
  1678         if (mainFrame()->frameView()->isScaled())