OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #import "chrome/browser/ui/cocoa/extensions/browser_action_button.h" | 5 #import "chrome/browser/ui/cocoa/extensions/browser_action_button.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <cmath> | 8 #include <cmath> |
9 | 9 |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 22 matching lines...) Expand all Loading... |
33 static const CGFloat kMinimumDragDistance = 5; | 33 static const CGFloat kMinimumDragDistance = 5; |
34 | 34 |
35 // A class to bridge the ToolbarActionViewController and the | 35 // A class to bridge the ToolbarActionViewController and the |
36 // BrowserActionButton. | 36 // BrowserActionButton. |
37 class ToolbarActionViewDelegateBridge : public ToolbarActionViewDelegateCocoa { | 37 class ToolbarActionViewDelegateBridge : public ToolbarActionViewDelegateCocoa { |
38 public: | 38 public: |
39 ToolbarActionViewDelegateBridge(BrowserActionButton* owner, | 39 ToolbarActionViewDelegateBridge(BrowserActionButton* owner, |
40 BrowserActionsController* controller); | 40 BrowserActionsController* controller); |
41 ~ToolbarActionViewDelegateBridge(); | 41 ~ToolbarActionViewDelegateBridge(); |
42 | 42 |
| 43 ExtensionActionContextMenuController* menuController() { |
| 44 return menuController_; |
| 45 } |
| 46 |
43 private: | 47 private: |
44 // ToolbarActionViewDelegateCocoa: | 48 // ToolbarActionViewDelegateCocoa: |
45 ToolbarActionViewController* GetPreferredPopupViewController() override; | 49 ToolbarActionViewController* GetPreferredPopupViewController() override; |
46 content::WebContents* GetCurrentWebContents() const override; | 50 content::WebContents* GetCurrentWebContents() const override; |
47 void UpdateState() override; | 51 void UpdateState() override; |
48 NSPoint GetPopupPoint() override; | 52 NSPoint GetPopupPoint() override; |
| 53 void SetContextMenuController( |
| 54 ExtensionActionContextMenuController* menuController) override; |
49 | 55 |
50 // The owning button. Weak. | 56 // The owning button. Weak. |
51 BrowserActionButton* owner_; | 57 BrowserActionButton* owner_; |
52 | 58 |
53 // The BrowserActionsController that owns the button. Weak. | 59 // The BrowserActionsController that owns the button. Weak. |
54 BrowserActionsController* controller_; | 60 BrowserActionsController* controller_; |
55 | 61 |
| 62 // The context menu controller. Weak. |
| 63 ExtensionActionContextMenuController* menuController_; |
| 64 |
56 DISALLOW_COPY_AND_ASSIGN(ToolbarActionViewDelegateBridge); | 65 DISALLOW_COPY_AND_ASSIGN(ToolbarActionViewDelegateBridge); |
57 }; | 66 }; |
58 | 67 |
59 ToolbarActionViewDelegateBridge::ToolbarActionViewDelegateBridge( | 68 ToolbarActionViewDelegateBridge::ToolbarActionViewDelegateBridge( |
60 BrowserActionButton* owner, | 69 BrowserActionButton* owner, |
61 BrowserActionsController* controller) | 70 BrowserActionsController* controller) |
62 : owner_(owner), | 71 : owner_(owner), |
63 controller_(controller) { | 72 controller_(controller), |
| 73 menuController_(nil) { |
64 } | 74 } |
65 | 75 |
66 ToolbarActionViewDelegateBridge::~ToolbarActionViewDelegateBridge() { | 76 ToolbarActionViewDelegateBridge::~ToolbarActionViewDelegateBridge() { |
67 } | 77 } |
68 | 78 |
69 ToolbarActionViewController* | 79 ToolbarActionViewController* |
70 ToolbarActionViewDelegateBridge::GetPreferredPopupViewController() { | 80 ToolbarActionViewDelegateBridge::GetPreferredPopupViewController() { |
71 return [owner_ viewController]; | 81 return [owner_ viewController]; |
72 } | 82 } |
73 | 83 |
74 content::WebContents* ToolbarActionViewDelegateBridge::GetCurrentWebContents() | 84 content::WebContents* ToolbarActionViewDelegateBridge::GetCurrentWebContents() |
75 const { | 85 const { |
76 return [controller_ currentWebContents]; | 86 return [controller_ currentWebContents]; |
77 } | 87 } |
78 | 88 |
79 void ToolbarActionViewDelegateBridge::UpdateState() { | 89 void ToolbarActionViewDelegateBridge::UpdateState() { |
80 [owner_ updateState]; | 90 [owner_ updateState]; |
81 } | 91 } |
82 | 92 |
83 NSPoint ToolbarActionViewDelegateBridge::GetPopupPoint() { | 93 NSPoint ToolbarActionViewDelegateBridge::GetPopupPoint() { |
84 return [controller_ popupPointForId:[owner_ viewController]->GetId()]; | 94 return [controller_ popupPointForId:[owner_ viewController]->GetId()]; |
85 } | 95 } |
86 | 96 |
| 97 void ToolbarActionViewDelegateBridge::SetContextMenuController( |
| 98 ExtensionActionContextMenuController* menuController) { |
| 99 menuController_ = menuController; |
| 100 } |
| 101 |
87 @interface BrowserActionCell (Internals) | 102 @interface BrowserActionCell (Internals) |
88 - (void)drawBadgeWithinFrame:(NSRect)frame; | 103 - (void)drawBadgeWithinFrame:(NSRect)frame; |
89 @end | 104 @end |
90 | 105 |
91 @interface BrowserActionButton (Private) | 106 @interface BrowserActionButton (Private) |
92 - (void)endDrag; | 107 - (void)endDrag; |
93 @end | 108 @end |
94 | 109 |
95 @implementation BrowserActionButton | 110 @implementation BrowserActionButton |
96 | 111 |
97 @synthesize isBeingDragged = isBeingDragged_; | 112 @synthesize isBeingDragged = isBeingDragged_; |
98 | 113 |
99 + (Class)cellClass { | 114 + (Class)cellClass { |
100 return [BrowserActionCell class]; | 115 return [BrowserActionCell class]; |
101 } | 116 } |
102 | 117 |
103 - (id)initWithFrame:(NSRect)frame | 118 - (id)initWithFrame:(NSRect)frame |
104 viewController:(scoped_ptr<ToolbarActionViewController>)viewController | 119 viewController:(scoped_ptr<ToolbarActionViewController>)viewController |
105 controller:(BrowserActionsController*)controller | 120 controller:(BrowserActionsController*)controller { |
106 menuController:(ExtensionActionContextMenuController*)menuController { | |
107 if ((self = [super initWithFrame:frame])) { | 121 if ((self = [super initWithFrame:frame])) { |
108 BrowserActionCell* cell = [[[BrowserActionCell alloc] init] autorelease]; | 122 BrowserActionCell* cell = [[[BrowserActionCell alloc] init] autorelease]; |
109 // [NSButton setCell:] warns to NOT use setCell: other than in the | 123 // [NSButton setCell:] warns to NOT use setCell: other than in the |
110 // initializer of a control. However, we are using a basic | 124 // initializer of a control. However, we are using a basic |
111 // NSButton whose initializer does not take an NSCell as an | 125 // NSButton whose initializer does not take an NSCell as an |
112 // object. To honor the assumed semantics, we do nothing with | 126 // object. To honor the assumed semantics, we do nothing with |
113 // NSButton between alloc/init and setCell:. | 127 // NSButton between alloc/init and setCell:. |
114 [self setCell:cell]; | 128 [self setCell:cell]; |
115 | 129 |
116 browserActionsController_ = controller; | 130 browserActionsController_ = controller; |
(...skipping 14 matching lines...) Expand all Loading... |
131 forButtonState:image_button_cell::kHoverState]; | 145 forButtonState:image_button_cell::kHoverState]; |
132 [cell setImageID:IDR_BROWSER_ACTION_P | 146 [cell setImageID:IDR_BROWSER_ACTION_P |
133 forButtonState:image_button_cell::kPressedState]; | 147 forButtonState:image_button_cell::kPressedState]; |
134 [cell setImageID:IDR_BROWSER_ACTION | 148 [cell setImageID:IDR_BROWSER_ACTION |
135 forButtonState:image_button_cell::kDisabledState]; | 149 forButtonState:image_button_cell::kDisabledState]; |
136 | 150 |
137 [self setTitle:@""]; | 151 [self setTitle:@""]; |
138 [self setButtonType:NSMomentaryChangeButton]; | 152 [self setButtonType:NSMomentaryChangeButton]; |
139 [self setShowsBorderOnlyWhileMouseInside:YES]; | 153 [self setShowsBorderOnlyWhileMouseInside:YES]; |
140 | 154 |
141 contextMenuController_.reset(menuController); | |
142 | |
143 base::scoped_nsobject<NSMenu> contextMenu( | 155 base::scoped_nsobject<NSMenu> contextMenu( |
144 [[NSMenu alloc] initWithTitle:@""]); | 156 [[NSMenu alloc] initWithTitle:@""]); |
145 [contextMenu setDelegate:self]; | 157 [contextMenu setDelegate:self]; |
146 [self setMenu:contextMenu]; | 158 [self setMenu:contextMenu]; |
147 | 159 |
148 moveAnimation_.reset([[NSViewAnimation alloc] init]); | 160 moveAnimation_.reset([[NSViewAnimation alloc] init]); |
149 [moveAnimation_ gtm_setDuration:kAnimationDuration | 161 [moveAnimation_ gtm_setDuration:kAnimationDuration |
150 eventMask:NSLeftMouseUpMask]; | 162 eventMask:NSLeftMouseUpMask]; |
151 [moveAnimation_ setAnimationBlockingMode:NSAnimationNonblocking]; | 163 [moveAnimation_ setAnimationBlockingMode:NSAnimationNonblocking]; |
152 | 164 |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
293 | 305 |
294 bounds.origin.y += kBrowserActionBadgeOriginYOffset; | 306 bounds.origin.y += kBrowserActionBadgeOriginYOffset; |
295 [[self cell] drawBadgeWithinFrame:bounds]; | 307 [[self cell] drawBadgeWithinFrame:bounds]; |
296 | 308 |
297 [image unlockFocus]; | 309 [image unlockFocus]; |
298 return image; | 310 return image; |
299 } | 311 } |
300 | 312 |
301 - (void)menuNeedsUpdate:(NSMenu*)menu { | 313 - (void)menuNeedsUpdate:(NSMenu*)menu { |
302 [menu removeAllItems]; | 314 [menu removeAllItems]; |
303 [contextMenuController_ populateMenu:menu]; | 315 // |menuController()| can be nil if we don't show context menus for the given |
| 316 // action. |
| 317 if (viewControllerDelegate_->menuController()) |
| 318 [viewControllerDelegate_->menuController() populateMenu:menu]; |
304 } | 319 } |
305 | 320 |
306 @end | 321 @end |
307 | 322 |
308 @implementation BrowserActionCell | 323 @implementation BrowserActionCell |
309 | 324 |
310 @synthesize browserActionsController = browserActionsController_; | 325 @synthesize browserActionsController = browserActionsController_; |
311 @synthesize viewController = viewController_; | 326 @synthesize viewController = viewController_; |
312 | 327 |
313 - (void)drawBadgeWithinFrame:(NSRect)frame | 328 - (void)drawBadgeWithinFrame:(NSRect)frame |
(...skipping 22 matching lines...) Expand all Loading... |
336 fraction:enabled ? 1.0 : 0.4 | 351 fraction:enabled ? 1.0 : 0.4 |
337 respectFlipped:YES | 352 respectFlipped:YES |
338 hints:nil]; | 353 hints:nil]; |
339 | 354 |
340 cellFrame.origin.y += kBrowserActionBadgeOriginYOffset; | 355 cellFrame.origin.y += kBrowserActionBadgeOriginYOffset; |
341 [self drawBadgeWithinFrame:cellFrame | 356 [self drawBadgeWithinFrame:cellFrame |
342 webContents:webContents]; | 357 webContents:webContents]; |
343 } | 358 } |
344 | 359 |
345 @end | 360 @end |
OLD | NEW |