//! Insert a menu item at specified position. ContextMenuItem* ContextMenu::insertItem(unsigned int idx, const std::string& text, int commandId, bool enabled, bool hasSubMenu, bool checked, bool autoChecking) { ContextMenuItem* newItem = new ContextMenuItem( this, text ); newItem->setEnabled( enabled ); newItem->setSubElement( true ); newItem->setChecked( checked ); newItem->setAutoChecking( autoChecking ); newItem->setText( text ); newItem->setFlag( ContextMenuItem::drawSubmenuSprite ); newItem->setIsSeparator( text.empty() ); newItem->setCommandId( commandId ); sendChildToBack( newItem ); if (hasSubMenu) { ContextMenu* subMenu = newItem->addSubMenu( commandId ); subMenu->setVisible( false ); } if ( idx < _d->items.size() ) { _d->items.insert( _d->items.begin() + idx, newItem ); } else { _d->items.push_back( newItem ); } return newItem; }
v8::Handle<v8::Value> V8InspectorFrontendHost::showContextMenuCallback(const v8::Arguments& args) { if (args.Length() < 2) return v8::Undefined(); v8::Local<v8::Object> eventWrapper = v8::Local<v8::Object>::Cast(args[0]); if (!V8MouseEvent::info.equals(V8DOMWrapper::domWrapperType(eventWrapper))) return v8::Undefined(); Event* event = V8Event::toNative(eventWrapper); if (!args[1]->IsArray()) return v8::Undefined(); v8::Local<v8::Array> array = v8::Local<v8::Array>::Cast(args[1]); Vector<ContextMenuItem*> items; for (size_t i = 0; i < array->Length(); ++i) { v8::Local<v8::Object> item = v8::Local<v8::Object>::Cast(array->Get(v8::Integer::New(i))); v8::Local<v8::Value> type = item->Get(v8::String::New("type")); v8::Local<v8::Value> id = item->Get(v8::String::New("id")); v8::Local<v8::Value> label = item->Get(v8::String::New("label")); v8::Local<v8::Value> enabled = item->Get(v8::String::New("enabled")); v8::Local<v8::Value> checked = item->Get(v8::String::New("checked")); if (!type->IsString()) continue; String typeString = toWebCoreStringWithNullCheck(type); if (typeString == "separator") { items.append(new ContextMenuItem(SeparatorType, ContextMenuItemCustomTagNoAction, String())); } else { ContextMenuAction typedId = static_cast<ContextMenuAction>(ContextMenuItemBaseCustomTag + id->ToInt32()->Value()); ContextMenuItem* menuItem = new ContextMenuItem((typeString == "checkbox" ? CheckableActionType : ActionType), typedId, toWebCoreStringWithNullCheck(label)); if (checked->IsBoolean()) menuItem->setChecked(checked->ToBoolean()->Value()); if (enabled->IsBoolean()) menuItem->setEnabled(enabled->ToBoolean()->Value()); items.append(menuItem); } } InspectorFrontendHost* frontendHost = V8InspectorFrontendHost::toNative(args.Holder()); frontendHost->showContextMenu(event, items); return v8::Undefined(); }
JSValue JSInspectorFrontendHost::showContextMenu(ExecState* exec) { if (exec->argumentCount() < 2) return jsUndefined(); #if ENABLE(CONTEXT_MENUS) Event* event = toEvent(exec->argument(0)); JSArray* array = asArray(exec->argument(1)); Vector<ContextMenuItem*> items; for (size_t i = 0; i < array->length(); ++i) { JSObject* item = asObject(array->getIndex(i)); JSValue label = item->get(exec, Identifier(exec, "label")); JSValue type = item->get(exec, Identifier(exec, "type")); JSValue id = item->get(exec, Identifier(exec, "id")); JSValue enabled = item->get(exec, Identifier(exec, "enabled")); JSValue checked = item->get(exec, Identifier(exec, "checked")); if (!type.isString()) continue; String typeString = ustringToString(type.toString(exec)->value(exec)); if (typeString == "separator") { items.append(new ContextMenuItem(SeparatorType, ContextMenuItemCustomTagNoAction, String())); } else { ContextMenuAction typedId = static_cast<ContextMenuAction>(ContextMenuItemBaseCustomTag + id.toInt32(exec)); ContextMenuItem* menuItem = new ContextMenuItem((typeString == "checkbox" ? CheckableActionType : ActionType), typedId, ustringToString(label.toString(exec)->value(exec))); if (!enabled.isUndefined()) menuItem->setEnabled(enabled.toBoolean(exec)); if (!checked.isUndefined()) menuItem->setChecked(checked.toBoolean(exec)); items.append(menuItem); } } impl()->showContextMenu(event, items); #endif return jsUndefined(); }
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); }