Index: chrome/browser/cocoa/tabpose_window.mm |
diff --git a/chrome/browser/cocoa/tabpose_window.mm b/chrome/browser/cocoa/tabpose_window.mm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c69c5c16b91cb7594513afa03cf49713b00bb04a |
--- /dev/null |
+++ b/chrome/browser/cocoa/tabpose_window.mm |
@@ -0,0 +1,131 @@ |
+// Copyright (c) 2010 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#import "chrome/browser/cocoa/tabpose_window.h" |
+ |
+#import <QuartzCore/QuartzCore.h> |
+ |
+const int kTopGradientHeight = 15; |
+ |
+// CAGradientLayer is 10.6-only -- roll our own. |
+@interface DarkGradientLayer : CALayer |
+- (void)drawInContext:(CGContextRef)context; |
+@end |
+ |
+@implementation DarkGradientLayer |
+- (void)drawInContext:(CGContextRef)context { |
+ scoped_cftyperef<CGColorSpaceRef> grayColorSpace( |
+ CGColorSpaceCreateWithName(kCGColorSpaceGenericGray)); |
+ CGFloat grays[] = { 0.277, 1.0, 0.39, 1.0 }; |
+ CGFloat locations[] = { 0, 1 }; |
+ scoped_cftyperef<CGGradientRef> gradient(CGGradientCreateWithColorComponents( |
+ grayColorSpace.get(), grays, locations, arraysize(locations))); |
+ CGPoint topLeft = CGPointMake(0.0, kTopGradientHeight); |
+ CGContextDrawLinearGradient(context, gradient.get(), topLeft, CGPointZero, 0); |
+} |
+@end |
+ |
+@interface TabposeWindow (Private) |
+- (id)initForWindow:(NSWindow*)parent rect:(NSRect)rect slomo:(BOOL)slomo; |
+- (void)setUpLayers:(NSRect)bgLayerRect; |
+@end |
+ |
+@implementation TabposeWindow |
+ |
++ (id)openTabposeFor:(NSWindow*)parent rect:(NSRect)rect slomo:(BOOL)slomo { |
+ // Releases itself when closed. |
+ return [[TabposeWindow alloc] initForWindow:parent rect:rect slomo:slomo]; |
+} |
+ |
+- (id)initForWindow:(NSWindow*)parent rect:(NSRect)rect slomo:(BOOL)slomo { |
+ NSRect frame = [parent frame]; |
+ if ((self = [super initWithContentRect:frame |
+ styleMask:NSBorderlessWindowMask |
+ backing:NSBackingStoreBuffered |
+ defer:NO])) { |
+ [self setReleasedWhenClosed:YES]; |
+ [self setOpaque:NO]; |
+ [self setBackgroundColor:[NSColor clearColor]]; |
+ [self setUpLayers:rect]; |
+ [parent addChildWindow:self ordered:NSWindowAbove]; |
+ [self makeKeyAndOrderFront:self]; |
+ } |
+ return self; |
+} |
+ |
+- (void)setUpLayers:(NSRect)bgLayerRect { |
+ // Root layer -- covers whole window. |
+ rootLayer_ = [CALayer layer]; |
+ [[self contentView] setLayer:rootLayer_]; |
+ [[self contentView] setWantsLayer:YES]; |
+ |
+ // Background layer -- the visible part of the window. |
+ gray_.reset(CGColorCreateGenericGray(0.39, 1.0)); |
+ bgLayer_ = [CALayer layer]; |
+ bgLayer_.backgroundColor = gray_; |
+ bgLayer_.frame = NSRectToCGRect(bgLayerRect); |
+ bgLayer_.masksToBounds = YES; |
+ [rootLayer_ addSublayer:bgLayer_]; |
+ |
+ // Top gradient. |
+ CALayer* gradientLayer = [DarkGradientLayer layer]; |
+ gradientLayer.frame = CGRectMake( |
+ 0, |
+ NSHeight(bgLayerRect) - kTopGradientHeight, |
+ NSWidth(bgLayerRect), |
+ kTopGradientHeight); |
+ [gradientLayer setNeedsDisplay]; // Draw once. |
+ [bgLayer_ addSublayer:gradientLayer]; |
+} |
+ |
+- (BOOL)canBecomeKeyWindow { |
+ return YES; |
+} |
+ |
+- (void)keyDown:(NSEvent*)event { |
+ // Overridden to prevent beeps. |
+} |
+ |
+- (void)keyUp:(NSEvent*)event { |
+ NSString* characters = [event characters]; |
+ if ([characters length] < 1) |
+ return; |
+ |
+ unichar character = [characters characterAtIndex:0]; |
+ switch (character) { |
+ case NSEnterCharacter: |
+ case NSNewlineCharacter: |
+ case NSCarriageReturnCharacter: |
+ case ' ': |
+ case '\e': // Escape |
+ [self close]; |
+ break; |
+ } |
+} |
+ |
+- (void)mouseDown:(NSEvent*)event { |
+ [self close]; |
+} |
+ |
+- (void)swipeWithEvent:(NSEvent*)event { |
+ if ([event deltaY] > 0.5) // Swipe up |
+ [self close]; |
+} |
+ |
+- (void)close { |
+ // Prevent parent window from disappearing. |
+ [[self parentWindow] removeChildWindow:self]; |
+ [super close]; |
+} |
+ |
+- (void)commandDispatch:(id)sender { |
+ // Without this, -validateUserInterfaceItem: is not called. |
+} |
+ |
+- (BOOL)validateUserInterfaceItem:(id<NSValidatedUserInterfaceItem>)item { |
+ // Disable all browser-related menu items. |
+ return NO; |
+} |
+ |
+@end |