OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2010 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 #import "chrome/browser/cocoa/tabpose_window.h" |
| 6 |
| 7 #import <QuartzCore/QuartzCore.h> |
| 8 |
| 9 const int kTopGradientHeight = 15; |
| 10 |
| 11 // CAGradientLayer is 10.6-only -- roll our own. |
| 12 @interface DarkGradientLayer : CALayer |
| 13 - (void)drawInContext:(CGContextRef)context; |
| 14 @end |
| 15 |
| 16 @implementation DarkGradientLayer |
| 17 - (void)drawInContext:(CGContextRef)context { |
| 18 scoped_cftyperef<CGColorSpaceRef> grayColorSpace( |
| 19 CGColorSpaceCreateWithName(kCGColorSpaceGenericGray)); |
| 20 CGFloat grays[] = { 0.277, 1.0, 0.39, 1.0 }; |
| 21 CGFloat locations[] = { 0, 1 }; |
| 22 scoped_cftyperef<CGGradientRef> gradient(CGGradientCreateWithColorComponents( |
| 23 grayColorSpace.get(), grays, locations, arraysize(locations))); |
| 24 CGPoint topLeft = CGPointMake(0.0, kTopGradientHeight); |
| 25 CGContextDrawLinearGradient(context, gradient.get(), topLeft, CGPointZero, 0); |
| 26 } |
| 27 @end |
| 28 |
| 29 @interface TabposeWindow (Private) |
| 30 - (id)initForWindow:(NSWindow*)parent rect:(NSRect)rect slomo:(BOOL)slomo; |
| 31 - (void)setUpLayers:(NSRect)bgLayerRect; |
| 32 @end |
| 33 |
| 34 @implementation TabposeWindow |
| 35 |
| 36 + (id)openTabposeFor:(NSWindow*)parent rect:(NSRect)rect slomo:(BOOL)slomo { |
| 37 // Releases itself when closed. |
| 38 return [[TabposeWindow alloc] initForWindow:parent rect:rect slomo:slomo]; |
| 39 } |
| 40 |
| 41 - (id)initForWindow:(NSWindow*)parent rect:(NSRect)rect slomo:(BOOL)slomo { |
| 42 NSRect frame = [parent frame]; |
| 43 if ((self = [super initWithContentRect:frame |
| 44 styleMask:NSBorderlessWindowMask |
| 45 backing:NSBackingStoreBuffered |
| 46 defer:NO])) { |
| 47 [self setReleasedWhenClosed:YES]; |
| 48 [self setOpaque:NO]; |
| 49 [self setBackgroundColor:[NSColor clearColor]]; |
| 50 [self setUpLayers:rect]; |
| 51 [parent addChildWindow:self ordered:NSWindowAbove]; |
| 52 [self makeKeyAndOrderFront:self]; |
| 53 } |
| 54 return self; |
| 55 } |
| 56 |
| 57 - (void)setUpLayers:(NSRect)bgLayerRect { |
| 58 // Root layer -- covers whole window. |
| 59 rootLayer_ = [CALayer layer]; |
| 60 [[self contentView] setLayer:rootLayer_]; |
| 61 [[self contentView] setWantsLayer:YES]; |
| 62 |
| 63 // Background layer -- the visible part of the window. |
| 64 gray_.reset(CGColorCreateGenericGray(0.39, 1.0)); |
| 65 bgLayer_ = [CALayer layer]; |
| 66 bgLayer_.backgroundColor = gray_; |
| 67 bgLayer_.frame = NSRectToCGRect(bgLayerRect); |
| 68 bgLayer_.masksToBounds = YES; |
| 69 [rootLayer_ addSublayer:bgLayer_]; |
| 70 |
| 71 // Top gradient. |
| 72 CALayer* gradientLayer = [DarkGradientLayer layer]; |
| 73 gradientLayer.frame = CGRectMake( |
| 74 0, |
| 75 NSHeight(bgLayerRect) - kTopGradientHeight, |
| 76 NSWidth(bgLayerRect), |
| 77 kTopGradientHeight); |
| 78 [gradientLayer setNeedsDisplay]; // Draw once. |
| 79 [bgLayer_ addSublayer:gradientLayer]; |
| 80 } |
| 81 |
| 82 - (BOOL)canBecomeKeyWindow { |
| 83 return YES; |
| 84 } |
| 85 |
| 86 - (void)keyDown:(NSEvent*)event { |
| 87 // Overridden to prevent beeps. |
| 88 } |
| 89 |
| 90 - (void)keyUp:(NSEvent*)event { |
| 91 NSString* characters = [event characters]; |
| 92 if ([characters length] < 1) |
| 93 return; |
| 94 |
| 95 unichar character = [characters characterAtIndex:0]; |
| 96 switch (character) { |
| 97 case NSEnterCharacter: |
| 98 case NSNewlineCharacter: |
| 99 case NSCarriageReturnCharacter: |
| 100 case ' ': |
| 101 case '\e': // Escape |
| 102 [self close]; |
| 103 break; |
| 104 } |
| 105 } |
| 106 |
| 107 - (void)mouseDown:(NSEvent*)event { |
| 108 [self close]; |
| 109 } |
| 110 |
| 111 - (void)swipeWithEvent:(NSEvent*)event { |
| 112 if ([event deltaY] > 0.5) // Swipe up |
| 113 [self close]; |
| 114 } |
| 115 |
| 116 - (void)close { |
| 117 // Prevent parent window from disappearing. |
| 118 [[self parentWindow] removeChildWindow:self]; |
| 119 [super close]; |
| 120 } |
| 121 |
| 122 - (void)commandDispatch:(id)sender { |
| 123 // Without this, -validateUserInterfaceItem: is not called. |
| 124 } |
| 125 |
| 126 - (BOOL)validateUserInterfaceItem:(id<NSValidatedUserInterfaceItem>)item { |
| 127 // Disable all browser-related menu items. |
| 128 return NO; |
| 129 } |
| 130 |
| 131 @end |
OLD | NEW |