1/*
2 * Copyright (C) 2010 Apple 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 INC. AND ITS CONTRIBUTORS ``AS IS''
14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23 * THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#ifndef WebPopupMenuProxyWin_h
27#define WebPopupMenuProxyWin_h
28
29#include "PlatformPopupMenuData.h"
30#include "WebPopupItem.h"
31#include "WebPopupMenuProxy.h"
32#include <WebCore/Scrollbar.h>
33#include <WebCore/ScrollableArea.h>
34
35typedef struct HWND__* HWND;
36typedef struct HDC__* HDC;
37typedef struct HBITMAP__* HBITMAP;
38
39namespace WebKit {
40
41class WebView;
42
43class WebPopupMenuProxyWin : public WebPopupMenuProxy, private WebCore::ScrollableArea  {
44public:
45    static PassRefPtr<WebPopupMenuProxyWin> create(WebView* webView, WebPopupMenuProxy::Client* client)
46    {
47        return adoptRef(new WebPopupMenuProxyWin(webView, client));
48    }
49    ~WebPopupMenuProxyWin();
50
51    virtual void showPopupMenu(const WebCore::IntRect&, WebCore::TextDirection, double scaleFactor, const Vector<WebPopupItem>&, const PlatformPopupMenuData&, int32_t selectedIndex);
52    virtual void hidePopupMenu();
53
54    bool setFocusedIndex(int index, bool hotTracking = false);
55
56    void hide() { hidePopupMenu(); }
57
58private:
59    WebPopupMenuProxyWin(WebView*, WebPopupMenuProxy::Client*);
60
61    WebCore::Scrollbar* scrollbar() const { return m_scrollbar.get(); }
62
63    // ScrollableArea
64    virtual int scrollSize(WebCore::ScrollbarOrientation) const;
65    virtual int scrollPosition(WebCore::Scrollbar*) const;
66    virtual void setScrollOffset(const WebCore::IntPoint&);
67    virtual void invalidateScrollbarRect(WebCore::Scrollbar*, const WebCore::IntRect&);
68    virtual void invalidateScrollCornerRect(const WebCore::IntRect&) { }
69    virtual bool isActive() const { return true; }
70    virtual bool isScrollCornerVisible() const { return false; }
71    virtual WebCore::IntRect scrollCornerRect() const { return WebCore::IntRect(); }
72    virtual WebCore::Scrollbar* verticalScrollbar() const { return m_scrollbar.get(); }
73
74    // NOTE: This should only be called by the overriden setScrollOffset from ScrollableArea.
75    void scrollTo(int offset);
76
77    static bool registerWindowClass();
78    static LRESULT CALLBACK WebPopupMenuProxyWndProc(HWND, UINT, WPARAM, LPARAM);
79    LRESULT wndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
80
81    // Message pump messages.
82    LRESULT onMouseActivate(HWND, UINT message, WPARAM, LPARAM, bool& handled);
83    LRESULT onSize(HWND, UINT message, WPARAM, LPARAM, bool& handled);
84    LRESULT onKeyDown(HWND, UINT message, WPARAM, LPARAM, bool& handled);
85    LRESULT onChar(HWND, UINT message, WPARAM, LPARAM, bool& handled);
86    LRESULT onMouseMove(HWND, UINT message, WPARAM, LPARAM, bool& handled);
87    LRESULT onLButtonDown(HWND, UINT message, WPARAM, LPARAM, bool& handled);
88    LRESULT onLButtonUp(HWND, UINT message, WPARAM, LPARAM, bool& handled);
89    LRESULT onMouseWheel(HWND, UINT message, WPARAM, LPARAM, bool& handled);
90    LRESULT onPaint(HWND, UINT message, WPARAM, LPARAM, bool& handled);
91    LRESULT onPrintClient(HWND, UINT message, WPARAM, LPARAM, bool& handled);
92
93    void calculatePositionAndSize(const WebCore::IntRect&);
94    WebCore::IntRect clientRect() const;
95    void invalidateItem(int index);
96
97    int itemHeight() const { return m_itemHeight; }
98    const WebCore::IntRect& windowRect() const { return m_windowRect; }
99    int wheelDelta() const { return m_wheelDelta; }
100    void setWasClicked(bool b = true) { m_wasClicked = b; }
101    bool wasClicked() const { return m_wasClicked; }
102    void setScrollOffset(int offset) { m_scrollOffset = offset; }
103    int scrollOffset() const { return m_scrollOffset; }
104    bool scrollbarCapturingMouse() const { return m_scrollbarCapturingMouse; }
105    void setScrollbarCapturingMouse(bool b) { m_scrollbarCapturingMouse = b; }
106
107
108    bool up(unsigned lines = 1);
109    bool down(unsigned lines = 1);
110
111    void paint(const WebCore::IntRect& damageRect, HDC = 0);
112    int visibleItems() const;
113    int listIndexAtPoint(const WebCore::IntPoint&) const;
114    int focusedIndex() const;
115    void focusFirst();
116    void focusLast();
117    bool scrollToRevealSelection();
118    void incrementWheelDelta(int delta);
119    void reduceWheelDelta(int delta);
120
121    WebView* m_webView;
122    Vector<WebPopupItem> m_items;
123    PlatformPopupMenuData m_data;
124    int m_newSelectedIndex;
125
126    RefPtr<WebCore::Scrollbar> m_scrollbar;
127    HWND m_popup;
128    HDC m_DC;
129    HBITMAP m_bmp;
130    WebCore::IntRect m_windowRect;
131
132    int m_itemHeight;
133    int m_scrollOffset;
134    int m_wheelDelta;
135    int m_focusedIndex;
136    bool m_wasClicked;
137    bool m_scrollbarCapturingMouse;
138    bool m_showPopup;
139};
140
141} // namespace WebKit
142
143#endif // WebPopupMenuProxyWin_h
144