1 // Copyright (c) 2012 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_PANELS_PANEL_TITLEBAR_VIEW_COCOA_H_ 6 #define CHROME_BROWSER_UI_COCOA_PANELS_PANEL_TITLEBAR_VIEW_COCOA_H_ 7 8 #import <Cocoa/Cocoa.h> 9 10 #import "chrome/browser/ui/cocoa/panels/mouse_drag_controller.h" 11 #import "ui/base/cocoa/tracking_area.h" 12 13 @class HoverImageButton; 14 @class MouseDragController; 15 @class PanelWindowControllerCocoa; 16 17 // A class that works as a custom titlebar for Panels. It is placed on top of 18 // the regular Cocoa titlebar. It's the place for the close button, page 19 // favicon, title label and a button to minimize/restore the panel. 20 // It also facilitates dragging and minimization of the panels, and changes 21 // color as 'new activity' indicator. 22 // One way to have custom titlebar would be to use NSBorderlessWindow, 23 // but it seems to affect too many other behaviors (for example, it draws shadow 24 // differently based on being key window) so it appears easier to simply overlay 25 // the standard titlebar. 26 27 // This view overlays the titlebar on top. It is used to intercept 28 // mouse input to prevent reordering of the other browser windows when clicking 29 // on the titlebar (to minimize or reorder) while in a docked collection. 30 @interface PanelTitlebarOverlayView : NSView { 31 @private 32 IBOutlet PanelWindowControllerCocoa* controller_; 33 BOOL disableReordering_; 34 } 35 @end 36 37 @interface RepaintAnimation : NSAnimation { 38 @private 39 NSView* targetView_; 40 } 41 - (id)initWithView:(NSView*)targetView duration:(double) duration; 42 - (void)setCurrentProgress:(NSAnimationProgress)progress; 43 @end 44 45 @interface PanelTitlebarViewCocoa : NSView 46 <NSAnimationDelegate, 47 MouseDragControllerClient> { 48 @private 49 IBOutlet PanelWindowControllerCocoa* controller_; 50 IBOutlet NSView* icon_; 51 IBOutlet NSTextField* title_; 52 IBOutlet HoverImageButton* minimizeButton_; 53 IBOutlet HoverImageButton* restoreButton_; 54 IBOutlet HoverImageButton* customCloseButton_; 55 // Transparent view on top of entire titlebar. It catches mouse events to 56 // prevent window activation by the system on mouseDown. 57 IBOutlet NSView* overlay_; 58 NSButton* closeButton_; // Created explicitly, not from NIB. Weak, destroyed 59 // when view is destroyed, as a subview. 60 ui::ScopedCrTrackingArea closeButtonTrackingArea_; 61 BOOL isDrawingAttention_; 62 63 // "Glint" animation is used in "Draw Attention" mode. 64 base::scoped_nsobject<RepaintAnimation> glintAnimation_; 65 base::scoped_nsobject<NSTimer> glintAnimationTimer_; 66 int glintCounter_; 67 68 // Drag support. 69 base::scoped_nsobject<MouseDragController> dragController_; 70 } 71 72 // Callbacks from Close, Minimize, and Restore buttons. 73 - (void)onCloseButtonClick:(id)sender; 74 - (void)onMinimizeButtonClick:(id)sender; 75 - (void)onRestoreButtonClick:(id)sender; 76 77 // Attaches this view to the controller_'s window as a titlebar. 78 - (void)attach; 79 80 - (void)setTitle:(NSString*)newTitle; 81 - (void)setIcon:(NSView*)newIcon; 82 83 - (NSView*)icon; 84 85 // Set the visibility of the minimize and restore buttons. 86 - (void)setMinimizeButtonVisibility:(BOOL)visible; 87 - (void)setRestoreButtonVisibility:(BOOL)visible; 88 89 // Should be called when size of the titlebar changes. 90 - (void)updateCustomButtonsLayout; 91 - (void)updateIconAndTitleLayout; 92 93 // Various events that we'll need to redraw our titlebar for. 94 - (void)didChangeFrame:(NSNotification*)notification; 95 - (void)didChangeMainWindow:(NSNotification*)notification; 96 97 // Draw Attention methods - change appearance of titlebar to attract user. 98 - (void)drawAttention; 99 - (void)stopDrawingAttention; 100 - (BOOL)isDrawingAttention; 101 - (void)startGlintAnimation; 102 - (void)restartGlintAnimation:(NSTimer*)timer; 103 - (void)stopGlintAnimation; 104 105 @end // @interface PanelTitlebarView 106 107 // Methods which are either only for testing, or only public for testing. 108 @interface PanelTitlebarViewCocoa(TestingAPI) 109 110 - (PanelWindowControllerCocoa*)controller; 111 112 - (NSTextField*)title; 113 - (NSButton*)closeButton; 114 - (NSButton*)minimizeButton; 115 - (NSButton*)restoreButton; 116 117 // Simulates click on a close button. Used to test panel closing. 118 - (void)simulateCloseButtonClick; 119 120 // NativePanelTesting support. 121 // |mouseLocation| is in Cocoa's screen coordinates. 122 - (void)pressLeftMouseButtonTitlebar:(NSPoint)mouseLocation 123 modifiers:(int)modifierFlags; 124 - (void)releaseLeftMouseButtonTitlebar:(int)modifierFlags; 125 - (void)dragTitlebar:(NSPoint)mouseLocation; 126 - (void)cancelDragTitlebar; 127 - (void)finishDragTitlebar; 128 129 @end // @interface PanelTitlebarViewCocoa(TestingAPI) 130 131 #endif // CHROME_BROWSER_UI_COCOA_PANELS_PANEL_TITLEBAR_VIEW_COCOA_H_ 132