Index: chrome/browser/ui/cocoa/reload_button.mm |
=================================================================== |
--- chrome/browser/ui/cocoa/reload_button.mm (revision 71837) |
+++ chrome/browser/ui/cocoa/reload_button.mm (working copy) |
@@ -1,168 +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/ui/cocoa/reload_button.h" |
- |
-#include "app/l10n_util.h" |
-#include "app/l10n_util_mac.h" |
-#include "app/mac/nsimage_cache.h" |
-#include "chrome/app/chrome_command_ids.h" |
-#import "chrome/browser/ui/cocoa/gradient_button_cell.h" |
-#import "chrome/browser/ui/cocoa/view_id_util.h" |
-#include "grit/generated_resources.h" |
- |
-namespace { |
- |
-NSString* const kReloadImageName = @"reload_Template.pdf"; |
-NSString* const kStopImageName = @"stop_Template.pdf"; |
- |
-// Constant matches Windows. |
-NSTimeInterval kPendingReloadTimeout = 1.35; |
- |
-} // namespace |
- |
-@implementation ReloadButton |
- |
-- (void)dealloc { |
- if (trackingArea_) { |
- [self removeTrackingArea:trackingArea_]; |
- trackingArea_.reset(); |
- } |
- [super dealloc]; |
-} |
- |
-- (void)updateTrackingAreas { |
- // If the mouse is hovering when the tracking area is updated, the |
- // control could end up locked into inappropriate behavior for |
- // awhile, so unwind state. |
- if (isMouseInside_) |
- [self mouseExited:nil]; |
- |
- if (trackingArea_) { |
- [self removeTrackingArea:trackingArea_]; |
- trackingArea_.reset(); |
- } |
- trackingArea_.reset([[NSTrackingArea alloc] |
- initWithRect:[self bounds] |
- options:(NSTrackingMouseEnteredAndExited | |
- NSTrackingActiveInActiveApp) |
- owner:self |
- userInfo:nil]); |
- [self addTrackingArea:trackingArea_]; |
-} |
- |
-- (void)awakeFromNib { |
- [self updateTrackingAreas]; |
- |
- // Don't allow multi-clicks, because the user probably wouldn't ever |
- // want to stop+reload or reload+stop. |
- [self setIgnoresMultiClick:YES]; |
-} |
- |
-- (void)updateTag:(NSInteger)anInt { |
- if ([self tag] == anInt) |
- return; |
- |
- // Forcibly remove any stale tooltip which is being displayed. |
- [self removeAllToolTips]; |
- |
- [self setTag:anInt]; |
- if (anInt == IDC_RELOAD) { |
- [self setImage:app::mac::GetCachedImageWithName(kReloadImageName)]; |
- [self setToolTip:l10n_util::GetNSStringWithFixup(IDS_TOOLTIP_RELOAD)]; |
- } else if (anInt == IDC_STOP) { |
- [self setImage:app::mac::GetCachedImageWithName(kStopImageName)]; |
- [self setToolTip:l10n_util::GetNSStringWithFixup(IDS_TOOLTIP_STOP)]; |
- } else { |
- NOTREACHED(); |
- } |
-} |
- |
-- (void)setIsLoading:(BOOL)isLoading force:(BOOL)force { |
- // Can always transition to stop mode. Only transition to reload |
- // mode if forced or if the mouse isn't hovering. Otherwise, note |
- // that reload mode is desired and disable the button. |
- if (isLoading) { |
- pendingReloadTimer_.reset(); |
- [self updateTag:IDC_STOP]; |
- [self setEnabled:YES]; |
- } else if (force || ![self isMouseInside]) { |
- pendingReloadTimer_.reset(); |
- [self updateTag:IDC_RELOAD]; |
- |
- // This button's cell may not have received a mouseExited event, and |
- // therefore it could still think that the mouse is inside the button. Make |
- // sure the cell's sense of mouse-inside matches the local sense, to prevent |
- // drawing artifacts. |
- id cell = [self cell]; |
- if ([cell respondsToSelector:@selector(setMouseInside:animate:)]) |
- [cell setMouseInside:[self isMouseInside] animate:NO]; |
- [self setEnabled:YES]; |
- } else if ([self tag] == IDC_STOP && !pendingReloadTimer_) { |
- [self setEnabled:NO]; |
- pendingReloadTimer_.reset( |
- [[NSTimer scheduledTimerWithTimeInterval:kPendingReloadTimeout |
- target:self |
- selector:@selector(forceReloadState) |
- userInfo:nil |
- repeats:NO] retain]); |
- } |
-} |
- |
-- (void)forceReloadState { |
- [self setIsLoading:NO force:YES]; |
-} |
- |
-- (BOOL)sendAction:(SEL)theAction to:(id)theTarget { |
- if ([self tag] == IDC_STOP) { |
- // When the timer is started, the button is disabled, so this |
- // should not be possible. |
- DCHECK(!pendingReloadTimer_.get()); |
- |
- // When the stop is processed, immediately change to reload mode, |
- // even though the IPC still has to bounce off the renderer and |
- // back before the regular |-setIsLoaded:force:| will be called. |
- // [This is how views and gtk do it.] |
- const BOOL ret = [super sendAction:theAction to:theTarget]; |
- if (ret) |
- [self forceReloadState]; |
- return ret; |
- } |
- |
- return [super sendAction:theAction to:theTarget]; |
-} |
- |
-- (void)mouseEntered:(NSEvent*)theEvent { |
- isMouseInside_ = YES; |
-} |
- |
-- (void)mouseExited:(NSEvent*)theEvent { |
- isMouseInside_ = NO; |
- |
- // Reload mode was requested during the hover. |
- if (pendingReloadTimer_) |
- [self forceReloadState]; |
-} |
- |
-- (BOOL)isMouseInside { |
- return isMouseInside_; |
-} |
- |
-- (ViewID)viewID { |
- return VIEW_ID_RELOAD_BUTTON; |
-} |
- |
-@end // ReloadButton |
- |
-@implementation ReloadButton (Testing) |
- |
-+ (void)setPendingReloadTimeout:(NSTimeInterval)seconds { |
- kPendingReloadTimeout = seconds; |
-} |
- |
-- (NSTrackingArea*)trackingArea { |
- return trackingArea_; |
-} |
- |
-@end |