1// Copyright 2013 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "ui/app_list/cocoa/scroll_view_with_no_scrollbars.h" 6 7#include "base/mac/mac_util.h" 8#include "base/mac/scoped_cftyperef.h" 9#include "base/mac/scoped_nsobject.h" 10#include "base/mac/sdk_forward_declarations.h" 11 12@interface InvisibleScroller : NSScroller; 13@end 14 15@implementation InvisibleScroller 16 17// Makes it non-interactive (and invisible) on Lion with both 10.6 and 10.7 18// SDKs. TODO(tapted): Find a way to make it non-interactive on Snow Leopard. 19// TODO(tapted): Find a way to make it take up no space on Lion with a 10.6 SDK. 20- (NSRect)rectForPart:(NSScrollerPart)aPart { 21 return NSZeroRect; 22} 23 24@end 25 26@implementation ScrollViewWithNoScrollbars 27 28@synthesize delegate = delegate_; 29 30- (id)initWithFrame:(NSRect)frame { 31 if ((self = [super initWithFrame:frame])) { 32 [self setHasHorizontalScroller:base::mac::IsOSLionOrLater()]; 33 NSRect horizontalScrollerRect = [self bounds]; 34 horizontalScrollerRect.size.height = 0; 35 base::scoped_nsobject<InvisibleScroller> horizontalScroller( 36 [[InvisibleScroller alloc] initWithFrame:horizontalScrollerRect]); 37 [self setHorizontalScroller:horizontalScroller]; 38 } 39 return self; 40} 41 42- (void)endGestureWithEvent:(NSEvent*)event { 43 [super endGestureWithEvent:event]; 44 if (!base::mac::IsOSLionOrLater()) 45 [delegate_ userScrolling:NO]; 46} 47 48- (void)scrollWheel:(NSEvent*)event { 49 if ([event subtype] == NSMouseEventSubtype) { 50 // Since the scroll view has no vertical scroller, regular up and down mouse 51 // wheel events would be ignored. This maps mouse wheel events to a 52 // horizontal scroll event of one line, to turn pages. 53 BOOL downOrRight; 54 if ([event deltaX] != 0) 55 downOrRight = [event deltaX] > 0; 56 else if ([event deltaY] != 0) 57 downOrRight = [event deltaY] > 0; 58 else 59 return; 60 61 base::ScopedCFTypeRef<CGEventRef> cgEvent(CGEventCreateScrollWheelEvent( 62 NULL, kCGScrollEventUnitLine, 2, 0, downOrRight ? 1 : -1)); 63 [super scrollWheel:[NSEvent eventWithCGEvent:cgEvent]]; 64 return; 65 } 66 67 [super scrollWheel:event]; 68 if (![event respondsToSelector:@selector(momentumPhase)]) 69 return; 70 71 BOOL scrollComplete = [event momentumPhase] == NSEventPhaseEnded || 72 ([event momentumPhase] == NSEventPhaseNone && 73 [event phase] == NSEventPhaseEnded); 74 75 [delegate_ userScrolling:!scrollComplete]; 76} 77 78@end 79