18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright 2007, The Android Open Source Project
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  * Redistributions of source code must retain the above copyright
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  * Redistributions in binary form must reproduce the above copyright
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    documentation and/or other materials provided with the distribution.
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
163298a7d84b96ade73c6b170671711a8f2792ae59Steve Block * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
253298a7d84b96ade73c6b170671711a8f2792ae59Steve Block
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define LOG_TAG "WebCore"
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Editor.h"
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "EditorClientAndroid.h"
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Event.h"
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "EventNames.h"
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FocusController.h"
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Frame.h"
35d0fc68897b5a7379951aaa5d50f0802dbe9e00d4Ben Murdoch#include "HTMLNames.h"
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "KeyboardEvent.h"
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "NotImplemented.h"
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PlatformKeyboardEvent.h"
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PlatformString.h"
4044206d7109052a5a98a832db4a9b960cf859dee9Leon Scroggins#include "WebViewCore.h"
41330bb52cdd4c0c38e2918b3da78420992dc09d55Steve Block#include "WindowsKeyboardCodes.h"
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
43d0fc68897b5a7379951aaa5d50f0802dbe9e00d4Ben Murdochusing namespace WebCore::HTMLNames;
44d0fc68897b5a7379951aaa5d50f0802dbe9e00d4Ben Murdoch
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace android {
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientAndroid::pageDestroyed() {
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    delete this;
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientAndroid::shouldDeleteRange(Range*) { return true; }
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientAndroid::shouldShowDeleteInterface(HTMLElement*) { notImplemented(); return false; }
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientAndroid::smartInsertDeleteEnabled() { notImplemented(); return false; }
54635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectbool EditorClientAndroid::isSelectTrailingWhitespaceEnabled(){ notImplemented(); return false; }
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientAndroid::isContinuousSpellCheckingEnabled() { notImplemented(); return false; }
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientAndroid::toggleContinuousSpellChecking() { notImplemented(); }
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientAndroid::isGrammarCheckingEnabled() { notImplemented(); return false; }
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientAndroid::toggleGrammarChecking() { notImplemented(); }
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint EditorClientAndroid::spellCheckerDocumentTag() { notImplemented(); return -1; }
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientAndroid::isEditable() { /* notImplemented(); */ return false; }
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Following Qt's implementation. For shouldBeginEditing and shouldEndEditing.
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Returning true for these fixes issue http://b/issue?id=735185
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientAndroid::shouldBeginEditing(Range*)
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientAndroid::shouldEndEditing(Range*)
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientAndroid::shouldInsertNode(Node*, Range*, EditorInsertAction) { notImplemented(); return true; }
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientAndroid::shouldInsertText(const String&, Range*, EditorInsertAction) { return true; }
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientAndroid::shouldApplyStyle(CSSStyleDeclaration*, Range*) { notImplemented(); return true; }
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientAndroid::didBeginEditing() { notImplemented(); }
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This function is called so that the platform can handle changes to content. It is called
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// after the contents have been edited or unedited (ie undo)
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientAndroid::respondToChangedContents() { notImplemented(); }
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientAndroid::didEndEditing() { notImplemented(); }
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientAndroid::didWriteSelectionToPasteboard() { notImplemented(); }
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientAndroid::didSetSelectionTypesForPasteboard() { notImplemented(); }
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Copied from the Window's port of WebKit.
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const unsigned AltKey = 1 << 0;
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const unsigned ShiftKey = 1 << 1;
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstruct KeyDownEntry {
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned virtualKey;
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned modifiers;
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const char* name;
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstruct KeyPressEntry {
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned charCode;
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned modifiers;
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const char* name;
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const KeyDownEntry keyDownEntries[] = {
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { VK_LEFT,   0,                  "MoveLeft"                                    },
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { VK_LEFT,   ShiftKey,           "MoveLeftAndModifySelection"                  },
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { VK_LEFT,   AltKey,             "MoveWordLeft"                                },
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { VK_LEFT,   AltKey | ShiftKey,  "MoveWordLeftAndModifySelection"              },
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { VK_RIGHT,  0,                  "MoveRight"                                   },
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { VK_RIGHT,  ShiftKey,           "MoveRightAndModifySelection"                 },
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { VK_RIGHT,  AltKey,             "MoveWordRight"                               },
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { VK_RIGHT,  AltKey | ShiftKey,  "MoveWordRightAndModifySelection"             },
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { VK_UP,     0,                  "MoveUp"                                      },
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { VK_UP,     ShiftKey,           "MoveUpAndModifySelection"                    },
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { VK_DOWN,   0,                  "MoveDown"                                    },
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { VK_DOWN,   ShiftKey,           "MoveDownAndModifySelection"                  },
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { VK_BACK,   0,                  "BackwardDelete"                              },
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { VK_BACK,   ShiftKey,           "ForwardDelete"                               },
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { VK_BACK,   AltKey,             "DeleteWordBackward"                          },
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { VK_BACK,   AltKey | ShiftKey,  "DeleteWordForward"                           },
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { VK_ESCAPE, 0,                  "Cancel"                                      },
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { VK_TAB,    0,                  "InsertTab"                                   },
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { VK_TAB,    ShiftKey,           "InsertBacktab"                               },
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { VK_RETURN, 0,                  "InsertNewline"                               },
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { VK_RETURN, AltKey,             "InsertNewline"                               },
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { VK_RETURN, AltKey | ShiftKey,  "InsertNewline"                               }
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const KeyPressEntry keyPressEntries[] = {
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { '\t', 0,                  "InsertTab"     },
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { '\t', ShiftKey,           "InsertBackTab" },
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { '\r', 0,                  "InsertNewline" },
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { '\r', AltKey,             "InsertNewline" },
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { '\r', AltKey | ShiftKey,  "InsertNewline" }
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const char* interpretKeyEvent(const KeyboardEvent* evt)
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const PlatformKeyboardEvent* keyEvent = evt->keyEvent();
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static HashMap<int, const char*>* keyDownCommandsMap = 0;
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static HashMap<int, const char*>* keyPressCommandsMap = 0;
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!keyDownCommandsMap) {
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        keyDownCommandsMap = new HashMap<int, const char*>;
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        keyPressCommandsMap = new HashMap<int, const char*>;
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (unsigned i = 0; i < sizeof(keyDownEntries)/sizeof(KeyDownEntry); i++)
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            keyDownCommandsMap->set(keyDownEntries[i].modifiers << 16 | keyDownEntries[i].virtualKey, keyDownEntries[i].name);
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (unsigned i = 0; i < sizeof(keyPressEntries)/sizeof(KeyPressEntry); i++)
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            keyPressCommandsMap->set(keyPressEntries[i].modifiers << 16 | keyPressEntries[i].charCode, keyPressEntries[i].name);
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned modifiers = 0;
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (keyEvent->shiftKey())
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        modifiers |= ShiftKey;
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (keyEvent->altKey())
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        modifiers |= AltKey;
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (evt->type() == eventNames().keydownEvent) {
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int mapKey = modifiers << 16 | evt->keyCode();
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return mapKey ? keyDownCommandsMap->get(mapKey) : 0;
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int mapKey = modifiers << 16 | evt->charCode();
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return mapKey ? keyPressCommandsMap->get(mapKey) : 0;
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientAndroid::handleKeyboardEvent(KeyboardEvent* event) {
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_page);
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Frame* frame = m_page->focusController()->focusedOrMainFrame();
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!frame)
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const PlatformKeyboardEvent* keyEvent = event->keyEvent();
1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // TODO: If the event is not coming from Android Java, e.g. from JavaScript,
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // PlatformKeyboardEvent is null. We should support this later.
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!keyEvent)
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Editor::Command command = frame->editor()->command(interpretKeyEvent(event));
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (keyEvent->type() == PlatformKeyboardEvent::RawKeyDown) {
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!command.isTextInsertion() && command.execute(event)) {
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // This function mimics the Windows version.  However, calling event->setDefaultHandled()
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // prevents the javascript key events for the delete key from happening.
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Update: Safari doesn't send delete key events to javascript so
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // we will mimic that behavior.
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            event->setDefaultHandled();
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (command.execute(event)) {
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        event->setDefaultHandled();
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Don't insert null or control characters as they can result in unexpected behaviour
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (event->charCode() < ' ')
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (frame->editor()->insertText(keyEvent->text(), event))
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        event->setDefaultHandled();
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project////////////////////////////////////////////////////////////////////////////////////////////////
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// we just don't support Undo/Redo at the moment
2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientAndroid::registerCommandForUndo(PassRefPtr<EditCommand>) {}
2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientAndroid::registerCommandForRedo(PassRefPtr<EditCommand>) {}
2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientAndroid::clearUndoRedoOperations() {}
2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientAndroid::canUndo() const { return false; }
2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientAndroid::canRedo() const { return false; }
2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientAndroid::undo() {}
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientAndroid::redo() {}
220c2a132734701e9acb0c0b0c4b3bf37f505a5b538Ben Murdochbool EditorClientAndroid::canCopyCut(bool defaultValue) const { return defaultValue; }
221c2a132734701e9acb0c0b0c4b3bf37f505a5b538Ben Murdochbool EditorClientAndroid::canPaste(bool defaultValue) const { return defaultValue; }
2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// functions new to Jun-07 tip of tree merge:
2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientAndroid::showSpellingUI(bool) {}
225a2f40ea74a5aafd6112542dde371e8a3916c5e5aBen Murdochvoid EditorClientAndroid::getGuessesForWord(String const&, const String&, WTF::Vector<String>&) {}
2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientAndroid::spellingUIIsShowing() { return false; }
22714f586c9666e68bd7b138911aa63a3081d5b2e49Grace Klobavoid EditorClientAndroid::checkGrammarOfString(unsigned short const*, int, WTF::Vector<GrammarDetail>&, int*, int*) {}
2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientAndroid::checkSpellingOfString(unsigned short const*, int, int*, int*) {}
2295f1ab04193ad0130ca8204aadaceae083aca9881Feng QianString EditorClientAndroid::getAutoCorrectSuggestionForMisspelledWord(const String&) { return String(); }
2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientAndroid::textFieldDidEndEditing(Element*) {}
231a9cb027a0b6e5a76a39be3702d3c67f3d162a21fGeorge Mountvoid EditorClientAndroid::textDidChangeInTextArea(Element* element)
232a9cb027a0b6e5a76a39be3702d3c67f3d162a21fGeorge Mount{
233a9cb027a0b6e5a76a39be3702d3c67f3d162a21fGeorge Mount    Frame* frame = m_page->focusController()->focusedOrMainFrame();
234a9cb027a0b6e5a76a39be3702d3c67f3d162a21fGeorge Mount    if (!frame || !frame->view())
235a9cb027a0b6e5a76a39be3702d3c67f3d162a21fGeorge Mount        return;
236a9cb027a0b6e5a76a39be3702d3c67f3d162a21fGeorge Mount    WebViewCore* webViewCore = WebViewCore::getWebViewCore(frame->view());
237a9cb027a0b6e5a76a39be3702d3c67f3d162a21fGeorge Mount    webViewCore->updateTextSizeAndScroll(element);
238a9cb027a0b6e5a76a39be3702d3c67f3d162a21fGeorge Mount}
239a9cb027a0b6e5a76a39be3702d3c67f3d162a21fGeorge Mountvoid EditorClientAndroid::textDidChangeInTextField(Element* element)
240a9cb027a0b6e5a76a39be3702d3c67f3d162a21fGeorge Mount{
241a9cb027a0b6e5a76a39be3702d3c67f3d162a21fGeorge Mount    Frame* frame = m_page->focusController()->focusedOrMainFrame();
242a9cb027a0b6e5a76a39be3702d3c67f3d162a21fGeorge Mount    if (!frame || !frame->view())
243a9cb027a0b6e5a76a39be3702d3c67f3d162a21fGeorge Mount        return;
244a9cb027a0b6e5a76a39be3702d3c67f3d162a21fGeorge Mount    WebViewCore* webViewCore = WebViewCore::getWebViewCore(frame->view());
245a9cb027a0b6e5a76a39be3702d3c67f3d162a21fGeorge Mount    webViewCore->updateTextSizeAndScroll(element);
246a9cb027a0b6e5a76a39be3702d3c67f3d162a21fGeorge Mount}
2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientAndroid::textFieldDidBeginEditing(Element*) {}
2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientAndroid::ignoreWordInSpellDocument(String const&) {}
24944206d7109052a5a98a832db4a9b960cf859dee9Leon Scroggins
25044206d7109052a5a98a832db4a9b960cf859dee9Leon Scroggins// We need to pass the selection up to the WebTextView
25144206d7109052a5a98a832db4a9b960cf859dee9Leon Scrogginsvoid EditorClientAndroid::respondToChangedSelection() {
25244206d7109052a5a98a832db4a9b960cf859dee9Leon Scroggins    if (m_uiGeneratedSelectionChange)
25344206d7109052a5a98a832db4a9b960cf859dee9Leon Scroggins        return;
25444206d7109052a5a98a832db4a9b960cf859dee9Leon Scroggins    Frame* frame = m_page->focusController()->focusedOrMainFrame();
25544206d7109052a5a98a832db4a9b960cf859dee9Leon Scroggins    if (!frame || !frame->view())
25644206d7109052a5a98a832db4a9b960cf859dee9Leon Scroggins        return;
25744206d7109052a5a98a832db4a9b960cf859dee9Leon Scroggins    WebViewCore* webViewCore = WebViewCore::getWebViewCore(frame->view());
25844206d7109052a5a98a832db4a9b960cf859dee9Leon Scroggins    webViewCore->updateTextSelection();
25944206d7109052a5a98a832db4a9b960cf859dee9Leon Scroggins}
26044206d7109052a5a98a832db4a9b960cf859dee9Leon Scroggins
26144206d7109052a5a98a832db4a9b960cf859dee9Leon Scrogginsbool EditorClientAndroid::shouldChangeSelectedRange(Range*, Range*, EAffinity,
26244206d7109052a5a98a832db4a9b960cf859dee9Leon Scroggins        bool) {
26344206d7109052a5a98a832db4a9b960cf859dee9Leon Scroggins    return m_shouldChangeSelectedRange;
26444206d7109052a5a98a832db4a9b960cf859dee9Leon Scroggins}
26544206d7109052a5a98a832db4a9b960cf859dee9Leon Scroggins
2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientAndroid::doTextFieldCommandFromEvent(Element*, KeyboardEvent*) { return false; }
2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientAndroid::textWillBeDeletedInTextField(Element*) {}
2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientAndroid::updateSpellingUIWithGrammarString(String const&, GrammarDetail const&) {}
2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientAndroid::updateSpellingUIWithMisspelledWord(String const&) {}
2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientAndroid::learnWord(String const&) {}
2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// functions new to the Nov-16-08 tip of tree merge:
2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientAndroid::shouldMoveRangeAfterDelete(Range*, Range*) { return true; }
2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientAndroid::setInputMethodState(bool) {}
2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// functions new to Feb-19 tip of tree merge:
2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientAndroid::handleInputMethodKeydown(KeyboardEvent*) {}
2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
279f7b9e1372a8483ca361a3de2727538704fea8368Ben Murdochvoid EditorClientAndroid::willSetInputMethodState()
280f7b9e1372a8483ca361a3de2727538704fea8368Ben Murdoch{
281f7b9e1372a8483ca361a3de2727538704fea8368Ben Murdoch    notImplemented();
282f7b9e1372a8483ca361a3de2727538704fea8368Ben Murdoch}
283d0fc68897b5a7379951aaa5d50f0802dbe9e00d4Ben Murdoch
284f729537b6d266be0c7b5ceca85a8089a9ee89da5Ben Murdochvoid EditorClientAndroid::requestCheckingOfString(SpellChecker*, int, TextCheckingTypeMask, const String&) {}
285c7daeac4737acbbac7f7cd35ac16ad015d433aaeBen Murdoch
286d0fc68897b5a7379951aaa5d50f0802dbe9e00d4Ben Murdoch#if ENABLE(WEB_AUTOFILL)
287a5b05f64bda3dea3ba23e77e9eb2ef59812cdc86Kristian MonsenWebAutofill* EditorClientAndroid::getAutofill()
288d0fc68897b5a7379951aaa5d50f0802dbe9e00d4Ben Murdoch{
289d0fc68897b5a7379951aaa5d50f0802dbe9e00d4Ben Murdoch    if (!m_autoFill)
290a5b05f64bda3dea3ba23e77e9eb2ef59812cdc86Kristian Monsen        m_autoFill.set(new WebAutofill());
291d0fc68897b5a7379951aaa5d50f0802dbe9e00d4Ben Murdoch
292d0fc68897b5a7379951aaa5d50f0802dbe9e00d4Ben Murdoch    return m_autoFill.get();
293d0fc68897b5a7379951aaa5d50f0802dbe9e00d4Ben Murdoch}
294d0fc68897b5a7379951aaa5d50f0802dbe9e00d4Ben Murdoch#endif
295d0fc68897b5a7379951aaa5d50f0802dbe9e00d4Ben Murdoch
2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
297