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

Unified 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/cocoa/infobars/confirm_infobar_controller.mm
diff --git a/chrome/browser/ui/cocoa/infobars/confirm_infobar_controller.mm b/chrome/browser/ui/cocoa/infobars/confirm_infobar_controller.mm
new file mode 100644
index 0000000000000000000000000000000000000000..3047f74f3549c6d60e1d902560dcf1874c1dfebc
--- /dev/null
+++ b/chrome/browser/ui/cocoa/infobars/confirm_infobar_controller.mm
@@ -0,0 +1,143 @@
+// Copyright 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/cocoa/infobars/confirm_infobar_controller.h"
+
+#include "base/logging.h"
+#include "base/sys_string_conversions.h"
+#include "chrome/browser/api/infobars/confirm_infobar_delegate.h"
+#import "chrome/browser/ui/cocoa/hyperlink_text_view.h"
+#include "chrome/browser/ui/cocoa/event_utils.h"
+#include "chrome/browser/ui/cocoa/infobars/infobar.h"
+#include "third_party/GTM/AppKit/GTMUILocalizerAndLayoutTweaker.h"
+#include "webkit/glue/window_open_disposition.h"
+
+@implementation ConfirmInfoBarController
+
+// Called when someone clicks on the "OK" button.
+- (IBAction)ok:(id)sender {
+ if (![self isOwned])
+ return;
+ if (delegate_->AsConfirmInfoBarDelegate()->Accept())
+ [self removeSelf];
+}
+
+// Called when someone clicks on the "Cancel" button.
+- (IBAction)cancel:(id)sender {
+ if (![self isOwned])
+ return;
+ if (delegate_->AsConfirmInfoBarDelegate()->Cancel())
+ [self removeSelf];
+}
+
+// Confirm infobars can have OK and/or cancel buttons, depending on
+// the return value of GetButtons(). We create each button if
+// required and position them to the left of the close button.
+- (void)addAdditionalControls {
+ ConfirmInfoBarDelegate* delegate = delegate_->AsConfirmInfoBarDelegate();
+ DCHECK(delegate);
+ int visibleButtons = delegate->GetButtons();
+
+ NSRect okButtonFrame = [okButton_ frame];
+ NSRect cancelButtonFrame = [cancelButton_ frame];
+
+ DCHECK(NSMaxX(cancelButtonFrame) < NSMinX(okButtonFrame))
+ << "Ok button expected to be on the right of the Cancel button in nib";
+
+ CGFloat rightEdge = NSMaxX(okButtonFrame);
+ CGFloat spaceBetweenButtons =
+ NSMinX(okButtonFrame) - NSMaxX(cancelButtonFrame);
+ CGFloat spaceBeforeButtons =
+ NSMinX(cancelButtonFrame) - NSMaxX([label_.get() frame]);
+
+ // Update and position the OK button if needed. Otherwise, hide it.
+ if (visibleButtons & ConfirmInfoBarDelegate::BUTTON_OK) {
+ [okButton_ setTitle:base::SysUTF16ToNSString(
+ delegate->GetButtonLabel(ConfirmInfoBarDelegate::BUTTON_OK))];
+ [GTMUILocalizerAndLayoutTweaker sizeToFitView:okButton_];
+ okButtonFrame = [okButton_ frame];
+
+ // Position the ok button to the left of the Close button.
+ okButtonFrame.origin.x = rightEdge - okButtonFrame.size.width;
+ [okButton_ setFrame:okButtonFrame];
+
+ // Update the rightEdge
+ rightEdge = NSMinX(okButtonFrame);
+ } else {
+ [okButton_ removeFromSuperview];
+ okButton_ = nil;
+ }
+
+ // Update and position the Cancel button if needed. Otherwise, hide it.
+ if (visibleButtons & ConfirmInfoBarDelegate::BUTTON_CANCEL) {
+ [cancelButton_ setTitle:base::SysUTF16ToNSString(
+ delegate->GetButtonLabel(ConfirmInfoBarDelegate::BUTTON_CANCEL))];
+ [GTMUILocalizerAndLayoutTweaker sizeToFitView:cancelButton_];
+ cancelButtonFrame = [cancelButton_ frame];
+
+ // If we had a Ok button, leave space between the buttons.
+ if (visibleButtons & ConfirmInfoBarDelegate::BUTTON_OK) {
+ rightEdge -= spaceBetweenButtons;
+ }
+
+ // Position the Cancel button on our current right edge.
+ cancelButtonFrame.origin.x = rightEdge - cancelButtonFrame.size.width;
+ [cancelButton_ setFrame:cancelButtonFrame];
+
+ // Update the rightEdge.
+ rightEdge = NSMinX(cancelButtonFrame);
+ } else {
+ [cancelButton_ removeFromSuperview];
+ cancelButton_ = nil;
+ }
+
+ // If we had either button, leave space before the edge of the textfield.
+ if ((visibleButtons & ConfirmInfoBarDelegate::BUTTON_CANCEL) ||
+ (visibleButtons & ConfirmInfoBarDelegate::BUTTON_OK)) {
+ rightEdge -= spaceBeforeButtons;
+ }
+
+ NSRect frame = [label_.get() frame];
+ DCHECK(rightEdge > NSMinX(frame))
+ << "Need to make the xib larger to handle buttons with text this long";
+ frame.size.width = rightEdge - NSMinX(frame);
+ [label_.get() setFrame:frame];
+
+ // Set the text and link.
+ NSString* message = base::SysUTF16ToNSString(delegate->GetMessageText());
+ string16 link = delegate->GetLinkText();
+ if (!link.empty()) {
+ // Add spacing between the label and the link.
+ message = [message stringByAppendingString:@" "];
+ }
+ NSFont* font = [NSFont labelFontOfSize:
+ [NSFont systemFontSizeForControlSize:NSRegularControlSize]];
+ HyperlinkTextView* view = (HyperlinkTextView*)label_.get();
+ [view setMessageAndLink:message
+ withLink:base::SysUTF16ToNSString(link)
+ atOffset:[message length]
+ font:font
+ messageColor:[NSColor blackColor]
+ linkColor:[NSColor blueColor]];
+}
+
+// Called when someone clicks on the link in the infobar. This method
+// is called by the InfobarTextField on its delegate (the
+// AlternateNavInfoBarController).
+- (void)linkClicked {
+ if (![self isOwned])
+ return;
+ WindowOpenDisposition disposition =
+ event_utils::WindowOpenDispositionFromNSEvent([NSApp currentEvent]);
+ if (delegate_->AsConfirmInfoBarDelegate()->LinkClicked(disposition))
+ [self removeSelf];
+}
+
+@end
+
+InfoBar* ConfirmInfoBarDelegate::CreateInfoBar(InfoBarService* owner) {
+ ConfirmInfoBarController* controller =
+ [[ConfirmInfoBarController alloc] initWithDelegate:this owner:owner];
+ return new InfoBar(controller, this);
+}

Powered by Google App Engine
This is Rietveld 408576698