1ae3434c2cfb6c1b9f0066ef88008b7428959032
[WebKit-https.git] / WebCore / kwq / KWQScrollView.mm
1 /*
2  * Copyright (C) 2001, 2002 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 #include <qscrollview.h>
27
28 #include <kwqdebug.h>
29
30 #include <external.h>
31
32 /*
33     This class implementation does NOT actually emulate the Qt QScrollView.
34     Instead our WebPageView, like any other NSView can be set as the document
35     to a standard NSScrollView.
36
37     We do implement the placeWidget() function to essentially addSubview views
38     onto this view.
39 */
40
41 QScrollView::QScrollView(QWidget *parent, const char *name, int f)
42     : QFrame(parent)
43 {
44 }
45
46 QWidget* QScrollView::viewport() const
47 {
48     return const_cast<QScrollView *>(this);
49 }
50
51 int QScrollView::visibleWidth() const
52 {
53 #if 0
54     id view = getView();
55     NSScrollView *scrollView = [[view superview] superview];
56     int visibleWidth;
57     
58     if (scrollView != nil && [scrollView isKindOfClass: [NSScrollView class]])
59         visibleWidth = (int)[scrollView documentVisibleRect].size.width;
60     else
61         visibleWidth = (int)[view bounds].size.width;
62     return visibleWidth;
63 #else
64     NSScrollView *view = (NSScrollView *)getView();
65     int visibleWidth;
66     if (view != nil && [view isKindOfClass: [NSScrollView class]]){
67         visibleWidth = (int)[view documentVisibleRect].size.width;
68     }
69     else
70         visibleWidth = (int)[view bounds].size.width;
71     if (visibleWidth <= 0)
72         visibleWidth = 200;
73     return visibleWidth;
74 #endif
75 }
76
77
78 int QScrollView::visibleHeight() const
79 {
80 #if 0
81     id view = getView();
82     NSScrollView *scrollView = [[view superview] superview];
83     int visibleHeight;
84     
85     if (scrollView != nil && [scrollView isKindOfClass: [NSScrollView class]]){
86         visibleHeight = (int)[scrollView documentVisibleRect].size.height;
87     }
88     else
89         visibleHeight = (int)[view bounds].size.height;
90     return visibleHeight;
91 #else
92     NSScrollView *view = (NSScrollView *)getView();
93     int visibleHeight;
94     
95     if (view != nil && [view isKindOfClass: [NSScrollView class]]){
96         visibleHeight = (int)[view documentVisibleRect].size.height;
97     }
98     else
99         visibleHeight = (int)[view bounds].size.height;
100         
101     if (visibleHeight <= 0)
102         visibleHeight = 200;
103     return visibleHeight;
104 #endif
105 }
106
107
108 int QScrollView::contentsWidth() const
109 {
110     NSScrollView *view = (NSScrollView *)getView();
111     if ([view respondsToSelector: @selector(documentView)])
112         return (int)[[view documentView] bounds].size.width;
113     return (int)[view bounds].size.width;
114 }
115
116
117 int QScrollView::contentsHeight() const
118 {
119     NSScrollView *view = (NSScrollView *)getView();
120     if ([view respondsToSelector: @selector(documentView)])
121         return (int)[[view documentView] bounds].size.height;
122     return (int)[view bounds].size.height;
123 }
124
125 int QScrollView::contentsX() const
126 {
127     NSScrollView *view = (NSScrollView *)getView();
128     if ([view respondsToSelector: @selector(documentView)])
129         return (int)[[view documentView] bounds].origin.x;
130     return 0;
131 }
132
133 int QScrollView::contentsY() const
134 {
135     NSScrollView *view = (NSScrollView *)getView();
136     if ([view respondsToSelector: @selector(documentView)])
137         return (int)[[view documentView] bounds].origin.y;
138     return 0;
139 }
140
141 int QScrollView::childX(QWidget *)
142 {
143     return 0;
144 }
145
146 int QScrollView::childY(QWidget *)
147 {
148     return 0;
149 }
150
151 void QScrollView::scrollBy(int dx, int dy)
152 {
153     _logNeverImplemented();
154 }
155
156 void QScrollView::setContentsPos(int x, int y)
157 {
158     NSView *view = getView();    
159     if ([view isKindOfClass: [NSScrollView class]]) {
160         NSScrollView *scrollView = (NSScrollView *)view;
161         view = [scrollView documentView];
162     }
163
164     if (x < 0)
165         x = 0;
166     if (y < 0)
167         y = 0;
168     [view scrollPoint: NSMakePoint(x,y)];
169 }
170
171 void QScrollView::setVScrollBarMode(ScrollBarMode)
172 {
173     _logNeverImplemented();
174 }
175
176 void QScrollView::setHScrollBarMode(ScrollBarMode)
177 {
178     _logNeverImplemented();
179 }
180
181 void QScrollView::addChild(QWidget* child, int x, int y)
182 {
183     NSView *thisView, *subView;
184
185     if (child->x() != x || child->y() != y)
186         child->move(x, y);
187         
188     thisView = getView();
189     if ([thisView isKindOfClass: [NSScrollView class]]) {
190         NSScrollView *scrollView = thisView;
191         thisView = [scrollView documentView];
192     }
193
194     subView = child->getView();
195     if ([subView isKindOfClass: [NSScrollView class]]) {
196         subView = [subView superview];
197     }
198
199     if ([subView superview] == thisView) {
200         return;
201     }
202     
203     [subView removeFromSuperview];
204     
205     KWQDEBUGLEVEL (KWQ_LOG_FRAMES, "Adding %p %s at (%d,%d) w %d h %d\n", subView, [[[subView class] className] cString], x, y, (int)[subView frame].size.width, (int)[subView frame].size.height);
206     [thisView addSubview: subView];
207 }
208
209 void QScrollView::removeChild(QWidget* child)
210 {
211     [child->getView() removeFromSuperview];
212 }
213
214 void QScrollView::resizeContents(int w, int h)
215 {
216     KWQDEBUGLEVEL (KWQ_LOG_FRAMES, "%p %s at w %d h %d\n", getView(), [[[getView() class] className] cString], w, h);
217     if ([getView() isKindOfClass: [NSScrollView class]]){
218         NSScrollView *scrollView = (NSScrollView *)getView();
219         IFWebView *wview = [scrollView documentView];
220         
221         KWQDEBUGLEVEL (KWQ_LOG_FRAMES, "%p %s at w %d h %d\n", wview, [[[wview class] className] cString], w, h);
222         //w -= (int)[NSScroller scrollerWidth];
223         //w -= 1;
224         if (w < 0)
225             w = 0;
226         // Why isn't there a scollerHeight?
227         //h -= (int)[NSScroller scrollerWidth];
228         //h -= 1;
229         if (h < 0)
230             h = 0;
231         [wview setFrameSize: NSMakeSize (w,h)];
232     }
233     else {
234         resize (w, h);
235     }
236 }
237
238 void QScrollView::updateContents(int x, int y, int w, int h)
239 {
240     KWQDEBUGLEVEL (KWQ_LOG_FRAMES, "%p %s at (%d,%d) w %d h %d\n", getView(), [[[getView() class] className] cString], x, y, w, h);
241 }
242
243 void QScrollView::updateContents(const QRect &rect)
244 {
245     return updateContents(rect.x(), rect.y(), rect.width(), rect.height());
246 }
247
248
249 void QScrollView::repaintContents(int x, int y, int w, int h, bool erase)
250 {
251     KWQDEBUGLEVEL (KWQ_LOG_FRAMES, "%p %s at (%d,%d) w %d h %d\n", getView(), [[[getView() class] className] cString], x, y, w, h);
252 }
253
254 QPoint QScrollView::contentsToViewport(const QPoint &p)
255 {
256     int vx, vy;
257     contentsToViewport(p.x(), p.y(), vx, vy);
258     return QPoint(vx, vy);
259 }
260
261 void QScrollView::contentsToViewport(int x, int y, int& vx, int& vy)
262 {
263     NSView *view = getView();    
264     if ([view isKindOfClass: [NSScrollView class]]) {
265         NSScrollView *scrollView = (NSScrollView *)view;
266         view = [scrollView documentView];
267     }
268         
269     NSPoint np = [view convertPoint: NSMakePoint (x, y) toView: nil];
270     
271     vx = (int)np.x;
272     vy = (int)np.y;
273 }
274
275 void QScrollView::viewportToContents(int vx, int vy, int& x, int& y)
276 {
277     NSView *view = getView();    
278     if ([view isKindOfClass: [NSScrollView class]]) {
279         NSScrollView *scrollView = (NSScrollView *)view;
280         view = [scrollView documentView];
281     }
282         
283     NSPoint np = [view convertPoint: NSMakePoint (vx, vy) fromView: nil];
284     
285     x = (int)np.x;
286     y = (int)np.y;
287 }
288
289 void QScrollView::viewportWheelEvent(QWheelEvent *)
290 {
291     _logNeverImplemented();
292 }
293
294 QWidget *QScrollView::clipper() const
295 {
296     _logNeverImplemented();
297     return (QWidget *)this;
298 }
299
300 void QScrollView::enableClipper(bool)
301 {
302     _logNeverImplemented();
303 }
304
305 void QScrollView::setStaticBackground(bool)
306 {
307     _logNeverImplemented();
308 }
309
310 void QScrollView::resizeEvent(QResizeEvent *)
311 {
312     _logNeverImplemented();
313 }
314
315 void QScrollView::ensureVisible(int,int)
316 {
317     _logNeverImplemented();
318 }
319
320 void QScrollView::ensureVisible(int,int,int,int)
321 {
322     _logNeverImplemented();
323 }