changeset 15 | 60c5402cb945 |
parent 11 | c8a366e56285 |
child 25 | 0ed94ceaa377 |
11:c8a366e56285 | 15:60c5402cb945 |
---|---|
141 return kit(forward |
141 return kit(forward |
142 ? coreFrame->tree()->traverseNextWithWrap(wrapFlag) |
142 ? coreFrame->tree()->traverseNextWithWrap(wrapFlag) |
143 : coreFrame->tree()->traversePreviousWithWrap(wrapFlag)); |
143 : coreFrame->tree()->traversePreviousWithWrap(wrapFlag)); |
144 } |
144 } |
145 |
145 |
146 |
146 #define IS_UP_KEY(keyevent) ((keyevent.iCode == EKeyUpArrow) || (keyevent.iCode == EStdKeyUpArrow)) |
147 #define IS_DOWN_KEY(keyevent) ((keyevent.iCode == EStdKeyDevice12) || (keyevent.iCode == EKeyDownArrow) || (keyevent.iCode == EStdKeyDownArrow)) |
|
148 #define IS_RIGHT_KEY(keyevent) ((keyevent.iCode == EStdKeyDevice11) || (keyevent.iCode == EKeyRightArrow) || (keyevent.iCode == EStdKeyRightArrow)) |
|
149 #define IS_LEFT_KEY(keyevent) ((keyevent.iCode == EStdKeyDevice13) || (keyevent.iCode == EKeyLeftArrow) || (keyevent.iCode == EStdKeyLeftArrow)) |
|
147 |
150 |
148 // ----------------------------------------------------------------------------- |
151 // ----------------------------------------------------------------------------- |
149 // WebView::NewL |
152 // WebView::NewL |
150 // Public Class Method |
153 // Public Class Method |
151 // Two-phased constructor. |
154 // Two-phased constructor. |
194 , m_viewIsScrolling(false) |
197 , m_viewIsScrolling(false) |
195 , m_ptrbuffer(0) |
198 , m_ptrbuffer(0) |
196 , m_showCursor(false) |
199 , m_showCursor(false) |
197 , m_allowRepaints(true) |
200 , m_allowRepaints(true) |
198 , m_prevEditMode(false) |
201 , m_prevEditMode(false) |
202 , m_firedEvent(0) |
|
199 { |
203 { |
200 } |
204 } |
201 |
205 |
202 WebView::~WebView() |
206 WebView::~WebView() |
203 { |
207 { |
208 StaticObjectsContainer::instance()->webCursor()->stopTransparencyTimer(); |
|
209 |
|
204 // the zoom handler is a client of WebView (also owned by |
210 // the zoom handler is a client of WebView (also owned by |
205 // WebView--a circular dependency) so it must be deleted before |
211 // WebView--a circular dependency) so it must be deleted before |
206 // the WebView object is destroyed because in its destructor it |
212 // the WebView object is destroyed because in its destructor it |
207 // operates on the WebView object |
213 // operates on the WebView object |
208 delete m_pageZoomHandler; |
214 delete m_pageZoomHandler; |
780 } |
786 } |
781 else { |
787 else { |
782 m_focusedElementType = TBrCtlDefs::EElementNone; |
788 m_focusedElementType = TBrCtlDefs::EElementNone; |
783 } |
789 } |
784 m_brctl->updateDefaultSoftkeys(); |
790 m_brctl->updateDefaultSoftkeys(); |
791 page()->chrome()->client()->setElementVisibilityChanged(false); |
|
785 } |
792 } |
786 |
793 |
787 void WebView::updatePageScaler() |
794 void WebView::updatePageScaler() |
788 { |
795 { |
789 if (m_brctl->capabilities() & TBrCtlDefs::ECapabilityGraphicalPage) { |
796 if (m_brctl->capabilities() & TBrCtlDefs::ECapabilityGraphicalPage) { |
896 { |
903 { |
897 TPointerEvent event; |
904 TPointerEvent event; |
898 event.iPosition = pos; |
905 event.iPosition = pos; |
899 event.iModifiers = 0; |
906 event.iModifiers = 0; |
900 event.iType = eventType; |
907 event.iType = eventType; |
901 |
908 |
909 setMouseEventFired(); |
|
902 switch (eventType) { |
910 switch (eventType) { |
903 case TPointerEvent::EButton1Down: |
911 case TPointerEvent::EButton1Down: |
904 { |
912 { |
905 frame->eventHandler()->handleMousePressEvent(PlatformMouseEvent(event)); |
913 frame->eventHandler()->handleMousePressEvent(PlatformMouseEvent(event)); |
906 break; |
914 break; |
916 { |
924 { |
917 frame->eventHandler()->handleMouseMoveEvent(PlatformMouseEvent(event)); |
925 frame->eventHandler()->handleMouseMoveEvent(PlatformMouseEvent(event)); |
918 break; |
926 break; |
919 } |
927 } |
920 }; |
928 }; |
929 clearMouseEventFired(); |
|
921 } |
930 } |
922 |
931 |
923 |
932 |
924 void WebView::setFocusedNode(Frame* frame) |
933 void WebView::setFocusedNode(Frame* frame) |
925 { |
934 { |
929 page()->focusController()->setFocusedNode(n, frame); |
938 page()->focusController()->setFocusedNode(n, frame); |
930 } |
939 } |
931 } |
940 } |
932 } |
941 } |
933 |
942 |
934 bool WebView::needDeactivateEditable(const TKeyEvent& keyevent, TEventCode eventcode, Frame* frame) |
943 bool WebView::needDeactivateEditable(const TKeyEvent& keyevent, TEventCode eventcode, Frame* frame, bool consumed) |
935 { |
944 { |
936 bool upOrDown = ((keyevent.iCode == EKeyUpArrow) || |
945 /* |
937 (keyevent.iCode == EStdKeyUpArrow) || |
946 * Here we are making an assumption that if element visibility has been changed |
938 (keyevent.iCode == EKeyRightUpArrow) || |
947 * than JavaScript used the key event. If this the the case or consumed is tru and |
939 (keyevent.iCode == EKeyDownArrow) || |
948 * keys are Up or Down we don't want to deactivate an editable element. |
940 (keyevent.iCode == EStdKeyDownArrow) || |
949 * Google suggest is examples if such case. |
941 (keyevent.iCode == EKeyLeftDownArrow)); |
950 */ |
942 bool shouldEndEditing = frame->editor()->client()->shouldEndEditing(NULL); |
951 bool upOrDownConsumed = (consumed || //JavaScript consumed event or |
943 bool inEditState = (m_isEditable && (m_focusedElementType == TBrCtlDefs::EElementActivatedInputBox)); |
952 (m_focusedElementType == TBrCtlDefs::EElementActivatedInputBox && // style of input box |
944 bool isSelectBoxActive = (m_focusedElementType == TBrCtlDefs::EElementSelectBox); |
953 page()->chrome()->client()->elementVisibilityChanged())) && // changed |
945 bool deactivateInputBox = (inEditState && upOrDown && m_webfeptexteditor->validateTextFormat()); |
954 (IS_UP_KEY(keyevent) || IS_DOWN_KEY(keyevent)); |
946 bool deactivateSelectBox = (isSelectBoxActive && isNaviKey(keyevent)); |
955 bool shouldEndEditing = frame->editor()->client()->shouldEndEditing(NULL) && !upOrDownConsumed; |
947 |
|
948 bool deactivateEditable = (m_isEditable && shouldEndEditing && m_webfeptexteditor->validateTextFormat()); |
956 bool deactivateEditable = (m_isEditable && shouldEndEditing && m_webfeptexteditor->validateTextFormat()); |
949 return deactivateEditable || deactivateSelectBox; |
957 return deactivateEditable; |
950 } |
958 } |
951 |
959 |
952 |
960 |
953 bool WebView::deactivateEditable() |
961 bool WebView::deactivateEditable() |
954 { |
962 { |
979 if (oldKeyCode == EEventKeyDown) { |
987 if (oldKeyCode == EEventKeyDown) { |
980 consumed = sendKeyEventToEngine(keyevent, EEventKeyDown, frame); |
988 consumed = sendKeyEventToEngine(keyevent, EEventKeyDown, frame); |
981 } |
989 } |
982 } |
990 } |
983 else { |
991 else { |
984 if (keyevent.iCode == EKeyDevice3) { //selection key (MSK) |
992 if (keyevent.iCode == EKeyDevice3) { // selection key (MSK) |
985 // mimic ccb's behavior of onFocus |
|
986 consumed = handleMSK(keyevent, oldKeyCode, frame); |
993 consumed = handleMSK(keyevent, oldKeyCode, frame); |
987 |
|
988 // Toolbar is activated on long key press only if the element |
|
989 // type is EElementNone during EEventKeyDown and EEventKey. |
|
990 // This prevents toolbar from popping up in DHTML pages. Also, |
|
991 // toolbar is activated when the user is not in fast scroll |
|
992 // mode, or in page overview mode, or on wml page. |
|
993 } |
994 } |
994 else if (isNaviKey(keyevent)) { |
995 else if (isNaviKey(keyevent)) { |
995 consumed = handleNaviKeyEvent(keyevent, oldKeyCode, frame); |
996 consumed = handleNaviKeyEvent(keyevent, oldKeyCode, frame); |
996 } // if (m_brctl->settings()->getNavigationType() |
997 } |
997 else { // Not an arrow key.. |
998 else { // Not an arrow key.. |
998 // activate hovered input element by just start typing |
999 // activate hovered input element by just start typing |
999 consumed = !m_isEditable && handleInputElement(keyevent, eventcode, frame); |
1000 consumed = !m_isEditable && handleInputElement(keyevent, eventcode, frame); |
1000 } |
1001 } |
1001 if (!consumed && !(tabbedNavigation && isNaviKey(keyevent))) { |
1002 if (!consumed && !(tabbedNavigation && isNaviKey(keyevent))) { |
1003 } |
1004 } |
1004 } |
1005 } |
1005 return consumed; |
1006 return consumed; |
1006 } |
1007 } |
1007 |
1008 |
1009 |
|
1008 bool WebView::handleMSK(const TKeyEvent& keyevent, TEventCode eventcode, Frame* frame) |
1010 bool WebView::handleMSK(const TKeyEvent& keyevent, TEventCode eventcode, Frame* frame) |
1009 { |
1011 { |
1010 WebCursor* cursor = StaticObjectsContainer::instance()->webCursor(); |
1012 WebCursor* cursor = StaticObjectsContainer::instance()->webCursor(); |
1011 bool prevEditableState = m_isEditable; |
1013 bool prevEditableState = m_isEditable; |
1012 if (m_focusedElementType != TBrCtlDefs::EElementActivatedInputBox ) { |
1014 bool tabbedNavigation = (m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeTabbed); |
1013 sendMouseEventToEngineIfNeeded(TPointerEvent::EButton1Down, |
1015 Node* focusedNode = frame->document()->focusedNode(); |
1014 cursor->position(), frame); |
1016 bool multiSelectInTabbed = (m_focusedElementType == TBrCtlDefs::EElementSelectMultiBox) && // multiselect element |
1015 } |
1017 tabbedNavigation; // in tabbed mode. |
1016 setFocusedNode(frame); |
1018 /* |
1019 * Avoiding resetting cursor position to top left corner of Select Box |
|
1020 * See comment in handleInputElement |
|
1021 */ |
|
1022 if (!multiSelectInTabbed) { |
|
1023 setFocusNone(); |
|
1024 } |
|
1025 |
|
1026 sendMouseEventToEngineIfNeeded(TPointerEvent::EButton1Down, |
|
1027 cursor->position(), frame); |
|
1028 if (!tabbedNavigation) { |
|
1029 setFocusedNode(frame); //TODO: Do we need it here? |
|
1030 } |
|
1031 else { |
|
1032 /* |
|
1033 * Restore focused by tabbed navigation node since mouse event |
|
1034 * handler might set it to NULL. |
|
1035 */ |
|
1036 page()->focusController()->setFocusedNode(focusedNode, frame); |
|
1037 } |
|
1038 |
|
1039 /* |
|
1040 * MSK key event on editable will be interpreted as Enter. |
|
1041 * We don't want to send Enter key in case of activated |
|
1042 * input box. Also if the text area has been just activated |
|
1043 * we also don't want to send Enter since it will cause extra |
|
1044 * line feed. |
|
1045 */ |
|
1017 bool textAreaJustActivated = (!prevEditableState && m_isEditable && |
1046 bool textAreaJustActivated = (!prevEditableState && m_isEditable && |
1018 m_focusedElementType == TBrCtlDefs::EElementTextAreaBox); |
1047 m_focusedElementType == TBrCtlDefs::EElementTextAreaBox); |
1048 |
|
1019 if (eventcode == EEventKeyDown && |
1049 if (eventcode == EEventKeyDown && |
1020 m_focusedElementType != TBrCtlDefs::EElementActivatedInputBox && |
1050 m_focusedElementType != TBrCtlDefs::EElementActivatedInputBox && |
1021 !textAreaJustActivated) { |
1051 !textAreaJustActivated) { |
1052 |
|
1022 sendKeyEventToEngine(keyevent, EEventKeyDown, frame); |
1053 sendKeyEventToEngine(keyevent, EEventKeyDown, frame); |
1023 } |
1054 } |
1055 |
|
1056 /* |
|
1057 * Toolbar is activated on long key press only if the element |
|
1058 * type is EElementNone during EEventKeyDown and EEventKey. |
|
1059 * This prevents toolbar from popping up in DHTML pages. Also, |
|
1060 * toolbar is activated when the user is not in fast scroll |
|
1061 * mode, or in page overview mode, or on wml page. |
|
1062 */ |
|
1024 if ((m_focusedElementType == TBrCtlDefs::EElementNone || |
1063 if ((m_focusedElementType == TBrCtlDefs::EElementNone || |
1025 m_focusedElementType == TBrCtlDefs::EElementBrokenImage ) && |
1064 m_focusedElementType == TBrCtlDefs::EElementBrokenImage ) && |
1026 keyevent.iRepeats && !m_brctl->wmlMode() ) { |
1065 keyevent.iRepeats && !m_brctl->wmlMode() ) { |
1027 launchToolBarL(); |
1066 launchToolBarL(); |
1028 } |
1067 } |
1068 |
|
1029 return true; |
1069 return true; |
1030 } |
1070 } |
1031 bool WebView::handleNaviKeyEvent(const TKeyEvent& keyevent, TEventCode eventcode, Frame* frame) |
1071 |
1072 bool WebView::handleNaviKeyEvent(const TKeyEvent& keyevent, TEventCode eventcode, Frame* frame) |
|
1032 { |
1073 { |
1033 bool downEventConsumed = false; |
1074 bool downEventConsumed = false; |
1034 bool consumed = false; |
1075 bool consumed = false; |
1035 bool tabbedNavigation = (m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeTabbed); |
1076 bool tabbedNavigation = (m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeTabbed); |
1036 /* |
1077 /* |
1037 * For each platform keyDown event EventHandler::keEvent() generates |
1078 * For each platform keyDown event EventHandler::keEvent() generates |
1038 * keydown and keypress. |
1079 * keydown and keypress. |
1039 * For keypress event we need a char code and since we don't |
1080 * For keypress event we need a char code and since we don't |
1040 * have it at the time of EEventKeyDown we pospond it until EEventKey |
1081 * have it at the time of EEventKeyDown we pospond it until EEventKey |
1041 * and send it here. |
1082 * and send it here. |
1042 */ |
1083 */ |
1043 if (eventcode == EEventKeyDown){ |
1084 if (eventcode == EEventKeyDown){ |
1044 downEventConsumed = sendKeyEventToEngine(keyevent, EEventKeyDown, frame); |
1085 downEventConsumed = sendKeyEventToEngine(keyevent, EEventKeyDown, frame); |
1045 } |
1086 } |
1046 |
1087 /* |
1047 if (!downEventConsumed && needDeactivateEditable(keyevent, eventcode, frame)) { |
1088 * downEventConsumed will be true if JavaScript consumes key event |
1089 * If we are not in the widget mode we want to deactivate input box |
|
1090 * regardless of whether event was consumed by JavaScript or not. |
|
1091 * Othrerwise we have a risk to be trapped inside input box. |
|
1092 */ |
|
1093 bool widgetDownEventConsumed = downEventConsumed && (m_widgetextension != NULL); |
|
1094 |
|
1095 if (!widgetDownEventConsumed && needDeactivateEditable(keyevent, eventcode, frame, downEventConsumed)) { |
|
1048 deactivateEditable(); |
1096 deactivateEditable(); |
1049 } |
1097 } |
1050 |
1098 |
1051 if (tabbedNavigation) { |
1099 if (tabbedNavigation) { |
1052 consumed = downEventConsumed || handleTabbedNavigation(m_currentEventKey, m_currentEventCode); |
1100 consumed = downEventConsumed || handleTabbedNavigation(m_currentEventKey, m_currentEventCode); |
1053 } |
1101 } |
1054 else { |
1102 else { |
1055 consumed = (!m_isEditable && //avoid showing the cursor when we are in the input box |
1103 consumed = (!m_isEditable && //avoid showing the cursor when we are in the input box |
1056 handleKeyNavigation(keyevent, eventcode, frame)) || |
1104 handleKeyNavigation(keyevent, eventcode, frame)) || |
1057 downEventConsumed; |
1105 downEventConsumed; |
1058 } |
1106 } |
1059 return consumed; |
1107 return consumed; |
1060 } |
1108 } |
1061 |
1109 |
1062 |
|
1063 bool WebView::handleInputElement(const TKeyEvent& keyevent, TEventCode eventcode, Frame* frame) |
1110 bool WebView::handleInputElement(const TKeyEvent& keyevent, TEventCode eventcode, Frame* frame) |
1064 { |
1111 { |
1065 WebCursor* cursor = StaticObjectsContainer::instance()->webCursor(); |
1112 WebCursor* cursor = StaticObjectsContainer::instance()->webCursor(); |
1113 TBrCtlDefs::TBrCtlElementType elTypeBeforeMouseEvent = m_focusedElementType; |
|
1114 bool tabbedNavigation = (m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeTabbed); |
|
1115 bool navigationNone = (m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeNone); |
|
1116 bool prevEditableState = m_isEditable; |
|
1117 bool enterOnMultiSelectInTabbed = tabbedNavigation && (keyevent.iCode == EKeyEnter) && // EnterKey in case of |
|
1118 (m_focusedElementType == TBrCtlDefs::EElementSelectMultiBox); // multiselect eelement in tabbed mode. |
|
1119 |
|
1120 |
|
1066 bool sendMousedEvent = false; |
1121 bool sendMousedEvent = false; |
1067 if (m_focusedElementType == TBrCtlDefs::EElementInputBox || |
1122 if (m_focusedElementType == TBrCtlDefs::EElementInputBox || |
1068 m_focusedElementType == TBrCtlDefs::EElementTextAreaBox) { |
1123 m_focusedElementType == TBrCtlDefs::EElementTextAreaBox || |
1124 (tabbedNavigation && |
|
1125 (m_focusedElementType == TBrCtlDefs::EElementActivatedInputBox))) { |
|
1069 sendMousedEvent = true; |
1126 sendMousedEvent = true; |
1070 } |
1127 } |
1071 else if (m_focusedElementType == TBrCtlDefs::EElementSelectBox || |
1128 else if (m_focusedElementType == TBrCtlDefs::EElementSelectBox || |
1072 m_focusedElementType == TBrCtlDefs::EElementSelectMultiBox) { |
1129 m_focusedElementType == TBrCtlDefs::EElementSelectMultiBox) { |
1073 if (m_brctl->settings()->getNavigationType() != SettingsContainer::NavigationTypeNone || |
1130 if (!navigationNone || keyevent.iCode == EKeyDevice3) { |
1074 keyevent.iCode == EKeyDevice3) { |
|
1075 sendMousedEvent = true; |
1131 sendMousedEvent = true; |
1076 } |
1132 } |
1077 } |
1133 } |
1134 |
|
1135 if (m_focusedElementType == TBrCtlDefs::EElementTextAreaBox || |
|
1136 m_focusedElementType == TBrCtlDefs::EElementInputBox || |
|
1137 m_focusedElementType == TBrCtlDefs::EElementActivatedInputBox) { |
|
1138 page()->chrome()->client()->setElementVisibilityChanged(false); |
|
1139 } |
|
1140 |
|
1078 if (sendMousedEvent) { |
1141 if (sendMousedEvent) { |
1142 /* |
|
1143 * Sending mouse event to WebCore will trigger FocusController->setFocusedNode() to be called. |
|
1144 * It will do anything only if focused node has been changed. Among other thing it will |
|
1145 * trigger the setEditable() call, which we need. The exception is the case when |
|
1146 * we have tabbed navigation and EnterKey was hit in MultiSelect Box. |
|
1147 * In this case we just want to select item in the select element. |
|
1148 * HTMLSelectElement::listBoxDefaultEventHandler() will call focus() which will |
|
1149 * set the focused node, which is already set anyway, but this will cause the |
|
1150 * reseting cursor position to the top left corner of the select box. |
|
1151 * To avoid thos we put the check here before we reset the foocusedNode. |
|
1152 */ |
|
1153 if (!enterOnMultiSelectInTabbed) { |
|
1154 frame->document()->setFocusedNode(NULL); |
|
1155 } |
|
1156 |
|
1157 /* |
|
1158 * Tweek the m_isEditable flag, so setEditable will do something |
|
1159 * usefull when it's called from FocusController->setFocusedNode() |
|
1160 */ |
|
1161 if (m_isEditable && tabbedNavigation) { |
|
1162 m_isEditable = false; |
|
1163 } |
|
1164 |
|
1079 sendMouseEventToEngineIfNeeded(TPointerEvent::EButton1Down, cursor->position(), frame); |
1165 sendMouseEventToEngineIfNeeded(TPointerEvent::EButton1Down, cursor->position(), frame); |
1080 sendMouseEventToEngineIfNeeded(TPointerEvent::EButton1Up, cursor->position(), frame); |
1166 sendMouseEventToEngineIfNeeded(TPointerEvent::EButton1Up, cursor->position(), frame); |
1081 |
1167 |
1082 if (m_focusedElementType == TBrCtlDefs::EElementInputBox || |
1168 /* |
1083 m_focusedElementType == TBrCtlDefs::EElementTextAreaBox || |
1169 * If enter key was pressed to activate an input box we don't want to |
1084 m_focusedElementType == TBrCtlDefs::EElementActivatedInputBox) { |
1170 * send it to WebCore since it may cause immediate form submission. |
1171 * Same for MultiSelect Box in tabbed mode. |
|
1172 */ |
|
1173 bool inputBoxJustActivated = (!prevEditableState && m_isEditable && |
|
1174 (m_focusedElementType == TBrCtlDefs::EElementActivatedInputBox|| |
|
1175 m_focusedElementType == TBrCtlDefs::EElementTextAreaBox)); |
|
1176 bool inputBoxJustActivatedByEnter = inputBoxJustActivated && (keyevent.iCode == EKeyEnter); |
|
1177 if (!inputBoxJustActivatedByEnter && |
|
1178 !enterOnMultiSelectInTabbed && |
|
1179 (m_focusedElementType == TBrCtlDefs::EElementInputBox || |
|
1180 m_focusedElementType == TBrCtlDefs::EElementTextAreaBox || |
|
1181 m_focusedElementType == TBrCtlDefs::EElementActivatedInputBox)) { |
|
1182 |
|
1085 if (!m_fepTimer) { |
1183 if (!m_fepTimer) { |
1086 m_fepTimer = new WebCore::Timer<WebView>(this, &WebView::fepTimerFired); |
1184 m_fepTimer = new WebCore::Timer<WebView>(this, &WebView::fepTimerFired); |
1087 } |
1185 } |
1088 |
1186 |
1089 m_fepTimer->startOneShot(0.2f); |
1187 m_fepTimer->startOneShot(0.2f); |
1090 setEditable(true); |
1188 if (!m_isEditable) { |
1091 } |
1189 setEditable(true); |
1190 } |
|
1191 } |
|
1192 |
|
1092 m_keyevent = keyevent; |
1193 m_keyevent = keyevent; |
1093 m_eventcode = eventcode; |
1194 m_eventcode = eventcode; |
1094 return true; |
1195 return true; |
1095 } |
1196 } |
1096 return false; // not input element |
1197 return false; // not input element |
1120 } |
1221 } |
1121 else{ |
1222 else{ |
1122 cursor->scrollAndMoveCursor(keyevent.iCode, m_scrollingSpeed, fastscroll); |
1223 cursor->scrollAndMoveCursor(keyevent.iCode, m_scrollingSpeed, fastscroll); |
1123 } |
1224 } |
1124 updateScrollbars(); |
1225 updateScrollbars(); |
1226 /* |
|
1227 * In order to Enter key activate a link the link node has to be focused. |
|
1228 * When WebCursor is finding next node to snap it stores it, so here we can |
|
1229 * set it to focused. |
|
1230 */ |
|
1231 if (m_brctl->settings()->brctlSetting(TBrCtlDefs::ESettingsEnterKeyMode) == |
|
1232 TBrCtlDefs::EEnterKeyCanActivateLink) { |
|
1233 setFocusedNodeUnderCursor(frame); |
|
1234 } |
|
1235 |
|
1125 if (!fastscroll) { |
1236 if (!fastscroll) { |
1126 m_fastScrollTimer->Start(KCursorInitialDelay,KCursorUpdateFrquency,TCallBack(&scrollTimerCb,this)); |
1237 m_fastScrollTimer->Start(KCursorInitialDelay,KCursorUpdateFrquency,TCallBack(&scrollTimerCb,this)); |
1127 m_scrollingStartTime.HomeTime(); |
1238 m_scrollingStartTime.HomeTime(); |
1128 } |
1239 } |
1129 |
1240 |
1136 |
1247 |
1137 consumed = true; |
1248 consumed = true; |
1138 return consumed; |
1249 return consumed; |
1139 } |
1250 } |
1140 |
1251 |
1252 void WebView::setFocusedNodeUnderCursor(Frame* frame) |
|
1253 { |
|
1254 WebCursor* cursor = StaticObjectsContainer::instance()->webCursor(); |
|
1255 // focus the node we snapped to |
|
1256 if (m_focusedElementType != TBrCtlDefs::EElementNone) { |
|
1257 frame->document()->setFocusedNode(cursor->getElementUnderCursor()); |
|
1258 } |
|
1259 // or reset if there is none |
|
1260 else if (frame->document()->focusedNode() != NULL) { |
|
1261 frame->document()->setFocusedNode(NULL); |
|
1262 } |
|
1263 } |
|
1141 |
1264 |
1142 bool WebView::handleMinimapNavigation() |
1265 bool WebView::handleMinimapNavigation() |
1143 { |
1266 { |
1144 int scrollingTime = millisecondsScrolled(); |
1267 int scrollingTime = millisecondsScrolled(); |
1145 if (!AknLayoutUtils::PenEnabled() && m_pageScalerEnabled && |
1268 if (!AknLayoutUtils::PenEnabled() && m_pageScalerEnabled && |
1253 else { |
1376 else { |
1254 m_prevEditMode = false; |
1377 m_prevEditMode = false; |
1255 } |
1378 } |
1256 } |
1379 } |
1257 if (m_brctl->settings()->getNavigationType() != SettingsContainer::NavigationTypeNone) { |
1380 if (m_brctl->settings()->getNavigationType() != SettingsContainer::NavigationTypeNone) { |
1258 if (!sendKeyEventToEngine(correctedKeyEvent, eventcode, frame)) { |
1381 if (!sendKeyEventToEngine(correctedKeyEvent, eventcode, frame)) { |
1259 sendMouseEventToEngineIfNeeded(TPointerEvent::EButton1Up, cursor->position(), frame); |
1382 if (keyevent.iScanCode == EStdKeyDevice3) { //MSK |
1383 sendMouseEventToEngineIfNeeded(TPointerEvent::EButton1Up, cursor->position(), frame); |
|
1384 } |
|
1260 } |
1385 } |
1261 consumed = true; |
1386 consumed = true; |
1262 } |
1387 } |
1263 } |
1388 } |
1264 |
1389 |
1299 bool WebView::sendKeyEventToEngine(const TKeyEvent& keyevent, |
1424 bool WebView::sendKeyEventToEngine(const TKeyEvent& keyevent, |
1300 TEventCode eventcode, Frame* frame) |
1425 TEventCode eventcode, Frame* frame) |
1301 { |
1426 { |
1302 bool tabbedNavigation = (m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeTabbed); |
1427 bool tabbedNavigation = (m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeTabbed); |
1303 Node* targetNode = frame->document()->focusedNode(); |
1428 Node* targetNode = frame->document()->focusedNode(); |
1304 if (!m_isEditable) { |
1429 /* |
1305 |
1430 * we dont want to send key event for navi key to the elements |
1306 |
1431 * like select element since it has default key event handling, |
1307 |
1432 * which will prevent user to leave the element. |
1433 */ |
|
1434 if (!m_isEditable && isNaviKey(keyevent)) { |
|
1308 frame->document()->setFocusedNode(NULL); |
1435 frame->document()->setFocusedNode(NULL); |
1309 } |
1436 } |
1310 bool consumed = frame->eventHandler()->keyEvent(PlatformKeyboardEvent(keyevent,eventcode)); |
1437 bool consumed = frame->eventHandler()->keyEvent(PlatformKeyboardEvent(keyevent,eventcode)); |
1311 frame->document()->setFocusedNode(targetNode); |
1438 frame->document()->setFocusedNode(targetNode); |
1312 |
1439 |