initial import
[vuplus_webkit] / Source / WebKit2 / UIProcess / win / WebContextMenuProxyWin.cpp
1 /*
2  * Copyright (C) 2010 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27 #include "WebContextMenuProxyWin.h"
28
29 #include <WebCore/NotImplemented.h>
30
31 using namespace WebCore;
32
33 namespace WebKit {
34
35 WebContextMenuProxyWin::WebContextMenuProxyWin(HWND parentWindow, WebPageProxy* page)
36     : m_window(parentWindow)
37     , m_page(page)
38     , m_menu(0)
39 {
40 }
41
42 void WebContextMenuProxyWin::populateMenu(HMENU menu, const Vector<WebContextMenuItemData>& items)
43 {
44     for (size_t i = 0; i < items.size(); ++i) {
45         const WebContextMenuItemData& itemData = items[i];
46         switch (itemData.type()) {
47         case ActionType:
48         case CheckableActionType: {
49             UINT flags = itemData.enabled() ? MF_ENABLED : MF_DISABLED;
50             if (itemData.checked())
51                 flags |= MF_CHECKED;
52             String title = itemData.title();
53             ::AppendMenu(menu, flags, itemData.action(), title.charactersWithNullTermination());
54
55             m_actionMap.add(itemData.action(), itemData);
56             break;
57         }
58         case SeparatorType:
59             ::AppendMenu(menu, MF_SEPARATOR, 0, 0);
60             break;
61         case SubmenuType: {
62             HMENU subMenu = ::CreatePopupMenu();
63             populateMenu(subMenu, itemData.submenu());
64             String title = itemData.title();
65             ::AppendMenu(menu, MF_POPUP, reinterpret_cast<UINT>(subMenu), title.charactersWithNullTermination());
66             break;
67         }
68         default:
69             ASSERT_NOT_REACHED();
70         }
71     }
72 }
73
74 void WebContextMenuProxyWin::showContextMenu(const IntPoint& origin, const Vector<WebContextMenuItemData>& items)
75 {
76     if (items.isEmpty())
77         return;
78
79     // Hide any context menu we have showing (this also destroys the menu).
80     hideContextMenu();
81
82     m_menu = ::CreatePopupMenu();
83     populateMenu(m_menu, items);
84
85     POINT point = POINT(origin);
86     if (!::ClientToScreen(m_window, &point))
87         return;
88
89     UINT flags = TPM_RIGHTBUTTON | TPM_TOPALIGN | TPM_VERPOSANIMATION | TPM_HORIZONTAL | TPM_LEFTALIGN | TPM_HORPOSANIMATION | TPM_RETURNCMD | TPM_NONOTIFY;
90     int selectedCommand = ::TrackPopupMenuEx(m_menu, flags, point.x, point.y, m_window, 0);
91     if (!selectedCommand)
92         return;
93
94     m_page->contextMenuItemSelected(m_actionMap.get(selectedCommand));
95 }
96
97 void WebContextMenuProxyWin::hideContextMenu()
98 {
99     if (m_menu) {
100         ::DestroyMenu(m_menu);
101         m_menu = 0;
102     }
103
104     m_actionMap.clear();
105 }
106
107 } // namespace WebKit