Reviewed by Mitz. Landed by Niko.
[WebKit-https.git] / WebCore / platform / ContextMenu.h
1 /*
2  * Copyright (C) 2006 Apple Computer, 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 COMPUTER, INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #ifndef ContextMenu_h
27 #define ContextMenu_h
28
29 #include "HitTestResult.h"
30 #include "PlatformString.h"
31
32 #if PLATFORM(MAC)
33 #ifdef __OBJC__
34 @class NSMutableArray;
35 #else
36 class NSMutableArray;
37 #endif
38 #elif PLATFORM(WIN)
39 typedef struct HMENU__* HMENU;
40 #elif PLATFORM(QT)
41 class QMenu;
42 #endif
43
44 namespace WebCore {
45
46 // This enum needs to be in sync with WebMenuItemTag, which is defined in WebUIDelegate.h
47 enum ContextMenuAction {
48     ContextMenuItemTagNoAction=0, // This item is not actually in WebUIDelegate.h
49     ContextMenuItemTagOpenLinkInNewWindow=1,
50     ContextMenuItemTagDownloadLinkToDisk,
51     ContextMenuItemTagCopyLinkToClipboard,
52     ContextMenuItemTagOpenImageInNewWindow,
53     ContextMenuItemTagDownloadImageToDisk,
54     ContextMenuItemTagCopyImageToClipboard,
55     ContextMenuItemTagOpenFrameInNewWindow,
56     ContextMenuItemTagCopy,
57     ContextMenuItemTagGoBack,
58     ContextMenuItemTagGoForward,
59     ContextMenuItemTagStop,
60     ContextMenuItemTagReload,
61     ContextMenuItemTagCut,
62     ContextMenuItemTagPaste,
63     ContextMenuItemTagSpellingGuess,
64     ContextMenuItemTagNoGuessesFound,
65     ContextMenuItemTagIgnoreSpelling,
66     ContextMenuItemTagLearnSpelling,
67     ContextMenuItemTagOther,
68     ContextMenuItemTagSearchInSpotlight,
69     ContextMenuItemTagSearchWeb,
70     ContextMenuItemTagLookUpInDictionary,
71     ContextMenuItemTagOpenWithDefaultApplication,
72     ContextMenuItemPDFActualSize,
73     ContextMenuItemPDFZoomIn,
74     ContextMenuItemPDFZoomOut,
75     ContextMenuItemPDFAutoSize,
76     ContextMenuItemPDFSinglePage,
77     ContextMenuItemPDFFacingPages,
78     ContextMenuItemPDFContinuous,
79     ContextMenuItemPDFNextPage,
80     ContextMenuItemPDFPreviousPage,
81 };
82
83 enum ContextMenuItemType {
84     ActionType,
85     SeparatorType,
86     SubmenuType
87 };
88
89 struct ContextMenuItem {
90     ContextMenuItem()
91         : type(SeparatorType)
92         , action(ContextMenuItemTagNoAction)
93         , title(String())
94     {
95     }
96
97     ContextMenuItem(ContextMenuItemType theType, ContextMenuAction theAction, const String& theTitle)
98         : type(theType)
99         , action(theAction)
100         , title(theTitle)
101     {
102     }
103
104     // FIXME: Need to support submenus (perhaps a Vector<ContextMenuItem>*?)
105     // FIXME: Do we need a keyboard accelerator here?
106
107     ContextMenuItemType type;
108     ContextMenuAction action;
109     String title;
110 };
111
112 #if PLATFORM(MAC)
113 typedef NSMutableArray* PlatformMenuDescription;
114 #elif PLATFORM(WIN)
115 typedef HMENU PlatformMenuDescription;
116 #elif PLATFORM(QT)
117 typedef QMenu* PlatformMenuDescription;
118 #endif
119
120 class ContextMenu : Noncopyable
121 {
122 public:
123     ContextMenu(HitTestResult result)
124         : m_hitTestResult(result)
125         , m_menu(0)
126     {
127     }
128
129     void populate();
130
131     // FIXME: Implement these
132     void show() {}
133     void hide() {}
134
135     void insertItem(unsigned position, ContextMenuItem);
136     void appendItem(ContextMenuItem item);
137
138     unsigned itemCount();
139
140     HitTestResult hitTestResult() const { return m_hitTestResult; }
141
142     PlatformMenuDescription platformMenuDescription() { return m_menu; }
143     void setPlatformMenuDescription(PlatformMenuDescription menu);
144
145 private:
146     HitTestResult m_hitTestResult;
147     PlatformMenuDescription m_menu;
148 };
149
150 }
151
152 #endif // ContextMenu_h