1 /* 2 * Copyright (C) 2006 Apple Computer, Inc. All rights reserved. 3 * Copyright (C) 2010 Igalia S.L 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 15 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 17 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 18 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 19 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 20 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 21 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 22 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 */ 26 27 #ifndef ContextMenuItem_h 28 #define ContextMenuItem_h 29 30 #include "PlatformMenuDescription.h" 31 #include "PlatformString.h" 32 #include <wtf/OwnPtr.h> 33 34 #if PLATFORM(MAC) 35 #include <wtf/RetainPtr.h> 36 37 #ifdef __OBJC__ 38 @class NSMenuItem; 39 #else 40 class NSMenuItem; 41 #endif 42 #elif PLATFORM(WIN) 43 typedef struct tagMENUITEMINFOW MENUITEMINFO; 44 #elif PLATFORM(GTK) 45 typedef struct _GtkMenuItem GtkMenuItem; 46 #elif PLATFORM(QT) 47 #include <QAction> 48 #elif PLATFORM(WX) 49 class wxMenuItem; 50 #elif PLATFORM(HAIKU) 51 class BMenuItem; 52 #endif 53 54 namespace WebCore { 55 56 class ContextMenu; 57 58 // This enum needs to be in sync with the WebMenuItemTag enum in WebUIDelegate.h and the 59 // extra values in WebUIDelegatePrivate.h 60 enum ContextMenuAction { 61 ContextMenuItemTagNoAction=0, // This item is not actually in WebUIDelegate.h 62 ContextMenuItemTagOpenLinkInNewWindow=1, 63 ContextMenuItemTagDownloadLinkToDisk, 64 ContextMenuItemTagCopyLinkToClipboard, 65 ContextMenuItemTagOpenImageInNewWindow, 66 ContextMenuItemTagDownloadImageToDisk, 67 ContextMenuItemTagCopyImageToClipboard, 68 #if PLATFORM(QT) || PLATFORM(GTK) 69 ContextMenuItemTagCopyImageUrlToClipboard, 70 #endif 71 ContextMenuItemTagOpenFrameInNewWindow, 72 ContextMenuItemTagCopy, 73 ContextMenuItemTagGoBack, 74 ContextMenuItemTagGoForward, 75 ContextMenuItemTagStop, 76 ContextMenuItemTagReload, 77 ContextMenuItemTagCut, 78 ContextMenuItemTagPaste, 79 #if PLATFORM(GTK) 80 ContextMenuItemTagDelete, 81 #endif 82 #if PLATFORM(GTK) || PLATFORM(QT) 83 ContextMenuItemTagSelectAll, 84 #endif 85 #if PLATFORM(GTK) 86 ContextMenuItemTagInputMethods, 87 ContextMenuItemTagUnicode, 88 #endif 89 ContextMenuItemTagSpellingGuess, 90 ContextMenuItemTagNoGuessesFound, 91 ContextMenuItemTagIgnoreSpelling, 92 ContextMenuItemTagLearnSpelling, 93 ContextMenuItemTagOther, 94 ContextMenuItemTagSearchInSpotlight, 95 ContextMenuItemTagSearchWeb, 96 ContextMenuItemTagLookUpInDictionary, 97 ContextMenuItemTagOpenWithDefaultApplication, 98 ContextMenuItemPDFActualSize, 99 ContextMenuItemPDFZoomIn, 100 ContextMenuItemPDFZoomOut, 101 ContextMenuItemPDFAutoSize, 102 ContextMenuItemPDFSinglePage, 103 ContextMenuItemPDFFacingPages, 104 ContextMenuItemPDFContinuous, 105 ContextMenuItemPDFNextPage, 106 ContextMenuItemPDFPreviousPage, 107 // These are new tags! Not a part of API!!!! 108 ContextMenuItemTagOpenLink = 2000, 109 ContextMenuItemTagIgnoreGrammar, 110 ContextMenuItemTagSpellingMenu, // Spelling or Spelling/Grammar sub-menu 111 ContextMenuItemTagShowSpellingPanel, 112 ContextMenuItemTagCheckSpelling, 113 ContextMenuItemTagCheckSpellingWhileTyping, 114 ContextMenuItemTagCheckGrammarWithSpelling, 115 ContextMenuItemTagFontMenu, // Font sub-menu 116 ContextMenuItemTagShowFonts, 117 ContextMenuItemTagBold, 118 ContextMenuItemTagItalic, 119 ContextMenuItemTagUnderline, 120 ContextMenuItemTagOutline, 121 ContextMenuItemTagStyles, 122 ContextMenuItemTagShowColors, 123 ContextMenuItemTagSpeechMenu, // Speech sub-menu 124 ContextMenuItemTagStartSpeaking, 125 ContextMenuItemTagStopSpeaking, 126 ContextMenuItemTagWritingDirectionMenu, // Writing Direction sub-menu 127 ContextMenuItemTagDefaultDirection, 128 ContextMenuItemTagLeftToRight, 129 ContextMenuItemTagRightToLeft, 130 ContextMenuItemTagPDFSinglePageScrolling, 131 ContextMenuItemTagPDFFacingPagesScrolling, 132 #if ENABLE(INSPECTOR) 133 ContextMenuItemTagInspectElement, 134 #endif 135 ContextMenuItemTagTextDirectionMenu, // Text Direction sub-menu 136 ContextMenuItemTagTextDirectionDefault, 137 ContextMenuItemTagTextDirectionLeftToRight, 138 ContextMenuItemTagTextDirectionRightToLeft, 139 #if PLATFORM(MAC) 140 ContextMenuItemTagCorrectSpellingAutomatically, 141 ContextMenuItemTagSubstitutionsMenu, 142 ContextMenuItemTagShowSubstitutions, 143 ContextMenuItemTagSmartCopyPaste, 144 ContextMenuItemTagSmartQuotes, 145 ContextMenuItemTagSmartDashes, 146 ContextMenuItemTagSmartLinks, 147 ContextMenuItemTagTextReplacement, 148 ContextMenuItemTagTransformationsMenu, 149 ContextMenuItemTagMakeUpperCase, 150 ContextMenuItemTagMakeLowerCase, 151 ContextMenuItemTagCapitalize, 152 ContextMenuItemTagChangeBack, 153 #endif 154 ContextMenuItemTagOpenMediaInNewWindow, 155 ContextMenuItemTagCopyMediaLinkToClipboard, 156 ContextMenuItemTagToggleMediaControls, 157 ContextMenuItemTagToggleMediaLoop, 158 ContextMenuItemTagEnterVideoFullscreen, 159 ContextMenuItemTagMediaPlayPause, 160 ContextMenuItemTagMediaMute, 161 ContextMenuItemBaseCustomTag = 5000, 162 ContextMenuItemCustomTagNoAction = 5998, 163 ContextMenuItemLastCustomTag = 5999, 164 ContextMenuItemBaseApplicationTag = 10000 165 }; 166 167 enum ContextMenuItemType { 168 ActionType, 169 CheckableActionType, 170 SeparatorType, 171 SubmenuType 172 }; 173 174 #if PLATFORM(MAC) 175 typedef NSMenuItem* PlatformMenuItemDescription; 176 #elif PLATFORM(QT) 177 struct PlatformMenuItemDescription { 178 PlatformMenuItemDescription() 179 : type(ActionType), 180 action(ContextMenuItemTagNoAction), 181 checked(false), 182 enabled(true) 183 {} 184 185 ContextMenuItemType type; 186 ContextMenuAction action; 187 String title; 188 QList<ContextMenuItem> subMenuItems; 189 bool checked; 190 bool enabled; 191 }; 192 #elif PLATFORM(GTK) 193 typedef GtkMenuItem* PlatformMenuItemDescription; 194 #elif PLATFORM(WX) 195 struct PlatformMenuItemDescription { 196 PlatformMenuItemDescription() 197 : type(ActionType), 198 action(ContextMenuItemTagNoAction), 199 checked(false), 200 enabled(true) 201 {} 202 203 ContextMenuItemType type; 204 ContextMenuAction action; 205 String title; 206 wxMenu * subMenu; 207 bool checked; 208 bool enabled; 209 }; 210 #elif PLATFORM(HAIKU) 211 typedef BMenuItem* PlatformMenuItemDescription; 212 #elif PLATFORM(CHROMIUM) 213 struct PlatformMenuItemDescription { 214 PlatformMenuItemDescription() 215 : type(ActionType) 216 , action(ContextMenuItemTagNoAction) 217 , checked(false) 218 , enabled(true) { } 219 ContextMenuItemType type; 220 ContextMenuAction action; 221 String title; 222 bool checked; 223 bool enabled; 224 }; 225 #else 226 typedef void* PlatformMenuItemDescription; 227 #endif 228 229 class ContextMenuItem { 230 WTF_MAKE_FAST_ALLOCATED; 231 public: 232 ContextMenuItem(ContextMenuItemType, ContextMenuAction, const String&, ContextMenu* subMenu = 0); 233 ContextMenuItem(ContextMenuItemType, ContextMenuAction, const String&, bool enabled, bool checked); 234 235 ~ContextMenuItem(); 236 237 void setType(ContextMenuItemType); 238 ContextMenuItemType type() const; 239 240 void setAction(ContextMenuAction); 241 ContextMenuAction action() const; 242 243 void setChecked(bool = true); 244 bool checked() const; 245 246 void setEnabled(bool = true); 247 bool enabled() const; 248 249 void setSubMenu(ContextMenu*); 250 251 #if USE(CROSS_PLATFORM_CONTEXT_MENUS) 252 #if PLATFORM(WIN) 253 typedef MENUITEMINFO NativeItem; 254 #elif PLATFORM(EFL) 255 typedef void* NativeItem; 256 #endif 257 ContextMenuItem(ContextMenuAction, const String&, bool enabled, bool checked, const Vector<ContextMenuItem>& subMenuItems); 258 explicit ContextMenuItem(const NativeItem&); 259 260 // On Windows, the title (dwTypeData of the MENUITEMINFO) is not set in this function. Callers can set the title themselves, 261 // and handle the lifetime of the title, if they need it. 262 NativeItem nativeMenuItem() const; 263 264 void setTitle(const String& title) { m_title = title; } 265 const String& title() const { return m_title; } 266 267 const Vector<ContextMenuItem>& subMenuItems() const { return m_subMenuItems; } 268 #else 269 public: 270 ContextMenuItem(PlatformMenuItemDescription); 271 ContextMenuItem(ContextMenu* subMenu = 0); 272 ContextMenuItem(ContextMenuAction, const String&, bool enabled, bool checked, Vector<ContextMenuItem>& submenuItems); 273 274 PlatformMenuItemDescription releasePlatformDescription(); 275 276 String title() const; 277 void setTitle(const String&); 278 279 PlatformMenuDescription platformSubMenu() const; 280 void setSubMenu(Vector<ContextMenuItem>&); 281 282 #endif // USE(CROSS_PLATFORM_CONTEXT_MENUS) 283 private: 284 #if USE(CROSS_PLATFORM_CONTEXT_MENUS) 285 String m_title; 286 bool m_enabled; 287 bool m_checked; 288 ContextMenuAction m_action; 289 ContextMenuItemType m_type; 290 Vector<ContextMenuItem> m_subMenuItems; 291 #else 292 #if PLATFORM(MAC) 293 RetainPtr<NSMenuItem> m_platformDescription; 294 #else 295 PlatformMenuItemDescription m_platformDescription; 296 #endif 297 #endif // USE(CROSS_PLATFORM_CONTEXT_MENUS) 298 }; 299 300 } 301 302 #endif // ContextMenuItem_h 303