OSDN Git Service

Merge WebKit at r78450: Initial merge by git.
[android-x86/external-webkit.git] / Source / WebKit / win / WebScrollBar.cpp
1 /*
2  * Copyright (C) 2007 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 COMPUTER, INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #include "config.h"
27 #include "WebKitDLL.h"
28 #include "WebKit.h"
29 #include "WebScrollBar.h"
30
31 #pragma warning(push, 0)
32 #include <WebCore/GraphicsContext.h>
33 #include <WebCore/PlatformMouseEvent.h>
34 #include <WebCore/Scrollbar.h>
35 #include <WebCore/ScrollbarTheme.h>
36 #pragma warning(pop)
37
38 using namespace WebCore;
39
40 // WebScrollBar ---------------------------------------------------------------------
41
42 WebScrollBar::WebScrollBar()
43     : m_refCount(0)
44     , m_containingWindow(0)
45     , m_currentPosition(0)
46 {
47     gClassCount++;
48     gClassNameCount.add("WebScrollBar");
49 }
50
51 WebScrollBar::~WebScrollBar()
52 {
53     gClassCount--;
54     gClassNameCount.remove("WebScrollBar");
55 }
56
57 WebScrollBar* WebScrollBar::createInstance()
58 {
59     WebScrollBar* instance = new WebScrollBar();
60     instance->AddRef();
61     return instance;
62 }
63
64 // IUnknown -------------------------------------------------------------------
65
66 HRESULT STDMETHODCALLTYPE WebScrollBar::QueryInterface(REFIID riid, void** ppvObject)
67 {
68     *ppvObject = 0;
69     if (IsEqualGUID(riid, IID_IUnknown))
70         *ppvObject = static_cast<IUnknown*>(this);
71     else if (IsEqualGUID(riid, IID_IWebScrollBarPrivate))
72         *ppvObject = static_cast<IWebScrollBarPrivate*>(this);
73     else
74         return E_NOINTERFACE;
75
76     AddRef();
77     return S_OK;
78 }
79
80 ULONG STDMETHODCALLTYPE WebScrollBar::AddRef(void)
81 {
82     return ++m_refCount;
83 }
84
85 ULONG STDMETHODCALLTYPE WebScrollBar::Release(void)
86 {
87     ULONG newRef = --m_refCount;
88     if (!newRef)
89         delete(this);
90
91     return newRef;
92 }
93
94 // IWebScrollBarPrivate ------------------------------------------------------------------
95 HRESULT STDMETHODCALLTYPE WebScrollBar::init( 
96     /* [in] */ IWebScrollBarDelegatePrivate* delegate,
97     /* [in] */ OLE_HANDLE containingWindow,
98     /* [in] */ WebScrollBarOrientation orientation,
99     /* [in] */ WebScrollBarControlSize controlSize)
100 {
101     if (!delegate || !containingWindow)
102         return E_FAIL;
103     ScrollbarOrientation webCoreOrientation = (ScrollbarOrientation) orientation;
104     ScrollbarControlSize webCoreControlSize = (ScrollbarControlSize) controlSize;
105     m_delegate = delegate;
106     m_scrollBar = Scrollbar::createNativeScrollbar(this, webCoreOrientation, webCoreControlSize);
107     if (!m_scrollBar)
108         return E_FAIL;
109     m_containingWindow = (HWND)(ULONG64)containingWindow;
110     return S_OK;
111 }
112
113 HRESULT STDMETHODCALLTYPE WebScrollBar::setEnabled(
114     /* [in] */ BOOL enabled)
115 {
116     m_scrollBar->setEnabled(!!enabled);
117     return S_OK;
118 }
119
120 HRESULT STDMETHODCALLTYPE WebScrollBar::setSteps( 
121     /* [in] */ int lineStep,
122     /* [in] */ int pageStep)
123 {
124     m_scrollBar->setSteps(lineStep, pageStep);
125     return S_OK;
126 }
127
128 HRESULT STDMETHODCALLTYPE WebScrollBar::setProportion( 
129     /* [in] */ int visibleSize,
130     /* [in] */ int totalSize)
131 {
132     m_scrollBar->setProportion(visibleSize, totalSize);
133     return S_OK;
134 }
135
136 HRESULT STDMETHODCALLTYPE WebScrollBar::setRect( 
137     /* [in] */ RECT bounds)
138 {
139     IntRect rect(bounds.left, bounds.top, bounds.right-bounds.left, bounds.bottom-bounds.top);
140     m_scrollBar->setFrameRect(rect);
141     return S_OK;
142 }
143
144 HRESULT STDMETHODCALLTYPE WebScrollBar::setValue( 
145     /* [in] */ int value)
146 {
147     m_currentPosition = value;
148     return S_OK;
149 }
150
151 HRESULT STDMETHODCALLTYPE WebScrollBar::value(
152     /* [retval][out] */ int* value)
153 {
154     if (!value)
155         return E_POINTER;
156     *value = m_currentPosition;
157     return S_OK;
158 }
159
160 HRESULT STDMETHODCALLTYPE WebScrollBar::paint( 
161     /* [in] */ HDC dc,
162     /* [in] */ RECT damageRect)
163 {
164     GraphicsContext context(dc);
165     IntRect rect(damageRect.left, damageRect.top, damageRect.right-damageRect.left, damageRect.bottom-damageRect.top);
166     m_scrollBar->paint(&context, rect);
167     return S_OK;
168 }
169
170 HRESULT STDMETHODCALLTYPE WebScrollBar::frameRect( 
171     /* [retval][out] */ RECT* bounds)
172 {
173     if (!bounds)
174         return E_POINTER;
175     IntRect rect = m_scrollBar->frameRect();
176     bounds->left = rect.x();
177     bounds->right = rect.maxX();
178     bounds->top = rect.y();
179     bounds->bottom = rect.maxY();
180     return S_OK;
181 }
182
183 HRESULT STDMETHODCALLTYPE WebScrollBar::width( 
184     /* [retval][out] */ int* w)
185 {
186     if (!w)
187         return E_POINTER;
188     *w = m_scrollBar->width();
189     return S_OK;
190 }
191
192 HRESULT STDMETHODCALLTYPE WebScrollBar::height( 
193     /* [retval][out] */ int* h)
194 {
195     if (!h)
196         return E_POINTER;
197     *h = m_scrollBar->height();
198     return S_OK;
199 }
200
201 HRESULT STDMETHODCALLTYPE WebScrollBar::requestedWidth( 
202     /* [retval][out] */ int* w)
203 {
204     if (!w)
205         return E_POINTER;
206
207     *w = m_scrollBar->orientation() == VerticalScrollbar ? ScrollbarTheme::nativeTheme()->scrollbarThickness(m_scrollBar->controlSize()) : -1;
208     return S_OK;
209 }
210
211 HRESULT STDMETHODCALLTYPE WebScrollBar::requestedHeight( 
212     /* [retval][out] */ int* h)
213 {
214     if (!h)
215         return E_POINTER;
216
217     *h = m_scrollBar->orientation() == HorizontalScrollbar ? ScrollbarTheme::nativeTheme()->scrollbarThickness(m_scrollBar->controlSize()) : -1;
218     return S_OK;
219 }
220
221
222 HRESULT STDMETHODCALLTYPE WebScrollBar::handleMouseEvent( 
223     OLE_HANDLE window,
224     UINT msg,
225     WPARAM wParam,
226     LPARAM lParam)
227 {
228     PlatformMouseEvent mouseEvent((HWND)(ULONG64)window, msg, wParam, lParam);
229     switch (msg) {
230         case WM_LBUTTONDOWN:
231             m_scrollBar->mouseDown(mouseEvent);
232             break;
233         case WM_LBUTTONUP:
234             m_scrollBar->mouseUp();
235             break;
236         case WM_MOUSEMOVE:
237             m_scrollBar->mouseMoved(mouseEvent);
238             break;
239     }
240
241     return S_OK;
242 }
243
244 HRESULT STDMETHODCALLTYPE WebScrollBar::scroll( 
245     WebScrollDirection direction,
246     WebScrollGranularity granularity,
247     float multiplier)
248 {
249     ScrollDirection webCoreScrollDirection = (ScrollDirection) direction;
250     ScrollGranularity webCoreGranularity = (ScrollGranularity) granularity;
251     ScrollableArea::scroll(webCoreScrollDirection, webCoreGranularity, multiplier);
252     return S_OK;
253 }
254
255 // ScrollableArea -------------------------------------------------------
256
257 int WebScrollBar::scrollSize(ScrollbarOrientation orientation) const
258 {
259     return (orientation == m_scrollBar->orientation()) ? (m_scrollBar->totalSize() - m_scrollBar->visibleSize()) : 0; 
260 }
261
262 int WebScrollBar::scrollPosition(Scrollbar*) const
263 {
264     return m_currentPosition;
265 }
266
267 void WebScrollBar::setScrollOffset(const IntPoint& offset)
268 {
269     m_currentPosition = (m_scrollBar->orientation() == HorizontalScrollbar) ? offset.x() : offset.y();
270     m_delegate->valueChanged(this);
271 }
272
273 void WebScrollBar::invalidateScrollbarRect(Scrollbar*, const IntRect& rect)
274 {
275     RECT r = rect;
276     ::InvalidateRect(m_containingWindow, &r, false);
277 }
278
279 Scrollbar* WebScrollBar::horizontalScrollbar() const
280 {
281     return m_scrollBar->orientation() == HorizontalScrollbar ? m_scrollBar.get() : 0;
282 }
283
284 Scrollbar* WebScrollBar::verticalScrollbar() const
285 {
286     return m_scrollBar->orientation() == VerticalScrollbar ? m_scrollBar.get() : 0;
287 }