4dd41f3d63021dd8977335ccdffc914bd15261a9
[WebKit-https.git] / WebCore / platform / qt / WidgetQt.cpp
1 /*
2  * Copyright (C) 2006 Dirk Mueller <mueller@kde.org>
3  * Copyright (C) 2006 George Stiakos <staikos@kde.org>
4  * Copyright (C) 2006 Zack Rusin <zack@kde.org>
5  * Copyright (C) 2006 Nikolas Zimmermann <zimmermann@kde.org>
6  *
7  * All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice, this list of conditions and the following disclaimer.
14  * 2. Redistributions in binary form must reproduce the above copyright
15  *    notice, this list of conditions and the following disclaimer in the
16  *    documentation and/or other materials provided with the distribution.
17  *
18  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
19  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
21  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
22  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
23  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
24  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
25  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
26  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29  */
30
31 #include "config.h"
32
33 #include "Font.h"
34 #include "Widget.h"
35 #include "Cursor.h"
36 #include "IntRect.h"
37 #include "RenderObject.h"
38 #include "GraphicsContext.h"
39 #include "WidgetClient.h"
40
41 #include <QAbstractScrollArea>
42 #include <QScrollBar>
43 #include <QWidget>
44
45 #define notImplemented() qDebug("FIXME: UNIMPLEMENTED: %s:%d (%s)", __FILE__, __LINE__, __FUNCTION__)
46
47 namespace WebCore {
48
49 struct WidgetPrivate
50 {
51     WidgetPrivate() : m_client(0), m_widget(0), m_scrollArea(0) { }
52     ~WidgetPrivate() { delete m_widget; }
53
54     QWidget* canvas() const {
55         return m_scrollArea ? m_scrollArea->viewport() : m_widget;
56     }
57
58     QAbstractScrollArea* parentScroll() const {
59         QObject *parent = m_widget->parent();
60         while (parent && !qobject_cast<QAbstractScrollArea*>(parent)) {
61             parent = parent->parent();
62         }
63         if (parent)
64             return static_cast<QAbstractScrollArea*>(parent);
65         return 0;
66     }
67     void setGeometry(const QRect &rect) {
68         QAbstractScrollArea *mapper = parentScroll();
69         QRect r = rect;
70         if (mapper)
71             r = r.translated(-mapper->horizontalScrollBar()->value(),
72                              -mapper->verticalScrollBar()->value());
73         m_widget->setGeometry(r);
74     }
75     QRect geometry() const {
76         QAbstractScrollArea *mapper = parentScroll();
77         QRect r = m_widget->geometry();
78         if (mapper)
79             r = r.translated(-mapper->horizontalScrollBar()->value(),
80                              -mapper->verticalScrollBar()->value());
81         return r;
82     }
83
84     WidgetClient* m_client;
85
86     QWidget*     m_widget;
87     QAbstractScrollArea* m_scrollArea;
88
89     Font     m_font;
90 };
91
92 Widget::Widget()
93     : data(new WidgetPrivate())
94 {
95 }
96
97 Widget::~Widget()
98 {
99     delete data;
100     data = 0;
101 }
102
103 void Widget::setClient(WidgetClient* c)
104 {
105     data->m_client = c;
106 }
107
108 WidgetClient* Widget::client() const
109 {
110     return data->m_client;
111 }
112
113 IntRect Widget::frameGeometry() const
114 {
115     if (!data->m_widget)
116         return IntRect();
117     return data->geometry();
118 }
119
120 bool Widget::hasFocus() const
121 {
122     if (!data->canvas())
123         return false;
124
125     return data->canvas()->hasFocus();
126 }
127
128 void Widget::setFocus()
129 {
130     if (data->canvas())
131         data->canvas()->setFocus();
132 }
133
134 void Widget::clearFocus()
135 {
136     if (data->canvas())
137         data->canvas()->clearFocus();
138 }
139
140 const Font& Widget::font() const
141 {
142     return data->m_font;
143 }
144
145 void Widget::setFont(const Font& font)
146 {
147     if (data->canvas())
148         data->canvas()->setFont(font);
149     data->m_font = font;
150 }
151
152 void Widget::setCursor(const Cursor& cursor)
153 {
154 #ifndef QT_NO_CURSOR
155     if (data->m_widget)
156         data->m_widget->setCursor(cursor.impl());
157 #endif
158 }
159
160 void Widget::show()
161 {
162     if (data->m_widget)
163         data->m_widget->show();
164 }
165
166 void Widget::hide()
167 {
168     if (data->m_widget)
169         data->m_widget->hide();
170 }
171
172 void Widget::setQWidget(QWidget* child)
173 {
174     data->m_widget = child;
175     data->m_scrollArea = qobject_cast<QAbstractScrollArea*>(child);
176
177 }
178
179 QWidget* Widget::qwidget() const
180 {
181     return data->m_widget;
182 }
183
184 QWidget* Widget::canvas() const
185 {
186     return data->canvas();
187 }
188
189 void Widget::setFrameGeometry(const IntRect& r)
190 {
191     if (!data->m_widget)
192         return;
193     data->setGeometry(r);
194 }
195
196 GraphicsContext* Widget::lockDrawingFocus()
197 {
198     notImplemented();
199     return 0;
200 }
201
202 void Widget::unlockDrawingFocus(GraphicsContext*)
203 {
204     notImplemented();
205 }
206
207 void Widget::paint(GraphicsContext*, const IntRect&)
208 {
209     notImplemented();
210 }
211
212 void Widget::enableFlushDrawing()
213 {
214     notImplemented();
215 }
216
217 bool Widget::isEnabled() const
218 {
219     if (!data->m_widget)
220         return false;
221
222     return data->m_widget->isEnabled();
223 }
224
225 void Widget::setIsSelected(bool)
226 {
227     notImplemented();
228 }
229
230 void Widget::disableFlushDrawing()
231 {
232     notImplemented();
233 }
234
235 void Widget::setEnabled(bool en)
236 {
237     if (data->m_widget)
238         data->m_widget->setEnabled(en);
239 }
240
241 Widget::FocusPolicy Widget::focusPolicy() const
242 {
243     if (!data->canvas())
244         return NoFocus;
245
246     switch (data->canvas()->focusPolicy())
247     {
248         case Qt::TabFocus:
249             return TabFocus;
250         case Qt::ClickFocus:
251             return ClickFocus;
252         case Qt::StrongFocus:
253             return StrongFocus;
254         case Qt::WheelFocus:
255             return WheelFocus;
256         case Qt::NoFocus:
257             return NoFocus;
258     }
259
260     return NoFocus;
261 }
262
263 void Widget::invalidate()
264 {
265     if (data->m_widget)
266         data->m_widget->update();
267 }
268
269 void Widget::invalidateRect(const IntRect& r)
270 {
271     if (data->m_widget)
272         data->m_widget->update(r);
273 }
274
275 void Widget::removeFromParent()
276 {
277     notImplemented();
278 }
279
280 }
281
282 // vim: ts=4 sw=4 et