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

Side by Side Diff: chrome/browser/ui/cocoa/website_settings_bubble_controller.mm

Issue 10827029: [Mac] Website settings: Implement custom tab appearance. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 4 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 | « chrome/browser/ui/cocoa/website_settings_bubble_controller.h ('k') | no next file » | 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) 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/website_settings_bubble_controller.h" 5 #import "chrome/browser/ui/cocoa/website_settings_bubble_controller.h"
6 6
7 #import <AppKit/NSCell.h>
Robert Sesek 2012/07/26 02:49:28 Is this necessary? You import Cocoa.h in the .h, w
Patrick Dubroy 2012/07/28 02:15:02 You're right. I could have sworn I added this only
8 #import <QuartzCore/QuartzCore.h>
9
7 #include "base/sys_string_conversions.h" 10 #include "base/sys_string_conversions.h"
8 #import "chrome/browser/ui/cocoa/browser_window_controller.h" 11 #import "chrome/browser/ui/cocoa/browser_window_controller.h"
9 #import "chrome/browser/ui/cocoa/info_bubble_view.h" 12 #import "chrome/browser/ui/cocoa/info_bubble_view.h"
10 #import "chrome/browser/ui/cocoa/info_bubble_window.h" 13 #import "chrome/browser/ui/cocoa/info_bubble_window.h"
11 #import "chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.h" 14 #import "chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.h"
12 #include "chrome/browser/ui/tab_contents/tab_contents.h" 15 #include "chrome/browser/ui/tab_contents/tab_contents.h"
13 #include "content/public/browser/cert_store.h" 16 #include "content/public/browser/cert_store.h"
14 #include "grit/generated_resources.h" 17 #include "grit/generated_resources.h"
18 #include "grit/theme_resources.h"
15 #include "grit/ui_resources.h" 19 #include "grit/ui_resources.h"
16 #import "third_party/GTM/AppKit/GTMUILocalizerAndLayoutTweaker.h" 20 #import "third_party/GTM/AppKit/GTMUILocalizerAndLayoutTweaker.h"
17 #include "ui/base/l10n/l10n_util.h" 21 #include "ui/base/l10n/l10n_util.h"
18 #include "ui/base/resource/resource_bundle.h" 22 #include "ui/base/resource/resource_bundle.h"
19 23
20 namespace { 24 namespace {
21 25
22 // The width of the window, in view coordinates. The height will be determined 26 // The width of the window, in view coordinates. The height will be determined
23 // by the content. 27 // by the content.
24 const CGFloat kWindowWidth = 380; 28 const CGFloat kWindowWidth = 380;
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
66 // A simple container to hold all the contents of the website settings bubble. 70 // A simple container to hold all the contents of the website settings bubble.
67 // It uses a flipped coordinate system to make text layout easier. 71 // It uses a flipped coordinate system to make text layout easier.
68 @interface WebsiteSettingsContentView : NSView 72 @interface WebsiteSettingsContentView : NSView
69 @end 73 @end
70 @implementation WebsiteSettingsContentView 74 @implementation WebsiteSettingsContentView
71 - (BOOL)isFlipped { 75 - (BOOL)isFlipped {
72 return YES; 76 return YES;
73 } 77 }
74 @end 78 @end
75 79
80 @interface CustomTabbedSegmentedCell : NSSegmentedCell {
Robert Sesek 2012/07/26 02:49:28 naming: call this WebsiteSettingsTabSegmentedCell
Patrick Dubroy 2012/07/28 02:15:02 Done.
81 @private
82 scoped_nsobject<NSImage> tabBackgroundImage_;
83 scoped_nsobject<NSImage> tabCenterImage_;
84 scoped_nsobject<NSImage> tabLeftImage_;
85 scoped_nsobject<NSImage> tabRightImage_;
86 }
87 @end
88 @implementation CustomTabbedSegmentedCell
89 - (id)init {
90 ResourceBundle& rb = ResourceBundle::GetSharedInstance();
Robert Sesek 2012/07/26 02:49:28 This should be in an if ((self = [super init])) bl
Patrick Dubroy 2012/07/28 02:15:02 Done.
91 tabBackgroundImage_.reset(
92 [rb.GetNativeImageNamed(IDR_WEBSITE_SETTINGS_TAB_BACKGROUND) retain]);
93 tabCenterImage_.reset(
94 [rb.GetNativeImageNamed(IDR_WEBSITE_SETTINGS_TAB_CENTER) retain]);
95 tabLeftImage_.reset(
96 [rb.GetNativeImageNamed(IDR_WEBSITE_SETTINGS_TAB_LEFT) retain]);
97 tabRightImage_.reset(
98 [rb.GetNativeImageNamed(IDR_WEBSITE_SETTINGS_TAB_RIGHT) retain]);
99
100 return [super init];
101 }
102
103 // Fill the given rect with a tiled pattern using the given image.
104 - (void)fillRect:(NSRect)rect
105 withTiledImage:(NSImage*)image
106 inView:(NSView*)view{
107 NSGraphicsContext* context = [NSGraphicsContext currentContext];
108 [context saveGraphicsState];
Robert Sesek 2012/07/26 02:49:28 There's a scoper in ui/gfx for this.
Patrick Dubroy 2012/07/28 02:15:02 Not relevant anymore.
109 NSPoint patternStart = [view convertPoint:rect.origin toView:nil];
110 [context setPatternPhase:patternStart];
111 [[NSColor colorWithPatternImage:image] set];
112 NSRectFill(rect);
113 [context restoreGraphicsState];
114 }
115
116 - (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView {
117 // Draw the background for the tab strip.
118 [self fillRect:cellFrame
119 withTiledImage:tabBackgroundImage_.get()
Robert Sesek 2012/07/26 02:49:28 nit: if aligning the colons mean that the next lin
Patrick Dubroy 2012/07/28 02:15:02 Not relevant anymore.
120 inView:controlView];
121
122 // Draw the individual tabs.
123 [self drawInteriorWithFrame:cellFrame inView:controlView];
124 }
125
126 - (void)drawSegment:(NSInteger)segment
127 inFrame:(NSRect)frame
128 withView:(NSView*)controlView {
129 if ([self isSelectedForSegment:segment]) {
130 NSDrawThreePartImage(frame,
131 tabLeftImage_,
132 tabCenterImage_,
133 tabRightImage_,
134 NO,
Robert Sesek 2012/07/26 02:49:28 For these BOOL params, can you do /*param_name=*/
Patrick Dubroy 2012/07/28 02:15:02 Done.
135 NSCompositeSourceOver,
136 1,
137 YES);
138 }
139 frame.origin.y += 20;
140 frame.size.height -= 20;
141
142 // Call the superclass to draw the label.
143 [super drawSegment:segment inFrame:frame withView:controlView];
144 }
145 @end
146
76 @implementation WebsiteSettingsBubbleController 147 @implementation WebsiteSettingsBubbleController
77 148
78 - (id)initWithParentWindow:(NSWindow*)parentWindow 149 - (id)initWithParentWindow:(NSWindow*)parentWindow
79 websiteSettingsUIBridge:(WebsiteSettingsUIBridge*)bridge { 150 websiteSettingsUIBridge:(WebsiteSettingsUIBridge*)bridge {
80 DCHECK(parentWindow); 151 DCHECK(parentWindow);
81 152
82 // Use an arbitrary height; it will be changed in performLayout. 153 // Use an arbitrary height; it will be changed in performLayout.
83 NSRect contentRect = NSMakeRect(0, 0, kWindowWidth, 1); 154 NSRect contentRect = NSMakeRect(0, 0, kWindowWidth, 1);
84 // Create an empty window into which content is placed. 155 // Create an empty window into which content is placed.
85 scoped_nsobject<InfoBubbleWindow> window( 156 scoped_nsobject<InfoBubbleWindow> window(
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
126 197
127 // Create a text field to identity status (e.g. verified, not verified). 198 // Create a text field to identity status (e.g. verified, not verified).
128 identityStatusField_ = [self addText:string16() 199 identityStatusField_ = [self addText:string16()
129 withSize:[NSFont smallSystemFontSize] 200 withSize:[NSFont smallSystemFontSize]
130 bold:NO 201 bold:NO
131 toView:contentView_ 202 toView:contentView_
132 atPoint:controlOrigin]; 203 atPoint:controlOrigin];
133 204
134 // Create the tab view and its two tabs. 205 // Create the tab view and its two tabs.
135 206
207 NSRect initialFrame = NSMakeRect(0, 0, kWindowWidth, 44);
208 segmentedControl_.reset(
209 [[NSSegmentedControl alloc] initWithFrame:initialFrame]);
210 [segmentedControl_ setCell:[[CustomTabbedSegmentedCell alloc] init]];
211 [segmentedControl_ setSegmentCount:2];
212 [segmentedControl_ setTarget:self];
213 [segmentedControl_ setAction:@selector(tabSelected:)];
214 NSFont* smallSystemFont =
215 [NSFont systemFontOfSize:[NSFont smallSystemFontSize]];
216 NSDictionary* textAttributes =
217 [NSDictionary dictionaryWithObject:smallSystemFont
218 forKey:NSFontAttributeName];
219
220 NSString* label = l10n_util::GetNSString(
221 IDS_WEBSITE_SETTINGS_TAB_LABEL_PERMISSIONS);
222 NSSize textSize = [label sizeWithAttributes:textAttributes];
223
224 [segmentedControl_ setLabel:label forSegment:0];
225 [segmentedControl_ setWidth:textSize.width + 2 * 28 forSegment:0];
Robert Sesek 2012/07/26 02:49:28 Where's 28 come from?
Patrick Dubroy 2012/07/28 02:15:02 Fixed.
226
227 label = l10n_util::GetNSString(IDS_WEBSITE_SETTINGS_TAB_LABEL_CONNECTION);
228 textSize = [label sizeWithAttributes:textAttributes];
229 [segmentedControl_ setLabel:label forSegment:1];
230 [segmentedControl_ setWidth:textSize.width + 2 * 28 forSegment:1];
231
232 [segmentedControl_ setFont:smallSystemFont];
233 [contentView_ addSubview:segmentedControl_];
234
136 NSRect tabFrame = NSMakeRect(0, 0, kWindowWidth, 300); 235 NSRect tabFrame = NSMakeRect(0, 0, kWindowWidth, 300);
137 tabView_.reset([[NSTabView alloc] initWithFrame:tabFrame]); 236 tabView_.reset([[NSTabView alloc] initWithFrame:tabFrame]);
138 [tabView_ setTabViewType:NSTopTabsBezelBorder]; 237 [tabView_ setTabViewType:NSNoTabsNoBorder];
238 [tabView_ setDrawsBackground:NO];
139 [tabView_ setControlSize:NSSmallControlSize]; 239 [tabView_ setControlSize:NSSmallControlSize];
140 [tabView_ setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]];
141 [contentView_ addSubview:tabView_.get()]; 240 [contentView_ addSubview:tabView_.get()];
142 241
143 permissionsContentView_ = [self addPermissionsTabToTabView:tabView_]; 242 permissionsContentView_ = [self addPermissionsTabToTabView:tabView_];
144 [self addConnectionTabToTabView:tabView_]; 243 [self addConnectionTabToTabView:tabView_];
145 244
146 // Replace the window's content. 245 // Replace the window's content.
147 [[[self window] contentView] setSubviews: 246 [[[self window] contentView] setSubviews:
148 [NSArray arrayWithObject:contentView_.get()]]; 247 [NSArray arrayWithObject:contentView_.get()]];
149 248
150 [self performLayout]; 249 [self performLayout];
151 } 250 }
152 251
153 // Create the contents of the Permissions tab and add it to the given tab view. 252 // Create the contents of the Permissions tab and add it to the given tab view.
154 // Returns a weak reference to the tab view item's view. 253 // Returns a weak reference to the tab view item's view.
155 - (NSView*)addPermissionsTabToTabView:(NSTabView*)tabView { 254 - (NSView*)addPermissionsTabToTabView:(NSTabView*)tabView {
156 scoped_nsobject<NSTabViewItem> item([[NSTabViewItem alloc] init]); 255 scoped_nsobject<NSTabViewItem> item([[NSTabViewItem alloc] init]);
157 [item setLabel:
158 l10n_util::GetNSString(IDS_WEBSITE_SETTINGS_TAB_LABEL_PERMISSIONS)];
159 [tabView_ addTabViewItem:item.get()]; 256 [tabView_ addTabViewItem:item.get()];
160 scoped_nsobject<NSView> contentView([[WebsiteSettingsContentView alloc] 257 scoped_nsobject<NSView> contentView([[WebsiteSettingsContentView alloc]
161 initWithFrame:[tabView_ contentRect]]); 258 initWithFrame:[tabView_ contentRect]]);
162 [item setView:contentView.get()]; 259 [item setView:contentView.get()];
163 return contentView.get(); 260 return contentView.get();
164 } 261 }
165 262
166 // Create the contents of the Connection tab and add it to the given tab view. 263 // Create the contents of the Connection tab and add it to the given tab view.
167 // Returns a weak reference to the tab view item's view. 264 // Returns a weak reference to the tab view item's view.
168 - (NSView*)addConnectionTabToTabView:(NSTabView*)tabView { 265 - (NSView*)addConnectionTabToTabView:(NSTabView*)tabView {
169 scoped_nsobject<NSTabViewItem> item([[NSTabViewItem alloc] init]); 266 scoped_nsobject<NSTabViewItem> item([[NSTabViewItem alloc] init]);
170 [item setLabel:
171 l10n_util::GetNSString(IDS_WEBSITE_SETTINGS_TAB_LABEL_CONNECTION)];
172
173 scoped_nsobject<NSView> contentView([[WebsiteSettingsContentView alloc] 267 scoped_nsobject<NSView> contentView([[WebsiteSettingsContentView alloc]
174 initWithFrame:[tabView_ contentRect]]); 268 initWithFrame:[tabView_ contentRect]]);
175 269
176 // Place all the text at the same position. It will be adjusted in 270 // Place all the text at the same position. It will be adjusted in
177 // performLayout. 271 // performLayout.
178 NSPoint textPosition = NSMakePoint( 272 NSPoint textPosition = NSMakePoint(
179 kTabViewContentsPadding + kImageSize + kImageSpacing, 273 kTabViewContentsPadding + kImageSize + kImageSpacing,
180 kTabViewContentsPadding); 274 kTabViewContentsPadding);
181 275
182 identityStatusIcon_ = 276 identityStatusIcon_ =
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
260 354
261 // Lay out the last visit section. 355 // Lay out the last visit section.
262 [self setYPositionOfView:firstVisitIcon_ to:yPos]; 356 [self setYPositionOfView:firstVisitIcon_ to:yPos];
263 [self sizeTextFieldHeightToFit:firstVisitHeaderField_]; 357 [self sizeTextFieldHeightToFit:firstVisitHeaderField_];
264 yPos = [self setYPositionOfView:firstVisitHeaderField_ to:yPos]; 358 yPos = [self setYPositionOfView:firstVisitHeaderField_ to:yPos];
265 yPos += kHeadlineSpacing; 359 yPos += kHeadlineSpacing;
266 [self sizeTextFieldHeightToFit:firstVisitDescriptionField_]; 360 [self sizeTextFieldHeightToFit:firstVisitDescriptionField_];
267 [self setYPositionOfView:firstVisitDescriptionField_ to:yPos]; 361 [self setYPositionOfView:firstVisitDescriptionField_ to:yPos];
268 362
269 // Adjust the tab view size and place it below the identity status. 363 // Adjust the tab view size and place it below the identity status.
364
365 NSRect segmentedControlFrame = [segmentedControl_ frame];
366 segmentedControlFrame.origin.y =
367 NSMaxY([identityStatusField_ frame]);
368 [segmentedControl_ setFrame:segmentedControlFrame];
369
270 NSRect tabViewFrame = [tabView_ frame]; 370 NSRect tabViewFrame = [tabView_ frame];
271 tabViewFrame.origin.y = 371 tabViewFrame.origin.y = NSMaxY(segmentedControlFrame);
272 NSMaxY([identityStatusField_ frame]) + kVerticalSpacing;
273 372
274 CGFloat connectionTabHeight = std::max( 373 CGFloat connectionTabHeight = std::max(
275 NSMaxY([firstVisitDescriptionField_ frame]), 374 NSMaxY([firstVisitDescriptionField_ frame]),
276 NSMaxY([firstVisitIcon_ frame ])); 375 NSMaxY([firstVisitIcon_ frame ]));
277 connectionTabHeight += kVerticalSpacing; 376 connectionTabHeight += kVerticalSpacing;
278 377
279 CGFloat tabContentHeight = std::max(connectionTabHeight, 378 CGFloat tabContentHeight = std::max(connectionTabHeight,
280 permissionsTabHeight_); 379 permissionsTabHeight_);
281 tabViewFrame.size.height = tabContentHeight + 380 tabViewFrame.size.height = tabContentHeight +
282 NSHeight(tabViewFrame) - NSHeight([tabView_ contentRect]); 381 NSHeight(tabViewFrame) - NSHeight([tabView_ contentRect]);
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
462 561
463 [button setAction:@selector(permissionValueChanged:)]; 562 [button setAction:@selector(permissionValueChanged:)];
464 [button setTarget:self]; 563 [button setTarget:self];
465 564
466 [self setTitleOfButton:button]; 565 [self setTitleOfButton:button];
467 566
468 [view addSubview:button.get()]; 567 [view addSubview:button.get()];
469 return button.get(); 568 return button.get();
470 } 569 }
471 570
571 - (void)tabSelected:(id)sender {
572 [tabView_ selectTabViewItemAtIndex: [segmentedControl_ selectedSegment]];
Robert Sesek 2012/07/26 02:49:28 nit: no space after :
Patrick Dubroy 2012/07/28 02:15:02 Done.
573 }
574
472 // Handler for the permission-changing menus. 575 // Handler for the permission-changing menus.
473 - (void)permissionValueChanged:(id)sender { 576 - (void)permissionValueChanged:(id)sender {
474 DCHECK([sender isKindOfClass:[NSPopUpButton class]]); 577 DCHECK([sender isKindOfClass:[NSPopUpButton class]]);
475 NSPopUpButton* button = static_cast<NSPopUpButton*>(sender); 578 NSPopUpButton* button = static_cast<NSPopUpButton*>(sender);
476 ContentSettingsType type = static_cast<ContentSettingsType>([button tag]); 579 ContentSettingsType type = static_cast<ContentSettingsType>([button tag]);
477 ContentSetting newSetting = [self contentSettingForButton:button]; 580 ContentSetting newSetting = [self contentSettingForButton:button];
478 581
479 [self setTitleOfButton:button]; 582 [self setTitleOfButton:button];
480 if (presenter_.get()) 583 if (presenter_.get())
481 presenter_->OnSitePermissionChanged(type, newSetting); 584 presenter_->OnSitePermissionChanged(type, newSetting);
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
610 } 713 }
611 714
612 void WebsiteSettingsUIBridge::SetIdentityInfo( 715 void WebsiteSettingsUIBridge::SetIdentityInfo(
613 const WebsiteSettingsUI::IdentityInfo& identity_info) { 716 const WebsiteSettingsUI::IdentityInfo& identity_info) {
614 [bubble_controller_ setIdentityInfo:identity_info]; 717 [bubble_controller_ setIdentityInfo:identity_info];
615 } 718 }
616 719
617 void WebsiteSettingsUIBridge::SetFirstVisit(const string16& first_visit) { 720 void WebsiteSettingsUIBridge::SetFirstVisit(const string16& first_visit) {
618 [bubble_controller_ setFirstVisit:first_visit]; 721 [bubble_controller_ setFirstVisit:first_visit];
619 } 722 }
OLDNEW
« no previous file with comments | « chrome/browser/ui/cocoa/website_settings_bubble_controller.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698