1// Copyright (c) 2011 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/views/infobars/translate_message_infobar.h"
6
7#include "chrome/browser/translate/translate_infobar_delegate.h"
8#include "ui/views/controls/button/label_button.h"
9#include "ui/views/controls/label.h"
10
11TranslateMessageInfoBar::TranslateMessageInfoBar(
12    InfoBarService* owner,
13    TranslateInfoBarDelegate* delegate)
14    : TranslateInfoBarBase(owner, delegate),
15      label_(NULL),
16      button_(NULL) {
17}
18
19TranslateMessageInfoBar::~TranslateMessageInfoBar() {
20}
21
22void TranslateMessageInfoBar::Layout() {
23  TranslateInfoBarBase::Layout();
24
25  gfx::Size label_size = label_->GetPreferredSize();
26  label_->SetBounds(StartX(), OffsetY(label_size),
27      std::min(label_size.width(),
28               std::max(0, EndX() - StartX() - ContentMinimumWidth())),
29      label_size.height());
30
31  if (button_) {
32    gfx::Size button_size = button_->GetPreferredSize();
33    button_->SetBounds(label_->bounds().right() + kButtonInLabelSpacing,
34        OffsetY(button_size), button_size.width(), button_size.height());
35  }
36}
37
38void TranslateMessageInfoBar::ViewHierarchyChanged(
39    const ViewHierarchyChangedDetails& details) {
40  if (details.is_add && (details.child == this) && (label_ == NULL)) {
41    TranslateInfoBarDelegate* delegate = GetDelegate();
42    label_ = CreateLabel(delegate->GetMessageInfoBarText());
43    AddChildView(label_);
44
45    string16 button_text(delegate->GetMessageInfoBarButtonText());
46    if (!button_text.empty()) {
47      button_ = CreateLabelButton(this, button_text, false);
48      AddChildView(button_);
49    }
50  }
51
52  // This must happen after adding all other children so InfoBarView can ensure
53  // the close button is the last child.
54  TranslateInfoBarBase::ViewHierarchyChanged(details);
55}
56
57void TranslateMessageInfoBar::ButtonPressed(views::Button* sender,
58                                            const ui::Event& event) {
59  if (!owner())
60    return;  // We're closing; don't call anything, it might access the owner.
61  if (sender == button_)
62    GetDelegate()->MessageInfoBarButtonPressed();
63  else
64    TranslateInfoBarBase::ButtonPressed(sender, event);
65}
66
67int TranslateMessageInfoBar::ContentMinimumWidth() const {
68  return (button_ != NULL) ?
69      (button_->GetPreferredSize().width() + kButtonInLabelSpacing) : 0;
70}
71