WebCore/platform/PopupMenu.h
changeset 0 4f2f89ce4247
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WebCore/platform/PopupMenu.h	Fri Sep 17 09:02:29 2010 +0300
@@ -0,0 +1,200 @@
+/*
+ * Copyright (C) 2006, 2008 Apple Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef PopupMenu_h
+#define PopupMenu_h
+
+#include "IntRect.h"
+#include "PopupMenuClient.h"
+#include <wtf/PassRefPtr.h>
+#include <wtf/RefCounted.h>
+
+#if PLATFORM(MAC)
+#include <wtf/RetainPtr.h>
+#ifdef __OBJC__
+@class NSPopUpButtonCell;
+#else
+class NSPopUpButtonCell;
+#endif
+#elif PLATFORM(WIN)
+#include "Scrollbar.h"
+#include "ScrollbarClient.h"
+#include <wtf/RefPtr.h>
+typedef struct HWND__* HWND;
+typedef struct HDC__* HDC;
+typedef struct HBITMAP__* HBITMAP;
+#elif PLATFORM(QT)
+namespace WebCore {
+class QtAbstractWebPopup;
+}
+#elif PLATFORM(GTK)
+typedef struct _GtkMenu GtkMenu;
+typedef struct _GtkMenuItem GtkMenuItem;
+typedef struct _GtkWidget GtkWidget;
+#include "GRefPtrGtk.h"
+#include <wtf/HashMap.h>
+#include <glib.h>
+#elif PLATFORM(WX)
+#ifdef __WXMSW__
+#include <wx/msw/winundef.h>
+#endif
+class wxMenu;
+#include <wx/defs.h>
+#include <wx/event.h>
+#elif PLATFORM(CHROMIUM)
+#include "PopupMenuPrivate.h"
+#elif PLATFORM(HAIKU)
+namespace WebCore {
+class PopupMenuHaiku;
+}
+#endif
+
+namespace WebCore {
+
+class FrameView;
+class Scrollbar;
+
+class PopupMenu : public RefCounted<PopupMenu>
+#if PLATFORM(WIN)
+                , private ScrollbarClient
+#endif
+#if PLATFORM(WX)
+                , public wxEvtHandler
+#endif
+{
+public:
+    static PassRefPtr<PopupMenu> create(PopupMenuClient* client) { return adoptRef(new PopupMenu(client)); }
+    ~PopupMenu();
+    
+    void disconnectClient() { m_popupClient = 0; }
+
+    void show(const IntRect&, FrameView*, int index);
+    void hide();
+
+    void updateFromElement();
+    
+    PopupMenuClient* client() const { return m_popupClient; }
+
+    static bool itemWritingDirectionIsNatural();
+
+#if PLATFORM(WIN)
+    Scrollbar* scrollbar() const { return m_scrollbar.get(); }
+
+    static LPCTSTR popupClassName();
+
+    bool up(unsigned lines = 1);
+    bool down(unsigned lines = 1);
+
+    int itemHeight() const { return m_itemHeight; }
+    const IntRect& windowRect() const { return m_windowRect; }
+    IntRect clientRect() const;
+
+    int visibleItems() const;
+
+    int listIndexAtPoint(const IntPoint&) const;
+
+    bool setFocusedIndex(int index, bool hotTracking = false);
+    int focusedIndex() const;
+    void focusFirst();
+    void focusLast();
+
+    void paint(const IntRect& damageRect, HDC = 0);
+
+    HWND popupHandle() const { return m_popup; }
+
+    void setWasClicked(bool b = true) { m_wasClicked = b; }
+    bool wasClicked() const { return m_wasClicked; }
+
+    void setScrollOffset(int offset) { m_scrollOffset = offset; }
+    int scrollOffset() const { return m_scrollOffset; }
+
+    bool scrollToRevealSelection();
+
+    void incrementWheelDelta(int delta);
+    void reduceWheelDelta(int delta);
+    int wheelDelta() const { return m_wheelDelta; }
+
+    bool scrollbarCapturingMouse() const { return m_scrollbarCapturingMouse; }
+    void setScrollbarCapturingMouse(bool b) { m_scrollbarCapturingMouse = b; }
+#endif
+
+protected:
+    PopupMenu(PopupMenuClient*);
+    
+private:
+    PopupMenuClient* m_popupClient;
+    
+#if PLATFORM(MAC)
+    void clear();
+    void populate();
+
+    RetainPtr<NSPopUpButtonCell> m_popup;
+#elif PLATFORM(QT)
+    QtAbstractWebPopup* m_popup;
+#elif PLATFORM(WIN)
+    // ScrollBarClient
+    virtual void valueChanged(Scrollbar*);
+    virtual void invalidateScrollbarRect(Scrollbar*, const IntRect&);
+    virtual bool isActive() const { return true; }
+    virtual bool scrollbarCornerPresent() const { return false; }
+
+    void calculatePositionAndSize(const IntRect&, FrameView*);
+    void invalidateItem(int index);
+
+    static LRESULT CALLBACK PopupMenuWndProc(HWND, UINT, WPARAM, LPARAM);
+    LRESULT wndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
+    static void registerClass();
+
+    RefPtr<Scrollbar> m_scrollbar;
+    HWND m_popup;
+    HDC m_DC;
+    HBITMAP m_bmp;
+    bool m_wasClicked;
+    IntRect m_windowRect;
+    int m_itemHeight;
+    int m_scrollOffset;
+    int m_wheelDelta;
+    int m_focusedIndex;
+    bool m_scrollbarCapturingMouse;
+    bool m_showPopup;
+#elif PLATFORM(GTK)
+    IntPoint m_menuPosition;
+    GRefPtr<GtkMenu> m_popup;
+    HashMap<GtkWidget*, int> m_indexMap;
+    static void menuItemActivated(GtkMenuItem* item, PopupMenu*);
+    static void menuUnmapped(GtkWidget*, PopupMenu*);
+    static void menuPositionFunction(GtkMenu*, gint*, gint*, gboolean*, PopupMenu*);
+    static void menuRemoveItem(GtkWidget*, PopupMenu*);
+#elif PLATFORM(EFL) || PLATFORM(BREWMP)
+    FrameView* m_view;
+#elif PLATFORM(WX)
+    wxMenu* m_menu;
+    void OnMenuItemSelected(wxCommandEvent&);
+#elif PLATFORM(CHROMIUM)
+    PopupMenuPrivate p;
+#elif PLATFORM(HAIKU)
+    PopupMenuHaiku* m_menu;
+#endif
+
+};
+
+}
+
+#endif