9b6bd8d49ea931f33cfcfc9b54fb306320918aca
[WebKit-https.git] / Source / WebCore / platform / win / PopupMenuWin.h
1 /*
2  * Copyright (C) 2011 Apple Inc. All rights reserved.
3  * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Library General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Library General Public License for more details.
14  *
15  * You should have received a copy of the GNU Library General Public License
16  * along with this library; see the file COPYING.LIB.  If not, write to
17  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18  * Boston, MA 02110-1301, USA.
19  */
20
21 #ifndef PopupMenuWin_h
22 #define PopupMenuWin_h
23
24 #include "IntRect.h"
25 #include "PopupMenu.h"
26 #include "PopupMenuClient.h"
27 #include "ScrollableArea.h"
28 #include "Scrollbar.h"
29 #include <wtf/PassRefPtr.h>
30 #include <wtf/RefCounted.h>
31 #include <wtf/RefPtr.h>
32 #include <wtf/win/GDIObject.h>
33
34 namespace WebCore {
35
36 class FrameView;
37 class Scrollbar;
38
39 class PopupMenuWin : public PopupMenu, private ScrollableArea {
40 public:
41     PopupMenuWin(PopupMenuClient*);
42     ~PopupMenuWin();
43
44     virtual void show(const IntRect&, FrameView*, int index);
45     virtual void hide();
46     virtual void updateFromElement();
47     virtual void disconnectClient();
48
49     static LPCWSTR popupClassName();
50
51 private:
52     PopupMenuClient* client() const { return m_popupClient; }
53
54     Scrollbar* scrollbar() const { return m_scrollbar.get(); }
55
56     bool up(unsigned lines = 1);
57     bool down(unsigned lines = 1);
58
59     int itemHeight() const { return m_itemHeight; }
60     const IntRect& windowRect() const { return m_windowRect; }
61     IntRect clientRect() const;
62
63     int visibleItems() const;
64
65     int listIndexAtPoint(const IntPoint&) const;
66
67     bool setFocusedIndex(int index, bool hotTracking = false);
68     int focusedIndex() const;
69     void focusFirst();
70     void focusLast();
71
72     void paint(const IntRect& damageRect, HDC = 0);
73
74     HWND popupHandle() const { return m_popup; }
75
76     void setWasClicked(bool b = true) { m_wasClicked = b; }
77     bool wasClicked() const { return m_wasClicked; }
78
79     int scrollOffset() const { return m_scrollOffset; }
80
81     bool scrollToRevealSelection();
82
83     void incrementWheelDelta(int delta);
84     void reduceWheelDelta(int delta);
85     int wheelDelta() const { return m_wheelDelta; }
86
87     bool scrollbarCapturingMouse() const { return m_scrollbarCapturingMouse; }
88     void setScrollbarCapturingMouse(bool b) { m_scrollbarCapturingMouse = b; }
89
90     // ScrollableArea
91     virtual int scrollSize(ScrollbarOrientation) const override;
92     virtual int scrollPosition(Scrollbar*) const override;
93     virtual void setScrollOffset(const IntPoint&) override;
94     virtual void invalidateScrollbarRect(Scrollbar*, const IntRect&) override;
95     virtual void invalidateScrollCornerRect(const IntRect&) override { }
96     virtual bool isActive() const override { return true; }
97     ScrollableArea* enclosingScrollableArea() const override { return 0; }
98     virtual bool isScrollableOrRubberbandable() override { return true; }
99     virtual bool hasScrollableOrRubberbandableAncestor() override { return true; }
100     virtual bool isScrollCornerVisible() const override { return false; }
101     virtual IntRect scrollCornerRect() const override { return IntRect(); }
102     virtual Scrollbar* verticalScrollbar() const override { return m_scrollbar.get(); }
103     virtual IntSize visibleSize() const override;
104     virtual IntSize contentsSize() const override;
105     virtual IntRect scrollableAreaBoundingBox() const override;
106     virtual bool updatesScrollLayerPositionOnMainThread() const override { return true; }
107     virtual bool forceUpdateScrollbarsOnMainThreadForPerformanceTesting() const override { return false; }
108
109     // NOTE: This should only be called by the overriden setScrollOffset from ScrollableArea.
110     void scrollTo(int offset);
111
112     void calculatePositionAndSize(const IntRect&, FrameView*);
113     void invalidateItem(int index);
114
115     static LRESULT CALLBACK PopupMenuWndProc(HWND, UINT, WPARAM, LPARAM);
116     LRESULT wndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
117     static void registerClass();
118
119     PopupMenuClient* m_popupClient;
120     RefPtr<Scrollbar> m_scrollbar;
121     HWND m_popup;
122     GDIObject<HDC> m_DC;
123     GDIObject<HBITMAP> m_bmp;
124     bool m_wasClicked;
125     IntRect m_windowRect;
126     int m_itemHeight;
127     int m_scrollOffset;
128     int m_wheelDelta;
129     int m_focusedIndex;
130     int m_hoveredIndex;
131     bool m_scrollbarCapturingMouse;
132     bool m_showPopup;
133 };
134
135 } // namespace WebCore
136
137 #endif // PopupMenuWin_h