Remove "virtual" from all lines that have both "virtual" and "override".
[WebKit-https.git] / Source / WebCore / platform / win / PopupMenuWin.h
1 /*
2  * Copyright (C) 2011, 2015 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 "COMPtr.h"
25 #include "IntRect.h"
26 #include "PopupMenu.h"
27 #include "PopupMenuClient.h"
28 #include "ScrollableArea.h"
29 #include "Scrollbar.h"
30 #include <OleAcc.h>
31 #include <wtf/PassRefPtr.h>
32 #include <wtf/RefCounted.h>
33 #include <wtf/RefPtr.h>
34 #include <wtf/win/GDIObject.h>
35
36 namespace WebCore {
37
38 class FrameView;
39 class Scrollbar;
40 class AccessiblePopupMenu;
41
42 class PopupMenuWin : public PopupMenu, private ScrollableArea {
43 public:
44     PopupMenuWin(PopupMenuClient*);
45     ~PopupMenuWin();
46
47     virtual void show(const IntRect&, FrameView*, int index);
48     virtual void hide();
49     virtual void updateFromElement();
50     virtual void disconnectClient();
51
52     static LPCWSTR popupClassName();
53
54 private:
55     PopupMenuClient* client() const { return m_popupClient; }
56
57     Scrollbar* scrollbar() const { return m_scrollbar.get(); }
58
59     bool up(unsigned lines = 1);
60     bool down(unsigned lines = 1);
61
62     int itemHeight() const { return m_itemHeight; }
63     const IntRect& windowRect() const { return m_windowRect; }
64     IntRect clientRect() const;
65
66     int visibleItems() const;
67
68     int listIndexAtPoint(const IntPoint&) const;
69
70     bool setFocusedIndex(int index, bool hotTracking = false);
71     int focusedIndex() const;
72     void focusFirst();
73     void focusLast();
74
75     void paint(const IntRect& damageRect, HDC = 0);
76
77     HWND popupHandle() const { return m_popup; }
78
79     void setWasClicked(bool b = true) { m_wasClicked = b; }
80     bool wasClicked() const { return m_wasClicked; }
81
82     int scrollOffset() const { return m_scrollOffset; }
83
84     bool scrollToRevealSelection();
85
86     void incrementWheelDelta(int delta);
87     void reduceWheelDelta(int delta);
88     int wheelDelta() const { return m_wheelDelta; }
89
90     bool scrollbarCapturingMouse() const { return m_scrollbarCapturingMouse; }
91     void setScrollbarCapturingMouse(bool b) { m_scrollbarCapturingMouse = b; }
92
93     // ScrollableArea
94     int scrollSize(ScrollbarOrientation) const override;
95     int scrollOffset(ScrollbarOrientation) const override;
96     void setScrollOffset(const IntPoint&) override;
97     void invalidateScrollbarRect(Scrollbar*, const IntRect&) override;
98     void invalidateScrollCornerRect(const IntRect&) override { }
99     bool isActive() const override { return true; }
100     ScrollableArea* enclosingScrollableArea() const override { return 0; }
101     bool isScrollableOrRubberbandable() override { return true; }
102     bool hasScrollableOrRubberbandableAncestor() override { return true; }
103     bool isScrollCornerVisible() const override { return false; }
104     IntRect scrollCornerRect() const override { return IntRect(); }
105     Scrollbar* verticalScrollbar() const override { return m_scrollbar.get(); }
106     IntSize visibleSize() const override;
107     IntSize contentsSize() const override;
108     IntRect scrollableAreaBoundingBox(bool* = nullptr) const override;
109     bool updatesScrollLayerPositionOnMainThread() const override { return true; }
110     bool forceUpdateScrollbarsOnMainThreadForPerformanceTesting() const override { return false; }
111
112     // NOTE: This should only be called by the overriden setScrollOffset from ScrollableArea.
113     void scrollTo(int offset);
114
115     void calculatePositionAndSize(const IntRect&, FrameView*);
116     void invalidateItem(int index);
117
118     bool onGetObject(WPARAM wParam, LPARAM lParam, LRESULT& lResult);
119
120     static LRESULT CALLBACK PopupMenuWndProc(HWND, UINT, WPARAM, LPARAM);
121     LRESULT wndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
122     static void registerClass();
123
124     RefPtr<Scrollbar> m_scrollbar;
125     COMPtr<IAccessible> m_accessiblePopupMenu;
126     GDIObject<HDC> m_DC;
127     GDIObject<HBITMAP> m_bmp;
128     PopupMenuClient* m_popupClient;
129     HWND m_popup { nullptr };
130     IntRect m_windowRect;
131     int m_itemHeight { 0 };
132     int m_scrollOffset { 0 };
133     int m_wheelDelta { 0 };
134     int m_focusedIndex { 0 };
135     int m_hoveredIndex { 0 };
136     bool m_wasClicked { false };
137     bool m_scrollbarCapturingMouse { false };
138     bool m_showPopup { false };
139
140     friend class AccessiblePopupMenu;
141 };
142
143 class AccessiblePopupMenu : public IAccessible {
144 public:
145     AccessiblePopupMenu(const PopupMenuWin&);
146     ~AccessiblePopupMenu();
147
148     // IUnknown
149     virtual HRESULT STDMETHODCALLTYPE QueryInterface(_In_ REFIID, _COM_Outptr_ void**);
150     virtual ULONG STDMETHODCALLTYPE AddRef();
151     virtual ULONG STDMETHODCALLTYPE Release();
152
153     // IDispatch - Not to be implemented.
154     virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount(_Out_ UINT* count);
155     virtual HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT, LCID, _COM_Outptr_opt_ ITypeInfo**);
156     virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames(_In_ REFIID, __in_ecount(cNames) LPOLESTR*, UINT cNames, LCID, __out_ecount_full(cNames) DISPID*);
157     virtual HRESULT STDMETHODCALLTYPE Invoke(DISPID, REFIID, LCID, WORD, DISPPARAMS*, VARIANT*, EXCEPINFO*, UINT*);
158
159     // IAccessible
160     virtual HRESULT STDMETHODCALLTYPE get_accParent(_COM_Outptr_opt_ IDispatch**);
161     virtual HRESULT STDMETHODCALLTYPE get_accChildCount(_Out_ long*);
162     virtual HRESULT STDMETHODCALLTYPE get_accChild(VARIANT vChild, _COM_Outptr_opt_ IDispatch** ppChild);
163     virtual HRESULT STDMETHODCALLTYPE get_accName(VARIANT vChild, __deref_out_opt BSTR*);
164     virtual HRESULT STDMETHODCALLTYPE get_accValue(VARIANT vChild, __deref_out_opt BSTR*);
165     virtual HRESULT STDMETHODCALLTYPE get_accDescription(VARIANT, __deref_out_opt BSTR*);
166     virtual HRESULT STDMETHODCALLTYPE get_accRole(VARIANT vChild, _Out_ VARIANT* pvRole);
167     virtual HRESULT STDMETHODCALLTYPE get_accState(VARIANT vChild, _Out_ VARIANT* pvState);
168     virtual HRESULT STDMETHODCALLTYPE get_accHelp(VARIANT vChild, __deref_out_opt BSTR* helpText);
169     virtual HRESULT STDMETHODCALLTYPE get_accKeyboardShortcut(VARIANT vChild, __deref_out_opt BSTR*);
170     virtual HRESULT STDMETHODCALLTYPE get_accFocus(_Out_ VARIANT* pvFocusedChild);
171     virtual HRESULT STDMETHODCALLTYPE get_accSelection(_Out_ VARIANT* pvSelectedChild);
172     virtual HRESULT STDMETHODCALLTYPE get_accDefaultAction(VARIANT vChild, __deref_out_opt BSTR* actionDescription);
173     virtual HRESULT STDMETHODCALLTYPE accSelect(long selectionFlags, VARIANT vChild);
174     virtual HRESULT STDMETHODCALLTYPE accLocation(_Out_ long* left, _Out_ long* top, _Out_ long* width, _Out_ long* height, VARIANT vChild);
175     virtual HRESULT STDMETHODCALLTYPE accNavigate(long direction, VARIANT vFromChild, _Out_ VARIANT* pvNavigatedTo);
176     virtual HRESULT STDMETHODCALLTYPE accHitTest(long x, long y, _Out_ VARIANT* pvChildAtPoint);
177     virtual HRESULT STDMETHODCALLTYPE accDoDefaultAction(VARIANT vChild);
178     virtual HRESULT STDMETHODCALLTYPE put_accName(VARIANT, _In_ BSTR);
179     virtual HRESULT STDMETHODCALLTYPE put_accValue(VARIANT, _In_ BSTR);
180     virtual HRESULT STDMETHODCALLTYPE get_accHelpTopic(BSTR* helpFile, VARIANT, _Out_ long* topicID);
181
182 private:
183     int m_refCount { 0 };
184     const PopupMenuWin& m_popupMenu;
185 };
186
187 } // namespace WebCore
188
189 #endif // PopupMenuWin_h