Home | History | Annotate | Download | only in cocoa
      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