diff -r 000000000000 -r 4f2f89ce4247 WebCore/platform/PopupMenu.h --- /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 +#include + +#if PLATFORM(MAC) +#include +#ifdef __OBJC__ +@class NSPopUpButtonCell; +#else +class NSPopUpButtonCell; +#endif +#elif PLATFORM(WIN) +#include "Scrollbar.h" +#include "ScrollbarClient.h" +#include +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 +#include +#elif PLATFORM(WX) +#ifdef __WXMSW__ +#include +#endif +class wxMenu; +#include +#include +#elif PLATFORM(CHROMIUM) +#include "PopupMenuPrivate.h" +#elif PLATFORM(HAIKU) +namespace WebCore { +class PopupMenuHaiku; +} +#endif + +namespace WebCore { + +class FrameView; +class Scrollbar; + +class PopupMenu : public RefCounted +#if PLATFORM(WIN) + , private ScrollbarClient +#endif +#if PLATFORM(WX) + , public wxEvtHandler +#endif +{ +public: + static PassRefPtr 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 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 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 m_popup; + HashMap 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