initial import
[vuplus_webkit] / Source / WebCore / platform / chromium / ScrollbarOverlayUtilitiesChromiumMac.mm
1 /*
2  * Copyright (C) 2008, 2011 Apple Inc. All Rights Reserved.
3  * Copyright (C) 2011 Google Inc. 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 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 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 #include "config.h"
28
29 #if USE(WK_SCROLLBAR_PAINTER)
30
31 #include "ScrollbarOverlayUtilitiesChromiumMac.h"
32 #include "ScrollTypes.h"
33 #include <Cocoa/Cocoa.h>
34
35 // -----------------------------------------------------------------------------
36 // This file contains utilities to draw overlay scrollbars. There are no public
37 // APIs yet on the Mac to draw overlay scrollbars so we use private APIs that
38 // we look up at runtime. If the private APIs don't exist then the wkMake*
39 // functions will return nil.
40 //
41 // Note, this file contains functions copied from WebCoreSystemInterface.h.
42 // Using the same names makes the code easier to maintain.
43 // -----------------------------------------------------------------------------
44
45 // Public APIs not available on versions of Mac on which we build
46 #if (defined(BUILDING_ON_LEOPARD) || defined(BUILDING_ON_SNOW_LEOPARD))
47 @interface NSScroller (NSObject)
48 + (NSScrollerStyle)preferredScrollerStyle;
49 @end
50 #endif
51
52 // These are private APIs to draw overlay scrollbars.
53 @interface NSScrollerImp : NSObject
54
55 + (id)scrollerImpWithStyle:(NSScrollerStyle)style
56                controlSize:(NSControlSize)size
57                 horizontal:(BOOL)horizontal
58       replacingScrollerImp:(id)scroller;
59
60 @property CGFloat knobAlpha;
61 @property CGFloat trackAlpha;
62 @property CGFloat knobProportion;
63 @property NSInteger knobStyle;
64 @property(getter=isEnabled) BOOL enabled;
65 @property(getter=isHorizontal) BOOL horizontal;
66 @property double doubleValue;
67 @property(assign) id delegate;
68
69 - (CGFloat)knobMinLength;
70 - (CGFloat)trackOverlapEndInset;
71 - (CGFloat)knobOverlapEndInset;
72 - (CGFloat)trackEndInset;
73 - (CGFloat)knobEndInset;
74 - (CGFloat)trackBoxWidth;
75 - (CGFloat)trackWidth;
76 - (void)setBoundsSize:(NSSize)size;
77 - (void)drawKnobSlotInRect:(NSRect)rect
78                  highlight:(BOOL)flag;
79 - (void)drawKnob;
80 - (void)setOverlayScrollerState:(NSScrollerStyle)state
81                forceImmediately:(BOOL)flag;
82 - (void)setDelegate:(id)delegate;
83 - (NSRect)rectForPart:(NSUInteger)arg1;
84
85 @end
86
87 // These are private APIs to manage overlay scrollbars.
88 @interface NSScrollerImpPair : NSObject
89
90 @property NSScrollerStyle scrollerStyle;
91 @property(retain) NSScrollerImp *horizontalScrollerImp;
92 @property(retain) NSScrollerImp *verticalScrollerImp;
93 @property(assign) id delegate;
94
95 - (void)hideOverlayScrollers;
96 - (void)flashScrollers;
97 - (void)contentAreaScrolled;
98 - (void)contentAreaWillDraw;
99 - (void)contentAreaDidHide;
100 - (void)windowOrderedOut;
101 - (void)windowOrderedIn;
102 - (void)mouseEnteredContentArea;
103 - (void)mouseMovedInContentArea;
104 - (void)mouseExitedContentArea;
105 - (void)startLiveResize;
106 - (void)contentAreaDidResize;
107 - (void)endLiveResize;
108 - (void)beginScrollGesture;
109 - (void)endScrollGesture;
110
111 @end
112
113 static Class lookUpNSScrollerImpClass()
114 {
115     static Class result = NSClassFromString(@"NSScrollerImp");
116     return result;
117 }
118
119 static Class lookUpNSScrollerImpPairClass()
120 {
121     static Class result = NSClassFromString(@"NSScrollerImpPair");
122     return result;
123 }
124
125 static NSControlSize scrollbarControlSizeToNSControlSize(int controlSize)
126 {
127     return controlSize == WebCore::RegularScrollbar ? NSRegularControlSize : NSSmallControlSize;
128 }
129
130 static NSScrollerStyle preferredScrollerStyle()
131 {
132     if ([NSScroller respondsToSelector:@selector(preferredScrollerStyle)])
133         return [NSScroller preferredScrollerStyle];
134     return NSScrollerStyleLegacy;
135 }
136
137 bool wkScrollbarPainterUsesOverlayScrollers(void)
138 {
139     return preferredScrollerStyle() == NSScrollerStyleOverlay;
140 }
141
142 bool wkScrollbarPainterIsHorizontal(WKScrollbarPainterRef painter)
143 {
144     return [painter isHorizontal];
145 }
146
147 CGFloat wkScrollbarPainterKnobAlpha(WKScrollbarPainterRef painter)
148 {
149     return [painter knobAlpha];
150 }
151
152 void wkScrollbarPainterSetOverlayState(WKScrollbarPainterRef painter, int overlayScrollerState)
153 {
154     [painter setOverlayScrollerState:overlayScrollerState
155                     forceImmediately:YES];
156 }
157
158 void wkScrollbarPainterPaint(WKScrollbarPainterRef painter, bool enabled, double value, CGFloat proportion, NSRect frameRect)
159 {
160     wkScrollbarPainterPaintTrack(painter, enabled, value, proportion, frameRect);
161     wkScrollbarPainterPaintKnob(painter);
162 }
163
164 void wkScrollbarPainterPaintTrack(WKScrollbarPainterRef painter, bool enabled, double value, CGFloat proportion, NSRect frameRect)
165 {
166     [painter setEnabled:enabled];
167     [painter setBoundsSize:frameRect.size];
168     [painter setDoubleValue:value];
169     [painter setKnobProportion:proportion];
170
171     if ([painter isHorizontal])
172         frameRect.size.height = [painter trackWidth];
173     else
174         frameRect.size.width = [painter trackWidth];
175     frameRect.origin = NSZeroPoint;
176
177     [painter drawKnobSlotInRect:frameRect highlight:NO];
178 }
179
180 void wkScrollbarPainterPaintKnob(WKScrollbarPainterRef painter)
181 {
182     [painter drawKnob];
183 }
184
185 int wkScrollbarMinimumThumbLength(WKScrollbarPainterRef painter)
186 {
187     return [painter knobMinLength];
188 }
189
190 void wkScrollbarPainterSetDelegate(WKScrollbarPainterRef painter, id scrollbarPainterDelegate)
191 {
192     [painter setDelegate:scrollbarPainterDelegate];
193 }
194
195 void wkScrollbarPainterSetEnabled(WKScrollbarPainterRef painter, bool enabled)
196 {
197     [painter setEnabled:enabled];
198 }
199
200 CGFloat wkScrollbarPainterTrackAlpha(WKScrollbarPainterRef painter)
201 {
202     return [painter trackAlpha];
203 }
204
205 WKScrollbarPainterRef wkMakeScrollbarPainter(int controlSize, bool isHorizontal)
206 {
207     return wkMakeScrollbarReplacementPainter(nil, preferredScrollerStyle(), controlSize, isHorizontal);
208 }
209
210 int wkScrollbarThickness(int controlSize)
211 {
212     return [wkMakeScrollbarPainter(controlSize, false) trackBoxWidth];
213 }
214
215 int wkScrollbarMinimumTotalLengthNeededForThumb(WKScrollbarPainterRef painter)
216 {
217     return [painter knobMinLength] +
218            [painter trackOverlapEndInset] +
219            [painter knobOverlapEndInset] +
220            ([painter trackEndInset] + [painter knobEndInset]) * 2;
221 }
222
223 WKScrollbarPainterRef wkVerticalScrollbarPainterForController(WKScrollbarPainterControllerRef controller)
224 {
225     return [controller verticalScrollerImp];
226 }
227
228 WKScrollbarPainterRef wkHorizontalScrollbarPainterForController(WKScrollbarPainterControllerRef controller)
229 {
230     return [controller horizontalScrollerImp];
231 }
232
233 wkScrollerStyle wkScrollbarPainterControllerStyle(WKScrollbarPainterControllerRef controller)
234 {
235     return [controller scrollerStyle];
236 }
237
238 WKScrollbarPainterRef wkMakeScrollbarReplacementPainter(WKScrollbarPainterRef oldPainter, int newStyle, int controlSize, bool isHorizontal)
239 {
240     if (!isScrollbarOverlayAPIAvailable())
241         return nil;
242     return [lookUpNSScrollerImpClass() scrollerImpWithStyle:newStyle
243                                                 controlSize:scrollbarControlSizeToNSControlSize(controlSize)
244                                                  horizontal:isHorizontal
245                                        replacingScrollerImp:oldPainter];
246 }
247
248 void wkSetPainterForPainterController(WKScrollbarPainterControllerRef controller, WKScrollbarPainterRef painter, bool isHorizontal)
249 {
250     if (isHorizontal)
251         [controller setHorizontalScrollerImp:painter];
252     else
253         [controller setVerticalScrollerImp:painter];
254 }
255
256 void wkSetScrollbarPainterControllerStyle(WKScrollbarPainterControllerRef painter, wkScrollerStyle newStyle)
257 {
258     [painter setScrollerStyle:newStyle];
259 }
260
261 CGRect wkScrollbarPainterKnobRect(WKScrollbarPainterRef painter)
262 {
263     return NSRectToCGRect([painter rectForPart:NSScrollerKnob]);
264 }
265
266 void wkSetScrollbarPainterKnobAlpha(WKScrollbarPainterRef painter, CGFloat alpha)
267 {
268     [painter setKnobAlpha:alpha];
269 }
270
271 void wkSetScrollbarPainterTrackAlpha(WKScrollbarPainterRef painter, CGFloat alpha)
272 {
273     [painter setTrackAlpha:alpha];
274 }
275
276 void wkSetScrollbarPainterKnobStyle(WKScrollbarPainterRef painter, wkScrollerKnobStyle style)
277 {
278     [painter setKnobStyle:style];
279 }
280
281 WKScrollbarPainterControllerRef wkMakeScrollbarPainterController(id painterControllerDelegate)
282 {
283     if (!isScrollbarOverlayAPIAvailable())
284         return nil;
285     NSScrollerImpPair* controller = [[[lookUpNSScrollerImpPairClass() alloc] init] autorelease];
286     [controller setDelegate:painterControllerDelegate];
287     [controller setScrollerStyle:preferredScrollerStyle()];
288     return controller;
289 }
290
291 void wkContentAreaScrolled(WKScrollbarPainterControllerRef controller)
292 {
293     [controller contentAreaScrolled];
294 }
295
296 void wkContentAreaWillPaint(WKScrollbarPainterControllerRef controller)
297 {
298     [controller contentAreaWillDraw];
299 }
300
301 void wkMouseEnteredContentArea(WKScrollbarPainterControllerRef controller)
302 {
303     [controller mouseEnteredContentArea];
304 }
305
306 void wkMouseExitedContentArea(WKScrollbarPainterControllerRef controller)
307 {
308     [controller mouseExitedContentArea];
309 }
310
311 void wkMouseMovedInContentArea(WKScrollbarPainterControllerRef controller)
312 {
313     [controller mouseMovedInContentArea];
314 }
315
316 void wkWillStartLiveResize(WKScrollbarPainterControllerRef controller)
317 {
318     [controller startLiveResize];
319 }
320
321 void wkContentAreaResized(WKScrollbarPainterControllerRef controller)
322 {
323     [controller contentAreaDidResize];
324 }
325
326 void wkWillEndLiveResize(WKScrollbarPainterControllerRef controller)
327 {
328     [controller endLiveResize];
329 }
330
331 void wkContentAreaDidShow(WKScrollbarPainterControllerRef controller)
332 {
333     [controller windowOrderedIn];
334 }
335
336 void wkContentAreaDidHide(WKScrollbarPainterControllerRef controller)
337 {
338     [controller windowOrderedOut];
339 }
340
341 void wkDidBeginScrollGesture(WKScrollbarPainterControllerRef controller)
342 {
343     [controller beginScrollGesture];
344 }
345
346 void wkDidEndScrollGesture(WKScrollbarPainterControllerRef controller)
347 {
348     [controller endScrollGesture];
349 }
350
351 void wkScrollbarPainterForceFlashScrollers(WKScrollbarPainterControllerRef controller)
352 {
353     [controller hideOverlayScrollers];
354     [controller flashScrollers];
355 }
356
357 bool isScrollbarOverlayAPIAvailable()
358 {
359     static bool apiAvailable = [lookUpNSScrollerImpClass() respondsToSelector:@selector(scrollerImpWithStyle:controlSize:horizontal:replacingScrollerImp:)] &&
360                                [lookUpNSScrollerImpPairClass() instancesRespondToSelector:@selector(scrollerStyle)];
361     return apiAvailable;
362 }
363
364 #endif // USE(WK_SCROLLBAR_PAINTER)