OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2010 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/views/infobars/after_translate_infobar.h" |
| 6 |
| 7 #include "app/l10n_util.h" |
| 8 #include "app/resource_bundle.h" |
| 9 #include "base/utf_string_conversions.h" |
| 10 #include "chrome/browser/translate/options_menu_model.h" |
| 11 #include "chrome/browser/translate/translate_infobar_delegate2.h" |
| 12 #include "chrome/browser/views/infobars/infobar_button_border.h" |
| 13 #include "chrome/browser/views/infobars/infobar_text_button.h" |
| 14 #include "grit/app_resources.h" |
| 15 #include "grit/generated_resources.h" |
| 16 #include "views/controls/button/menu_button.h" |
| 17 #include "views/controls/button/text_button.h" |
| 18 #include "views/controls/image_view.h" |
| 19 #include "views/controls/label.h" |
| 20 #include "views/controls/menu/menu_2.h" |
| 21 |
| 22 AfterTranslateInfoBar::AfterTranslateInfoBar( |
| 23 TranslateInfoBarDelegate2* delegate) |
| 24 : TranslateInfoBarBase(delegate), |
| 25 original_language_menu_model_(delegate, LanguagesMenuModel2::ORIGINAL), |
| 26 target_language_menu_model_(delegate, LanguagesMenuModel2::TARGET), |
| 27 options_menu_model_(delegate), |
| 28 swapped_language_buttons_(false) { |
| 29 std::vector<string16> strings; |
| 30 TranslateInfoBarDelegate2::GetAfterTranslateStrings( |
| 31 &strings, &swapped_language_buttons_); |
| 32 DCHECK(strings.size() == 3U); |
| 33 |
| 34 label_1_ = CreateLabel(strings[0]); |
| 35 AddChildView(label_1_); |
| 36 |
| 37 label_2_ = CreateLabel(strings[1]); |
| 38 AddChildView(label_2_); |
| 39 |
| 40 label_3_ = CreateLabel(strings[2]); |
| 41 AddChildView(label_3_); |
| 42 |
| 43 original_language_menu_button_ = CreateMenuButton(string16(), true, this); |
| 44 AddChildView(original_language_menu_button_); |
| 45 |
| 46 target_language_menu_button_ = CreateMenuButton(string16(), true, this); |
| 47 AddChildView(target_language_menu_button_); |
| 48 |
| 49 options_menu_button_ = |
| 50 CreateMenuButton(l10n_util::GetStringUTF16(IDS_TRANSLATE_INFOBAR_OPTIONS), |
| 51 false, this); |
| 52 AddChildView(options_menu_button_); |
| 53 |
| 54 revert_button_ = InfoBarTextButton::Create(this, |
| 55 l10n_util::GetStringUTF16(IDS_TRANSLATE_INFOBAR_REVERT)); |
| 56 AddChildView(revert_button_); |
| 57 |
| 58 UpdateLanguageButtonText(LanguagesMenuModel2::ORIGINAL); |
| 59 UpdateLanguageButtonText(LanguagesMenuModel2::TARGET); |
| 60 } |
| 61 |
| 62 AfterTranslateInfoBar::~AfterTranslateInfoBar() { |
| 63 } |
| 64 |
| 65 // Overridden from views::View: |
| 66 void AfterTranslateInfoBar::Layout() { |
| 67 // Layout the icon and close button. |
| 68 TranslateInfoBarBase::Layout(); |
| 69 |
| 70 // Layout the options menu button on right of bar. |
| 71 int available_width = InfoBar::GetAvailableWidth(); |
| 72 gfx::Size pref_size = options_menu_button_->GetPreferredSize(); |
| 73 options_menu_button_->SetBounds(available_width - pref_size.width(), |
| 74 OffsetY(this, pref_size), pref_size.width(), pref_size.height()); |
| 75 |
| 76 views::MenuButton* left_button = swapped_language_buttons_ ? |
| 77 target_language_menu_button_ : original_language_menu_button_; |
| 78 views::MenuButton* right_button = swapped_language_buttons_ ? |
| 79 original_language_menu_button_ : target_language_menu_button_; |
| 80 |
| 81 pref_size = label_1_->GetPreferredSize(); |
| 82 label_1_->SetBounds(icon_->bounds().right() + InfoBar::kIconLabelSpacing, |
| 83 InfoBar::OffsetY(this, pref_size), pref_size.width(), pref_size.height()); |
| 84 |
| 85 pref_size = left_button->GetPreferredSize(); |
| 86 left_button->SetBounds(label_1_->bounds().right() + |
| 87 InfoBar::kButtonInLabelSpacing, OffsetY(this, pref_size), |
| 88 pref_size.width(), pref_size.height()); |
| 89 |
| 90 pref_size = label_2_->GetPreferredSize(); |
| 91 label_2_->SetBounds(left_button->bounds().right() + |
| 92 InfoBar::kButtonInLabelSpacing, InfoBar::OffsetY(this, pref_size), |
| 93 pref_size.width(), pref_size.height()); |
| 94 |
| 95 pref_size = right_button->GetPreferredSize(); |
| 96 right_button->SetBounds(label_2_->bounds().right() + |
| 97 InfoBar::kButtonInLabelSpacing, OffsetY(this, pref_size), |
| 98 pref_size.width(), pref_size.height()); |
| 99 |
| 100 pref_size = label_3_->GetPreferredSize(); |
| 101 label_3_->SetBounds(right_button->bounds().right() + |
| 102 InfoBar::kButtonInLabelSpacing, InfoBar::OffsetY(this, pref_size), |
| 103 pref_size.width(), pref_size.height()); |
| 104 |
| 105 pref_size = revert_button_->GetPreferredSize(); |
| 106 revert_button_->SetBounds(label_3_->bounds().right() + |
| 107 InfoBar::kButtonInLabelSpacing, InfoBar::OffsetY(this, pref_size), |
| 108 pref_size.width(), pref_size.height()); |
| 109 } |
| 110 |
| 111 void AfterTranslateInfoBar::OriginalLanguageChanged() { |
| 112 UpdateLanguageButtonText(LanguagesMenuModel2::ORIGINAL); |
| 113 } |
| 114 |
| 115 void AfterTranslateInfoBar::TargetLanguageChanged() { |
| 116 UpdateLanguageButtonText(LanguagesMenuModel2::TARGET); |
| 117 } |
| 118 |
| 119 void AfterTranslateInfoBar::ButtonPressed(views::Button* sender, |
| 120 const views::Event& event) { |
| 121 if (sender == revert_button_) { |
| 122 GetDelegate()->RevertTranslation(); |
| 123 return; |
| 124 } |
| 125 TranslateInfoBarBase::ButtonPressed(sender, event); |
| 126 } |
| 127 |
| 128 void AfterTranslateInfoBar::RunMenu(views::View* source, |
| 129 const gfx::Point& pt) { |
| 130 if (source == original_language_menu_button_) { |
| 131 if (!original_language_menu_.get()) { |
| 132 original_language_menu_.reset( |
| 133 new views::Menu2(&original_language_menu_model_)); |
| 134 } |
| 135 original_language_menu_->RunMenuAt(pt, views::Menu2::ALIGN_TOPRIGHT); |
| 136 } else if (source == target_language_menu_button_) { |
| 137 if (!target_language_menu_.get()) { |
| 138 target_language_menu_.reset( |
| 139 new views::Menu2(&target_language_menu_model_)); |
| 140 } |
| 141 target_language_menu_->RunMenuAt(pt, views::Menu2::ALIGN_TOPRIGHT); |
| 142 } else if (source == options_menu_button_) { |
| 143 if (!options_menu_.get()) |
| 144 options_menu_.reset(new views::Menu2(&options_menu_model_)); |
| 145 options_menu_->RunMenuAt(pt, views::Menu2::ALIGN_TOPRIGHT); |
| 146 } else { |
| 147 NOTREACHED(); |
| 148 } |
| 149 } |
| 150 |
| 151 void AfterTranslateInfoBar::UpdateLanguageButtonText( |
| 152 LanguagesMenuModel2::LanguageType language_type) { |
| 153 int language_index; |
| 154 views::MenuButton* language_button; |
| 155 if (language_type == LanguagesMenuModel2::ORIGINAL) { |
| 156 language_index = GetDelegate()->original_language_index(); |
| 157 language_button = original_language_menu_button_; |
| 158 } else { |
| 159 language_index = GetDelegate()->target_language_index(); |
| 160 language_button = target_language_menu_button_; |
| 161 } |
| 162 string16 language = |
| 163 GetDelegate()->GetLanguageDisplayableNameAt(language_index); |
| 164 language_button->SetText(UTF16ToWideHack(language)); |
| 165 // The following line is necessary for the preferred size to be recomputed. |
| 166 language_button->ClearMaxTextSize(); |
| 167 // The button may have to grow to show the new text. |
| 168 Layout(); |
| 169 SchedulePaint(); |
| 170 } |
OLD | NEW |