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