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

📄 contextmenu.cpp

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 CPP
📖 第 1 页 / 共 2 页
字号:
            // Consider adding spelling-related or grammar-related context menu items (never both, since a single selected range            // is never considered a misspelling and bad grammar at the same time)            bool misspelling;            bool badGrammar;            Vector<String> guesses = frame->editor()->guessesForMisspelledOrUngrammaticalSelection(misspelling, badGrammar);            if (misspelling || badGrammar) {                size_t size = guesses.size();                if (size == 0) {                    // If there's bad grammar but no suggestions (e.g., repeated word), just leave off the suggestions                    // list and trailing separator rather than adding a "No Guesses Found" item (matches AppKit)                    if (misspelling) {                        appendItem(NoGuessesItem);                        appendItem(*separatorItem());                    }                } else {                    for (unsigned i = 0; i < size; i++) {                        const String &guess = guesses[i];                        if (!guess.isEmpty()) {                            ContextMenuItem item(ActionType, ContextMenuItemTagSpellingGuess, guess);                            appendItem(item);                        }                    }                    appendItem(*separatorItem());                                    }                                if (misspelling) {                    appendItem(IgnoreSpellingItem);                    appendItem(LearnSpellingItem);                } else                    appendItem(IgnoreGrammarItem);                appendItem(*separatorItem());            }        }        FrameLoader* loader = frame->loader();        KURL linkURL = result.absoluteLinkURL();        if (!linkURL.isEmpty()) {            if (loader->canHandleRequest(ResourceRequest(linkURL))) {                appendItem(OpenLinkItem);                appendItem(OpenLinkInNewWindowItem);                appendItem(DownloadFileItem);            }            appendItem(CopyLinkItem);            appendItem(*separatorItem());        }        if (result.isSelected() && !inPasswordField && selectionContainsPossibleWord(frame)) {#if PLATFORM(MAC)            appendItem(SearchSpotlightItem);#endif            appendItem(SearchWebItem);            appendItem(*separatorItem());     #if PLATFORM(MAC)            appendItem(LookInDictionaryItem);            appendItem(*separatorItem());#endif        }        appendItem(CutItem);        appendItem(CopyItem);        appendItem(PasteItem);#if PLATFORM(GTK)        appendItem(DeleteItem);        appendItem(*separatorItem());        appendItem(SelectAllItem);#endif        if (!inPasswordField) {            appendItem(*separatorItem());#ifndef BUILDING_ON_TIGER            ContextMenuItem SpellingAndGrammarMenuItem(SubmenuType, ContextMenuItemTagSpellingMenu,                 contextMenuItemTagSpellingMenu());            createAndAppendSpellingAndGrammarSubMenu(m_hitTestResult, SpellingAndGrammarMenuItem);            appendItem(SpellingAndGrammarMenuItem);#else            ContextMenuItem SpellingMenuItem(SubmenuType, ContextMenuItemTagSpellingMenu,                 contextMenuItemTagSpellingMenu());            createAndAppendSpellingSubMenu(m_hitTestResult, SpellingMenuItem);            appendItem(SpellingMenuItem);#endif            ContextMenuItem  FontMenuItem(SubmenuType, ContextMenuItemTagFontMenu,                 contextMenuItemTagFontMenu());            createAndAppendFontSubMenu(m_hitTestResult, FontMenuItem);            appendItem(FontMenuItem);#if PLATFORM(MAC)            ContextMenuItem SpeechMenuItem(SubmenuType, ContextMenuItemTagSpeechMenu,                 contextMenuItemTagSpeechMenu());            createAndAppendSpeechSubMenu(m_hitTestResult, SpeechMenuItem);            appendItem(SpeechMenuItem);#endif#if !PLATFORM(GTK)            ContextMenuItem WritingDirectionMenuItem(SubmenuType, ContextMenuItemTagWritingDirectionMenu,                 contextMenuItemTagWritingDirectionMenu());            createAndAppendWritingDirectionSubMenu(m_hitTestResult, WritingDirectionMenuItem);            appendItem(WritingDirectionMenuItem);            if (Page* page = frame->page()) {                if (Settings* settings = page->settings()) {                    bool includeTextDirectionSubmenu = settings->textDirectionSubmenuInclusionBehavior() == TextDirectionSubmenuAlwaysIncluded                        || settings->textDirectionSubmenuInclusionBehavior() == TextDirectionSubmenuAutomaticallyIncluded && frame->editor()->hasBidiSelection();                    if (includeTextDirectionSubmenu) {                        ContextMenuItem TextDirectionMenuItem(SubmenuType, ContextMenuItemTagTextDirectionMenu,                             contextMenuItemTagTextDirectionMenu());                        createAndAppendTextDirectionSubMenu(m_hitTestResult, TextDirectionMenuItem);                        appendItem(TextDirectionMenuItem);                    }                }            }#endif        }    }}void ContextMenu::addInspectElementItem(){    Node* node = m_hitTestResult.innerNonSharedNode();    if (!node)        return;    Frame* frame = node->document()->frame();    if (!frame)        return;    Page* page = frame->page();    if (!page)        return;    if (!page->inspectorController())        return;    ContextMenuItem InspectElementItem(ActionType, ContextMenuItemTagInspectElement, contextMenuItemTagInspectElement());    appendItem(*separatorItem());    appendItem(InspectElementItem);}void ContextMenu::checkOrEnableIfNeeded(ContextMenuItem& item) const{    if (item.type() == SeparatorType)        return;        Frame* frame = m_hitTestResult.innerNonSharedNode()->document()->frame();    if (!frame)        return;    bool shouldEnable = true;    bool shouldCheck = false;     switch (item.action()) {        case ContextMenuItemTagCheckSpelling:            shouldEnable = frame->editor()->canEdit();            break;        case ContextMenuItemTagDefaultDirection:            shouldCheck = false;            shouldEnable = false;            break;        case ContextMenuItemTagLeftToRight:        case ContextMenuItemTagRightToLeft: {            ExceptionCode ec = 0;            RefPtr<CSSStyleDeclaration> style = frame->document()->createCSSStyleDeclaration();            String direction = item.action() == ContextMenuItemTagLeftToRight ? "ltr" : "rtl";            style->setProperty(CSSPropertyDirection, direction, false, ec);            shouldCheck = frame->editor()->selectionHasStyle(style.get()) != FalseTriState;            shouldEnable = true;            break;        }        case ContextMenuItemTagTextDirectionDefault: {            Editor::Command command = frame->editor()->command("MakeTextWritingDirectionNatural");            shouldCheck = command.state() == TrueTriState;            shouldEnable = command.isEnabled();            break;        }        case ContextMenuItemTagTextDirectionLeftToRight: {            Editor::Command command = frame->editor()->command("MakeTextWritingDirectionLeftToRight");            shouldCheck = command.state() == TrueTriState;            shouldEnable = command.isEnabled();            break;        }        case ContextMenuItemTagTextDirectionRightToLeft: {            Editor::Command command = frame->editor()->command("MakeTextWritingDirectionRightToLeft");            shouldCheck = command.state() == TrueTriState;            shouldEnable = command.isEnabled();            break;        }        case ContextMenuItemTagCopy:            shouldEnable = frame->editor()->canDHTMLCopy() || frame->editor()->canCopy();            break;        case ContextMenuItemTagCut:            shouldEnable = frame->editor()->canDHTMLCut() || frame->editor()->canCut();            break;        case ContextMenuItemTagIgnoreSpelling:        case ContextMenuItemTagLearnSpelling:            shouldEnable = frame->selection()->isRange();            break;        case ContextMenuItemTagPaste:            shouldEnable = frame->editor()->canDHTMLPaste() || frame->editor()->canPaste();            break;#if PLATFORM(GTK)        case ContextMenuItemTagDelete:            shouldEnable = frame->editor()->canDelete();            break;        case ContextMenuItemTagSelectAll:        case ContextMenuItemTagInputMethods:        case ContextMenuItemTagUnicode:            shouldEnable = true;            break;#endif        case ContextMenuItemTagUnderline: {            ExceptionCode ec = 0;            RefPtr<CSSStyleDeclaration> style = frame->document()->createCSSStyleDeclaration();            style->setProperty(CSSPropertyWebkitTextDecorationsInEffect, "underline", false, ec);            shouldCheck = frame->editor()->selectionHasStyle(style.get()) != FalseTriState;            shouldEnable = frame->editor()->canEditRichly();            break;        }        case ContextMenuItemTagLookUpInDictionary:            shouldEnable = frame->selection()->isRange();            break;        case ContextMenuItemTagCheckGrammarWithSpelling:#ifndef BUILDING_ON_TIGER            if (frame->editor()->isGrammarCheckingEnabled())                shouldCheck = true;            shouldEnable = true;#endif            break;        case ContextMenuItemTagItalic: {            ExceptionCode ec = 0;            RefPtr<CSSStyleDeclaration> style = frame->document()->createCSSStyleDeclaration();            style->setProperty(CSSPropertyFontStyle, "italic", false, ec);            shouldCheck = frame->editor()->selectionHasStyle(style.get()) != FalseTriState;            shouldEnable = frame->editor()->canEditRichly();            break;        }        case ContextMenuItemTagBold: {            ExceptionCode ec = 0;            RefPtr<CSSStyleDeclaration> style = frame->document()->createCSSStyleDeclaration();            style->setProperty(CSSPropertyFontWeight, "bold", false, ec);            shouldCheck = frame->editor()->selectionHasStyle(style.get()) != FalseTriState;            shouldEnable = frame->editor()->canEditRichly();            break;        }        case ContextMenuItemTagOutline:            shouldEnable = false;            break;        case ContextMenuItemTagShowSpellingPanel:#ifndef BUILDING_ON_TIGER            if (frame->editor()->spellingPanelIsShowing())                item.setTitle(contextMenuItemTagShowSpellingPanel(false));            else                item.setTitle(contextMenuItemTagShowSpellingPanel(true));#endif            shouldEnable = frame->editor()->canEdit();            break;        case ContextMenuItemTagNoGuessesFound:            shouldEnable = false;            break;        case ContextMenuItemTagCheckSpellingWhileTyping:            shouldCheck = frame->editor()->isContinuousSpellCheckingEnabled();            break;#if PLATFORM(GTK)        case ContextMenuItemTagGoBack:            shouldEnable = frame->loader()->canGoBackOrForward(-1);            break;        case ContextMenuItemTagGoForward:            shouldEnable = frame->loader()->canGoBackOrForward(1);            break;        case ContextMenuItemTagStop:            shouldEnable = frame->loader()->documentLoader()->isLoadingInAPISense();            break;        case ContextMenuItemTagReload:            shouldEnable = !frame->loader()->documentLoader()->isLoadingInAPISense();            break;        case ContextMenuItemTagFontMenu:            shouldEnable = frame->editor()->canEditRichly();            break;#else        case ContextMenuItemTagGoBack:        case ContextMenuItemTagGoForward:        case ContextMenuItemTagStop:        case ContextMenuItemTagReload:        case ContextMenuItemTagFontMenu:#endif        case ContextMenuItemTagNoAction:        case ContextMenuItemTagOpenLinkInNewWindow:        case ContextMenuItemTagDownloadLinkToDisk:        case ContextMenuItemTagCopyLinkToClipboard:        case ContextMenuItemTagOpenImageInNewWindow:        case ContextMenuItemTagDownloadImageToDisk:        case ContextMenuItemTagCopyImageToClipboard:        case ContextMenuItemTagOpenFrameInNewWindow:        case ContextMenuItemTagSpellingGuess:        case ContextMenuItemTagOther:        case ContextMenuItemTagSearchInSpotlight:        case ContextMenuItemTagSearchWeb:        case ContextMenuItemTagOpenWithDefaultApplication:        case ContextMenuItemPDFActualSize:        case ContextMenuItemPDFZoomIn:        case ContextMenuItemPDFZoomOut:        case ContextMenuItemPDFAutoSize:        case ContextMenuItemPDFSinglePage:        case ContextMenuItemPDFFacingPages:        case ContextMenuItemPDFContinuous:        case ContextMenuItemPDFNextPage:        case ContextMenuItemPDFPreviousPage:        case ContextMenuItemTagOpenLink:        case ContextMenuItemTagIgnoreGrammar:        case ContextMenuItemTagSpellingMenu:        case ContextMenuItemTagShowFonts:        case ContextMenuItemTagStyles:        case ContextMenuItemTagShowColors:        case ContextMenuItemTagSpeechMenu:        case ContextMenuItemTagStartSpeaking:        case ContextMenuItemTagStopSpeaking:        case ContextMenuItemTagWritingDirectionMenu:        case ContextMenuItemTagTextDirectionMenu:        case ContextMenuItemTagPDFSinglePageScrolling:        case ContextMenuItemTagPDFFacingPagesScrolling:        case ContextMenuItemTagInspectElement:        case ContextMenuItemBaseApplicationTag:            break;    }    item.setChecked(shouldCheck);    item.setEnabled(shouldEnable);}}

⌨️ 快捷键说明

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