1/* 2 * Copyright (C) 2009 Google 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 are 6 * met: 7 * 8 * * Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * * Redistributions in binary form must reproduce the above 11 * copyright notice, this list of conditions and the following disclaimer 12 * in the documentation and/or other materials provided with the 13 * distribution. 14 * * Neither the name of Google Inc. nor the names of its 15 * contributors may be used to endorse or promote products derived from 16 * this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 31#ifndef WebPopupMenuImpl_h 32#define WebPopupMenuImpl_h 33 34#include "FramelessScrollViewClient.h" 35#include "WebPoint.h" 36#include "WebPopupMenu.h" 37#include "WebSize.h" 38#include <wtf/RefCounted.h> 39 40namespace WebCore { 41class Frame; 42class FramelessScrollView; 43class KeyboardEvent; 44class Page; 45class PlatformKeyboardEvent; 46class Range; 47class Widget; 48} 49 50namespace WebKit { 51class WebKeyboardEvent; 52class WebMouseEvent; 53class WebMouseWheelEvent; 54struct WebRect; 55 56class WebPopupMenuImpl : public WebPopupMenu, 57 public WebCore::FramelessScrollViewClient, 58 public RefCounted<WebPopupMenuImpl> { 59 WTF_MAKE_FAST_ALLOCATED; 60public: 61 // WebWidget 62 virtual void close(); 63 virtual WebSize size() { return m_size; } 64 virtual void resize(const WebSize&); 65 virtual void animate(); 66 virtual void layout(); 67 virtual void paint(WebCanvas* canvas, const WebRect& rect); 68 virtual void themeChanged(); 69 virtual void composite(bool finish); 70 virtual bool handleInputEvent(const WebInputEvent&); 71 virtual void mouseCaptureLost(); 72 virtual void setFocus(bool enable); 73 virtual bool setComposition( 74 const WebString& text, 75 const WebVector<WebCompositionUnderline>& underlines, 76 int selectionStart, int selectionEnd); 77 virtual bool confirmComposition(); 78 virtual bool confirmComposition(const WebString& text); 79 virtual WebTextInputType textInputType(); 80 virtual WebRect caretOrSelectionBounds(); 81 virtual bool selectionRange(WebPoint& start, WebPoint& end) const { return false; } 82 virtual void setTextDirection(WebTextDirection direction); 83 virtual bool isAcceleratedCompositingActive() const { return false; } 84 85 // WebPopupMenuImpl 86 void Init(WebCore::FramelessScrollView* widget, 87 const WebRect& bounds); 88 89 WebWidgetClient* client() { return m_client; } 90 91 void MouseMove(const WebMouseEvent&); 92 void MouseLeave(const WebMouseEvent&); 93 void MouseDown(const WebMouseEvent&); 94 void MouseUp(const WebMouseEvent&); 95 void MouseDoubleClick(const WebMouseEvent&); 96 void MouseWheel(const WebMouseWheelEvent&); 97 bool KeyEvent(const WebKeyboardEvent&); 98 99 protected: 100 friend class WebPopupMenu; // For WebPopupMenu::create 101 friend class WTF::RefCounted<WebPopupMenuImpl>; 102 103 WebPopupMenuImpl(WebWidgetClient* client); 104 ~WebPopupMenuImpl(); 105 106 // WebCore::HostWindow methods: 107 virtual void invalidateContents(const WebCore::IntRect&, bool); 108 virtual void invalidateWindow(const WebCore::IntRect&, bool); 109 virtual void invalidateContentsAndWindow(const WebCore::IntRect&, bool); 110 virtual void invalidateContentsForSlowScroll(const WebCore::IntRect&, bool); 111 virtual void scheduleAnimation(); 112 virtual void scroll( 113 const WebCore::IntSize& scrollDelta, const WebCore::IntRect& scrollRect, 114 const WebCore::IntRect& clipRect); 115 virtual WebCore::IntPoint screenToWindow(const WebCore::IntPoint&) const; 116 virtual WebCore::IntRect windowToScreen(const WebCore::IntRect&) const; 117 virtual PlatformPageClient platformPageClient() const { return 0; } 118 virtual void scrollRectIntoView(const WebCore::IntRect&, const WebCore::ScrollView*) const; 119 virtual void scrollbarsModeDidChange() const; 120 virtual void setCursor(const WebCore::Cursor&); 121 122 // WebCore::FramelessScrollViewClient methods: 123 virtual void popupClosed(WebCore::FramelessScrollView*); 124 125 WebWidgetClient* m_client; 126 WebSize m_size; 127 128 WebPoint m_lastMousePosition; 129 130 // This is a non-owning ref. The popup will notify us via popupClosed() 131 // before it is destroyed. 132 WebCore::FramelessScrollView* m_widget; 133}; 134 135} // namespace WebKit 136 137#endif 138