Home | History | Annotate | Download | only in platform
      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