webengine/osswebengine/WebKit/s60/webcoresupport/WebEditorClient.cpp
changeset 0 dd21522fd290
child 5 10e98eab6f85
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webengine/osswebengine/WebKit/s60/webcoresupport/WebEditorClient.cpp	Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,631 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:   Implementation of WebEditorClient
+*
+*/
+
+#include "config.h"
+#include "../../bidi.h"
+#include "WebEditorClient.h"
+
+#include "EditCommand.h"
+#include "Editor.h"
+#include "FocusController.h"
+#include "Frame.h"
+#include "Document.h"
+#include "KeyboardEvent.h"
+#include "Page.h"
+#include "PlatformKeyboardEvent.h"
+#include "DebugStream.h"
+#include "WebView.h"
+#include "WebFrame.h"
+#include "WebFormFill.h"
+#include "HtmlNames.h"
+#include "WebFepTextEditor.h"
+#include <eikcoctl.rsg>
+#include <eikon.hrh>
+
+
+using namespace WebCore;
+using namespace HTMLNames;
+
+//-----------------------------------------------------------------------------
+// WebEditorClient::WebEditorClient
+//-----------------------------------------------------------------------------
+WebEditorClient::WebEditorClient(WebView* webview) : m_webView(webview)
+{
+}
+
+//-----------------------------------------------------------------------------
+// WebEditorClient::shouldDeleteRange
+//-----------------------------------------------------------------------------
+bool WebEditorClient::shouldDeleteRange(Range*)
+{
+    return true;
+}
+
+//-----------------------------------------------------------------------------
+// WebEditorClient::shouldShowDeleteInterface
+//-----------------------------------------------------------------------------
+bool WebEditorClient::shouldShowDeleteInterface(HTMLElement*)
+{
+    return false;
+}
+
+//-----------------------------------------------------------------------------
+// WebEditorClient::isContinuousSpellCheckingEnabled
+//-----------------------------------------------------------------------------
+bool WebEditorClient::isContinuousSpellCheckingEnabled()
+{
+    notImplemented();
+    return false;
+}
+
+//-----------------------------------------------------------------------------
+// WebEditorClient::isGrammarCheckingEnabled
+//-----------------------------------------------------------------------------
+bool WebEditorClient::isGrammarCheckingEnabled()
+{
+    notImplemented();
+    return false;
+}
+
+//-----------------------------------------------------------------------------
+// WebEditorClient::spellCheckerDocumentTag
+//-----------------------------------------------------------------------------
+int WebEditorClient::spellCheckerDocumentTag()
+{
+    notImplemented();
+    return 0;
+}
+
+//-----------------------------------------------------------------------------
+// WebEditorClient::shouldBeginEditing
+//-----------------------------------------------------------------------------
+bool WebEditorClient::shouldBeginEditing(WebCore::Range*)
+{
+    notImplemented();
+    return false;
+}
+
+//-----------------------------------------------------------------------------
+// WebEditorClient::shouldEndEditing
+//-----------------------------------------------------------------------------
+bool WebEditorClient::shouldEndEditing(WebCore::Range*)
+{
+    notImplemented();
+    return false;
+}
+
+//-----------------------------------------------------------------------------
+// WebEditorClient::shouldInsertText
+//-----------------------------------------------------------------------------
+bool WebEditorClient::shouldInsertText(String, Range*, EditorInsertAction)
+{
+    return true;
+}
+
+//-----------------------------------------------------------------------------
+// WebEditorClient::shouldChangeSelectedRange
+//-----------------------------------------------------------------------------
+bool WebEditorClient::shouldChangeSelectedRange(Range* fromRange,
+                                                Range* toRange,
+                                                EAffinity,
+                                                bool stillSelecting)
+{
+    return true;
+}
+
+//-----------------------------------------------------------------------------
+// WebEditorClient::shouldApplyStyle
+//-----------------------------------------------------------------------------
+bool WebEditorClient::shouldApplyStyle(WebCore::CSSStyleDeclaration*,
+                                       WebCore::Range*)
+{
+    notImplemented();
+    return false;
+}
+
+//-----------------------------------------------------------------------------
+// WebEditorClient::shouldMoveRangeAfterDelete
+//-----------------------------------------------------------------------------
+bool WebEditorClient::shouldMoveRangeAfterDelete(Range* range, Range* rangeToBeReplaced)
+{
+    /*
+    return [[m_webView _editingDelegateForwarder] webView:m_webView
+        shouldMoveRangeAfterDelete:kit(range) replacingRange:kit(rangeToBeReplaced)];
+    */
+    notImplemented();
+    return true;
+}
+
+//-----------------------------------------------------------------------------
+// WebEditorClient::didBeginEditing
+//-----------------------------------------------------------------------------
+void WebEditorClient::didBeginEditing()
+{
+    notImplemented();
+}
+
+//-----------------------------------------------------------------------------
+// WebEditorClient::respondToChangedContents
+//-----------------------------------------------------------------------------
+void WebEditorClient::respondToChangedContents()
+{
+    notImplemented();
+}
+
+//-----------------------------------------------------------------------------
+// WebEditorClient::respondToChangedSelection
+//-----------------------------------------------------------------------------
+void WebEditorClient::respondToChangedSelection()
+{
+    notImplemented();
+}
+
+//-----------------------------------------------------------------------------
+// WebEditorClient::didEndEditing
+//-----------------------------------------------------------------------------
+void WebEditorClient::didEndEditing()
+{
+    notImplemented();
+}
+
+//-----------------------------------------------------------------------------
+// WebEditorClient::didWriteSelectionToPasteboard
+//-----------------------------------------------------------------------------
+void WebEditorClient::didWriteSelectionToPasteboard()
+{
+    notImplemented();
+}
+
+//-----------------------------------------------------------------------------
+// WebEditorClient::didSetSelectionTypesForPasteboard
+//-----------------------------------------------------------------------------
+void WebEditorClient::didSetSelectionTypesForPasteboard()
+{
+    notImplemented();
+}
+
+//-----------------------------------------------------------------------------
+// WebEditorClient::selectWordBeforeMenuEvent
+//-----------------------------------------------------------------------------
+bool WebEditorClient::selectWordBeforeMenuEvent()
+{
+    notImplemented();
+    return false;
+}
+
+//-----------------------------------------------------------------------------
+// WebEditorClient::isEditable
+//-----------------------------------------------------------------------------
+bool WebEditorClient::isEditable()
+{
+    return false;
+}
+
+//-----------------------------------------------------------------------------
+// WebEditorClient::registerCommandForUndo
+//-----------------------------------------------------------------------------
+void WebEditorClient::registerCommandForUndo(WTF::PassRefPtr<WebCore::EditCommand>)
+{
+    notImplemented();
+}
+
+//-----------------------------------------------------------------------------
+// WebEditorClient::registerCommandForRedo
+//-----------------------------------------------------------------------------
+void WebEditorClient::registerCommandForRedo(WTF::PassRefPtr<WebCore::EditCommand>)
+{
+    notImplemented();
+}
+
+//-----------------------------------------------------------------------------
+// WebEditorClient::clearUndoRedoOperations
+//-----------------------------------------------------------------------------
+void WebEditorClient::clearUndoRedoOperations()
+{
+    notImplemented();
+}
+
+//-----------------------------------------------------------------------------
+// WebEditorClient::canUndo
+//-----------------------------------------------------------------------------
+bool WebEditorClient::canUndo() const
+{
+    notImplemented();
+    return false;
+}
+
+//-----------------------------------------------------------------------------
+// WebEditorClient::canRedo
+//-----------------------------------------------------------------------------
+bool WebEditorClient::canRedo() const
+{
+    notImplemented();
+    return false;
+}
+
+//-----------------------------------------------------------------------------
+// WebEditorClient::undo
+//-----------------------------------------------------------------------------
+void WebEditorClient::undo()
+{
+    notImplemented();
+}
+
+//-----------------------------------------------------------------------------
+// WebEditorClient::redo
+//-----------------------------------------------------------------------------
+void WebEditorClient::redo()
+{
+    notImplemented();
+}
+
+//-----------------------------------------------------------------------------
+// WebEditorClient::shouldInsertNode
+//-----------------------------------------------------------------------------
+bool WebEditorClient::shouldInsertNode(Node*, Range*, EditorInsertAction)
+{
+    notImplemented();
+    return false;
+}
+
+//-----------------------------------------------------------------------------
+// WebEditorClient::pageDestroyed
+//-----------------------------------------------------------------------------
+void WebEditorClient::pageDestroyed()
+{
+    notImplemented();
+}
+
+//-----------------------------------------------------------------------------
+// WebEditorClient::smartInsertDeleteEnabled
+//-----------------------------------------------------------------------------
+bool WebEditorClient::smartInsertDeleteEnabled()
+{
+    return true;
+}
+
+//-----------------------------------------------------------------------------
+// WebEditorClient::toggleContinuousSpellChecking
+//-----------------------------------------------------------------------------
+void WebEditorClient::toggleContinuousSpellChecking()
+{
+    notImplemented();
+}
+
+//-----------------------------------------------------------------------------
+// WebEditorClient::toggleGrammarChecking
+//-----------------------------------------------------------------------------
+void WebEditorClient::toggleGrammarChecking()
+{
+}
+
+//-----------------------------------------------------------------------------
+// WebEditorClient::handleKeypress
+//-----------------------------------------------------------------------------
+void WebEditorClient::handleKeypress(KeyboardEvent* event)
+{
+    if (!m_webView && !m_webView->page()) {
+        return;
+    }
+
+    Frame* frame = m_webView->page()->mainFrame();
+    if (!frame) {
+        return;
+    }
+
+    // Move to the right frame
+    frame = m_webView->page()->focusController()->focusedOrMainFrame();
+
+    const PlatformKeyboardEvent* kevent = event->keyEvent();
+    if (!kevent->isKeyUp()) {
+        const TInt modifiers=kevent->symbianEvent().iModifiers;
+        TBool select=modifiers&EModifierShift;
+        TBool magnify=modifiers&EModifierCtrl;
+        // it's a rather hackish way to check if we are at the end of the editing field
+        Position startPos = frame->selectionController()->start();
+        Position endPos = frame->selectionController()->end();
+        Node* startNode = startPos.node();
+        if (startNode && startNode->isContentEditable()) {
+
+            // The virtual ITU-T keyboard has a sync issue when we handle these
+            // key events, so we call Fep()->HandleChangeInFocus() to get
+            // the Fep in sync.
+            int code = (kevent->keyIdentifier() == "Enter") ? EKeyEnter : kevent->symbianEvent().iCode;
+            switch (code)
+            {
+
+            // AknFepManager calls SimulateKeyEventL(EKeyF20) to delete
+            // previous char in secret text editor
+            case EKeyF20:
+            case EKeyBackspace:
+                frame->editor()->deleteWithDirection(SelectionController::BACKWARD,
+                                                     CharacterGranularity, false, true);
+                m_webView->fepTextEditor()->HandleUpdateCursor();
+                m_webView->fepTextEditor()->UpdateEditingMode();
+                event->setDefaultHandled();
+                break;
+
+            case EKeyDelete:
+                frame->editor()->deleteWithDirection(SelectionController::FORWARD,
+                                                     CharacterGranularity, false, true);
+                m_webView->fepTextEditor()->HandleUpdateCursor();
+                m_webView->fepTextEditor()->UpdateEditingMode();
+                event->setDefaultHandled();
+                break;
+
+            case EKeyLeftArrow:
+                frame->editor()->execCommand("MoveLeft");
+                m_webView->fepTextEditor()->HandleUpdateCursor();
+                if (frame->selectionController()->start() != startPos &&
+                    frame->selectionController()->end() != endPos) {
+                    event->setDefaultHandled();
+                }
+                break;
+
+            case EKeyRightArrow:
+                frame->editor()->execCommand("MoveRight");
+                m_webView->fepTextEditor()->HandleUpdateCursor();
+                if (frame->selectionController()->start() != startPos &&
+                    frame->selectionController()->end() != endPos) {
+                    event->setDefaultHandled();
+                }
+                break;
+
+            case EKeyUpArrow:
+                frame->editor()->execCommand("MoveUp");
+                m_webView->fepTextEditor()->HandleUpdateCursor();
+                if (frame->selectionController()->start() != startPos &&
+                    frame->selectionController()->end() != endPos) {
+                    event->setDefaultHandled();
+                }
+                break;
+
+            case EKeyDownArrow:
+                frame->editor()->execCommand("MoveDown");
+                m_webView->fepTextEditor()->HandleUpdateCursor();
+                if (frame->selectionController()->start() != startPos &&
+                    frame->selectionController()->end() != endPos) {
+                    event->setDefaultHandled();
+                }
+                break;
+                
+            case EKeyEnter:
+            	// If we are in a textarea, add a newline
+                if (m_webView->fepTextEditor()->IsTextAreaFocused()) {
+                    if (m_webView->fepTextEditor()->DocumentLengthForFep() <
+                        m_webView->fepTextEditor()->DocumentMaximumLengthForFep()) {
+                        frame->editor()->insertLineBreak();
+                        m_webView->fepTextEditor()->UpdateEditingMode();
+                        m_webView->fepTextEditor()->HandleUpdateCursor();
+                        event->setDefaultHandled();
+                    }
+                }
+                break;
+
+            case EKeyF18:
+                if (magnify)
+                {
+                    switch (kevent->symbianEvent().iScanCode)
+                        {
+                        case EEikCmdEditCut:
+                            m_webView->fepTextEditor()->CcpuCutL();
+                            frame->editor()->deleteWithDirection(SelectionController::BACKWARD,
+                                                             CharacterGranularity, false, true);
+                            m_webView->fepTextEditor()->HandleUpdateCursor();
+                            break;
+                        case EEikCmdEditCopy:
+                            m_webView->fepTextEditor()->CcpuCopyL();
+                            break;
+                        case EEikCmdEditPaste:
+                            m_webView->fepTextEditor()->CcpuPasteL();
+                            break;
+                        default:
+                            break;
+                        }
+                }
+                break;
+
+// All of the diagonal KeyEvents are allowed to flow through the "default" case...
+//
+//          case EKeyRightUpArrow:        // Northeast
+//          case EStdKeyDevice11:         //   : Extra KeyEvent supports diagonal event simulator wedge
+//          case EKeyRightDownArrow:      // Southeast
+//          case EStdKeyDevice12:         //   : Extra KeyEvent supports diagonal event simulator wedge
+//          case EKeyLeftDownArrow:       // Southwest
+//          case EStdKeyDevice13:         //   : Extra KeyEvent supports diagonal event simulator wedge
+//          case EKeyLeftUpArrow:         // Northwest
+//          case EStdKeyDevice10:         //   : Extra KeyEvent supports diagonal event simulator wedge
+            default:
+                TBuf<24> buf;
+                if (select)
+                    CCoeEnv::Static()->ReadResource(buf,R_EIK_EDWIN_SHIFT_CTRL_HOTKEYS);
+                else
+                    CCoeEnv::Static()->ReadResource(buf,R_EIK_EDWIN_CTRL_HOTKEYS);
+                const TInt ret=buf.Locate(TChar(kevent->symbianEvent().iCode+'a'-1));
+                switch (ret)
+                    {
+                case EHotKeyCut:
+                    m_webView->fepTextEditor()->CcpuCopyL();
+                    frame->editor()->deleteWithDirection(SelectionController::BACKWARD,
+                                                     CharacterGranularity, false, true);
+                    m_webView->fepTextEditor()->HandleUpdateCursor();
+                    break;
+                case EHotKeyCopy:
+                    m_webView->fepTextEditor()->CcpuCopyL();
+                    break;
+                case EHotKeyPaste:
+                    m_webView->fepTextEditor()->CcpuPasteL();
+                    break;
+                    }
+
+                if (TChar(kevent->symbianEvent().iCode).IsPrint()) {
+                    if (m_webView->fepTextEditor()->DocumentLengthForFep() <
+                        m_webView->fepTextEditor()->DocumentMaximumLengthForFep()) {
+                        TText c = kevent->symbianEvent().iCode;
+                        frame->editor()->insertTextWithoutSendingTextEvent(String(TPtrC(&c,1)), false);
+                        m_webView->fepTextEditor()->UpdateEditingMode();
+                    }
+                    m_webView->fepTextEditor()->HandleUpdateCursor();
+                    event->setDefaultHandled();
+                }
+                break;
+
+            }   // End of switch
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+// WebEditorClient::handleInputMethodKeypress
+//-----------------------------------------------------------------------------
+void WebEditorClient::handleInputMethodKeypress(KeyboardEvent*)
+{
+    notImplemented();
+}
+
+//-----------------------------------------------------------------------------
+// WebEditorClient::textFieldDidBeginEditing
+//-----------------------------------------------------------------------------
+void WebEditorClient::textFieldDidBeginEditing(Element*)
+{
+    notImplemented();
+}
+
+//-----------------------------------------------------------------------------
+// WebEditorClient::textFieldDidEndEditing
+//-----------------------------------------------------------------------------
+void WebEditorClient::textFieldDidEndEditing(Element*)
+{
+    notImplemented();
+}
+
+//-----------------------------------------------------------------------------
+// WebEditorClient::textDidChangeInTextField
+//-----------------------------------------------------------------------------
+void WebEditorClient::textDidChangeInTextField(Element* inputElement)
+{
+    if ( m_webView->formFill() )
+        {
+        m_webView->formFill()->textChanged(inputElement);
+        }
+}
+
+//-----------------------------------------------------------------------------
+// WebEditorClient::doTextFieldCommandFromEvent
+//-----------------------------------------------------------------------------
+bool WebEditorClient::doTextFieldCommandFromEvent(Element*, KeyboardEvent*)
+{
+    notImplemented();
+    return false;
+}
+
+//-----------------------------------------------------------------------------
+// WebEditorClient::textWillBeDeletedInTextField
+//-----------------------------------------------------------------------------
+void WebEditorClient::textWillBeDeletedInTextField(Element*)
+{
+    notImplemented();
+}
+
+//-----------------------------------------------------------------------------
+// WebEditorClient::textDidChangeInTextArea
+//-----------------------------------------------------------------------------
+void WebEditorClient::textDidChangeInTextArea(Element*)
+{
+    notImplemented();
+}
+
+//-----------------------------------------------------------------------------
+// WebEditorClient::ignoreWordInSpellDocument
+//-----------------------------------------------------------------------------
+void WebEditorClient::ignoreWordInSpellDocument(const String&)
+{
+    notImplemented();
+}
+
+//-----------------------------------------------------------------------------
+// WebEditorClient::learnWord
+//-----------------------------------------------------------------------------
+void WebEditorClient::learnWord(const String&)
+{
+    notImplemented();
+}
+
+//-----------------------------------------------------------------------------
+// WebEditorClient::checkSpellingOfString
+//-----------------------------------------------------------------------------
+void WebEditorClient::checkSpellingOfString(const UChar*, int length, int* misspellingLocation, int* misspellingLength)
+{
+    notImplemented();
+}
+
+//-----------------------------------------------------------------------------
+// WebEditorClient::checkGrammarOfString
+//-----------------------------------------------------------------------------
+void WebEditorClient::checkGrammarOfString(const UChar*, int length, Vector<GrammarDetail>&, int* badGrammarLocation, int* badGrammarLength)
+{
+    notImplemented();
+}
+
+//-----------------------------------------------------------------------------
+// WebEditorClient::updateSpellingUIWithGrammarString
+//-----------------------------------------------------------------------------
+void WebEditorClient::updateSpellingUIWithGrammarString(const String&, const GrammarDetail& detail)
+{
+    notImplemented();
+}
+
+//-----------------------------------------------------------------------------
+// WebEditorClient::updateSpellingUIWithMisspelledWord
+//-----------------------------------------------------------------------------
+void WebEditorClient::updateSpellingUIWithMisspelledWord(const String&)
+{
+    notImplemented();
+}
+
+//-----------------------------------------------------------------------------
+// WebEditorClient::showSpellingUI
+//-----------------------------------------------------------------------------
+void WebEditorClient::showSpellingUI(bool show)
+{
+    notImplemented();
+}
+
+//-----------------------------------------------------------------------------
+// WebEditorClient::spellingUIIsShowing
+//-----------------------------------------------------------------------------
+bool WebEditorClient::spellingUIIsShowing()
+{
+    notImplemented();
+    return false;
+}
+
+//-----------------------------------------------------------------------------
+// WebEditorClient::getGuessesForWord
+//-----------------------------------------------------------------------------
+void WebEditorClient::getGuessesForWord(const String&, Vector<String>& guesses)
+{
+    notImplemented();
+}
+
+//-----------------------------------------------------------------------------
+// WebEditorClient::setInputMethodState
+//-----------------------------------------------------------------------------
+void WebEditorClient::setInputMethodState(bool enabled)
+{
+    m_webView->setEditable(enabled);
+}