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

Side by Side Diff: webkit/glue/webmenurunner_mac.mm

Issue 1992006: Do right-alignment of popups when WebKit indicates to do so. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 10 years, 7 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 | Annotate | Revision Log
« no previous file with comments | « webkit/glue/webmenurunner_mac.h ('k') | webkit/tools/test_shell/mac/test_webview_delegate.mm » ('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) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2009 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 #include "webkit/glue/webmenurunner_mac.h" 5 #include "webkit/glue/webmenurunner_mac.h"
6 6
7 #include "base/sys_string_conversions.h" 7 #include "base/sys_string_conversions.h"
8 8
9 namespace { 9 namespace {
10 10
11 const CGFloat kPopupXOffset = -10.0f; 11 const CGFloat kPopupXOffset = -10.0f;
12 BOOL gNewNSMenuAPI; 12 BOOL gNewNSMenuAPI;
13 13
14 } // namespace 14 } // namespace
15 15
16 #if !defined(MAC_OS_X_VERSION_10_6) || \ 16 #if !defined(MAC_OS_X_VERSION_10_6) || \
17 MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_6 17 MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_6
18 @interface NSMenu (SnowLeopardSDKDeclarations) 18 @interface NSMenu (SnowLeopardSDKDeclarations)
19 - (BOOL)popUpMenuPositioningItem:(NSMenuItem *)item 19 - (BOOL)popUpMenuPositioningItem:(NSMenuItem *)item
20 atLocation:(NSPoint)location 20 atLocation:(NSPoint)location
21 inView:(NSView *)view; 21 inView:(NSView *)view;
22 - (void)setFont:(NSFont *)font; 22 - (void)setFont:(NSFont *)font;
23 @end 23 @end
24 #endif 24 #endif
25 25
26 @interface WebMenuRunner (PrivateAPI) 26 @interface WebMenuRunner (PrivateAPI)
27 27
28 // Worker function used during initialization. 28 // Worker function used during initialization.
29 - (void)addItem:(const WebMenuItem&)item; 29 - (void)addItem:(const WebMenuItem&)item
30 withAttributes:(NSDictionary*)attrs;
30 31
31 // A callback for the menu controller object to call when an item is selected 32 // A callback for the menu controller object to call when an item is selected
32 // from the menu. This is not called if the menu is dismissed without a 33 // from the menu. This is not called if the menu is dismissed without a
33 // selection. 34 // selection.
34 - (void)menuItemSelected:(id)sender; 35 - (void)menuItemSelected:(id)sender;
35 36
36 @end // WebMenuRunner (PrivateAPI) 37 @end // WebMenuRunner (PrivateAPI)
37 38
38 @implementation WebMenuRunner 39 @implementation WebMenuRunner
39 40
40 - (id)initWithItems:(const std::vector<WebMenuItem>&)items 41 - (id)initWithItems:(const std::vector<WebMenuItem>&)items
41 fontSize:(CGFloat)fontSize { 42 fontSize:(CGFloat)fontSize
43 rightAligned:(BOOL)rightAligned {
42 static BOOL newNSMenuAPIInitialized = NO; 44 static BOOL newNSMenuAPIInitialized = NO;
43 if (!newNSMenuAPIInitialized) { 45 if (!newNSMenuAPIInitialized) {
44 newNSMenuAPIInitialized = YES; 46 newNSMenuAPIInitialized = YES;
45 gNewNSMenuAPI = [NSMenu instancesRespondToSelector: 47 gNewNSMenuAPI = [NSMenu instancesRespondToSelector:
46 @selector(popUpMenuPositioningItem:atLocation:inView:)] && 48 @selector(popUpMenuPositioningItem:atLocation:inView:)] &&
47 [NSMenu instancesRespondToSelector:@selector(setFont:)]; 49 [NSMenu instancesRespondToSelector:@selector(setFont:)];
48 } 50 }
49 51
50 if ((self = [super init])) { 52 if ((self = [super init])) {
51 menu_.reset([[NSMenu alloc] initWithTitle:@""]); 53 menu_.reset([[NSMenu alloc] initWithTitle:@""]);
52 if (gNewNSMenuAPI) 54 if (gNewNSMenuAPI)
53 [menu_ setFont:[NSFont menuFontOfSize:fontSize]]; 55 [menu_ setFont:[NSFont menuFontOfSize:fontSize]];
54 [menu_ setAutoenablesItems:NO]; 56 [menu_ setAutoenablesItems:NO];
55 index_ = -1; 57 index_ = -1;
56 fontSize_ = fontSize; 58 fontSize_ = fontSize;
59 scoped_nsobject<NSDictionary> attrs;
60 if (rightAligned) {
61 // NB: Right-aligning menu items in this manner is known to not work in
62 // Mac OS X 10.5.
63 scoped_nsobject<NSMutableParagraphStyle> paragraphStyle(
64 [[NSMutableParagraphStyle alloc] init]);
65 [paragraphStyle setAlignment:NSRightTextAlignment];
66 attrs.reset([[NSDictionary alloc] initWithObjectsAndKeys:
67 paragraphStyle, NSParagraphStyleAttributeName, nil]);
68 }
57 for (size_t i = 0; i < items.size(); ++i) 69 for (size_t i = 0; i < items.size(); ++i)
58 [self addItem:items[i]]; 70 [self addItem:items[i] withAttributes:attrs];
59 } 71 }
60 return self; 72 return self;
61 } 73 }
62 74
63 - (void)addItem:(const WebMenuItem&)item { 75 - (void)addItem:(const WebMenuItem&)item
76 withAttributes:(NSDictionary*)attrs {
64 if (item.type == WebMenuItem::SEPARATOR) { 77 if (item.type == WebMenuItem::SEPARATOR) {
65 [menu_ addItem:[NSMenuItem separatorItem]]; 78 [menu_ addItem:[NSMenuItem separatorItem]];
66 return; 79 return;
67 } 80 }
68 81
69 NSString* title = base::SysUTF16ToNSString(item.label); 82 NSString* title = base::SysUTF16ToNSString(item.label);
70 NSMenuItem* menuItem = [menu_ addItemWithTitle:title 83 NSMenuItem* menuItem = [menu_ addItemWithTitle:title
71 action:@selector(menuItemSelected:) 84 action:@selector(menuItemSelected:)
72 keyEquivalent:@""]; 85 keyEquivalent:@""];
73 [menuItem setEnabled:(item.enabled && item.type != WebMenuItem::GROUP)]; 86 [menuItem setEnabled:(item.enabled && item.type != WebMenuItem::GROUP)];
74 [menuItem setTarget:self]; 87 [menuItem setTarget:self];
88 if (attrs) {
89 scoped_nsobject<NSAttributedString> attrTitle(
90 [[NSAttributedString alloc] initWithString:title
91 attributes:attrs]);
92 [menuItem setAttributedTitle:attrTitle];
93 }
75 if (gNewNSMenuAPI) 94 if (gNewNSMenuAPI)
76 [menuItem setTag:[menu_ numberOfItems] - 1]; 95 [menuItem setTag:[menu_ numberOfItems] - 1];
77 } 96 }
78 97
79 // Reflects the result of the user's interaction with the popup menu. If NO, the 98 // Reflects the result of the user's interaction with the popup menu. If NO, the
80 // menu was dismissed without the user choosing an item, which can happen if the 99 // menu was dismissed without the user choosing an item, which can happen if the
81 // user clicked outside the menu region or hit the escape key. If YES, the user 100 // user clicked outside the menu region or hit the escape key. If YES, the user
82 // selected an item from the menu. 101 // selected an item from the menu.
83 - (BOOL)menuItemWasChosen { 102 - (BOOL)menuItemWasChosen {
84 return menuItemWasChosen_; 103 return menuItemWasChosen_;
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
176 characters:@"" 195 characters:@""
177 charactersIgnoringModifiers:escape_str 196 charactersIgnoringModifiers:escape_str
178 isARepeat:NO 197 isARepeat:NO
179 keyCode:0x1B]; 198 keyCode:0x1B];
180 } 199 }
181 200
182 return event; 201 return event;
183 } 202 }
184 203
185 } // namespace webkit_glue 204 } // namespace webkit_glue
OLDNEW
« no previous file with comments | « webkit/glue/webmenurunner_mac.h ('k') | webkit/tools/test_shell/mac/test_webview_delegate.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698