1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CHROME_BROWSER_UI_COCOA_TABS_TAB_VIEW_H_ 6 #define CHROME_BROWSER_UI_COCOA_TABS_TAB_VIEW_H_ 7 #pragma once 8 9 #import <Cocoa/Cocoa.h> 10 #include <ApplicationServices/ApplicationServices.h> 11 12 #include <map> 13 14 #include "base/memory/scoped_nsobject.h" 15 #import "chrome/browser/ui/cocoa/background_gradient_view.h" 16 #import "chrome/browser/ui/cocoa/hover_close_button.h" 17 18 namespace tabs { 19 20 // Nomenclature: 21 // Tabs _glow_ under two different circumstances, when they are _hovered_ (by 22 // the mouse) and when they are _alerted_ (to show that the tab's title has 23 // changed). 24 25 // The state of alerting (to show a title change on an unselected, pinned tab). 26 // This is more complicated than a simple on/off since we want to allow the 27 // alert glow to go through a full rise-hold-fall cycle to avoid flickering (or 28 // always holding). 29 enum AlertState { 30 kAlertNone = 0, // Obj-C initializes to this. 31 kAlertRising, 32 kAlertHolding, 33 kAlertFalling 34 }; 35 36 } // namespace tabs 37 38 @class TabController, TabWindowController; 39 40 // A view that handles the event tracking (clicking and dragging) for a tab 41 // on the tab strip. Relies on an associated TabController to provide a 42 // target/action for selecting the tab. 43 44 @interface TabView : BackgroundGradientView { 45 @private 46 IBOutlet TabController* controller_; 47 // TODO(rohitrao): Add this button to a CoreAnimation layer so we can fade it 48 // in and out on mouseovers. 49 IBOutlet HoverCloseButton* closeButton_; 50 51 BOOL closing_; 52 53 // Tracking area for close button mouseover images. 54 scoped_nsobject<NSTrackingArea> closeTrackingArea_; 55 56 BOOL isMouseInside_; // Is the mouse hovering over? 57 tabs::AlertState alertState_; 58 59 CGFloat hoverAlpha_; // How strong the hover glow is. 60 NSTimeInterval hoverHoldEndTime_; // When the hover glow will begin dimming. 61 62 CGFloat alertAlpha_; // How strong the alert glow is. 63 NSTimeInterval alertHoldEndTime_; // When the hover glow will begin dimming. 64 65 NSTimeInterval lastGlowUpdate_; // Time either glow was last updated. 66 67 NSPoint hoverPoint_; // Current location of hover in view coords. 68 69 // All following variables are valid for the duration of a drag. 70 // These are released on mouseUp: 71 BOOL moveWindowOnDrag_; // Set if the only tab of a window is dragged. 72 BOOL tabWasDragged_; // Has the tab been dragged? 73 BOOL draggingWithinTabStrip_; // Did drag stay in the current tab strip? 74 BOOL chromeIsVisible_; 75 76 NSTimeInterval tearTime_; // Time since tear happened 77 NSPoint tearOrigin_; // Origin of the tear rect 78 NSPoint dragOrigin_; // Origin point of the drag 79 // TODO(alcor): these references may need to be strong to avoid crashes 80 // due to JS closing windows 81 TabWindowController* sourceController_; // weak. controller starting the drag 82 NSWindow* sourceWindow_; // weak. The window starting the drag 83 NSRect sourceWindowFrame_; 84 NSRect sourceTabFrame_; 85 86 TabWindowController* draggedController_; // weak. Controller being dragged. 87 NSWindow* dragWindow_; // weak. The window being dragged 88 NSWindow* dragOverlay_; // weak. The overlay being dragged 89 // Cache workspace IDs per-drag because computing them on 10.5 with 90 // CGWindowListCreateDescriptionFromArray is expensive. 91 // resetDragControllers clears this cache. 92 // 93 // TODO(davidben): When 10.5 becomes unsupported, remove this. 94 std::map<CGWindowID, int> workspaceIDCache_; 95 96 TabWindowController* targetController_; // weak. Controller being targeted 97 NSCellStateValue state_; 98 } 99 100 @property(assign, nonatomic) NSCellStateValue state; 101 @property(assign, nonatomic) CGFloat hoverAlpha; 102 @property(assign, nonatomic) CGFloat alertAlpha; 103 104 // Determines if the tab is in the process of animating closed. It may still 105 // be visible on-screen, but should not respond to/initiate any events. Upon 106 // setting to NO, clears the target/action of the close button to prevent 107 // clicks inside it from sending messages. 108 @property(assign, nonatomic, getter=isClosing) BOOL closing; 109 110 // Enables/Disables tracking regions for the tab. 111 - (void)setTrackingEnabled:(BOOL)enabled; 112 113 // Begin showing an "alert" glow (shown to call attention to an unselected 114 // pinned tab whose title changed). 115 - (void)startAlert; 116 117 // Stop showing the "alert" glow; this won't immediately wipe out any glow, but 118 // will make it fade away. 119 - (void)cancelAlert; 120 121 @end 122 123 // The TabController |controller_| is not the only owner of this view. If the 124 // controller is released before this view, then we could be hanging onto a 125 // garbage pointer. To prevent this, the TabController uses this interface to 126 // clear the |controller_| pointer when it is dying. 127 @interface TabView (TabControllerInterface) 128 - (void)setController:(TabController*)controller; 129 @end 130 131 #endif // CHROME_BROWSER_UI_COCOA_TABS_TAB_VIEW_H_ 132