| 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
|
|
|