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

Side by Side Diff: chrome/browser/ui/cocoa/infobars/confirm_infobar_controller.mm

Issue 11773025: cocoa/infobars: Split infobar_controller.* into smaller parts. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: add files to chrome_nibs.gyp Created 7 years, 11 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
OLDNEW
(Empty)
1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/ui/cocoa/infobars/confirm_infobar_controller.h"
6
7 #include "base/logging.h"
8 #include "base/sys_string_conversions.h"
9 #include "chrome/browser/api/infobars/confirm_infobar_delegate.h"
10 #import "chrome/browser/ui/cocoa/hyperlink_text_view.h"
11 #include "chrome/browser/ui/cocoa/event_utils.h"
12 #include "chrome/browser/ui/cocoa/infobars/infobar.h"
13 #include "third_party/GTM/AppKit/GTMUILocalizerAndLayoutTweaker.h"
14 #include "webkit/glue/window_open_disposition.h"
15
16 @implementation ConfirmInfoBarController
17
18 // Called when someone clicks on the "OK" button.
19 - (IBAction)ok:(id)sender {
20 if (![self isOwned])
21 return;
22 if (delegate_->AsConfirmInfoBarDelegate()->Accept())
23 [self removeSelf];
24 }
25
26 // Called when someone clicks on the "Cancel" button.
27 - (IBAction)cancel:(id)sender {
28 if (![self isOwned])
29 return;
30 if (delegate_->AsConfirmInfoBarDelegate()->Cancel())
31 [self removeSelf];
32 }
33
34 // Confirm infobars can have OK and/or cancel buttons, depending on
35 // the return value of GetButtons(). We create each button if
36 // required and position them to the left of the close button.
37 - (void)addAdditionalControls {
38 ConfirmInfoBarDelegate* delegate = delegate_->AsConfirmInfoBarDelegate();
39 DCHECK(delegate);
40 int visibleButtons = delegate->GetButtons();
41
42 NSRect okButtonFrame = [okButton_ frame];
43 NSRect cancelButtonFrame = [cancelButton_ frame];
44
45 DCHECK(NSMaxX(cancelButtonFrame) < NSMinX(okButtonFrame))
46 << "Ok button expected to be on the right of the Cancel button in nib";
47
48 CGFloat rightEdge = NSMaxX(okButtonFrame);
49 CGFloat spaceBetweenButtons =
50 NSMinX(okButtonFrame) - NSMaxX(cancelButtonFrame);
51 CGFloat spaceBeforeButtons =
52 NSMinX(cancelButtonFrame) - NSMaxX([label_.get() frame]);
53
54 // Update and position the OK button if needed. Otherwise, hide it.
55 if (visibleButtons & ConfirmInfoBarDelegate::BUTTON_OK) {
56 [okButton_ setTitle:base::SysUTF16ToNSString(
57 delegate->GetButtonLabel(ConfirmInfoBarDelegate::BUTTON_OK))];
58 [GTMUILocalizerAndLayoutTweaker sizeToFitView:okButton_];
59 okButtonFrame = [okButton_ frame];
60
61 // Position the ok button to the left of the Close button.
62 okButtonFrame.origin.x = rightEdge - okButtonFrame.size.width;
63 [okButton_ setFrame:okButtonFrame];
64
65 // Update the rightEdge
66 rightEdge = NSMinX(okButtonFrame);
67 } else {
68 [okButton_ removeFromSuperview];
69 okButton_ = nil;
70 }
71
72 // Update and position the Cancel button if needed. Otherwise, hide it.
73 if (visibleButtons & ConfirmInfoBarDelegate::BUTTON_CANCEL) {
74 [cancelButton_ setTitle:base::SysUTF16ToNSString(
75 delegate->GetButtonLabel(ConfirmInfoBarDelegate::BUTTON_CANCEL))];
76 [GTMUILocalizerAndLayoutTweaker sizeToFitView:cancelButton_];
77 cancelButtonFrame = [cancelButton_ frame];
78
79 // If we had a Ok button, leave space between the buttons.
80 if (visibleButtons & ConfirmInfoBarDelegate::BUTTON_OK) {
81 rightEdge -= spaceBetweenButtons;
82 }
83
84 // Position the Cancel button on our current right edge.
85 cancelButtonFrame.origin.x = rightEdge - cancelButtonFrame.size.width;
86 [cancelButton_ setFrame:cancelButtonFrame];
87
88 // Update the rightEdge.
89 rightEdge = NSMinX(cancelButtonFrame);
90 } else {
91 [cancelButton_ removeFromSuperview];
92 cancelButton_ = nil;
93 }
94
95 // If we had either button, leave space before the edge of the textfield.
96 if ((visibleButtons & ConfirmInfoBarDelegate::BUTTON_CANCEL) ||
97 (visibleButtons & ConfirmInfoBarDelegate::BUTTON_OK)) {
98 rightEdge -= spaceBeforeButtons;
99 }
100
101 NSRect frame = [label_.get() frame];
102 DCHECK(rightEdge > NSMinX(frame))
103 << "Need to make the xib larger to handle buttons with text this long";
104 frame.size.width = rightEdge - NSMinX(frame);
105 [label_.get() setFrame:frame];
106
107 // Set the text and link.
108 NSString* message = base::SysUTF16ToNSString(delegate->GetMessageText());
109 string16 link = delegate->GetLinkText();
110 if (!link.empty()) {
111 // Add spacing between the label and the link.
112 message = [message stringByAppendingString:@" "];
113 }
114 NSFont* font = [NSFont labelFontOfSize:
115 [NSFont systemFontSizeForControlSize:NSRegularControlSize]];
116 HyperlinkTextView* view = (HyperlinkTextView*)label_.get();
117 [view setMessageAndLink:message
118 withLink:base::SysUTF16ToNSString(link)
119 atOffset:[message length]
120 font:font
121 messageColor:[NSColor blackColor]
122 linkColor:[NSColor blueColor]];
123 }
124
125 // Called when someone clicks on the link in the infobar. This method
126 // is called by the InfobarTextField on its delegate (the
127 // AlternateNavInfoBarController).
128 - (void)linkClicked {
129 if (![self isOwned])
130 return;
131 WindowOpenDisposition disposition =
132 event_utils::WindowOpenDispositionFromNSEvent([NSApp currentEvent]);
133 if (delegate_->AsConfirmInfoBarDelegate()->LinkClicked(disposition))
134 [self removeSelf];
135 }
136
137 @end
138
139 InfoBar* ConfirmInfoBarDelegate::CreateInfoBar(InfoBarService* owner) {
140 ConfirmInfoBarController* controller =
141 [[ConfirmInfoBarController alloc] initWithDelegate:this owner:owner];
142 return new InfoBar(controller, this);
143 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698