77ccf91d70a046eaafa5ff181d922f20502200fa
[WebKit-https.git] / Source / WebCore / platform / Widget.h
1 /*
2  * Copyright (C) 2004, 2005, 2006 Apple Computer, Inc.  All rights reserved.
3  * Copyright (C) 2008 Collabora Ltd.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
18  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  */
26
27 #ifndef Widget_h
28 #define Widget_h
29
30 #include "IntRect.h"
31 #include <wtf/Forward.h>
32 #include <wtf/RefCounted.h>
33
34 #if PLATFORM(CHROMIUM)
35 #include "PageClientChromium.h"
36 #include "PlatformWidget.h"
37 #endif
38
39 #if PLATFORM(MAC)
40 #include <wtf/RetainPtr.h>
41 #endif
42
43 #if PLATFORM(QT)
44 #include <QPointer>
45 #include <qglobal.h>
46 #endif
47
48 #if PLATFORM(MAC)
49 OBJC_CLASS NSView;
50 OBJC_CLASS NSWindow;
51 typedef NSView *PlatformWidget;
52 #endif
53
54 #if PLATFORM(WIN)
55 typedef struct HWND__* HWND;
56 typedef HWND PlatformWidget;
57 #endif
58
59 #if PLATFORM(GTK)
60 typedef struct _GtkWidget GtkWidget;
61 typedef struct _GtkContainer GtkContainer;
62 typedef GtkWidget* PlatformWidget;
63 #endif
64
65 #if PLATFORM(QT)
66 QT_BEGIN_NAMESPACE
67 class QObject;
68 QT_END_NAMESPACE
69 typedef QObject* PlatformWidget;
70 #endif
71
72 #if PLATFORM(BLACKBERRY)
73 typedef void* PlatformWidget;
74 #endif
75
76 #if PLATFORM(WX)
77 class wxWindow;
78 typedef wxWindow* PlatformWidget;
79 #endif
80
81 #if PLATFORM(EFL)
82 #if USE(EO)
83 typedef struct _Eo Evas_Object;
84 #else
85 typedef struct _Evas_Object Evas_Object;
86 #endif
87 typedef Evas_Object* PlatformWidget;
88 #endif
89
90 #if PLATFORM(QT)
91 class QWebPageClient;
92 typedef QWebPageClient* PlatformPageClient;
93 #elif PLATFORM(BLACKBERRY)
94 #include "PageClientBlackBerry.h"
95 typedef PageClientBlackBerry* PlatformPageClient;
96 #elif PLATFORM(EFL)
97 class PageClientEfl;
98 typedef PageClientEfl* PlatformPageClient;
99 #elif PLATFORM(CHROMIUM)
100 typedef WebCore::PageClientChromium* PlatformPageClient;
101 #else
102 typedef PlatformWidget PlatformPageClient;
103 #endif
104
105 namespace WebCore {
106
107 class AXObjectCache;
108 class Cursor;
109 class Event;
110 class Font;
111 class GraphicsContext;
112 class PlatformMouseEvent;
113 class ScrollView;
114 class WidgetPrivate;
115
116 enum WidgetNotification { WillPaintFlattened, DidPaintFlattened };
117
118 // The Widget class serves as a base class for three kinds of objects:
119 // (1) Scrollable areas (ScrollView)
120 // (2) Scrollbars (Scrollbar)
121 // (3) Plugins (PluginView)
122 //
123 // A widget may or may not be backed by a platform-specific object (e.g., HWND on Windows, NSView on Mac, QWidget on Qt).
124 //
125 // Widgets are connected in a hierarchy, with the restriction that plugins and scrollbars are always leaves of the
126 // tree.  Only ScrollViews can have children (and therefore the Widget class has no concept of children).
127 //
128 // The rules right now for which widgets get platform-specific objects are as follows:
129 // ScrollView - Mac
130 // Scrollbar - Mac, Gtk
131 // Plugin - Mac, Windows (windowed only), Qt (windowed only, widget is an HWND on windows), Gtk (windowed only)
132 //
133 class Widget : public RefCounted<Widget> {
134 public:
135     explicit Widget(PlatformWidget = 0);
136     virtual ~Widget();
137
138     PlatformWidget platformWidget() const;
139     void setPlatformWidget(PlatformWidget);
140
141     int x() const { return frameRect().x(); }
142     int y() const { return frameRect().y(); }
143     int width() const { return frameRect().width(); }
144     int height() const { return frameRect().height(); }
145     IntSize size() const { return frameRect().size(); }
146     IntPoint location() const { return frameRect().location(); }
147
148     virtual void setFrameRect(const IntRect&);
149     IntRect frameRect() const;
150     IntRect boundsRect() const { return IntRect(0, 0, width(),  height()); }
151
152     void resize(int w, int h) { setFrameRect(IntRect(x(), y(), w, h)); }
153     void resize(const IntSize& s) { setFrameRect(IntRect(location(), s)); }
154     void move(int x, int y) { setFrameRect(IntRect(x, y, width(), height())); }
155     void move(const IntPoint& p) { setFrameRect(IntRect(p, size())); }
156
157     virtual void paint(GraphicsContext*, const IntRect&);
158     void invalidate() { invalidateRect(boundsRect()); }
159     virtual void invalidateRect(const IntRect&) = 0;
160
161     virtual void setFocus(bool);
162
163     void setCursor(const Cursor&);
164
165     virtual void show();
166     virtual void hide();
167     bool isSelfVisible() const { return m_selfVisible; } // Whether or not we have been explicitly marked as visible or not.
168     bool isParentVisible() const { return m_parentVisible; } // Whether or not our parent is visible.
169     bool isVisible() const { return m_selfVisible && m_parentVisible; } // Whether or not we are actually visible.
170     virtual void setParentVisible(bool visible) { m_parentVisible = visible; }
171     void setSelfVisible(bool v) { m_selfVisible = v; }
172
173     void setIsSelected(bool);
174
175     virtual bool isFrameView() const { return false; }
176     virtual bool isPluginView() const { return false; }
177     // FIXME: The Mac plug-in code should inherit from PluginView. When this happens PluginViewBase and PluginView can become one class.
178     virtual bool isPluginViewBase() const { return false; }
179     virtual bool isScrollbar() const { return false; }
180     virtual bool isScrollView() const { return false; }
181
182     void removeFromParent();
183     virtual void setParent(ScrollView* view);
184     ScrollView* parent() const { return m_parent; }
185     ScrollView* root() const;
186
187     virtual void handleEvent(Event*) { }
188
189     virtual void notifyWidget(WidgetNotification) { }
190
191     IntRect convertToRootView(const IntRect&) const;
192     IntRect convertFromRootView(const IntRect&) const;
193
194     IntPoint convertToRootView(const IntPoint&) const;
195     IntPoint convertFromRootView(const IntPoint&) const;
196
197     // It is important for cross-platform code to realize that Mac has flipped coordinates.  Therefore any code
198     // that tries to convert the location of a rect using the point-based convertFromContainingWindow will end
199     // up with an inaccurate rect.  Always make sure to use the rect-based convertFromContainingWindow method
200     // when converting window rects.
201     IntRect convertToContainingWindow(const IntRect&) const;
202     IntRect convertFromContainingWindow(const IntRect&) const;
203
204     IntPoint convertToContainingWindow(const IntPoint&) const;
205     IntPoint convertFromContainingWindow(const IntPoint&) const;
206
207     virtual void frameRectsChanged();
208
209     // Notifies this widget that other widgets on the page have been repositioned.
210     virtual void widgetPositionsUpdated() {}
211
212     // Notifies this widget that its clip rect changed.
213     virtual void clipRectChanged() { }
214
215     // Whether transforms affect the frame rect. FIXME: We get rid of this and have
216     // the frame rects be the same no matter what transforms are applied.
217     virtual bool transformsAffectFrameRect() { return true; }
218
219 #if PLATFORM(MAC)
220     NSView* getOuterView() const;
221
222     void removeFromSuperview();
223 #endif
224
225 #if PLATFORM(EFL)
226     void setEvasObject(Evas_Object*);
227     Evas_Object* evasObject() { return m_evasObject; }
228 #endif
229
230 #if PLATFORM(CHROMIUM)
231     virtual bool isPluginContainer() const { return false; }
232 #endif
233
234 #if PLATFORM(QT)
235     QObject* bindingObject() const;
236     void setBindingObject(QObject*);
237 #endif
238
239     // Virtual methods to convert points to/from the containing ScrollView
240     virtual IntRect convertToContainingView(const IntRect&) const;
241     virtual IntRect convertFromContainingView(const IntRect&) const;
242     virtual IntPoint convertToContainingView(const IntPoint&) const;
243     virtual IntPoint convertFromContainingView(const IntPoint&) const;
244
245     // A means to access the AX cache when this object can get a pointer to it.
246     virtual AXObjectCache* axObjectCache() const { return 0; }
247     
248 private:
249     void init(PlatformWidget); // Must be called by all Widget constructors to initialize cross-platform data.
250
251     void releasePlatformWidget();
252     void retainPlatformWidget();
253
254     // These methods are used to convert from the root widget to the containing window,
255     // which has behavior that may differ between platforms (e.g. Mac uses flipped window coordinates).
256     static IntRect convertFromRootToContainingWindow(const Widget* rootWidget, const IntRect&);
257     static IntRect convertFromContainingWindowToRoot(const Widget* rootWidget, const IntRect&);
258
259     static IntPoint convertFromRootToContainingWindow(const Widget* rootWidget, const IntPoint&);
260     static IntPoint convertFromContainingWindowToRoot(const Widget* rootWidget, const IntPoint&);
261
262 private:
263     ScrollView* m_parent;
264 #if !PLATFORM(MAC)
265     PlatformWidget m_widget;
266 #else
267     RetainPtr<NSView> m_widget;
268 #endif
269     bool m_selfVisible;
270     bool m_parentVisible;
271
272     IntRect m_frame; // Not used when a native widget exists.
273
274 #if PLATFORM(MAC)
275     WidgetPrivate* m_data;
276 #endif
277
278 #if PLATFORM(EFL)
279     Evas_Object* m_evasObject;
280 #endif
281
282 #if PLATFORM(QT)
283     QPointer<QObject> m_bindingObject;
284 #endif
285
286 };
287
288 #if !PLATFORM(MAC)
289
290 inline PlatformWidget Widget::platformWidget() const
291 {
292     return m_widget;
293 }
294
295 inline void Widget::setPlatformWidget(PlatformWidget widget)
296 {
297     if (widget != m_widget) {
298         releasePlatformWidget();
299         m_widget = widget;
300         retainPlatformWidget();
301     }
302 }
303
304 #endif
305
306 #if !PLATFORM(GTK)
307
308 inline void Widget::releasePlatformWidget()
309 {
310 }
311
312 inline void Widget::retainPlatformWidget()
313 {
314 }
315
316 #endif
317
318 } // namespace WebCore
319
320 #endif // Widget_h