2 * Copyright (C) 2008, 2011 Apple Inc. All Rights Reserved.
3 * Copyright (C) 2011 Google Inc. All Rights Reserved.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
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.
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.
29 #if USE(WK_SCROLLBAR_PAINTER)
31 #include "ScrollbarOverlayUtilitiesChromiumMac.h"
32 #include "ScrollTypes.h"
33 #include <Cocoa/Cocoa.h>
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.
41 // Note, this file contains functions copied from WebCoreSystemInterface.h.
42 // Using the same names makes the code easier to maintain.
43 // -----------------------------------------------------------------------------
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;
52 // These are private APIs to draw overlay scrollbars.
53 @interface NSScrollerImp : NSObject
55 + (id)scrollerImpWithStyle:(NSScrollerStyle)style
56 controlSize:(NSControlSize)size
57 horizontal:(BOOL)horizontal
58 replacingScrollerImp:(id)scroller;
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;
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
80 - (void)setOverlayScrollerState:(NSScrollerStyle)state
81 forceImmediately:(BOOL)flag;
82 - (void)setDelegate:(id)delegate;
83 - (NSRect)rectForPart:(NSUInteger)arg1;
87 // These are private APIs to manage overlay scrollbars.
88 @interface NSScrollerImpPair : NSObject
90 @property NSScrollerStyle scrollerStyle;
91 @property(retain) NSScrollerImp *horizontalScrollerImp;
92 @property(retain) NSScrollerImp *verticalScrollerImp;
93 @property(assign) id delegate;
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;
113 static Class lookUpNSScrollerImpClass()
115 static Class result = NSClassFromString(@"NSScrollerImp");
119 static Class lookUpNSScrollerImpPairClass()
121 static Class result = NSClassFromString(@"NSScrollerImpPair");
125 static NSControlSize scrollbarControlSizeToNSControlSize(int controlSize)
127 return controlSize == WebCore::RegularScrollbar ? NSRegularControlSize : NSSmallControlSize;
130 static NSScrollerStyle preferredScrollerStyle()
132 if ([NSScroller respondsToSelector:@selector(preferredScrollerStyle)])
133 return [NSScroller preferredScrollerStyle];
134 return NSScrollerStyleLegacy;
137 bool wkScrollbarPainterUsesOverlayScrollers(void)
139 return preferredScrollerStyle() == NSScrollerStyleOverlay;
142 bool wkScrollbarPainterIsHorizontal(WKScrollbarPainterRef painter)
144 return [painter isHorizontal];
147 CGFloat wkScrollbarPainterKnobAlpha(WKScrollbarPainterRef painter)
149 return [painter knobAlpha];
152 void wkScrollbarPainterSetOverlayState(WKScrollbarPainterRef painter, int overlayScrollerState)
154 [painter setOverlayScrollerState:overlayScrollerState
155 forceImmediately:YES];
158 void wkScrollbarPainterPaint(WKScrollbarPainterRef painter, bool enabled, double value, CGFloat proportion, NSRect frameRect)
160 wkScrollbarPainterPaintTrack(painter, enabled, value, proportion, frameRect);
161 wkScrollbarPainterPaintKnob(painter);
164 void wkScrollbarPainterPaintTrack(WKScrollbarPainterRef painter, bool enabled, double value, CGFloat proportion, NSRect frameRect)
166 [painter setEnabled:enabled];
167 [painter setBoundsSize:frameRect.size];
168 [painter setDoubleValue:value];
169 [painter setKnobProportion:proportion];
171 if ([painter isHorizontal])
172 frameRect.size.height = [painter trackWidth];
174 frameRect.size.width = [painter trackWidth];
175 frameRect.origin = NSZeroPoint;
177 [painter drawKnobSlotInRect:frameRect highlight:NO];
180 void wkScrollbarPainterPaintKnob(WKScrollbarPainterRef painter)
185 int wkScrollbarMinimumThumbLength(WKScrollbarPainterRef painter)
187 return [painter knobMinLength];
190 void wkScrollbarPainterSetDelegate(WKScrollbarPainterRef painter, id scrollbarPainterDelegate)
192 [painter setDelegate:scrollbarPainterDelegate];
195 void wkScrollbarPainterSetEnabled(WKScrollbarPainterRef painter, bool enabled)
197 [painter setEnabled:enabled];
200 CGFloat wkScrollbarPainterTrackAlpha(WKScrollbarPainterRef painter)
202 return [painter trackAlpha];
205 WKScrollbarPainterRef wkMakeScrollbarPainter(int controlSize, bool isHorizontal)
207 return wkMakeScrollbarReplacementPainter(nil, preferredScrollerStyle(), controlSize, isHorizontal);
210 int wkScrollbarThickness(int controlSize)
212 return [wkMakeScrollbarPainter(controlSize, false) trackBoxWidth];
215 int wkScrollbarMinimumTotalLengthNeededForThumb(WKScrollbarPainterRef painter)
217 return [painter knobMinLength] +
218 [painter trackOverlapEndInset] +
219 [painter knobOverlapEndInset] +
220 ([painter trackEndInset] + [painter knobEndInset]) * 2;
223 WKScrollbarPainterRef wkVerticalScrollbarPainterForController(WKScrollbarPainterControllerRef controller)
225 return [controller verticalScrollerImp];
228 WKScrollbarPainterRef wkHorizontalScrollbarPainterForController(WKScrollbarPainterControllerRef controller)
230 return [controller horizontalScrollerImp];
233 wkScrollerStyle wkScrollbarPainterControllerStyle(WKScrollbarPainterControllerRef controller)
235 return [controller scrollerStyle];
238 WKScrollbarPainterRef wkMakeScrollbarReplacementPainter(WKScrollbarPainterRef oldPainter, int newStyle, int controlSize, bool isHorizontal)
240 if (!isScrollbarOverlayAPIAvailable())
242 return [lookUpNSScrollerImpClass() scrollerImpWithStyle:newStyle
243 controlSize:scrollbarControlSizeToNSControlSize(controlSize)
244 horizontal:isHorizontal
245 replacingScrollerImp:oldPainter];
248 void wkSetPainterForPainterController(WKScrollbarPainterControllerRef controller, WKScrollbarPainterRef painter, bool isHorizontal)
251 [controller setHorizontalScrollerImp:painter];
253 [controller setVerticalScrollerImp:painter];
256 void wkSetScrollbarPainterControllerStyle(WKScrollbarPainterControllerRef painter, wkScrollerStyle newStyle)
258 [painter setScrollerStyle:newStyle];
261 CGRect wkScrollbarPainterKnobRect(WKScrollbarPainterRef painter)
263 return NSRectToCGRect([painter rectForPart:NSScrollerKnob]);
266 void wkSetScrollbarPainterKnobAlpha(WKScrollbarPainterRef painter, CGFloat alpha)
268 [painter setKnobAlpha:alpha];
271 void wkSetScrollbarPainterTrackAlpha(WKScrollbarPainterRef painter, CGFloat alpha)
273 [painter setTrackAlpha:alpha];
276 void wkSetScrollbarPainterKnobStyle(WKScrollbarPainterRef painter, wkScrollerKnobStyle style)
278 [painter setKnobStyle:style];
281 WKScrollbarPainterControllerRef wkMakeScrollbarPainterController(id painterControllerDelegate)
283 if (!isScrollbarOverlayAPIAvailable())
285 NSScrollerImpPair* controller = [[[lookUpNSScrollerImpPairClass() alloc] init] autorelease];
286 [controller setDelegate:painterControllerDelegate];
287 [controller setScrollerStyle:preferredScrollerStyle()];
291 void wkContentAreaScrolled(WKScrollbarPainterControllerRef controller)
293 [controller contentAreaScrolled];
296 void wkContentAreaWillPaint(WKScrollbarPainterControllerRef controller)
298 [controller contentAreaWillDraw];
301 void wkMouseEnteredContentArea(WKScrollbarPainterControllerRef controller)
303 [controller mouseEnteredContentArea];
306 void wkMouseExitedContentArea(WKScrollbarPainterControllerRef controller)
308 [controller mouseExitedContentArea];
311 void wkMouseMovedInContentArea(WKScrollbarPainterControllerRef controller)
313 [controller mouseMovedInContentArea];
316 void wkWillStartLiveResize(WKScrollbarPainterControllerRef controller)
318 [controller startLiveResize];
321 void wkContentAreaResized(WKScrollbarPainterControllerRef controller)
323 [controller contentAreaDidResize];
326 void wkWillEndLiveResize(WKScrollbarPainterControllerRef controller)
328 [controller endLiveResize];
331 void wkContentAreaDidShow(WKScrollbarPainterControllerRef controller)
333 [controller windowOrderedIn];
336 void wkContentAreaDidHide(WKScrollbarPainterControllerRef controller)
338 [controller windowOrderedOut];
341 void wkDidBeginScrollGesture(WKScrollbarPainterControllerRef controller)
343 [controller beginScrollGesture];
346 void wkDidEndScrollGesture(WKScrollbarPainterControllerRef controller)
348 [controller endScrollGesture];
351 void wkScrollbarPainterForceFlashScrollers(WKScrollbarPainterControllerRef controller)
353 [controller hideOverlayScrollers];
354 [controller flashScrollers];
357 bool isScrollbarOverlayAPIAvailable()
359 static bool apiAvailable = [lookUpNSScrollerImpClass() respondsToSelector:@selector(scrollerImpWithStyle:controlSize:horizontal:replacingScrollerImp:)] &&
360 [lookUpNSScrollerImpPairClass() instancesRespondToSelector:@selector(scrollerStyle)];
364 #endif // USE(WK_SCROLLBAR_PAINTER)