Refactor the code that sends the mouse down to scrollbars.
[WebKit-https.git] / WebCore / page / FrameView.h
1 /* This file is part of the KDE project
2
3    Copyright (C) 1997 Martin Jones (mjones@kde.org)
4              (C) 1998 Waldo Bastian (bastian@kde.org)
5              (C) 1998, 1999 Torben Weis (weis@kde.org)
6              (C) 1999 Lars Knoll (knoll@kde.org)
7              (C) 1999 Antti Koivisto (koivisto@kde.org)
8    Copyright (C) 2004, 2005, 2006 Apple Computer, Inc.
9
10    This library is free software; you can redistribute it and/or
11    modify it under the terms of the GNU Library General Public
12    License as published by the Free Software Foundation; either
13    version 2 of the License, or (at your option) any later version.
14
15    This library is distributed in the hope that it will be useful,
16    but WITHOUT ANY WARRANTY; without even the implied warranty of
17    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18    Library General Public License for more details.
19
20    You should have received a copy of the GNU Library General Public License
21    along with this library; see the file COPYING.LIB.  If not, write to
22    the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
23    Boston, MA 02111-1307, USA.
24 */
25
26 #ifndef FrameView_H
27 #define FrameView_H
28
29 #include "ScrollView.h"
30 #include "IntSize.h"
31 #include "PlatformString.h"
32
33 namespace WebCore {
34
35 class AtomicString;
36 class Color;
37 class CSSProperty;
38 class CSSStyleSelector;
39 class Clipboard;
40 class DeprecatedStringList;
41 class Document;
42 class Element;
43 class Event;
44 class EventTargetNode;
45 class Frame;
46 class FrameViewPrivate;
47 class GraphicsContext;
48 class HTMLAnchorElement;
49 class HTMLDocument;
50 class HTMLElement;
51 class HTMLFormElement;
52 class HTMLFrameSetElement;
53 class HTMLGenericFormElement;
54 class HTMLTitleElement;
55 class InlineBox;
56 class IntPoint;
57 class IntRect;
58 class PlatformKeyboardEvent;
59 class FrameMac;
60 class PlatformMouseEvent;
61 class MouseEventWithHitTestResults;
62 class Node;
63 class RenderBox;
64 class RenderView;
65 class RenderLineEdit;
66 class RenderObject;
67 class RenderPart;
68 class RenderPartObject;
69 class RenderStyle;
70 class RenderWidget;
71 class PlatformWheelEvent;
72 class String;
73
74 template <typename T> class Timer;
75
76 void applyRule(CSSProperty*);
77
78 class FrameView : public ScrollView {
79     friend class CSSStyleSelector;
80     friend class Document;
81     friend class Frame;
82     friend class HTMLAnchorElement;
83     friend class HTMLDocument;
84     friend class HTMLFormElement;
85     friend class HTMLGenericFormElement;
86     friend class HTMLTitleElement;
87     friend class FrameMac;
88     friend class RenderBox;
89     friend class RenderView;
90     friend class RenderLineEdit;
91     friend class RenderObject;
92     friend class RenderPart;
93     friend class RenderPartObject;
94     friend class RenderWidget;
95     friend void applyRule(CSSProperty *prop);
96
97 public:
98     FrameView(Frame*);
99     virtual ~FrameView();
100
101     Frame* frame() const { return m_frame.get(); }
102
103     int frameWidth() const { return m_size.width(); }
104
105     /**
106      * Gets/Sets the margin width/height
107      *
108      * A return value of -1 means the default value will be used.
109      */
110     int marginWidth() const { return m_margins.width(); }
111     int marginHeight() { return  m_margins.height(); }
112     void setMarginWidth(int);
113     void setMarginHeight(int);
114
115     virtual void setVScrollBarMode(ScrollBarMode);
116     virtual void setHScrollBarMode(ScrollBarMode);
117     virtual void setScrollBarsMode(ScrollBarMode);
118     
119     void print();
120
121     void layout(bool allowSubtree = true);
122
123     Node* layoutRoot() const;
124     int layoutCount() const;
125
126     bool needsFullRepaint() const;
127     
128     void addRepaintInfo(RenderObject*, const IntRect&);
129
130     void resetScrollBars();
131
132     void clear();
133
134 public:
135     void clearPart();
136
137     void handleMousePressEvent(const PlatformMouseEvent&);
138     void handleMouseDoubleClickEvent(const PlatformMouseEvent&);
139     virtual void handleMouseMoveEvent(const PlatformMouseEvent&);
140     virtual void handleMouseReleaseEvent(const PlatformMouseEvent&);
141     void handleWheelEvent(PlatformWheelEvent&);
142
143     bool passMousePressEventToSubframe(MouseEventWithHitTestResults&, Frame*);
144     bool passMouseMoveEventToSubframe(MouseEventWithHitTestResults&, Frame*);
145     bool passMouseReleaseEventToSubframe(MouseEventWithHitTestResults&, Frame*);
146     bool passWheelEventToSubframe(PlatformWheelEvent&, Frame*);
147     bool passMousePressEventToScrollbar(MouseEventWithHitTestResults&);
148
149     bool mousePressed();
150     void setMousePressed(bool);
151
152     void doAutoScroll();
153
154     bool updateDragAndDrop(const PlatformMouseEvent&, Clipboard*);
155     void cancelDragAndDrop(const PlatformMouseEvent&, Clipboard*);
156     bool performDragAndDrop(const PlatformMouseEvent&, Clipboard*);
157
158     void layoutTimerFired(Timer<FrameView>*);
159     void hoverTimerFired(Timer<FrameView>*);
160
161     void repaintRectangle(const IntRect& r, bool immediate);
162
163     bool isTransparent() const;
164     void setTransparent(bool isTransparent);
165
166     Color baseBackgroundColor() const;
167     void setBaseBackgroundColor(Color);
168
169     void scheduleRelayout();
170     void scheduleRelayoutOfSubtree(Node*);
171     void unscheduleRelayout();
172     bool haveDelayedLayoutScheduled();
173     bool layoutPending() const;
174
175     void scheduleHoverStateUpdate();
176
177     void adjustViewSize();
178     void initScrollBars();
179     
180     void setHasBorder(bool);
181     bool hasBorder() const;
182     
183     void setResizingFrameSet(HTMLFrameSetElement *);
184
185 #if __APPLE__
186     void updateDashboardRegions();
187 #endif
188
189     virtual void scrollPointRecursively(int x, int y);
190     virtual void setContentsPos(int x, int y);
191
192     void scheduleEvent(PassRefPtr<Event>, PassRefPtr<EventTargetNode>, bool tempEvent);
193
194     IntPoint currentMousePosition() const;
195
196     void ref() { ++m_refCount; }
197     void deref() { if (!--m_refCount) delete this; }
198     bool hasOneRef() { return m_refCount == 1; }
199
200 private:
201     void cleared();
202     void scrollBarMoved();
203
204     void resetCursor();
205     void invalidateClick();
206
207     /**
208      * Get/set the CSS Media Type.
209      *
210      * Media type is set to "screen" for on-screen rendering and "print"
211      * during printing. Other media types lack the proper support in the
212      * renderer and are not activated. The DOM tree and the parser itself,
213      * however, properly handle other media types. To make them actually work
214      * you only need to enable the media type in the view and if necessary
215      * add the media type dependent changes to the renderer.
216      */
217     void setMediaType(const String&);
218     String mediaType() const;
219
220     bool scrollTo(const IntRect&);
221
222     void focusNextPrevNode(bool next);
223
224     bool useSlowRepaints() const;
225     void setUseSlowRepaints();
226     void addSlowRepaintObject();
227     void removeSlowRepaintObject();
228
229     void setIgnoreWheelEvents(bool e);
230
231     void init();
232
233     Node *nodeUnderMouse() const;
234
235     void restoreScrollBar();
236
237     MouseEventWithHitTestResults prepareMouseEvent(bool readonly, bool active, bool mouseMove, const PlatformMouseEvent&);
238
239     bool dispatchMouseEvent(const AtomicString& eventType, Node* target,
240         bool cancelable, int clickCount, const PlatformMouseEvent&, bool setUnder);
241     bool dispatchDragEvent(const AtomicString& eventType, Node* target,
242         const PlatformMouseEvent&, Clipboard*);
243
244     void applyOverflowToViewport(RenderObject* o, ScrollBarMode& hMode, ScrollBarMode& vMode);
245
246     virtual bool isFrameView() const;
247
248     void updateBorder();
249
250     void updateOverflowStatus(bool horizontalOverflow, bool verticalOverflow);
251     void dispatchScheduledEvents();
252         
253     unsigned m_refCount;
254     
255     IntSize m_size;
256     IntSize m_margins;
257     
258     RefPtr<Frame> m_frame;
259     FrameViewPrivate* d;
260 };
261
262 }
263
264 #endif
265