• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2014 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_PROFILES_AVATAR_MENU_BUBBLE_CONTROLLER_H_
6 #define CHROME_BROWSER_UI_COCOA_PROFILES_AVATAR_MENU_BUBBLE_CONTROLLER_H_
7 
8 #import <Cocoa/Cocoa.h>
9 
10 #include "base/mac/scoped_nsobject.h"
11 #include "base/memory/scoped_ptr.h"
12 #import "chrome/browser/ui/cocoa/base_bubble_controller.h"
13 #import "ui/base/cocoa/tracking_area.h"
14 
15 class AvatarMenu;
16 class Browser;
17 
18 // This window controller manages the bubble that displays a "menu" of profiles.
19 // It is brought open by clicking on the avatar icon in the window frame.
20 @interface AvatarMenuBubbleController : BaseBubbleController {
21  @private
22   // The menu that contains the data from the backend.
23   scoped_ptr<AvatarMenu> menu_;
24 
25   // Array of the below view controllers.
26   base::scoped_nsobject<NSMutableArray> items_;
27 
28   // Is set to true if the managed user has clicked on Switch Users.
29   BOOL expanded_;
30 }
31 
32 // Designated initializer. The browser is passed to the menu for profile
33 // information.
34 - (id)initWithBrowser:(Browser*)parentBrowser
35            anchoredAt:(NSPoint)point;
36 
37 // Creates a new profile.
38 - (IBAction)newProfile:(id)sender;
39 
40 // Switches to a given profile. |sender| is an AvatarMenuItemController.
41 - (IBAction)switchToProfile:(id)sender;
42 
43 // Edits a given profile. |sender| is an AvatarMenuItemController.
44 - (IBAction)editProfile:(id)sender;
45 
46 // Switches from the managed user avatar menu to the normal avatar menu which
47 // allows to switch profiles.
48 - (IBAction)switchProfile:(id)sender;
49 
50 @end
51 
52 ////////////////////////////////////////////////////////////////////////////////
53 
54 // This view controller manages the menu item XIB.
55 @interface AvatarMenuItemController : NSViewController<NSAnimationDelegate> {
56  @private
57   // The parent menu controller; owns this.
58   __weak AvatarMenuBubbleController* controller_;
59 
60   // The index of the item in the AvatarMenu.
61   size_t menuIndex_;
62 
63   // Tracks whether this item is currently highlighted.
64   BOOL isHighlighted_;
65 
66   // The animation showing the edit link, which is run after the user has
67   // dwelled over the item for a short delay.
68   base::scoped_nsobject<NSAnimation> linkAnimation_;
69 
70   // Instance variables that back the outlets.
71   __weak NSImageView* iconView_;
72   __weak NSImageView* activeView_;
73   __weak NSTextField* nameField_;
74   // These two views sit on top of each other, and only one is visible at a
75   // time. The editButton_ is visible when the mouse is over the item and the
76   // emailField_ is visible otherwise.
77   __weak NSTextField* emailField_;
78   __weak NSButton* editButton_;
79 }
80 @property(readonly, nonatomic) size_t menuIndex;
81 @property(assign, nonatomic) BOOL isHighlighted;
82 @property(assign, nonatomic) IBOutlet NSImageView* iconView;
83 @property(assign, nonatomic) IBOutlet NSImageView* activeView;
84 @property(assign, nonatomic) IBOutlet NSTextField* nameField;
85 @property(assign, nonatomic) IBOutlet NSTextField* emailField;
86 @property(assign, nonatomic) IBOutlet NSButton* editButton;
87 
88 // Designated initializer.
89 - (id)initWithMenuIndex:(size_t)menuIndex
90           menuController:(AvatarMenuBubbleController*)controller;
91 
92 // Actions that are forwarded to the |controller_|.
93 - (IBAction)switchToProfile:(id)sender;
94 - (IBAction)editProfile:(id)sender;
95 
96 // Highlights the subviews appropriately for a given event type from the switch
97 // profile button.
98 - (void)highlightForEventType:(NSEventType)type;
99 
100 @end
101 
102 ////////////////////////////////////////////////////////////////////////////////
103 
104 // Simple button cell to get tracking and mouse events forwarded back to the
105 // view controller for changing highlight style of the item subviews. This is
106 // an invisible button that underlays most of the menu item and is responsible
107 // for performing the switch profile action.
108 @interface AvatarMenuItemView : NSView {
109  @private
110   // The controller that manages this.
111   __weak AvatarMenuItemController* viewController_;
112 
113   // Used to highlight the background on hover.
114   ui::ScopedCrTrackingArea trackingArea_;
115 }
116 @property(assign, nonatomic) IBOutlet AvatarMenuItemController* viewController;
117 @end
118 
119 ////////////////////////////////////////////////////////////////////////////////
120 
121 @interface AccessibilityIgnoredImageCell : NSImageCell
122 @end
123 
124 @interface AccessibilityIgnoredTextFieldCell : NSTextFieldCell
125 @end
126 
127 // Testing API /////////////////////////////////////////////////////////////////
128 
129 @interface AvatarMenuBubbleController (ExposedForTesting)
130 - (id)initWithMenu:(AvatarMenu*)menu
131        parentWindow:(NSWindow*)parent
132          anchoredAt:(NSPoint)point;
133 - (void)performLayout;
134 - (NSMutableArray*)items;
135 @end
136 
137 @interface AvatarMenuItemController (ExposedForTesting)
138 - (void)willStartAnimation:(NSAnimation*)animation;
139 @end
140 
141 #endif  // CHROME_BROWSER_UI_COCOA_PROFILES_AVATAR_MENU_BUBBLE_CONTROLLER_H_
142