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