1 // Copyright (c) 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.
5 #include "chrome/browser/ui/views/infobars/before_translate_infobar.h"
7 #include "base/strings/utf_string_conversions.h"
8 #include "chrome/browser/translate/translate_infobar_delegate.h"
9 #include "grit/generated_resources.h"
10 #include "ui/base/l10n/l10n_util.h"
11 #include "ui/views/controls/button/label_button.h"
12 #include "ui/views/controls/button/menu_button.h"
13 #include "ui/views/controls/label.h"
14 #include "ui/views/controls/menu/menu_item_view.h"
16 BeforeTranslateInfoBar::BeforeTranslateInfoBar(
17 InfoBarService* owner,
18 TranslateInfoBarDelegate* delegate)
19 : TranslateInfoBarBase(owner, delegate),
22 language_menu_button_(NULL),
25 never_translate_button_(NULL),
26 always_translate_button_(NULL),
27 options_menu_button_(NULL),
28 options_menu_model_(delegate) {
31 BeforeTranslateInfoBar::~BeforeTranslateInfoBar() {
34 void BeforeTranslateInfoBar::Layout() {
35 TranslateInfoBarBase::Layout();
37 int available_width = std::max(0, EndX() - StartX() - ContentMinimumWidth());
38 gfx::Size label_1_size = label_1_->GetPreferredSize();
39 label_1_->SetBounds(StartX(), OffsetY(label_1_size),
40 std::min(label_1_size.width(), available_width), label_1_size.height());
41 available_width = std::max(0, available_width - label_1_size.width());
43 gfx::Size language_button_size = language_menu_button_->GetPreferredSize();
44 language_menu_button_->SetBounds(
45 label_1_->bounds().right() + kButtonInLabelSpacing,
46 OffsetY(language_button_size), language_button_size.width(),
47 language_button_size.height());
49 gfx::Size label_2_size = label_2_->GetPreferredSize();
51 language_menu_button_->bounds().right() + kButtonInLabelSpacing,
52 OffsetY(label_2_size), std::min(label_2_size.width(), available_width),
53 label_2_size.height());
55 gfx::Size accept_button_size = accept_button_->GetPreferredSize();
56 accept_button_->SetBounds(label_2_->bounds().right() + kEndOfLabelSpacing,
57 OffsetY(accept_button_size), accept_button_size.width(),
58 accept_button_size.height());
60 gfx::Size deny_button_size = deny_button_->GetPreferredSize();
61 deny_button_->SetBounds(
62 accept_button_->bounds().right() + kButtonButtonSpacing,
63 OffsetY(deny_button_size), deny_button_size.width(),
64 deny_button_size.height());
66 if (never_translate_button_) {
67 gfx::Size never_button_size = never_translate_button_->GetPreferredSize();
68 never_translate_button_->SetBounds(
69 deny_button_->bounds().right() + kButtonButtonSpacing,
70 OffsetY(never_button_size), never_button_size.width(),
71 never_button_size.height());
74 if (always_translate_button_) {
75 gfx::Size always_button_size = always_translate_button_->GetPreferredSize();
76 always_translate_button_->SetBounds(
77 deny_button_->bounds().right() + kButtonButtonSpacing,
78 OffsetY(always_button_size), always_button_size.width(),
79 always_button_size.height());
82 gfx::Size options_size = options_menu_button_->GetPreferredSize();
83 options_menu_button_->SetBounds(EndX() - options_size.width(),
84 OffsetY(options_size), options_size.width(), options_size.height());
87 void BeforeTranslateInfoBar::ViewHierarchyChanged(
88 const ViewHierarchyChangedDetails& details) {
89 if (!details.is_add || (details.child != this) || (label_1_ != NULL)) {
90 TranslateInfoBarBase::ViewHierarchyChanged(details);
95 string16 text(l10n_util::GetStringFUTF16(IDS_TRANSLATE_INFOBAR_BEFORE_MESSAGE,
96 string16(), &offset));
98 label_1_ = CreateLabel(text.substr(0, offset));
99 AddChildView(label_1_);
101 language_menu_button_ = CreateMenuButton(string16(), this);
102 TranslateInfoBarDelegate* delegate = GetDelegate();
103 language_menu_model_.reset(new TranslateLanguageMenuModel(
104 TranslateLanguageMenuModel::ORIGINAL, delegate, this,
105 language_menu_button_, false));
106 AddChildView(language_menu_button_);
108 label_2_ = CreateLabel(text.substr(offset));
109 AddChildView(label_2_);
111 accept_button_ = CreateLabelButton(this,
112 l10n_util::GetStringUTF16(IDS_TRANSLATE_INFOBAR_ACCEPT), false);
113 AddChildView(accept_button_);
115 deny_button_ = CreateLabelButton(this,
116 l10n_util::GetStringUTF16(IDS_TRANSLATE_INFOBAR_DENY), false);
117 AddChildView(deny_button_);
119 const string16& language(
120 delegate->language_name_at(delegate->original_language_index()));
121 if (delegate->ShouldShowNeverTranslateShortcut()) {
122 DCHECK(!delegate->ShouldShowAlwaysTranslateShortcut());
123 never_translate_button_ = CreateLabelButton(this,
124 l10n_util::GetStringFUTF16(IDS_TRANSLATE_INFOBAR_NEVER_TRANSLATE,
126 AddChildView(never_translate_button_);
127 } else if (delegate->ShouldShowAlwaysTranslateShortcut()) {
128 always_translate_button_ = CreateLabelButton(this,
129 l10n_util::GetStringFUTF16(IDS_TRANSLATE_INFOBAR_ALWAYS_TRANSLATE,
131 AddChildView(always_translate_button_);
134 options_menu_button_ = CreateMenuButton(
135 l10n_util::GetStringUTF16(IDS_TRANSLATE_INFOBAR_OPTIONS), this);
136 AddChildView(options_menu_button_);
138 // This must happen after adding all other children so InfoBarView can ensure
139 // the close button is the last child.
140 TranslateInfoBarBase::ViewHierarchyChanged(details);
142 // This must happen after adding all children because it triggers layout,
143 // which assumes that particular children (e.g. the close button) have already
145 UpdateLanguageButtonText(language_menu_button_,
146 delegate->language_name_at(delegate->original_language_index()));
149 int BeforeTranslateInfoBar::ContentMinimumWidth() const {
151 (kButtonInLabelSpacing +
152 language_menu_button_->GetPreferredSize().width() +
153 kButtonInLabelSpacing) +
154 (kEndOfLabelSpacing + accept_button_->GetPreferredSize().width()) +
155 (kButtonButtonSpacing + deny_button_->GetPreferredSize().width()) +
156 ((never_translate_button_ == NULL) ? 0 :
157 (kButtonButtonSpacing +
158 never_translate_button_->GetPreferredSize().width())) +
159 ((always_translate_button_ == NULL) ? 0 :
160 (kButtonButtonSpacing +
161 always_translate_button_->GetPreferredSize().width())) +
162 (kEndOfLabelSpacing + options_menu_button_->GetPreferredSize().width());
165 void BeforeTranslateInfoBar::ButtonPressed(views::Button* sender,
166 const ui::Event& event) {
168 return; // We're closing; don't call anything, it might access the owner.
169 TranslateInfoBarDelegate* delegate = GetDelegate();
170 if (sender == accept_button_) {
171 delegate->Translate();
172 } else if (sender == deny_button_) {
173 delegate->TranslationDeclined();
175 } else if (sender == never_translate_button_) {
176 delegate->NeverTranslatePageLanguage();
177 } else if (sender == always_translate_button_) {
178 delegate->AlwaysTranslatePageLanguage();
180 TranslateInfoBarBase::ButtonPressed(sender, event);
184 void BeforeTranslateInfoBar::OnMenuButtonClicked(views::View* source,
185 const gfx::Point& point) {
187 return; // We're closing; don't call anything, it might access the owner.
188 if (source == language_menu_button_) {
189 RunMenuAt(language_menu_model_.get(), language_menu_button_,
190 views::MenuItemView::TOPLEFT);
192 DCHECK_EQ(options_menu_button_, source);
193 RunMenuAt(&options_menu_model_, options_menu_button_,
194 views::MenuItemView::TOPRIGHT);