/*
* Copyright (C) 2010 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef WebPopupMenuProxyWin_h
#define WebPopupMenuProxyWin_h
#include "PlatformPopupMenuData.h"
#include "WebPopupItem.h"
#include "WebPopupMenuProxy.h"
#include <WebCore/Scrollbar.h>
#include <WebCore/ScrollableArea.h>
typedef struct HWND__* HWND;
typedef struct HDC__* HDC;
typedef struct HBITMAP__* HBITMAP;
namespace WebKit {
class WebView;
class WebPopupMenuProxyWin : public WebPopupMenuProxy, private WebCore::ScrollableArea {
public:
static PassRefPtr<WebPopupMenuProxyWin> create(WebView* webView, WebPopupMenuProxy::Client* client)
{
return adoptRef(new WebPopupMenuProxyWin(webView, client));
}
~WebPopupMenuProxyWin();
virtual void showPopupMenu(const WebCore::IntRect&, WebCore::TextDirection, double scaleFactor, const Vector<WebPopupItem>&, const PlatformPopupMenuData&, int32_t selectedIndex);
virtual void hidePopupMenu();
bool setFocusedIndex(int index, bool hotTracking = false);
void hide() { hidePopupMenu(); }
private:
WebPopupMenuProxyWin(WebView*, WebPopupMenuProxy::Client*);
WebCore::Scrollbar* scrollbar() const { return m_scrollbar.get(); }
// ScrollableArea
virtual int scrollSize(WebCore::ScrollbarOrientation) const;
virtual int scrollPosition(WebCore::Scrollbar*) const;
virtual void setScrollOffset(const WebCore::IntPoint&);
virtual void invalidateScrollbarRect(WebCore::Scrollbar*, const WebCore::IntRect&);
virtual void invalidateScrollCornerRect(const WebCore::IntRect&) { }
virtual bool isActive() const { return true; }
virtual bool isScrollCornerVisible() const { return false; }
virtual WebCore::IntRect scrollCornerRect() const { return WebCore::IntRect(); }
virtual WebCore::Scrollbar* verticalScrollbar() const { return m_scrollbar.get(); }
// NOTE: This should only be called by the overriden setScrollOffset from ScrollableArea.
void scrollTo(int offset);
static bool registerWindowClass();
static LRESULT CALLBACK WebPopupMenuProxyWndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT wndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
// Message pump messages.
LRESULT onMouseActivate(HWND, UINT message, WPARAM, LPARAM, bool& handled);
LRESULT onSize(HWND, UINT message, WPARAM, LPARAM, bool& handled);
LRESULT onKeyDown(HWND, UINT message, WPARAM, LPARAM, bool& handled);
LRESULT onChar(HWND, UINT message, WPARAM, LPARAM, bool& handled);
LRESULT onMouseMove(HWND, UINT message, WPARAM, LPARAM, bool& handled);
LRESULT onLButtonDown(HWND, UINT message, WPARAM, LPARAM, bool& handled);
LRESULT onLButtonUp(HWND, UINT message, WPARAM, LPARAM, bool& handled);
LRESULT onMouseWheel(HWND, UINT message, WPARAM, LPARAM, bool& handled);
LRESULT onPaint(HWND, UINT message, WPARAM, LPARAM, bool& handled);
LRESULT onPrintClient(HWND, UINT message, WPARAM, LPARAM, bool& handled);
void calculatePositionAndSize(const WebCore::IntRect&);
WebCore::IntRect clientRect() const;
void invalidateItem(int index);
int itemHeight() const { return m_itemHeight; }
const WebCore::IntRect& windowRect() const { return m_windowRect; }
int wheelDelta() const { return m_wheelDelta; }
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 scrollbarCapturingMouse() const { return m_scrollbarCapturingMouse; }
void setScrollbarCapturingMouse(bool b) { m_scrollbarCapturingMouse = b; }
bool up(unsigned lines = 1);
bool down(unsigned lines = 1);
void paint(const WebCore::IntRect& damageRect, HDC = 0);
int visibleItems() const;
int listIndexAtPoint(const WebCore::IntPoint&) const;
int focusedIndex() const;
void focusFirst();
void focusLast();
bool scrollToRevealSelection();
void incrementWheelDelta(int delta);
void reduceWheelDelta(int delta);
WebView* m_webView;
Vector<WebPopupItem> m_items;
PlatformPopupMenuData m_data;
int m_newSelectedIndex;
RefPtr<WebCore::Scrollbar> m_scrollbar;
HWND m_popup;
HDC m_DC;
HBITMAP m_bmp;
WebCore::IntRect m_windowRect;
int m_itemHeight;
int m_scrollOffset;
int m_wheelDelta;
int m_focusedIndex;
bool m_wasClicked;
bool m_scrollbarCapturingMouse;
bool m_showPopup;
};
} // namespace WebKit
#endif // WebPopupMenuProxyWin_h