877 m_currentEventKey = keyevent; |
878 m_currentEventKey = keyevent; |
878 m_currentEventCode = eventcode; |
879 m_currentEventCode = eventcode; |
879 return false; // not consumed |
880 return false; // not consumed |
880 } |
881 } |
881 |
882 |
|
883 |
|
884 void WebView::sendMouseEventToEngineIfNeeded(TPointerEvent::TType eventType, TPoint pos, Frame* frame) |
|
885 { |
|
886 if (m_brctl->settings()->getNavigationType() != SettingsContainer::NavigationTypeTabbed && |
|
887 (m_brctl->settings()->brctlSetting(TBrCtlDefs::ESettingsCursorShowMode) == TBrCtlDefs::ENoCursor)) |
|
888 { |
|
889 return; |
|
890 } |
|
891 |
|
892 sendMouseEventToEngine(eventType, pos, frame); |
|
893 } |
882 |
894 |
883 void WebView::sendMouseEventToEngine(TPointerEvent::TType eventType, TPoint pos, Frame* frame) |
895 void WebView::sendMouseEventToEngine(TPointerEvent::TType eventType, TPoint pos, Frame* frame) |
884 { |
896 { |
885 TPointerEvent event; |
897 TPointerEvent event; |
886 event.iPosition = pos; |
898 event.iPosition = pos; |
887 event.iModifiers = 0; |
899 event.iModifiers = 0; |
888 event.iType = eventType; |
900 event.iType = eventType; |
889 |
901 |
890 switch (eventType) { |
902 switch (eventType) { |
891 case TPointerEvent::EButton1Down: |
903 case TPointerEvent::EButton1Down: |
892 { |
904 { |
893 frame->eventHandler()->handleMousePressEvent(PlatformMouseEvent(event)); |
905 frame->eventHandler()->handleMousePressEvent(PlatformMouseEvent(event)); |
894 break; |
906 break; |
895 } |
907 } |
896 |
908 |
897 case TPointerEvent::EButton1Up: |
909 case TPointerEvent::EButton1Up: |
898 { |
910 { |
899 frame->eventHandler()->handleMouseReleaseEvent(PlatformMouseEvent(event)); |
911 frame->eventHandler()->handleMouseReleaseEvent(PlatformMouseEvent(event)); |
900 break; |
912 break; |
901 } |
913 } |
902 |
914 |
903 case TPointerEvent::EMove: |
915 case TPointerEvent::EMove: |
904 { |
916 { |
905 frame->eventHandler()->handleMouseMoveEvent(PlatformMouseEvent(event)); |
917 frame->eventHandler()->handleMouseMoveEvent(PlatformMouseEvent(event)); |
906 break; |
918 break; |
907 } |
919 } |
908 }; |
920 }; |
909 } |
921 } |
910 |
922 |
917 page()->focusController()->setFocusedNode(n, frame); |
929 page()->focusController()->setFocusedNode(n, frame); |
918 } |
930 } |
919 } |
931 } |
920 } |
932 } |
921 |
933 |
922 bool WebView::needDeactivateEditable(const TKeyEvent& keyevent, TEventCode eventcode) |
934 bool WebView::needDeactivateEditable(const TKeyEvent& keyevent, TEventCode eventcode, Frame* frame) |
923 { |
935 { |
924 bool upOrDown = ((keyevent.iCode == EKeyDevice3) || |
936 bool upOrDown = ((keyevent.iCode == EKeyUpArrow) || |
925 (keyevent.iCode == EKeyUpArrow) || |
|
926 (keyevent.iCode == EStdKeyUpArrow) || |
937 (keyevent.iCode == EStdKeyUpArrow) || |
927 (keyevent.iCode == EKeyRightUpArrow) || |
938 (keyevent.iCode == EKeyRightUpArrow) || |
928 (keyevent.iCode == EKeyDownArrow) || |
939 (keyevent.iCode == EKeyDownArrow) || |
929 (keyevent.iCode == EStdKeyDownArrow) || |
940 (keyevent.iCode == EStdKeyDownArrow) || |
930 (keyevent.iCode == EKeyLeftDownArrow)); |
941 (keyevent.iCode == EKeyLeftDownArrow)); |
|
942 bool shouldEndEditing = frame->editor()->client()->shouldEndEditing(NULL); |
931 bool inEditState = (m_isEditable && (m_focusedElementType == TBrCtlDefs::EElementActivatedInputBox)); |
943 bool inEditState = (m_isEditable && (m_focusedElementType == TBrCtlDefs::EElementActivatedInputBox)); |
932 bool isSelectBoxActive = (m_focusedElementType == TBrCtlDefs::EElementSelectBox); |
944 bool isSelectBoxActive = (m_focusedElementType == TBrCtlDefs::EElementSelectBox); |
933 bool deactivateInputBox = (inEditState && upOrDown); |
945 bool deactivateInputBox = (inEditState && upOrDown && m_webfeptexteditor->validateTextFormat()); |
934 bool deactivateSelectBox = (isSelectBoxActive && isNaviKey(keyevent)); |
946 bool deactivateSelectBox = (isSelectBoxActive && isNaviKey(keyevent)); |
935 |
947 |
936 return deactivateInputBox || deactivateSelectBox; |
948 bool deactivateEditable = (m_isEditable && shouldEndEditing && m_webfeptexteditor->validateTextFormat()); |
|
949 return deactivateEditable || deactivateSelectBox; |
937 } |
950 } |
938 |
951 |
939 |
952 |
940 bool WebView::deactivateEditable() |
953 bool WebView::deactivateEditable() |
941 { |
954 { |
|
955 WebCursor* cursor = StaticObjectsContainer::instance()->webCursor(); |
|
956 Frame* frame = page()->focusController()->focusedOrMainFrame(); |
|
957 SelectionController* sc = frame->selectionController(); |
|
958 TRect rect = sc->caretRect().Rect(); |
|
959 TPoint pos = kit(frame)->frameView()->frameCoordsInViewCoords(rect.iBr); |
|
960 cursor->setPosition(pos); |
942 setFocusNone(); |
961 setFocusNone(); |
943 m_prevEditMode = true; |
962 m_prevEditMode = true; |
944 setEditable( EFalse ); |
963 setEditable( EFalse ); |
945 return true; |
964 return true; |
946 } |
965 } |
947 |
966 |
948 bool WebView::handleEventKeyL(const TKeyEvent& keyevent, TEventCode eventcode, Frame* frame) |
967 bool WebView::handleEventKeyL(const TKeyEvent& keyevent, TEventCode eventcode, Frame* frame) |
949 { |
968 { |
950 WebCursor* cursor = StaticObjectsContainer::instance()->webCursor(); |
|
951 bool consumed = false; |
969 bool consumed = false; |
952 bool tabbedNavigation = (m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeTabbed); |
970 bool tabbedNavigation = (m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeTabbed); |
953 bool navigationNone = (m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeNone); |
971 bool navigationNone = (m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeNone); |
954 TKeyEvent oldKeyEvent(m_currentEventKey); |
972 TKeyEvent oldKeyEvent(m_currentEventKey); |
955 oldKeyEvent.iCode = keyevent.iCode; |
973 oldKeyEvent.iCode = keyevent.iCode; |
956 TEventCode oldKeyCode = m_currentEventCode; |
974 TEventCode oldKeyCode = m_currentEventCode; |
957 bool downEventConsumed = false; |
|
958 m_currentEventKey = keyevent; |
975 m_currentEventKey = keyevent; |
959 m_currentEventCode = eventcode; |
976 m_currentEventCode = eventcode; |
960 |
977 |
961 if (navigationNone) { |
978 if (navigationNone) { |
962 consumed = handleInputElement(keyevent, eventcode, frame); |
979 if (oldKeyCode == EEventKeyDown) { |
963 if (!consumed) |
980 consumed = sendKeyEventToEngine(keyevent, EEventKeyDown, frame); |
964 consumed = sendKeyEventToEngine(keyevent, eventcode, frame); |
981 } |
965 } |
982 } |
966 else { |
983 else { |
967 if (needDeactivateEditable(keyevent, eventcode)) { |
984 if (keyevent.iCode == EKeyDevice3) { //selection key (MSK) |
968 consumed = deactivateEditable(); |
|
969 handleKeyNavigation(keyevent, eventcode, frame); |
|
970 } |
|
971 else if (keyevent.iCode == EKeyDevice3) { |
|
972 sendMouseEventToEngine(TPointerEvent::EButton1Down, |
|
973 cursor->position(), frame); |
|
974 // mimic ccb's behavior of onFocus |
985 // mimic ccb's behavior of onFocus |
975 setFocusedNode(frame); |
986 consumed = handleMSK(keyevent, oldKeyCode, frame); |
976 if (oldKeyCode == EEventKeyDown && |
987 |
977 (m_focusedElementType != TBrCtlDefs::EElementActivatedInputBox)){ |
|
978 sendKeyEventToEngine(oldKeyEvent, EEventKeyDown, frame); |
|
979 } |
|
980 |
|
981 // Toolbar is activated on long key press only if the element |
988 // Toolbar is activated on long key press only if the element |
982 // type is EElementNone during EEventKeyDown and EEventKey. |
989 // type is EElementNone during EEventKeyDown and EEventKey. |
983 // This prevents toolbar from popping up in DHTML pages. Also, |
990 // This prevents toolbar from popping up in DHTML pages. Also, |
984 // toolbar is activated when the user is not in fast scroll |
991 // toolbar is activated when the user is not in fast scroll |
985 // mode, or in page overview mode, or on wml page. |
992 // mode, or in page overview mode, or on wml page. |
986 if ( ( m_focusedElementType == TBrCtlDefs::EElementNone || |
993 } |
987 m_focusedElementType == TBrCtlDefs::EElementBrokenImage ) && |
|
988 keyevent.iRepeats && !m_brctl->wmlMode() ) { |
|
989 launchToolBarL(); |
|
990 } |
|
991 consumed = true; |
|
992 } |
|
993 else if (isNaviKey(keyevent)) { |
994 else if (isNaviKey(keyevent)) { |
994 consumed = handleNaviKeyEvent(oldKeyEvent, oldKeyCode, frame); |
995 consumed = handleNaviKeyEvent(keyevent, oldKeyCode, frame); |
995 } // if (m_brctl->settings()->getNavigationType() |
996 } // if (m_brctl->settings()->getNavigationType() |
996 else { // Not an arrow key.. |
997 else { // Not an arrow key.. |
997 // activate hovered input element by just start typing |
998 // activate hovered input element by just start typing |
998 consumed = !m_isEditable && handleInputElement(keyevent, eventcode, frame); |
999 consumed = !m_isEditable && handleInputElement(keyevent, eventcode, frame); |
999 } |
1000 } |
1002 } |
1003 } |
1003 } |
1004 } |
1004 return consumed; |
1005 return consumed; |
1005 } |
1006 } |
1006 |
1007 |
1007 bool WebView::handleNaviKeyEvent(const TKeyEvent& keyevent, TEventCode eventcode, Frame* frame) |
1008 bool WebView::handleMSK(const TKeyEvent& keyevent, TEventCode eventcode, Frame* frame) |
|
1009 { |
|
1010 WebCursor* cursor = StaticObjectsContainer::instance()->webCursor(); |
|
1011 bool prevEditableState = m_isEditable; |
|
1012 if (m_focusedElementType != TBrCtlDefs::EElementActivatedInputBox ) { |
|
1013 sendMouseEventToEngineIfNeeded(TPointerEvent::EButton1Down, |
|
1014 cursor->position(), frame); |
|
1015 } |
|
1016 setFocusedNode(frame); |
|
1017 bool textAreaJustActivated = (!prevEditableState && m_isEditable && |
|
1018 m_focusedElementType == TBrCtlDefs::EElementTextAreaBox); |
|
1019 if (eventcode == EEventKeyDown && |
|
1020 m_focusedElementType != TBrCtlDefs::EElementActivatedInputBox && |
|
1021 !textAreaJustActivated) { |
|
1022 sendKeyEventToEngine(keyevent, EEventKeyDown, frame); |
|
1023 } |
|
1024 if ((m_focusedElementType == TBrCtlDefs::EElementNone || |
|
1025 m_focusedElementType == TBrCtlDefs::EElementBrokenImage ) && |
|
1026 keyevent.iRepeats && !m_brctl->wmlMode() ) { |
|
1027 launchToolBarL(); |
|
1028 } |
|
1029 return true; |
|
1030 } |
|
1031 bool WebView::handleNaviKeyEvent(const TKeyEvent& keyevent, TEventCode eventcode, Frame* frame) |
1008 { |
1032 { |
1009 bool downEventConsumed = false; |
1033 bool downEventConsumed = false; |
1010 bool consumed = false; |
1034 bool consumed = false; |
1011 bool tabbedNavigation = (m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeTabbed); |
1035 bool tabbedNavigation = (m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeTabbed); |
1012 /* |
1036 /* |
1013 * For each platform keyDown event EventHandler::keEvent() generates |
1037 * For each platform keyDown event EventHandler::keEvent() generates |
1014 * keydown and keypress. |
1038 * keydown and keypress. |
1015 * For keypress event we need a char code and since we don't |
1039 * 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 |
1040 * have it at the time of EEventKeyDown we pospond it until EEventKey |
1017 * and send it here. |
1041 * and send it here. |
1018 */ |
1042 */ |
1019 if (eventcode == EEventKeyDown){ |
1043 if (eventcode == EEventKeyDown){ |
1020 downEventConsumed = sendKeyEventToEngine(keyevent, EEventKeyDown, frame); |
1044 downEventConsumed = sendKeyEventToEngine(keyevent, EEventKeyDown, frame); |
1021 } |
1045 } |
1022 |
1046 |
1023 if (m_isEditable && !downEventConsumed && m_webfeptexteditor->validateTextFormat()) { |
1047 if (!downEventConsumed && needDeactivateEditable(keyevent, eventcode, frame)) { |
1024 setFocusNone(); |
1048 deactivateEditable(); |
1025 } |
1049 } |
1026 |
1050 |
1027 if (tabbedNavigation) { |
1051 if (tabbedNavigation) { |
1028 consumed = downEventConsumed || handleTabbedNavigation(m_currentEventKey, m_currentEventCode); |
1052 consumed = downEventConsumed || handleTabbedNavigation(m_currentEventKey, m_currentEventCode); |
1029 } |
1053 } |
1030 else { |
1054 else { |
1031 consumed = (!m_isEditable && //avoid showing the cursor when we are in the input box |
1055 consumed = (!m_isEditable && //avoid showing the cursor when we are in the input box |
1032 handleKeyNavigation(keyevent, eventcode, frame)) || |
1056 handleKeyNavigation(keyevent, eventcode, frame)) || |
1033 downEventConsumed; |
1057 downEventConsumed; |
1034 } |
1058 } |
1035 return consumed; |
1059 return consumed; |
1036 } |
1060 } |
1038 |
1062 |
1039 bool WebView::handleInputElement(const TKeyEvent& keyevent, TEventCode eventcode, Frame* frame) |
1063 bool WebView::handleInputElement(const TKeyEvent& keyevent, TEventCode eventcode, Frame* frame) |
1040 { |
1064 { |
1041 WebCursor* cursor = StaticObjectsContainer::instance()->webCursor(); |
1065 WebCursor* cursor = StaticObjectsContainer::instance()->webCursor(); |
1042 bool sendMousedEvent = false; |
1066 bool sendMousedEvent = false; |
1043 if (m_focusedElementType == TBrCtlDefs::EElementInputBox || |
1067 if (m_focusedElementType == TBrCtlDefs::EElementInputBox || |
1044 m_focusedElementType == TBrCtlDefs::EElementTextAreaBox) { |
1068 m_focusedElementType == TBrCtlDefs::EElementTextAreaBox) { |
1045 sendMousedEvent = true; |
1069 sendMousedEvent = true; |
1046 } |
1070 } |
1047 else if (m_focusedElementType == TBrCtlDefs::EElementSelectBox || |
1071 else if (m_focusedElementType == TBrCtlDefs::EElementSelectBox || |
1048 m_focusedElementType == TBrCtlDefs::EElementSelectMultiBox) { |
1072 m_focusedElementType == TBrCtlDefs::EElementSelectMultiBox) { |
1049 if (m_brctl->settings()->getNavigationType() != SettingsContainer::NavigationTypeNone || |
1073 if (m_brctl->settings()->getNavigationType() != SettingsContainer::NavigationTypeNone || |
1050 keyevent.iCode == EKeyDevice3) { |
1074 keyevent.iCode == EKeyDevice3) { |
1051 sendMousedEvent = true; |
1075 sendMousedEvent = true; |
1052 } |
1076 } |
1053 } |
1077 } |
1054 if (sendMousedEvent) { |
1078 if (sendMousedEvent) { |
1055 sendMouseEventToEngine(TPointerEvent::EButton1Down, cursor->position(), frame); |
1079 sendMouseEventToEngineIfNeeded(TPointerEvent::EButton1Down, cursor->position(), frame); |
1056 sendMouseEventToEngine(TPointerEvent::EButton1Up, cursor->position(), frame); |
1080 sendMouseEventToEngineIfNeeded(TPointerEvent::EButton1Up, cursor->position(), frame); |
1057 |
1081 |
1058 if (m_focusedElementType == TBrCtlDefs::EElementInputBox || |
1082 if (m_focusedElementType == TBrCtlDefs::EElementInputBox || |
1059 m_focusedElementType == TBrCtlDefs::EElementTextAreaBox || |
1083 m_focusedElementType == TBrCtlDefs::EElementTextAreaBox || |
1060 m_focusedElementType == TBrCtlDefs::EElementActivatedInputBox) { |
1084 m_focusedElementType == TBrCtlDefs::EElementActivatedInputBox) { |
1061 if (!m_fepTimer) { |
1085 if (!m_fepTimer) { |
1062 m_fepTimer = new WebCore::Timer<WebView>(this, &WebView::fepTimerFired); |
1086 m_fepTimer = new WebCore::Timer<WebView>(this, &WebView::fepTimerFired); |
1063 } |
1087 } |
1064 |
1088 |
1086 } |
1110 } |
1087 |
1111 |
1088 if(!pageView()) { |
1112 if(!pageView()) { |
1089 m_savedPosition = mainFrame()->frameView()->contentPos(); |
1113 m_savedPosition = mainFrame()->frameView()->contentPos(); |
1090 } |
1114 } |
1091 |
1115 // simple scrolling if no cursor mode |
1092 cursor->scrollAndMoveCursor(keyevent.iCode, m_scrollingSpeed, fastscroll); |
1116 if (m_brctl->settings()->getNavigationType() != SettingsContainer::NavigationTypeTabbed && |
|
1117 (m_brctl->settings()->brctlSetting(TBrCtlDefs::ESettingsCursorShowMode) == TBrCtlDefs::ENoCursor)){ |
|
1118 setFocusNone(); |
|
1119 cursor->simpleScroll(keyevent.iCode, m_scrollingSpeed); |
|
1120 } |
|
1121 else{ |
|
1122 cursor->scrollAndMoveCursor(keyevent.iCode, m_scrollingSpeed, fastscroll); |
|
1123 } |
1093 updateScrollbars(); |
1124 updateScrollbars(); |
1094 if (!fastscroll) { |
1125 if (!fastscroll) { |
1095 m_fastScrollTimer->Start(KCursorInitialDelay,KCursorUpdateFrquency,TCallBack(&scrollTimerCb,this)); |
1126 m_fastScrollTimer->Start(KCursorInitialDelay,KCursorUpdateFrquency,TCallBack(&scrollTimerCb,this)); |
1096 m_scrollingStartTime.HomeTime(); |
1127 m_scrollingStartTime.HomeTime(); |
1097 } |
1128 } |
1098 |
1129 |
1099 // and minimap comes on |
1130 // and minimap comes on |
1100 consumed = handleMinimapNavigation(); |
1131 consumed = handleMinimapNavigation(); |
1101 |
1132 |
1102 if (!fastscroll) { |
1133 if (!fastscroll) { |
1103 sendMouseEventToEngine(TPointerEvent::EMove, cursor->position(), frame); |
1134 sendMouseEventToEngineIfNeeded(TPointerEvent::EMove, cursor->position(), frame); |
1104 } |
1135 } |
1105 |
1136 |
1106 consumed = true; |
1137 consumed = true; |
1107 return consumed; |
1138 return consumed; |
1108 } |
1139 } |
1109 |
1140 |
1110 |
1141 |
1111 bool WebView::handleMinimapNavigation() |
1142 bool WebView::handleMinimapNavigation() |
1112 { |
1143 { |
1113 int scrollingTime = millisecondsScrolled(); |
1144 int scrollingTime = millisecondsScrolled(); |
1114 if (!AknLayoutUtils::PenEnabled() && m_pageScalerEnabled && |
1145 if (!AknLayoutUtils::PenEnabled() && m_pageScalerEnabled && |
1115 m_pageScaler && !isSmallPage() && |
1146 m_pageScaler && !isSmallPage() && |
1116 m_brctl->settings()->brctlSetting(TBrCtlDefs::ESettingsPageOverview) && |
1147 m_brctl->settings()->brctlSetting(TBrCtlDefs::ESettingsPageOverview) && |
1117 (scrollingTime > KPanningPageScalerStart || m_pageScaler->Visible())) { |
1148 (scrollingTime > KPanningPageScalerStart || m_pageScaler->Visible())) { |
1118 m_pageScaler->SetVisibleUntil(KScalerVisibilityTime); |
1149 m_pageScaler->SetVisibleUntil(KScalerVisibilityTime); |
1119 } |
1150 } |
1200 TEventCode eventCodeUp = eventcode; |
1231 TEventCode eventCodeUp = eventcode; |
1201 TEventCode eventCodeDown = EEventKeyDown; |
1232 TEventCode eventCodeDown = EEventKeyDown; |
1202 //If we adjusted iCode we have to reset it to 0 after we |
1233 //If we adjusted iCode we have to reset it to 0 after we |
1203 //create PlatformKeyEventSymbian when we send the key event. |
1234 //create PlatformKeyEventSymbian when we send the key event. |
1204 //Otherwise the character will be drawn twice - by fep editor and by |
1235 //Otherwise the character will be drawn twice - by fep editor and by |
1205 //WebEditorClient. These two custom eventcodes serves as indicator that |
1236 //WebEditorClient. These two custom eventcodes serves as indicator that |
1206 //PlatformKeyEventSymbian::m_symbianEvent.iCode nee to be reset to 0. |
1237 //PlatformKeyEventSymbian::m_symbianEvent.iCode nee to be reset to 0. |
1207 if (correctedKeyEvent.iCode != m_currentEventKey.iCode) { |
1238 if (correctedKeyEvent.iCode != m_currentEventKey.iCode) { |
1208 eventCodeDown = (TEventCode)(EEventUser + 1); |
1239 eventCodeDown = (TEventCode)(EEventUser + 1); |
1209 eventCodeUp = (TEventCode)(EEventUser + 2); |
1240 eventCodeUp = (TEventCode)(EEventUser + 2); |
1210 } |
1241 } |
1211 |
1242 |
1212 if ( (keyevent.iScanCode == EStdKeyDevice3) || |
1243 if ( (keyevent.iScanCode == EStdKeyDevice3) || |
1213 (keyevent.iScanCode == EStdKeyEnter) ) { |
1244 (keyevent.iScanCode == EStdKeyEnter) ) { |
1214 // pass it to webcore |
1245 // pass it to webcore |
1215 |
1246 |
1216 if (( m_focusedElementType == TBrCtlDefs::EElementInputBox || |
1247 if (( m_focusedElementType == TBrCtlDefs::EElementInputBox || |
1217 m_focusedElementType == TBrCtlDefs::EElementTextAreaBox) && |
1248 m_focusedElementType == TBrCtlDefs::EElementTextAreaBox) && |
1218 m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeTabbed ) { |
1249 m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeTabbed ) { |
1219 if (!m_prevEditMode) { |
1250 if (!m_prevEditMode) { |
1220 setEditable(true); |
1251 setEditable(true); |
1221 } |
1252 } |
1222 else { |
1253 else { |
1223 m_prevEditMode = false; |
1254 m_prevEditMode = false; |
1224 } |
1255 } |
1225 } |
1256 } |
1226 if (m_brctl->settings()->getNavigationType() != SettingsContainer::NavigationTypeNone) { |
1257 if (m_brctl->settings()->getNavigationType() != SettingsContainer::NavigationTypeNone) { |
1227 if (!sendKeyEventToEngine(correctedKeyEvent, eventcode, frame)) { |
1258 if (!sendKeyEventToEngine(correctedKeyEvent, eventcode, frame)) { |
1228 sendMouseEventToEngine(TPointerEvent::EButton1Up, cursor->position(), frame); |
1259 sendMouseEventToEngineIfNeeded(TPointerEvent::EButton1Up, cursor->position(), frame); |
1229 } |
1260 } |
1230 consumed = true; |
1261 consumed = true; |
1231 } |
1262 } |
1232 } |
1263 } |
1233 |
1264 |
1245 |
1276 |
1246 TUint WebView::correctKeyCode() |
1277 TUint WebView::correctKeyCode() |
1247 { |
1278 { |
1248 TUint code = m_currentEventKey.iCode; |
1279 TUint code = m_currentEventKey.iCode; |
1249 // if fep editor was invoked then it consume TKeyEvent and as |
1280 // if fep editor was invoked then it consume TKeyEvent and as |
1250 // result we have KeyEvent.iCode == 0. So we assume here that |
1281 // result we have KeyEvent.iCode == 0. So we assume here that |
1251 // if element is editable and no iCode in KeyEvent then fep editor |
1282 // 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 |
1283 // already put the right character into the input area and we can get |
1253 // the correct iCode from the last entered char. |
1284 // the correct iCode from the last entered char. |
1254 if (m_isEditable && !m_currentEventKey.iCode && m_webfeptexteditor) { |
1285 if (m_isEditable && !m_currentEventKey.iCode && m_webfeptexteditor) { |
1255 TInt len = m_webfeptexteditor->DocumentLengthForFep(); |
1286 TInt len = m_webfeptexteditor->DocumentLengthForFep(); |
1256 if (len > 0) { |
1287 if (len > 0) { |
1257 TBuf<2> data; |
1288 TBuf<2> data; |
1258 m_webfeptexteditor->GetEditorContentForFep(data, len - 1, 1); |
1289 m_webfeptexteditor->GetEditorContentForFep(data, len - 1, 1); |
1259 if (data.Length() > 0) { |
1290 if (data.Length() > 0) { |
1260 code = data[0]; |
1291 code = data[0]; |
1261 } |
1292 } |
1262 } |
1293 } |
1263 } |
1294 } |
1264 |
1295 |
1265 return code; |
1296 return code; |
1266 } |
1297 } |
1267 |
1298 |
1268 bool WebView::sendKeyEventToEngine(const TKeyEvent& keyevent, |
1299 bool WebView::sendKeyEventToEngine(const TKeyEvent& keyevent, |
1269 TEventCode eventcode, Frame* frame) |
1300 TEventCode eventcode, Frame* frame) |
1270 { |
1301 { |
1271 bool tabbedNavigation = (m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeTabbed); |
1302 bool tabbedNavigation = (m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeTabbed); |
1272 Node* targetNode = frame->document()->focusedNode(); |
1303 Node* targetNode = frame->document()->focusedNode(); |
1273 bool hasOnKeyDown = false; |
1304 if (!m_isEditable) { |
1274 bool hasOnKeyUp = false; |
1305 |
1275 bool hasOnKeyPress = false; |
1306 |
1276 |
1307 |
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); |
1308 frame->document()->setFocusedNode(NULL); |
1290 } |
1309 } |
1291 bool consumed = frame->eventHandler()->keyEvent(PlatformKeyboardEvent(keyevent,eventcode)); |
1310 bool consumed = frame->eventHandler()->keyEvent(PlatformKeyboardEvent(keyevent,eventcode)); |
1292 frame->document()->setFocusedNode(targetNode); |
1311 frame->document()->setFocusedNode(targetNode); |
1293 |
1312 |
1294 if (!consumed && eventcode == EEventKey && |
1313 if (!consumed && eventcode == EEventKey && |
1295 (m_brctl->capabilities() & TBrCtlDefs::ECapabilityAccessKeys)) { |
1314 (m_brctl->capabilities() & TBrCtlDefs::ECapabilityAccessKeys)) { |
1296 TKeyEvent ke = keyevent; |
1315 TKeyEvent ke = keyevent; |
1297 TChar c(ke.iCode); |
1316 TChar c(ke.iCode); |
1298 // Not consumed by WebCore, is alphanumeric and does not have any modifier |
1317 // Not consumed by WebCore, is alphanumeric and does not have any modifier |
1299 if (c.IsAlphaDigit() && |
1318 if (c.IsAlphaDigit() && |
1300 !(ke.iModifiers & (EModifierCtrl | EModifierAlt | EModifierShift))) { |
1319 !(ke.iModifiers & (EModifierCtrl | EModifierAlt | EModifierShift))) { |
1301 ke.iModifiers = EModifierCtrl; |
1320 ke.iModifiers = EModifierCtrl; |
1302 frame->eventHandler()->keyEvent(PlatformKeyboardEvent(ke,EEventKeyDown)); |
1321 frame->eventHandler()->keyEvent(PlatformKeyboardEvent(ke,EEventKeyDown)); |
1303 consumed = true; |
1322 consumed = true; |
1304 } |
1323 } |
2278 { |
2307 { |
2279 int zoomLevel = KZoomLevelDefaultValue; |
2308 int zoomLevel = KZoomLevelDefaultValue; |
2280 |
2309 |
2281 // Double Tap Zooming: it toggles between default, maxiZoomLevel. |
2310 // Double Tap Zooming: it toggles between default, maxiZoomLevel. |
2282 // Depending on the current zoom level: |
2311 // Depending on the current zoom level: |
2283 // A. If the current is already the max, it zooms to the max |
2312 // A. If the current is already the max, it zooms to the max |
2284 // B. If the current is bigger than/equal to the default zoom level zooms to the default, it zooms to the max |
2313 // B. If the current is bigger than/equal to the default zoom level zooms to the default, it zooms to the max |
2285 // C. Otherwise it zooms to the default level first. |
2314 // C. Otherwise it zooms to the default level first. |
2286 // For the mobile pages, such as google.com and cnn.com, minimum zoom level equals |
2315 // For the mobile pages, such as google.com and cnn.com, minimum zoom level equals |
2287 // to the default zoom level. Zooming is only possible between default and maximum |
2316 // to the default zoom level. Zooming is only possible between default and maximum |
2288 // zoom level, double tap only won't reach logic C |
2317 // zoom level, double tap only won't reach logic C |
2289 // |
2318 // |
2290 // For both mobile and non-mobile pages, it creates the same end user double tap |
2319 // For both mobile and non-mobile pages, it creates the same end user double tap |
2291 // experiences |
2320 // experiences |
2292 |
2321 |
2293 if (m_currentZoomLevel == m_maxZoomLevel ) { |
2322 if (m_currentZoomLevel == m_maxZoomLevel ) { |
2294 zoomLevel = KZoomLevelDefaultValue; |
2323 zoomLevel = KZoomLevelDefaultValue; |
2295 } |
2324 } |
2296 else if (m_currentZoomLevel >= KZoomLevelDefaultValue ) { |
2325 else if (m_currentZoomLevel >= KZoomLevelDefaultValue ) { |
2297 zoomLevel = m_maxZoomLevel; |
2326 zoomLevel = m_maxZoomLevel; |
2298 } |
2327 } |
2299 else { |
2328 else { |
2300 zoomLevel = KZoomLevelDefaultValue; |
2329 zoomLevel = KZoomLevelDefaultValue; |
2301 } |
2330 } |
2302 |
2331 |
2303 // move the content |
2332 // move the content |
2304 WebFrameView* view = mainFrame()->frameView(); |
2333 WebFrameView* view = mainFrame()->frameView(); |
2305 if (!view) return; |
2334 if (!view) return; |
2306 WebCursor* cursor = StaticObjectsContainer::instance()->webCursor(); |
2335 WebCursor* cursor = StaticObjectsContainer::instance()->webCursor(); |