Reviewed by Zack
[WebKit-https.git] / WebCore / platform / qt / ScrollViewQt.cpp
1 /*
2  * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
3  * Copyright (C) 2006 Dirk Mueller <mueller@kde.org>
4  * Copyright (C) 2006 Zack Rusin <zack@kde.org>
5  * Copyright (C) 2006 George Staikos <staikos@kde.org>
6  * Copyright (C) 2006 Nikolas Zimmermann <zimmermann@kde.org>
7  *
8  * All rights reserved.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
20  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
23  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
26  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
27  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30  */
31
32 #include "config.h"
33 #include "ScrollView.h"
34 #include "FrameView.h"
35 #include "FloatRect.h"
36 #include "IntPoint.h"
37 #include "PlatformMouseEvent.h"
38
39 #include "FrameQt.h"
40 #include "ScrollViewCanvasQt.h"
41
42 #include <QDebug>
43 #include <QScrollBar>
44 #include <QScrollArea>
45
46 #define notImplemented() qDebug("FIXME: UNIMPLEMENTED: %s:%d (%s)", __FILE__, __LINE__, __FUNCTION__)
47
48 namespace WebCore {
49
50 ScrollView::ScrollView()
51     : m_area(0)
52 {
53 }
54
55 ScrollView::~ScrollView()
56 {
57 }
58
59 void ScrollView::setScrollArea(QScrollArea* area)
60 {
61     m_area = area;
62     if (m_area && isFrameView()) {
63         ScrollViewCanvasQt* canvas = new ScrollViewCanvasQt(static_cast<FrameView*>(this), m_area);
64         m_area->setWidget(canvas);
65     }
66     Widget::setQWidget(area);
67 }
68
69 void ScrollView::updateContents(const IntRect& updateRect, bool now)
70 {
71     //Update is fine for both now=true/false cases
72     if (m_area && m_area->widget())
73         m_area->widget()->update(updateRect);
74 }
75
76 int ScrollView::visibleWidth() const
77 {
78     if (!m_area)
79         return 0;
80     return m_area->maximumViewportSize().width();
81 }
82
83 int ScrollView::visibleHeight() const
84 {
85     if (!m_area)
86         return 0;
87     return m_area->maximumViewportSize().height();
88 }
89
90 FloatRect ScrollView::visibleContentRect() const
91 {
92     if (!m_area)
93         return FloatRect();
94     const QSize s(m_area->maximumViewportSize());
95
96     return FloatRect(m_area->horizontalScrollBar()->value(),
97                      m_area->verticalScrollBar()->value(),
98                      s.width(), s.height());
99 }
100
101 void ScrollView::setContentsPos(int newX, int newY)
102 {
103     if (!m_area)
104         return;
105     m_area->horizontalScrollBar()->setValue(newX);
106     m_area->verticalScrollBar()->setValue(newY);
107 }
108
109 void ScrollView::resizeContents(int w, int h)
110 {
111     if (m_area && m_area->widget())
112         m_area->widget()->resize(w, h);
113 }
114
115 int ScrollView::contentsX() const
116 {
117     if (!m_area)
118         return 0;
119     return m_area->horizontalScrollBar()->value();
120 }
121
122 int ScrollView::contentsY() const
123 {
124     if (!m_area)
125         return 0;
126     return m_area->verticalScrollBar()->value();
127 }
128
129 int ScrollView::contentsWidth() const
130 {
131     if (!m_area || !m_area->widget())
132         return 0;
133
134     return m_area->widget()->width();
135 }
136
137 int ScrollView::contentsHeight() const
138 {
139     if (!m_area || !m_area->widget())
140         return 0;
141
142     return m_area->widget()->height();
143 }
144
145
146 IntPoint ScrollView::contentsToWindow(const IntPoint& point) const
147 {
148     return point;
149 }
150
151 IntPoint ScrollView::windowToContents(const IntPoint& point) const
152 {
153     return point;
154 }
155
156 IntSize ScrollView::scrollOffset() const
157 {
158     if (!m_area)
159         return IntSize();
160     return IntSize(m_area->horizontalScrollBar()->value(), m_area->verticalScrollBar()->value());
161 }
162
163 void ScrollView::scrollBy(int dx, int dy)
164 {
165     if (!m_area)
166         return;
167     m_area->horizontalScrollBar()->setValue(m_area->horizontalScrollBar()->value() + dx);
168     m_area->verticalScrollBar()->setValue(m_area->verticalScrollBar()->value() + dy);
169 }
170
171 ScrollbarMode ScrollView::hScrollbarMode() const
172 {
173     if (!m_area)
174         return ScrollbarAuto;
175     switch (m_area->horizontalScrollBarPolicy())
176     {
177         case Qt::ScrollBarAsNeeded:
178             return ScrollbarAuto;
179         case Qt::ScrollBarAlwaysOff:
180             return ScrollbarAlwaysOff;
181         case Qt::ScrollBarAlwaysOn:
182             return ScrollbarAlwaysOn;
183     }
184
185     return ScrollbarAuto;
186 }
187
188 ScrollbarMode ScrollView::vScrollbarMode() const
189 {
190     if (!m_area)
191         return ScrollbarAuto;
192     switch (m_area->verticalScrollBarPolicy())
193     {
194         case Qt::ScrollBarAsNeeded:
195             return ScrollbarAuto;
196         case Qt::ScrollBarAlwaysOff:
197             return ScrollbarAlwaysOff;
198         case Qt::ScrollBarAlwaysOn:
199             return ScrollbarAlwaysOn;
200     }
201
202     return ScrollbarAuto;
203 }
204
205 void ScrollView::suppressScrollbars(bool suppressed, bool /* repaintOnSuppress */)
206 {
207     setScrollbarsMode(suppressed ? ScrollbarAlwaysOff : ScrollbarAuto);
208 }
209
210 void ScrollView::setHScrollbarMode(ScrollbarMode newMode)
211 {
212     if (!m_area)
213         return;
214     switch (newMode)
215     {
216         case ScrollbarAuto:
217             m_area->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
218             break;
219         case ScrollbarAlwaysOff:
220             m_area->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
221             break;
222         case ScrollbarAlwaysOn:
223             m_area->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
224             break;
225     }
226 }
227
228 void ScrollView::setVScrollbarMode(ScrollbarMode newMode)
229 {
230     if (!m_area)
231         return;
232     switch (newMode)
233     {
234         case ScrollbarAuto:
235             m_area->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
236             break;
237         case ScrollbarAlwaysOff:
238             m_area->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
239             break;
240         case ScrollbarAlwaysOn:
241             m_area->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
242             break;
243     }
244 }
245
246 void ScrollView::setScrollbarsMode(ScrollbarMode newMode)
247 {
248     setHScrollbarMode(newMode);
249     setVScrollbarMode(newMode);
250 }
251
252 void ScrollView::setStaticBackground(bool flag)
253 {
254     // no-op
255 }
256
257 void ScrollView::addChild(Widget* child)
258 {
259     QWidget* w = child->qwidget();
260     w->setParent(m_area->widget());
261 }
262
263 void ScrollView::removeChild(Widget* child)
264 {
265     child->hide();
266 }
267
268 void ScrollView::scrollPointRecursively(int x, int y)
269 {
270     x = (x < 0) ? 0 : x;
271     y = (y < 0) ? 0 : y;
272
273     m_area->ensureVisible(x, y);
274 }
275
276 bool ScrollView::inWindow() const
277 {
278     return true;
279 }
280
281 void ScrollView::wheelEvent(PlatformWheelEvent&)
282 {
283     //we don't do absolutely anything here - we handled it already in ScrollViewCanvasQt
284     // internally in Qt
285 }
286
287 PlatformScrollbar* ScrollView::scrollbarUnderMouse(const PlatformMouseEvent& mouseEvent)
288 {
289     // Probably don't care about this.
290 #if 0
291     // Not so sure: frames with scrollbars have the wrong mouse cursor over
292     // the scrollbar.  Is this why?  FIXME
293     if (m_area->horizontalScrollBar()->geometry().contains(mouseEvent.pos())) {
294         return m_area->horizontalScrollBar();
295     }
296     if (m_area->verticalScrollBar()->geometry().contains(mouseEvent.pos())) {
297         return m_area->verticalScrollBar();
298     }
299 #endif
300     return 0;
301 }
302
303 }
304
305 // vim: ts=4 sw=4 et