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 <wtf/Noncopyable.h> 30 31 #include "ContextMenuItem.h" 32 #include "PlatformMenuDescription.h" 33 #include "PlatformString.h" 34 #if PLATFORM(MAC) 35 #include <wtf/RetainPtr.h> 36 #elif PLATFORM(QT) 37 #include <QMenu> 38 #endif 39 40 namespace WebCore { 41 42 class ContextMenuController; 43 44 class ContextMenu { 45 WTF_MAKE_NONCOPYABLE(ContextMenu); WTF_MAKE_FAST_ALLOCATED; 46 public: 47 ContextMenu(); 48 49 ContextMenuItem* itemWithAction(unsigned); 50 51 #if USE(CROSS_PLATFORM_CONTEXT_MENUS) 52 #if PLATFORM(WIN) 53 typedef HMENU NativeMenu; 54 #elif PLATFORM(EFL) 55 typedef void* NativeMenu; 56 #endif 57 explicit ContextMenu(NativeMenu); 58 59 NativeMenu nativeMenu() const; 60 61 static NativeMenu createNativeMenuFromItems(const Vector<ContextMenuItem>&); 62 static void getContextMenuItems(NativeMenu, Vector<ContextMenuItem>&); 63 64 // FIXME: When more platforms switch over, this should return const ContextMenuItem*'s. itemAtIndex(unsigned index)65 ContextMenuItem* itemAtIndex(unsigned index) { return &m_items[index]; } 66 setItems(const Vector<ContextMenuItem> & items)67 void setItems(const Vector<ContextMenuItem>& items) { m_items = items; } items()68 const Vector<ContextMenuItem>& items() const { return m_items; } 69 appendItem(const ContextMenuItem & item)70 void appendItem(const ContextMenuItem& item) { m_items.append(item); } 71 #else 72 ContextMenu(const PlatformMenuDescription); 73 ~ContextMenu(); 74 75 void insertItem(unsigned position, ContextMenuItem&); 76 void appendItem(ContextMenuItem&); 77 78 ContextMenuItem* itemAtIndex(unsigned, const PlatformMenuDescription); 79 80 unsigned itemCount() const; 81 82 PlatformMenuDescription platformDescription() const; 83 void setPlatformDescription(PlatformMenuDescription); 84 85 PlatformMenuDescription releasePlatformDescription(); 86 87 #if PLATFORM(WX) 88 static ContextMenuItem* itemWithId(int); 89 #endif 90 91 #endif // USE(CROSS_PLATFORM_CONTEXT_MENUS) 92 93 private: 94 #if USE(CROSS_PLATFORM_CONTEXT_MENUS) 95 Vector<ContextMenuItem> m_items; 96 #else 97 #if PLATFORM(MAC) 98 // Keep this in sync with the PlatformMenuDescription typedef 99 RetainPtr<NSMutableArray> m_platformDescription; 100 #elif PLATFORM(QT) 101 QList<ContextMenuItem> m_items; 102 #elif PLATFORM(CHROMIUM) 103 Vector<ContextMenuItem> m_items; 104 #else 105 PlatformMenuDescription m_platformDescription; 106 #if OS(WINCE) 107 unsigned m_itemCount; 108 #endif 109 #endif 110 111 #endif // USE(CROSS_PLATFORM_CONTEXT_MENUS) 112 }; 113 114 #if !USE(CROSS_PLATFORM_CONTEXT_MENUS) 115 Vector<ContextMenuItem> contextMenuItemVector(PlatformMenuDescription); 116 PlatformMenuDescription platformMenuDescription(Vector<ContextMenuItem>&); 117 #endif 118 119 } 120 121 #endif // ContextMenu_h 122