summaryrefslogtreecommitdiffstats
path: root/chrome/browser/ui/views/infobars/after_translate_infobar.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/ui/views/infobars/after_translate_infobar.cc')
-rw-r--r--chrome/browser/ui/views/infobars/after_translate_infobar.cc169
1 files changed, 169 insertions, 0 deletions
diff --git a/chrome/browser/ui/views/infobars/after_translate_infobar.cc b/chrome/browser/ui/views/infobars/after_translate_infobar.cc
new file mode 100644
index 0000000..63b6c8a
--- /dev/null
+++ b/chrome/browser/ui/views/infobars/after_translate_infobar.cc
@@ -0,0 +1,169 @@
+// Copyright (c) 2010 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/views/infobars/after_translate_infobar.h"
+
+#include "app/l10n_util.h"
+#include "base/utf_string_conversions.h"
+#include "chrome/browser/translate/options_menu_model.h"
+#include "chrome/browser/translate/translate_infobar_delegate.h"
+#include "chrome/browser/views/infobars/infobar_button_border.h"
+#include "chrome/browser/views/infobars/infobar_text_button.h"
+#include "grit/app_resources.h"
+#include "grit/generated_resources.h"
+#include "views/controls/button/menu_button.h"
+#include "views/controls/button/text_button.h"
+#include "views/controls/image_view.h"
+#include "views/controls/label.h"
+#include "views/controls/menu/menu_2.h"
+
+AfterTranslateInfoBar::AfterTranslateInfoBar(
+ TranslateInfoBarDelegate* delegate)
+ : TranslateInfoBarBase(delegate),
+ original_language_menu_model_(delegate, LanguagesMenuModel::ORIGINAL),
+ target_language_menu_model_(delegate, LanguagesMenuModel::TARGET),
+ options_menu_model_(delegate),
+ swapped_language_buttons_(false) {
+ std::vector<string16> strings;
+ TranslateInfoBarDelegate::GetAfterTranslateStrings(
+ &strings, &swapped_language_buttons_);
+ DCHECK(strings.size() == 3U);
+
+ label_1_ = CreateLabel(strings[0]);
+ AddChildView(label_1_);
+
+ label_2_ = CreateLabel(strings[1]);
+ AddChildView(label_2_);
+
+ label_3_ = CreateLabel(strings[2]);
+ AddChildView(label_3_);
+
+ original_language_menu_button_ = CreateMenuButton(string16(), true, this);
+ AddChildView(original_language_menu_button_);
+
+ target_language_menu_button_ = CreateMenuButton(string16(), true, this);
+ AddChildView(target_language_menu_button_);
+
+ options_menu_button_ =
+ CreateMenuButton(l10n_util::GetStringUTF16(IDS_TRANSLATE_INFOBAR_OPTIONS),
+ false, this);
+ AddChildView(options_menu_button_);
+
+ revert_button_ = InfoBarTextButton::Create(this,
+ l10n_util::GetStringUTF16(IDS_TRANSLATE_INFOBAR_REVERT));
+ AddChildView(revert_button_);
+
+ UpdateLanguageButtonText(LanguagesMenuModel::ORIGINAL);
+ UpdateLanguageButtonText(LanguagesMenuModel::TARGET);
+}
+
+AfterTranslateInfoBar::~AfterTranslateInfoBar() {
+}
+
+// Overridden from views::View:
+void AfterTranslateInfoBar::Layout() {
+ // Layout the icon and close button.
+ TranslateInfoBarBase::Layout();
+
+ // Layout the options menu button on right of bar.
+ int available_width = InfoBar::GetAvailableWidth();
+ gfx::Size pref_size = options_menu_button_->GetPreferredSize();
+ options_menu_button_->SetBounds(available_width - pref_size.width(),
+ OffsetY(this, pref_size), pref_size.width(), pref_size.height());
+
+ views::MenuButton* left_button = swapped_language_buttons_ ?
+ target_language_menu_button_ : original_language_menu_button_;
+ views::MenuButton* right_button = swapped_language_buttons_ ?
+ original_language_menu_button_ : target_language_menu_button_;
+
+ pref_size = label_1_->GetPreferredSize();
+ label_1_->SetBounds(icon_->bounds().right() + InfoBar::kIconLabelSpacing,
+ InfoBar::OffsetY(this, pref_size), pref_size.width(), pref_size.height());
+
+ pref_size = left_button->GetPreferredSize();
+ left_button->SetBounds(label_1_->bounds().right() +
+ InfoBar::kButtonInLabelSpacing, OffsetY(this, pref_size),
+ pref_size.width(), pref_size.height());
+
+ pref_size = label_2_->GetPreferredSize();
+ label_2_->SetBounds(left_button->bounds().right() +
+ InfoBar::kButtonInLabelSpacing, InfoBar::OffsetY(this, pref_size),
+ pref_size.width(), pref_size.height());
+
+ pref_size = right_button->GetPreferredSize();
+ right_button->SetBounds(label_2_->bounds().right() +
+ InfoBar::kButtonInLabelSpacing, OffsetY(this, pref_size),
+ pref_size.width(), pref_size.height());
+
+ pref_size = label_3_->GetPreferredSize();
+ label_3_->SetBounds(right_button->bounds().right() +
+ InfoBar::kButtonInLabelSpacing, InfoBar::OffsetY(this, pref_size),
+ pref_size.width(), pref_size.height());
+
+ pref_size = revert_button_->GetPreferredSize();
+ revert_button_->SetBounds(label_3_->bounds().right() +
+ InfoBar::kButtonInLabelSpacing, InfoBar::OffsetY(this, pref_size),
+ pref_size.width(), pref_size.height());
+}
+
+void AfterTranslateInfoBar::OriginalLanguageChanged() {
+ UpdateLanguageButtonText(LanguagesMenuModel::ORIGINAL);
+}
+
+void AfterTranslateInfoBar::TargetLanguageChanged() {
+ UpdateLanguageButtonText(LanguagesMenuModel::TARGET);
+}
+
+void AfterTranslateInfoBar::ButtonPressed(views::Button* sender,
+ const views::Event& event) {
+ if (sender == revert_button_) {
+ GetDelegate()->RevertTranslation();
+ return;
+ }
+ TranslateInfoBarBase::ButtonPressed(sender, event);
+}
+
+void AfterTranslateInfoBar::RunMenu(views::View* source,
+ const gfx::Point& pt) {
+ if (source == original_language_menu_button_) {
+ if (!original_language_menu_.get()) {
+ original_language_menu_.reset(
+ new views::Menu2(&original_language_menu_model_));
+ }
+ original_language_menu_->RunMenuAt(pt, views::Menu2::ALIGN_TOPRIGHT);
+ } else if (source == target_language_menu_button_) {
+ if (!target_language_menu_.get()) {
+ target_language_menu_.reset(
+ new views::Menu2(&target_language_menu_model_));
+ }
+ target_language_menu_->RunMenuAt(pt, views::Menu2::ALIGN_TOPRIGHT);
+ } else if (source == options_menu_button_) {
+ if (!options_menu_.get())
+ options_menu_.reset(new views::Menu2(&options_menu_model_));
+ options_menu_->RunMenuAt(pt, views::Menu2::ALIGN_TOPRIGHT);
+ } else {
+ NOTREACHED();
+ }
+}
+
+void AfterTranslateInfoBar::UpdateLanguageButtonText(
+ LanguagesMenuModel::LanguageType language_type) {
+ int language_index;
+ views::MenuButton* language_button;
+ if (language_type == LanguagesMenuModel::ORIGINAL) {
+ language_index = GetDelegate()->original_language_index();
+ language_button = original_language_menu_button_;
+ } else {
+ language_index = GetDelegate()->target_language_index();
+ language_button = target_language_menu_button_;
+ }
+ string16 language =
+ GetDelegate()->GetLanguageDisplayableNameAt(language_index);
+ language_button->SetText(UTF16ToWideHack(language));
+ // The following line is necessary for the preferred size to be recomputed.
+ language_button->ClearMaxTextSize();
+ // The button may have to grow to show the new text.
+ Layout();
+ SchedulePaint();
+}