Index: chrome/browser/views/infobars/after_translate_infobar.cc |
diff --git a/chrome/browser/views/infobars/after_translate_infobar.cc b/chrome/browser/views/infobars/after_translate_infobar.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c5c5691d4e27812077a1a804c3e41b289984df17 |
--- /dev/null |
+++ b/chrome/browser/views/infobars/after_translate_infobar.cc |
@@ -0,0 +1,170 @@ |
+// 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 "app/resource_bundle.h" |
+#include "base/utf_string_conversions.h" |
+#include "chrome/browser/translate/options_menu_model.h" |
+#include "chrome/browser/translate/translate_infobar_delegate2.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( |
+ TranslateInfoBarDelegate2* delegate) |
+ : TranslateInfoBarBase(delegate), |
+ original_language_menu_model_(delegate, LanguagesMenuModel2::ORIGINAL), |
+ target_language_menu_model_(delegate, LanguagesMenuModel2::TARGET), |
+ options_menu_model_(delegate), |
+ swapped_language_buttons_(false) { |
+ std::vector<string16> strings; |
+ TranslateInfoBarDelegate2::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(LanguagesMenuModel2::ORIGINAL); |
+ UpdateLanguageButtonText(LanguagesMenuModel2::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(LanguagesMenuModel2::ORIGINAL); |
+} |
+ |
+void AfterTranslateInfoBar::TargetLanguageChanged() { |
+ UpdateLanguageButtonText(LanguagesMenuModel2::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( |
+ LanguagesMenuModel2::LanguageType language_type) { |
+ int language_index; |
+ views::MenuButton* language_button; |
+ if (language_type == LanguagesMenuModel2::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(); |
+} |