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 |