📄 webeditorclient.cpp
字号:
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 + -