Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(312)

Side by Side Diff: chrome/browser/cocoa/toolbar_controller.mm

Issue 2856042: [Mac] Implement the update available notification in the wrench menu. (Closed) Base URL: http://src.chromium.org/git/chromium.git
Patch Set: Observe notification Created 10 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « chrome/browser/cocoa/toolbar_controller.h ('k') | chrome/browser/wrench_menu_model.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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/cocoa/toolbar_controller.h" 5 #import "chrome/browser/cocoa/toolbar_controller.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "app/l10n_util_mac.h" 9 #include "app/l10n_util_mac.h"
10 #include "app/menus/accelerator_cocoa.h" 10 #include "app/menus/accelerator_cocoa.h"
11 #include "app/menus/menu_model.h" 11 #include "app/menus/menu_model.h"
12 #include "base/keyboard_codes.h" 12 #include "base/keyboard_codes.h"
13 #include "base/mac_util.h" 13 #include "base/mac_util.h"
14 #include "base/nsimage_cache_mac.h" 14 #include "base/nsimage_cache_mac.h"
15 #include "base/singleton.h" 15 #include "base/singleton.h"
16 #include "base/sys_string_conversions.h" 16 #include "base/sys_string_conversions.h"
17 #include "chrome/app/chrome_dll_resource.h" 17 #include "chrome/app/chrome_dll_resource.h"
18 #include "chrome/browser/autocomplete/autocomplete_edit_view.h" 18 #include "chrome/browser/autocomplete/autocomplete_edit_view.h"
19 #include "chrome/browser/browser.h" 19 #include "chrome/browser/browser.h"
20 #include "chrome/browser/browser_theme_provider.h"
20 #include "chrome/browser/browser_window.h" 21 #include "chrome/browser/browser_window.h"
21 #import "chrome/browser/cocoa/accelerators_cocoa.h" 22 #import "chrome/browser/cocoa/accelerators_cocoa.h"
22 #import "chrome/browser/cocoa/back_forward_menu_controller.h" 23 #import "chrome/browser/cocoa/back_forward_menu_controller.h"
23 #import "chrome/browser/cocoa/background_gradient_view.h" 24 #import "chrome/browser/cocoa/background_gradient_view.h"
24 #import "chrome/browser/cocoa/encoding_menu_controller_delegate_mac.h" 25 #import "chrome/browser/cocoa/encoding_menu_controller_delegate_mac.h"
25 #import "chrome/browser/cocoa/extensions/browser_action_button.h" 26 #import "chrome/browser/cocoa/extensions/browser_action_button.h"
26 #import "chrome/browser/cocoa/extensions/browser_actions_container_view.h" 27 #import "chrome/browser/cocoa/extensions/browser_actions_container_view.h"
27 #import "chrome/browser/cocoa/extensions/browser_actions_controller.h" 28 #import "chrome/browser/cocoa/extensions/browser_actions_controller.h"
28 #import "chrome/browser/cocoa/gradient_button_cell.h" 29 #import "chrome/browser/cocoa/gradient_button_cell.h"
29 #import "chrome/browser/cocoa/location_bar/autocomplete_text_field_editor.h" 30 #import "chrome/browser/cocoa/location_bar/autocomplete_text_field_editor.h"
30 #import "chrome/browser/cocoa/location_bar/location_bar_view_mac.h" 31 #import "chrome/browser/cocoa/location_bar/location_bar_view_mac.h"
31 #import "chrome/browser/cocoa/menu_button.h" 32 #import "chrome/browser/cocoa/menu_button.h"
32 #import "chrome/browser/cocoa/menu_controller.h" 33 #import "chrome/browser/cocoa/menu_controller.h"
33 #import "chrome/browser/cocoa/reload_button.h" 34 #import "chrome/browser/cocoa/reload_button.h"
34 #import "chrome/browser/cocoa/toolbar_view.h" 35 #import "chrome/browser/cocoa/toolbar_view.h"
35 #import "chrome/browser/cocoa/wrench_menu_controller.h" 36 #import "chrome/browser/cocoa/wrench_menu_controller.h"
36 #include "chrome/browser/net/url_fixer_upper.h" 37 #include "chrome/browser/net/url_fixer_upper.h"
37 #include "chrome/browser/pref_service.h" 38 #include "chrome/browser/pref_service.h"
38 #include "chrome/browser/profile.h" 39 #include "chrome/browser/profile.h"
39 #include "chrome/browser/search_engines/template_url_model.h" 40 #include "chrome/browser/search_engines/template_url_model.h"
40 #include "chrome/browser/tab_contents/tab_contents.h" 41 #include "chrome/browser/tab_contents/tab_contents.h"
41 #include "chrome/browser/toolbar_model.h" 42 #include "chrome/browser/toolbar_model.h"
43 #include "chrome/browser/upgrade_detector.h"
42 #include "chrome/browser/wrench_menu_model.h" 44 #include "chrome/browser/wrench_menu_model.h"
43 #include "chrome/common/notification_details.h" 45 #include "chrome/common/notification_details.h"
44 #include "chrome/common/notification_observer.h" 46 #include "chrome/common/notification_observer.h"
47 #include "chrome/common/notification_service.h"
45 #include "chrome/common/notification_type.h" 48 #include "chrome/common/notification_type.h"
46 #include "chrome/common/pref_names.h" 49 #include "chrome/common/pref_names.h"
47 #include "gfx/rect.h" 50 #include "gfx/rect.h"
48 #include "grit/chromium_strings.h" 51 #include "grit/chromium_strings.h"
49 #include "grit/generated_resources.h" 52 #include "grit/generated_resources.h"
53 #include "grit/theme_resources.h"
50 54
51 namespace { 55 namespace {
52 56
53 // Names of images in the bundle for buttons. 57 // Names of images in the bundle for buttons.
54 NSString* const kBackButtonImageName = @"back_Template.pdf"; 58 NSString* const kBackButtonImageName = @"back_Template.pdf";
55 NSString* const kForwardButtonImageName = @"forward_Template.pdf"; 59 NSString* const kForwardButtonImageName = @"forward_Template.pdf";
56 NSString* const kReloadButtonReloadImageName = @"reload_Template.pdf"; 60 NSString* const kReloadButtonReloadImageName = @"reload_Template.pdf";
57 NSString* const kReloadButtonStopImageName = @"stop_Template.pdf"; 61 NSString* const kReloadButtonStopImageName = @"stop_Template.pdf";
58 NSString* const kHomeButtonImageName = @"home_Template.pdf"; 62 NSString* const kHomeButtonImageName = @"home_Template.pdf";
59 NSString* const kWrenchButtonImageName = @"menu_chrome_Template.pdf"; 63 NSString* const kWrenchButtonImageName = @"menu_chrome_Template.pdf";
(...skipping 15 matching lines...) Expand all
75 - (void)prefChanged:(std::wstring*)prefName; 79 - (void)prefChanged:(std::wstring*)prefName;
76 - (BackgroundGradientView*)backgroundGradientView; 80 - (BackgroundGradientView*)backgroundGradientView;
77 - (void)toolbarFrameChanged; 81 - (void)toolbarFrameChanged;
78 - (void)pinLocationBarToLeftOfBrowserActionsContainerAndAnimate:(BOOL)animate; 82 - (void)pinLocationBarToLeftOfBrowserActionsContainerAndAnimate:(BOOL)animate;
79 - (void)maintainMinimumLocationBarWidth; 83 - (void)maintainMinimumLocationBarWidth;
80 - (void)adjustBrowserActionsContainerForNewWindow:(NSNotification*)notification; 84 - (void)adjustBrowserActionsContainerForNewWindow:(NSNotification*)notification;
81 - (void)browserActionsContainerDragged:(NSNotification*)notification; 85 - (void)browserActionsContainerDragged:(NSNotification*)notification;
82 - (void)browserActionsContainerDragFinished:(NSNotification*)notification; 86 - (void)browserActionsContainerDragFinished:(NSNotification*)notification;
83 - (void)browserActionsVisibilityChanged:(NSNotification*)notification; 87 - (void)browserActionsVisibilityChanged:(NSNotification*)notification;
84 - (void)adjustLocationSizeBy:(CGFloat)dX animate:(BOOL)animate; 88 - (void)adjustLocationSizeBy:(CGFloat)dX animate:(BOOL)animate;
89 - (void)badgeWrenchMenu;
85 @end 90 @end
86 91
87 namespace ToolbarControllerInternal { 92 namespace ToolbarControllerInternal {
88 93
89 // A C++ delegate that handles enabling/disabling menu items and handling when 94 // A C++ delegate that handles enabling/disabling menu items and handling when
90 // a menu command is chosen. 95 // a menu command is chosen.
91 class MenuDelegate : public menus::SimpleMenuModel::Delegate { 96 class MenuDelegate : public menus::SimpleMenuModel::Delegate {
92 public: 97 public:
93 explicit MenuDelegate(Browser* browser) 98 explicit MenuDelegate(Browser* browser)
94 : browser_(browser) { } 99 : browser_(browser) { }
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
134 string_id = IDS_EXIT_FULLSCREEN_MAC; 139 string_id = IDS_EXIT_FULLSCREEN_MAC;
135 return l10n_util::GetStringUTF16(string_id); 140 return l10n_util::GetStringUTF16(string_id);
136 } 141 }
137 return menus::SimpleMenuModel::Delegate::GetLabelForCommandId(command_id); 142 return menus::SimpleMenuModel::Delegate::GetLabelForCommandId(command_id);
138 } 143 }
139 144
140 private: 145 private:
141 Browser* browser_; 146 Browser* browser_;
142 }; 147 };
143 148
144 // A C++ class registered for changes in preferences. Bridges the 149 // A class registered for C++ notifications. This is used to detect changes in
145 // notification back to the ToolbarController. 150 // preferences and upgrade available notifications. Bridges the notification
146 class PrefObserverBridge : public NotificationObserver { 151 // back to the ToolbarController.
152 class NotificationBridge : public NotificationObserver {
147 public: 153 public:
148 explicit PrefObserverBridge(ToolbarController* controller) 154 explicit NotificationBridge(ToolbarController* controller)
149 : controller_(controller) { } 155 : controller_(controller) {
156 registrar_.Add(this, NotificationType::UPGRADE_RECOMMENDED,
157 NotificationService::AllSources());
158 }
159
150 // Overridden from NotificationObserver: 160 // Overridden from NotificationObserver:
151 virtual void Observe(NotificationType type, 161 virtual void Observe(NotificationType type,
152 const NotificationSource& source, 162 const NotificationSource& source,
153 const NotificationDetails& details) { 163 const NotificationDetails& details) {
154 if (type == NotificationType::PREF_CHANGED) 164 if (type == NotificationType::PREF_CHANGED)
155 [controller_ prefChanged:Details<std::wstring>(details).ptr()]; 165 [controller_ prefChanged:Details<std::wstring>(details).ptr()];
166 else if (type == NotificationType::UPGRADE_RECOMMENDED)
167 [controller_ badgeWrenchMenu];
156 } 168 }
169
157 private: 170 private:
158 ToolbarController* controller_; // weak, owns us 171 ToolbarController* controller_; // weak, owns us
172
173 NotificationRegistrar registrar_;
159 }; 174 };
160 175
161 } // namespace ToolbarControllerInternal 176 } // namespace ToolbarControllerInternal
162 177
163 @implementation ToolbarController 178 @implementation ToolbarController
164 179
165 - (id)initWithModel:(ToolbarModel*)model 180 - (id)initWithModel:(ToolbarModel*)model
166 commands:(CommandUpdater*)commands 181 commands:(CommandUpdater*)commands
167 profile:(Profile*)profile 182 profile:(Profile*)profile
168 browser:(Browser*)browser 183 browser:(Browser*)browser
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
225 - (void)awakeFromNib { 240 - (void)awakeFromNib {
226 // A bug in AppKit (<rdar://7298597>, <http://openradar.me/7298597>) causes 241 // A bug in AppKit (<rdar://7298597>, <http://openradar.me/7298597>) causes
227 // images loaded directly from nibs in a framework to not get their "template" 242 // images loaded directly from nibs in a framework to not get their "template"
228 // flags set properly. Thus, despite the images being set on the buttons in 243 // flags set properly. Thus, despite the images being set on the buttons in
229 // the xib, we must set them in code. 244 // the xib, we must set them in code.
230 [backButton_ setImage:nsimage_cache::ImageNamed(kBackButtonImageName)]; 245 [backButton_ setImage:nsimage_cache::ImageNamed(kBackButtonImageName)];
231 [forwardButton_ setImage:nsimage_cache::ImageNamed(kForwardButtonImageName)]; 246 [forwardButton_ setImage:nsimage_cache::ImageNamed(kForwardButtonImageName)];
232 [reloadButton_ 247 [reloadButton_
233 setImage:nsimage_cache::ImageNamed(kReloadButtonReloadImageName)]; 248 setImage:nsimage_cache::ImageNamed(kReloadButtonReloadImageName)];
234 [homeButton_ setImage:nsimage_cache::ImageNamed(kHomeButtonImageName)]; 249 [homeButton_ setImage:nsimage_cache::ImageNamed(kHomeButtonImageName)];
235 [wrenchButton_ setImage:nsimage_cache::ImageNamed(kWrenchButtonImageName)]; 250
251 if (Singleton<UpgradeDetector>::get()->notify_upgrade()) {
252 [self badgeWrenchMenu];
253 } else {
254 NSImage* wrenchImage = nsimage_cache::ImageNamed(kWrenchButtonImageName);
255 [wrenchButton_ setImage:wrenchImage];
256 }
236 257
237 [backButton_ setShowsBorderOnlyWhileMouseInside:YES]; 258 [backButton_ setShowsBorderOnlyWhileMouseInside:YES];
238 [forwardButton_ setShowsBorderOnlyWhileMouseInside:YES]; 259 [forwardButton_ setShowsBorderOnlyWhileMouseInside:YES];
239 [reloadButton_ setShowsBorderOnlyWhileMouseInside:YES]; 260 [reloadButton_ setShowsBorderOnlyWhileMouseInside:YES];
240 [homeButton_ setShowsBorderOnlyWhileMouseInside:YES]; 261 [homeButton_ setShowsBorderOnlyWhileMouseInside:YES];
241 [wrenchButton_ setShowsBorderOnlyWhileMouseInside:YES]; 262 [wrenchButton_ setShowsBorderOnlyWhileMouseInside:YES];
242 263
243 [self initCommandStatus:commands_]; 264 [self initCommandStatus:commands_];
244 locationBarView_.reset(new LocationBarViewMac(locationBar_, 265 locationBarView_.reset(new LocationBarViewMac(locationBar_,
245 commands_, toolbarModel_, 266 commands_, toolbarModel_,
246 profile_, browser_)); 267 profile_, browser_));
247 [locationBar_ setFont:[NSFont systemFontOfSize:[NSFont systemFontSize]]]; 268 [locationBar_ setFont:[NSFont systemFontOfSize:[NSFont systemFontSize]]];
248 // Register pref observers for the optional home and page/options buttons 269 // Register pref observers for the optional home and page/options buttons
249 // and then add them to the toolbar based on those prefs. 270 // and then add them to the toolbar based on those prefs.
250 prefObserver_.reset(new ToolbarControllerInternal::PrefObserverBridge(self)); 271 notificationBridge_.reset(
272 new ToolbarControllerInternal::NotificationBridge(self));
251 PrefService* prefs = profile_->GetPrefs(); 273 PrefService* prefs = profile_->GetPrefs();
252 showHomeButton_.Init(prefs::kShowHomeButton, prefs, prefObserver_.get()); 274 showHomeButton_.Init(prefs::kShowHomeButton, prefs,
275 notificationBridge_.get());
253 showPageOptionButtons_.Init(prefs::kShowPageOptionsButtons, prefs, 276 showPageOptionButtons_.Init(prefs::kShowPageOptionsButtons, prefs,
254 prefObserver_.get()); 277 notificationBridge_.get());
255 [self showOptionalHomeButton]; 278 [self showOptionalHomeButton];
256 [self installWrenchMenu]; 279 [self installWrenchMenu];
257 280
258 // Create the controllers for the back/forward menus. 281 // Create the controllers for the back/forward menus.
259 backMenuController_.reset([[BackForwardMenuController alloc] 282 backMenuController_.reset([[BackForwardMenuController alloc]
260 initWithBrowser:browser_ 283 initWithBrowser:browser_
261 modelType:BACK_FORWARD_MENU_TYPE_BACK 284 modelType:BACK_FORWARD_MENU_TYPE_BACK
262 button:backButton_]); 285 button:backButton_]);
263 forwardMenuController_.reset([[BackForwardMenuController alloc] 286 forwardMenuController_.reset([[BackForwardMenuController alloc]
264 initWithBrowser:browser_ 287 initWithBrowser:browser_
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after
515 wrenchMenuModel_.reset(new WrenchMenuModel(menuDelegate_.get(), browser_)); 538 wrenchMenuModel_.reset(new WrenchMenuModel(menuDelegate_.get(), browser_));
516 [wrenchMenuController_ setModel:wrenchMenuModel_.get()]; 539 [wrenchMenuController_ setModel:wrenchMenuModel_.get()];
517 [wrenchMenuController_ setUseWithPopUpButtonCell:YES]; 540 [wrenchMenuController_ setUseWithPopUpButtonCell:YES];
518 [wrenchButton_ setAttachedMenu:[wrenchMenuController_ menu]]; 541 [wrenchButton_ setAttachedMenu:[wrenchMenuController_ menu]];
519 } 542 }
520 543
521 - (WrenchMenuController*)wrenchMenuController { 544 - (WrenchMenuController*)wrenchMenuController {
522 return wrenchMenuController_; 545 return wrenchMenuController_;
523 } 546 }
524 547
548 - (void)badgeWrenchMenu {
549 // The wrench menu gets an upgrade dot. Currently, it's ugly.
550 // http://crbug.com/49370
551 NSImage* wrenchImage = nsimage_cache::ImageNamed(kWrenchButtonImageName);
552 ThemeProvider* theme_provider = profile_->GetThemeProvider();
553 NSImage* badge = theme_provider->GetNSImageNamed(IDR_UPGRADE_DOT_ACTIVE,
554 true);
555 [wrenchImage lockFocus];
556 [badge drawAtPoint:NSMakePoint(1, 1)
557 fromRect:NSZeroRect
558 operation:NSCompositeSourceOver
559 fraction:1.0];
560 [wrenchImage unlockFocus];
561 [wrenchButton_ setImage:wrenchImage];
562 [wrenchButton_ setNeedsDisplay:YES];
563 }
564
525 - (void)prefChanged:(std::wstring*)prefName { 565 - (void)prefChanged:(std::wstring*)prefName {
526 if (!prefName) return; 566 if (!prefName) return;
527 if (*prefName == prefs::kShowHomeButton) { 567 if (*prefName == prefs::kShowHomeButton) {
528 [self showOptionalHomeButton]; 568 [self showOptionalHomeButton];
529 } 569 }
530 } 570 }
531 571
532 - (void)createBrowserActionButtons { 572 - (void)createBrowserActionButtons {
533 if (!browserActionsController_.get()) { 573 if (!browserActionsController_.get()) {
534 browserActionsController_.reset([[BrowserActionsController alloc] 574 browserActionsController_.reset([[BrowserActionsController alloc]
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after
733 - (void)indicateDropURLsInView:(NSView*)view at:(NSPoint)point { 773 - (void)indicateDropURLsInView:(NSView*)view at:(NSPoint)point {
734 // Do nothing. 774 // Do nothing.
735 } 775 }
736 776
737 // (URLDropTargetController protocol) 777 // (URLDropTargetController protocol)
738 - (void)hideDropURLsIndicatorInView:(NSView*)view { 778 - (void)hideDropURLsIndicatorInView:(NSView*)view {
739 // Do nothing. 779 // Do nothing.
740 } 780 }
741 781
742 @end 782 @end
OLDNEW
« no previous file with comments | « chrome/browser/cocoa/toolbar_controller.h ('k') | chrome/browser/wrench_menu_model.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698