/* * Copyright (C) 2010 Apple Inc. All rights reserved. * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. */ #include "config.h" #include "WebContextMenuProxyQt.h" #include <IntPoint.h> #include <OwnPtr.h> #include <WebContextMenuItemData.h> #include <qmenu.h> #include <qwkpage.h> using namespace WebCore; namespace WebKit { static QWKPage::WebAction webActionForContextMenuAction(WebCore::ContextMenuAction action) { switch (action) { case WebCore::ContextMenuItemTagOpenLink: return QWKPage::OpenLink; case WebCore::ContextMenuItemTagOpenLinkInNewWindow: return QWKPage::OpenLinkInNewWindow; case WebCore::ContextMenuItemTagCopyLinkToClipboard: return QWKPage::CopyLinkToClipboard; case WebCore::ContextMenuItemTagOpenImageInNewWindow: return QWKPage::OpenImageInNewWindow; case WebCore::ContextMenuItemTagGoBack: return QWKPage::Back; case WebCore::ContextMenuItemTagGoForward: return QWKPage::Forward; case WebCore::ContextMenuItemTagStop: return QWKPage::Stop; case WebCore::ContextMenuItemTagReload: return QWKPage::Reload; case WebCore::ContextMenuItemTagCut: return QWKPage::Cut; case WebCore::ContextMenuItemTagCopy: return QWKPage::Copy; case WebCore::ContextMenuItemTagPaste: return QWKPage::Paste; case WebCore::ContextMenuItemTagSelectAll: return QWKPage::SelectAll; default: break; } return QWKPage::NoWebAction; } WebContextMenuProxyQt::WebContextMenuProxyQt(QWKPage* page) : m_page(page) { } PassRefPtr<WebContextMenuProxyQt> WebContextMenuProxyQt::create(QWKPage* page) { return adoptRef(new WebContextMenuProxyQt(page)); } void WebContextMenuProxyQt::showContextMenu(const IntPoint& position, const Vector<WebContextMenuItemData>& items) { if (items.isEmpty()) return; OwnPtr<QMenu> menu = createContextMenu(items); // We send the signal, even with no items, because the client should be able to show custom items // even if WebKit has nothing to show. if (!menu) menu = adoptPtr(new QMenu); menu->move(position); emit m_page->showContextMenu(QSharedPointer<QMenu>(menu.leakPtr())); } void WebContextMenuProxyQt::hideContextMenu() { } PassOwnPtr<QMenu> WebContextMenuProxyQt::createContextMenu(const Vector<WebContextMenuItemData>& items) const { OwnPtr<QMenu> menu = adoptPtr(new QMenu); for (int i = 0; i < items.size(); ++i) { const WebContextMenuItemData& item = items.at(i); switch (item.type()) { case WebCore::CheckableActionType: /* fall through */ case WebCore::ActionType: { QWKPage::WebAction action = webActionForContextMenuAction(item.action()); QAction* qtAction = m_page->action(action); if (qtAction) { qtAction->setEnabled(item.enabled()); qtAction->setChecked(item.checked()); qtAction->setCheckable(item.type() == WebCore::CheckableActionType); menu->addAction(qtAction); } break; } case WebCore::SeparatorType: menu->addSeparator(); break; case WebCore::SubmenuType: if (OwnPtr<QMenu> subMenu = createContextMenu(item.submenu())) { subMenu->setParent(menu.get()); QMenu* const subMenuPtr = subMenu.leakPtr(); subMenu->setTitle(item.title()); menu->addMenu(subMenuPtr); } break; } } // Do not show sub-menus with just disabled actions. if (menu->isEmpty()) return PassOwnPtr<QMenu>(); bool isAnyActionEnabled = false; QList<QAction *> actions = menu->actions(); for (int i = 0; i < actions.count(); ++i) { if (actions.at(i)->isVisible()) isAnyActionEnabled |= actions.at(i)->isEnabled(); } if (!isAnyActionEnabled) return PassOwnPtr<QMenu>(); return menu.release(); } } // namespace WebKit