172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Use of this source code is governed by a BSD-style license that can be 372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// found in the LICENSE file. 472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/views/infobars/confirm_infobar.h" 672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 7dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/tab_contents/confirm_infobar_delegate.h" 872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/views/event_utils.h" 9dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "views/controls/button/text_button.h" 1072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "views/controls/label.h" 1172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 1272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// ConfirmInfoBarDelegate ----------------------------------------------------- 1372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 1472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenInfoBar* ConfirmInfoBarDelegate::CreateInfoBar() { 1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return new ConfirmInfoBar(this); 1672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 1872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// ConfirmInfoBar ------------------------------------------------------------- 1972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 2072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenConfirmInfoBar::ConfirmInfoBar(ConfirmInfoBarDelegate* delegate) 21dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen : InfoBarView(delegate), 22dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen label_(NULL), 2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ok_button_(NULL), 2472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen cancel_button_(NULL), 25dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen link_(NULL) { 2672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 2772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 2872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenConfirmInfoBar::~ConfirmInfoBar() { 2972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 3172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid ConfirmInfoBar::Layout() { 3272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen InfoBarView::Layout(); 3372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 34dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen int available_width = std::max(0, EndX() - StartX() - ContentMinimumWidth()); 35dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen gfx::Size label_size = label_->GetPreferredSize(); 36dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen label_->SetBounds(StartX(), OffsetY(label_size), 37dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen std::min(label_size.width(), available_width), label_size.height()); 38dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen available_width = std::max(0, available_width - label_size.width()); 39dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 40dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen int button_x = label_->bounds().right() + kEndOfLabelSpacing; 41dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (ok_button_ != NULL) { 42dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen gfx::Size ok_size = ok_button_->GetPreferredSize(); 43dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ok_button_->SetBounds(button_x, OffsetY(ok_size), ok_size.width(), 44dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ok_size.height()); 45dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen button_x += ok_size.width() + kButtonButtonSpacing; 4672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 47dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 48dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (cancel_button_ != NULL) { 49dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen gfx::Size cancel_size = cancel_button_->GetPreferredSize(); 50dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen cancel_button_->SetBounds(button_x, OffsetY(cancel_size), 51dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen cancel_size.width(), cancel_size.height()); 5272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 5372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 54dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (link_ != NULL) { 55dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen gfx::Size link_size = link_->GetPreferredSize(); 56dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen int link_width = std::min(link_size.width(), available_width); 57dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen link_->SetBounds(EndX() - link_width, OffsetY(link_size), link_width, 58dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen link_size.height()); 59dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 6072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 6172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 6272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid ConfirmInfoBar::ViewHierarchyChanged(bool is_add, 6372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen View* parent, 6472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen View* child) { 65dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (is_add && child == this && (label_ == NULL)) { 66dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ConfirmInfoBarDelegate* delegate = GetDelegate(); 67dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen label_ = CreateLabel(delegate->GetMessageText()); 68dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen AddChildView(label_); 69dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 70dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (delegate->GetButtons() & ConfirmInfoBarDelegate::BUTTON_OK) { 71dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ok_button_ = CreateTextButton(this, 72dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen delegate->GetButtonLabel(ConfirmInfoBarDelegate::BUTTON_OK), 73dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen delegate->NeedElevation(ConfirmInfoBarDelegate::BUTTON_OK)); 74dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen AddChildView(ok_button_); 75dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 76dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 77dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (delegate->GetButtons() & ConfirmInfoBarDelegate::BUTTON_CANCEL) { 78dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen cancel_button_ = CreateTextButton(this, 79dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen delegate->GetButtonLabel(ConfirmInfoBarDelegate::BUTTON_CANCEL), 80dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen delegate->NeedElevation(ConfirmInfoBarDelegate::BUTTON_CANCEL)); 81dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen AddChildView(cancel_button_); 82dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 83dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 84dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen string16 link_text(delegate->GetLinkText()); 85dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (!link_text.empty()) { 86dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen link_ = CreateLink(link_text, this, background()->get_color()); 87dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen AddChildView(link_); 88dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 8972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 9072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 9172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // This must happen after adding all other children so InfoBarView can ensure 9272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // the close button is the last child. 9372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen InfoBarView::ViewHierarchyChanged(is_add, parent, child); 9472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 9572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 9672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid ConfirmInfoBar::ButtonPressed(views::Button* sender, 9772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const views::Event& event) { 9872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ConfirmInfoBarDelegate* delegate = GetDelegate(); 99dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if ((ok_button_ != NULL) && sender == ok_button_) { 10072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (delegate->Accept()) 10172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen RemoveInfoBar(); 102dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } else if ((cancel_button_ != NULL) && (sender == cancel_button_)) { 10372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (delegate->Cancel()) 10472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen RemoveInfoBar(); 10572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } else { 10672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen InfoBarView::ButtonPressed(sender, event); 10772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 10872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 10972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 110dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenint ConfirmInfoBar::ContentMinimumWidth() const { 111dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen int width = (link_ == NULL) ? 0 : kEndOfLabelSpacing; // Space before link 112dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen int before_cancel_spacing = kEndOfLabelSpacing; 113dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (ok_button_ != NULL) { 114dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen width += kEndOfLabelSpacing + ok_button_->GetPreferredSize().width(); 115dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen before_cancel_spacing = kButtonButtonSpacing; 116dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 117dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return width + ((cancel_button_ == NULL) ? 0 : 118dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen (before_cancel_spacing + cancel_button_->GetPreferredSize().width())); 119dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 120dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 12172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid ConfirmInfoBar::LinkActivated(views::Link* source, int event_flags) { 122dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DCHECK(link_ != NULL); 12372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen DCHECK_EQ(link_, source); 12472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (GetDelegate()->LinkClicked( 12572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen event_utils::DispositionFromEventFlags(event_flags))) 12672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen RemoveInfoBar(); 12772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 12872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 12972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenConfirmInfoBarDelegate* ConfirmInfoBar::GetDelegate() { 13072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return delegate()->AsConfirmInfoBarDelegate(); 13172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 132