summaryrefslogtreecommitdiffstats
path: root/chrome/browser/cocoa/info_bubble_window.mm
diff options
context:
space:
mode:
authorben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-12-01 16:34:49 +0000
committerben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-12-01 16:34:49 +0000
commit7d791652c7ede4209a2014d885148e2713f49bce (patch)
treec26baf12593bed381c631b81c736106809d46b44 /chrome/browser/cocoa/info_bubble_window.mm
parent3b94427c99bdf12836fd455eeb1499fdde511e26 (diff)
downloadchromium_src-7d791652c7ede4209a2014d885148e2713f49bce.zip
chromium_src-7d791652c7ede4209a2014d885148e2713f49bce.tar.gz
chromium_src-7d791652c7ede4209a2014d885148e2713f49bce.tar.bz2
Move browser/cocoa to browser/ui/cocoa
BUG=none TEST=none TBR=brettw git-svn-id: svn://svn.chromium.org/chrome/trunk/src@67854 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/cocoa/info_bubble_window.mm')
-rw-r--r--chrome/browser/cocoa/info_bubble_window.mm222
1 files changed, 0 insertions, 222 deletions
diff --git a/chrome/browser/cocoa/info_bubble_window.mm b/chrome/browser/cocoa/info_bubble_window.mm
deleted file mode 100644
index ea3ebcd..0000000
--- a/chrome/browser/cocoa/info_bubble_window.mm
+++ /dev/null
@@ -1,222 +0,0 @@
-// 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/info_bubble_window.h"
-
-#include "base/basictypes.h"
-#include "base/logging.h"
-#include "base/scoped_nsobject.h"
-#include "chrome/common/notification_observer.h"
-#include "chrome/common/notification_registrar.h"
-#include "chrome/common/notification_service.h"
-#include "chrome/common/notification_type.h"
-#import "third_party/GTM/AppKit/GTMNSAnimation+Duration.h"
-
-namespace {
-const CGFloat kOrderInSlideOffset = 10;
-const NSTimeInterval kOrderInAnimationDuration = 0.2;
-const NSTimeInterval kOrderOutAnimationDuration = 0.15;
-// The minimum representable time interval. This can be used as the value
-// passed to +[NSAnimationContext setDuration:] to stop an in-progress
-// animation as quickly as possible.
-const NSTimeInterval kMinimumTimeInterval =
- std::numeric_limits<NSTimeInterval>::min();
-}
-
-@interface InfoBubbleWindow(Private)
-- (void)appIsTerminating;
-- (void)finishCloseAfterAnimation;
-@end
-
-// A helper class to proxy app notifications to the window.
-class AppNotificationBridge : public NotificationObserver {
- public:
- explicit AppNotificationBridge(InfoBubbleWindow* owner) : owner_(owner) {
- registrar_.Add(this, NotificationType::APP_TERMINATING,
- NotificationService::AllSources());
- }
-
- // Overridden from NotificationObserver.
- void Observe(NotificationType type,
- const NotificationSource& source,
- const NotificationDetails& details) {
- switch (type.value) {
- case NotificationType::APP_TERMINATING:
- [owner_ appIsTerminating];
- break;
- default:
- NOTREACHED() << L"Unexpected notification";
- }
- }
-
- private:
- // The object we need to inform when we get a notification. Weak. Owns us.
- InfoBubbleWindow* owner_;
-
- // Used for registering to receive notifications and automatic clean up.
- NotificationRegistrar registrar_;
-
- DISALLOW_COPY_AND_ASSIGN(AppNotificationBridge);
-};
-
-// A delegate object for watching the alphaValue animation on InfoBubbleWindows.
-// An InfoBubbleWindow instance cannot be the delegate for its own animation
-// because CAAnimations retain their delegates, and since the InfoBubbleWindow
-// retains its animations a retain loop would be formed.
-@interface InfoBubbleWindowCloser : NSObject {
- @private
- InfoBubbleWindow* window_; // Weak. Window to close.
-}
-- (id)initWithWindow:(InfoBubbleWindow*)window;
-@end
-
-@implementation InfoBubbleWindowCloser
-
-- (id)initWithWindow:(InfoBubbleWindow*)window {
- if ((self = [super init])) {
- window_ = window;
- }
- return self;
-}
-
-// Callback for the alpha animation. Closes window_ if appropriate.
-- (void)animationDidStop:(CAAnimation*)anim finished:(BOOL)flag {
- // When alpha reaches zero, close window_.
- if ([window_ alphaValue] == 0.0) {
- [window_ finishCloseAfterAnimation];
- }
-}
-
-@end
-
-
-@implementation InfoBubbleWindow
-
-@synthesize delayOnClose = delayOnClose_;
-
-- (id)initWithContentRect:(NSRect)contentRect
- styleMask:(NSUInteger)aStyle
- backing:(NSBackingStoreType)bufferingType
- defer:(BOOL)flag {
- if ((self = [super initWithContentRect:contentRect
- styleMask:NSBorderlessWindowMask
- backing:bufferingType
- defer:flag])) {
- [self setBackgroundColor:[NSColor clearColor]];
- [self setExcludedFromWindowsMenu:YES];
- [self setOpaque:NO];
- [self setHasShadow:YES];
- delayOnClose_ = YES;
- notificationBridge_.reset(new AppNotificationBridge(self));
-
- // Start invisible. Will be made visible when ordered front.
- [self setAlphaValue:0.0];
-
- // Set up alphaValue animation so that self is delegate for the animation.
- // Setting up the delegate is required so that the
- // animationDidStop:finished: callback can be handled.
- // Notice that only the alphaValue Animation is replaced in case
- // superclasses set up animations.
- CAAnimation* alphaAnimation = [CABasicAnimation animation];
- scoped_nsobject<InfoBubbleWindowCloser> delegate(
- [[InfoBubbleWindowCloser alloc] initWithWindow:self]);
- [alphaAnimation setDelegate:delegate];
- NSMutableDictionary* animations =
- [NSMutableDictionary dictionaryWithDictionary:[self animations]];
- [animations setObject:alphaAnimation forKey:@"alphaValue"];
- [self setAnimations:animations];
- }
- return self;
-}
-
-// According to
-// http://www.cocoabuilder.com/archive/message/cocoa/2006/6/19/165953,
-// NSBorderlessWindowMask windows cannot become key or main. In this
-// case, this is not a desired behavior. As an example, the bubble could have
-// buttons.
-- (BOOL)canBecomeKeyWindow {
- return YES;
-}
-
-- (void)close {
- // Block the window from receiving events while it fades out.
- closing_ = YES;
-
- if (!delayOnClose_) {
- [self finishCloseAfterAnimation];
- } else {
- // Apply animations to hide self.
- [NSAnimationContext beginGrouping];
- [[NSAnimationContext currentContext]
- gtm_setDuration:kOrderOutAnimationDuration
- eventMask:NSLeftMouseUpMask];
- [[self animator] setAlphaValue:0.0];
- [NSAnimationContext endGrouping];
- }
-}
-
-// If the app is terminating but the window is still fading out, cancel the
-// animation and close the window to prevent it from leaking.
-// See http://crbug.com/37717
-- (void)appIsTerminating {
- if (!delayOnClose_)
- return; // The close has already happened with no Core Animation.
-
- // Cancel the current animation so that it closes immediately, triggering
- // |finishCloseAfterAnimation|.
- [NSAnimationContext beginGrouping];
- [[NSAnimationContext currentContext] setDuration:kMinimumTimeInterval];
- [[self animator] setAlphaValue:0.0];
- [NSAnimationContext endGrouping];
-}
-
-// Called by InfoBubbleWindowCloser when the window is to be really closed
-// after the fading animation is complete.
-- (void)finishCloseAfterAnimation {
- if (closing_)
- [super close];
-}
-
-// Adds animation for info bubbles being ordered to the front.
-- (void)orderWindow:(NSWindowOrderingMode)orderingMode
- relativeTo:(NSInteger)otherWindowNumber {
- // According to the documentation '0' is the otherWindowNumber when the window
- // is ordered front.
- if (orderingMode == NSWindowAbove && otherWindowNumber == 0) {
- // Order self appropriately assuming that its alpha is zero as set up
- // in the designated initializer.
- [super orderWindow:orderingMode relativeTo:otherWindowNumber];
-
- // Set up frame so it can be adjust down by a few pixels.
- NSRect frame = [self frame];
- NSPoint newOrigin = frame.origin;
- newOrigin.y += kOrderInSlideOffset;
- [self setFrameOrigin:newOrigin];
-
- // Apply animations to show and move self.
- [NSAnimationContext beginGrouping];
- // The star currently triggers on mouse down, not mouse up.
- [[NSAnimationContext currentContext]
- gtm_setDuration:kOrderInAnimationDuration
- eventMask:NSLeftMouseUpMask|NSLeftMouseDownMask];
- [[self animator] setAlphaValue:1.0];
- [[self animator] setFrame:frame display:YES];
- [NSAnimationContext endGrouping];
- } else {
- [super orderWindow:orderingMode relativeTo:otherWindowNumber];
- }
-}
-
-// If the window is currently animating a close, block all UI events to the
-// window.
-- (void)sendEvent:(NSEvent*)theEvent {
- if (!closing_)
- [super sendEvent:theEvent];
-}
-
-- (BOOL)isClosing {
- return closing_;
-}
-
-@end