From 7107d9d24e79737ef722239c74a92b962483e199 Mon Sep 17 00:00:00 2001 From: "rsesek@chromium.org" Date: Tue, 15 Feb 2011 16:33:13 +0000 Subject: [Mac] Confirm-to-quit: show the right key combo if it has been remapped. BUG=65209 TEST=Add a custom keyboard shortcut to override the "Quit Chromium" menu item in System Prefs. Run with --enable-confirm-to-quit. Hit the key combination and the panel now shows the right key combination. Review URL: http://codereview.chromium.org/6525001 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@74954 0039d316-1c4b-4281-b951-d872f2087c98 --- chrome/app/generated_resources.grd | 2 +- chrome/app/nibs/ConfirmQuitPanel.xib | 27 ++++++++-- .../ui/cocoa/confirm_quit_panel_controller.h | 10 ++++ .../ui/cocoa/confirm_quit_panel_controller.mm | 42 ++++++++++++++++ .../confirm_quit_panel_controller_unittest.mm | 57 ++++++++++++++++++++++ 5 files changed, 133 insertions(+), 5 deletions(-) diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index 4c12985..0f14aeb 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd @@ -4678,7 +4678,7 @@ Keep your key file in a safe place. You will need it to create new versions of y - Hold ⌘Q to Quit. + Hold $1⌘Q to Quit. diff --git a/chrome/app/nibs/ConfirmQuitPanel.xib b/chrome/app/nibs/ConfirmQuitPanel.xib index 4fc4240..a88cc05 100644 --- a/chrome/app/nibs/ConfirmQuitPanel.xib +++ b/chrome/app/nibs/ConfirmQuitPanel.xib @@ -2,10 +2,10 @@ 1050 - 10F2108 + 10J567 823 - 1038.29 - 461.00 + 1038.35 + 462.00 com.apple.InterfaceBuilder.CocoaPlugin 823 @@ -121,6 +121,14 @@ 11 + + + message_ + + + + 12 + @@ -239,7 +247,7 @@ - 11 + 12 @@ -266,6 +274,17 @@ id + + message_ + NSTextField + + + message_ + + message_ + NSTextField + + IBProjectSource browser/ui/cocoa/confirm_quit_panel_controller.h diff --git a/chrome/browser/ui/cocoa/confirm_quit_panel_controller.h b/chrome/browser/ui/cocoa/confirm_quit_panel_controller.h index b7201e1..85f52d9 100644 --- a/chrome/browser/ui/cocoa/confirm_quit_panel_controller.h +++ b/chrome/browser/ui/cocoa/confirm_quit_panel_controller.h @@ -2,6 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#ifndef CHROME_BROWSER_UI_COCOA_CONFIRM_QUIT_PANEL_CONTROLLER_H_ +#define CHROME_BROWSER_UI_COCOA_CONFIRM_QUIT_PANEL_CONTROLLER_H_ + #import #import "base/mac/cocoa_protocols.h" @@ -9,6 +12,7 @@ // The ConfirmQuitPanelController manages the black HUD window that tells users // to "Hold Cmd+Q to Quit". @interface ConfirmQuitPanelController : NSWindowController { + IBOutlet NSTextField* message_; } // Returns a singleton instance of the Controller. This will create one if it @@ -23,3 +27,9 @@ - (void)dismissPanel; @end + +@interface ConfirmQuitPanelController (UnitTesting) +- (NSString*)keyCombinationForMenuItem:(NSMenuItem*)item; +@end + +#endif // CHROME_BROWSER_UI_COCOA_CONFIRM_QUIT_PANEL_CONTROLLER_H_ diff --git a/chrome/browser/ui/cocoa/confirm_quit_panel_controller.mm b/chrome/browser/ui/cocoa/confirm_quit_panel_controller.mm index 6ad363b..a8fa616 100644 --- a/chrome/browser/ui/cocoa/confirm_quit_panel_controller.mm +++ b/chrome/browser/ui/cocoa/confirm_quit_panel_controller.mm @@ -8,11 +8,15 @@ #include "base/logging.h" #include "base/mac/mac_util.h" #include "base/scoped_nsobject.h" +#include "base/sys_string_conversions.h" #import "chrome/browser/ui/cocoa/confirm_quit_panel_controller.h" +#include "grit/generated_resources.h" +#include "ui/base/l10n/l10n_util_mac.h" @interface ConfirmQuitPanelController (Private) - (id)initInternal; - (void)animateFadeOut; +- (NSString*)keyCommandString; @end ConfirmQuitPanelController* g_confirmQuitPanelController = nil; @@ -39,6 +43,9 @@ ConfirmQuitPanelController* g_confirmQuitPanelController = nil; - (void)awakeFromNib { DCHECK([self window]); DCHECK_EQ(self, [[self window] delegate]); + NSString* message = l10n_util::GetNSStringF(IDS_CONFIRM_TO_QUIT_DESCRIPTION, + base::SysNSStringToUTF16([self keyCommandString])); + [message_ setStringValue:message]; } - (void)windowWillClose:(NSNotification*)notif { @@ -82,4 +89,39 @@ ConfirmQuitPanelController* g_confirmQuitPanelController = nil; [self close]; } +// This looks at the Main Menu and determines what the user has set as the +// key combination for quit. It then gets the modifiers and builds a string +// to display them. +- (NSString*)keyCommandString { + NSMenu* mainMenu = [NSApp mainMenu]; + // Get the application menu (i.e. Chromium). + NSMenu* appMenu = [[mainMenu itemAtIndex:0] submenu]; + for (NSMenuItem* item in [appMenu itemArray]) { + // Find the Quit item. + if ([item action] == @selector(terminate:)) { + return [self keyCombinationForMenuItem:item]; + } + } + // Default to Cmd+Q. + return @"\u2318Q"; +} + +- (NSString*)keyCombinationForMenuItem:(NSMenuItem*)item { + NSMutableString* string = [NSMutableString string]; + NSUInteger modifiers = [item keyEquivalentModifierMask]; + + if (modifiers & NSCommandKeyMask) + [string appendString:@"\u2318"]; + if (modifiers & NSControlKeyMask) + [string appendString:@"\u2303"]; + if (modifiers & NSAlternateKeyMask) + [string appendString:@"\u2325"]; + if (modifiers & NSShiftKeyMask) + [string appendString:@"\u21E7"]; + + [string appendString:[[item keyEquivalent] uppercaseString]]; + + return string; +} + @end diff --git a/chrome/browser/ui/cocoa/confirm_quit_panel_controller_unittest.mm b/chrome/browser/ui/cocoa/confirm_quit_panel_controller_unittest.mm index 0426149..c015ede 100644 --- a/chrome/browser/ui/cocoa/confirm_quit_panel_controller_unittest.mm +++ b/chrome/browser/ui/cocoa/confirm_quit_panel_controller_unittest.mm @@ -4,10 +4,31 @@ #import "chrome/browser/ui/cocoa/cocoa_test_helper.h" #include "chrome/browser/ui/cocoa/confirm_quit_panel_controller.h" +#include "testing/gtest_mac.h" namespace { class ConfirmQuitPanelControllerTest : public CocoaTest { + public: + NSMenuItem* MakeMenuItem(NSString* keyEquivalent, NSUInteger modifiers) { + NSMenuItem* item = [[NSMenuItem alloc] initWithTitle:@"Test" + action:NULL + keyEquivalent:keyEquivalent]; + [item setKeyEquivalentModifierMask:modifiers]; + return [item autorelease]; + } + + NSString* TestString(NSString* str) { + str = [str stringByReplacingOccurrencesOfString:@"{Cmd}" + withString:@"\u2318"]; + str = [str stringByReplacingOccurrencesOfString:@"{Ctrl}" + withString:@"\u2303"]; + str = [str stringByReplacingOccurrencesOfString:@"{Opt}" + withString:@"\u2325"]; + str = [str stringByReplacingOccurrencesOfString:@"{Shift}" + withString:@"\u21E7"]; + return str; + } }; @@ -24,4 +45,40 @@ TEST_F(ConfirmQuitPanelControllerTest, ShowAndDismiss) { EXPECT_EQ(controller, [ConfirmQuitPanelController sharedController]); } +TEST_F(ConfirmQuitPanelControllerTest, KeyCombinationForMenuItem) { + ConfirmQuitPanelController* controller = + [ConfirmQuitPanelController sharedController]; + + NSMenuItem* item = MakeMenuItem(@"q", NSCommandKeyMask); + EXPECT_NSEQ(TestString(@"{Cmd}Q"), + [controller keyCombinationForMenuItem:item]); + + item = MakeMenuItem(@"c", NSCommandKeyMask | NSShiftKeyMask); + EXPECT_NSEQ(TestString(@"{Cmd}{Shift}C"), + [controller keyCombinationForMenuItem:item]); + + item = MakeMenuItem(@"h", + NSCommandKeyMask | NSShiftKeyMask | NSAlternateKeyMask); + EXPECT_NSEQ(TestString(@"{Cmd}{Opt}{Shift}H"), + [controller keyCombinationForMenuItem:item]); + + item = MakeMenuItem(@"r", + NSCommandKeyMask | NSShiftKeyMask | NSAlternateKeyMask | + NSControlKeyMask); + EXPECT_NSEQ(TestString(@"{Cmd}{Ctrl}{Opt}{Shift}R"), + [controller keyCombinationForMenuItem:item]); + + item = MakeMenuItem(@"o", NSControlKeyMask); + EXPECT_NSEQ(TestString(@"{Ctrl}O"), + [controller keyCombinationForMenuItem:item]); + + item = MakeMenuItem(@"m", NSShiftKeyMask | NSControlKeyMask); + EXPECT_NSEQ(TestString(@"{Ctrl}{Shift}M"), + [controller keyCombinationForMenuItem:item]); + + item = MakeMenuItem(@"e", NSCommandKeyMask | NSAlternateKeyMask); + EXPECT_NSEQ(TestString(@"{Cmd}{Opt}E"), + [controller keyCombinationForMenuItem:item]); +} + } // namespace -- cgit v1.1