Reviewed by Darin, landed by ap.
[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 class DeprecatedStringList;
34
35 namespace WebCore {
36
37 class AtomicString;
38 class CSSProperty;
39 class CSSStyleSelector;
40 class Clipboard;
41 class Document;
42 class Element;
43 class Frame;
44 class FrameViewPrivate;
45 class GraphicsContext;
46 class HTMLAnchorElement;
47 class HTMLDocument;
48 class HTMLElement;
49 class HTMLFormElement;
50 class HTMLFrameSetElement;
51 class HTMLGenericFormElement;
52 class HTMLTitleElement;
53 class InlineBox;
54 class IntRect;
55 class PlatformKeyboardEvent;
56 class FrameMac;
57 class PlatformMouseEvent;
58 class MouseEventWithHitTestResults;
59 class Node;
60 class RenderBox;
61 class RenderView;
62 class RenderLineEdit;
63 class RenderObject;
64 class RenderPart;
65 class RenderPartObject;
66 class RenderStyle;
67 class RenderWidget;
68 class PlatformWheelEvent;
69 class String;
70
71 template <typename T> class Timer;
72
73 void applyRule(CSSProperty*);
74
75 class FrameView : public ScrollView {
76     friend class CSSStyleSelector;
77     friend class Document;
78     friend class Frame;
79     friend class HTMLAnchorElement;
80     friend class HTMLDocument;
81     friend class HTMLFormElement;
82     friend class HTMLGenericFormElement;
83     friend class HTMLTitleElement;
84     friend class FrameMac;
85     friend class RenderBox;
86     friend class RenderView;
87     friend class RenderLineEdit;
88     friend class RenderObject;
89     friend class RenderPart;
90     friend class RenderPartObject;
91     friend class RenderWidget;
92     friend void applyRule(CSSProperty *prop);
93
94 public:
95     FrameView(Frame*);
96     virtual ~FrameView();
97
98     Frame* frame() const { return m_frame.get(); }
99
100     int frameWidth() const { return m_size.width(); }
101
102     /**
103      * Gets/Sets the margin width/height
104      *
105      * A return value of -1 means the default value will be used.
106      */
107     int marginWidth() const { return m_margins.width(); }
108     int marginHeight() { return  m_margins.height(); }
109     void setMarginWidth(int);
110     void setMarginHeight(int);
111
112     virtual void setVScrollBarMode(ScrollBarMode);
113     virtual void setHScrollBarMode(ScrollBarMode);
114     virtual void setScrollBarsMode(ScrollBarMode);
115     
116     void print();
117
118     void layout(bool allowSubtree = true);
119
120     Node* layoutRoot() const;
121     int layoutCount() const;
122
123     bool needsFullRepaint() const;
124     
125     void addRepaintInfo(RenderObject*, const IntRect&);
126
127     void resetScrollBars();
128
129     void clear();
130
131 public:
132     void clearPart();
133
134     void handleMousePressEvent(const PlatformMouseEvent&);
135     void handleMouseDoubleClickEvent(const PlatformMouseEvent&);
136     void handleMouseMoveEvent(const PlatformMouseEvent&);
137     void handleMouseReleaseEvent(const PlatformMouseEvent&);
138     void handleWheelEvent(PlatformWheelEvent&);
139
140     bool mousePressed();
141
142     void doAutoScroll();
143
144     bool updateDragAndDrop(const PlatformMouseEvent&, Clipboard*);
145     void cancelDragAndDrop(const PlatformMouseEvent&, Clipboard*);
146     bool performDragAndDrop(const PlatformMouseEvent&, Clipboard*);
147
148     void layoutTimerFired(Timer<FrameView>*);
149     void hoverTimerFired(Timer<FrameView>*);
150
151     void repaintRectangle(const IntRect& r, bool immediate);
152
153     bool isTransparent() const;
154     void setTransparent(bool isTransparent);
155     
156     void scheduleRelayout();
157     void scheduleRelayoutOfSubtree(Node*);
158     void unscheduleRelayout();
159     bool haveDelayedLayoutScheduled();
160     bool layoutPending() const;
161
162     void scheduleHoverStateUpdate();
163
164     void adjustViewSize();
165     void initScrollBars();
166     
167     void setHasBorder(bool);
168     bool hasBorder() const;
169     
170     void setResizingFrameSet(HTMLFrameSetElement *);
171
172 #if __APPLE__
173     void updateDashboardRegions();
174 #endif
175
176     void ref() { ++m_refCount; }
177     void deref() { if (!--m_refCount) delete this; }
178     
179 private:
180     void cleared();
181     void scrollBarMoved();
182
183     void resetCursor();
184     void invalidateClick();
185
186     /**
187      * Get/set the CSS Media Type.
188      *
189      * Media type is set to "screen" for on-screen rendering and "print"
190      * during printing. Other media types lack the proper support in the
191      * renderer and are not activated. The DOM tree and the parser itself,
192      * however, properly handle other media types. To make them actually work
193      * you only need to enable the media type in the view and if necessary
194      * add the media type dependent changes to the renderer.
195      */
196     void setMediaType(const String&);
197     String mediaType() const;
198
199     bool scrollTo(const IntRect&);
200
201     void focusNextPrevNode(bool next);
202
203     void useSlowRepaints();
204
205     void setIgnoreWheelEvents(bool e);
206
207     void init();
208
209     Node *nodeUnderMouse() const;
210
211     void restoreScrollBar();
212
213     DeprecatedStringList formCompletionItems(const String& name) const;
214     void addFormCompletionItem(const String& name, const String& value);
215
216     MouseEventWithHitTestResults prepareMouseEvent(bool readonly, bool active, bool mouseMove, const PlatformMouseEvent&);
217
218     bool dispatchMouseEvent(const AtomicString& eventType, Node* target,
219         bool cancelable, int clickCount, const PlatformMouseEvent&, bool setUnder);
220     bool dispatchDragEvent(const AtomicString& eventType, Node* target,
221         const PlatformMouseEvent&, Clipboard*);
222
223     void applyOverflowToViewport(RenderObject* o, ScrollBarMode& hMode, ScrollBarMode& vMode);
224
225     virtual bool isFrameView() const;
226
227     void updateBorder();
228
229     unsigned m_refCount;
230     
231     IntSize m_size;
232     IntSize m_margins;
233     
234     RefPtr<Frame> m_frame;
235     FrameViewPrivate* d;
236 };
237
238 }
239
240 #endif
241