⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 webeditorclient.cpp

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 CPP
📖 第 1 页 / 共 2 页
字号:
        IDOMElement* domElement = DOMElement::createInstance(e);        if (domElement) {            IDOMHTMLInputElement* domInputElement;            if (SUCCEEDED(domElement->QueryInterface(IID_IDOMHTMLInputElement, (void**)&domInputElement))) {                BOOL result;                formDelegate->doPlatformCommand(domInputElement, BString(L"DeleteBackward"), kit(e->document()->frame()), &result);                domInputElement->Release();            }            domElement->Release();        }        formDelegate->Release();    }}void WebEditorClient::textDidChangeInTextArea(Element* e){    IWebFormDelegate* formDelegate;    if (SUCCEEDED(m_webView->formDelegate(&formDelegate)) && formDelegate) {        IDOMElement* domElement = DOMElement::createInstance(e);        if (domElement) {            IDOMHTMLTextAreaElement* domTextAreaElement;            if (SUCCEEDED(domElement->QueryInterface(IID_IDOMHTMLTextAreaElement, (void**)&domTextAreaElement))) {                formDelegate->textDidChangeInTextArea(domTextAreaElement, kit(e->document()->frame()));                domTextAreaElement->Release();            }            domElement->Release();        }        formDelegate->Release();    }}class WebEditorUndoCommand : public IWebUndoCommand{public:    WebEditorUndoCommand(PassRefPtr<EditCommand> editCommand, bool isUndo);    void execute();    // IUnknown    virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppvObject);    virtual ULONG STDMETHODCALLTYPE AddRef(void);    virtual ULONG STDMETHODCALLTYPE Release(void);private:    ULONG m_refCount;    RefPtr<EditCommand> m_editCommand;    bool m_isUndo;};WebEditorUndoCommand::WebEditorUndoCommand(PassRefPtr<EditCommand> editCommand, bool isUndo)    : m_editCommand(editCommand)    , m_isUndo(isUndo)     , m_refCount(1){ }void WebEditorUndoCommand::execute(){    if (m_isUndo)        m_editCommand->unapply();    else        m_editCommand->reapply();}HRESULT STDMETHODCALLTYPE WebEditorUndoCommand::QueryInterface(REFIID riid, void** ppvObject){    *ppvObject = 0;    if (IsEqualGUID(riid, IID_IUnknown))        *ppvObject = static_cast<IWebUndoCommand*>(this);    else if (IsEqualGUID(riid, IID_IWebUndoCommand))        *ppvObject = static_cast<IWebUndoCommand*>(this);    else        return E_NOINTERFACE;    AddRef();    return S_OK;}ULONG STDMETHODCALLTYPE WebEditorUndoCommand::AddRef(void){    return ++m_refCount;}ULONG STDMETHODCALLTYPE WebEditorUndoCommand::Release(void){    ULONG newRef = --m_refCount;    if (!newRef)        delete(this);    return newRef;}static LPCTSTR undoNameForEditAction(EditAction editAction){    switch (editAction) {        case EditActionUnspecified: return 0;        case EditActionSetColor: return LPCTSTR_UI_STRING_KEY("Set Color", "Set Color (Undo action name)", "Undo action name");        case EditActionSetBackgroundColor: return LPCTSTR_UI_STRING_KEY("Set Background Color", "Set Background Color (Undo action name)", "Undo action name");        case EditActionTurnOffKerning: return LPCTSTR_UI_STRING_KEY("Turn Off Kerning", "Turn Off Kerning (Undo action name)", "Undo action name");        case EditActionTightenKerning: return LPCTSTR_UI_STRING_KEY("Tighten Kerning", "Tighten Kerning (Undo action name)", "Undo action name");        case EditActionLoosenKerning: return LPCTSTR_UI_STRING_KEY("Loosen Kerning", "Loosen Kerning (Undo action name)", "Undo action name");        case EditActionUseStandardKerning: return LPCTSTR_UI_STRING_KEY("Use Standard Kerning", "Use Standard Kerning (Undo action name)", "Undo action name");        case EditActionTurnOffLigatures: return LPCTSTR_UI_STRING_KEY("Turn Off Ligatures", "Turn Off Ligatures (Undo action name)", "Undo action name");        case EditActionUseStandardLigatures: return LPCTSTR_UI_STRING_KEY("Use Standard Ligatures", "Use Standard Ligatures (Undo action name)", "Undo action name");        case EditActionUseAllLigatures: return LPCTSTR_UI_STRING_KEY("Use All Ligatures", "Use All Ligatures (Undo action name)", "Undo action name");        case EditActionRaiseBaseline: return LPCTSTR_UI_STRING_KEY("Raise Baseline", "Raise Baseline (Undo action name)", "Undo action name");        case EditActionLowerBaseline: return LPCTSTR_UI_STRING_KEY("Lower Baseline", "Lower Baseline (Undo action name)", "Undo action name");        case EditActionSetTraditionalCharacterShape: return LPCTSTR_UI_STRING_KEY("Set Traditional Character Shape", "Set Traditional Character Shape (Undo action name)", "Undo action name");        case EditActionSetFont: return LPCTSTR_UI_STRING_KEY("Set Font", "Set Font (Undo action name)", "Undo action name");        case EditActionChangeAttributes: return LPCTSTR_UI_STRING_KEY("Change Attributes", "Change Attributes (Undo action name)", "Undo action name");        case EditActionAlignLeft: return LPCTSTR_UI_STRING_KEY("Align Left", "Align Left (Undo action name)", "Undo action name");        case EditActionAlignRight: return LPCTSTR_UI_STRING_KEY("Align Right", "Align Right (Undo action name)", "Undo action name");        case EditActionCenter: return LPCTSTR_UI_STRING_KEY("Center", "Center (Undo action name)", "Undo action name");        case EditActionJustify: return LPCTSTR_UI_STRING_KEY("Justify", "Justify (Undo action name)", "Undo action name");        case EditActionSetWritingDirection: return LPCTSTR_UI_STRING_KEY("Set Writing Direction", "Set Writing Direction (Undo action name)", "Undo action name");        case EditActionSubscript: return LPCTSTR_UI_STRING_KEY("Subscript", "Subscript (Undo action name)", "Undo action name");        case EditActionSuperscript: return LPCTSTR_UI_STRING_KEY("Superscript", "Superscript (Undo action name)", "Undo action name");        case EditActionUnderline: return LPCTSTR_UI_STRING_KEY("Underline", "Underline (Undo action name)", "Undo action name");        case EditActionOutline: return LPCTSTR_UI_STRING_KEY("Outline", "Outline (Undo action name)", "Undo action name");        case EditActionUnscript: return LPCTSTR_UI_STRING_KEY("Unscript", "Unscript (Undo action name)", "Undo action name");        case EditActionDrag: return LPCTSTR_UI_STRING_KEY("Drag", "Drag (Undo action name)", "Undo action name");        case EditActionCut: return LPCTSTR_UI_STRING_KEY("Cut", "Cut (Undo action name)", "Undo action name");        case EditActionPaste: return LPCTSTR_UI_STRING_KEY("Paste", "Paste (Undo action name)", "Undo action name");        case EditActionPasteFont: return LPCTSTR_UI_STRING_KEY("Paste Font", "Paste Font (Undo action name)", "Undo action name");        case EditActionPasteRuler: return LPCTSTR_UI_STRING_KEY("Paste Ruler", "Paste Ruler (Undo action name)", "Undo action name");        case EditActionTyping: return LPCTSTR_UI_STRING_KEY("Typing", "Typing (Undo action name)", "Undo action name");        case EditActionCreateLink: return LPCTSTR_UI_STRING_KEY("Create Link", "Create Link (Undo action name)", "Undo action name");        case EditActionUnlink: return LPCTSTR_UI_STRING_KEY("Unlink", "Unlink (Undo action name)", "Undo action name");        case EditActionInsertList: return LPCTSTR_UI_STRING_KEY("Insert List", "Insert List (Undo action name)", "Undo action name");        case EditActionFormatBlock: return LPCTSTR_UI_STRING_KEY("Formatting", "Format Block (Undo action name)", "Undo action name");        case EditActionIndent: return LPCTSTR_UI_STRING_KEY("Indent", "Indent (Undo action name)", "Undo action name");        case EditActionOutdent: return LPCTSTR_UI_STRING_KEY("Outdent", "Outdent (Undo action name)", "Undo action name");    }    return 0;}void WebEditorClient::registerCommandForUndo(PassRefPtr<EditCommand> command){    IWebUIDelegate* uiDelegate = 0;    if (SUCCEEDED(m_webView->uiDelegate(&uiDelegate))) {        LPCTSTR actionName = undoNameForEditAction(command->editingAction());        WebEditorUndoCommand* undoCommand = new WebEditorUndoCommand(command, true);        if (!undoCommand)            return;        uiDelegate->registerUndoWithTarget(m_undoTarget, 0, undoCommand);        undoCommand->Release(); // the undo manager owns the reference        BSTR actionNameBSTR = SysAllocString(actionName);        if (actionNameBSTR) {            uiDelegate->setActionTitle(actionNameBSTR);            SysFreeString(actionNameBSTR);        }        uiDelegate->Release();    }}void WebEditorClient::registerCommandForRedo(PassRefPtr<EditCommand> command){    IWebUIDelegate* uiDelegate = 0;    if (SUCCEEDED(m_webView->uiDelegate(&uiDelegate))) {        WebEditorUndoCommand* undoCommand = new WebEditorUndoCommand(command, false);        if (!undoCommand)            return;        uiDelegate->registerUndoWithTarget(m_undoTarget, 0, undoCommand);        undoCommand->Release(); // the undo manager owns the reference        uiDelegate->Release();    }}void WebEditorClient::clearUndoRedoOperations(){    IWebUIDelegate* uiDelegate = 0;    if (SUCCEEDED(m_webView->uiDelegate(&uiDelegate))) {        uiDelegate->removeAllActionsWithTarget(m_undoTarget);        uiDelegate->Release();    }}bool WebEditorClient::canUndo() const{    BOOL result = FALSE;    IWebUIDelegate* uiDelegate = 0;    if (SUCCEEDED(m_webView->uiDelegate(&uiDelegate))) {        uiDelegate->canUndo(&result);        uiDelegate->Release();    }    return !!result;}bool WebEditorClient::canRedo() const{    BOOL result = FALSE;    IWebUIDelegate* uiDelegate = 0;    if (SUCCEEDED(m_webView->uiDelegate(&uiDelegate))) {        uiDelegate->canRedo(&result);        uiDelegate->Release();    }    return !!result;}void WebEditorClient::undo(){    IWebUIDelegate* uiDelegate = 0;    if (SUCCEEDED(m_webView->uiDelegate(&uiDelegate))) {        uiDelegate->undo();        uiDelegate->Release();    }}void WebEditorClient::redo(){    IWebUIDelegate* uiDelegate = 0;    if (SUCCEEDED(m_webView->uiDelegate(&uiDelegate))) {        uiDelegate->redo();        uiDelegate->Release();    }}void WebEditorClient::handleKeyboardEvent(KeyboardEvent* evt){    if (m_webView->handleEditingKeyboardEvent(evt))        evt->setDefaultHandled();}void WebEditorClient::handleInputMethodKeydown(KeyboardEvent* ){}bool WebEditorClient::isEditable(){    return false;}void WebEditorClient::ignoreWordInSpellDocument(const String& word){    COMPtr<IWebEditingDelegate> ed;    if (FAILED(m_webView->editingDelegate(&ed)) || !ed.get())        return;    initViewSpecificSpelling(m_webView);    ed->ignoreWordInSpellDocument(m_webView, BString(word));}void WebEditorClient::learnWord(const String& word){    COMPtr<IWebEditingDelegate> ed;    if (FAILED(m_webView->editingDelegate(&ed)) || !ed.get())        return;    ed->learnWord(BString(word));}void WebEditorClient::checkSpellingOfString(const UChar* text, int length, int* misspellingLocation, int* misspellingLength){    *misspellingLocation = -1;    *misspellingLength = 0;    COMPtr<IWebEditingDelegate> ed;    if (FAILED(m_webView->editingDelegate(&ed)) || !ed.get())        return;    initViewSpecificSpelling(m_webView);    ed->checkSpellingOfString(m_webView, text, length, misspellingLocation, misspellingLength);}void WebEditorClient::checkGrammarOfString(const UChar* text, int length, Vector<GrammarDetail>& details, int* badGrammarLocation, int* badGrammarLength){    details.clear();    *badGrammarLocation = -1;    *badGrammarLength = 0;    COMPtr<IWebEditingDelegate> ed;    if (FAILED(m_webView->editingDelegate(&ed)) || !ed.get())        return;    initViewSpecificSpelling(m_webView);    COMPtr<IEnumWebGrammarDetails> enumDetailsObj;    if (FAILED(ed->checkGrammarOfString(m_webView, text, length, &enumDetailsObj, badGrammarLocation, badGrammarLength)))        return;    while (true) {        ULONG fetched;        COMPtr<IWebGrammarDetail> detailObj;        if (enumDetailsObj->Next(1, &detailObj, &fetched) != S_OK)            break;        GrammarDetail detail;        if (FAILED(detailObj->length(&detail.length)))            continue;        if (FAILED(detailObj->location(&detail.location)))            continue;        BSTR userDesc;        if (FAILED(detailObj->userDescription(&userDesc)))            continue;        detail.userDescription = String(userDesc, SysStringLen(userDesc));        SysFreeString(userDesc);        COMPtr<IEnumSpellingGuesses> enumGuessesObj;        if (FAILED(detailObj->guesses(&enumGuessesObj)))            continue;        while (true) {            BSTR guess;            if (enumGuessesObj->Next(1, &guess, &fetched) != S_OK)                break;            detail.guesses.append(String(guess, SysStringLen(guess)));            SysFreeString(guess);        }        details.append(detail);    }}void WebEditorClient::updateSpellingUIWithGrammarString(const String& string, const WebCore::GrammarDetail& detail){    COMPtr<IWebEditingDelegate> ed;    if (FAILED(m_webView->editingDelegate(&ed)) || !ed.get())        return;    Vector<BSTR> guessesBSTRs;    for (unsigned i = 0; i < detail.guesses.size(); i++) {        BString guess(detail.guesses[i]);        guessesBSTRs.append(guess.release());    }    BString userDescriptionBSTR(detail.userDescription);    ed->updateSpellingUIWithGrammarString(BString(string), detail.location, detail.length, userDescriptionBSTR, guessesBSTRs.data(), (int)guessesBSTRs.size());    for (unsigned i = 0; i < guessesBSTRs.size(); i++)        SysFreeString(guessesBSTRs[i]);}void WebEditorClient::updateSpellingUIWithMisspelledWord(const String& word){    COMPtr<IWebEditingDelegate> ed;    if (FAILED(m_webView->editingDelegate(&ed)) || !ed.get())        return;    ed->updateSpellingUIWithMisspelledWord(BString(word));}void WebEditorClient::showSpellingUI(bool show){    COMPtr<IWebEditingDelegate> ed;    if (FAILED(m_webView->editingDelegate(&ed)) || !ed.get())        return;        ed->showSpellingUI(show);}bool WebEditorClient::spellingUIIsShowing(){    COMPtr<IWebEditingDelegate> ed;    if (FAILED(m_webView->editingDelegate(&ed)) || !ed.get())        return false;    BOOL showing;    if (FAILED(ed->spellingUIIsShowing(&showing)))        return false;    return !!showing;}void WebEditorClient::getGuessesForWord(const String& word, Vector<String>& guesses){    guesses.clear();    COMPtr<IWebEditingDelegate> ed;    if (FAILED(m_webView->editingDelegate(&ed)) || !ed.get())        return;    COMPtr<IEnumSpellingGuesses> enumGuessesObj;    if (FAILED(ed->guessesForWord(BString(word), &enumGuessesObj)))        return;    while (true) {        ULONG fetched;        BSTR guess;        if (enumGuessesObj->Next(1, &guess, &fetched) != S_OK)            break;        guesses.append(String(guess, SysStringLen(guess)));        SysFreeString(guess);    }}void WebEditorClient::setInputMethodState(bool enabled){    m_webView->setInputMethodState(enabled);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -