165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch/*
265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Copyright (C) 2010 Apple Inc. All rights reserved.
365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *
565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Redistribution and use in source and binary forms, with or without
665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * modification, are permitted provided that the following conditions
765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * are met:
865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 1. Redistributions of source code must retain the above copyright
965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    notice, this list of conditions and the following disclaimer.
1065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 2. Redistributions in binary form must reproduce the above copyright
1165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    notice, this list of conditions and the following disclaimer in the
1265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    documentation and/or other materials provided with the distribution.
1365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *
1465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
1565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
1665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
1765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
1865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
1965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
2465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE POSSIBILITY OF SUCH DAMAGE.
2565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch */
2665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "config.h"
2865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebContextMenuProxyQt.h"
2965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
3065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <IntPoint.h>
3181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include <OwnPtr.h>
3265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebContextMenuItemData.h>
3365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <qmenu.h>
3465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <qwkpage.h>
3565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
3665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochusing namespace WebCore;
3765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
3865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochnamespace WebKit {
3965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
4065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic QWKPage::WebAction webActionForContextMenuAction(WebCore::ContextMenuAction action)
4165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
4265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    switch (action) {
4365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case WebCore::ContextMenuItemTagOpenLink:
4465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return QWKPage::OpenLink;
4565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case WebCore::ContextMenuItemTagOpenLinkInNewWindow:
4665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return QWKPage::OpenLinkInNewWindow;
4765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case WebCore::ContextMenuItemTagCopyLinkToClipboard:
4865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return QWKPage::CopyLinkToClipboard;
4965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case WebCore::ContextMenuItemTagOpenImageInNewWindow:
5065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return QWKPage::OpenImageInNewWindow;
5165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case WebCore::ContextMenuItemTagGoBack:
5265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return QWKPage::Back;
5365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case WebCore::ContextMenuItemTagGoForward:
5465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return QWKPage::Forward;
5565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case WebCore::ContextMenuItemTagStop:
5665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return QWKPage::Stop;
5765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case WebCore::ContextMenuItemTagReload:
5865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return QWKPage::Reload;
5965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case WebCore::ContextMenuItemTagCut:
6065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return QWKPage::Cut;
6165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case WebCore::ContextMenuItemTagCopy:
6265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return QWKPage::Copy;
6365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case WebCore::ContextMenuItemTagPaste:
6465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return QWKPage::Paste;
6565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case WebCore::ContextMenuItemTagSelectAll:
6665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return QWKPage::SelectAll;
6765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    default:
6865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        break;
6965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
7065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return QWKPage::NoWebAction;
7165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
7265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochWebContextMenuProxyQt::WebContextMenuProxyQt(QWKPage* page)
7465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    : m_page(page)
7565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
7665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
7765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPassRefPtr<WebContextMenuProxyQt> WebContextMenuProxyQt::create(QWKPage* page)
7965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
8065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return adoptRef(new WebContextMenuProxyQt(page));
8165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
8265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebContextMenuProxyQt::showContextMenu(const IntPoint& position, const Vector<WebContextMenuItemData>& items)
8465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
852bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (items.isEmpty())
862bde8e466a4451c7319e3a072d118917957d6554Steve Block        return;
872bde8e466a4451c7319e3a072d118917957d6554Steve Block
8881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    OwnPtr<QMenu> menu = createContextMenu(items);
8981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
9081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // We send the signal, even with no items, because the client should be able to show custom items
9181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // even if WebKit has nothing to show.
9281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (!menu)
9381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        menu = adoptPtr(new QMenu);
9481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
9581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    menu->move(position);
9681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    emit m_page->showContextMenu(QSharedPointer<QMenu>(menu.leakPtr()));
9765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
9865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebContextMenuProxyQt::hideContextMenu()
10065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
10165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
10265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
10381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochPassOwnPtr<QMenu> WebContextMenuProxyQt::createContextMenu(const Vector<WebContextMenuItemData>& items) const
10465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
10581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    OwnPtr<QMenu> menu = adoptPtr(new QMenu);
10665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    for (int i = 0; i < items.size(); ++i) {
10765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        const WebContextMenuItemData& item = items.at(i);
10865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        switch (item.type()) {
10965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        case WebCore::CheckableActionType: /* fall through */
11065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        case WebCore::ActionType: {
11165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            QWKPage::WebAction action = webActionForContextMenuAction(item.action());
11265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            QAction* qtAction = m_page->action(action);
11365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            if (qtAction) {
11465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                qtAction->setEnabled(item.enabled());
11565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                qtAction->setChecked(item.checked());
11665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                qtAction->setCheckable(item.type() == WebCore::CheckableActionType);
11765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                menu->addAction(qtAction);
11965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            }
12065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            break;
12165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
12265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        case WebCore::SeparatorType:
12365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            menu->addSeparator();
12465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            break;
12565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        case WebCore::SubmenuType:
12681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            if (OwnPtr<QMenu> subMenu = createContextMenu(item.submenu())) {
12781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                subMenu->setParent(menu.get());
12881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                QMenu* const subMenuPtr = subMenu.leakPtr();
12965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                subMenu->setTitle(item.title());
13081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                menu->addMenu(subMenuPtr);
13165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            }
13265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
13365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            break;
13465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
13565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
13665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
13765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Do not show sub-menus with just disabled actions.
13881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (menu->isEmpty())
13981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return PassOwnPtr<QMenu>();
14081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
14165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    bool isAnyActionEnabled = false;
14265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    QList<QAction *> actions = menu->actions();
14365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    for (int i = 0; i < actions.count(); ++i) {
14465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (actions.at(i)->isVisible())
14565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            isAnyActionEnabled |= actions.at(i)->isEnabled();
14665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
14781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (!isAnyActionEnabled)
14881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return PassOwnPtr<QMenu>();
14965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
15081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return menu.release();
15165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
15265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
15365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} // namespace WebKit
154