Home | History | Annotate | Download | only in platform
      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 ContextMenuItem_h
     27 #define ContextMenuItem_h
     28 
     29 #include "PlatformMenuDescription.h"
     30 #include "PlatformString.h"
     31 #include <wtf/OwnPtr.h>
     32 
     33 #if PLATFORM(MAC)
     34 #include <wtf/RetainPtr.h>
     35 
     36 #ifdef __OBJC__
     37 @class NSMenuItem;
     38 #else
     39 class NSMenuItem;
     40 #endif
     41 #elif PLATFORM(WIN)
     42 typedef struct tagMENUITEMINFOW* LPMENUITEMINFO;
     43 #elif PLATFORM(GTK)
     44 typedef struct _GtkMenuItem GtkMenuItem;
     45 #elif PLATFORM(QT)
     46 #include <QAction>
     47 #elif PLATFORM(WX)
     48 class wxMenuItem;
     49 #elif PLATFORM(HAIKU)
     50 class BMenuItem;
     51 #endif
     52 
     53 namespace WebCore {
     54 
     55     class ContextMenu;
     56 
     57     // This enum needs to be in sync with the WebMenuItemTag enum in WebUIDelegate.h and the
     58     // extra values in WebUIDelegatePrivate.h
     59     enum ContextMenuAction {
     60         ContextMenuItemTagNoAction=0, // This item is not actually in WebUIDelegate.h
     61         ContextMenuItemTagOpenLinkInNewWindow=1,
     62         ContextMenuItemTagDownloadLinkToDisk,
     63         ContextMenuItemTagCopyLinkToClipboard,
     64         ContextMenuItemTagOpenImageInNewWindow,
     65         ContextMenuItemTagDownloadImageToDisk,
     66         ContextMenuItemTagCopyImageToClipboard,
     67         ContextMenuItemTagOpenFrameInNewWindow,
     68         ContextMenuItemTagCopy,
     69         ContextMenuItemTagGoBack,
     70         ContextMenuItemTagGoForward,
     71         ContextMenuItemTagStop,
     72         ContextMenuItemTagReload,
     73         ContextMenuItemTagCut,
     74         ContextMenuItemTagPaste,
     75 #if PLATFORM(GTK)
     76         ContextMenuItemTagDelete,
     77         ContextMenuItemTagSelectAll,
     78         ContextMenuItemTagInputMethods,
     79         ContextMenuItemTagUnicode,
     80 #endif
     81         ContextMenuItemTagSpellingGuess,
     82         ContextMenuItemTagNoGuessesFound,
     83         ContextMenuItemTagIgnoreSpelling,
     84         ContextMenuItemTagLearnSpelling,
     85         ContextMenuItemTagOther,
     86         ContextMenuItemTagSearchInSpotlight,
     87         ContextMenuItemTagSearchWeb,
     88         ContextMenuItemTagLookUpInDictionary,
     89         ContextMenuItemTagOpenWithDefaultApplication,
     90         ContextMenuItemPDFActualSize,
     91         ContextMenuItemPDFZoomIn,
     92         ContextMenuItemPDFZoomOut,
     93         ContextMenuItemPDFAutoSize,
     94         ContextMenuItemPDFSinglePage,
     95         ContextMenuItemPDFFacingPages,
     96         ContextMenuItemPDFContinuous,
     97         ContextMenuItemPDFNextPage,
     98         ContextMenuItemPDFPreviousPage,
     99         // These are new tags! Not a part of API!!!!
    100         ContextMenuItemTagOpenLink = 2000,
    101         ContextMenuItemTagIgnoreGrammar,
    102         ContextMenuItemTagSpellingMenu, // Spelling or Spelling/Grammar sub-menu
    103         ContextMenuItemTagShowSpellingPanel,
    104         ContextMenuItemTagCheckSpelling,
    105         ContextMenuItemTagCheckSpellingWhileTyping,
    106         ContextMenuItemTagCheckGrammarWithSpelling,
    107         ContextMenuItemTagFontMenu, // Font sub-menu
    108         ContextMenuItemTagShowFonts,
    109         ContextMenuItemTagBold,
    110         ContextMenuItemTagItalic,
    111         ContextMenuItemTagUnderline,
    112         ContextMenuItemTagOutline,
    113         ContextMenuItemTagStyles,
    114         ContextMenuItemTagShowColors,
    115         ContextMenuItemTagSpeechMenu, // Speech sub-menu
    116         ContextMenuItemTagStartSpeaking,
    117         ContextMenuItemTagStopSpeaking,
    118         ContextMenuItemTagWritingDirectionMenu, // Writing Direction sub-menu
    119         ContextMenuItemTagDefaultDirection,
    120         ContextMenuItemTagLeftToRight,
    121         ContextMenuItemTagRightToLeft,
    122         ContextMenuItemTagPDFSinglePageScrolling,
    123         ContextMenuItemTagPDFFacingPagesScrolling,
    124 #if ENABLE(INSPECTOR)
    125         ContextMenuItemTagInspectElement,
    126 #endif
    127         ContextMenuItemTagTextDirectionMenu, // Text Direction sub-menu
    128         ContextMenuItemTagTextDirectionDefault,
    129         ContextMenuItemTagTextDirectionLeftToRight,
    130         ContextMenuItemTagTextDirectionRightToLeft,
    131 #if PLATFORM(MAC)
    132         ContextMenuItemTagCorrectSpellingAutomatically,
    133         ContextMenuItemTagSubstitutionsMenu,
    134         ContextMenuItemTagShowSubstitutions,
    135         ContextMenuItemTagSmartCopyPaste,
    136         ContextMenuItemTagSmartQuotes,
    137         ContextMenuItemTagSmartDashes,
    138         ContextMenuItemTagSmartLinks,
    139         ContextMenuItemTagTextReplacement,
    140         ContextMenuItemTagTransformationsMenu,
    141         ContextMenuItemTagMakeUpperCase,
    142         ContextMenuItemTagMakeLowerCase,
    143         ContextMenuItemTagCapitalize,
    144         ContextMenuItemTagChangeBack,
    145 #endif
    146         ContextMenuItemBaseCustomTag = 5000,
    147         ContextMenuItemBaseApplicationTag = 10000
    148     };
    149 
    150     enum ContextMenuItemType {
    151         ActionType,
    152         CheckableActionType,
    153         SeparatorType,
    154         SubmenuType
    155     };
    156 
    157 #if PLATFORM(MAC)
    158     typedef NSMenuItem* PlatformMenuItemDescription;
    159 #elif PLATFORM(WIN)
    160     typedef LPMENUITEMINFO PlatformMenuItemDescription;
    161 #elif PLATFORM(QT)
    162     struct PlatformMenuItemDescription {
    163         PlatformMenuItemDescription()
    164             : type(ActionType),
    165               action(ContextMenuItemTagNoAction),
    166               checked(false),
    167               enabled(true)
    168         {}
    169 
    170         ContextMenuItemType type;
    171         ContextMenuAction action;
    172         String title;
    173         QList<ContextMenuItem> subMenuItems;
    174         bool checked;
    175         bool enabled;
    176     };
    177 #elif PLATFORM(GTK)
    178     struct PlatformMenuItemDescription {
    179         PlatformMenuItemDescription()
    180             : type(ActionType)
    181             , action(ContextMenuItemTagNoAction)
    182             , subMenu(0)
    183             , checked(false)
    184             , enabled(true)
    185         {}
    186 
    187         ContextMenuItemType type;
    188         ContextMenuAction action;
    189         String title;
    190         GtkMenu* subMenu;
    191         bool checked;
    192         bool enabled;
    193     };
    194 #elif defined ANDROID
    195     typedef void* PlatformMenuItemDescription;
    196 #elif PLATFORM(WX)
    197     struct PlatformMenuItemDescription {
    198         PlatformMenuItemDescription()
    199             : type(ActionType),
    200               action(ContextMenuItemTagNoAction),
    201               checked(false),
    202               enabled(true)
    203         {}
    204 
    205         ContextMenuItemType type;
    206         ContextMenuAction action;
    207         String title;
    208         wxMenu * subMenu;
    209         bool checked;
    210         bool enabled;
    211     };
    212 #elif PLATFORM(HAIKU)
    213     typedef BMenuItem* PlatformMenuItemDescription;
    214 #elif PLATFORM(CHROMIUM)
    215     struct PlatformMenuItemDescription {
    216         PlatformMenuItemDescription()
    217             : type(ActionType)
    218             , action(ContextMenuItemTagNoAction)
    219             , checked(false)
    220             , enabled(true) { }
    221         ContextMenuItemType type;
    222         ContextMenuAction action;
    223         String title;
    224         bool checked;
    225         bool enabled;
    226     };
    227 #else
    228     typedef void* PlatformMenuItemDescription;
    229 #endif
    230 
    231     class ContextMenuItem : public FastAllocBase {
    232     public:
    233         ContextMenuItem(PlatformMenuItemDescription);
    234         ContextMenuItem(ContextMenu* subMenu = 0);
    235         ContextMenuItem(ContextMenuItemType type, ContextMenuAction action, const String& title, ContextMenu* subMenu = 0);
    236 #if PLATFORM(GTK)
    237         ContextMenuItem(GtkMenuItem*);
    238 #endif
    239         ~ContextMenuItem();
    240 
    241         PlatformMenuItemDescription releasePlatformDescription();
    242 
    243         ContextMenuItemType type() const;
    244         void setType(ContextMenuItemType);
    245 
    246         ContextMenuAction action() const;
    247         void setAction(ContextMenuAction);
    248 
    249         String title() const;
    250         void setTitle(const String&);
    251 
    252         PlatformMenuDescription platformSubMenu() const;
    253         void setSubMenu(ContextMenu*);
    254 
    255         void setChecked(bool = true);
    256         bool checked() const;
    257 
    258         void setEnabled(bool = true);
    259         bool enabled() const;
    260 
    261         // FIXME: Do we need a keyboard accelerator here?
    262 #if PLATFORM(GTK)
    263         static GtkMenuItem* createNativeMenuItem(const PlatformMenuItemDescription&);
    264 #endif
    265 
    266     private:
    267 #if PLATFORM(MAC)
    268         RetainPtr<NSMenuItem> m_platformDescription;
    269 #else
    270         PlatformMenuItemDescription m_platformDescription;
    271 #endif
    272     };
    273 
    274 }
    275 
    276 #endif // ContextMenuItem_h
    277