// Copyright (c) 2011 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. #ifndef CHROME_BROWSER_UI_COCOA_TABS_TAB_VIEW_H_ #define CHROME_BROWSER_UI_COCOA_TABS_TAB_VIEW_H_ #pragma once #import <Cocoa/Cocoa.h> #include <ApplicationServices/ApplicationServices.h> #include <map> #include "base/memory/scoped_nsobject.h" #import "chrome/browser/ui/cocoa/background_gradient_view.h" #import "chrome/browser/ui/cocoa/hover_close_button.h" namespace tabs { // Nomenclature: // Tabs _glow_ under two different circumstances, when they are _hovered_ (by // the mouse) and when they are _alerted_ (to show that the tab's title has // changed). // The state of alerting (to show a title change on an unselected, pinned tab). // This is more complicated than a simple on/off since we want to allow the // alert glow to go through a full rise-hold-fall cycle to avoid flickering (or // always holding). enum AlertState { kAlertNone = 0, // Obj-C initializes to this. kAlertRising, kAlertHolding, kAlertFalling }; } // namespace tabs @class TabController, TabWindowController; // A view that handles the event tracking (clicking and dragging) for a tab // on the tab strip. Relies on an associated TabController to provide a // target/action for selecting the tab. @interface TabView : BackgroundGradientView { @private IBOutlet TabController* controller_; // TODO(rohitrao): Add this button to a CoreAnimation layer so we can fade it // in and out on mouseovers. IBOutlet HoverCloseButton* closeButton_; BOOL closing_; // Tracking area for close button mouseover images. scoped_nsobject<NSTrackingArea> closeTrackingArea_; BOOL isMouseInside_; // Is the mouse hovering over? tabs::AlertState alertState_; CGFloat hoverAlpha_; // How strong the hover glow is. NSTimeInterval hoverHoldEndTime_; // When the hover glow will begin dimming. CGFloat alertAlpha_; // How strong the alert glow is. NSTimeInterval alertHoldEndTime_; // When the hover glow will begin dimming. NSTimeInterval lastGlowUpdate_; // Time either glow was last updated. NSPoint hoverPoint_; // Current location of hover in view coords. // All following variables are valid for the duration of a drag. // These are released on mouseUp: BOOL moveWindowOnDrag_; // Set if the only tab of a window is dragged. BOOL tabWasDragged_; // Has the tab been dragged? BOOL draggingWithinTabStrip_; // Did drag stay in the current tab strip? BOOL chromeIsVisible_; NSTimeInterval tearTime_; // Time since tear happened NSPoint tearOrigin_; // Origin of the tear rect NSPoint dragOrigin_; // Origin point of the drag // TODO(alcor): these references may need to be strong to avoid crashes // due to JS closing windows TabWindowController* sourceController_; // weak. controller starting the drag NSWindow* sourceWindow_; // weak. The window starting the drag NSRect sourceWindowFrame_; NSRect sourceTabFrame_; TabWindowController* draggedController_; // weak. Controller being dragged. NSWindow* dragWindow_; // weak. The window being dragged NSWindow* dragOverlay_; // weak. The overlay being dragged // Cache workspace IDs per-drag because computing them on 10.5 with // CGWindowListCreateDescriptionFromArray is expensive. // resetDragControllers clears this cache. // // TODO(davidben): When 10.5 becomes unsupported, remove this. std::map<CGWindowID, int> workspaceIDCache_; TabWindowController* targetController_; // weak. Controller being targeted NSCellStateValue state_; } @property(assign, nonatomic) NSCellStateValue state; @property(assign, nonatomic) CGFloat hoverAlpha; @property(assign, nonatomic) CGFloat alertAlpha; // Determines if the tab is in the process of animating closed. It may still // be visible on-screen, but should not respond to/initiate any events. Upon // setting to NO, clears the target/action of the close button to prevent // clicks inside it from sending messages. @property(assign, nonatomic, getter=isClosing) BOOL closing; // Enables/Disables tracking regions for the tab. - (void)setTrackingEnabled:(BOOL)enabled; // Begin showing an "alert" glow (shown to call attention to an unselected // pinned tab whose title changed). - (void)startAlert; // Stop showing the "alert" glow; this won't immediately wipe out any glow, but // will make it fade away. - (void)cancelAlert; @end // The TabController |controller_| is not the only owner of this view. If the // controller is released before this view, then we could be hanging onto a // garbage pointer. To prevent this, the TabController uses this interface to // clear the |controller_| pointer when it is dying. @interface TabView (TabControllerInterface) - (void)setController:(TabController*)controller; @end #endif // CHROME_BROWSER_UI_COCOA_TABS_TAB_VIEW_H_