WebCore:
[WebKit-https.git] / WebCore / platform / ScrollView.h
1 /*
2  * Copyright (C) 2004, 2006, 2007, 2008 Apple Computer, 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 #ifndef ScrollView_h
27 #define ScrollView_h
28
29 #include "IntRect.h"
30 #include "ScrollTypes.h"
31 #include "Widget.h"
32 #include <wtf/HashSet.h>
33
34 #if PLATFORM(GTK)
35 typedef struct _GtkAdjustment GtkAdjustment;
36 #endif
37
38 #if PLATFORM(WIN)
39 typedef struct HRGN__* HRGN;
40 #endif
41
42 namespace WebCore {
43
44     class FloatRect;
45     class IntRect;
46     class PlatformWheelEvent;
47     class PlatformScrollbar;
48
49     class ScrollView : public Widget {
50     public:
51         int visibleWidth() const;
52         int visibleHeight() const;
53         FloatRect visibleContentRect() const;
54         FloatRect visibleContentRectConsideringExternalScrollers() const;
55
56         int contentsWidth() const;
57         int contentsHeight() const;
58         int contentsX() const;
59         int contentsY() const;
60         IntSize scrollOffset() const;
61         void scrollBy(int dx, int dy);
62         virtual void scrollRectIntoViewRecursively(const IntRect&);
63
64         virtual void setContentsPos(int x, int y);
65
66         virtual void setVScrollbarMode(ScrollbarMode);
67         virtual void setHScrollbarMode(ScrollbarMode);
68
69         // Set the mode for both scrollbars at once.
70         virtual void setScrollbarsMode(ScrollbarMode);
71
72         // This gives us a means of blocking painting on our scrollbars until the first layout has occurred.
73         void suppressScrollbars(bool suppressed, bool repaintOnUnsuppress = false);
74         
75         ScrollbarMode vScrollbarMode() const;
76         ScrollbarMode hScrollbarMode() const;
77
78         void addChild(Widget*);
79         void removeChild(Widget*);
80
81         virtual void resizeContents(int w, int h);
82         void updateContents(const IntRect&, bool now = false);
83         void update();
84
85         // Event coordinates are assumed to be in the coordinate space of a window that contains
86         // the entire widget hierarchy.  It is up to the platform to decide what the precise definition
87         // of containing window is.  (For example on Mac it is the containing NSWindow.)
88         IntPoint windowToContents(const IntPoint&) const;
89         IntPoint contentsToWindow(const IntPoint&) const;
90         
91 #if PLATFORM(MAC)
92         // On Mac only because of flipped NSWindow y-coordinates, we have to have a special implementation.
93         IntRect windowToContents(const IntRect&) const;
94         IntRect contentsToWindow(const IntRect&) const;
95 #else
96         // Other platforms can just implement these helper methods using the corresponding point conversion methods.
97         IntRect contentsToWindow(const IntRect& rect) const { return IntRect(contentsToWindow(rect.location()), rect.size()); }
98         IntRect windowToContents(const IntRect& rect) const { return IntRect(windowToContents(rect.location()), rect.size()); }
99 #endif
100
101         void setStaticBackground(bool);
102
103         bool inWindow() const;
104
105         // For platforms that need to hit test scrollbars from within the engine's event handlers (like Win32).
106         PlatformScrollbar* scrollbarUnderMouse(const PlatformMouseEvent& mouseEvent);
107
108         // This method exists for scrollviews that need to handle wheel events manually.
109         // On Mac the underlying NSScrollView just does the scrolling, but on other platforms
110         // (like Windows), we need this method in order to do the scroll ourselves.
111         void wheelEvent(PlatformWheelEvent&);
112
113         bool scroll(ScrollDirection, ScrollGranularity);
114
115 #if PLATFORM(MAC)
116         NSView* getDocumentView() const;
117 #endif
118
119 #if PLATFORM(WIN)
120         ScrollView();
121         ~ScrollView();
122
123         virtual void paint(GraphicsContext*, const IntRect&);
124         virtual void themeChanged();
125         
126         virtual IntPoint convertChildToSelf(const Widget*, const IntPoint&) const;
127         virtual IntPoint convertSelfToChild(const Widget*, const IntPoint&) const;
128         
129         virtual void geometryChanged() const;
130         virtual void setFrameGeometry(const IntRect&);
131         
132         IntRect windowResizerRect();
133         bool resizerOverlapsContent() const;
134         void adjustOverlappingScrollbarCount(int overlapDelta);
135         
136         virtual void setParent(ScrollView*);
137
138         virtual void attachToWindow();
139         virtual void detachFromWindow();
140         bool isAttachedToWindow() const;
141
142         virtual void show();
143         virtual void hide();
144
145         void addToDirtyRegion(const IntRect&);
146         void scrollBackingStore(int dx, int dy, const IntRect& scrollViewRect, const IntRect& clipRect);
147         void updateBackingStore();
148
149         void setAllowsScrolling(bool);
150         bool allowsScrolling() const;
151
152         HashSet<Widget*>* children();
153
154     private:
155         void updateScrollbars(const IntSize& desiredOffset);
156         IntSize maximumScroll() const;
157         class ScrollViewPrivate;
158         ScrollViewPrivate* m_data;
159 #endif
160
161 #if PLATFORM(GTK)
162         ScrollView();
163         ~ScrollView();
164
165         virtual void setGtkAdjustments(GtkAdjustment* hadj, GtkAdjustment* vadj);
166         virtual IntPoint convertChildToSelf(const Widget*, const IntPoint&) const;
167         virtual IntPoint convertSelfToChild(const Widget*, const IntPoint&) const;
168         virtual void geometryChanged() const;
169
170         virtual void paint(GraphicsContext*, const IntRect&);
171         virtual void setFrameGeometry(const IntRect&);
172
173         void addToDirtyRegion(const IntRect&);
174         void scrollBackingStore(int dx, int dy, const IntRect& scrollViewRect, const IntRect& clipRect);
175         void updateBackingStore();
176
177     protected:
178         HashSet<Widget*>* children() const;
179
180     private:
181         IntSize maximumScroll() const;
182         void updateScrollbars(const IntSize& desiredOffset);
183
184         class ScrollViewPrivate;
185         ScrollViewPrivate* m_data;
186 #endif
187
188 #if PLATFORM(QT)
189         ScrollView();
190         ~ScrollView();
191
192         virtual void paint(GraphicsContext*, const IntRect&);
193
194         virtual IntPoint convertChildToSelf(const Widget*, const IntPoint&) const;
195         virtual IntPoint convertSelfToChild(const Widget*, const IntPoint&) const;
196
197         virtual void geometryChanged() const;
198         virtual void setFrameGeometry(const IntRect&);
199
200         IntRect windowResizerRect();
201         bool resizerOverlapsContent() const;
202         void adjustOverlappingScrollbarCount(int overlapDelta);
203
204         virtual void setParent(ScrollView*);
205
206         void addToDirtyRegion(const IntRect&);
207         void scrollBackingStore(int dx, int dy, const IntRect& scrollViewRect, const IntRect& clipRect);
208         void updateBackingStore();
209
210         PlatformScrollbar *horizontalScrollBar() const;
211         PlatformScrollbar *verticalScrollBar() const;
212
213         HashSet<Widget*>* children();
214
215     private:
216         void updateScrollbars(const IntSize& desiredOffset);
217         IntSize maximumScroll() const;
218         class ScrollViewPrivate;
219         ScrollViewPrivate* m_data;
220 #endif
221 #if PLATFORM(WX)
222         ScrollView();
223         ~ScrollView();
224     private:
225         class ScrollViewPrivate;
226         ScrollViewPrivate* m_data;
227 #endif
228     };
229
230 } // namespace WebCore
231
232 #endif // ScrollView_h