Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(51)

Side by Side Diff: chrome/browser/views/infobars/translate_infobars.cc

Issue 2602003: Refactored the translate infobars. (Closed) Base URL: http://src.chromium.org/git/chromium.git
Patch Set: Synced Created 10 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/views/infobars/translate_infobars.h" 5 #include "chrome/browser/views/infobars/translate_infobars.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <vector> 8 #include <vector>
9 9
10 #include "app/l10n_util.h" 10 #include "app/l10n_util.h"
11 #include "app/resource_bundle.h" 11 #include "app/resource_bundle.h"
12 #include "app/slide_animation.h" 12 #include "app/slide_animation.h"
13 #include "base/utf_string_conversions.h" 13 #include "base/utf_string_conversions.h"
14 #include "chrome/app/chrome_dll_resource.h" 14 #include "chrome/app/chrome_dll_resource.h"
15 #include "chrome/common/notification_service.h" 15 #include "chrome/common/notification_service.h"
16 #include "chrome/browser/tab_contents/tab_contents.h" 16 #include "chrome/browser/tab_contents/tab_contents.h"
17 #include "chrome/browser/translate/languages_menu_model.h" 17 #include "chrome/browser/translate/languages_menu_model.h"
18 #include "chrome/browser/translate/options_menu_model.h" 18 #include "chrome/browser/translate/options_menu_model.h"
19 #include "chrome/browser/translate/page_translated_details.h" 19 #include "chrome/browser/translate/page_translated_details.h"
20 #include "chrome/browser/views/infobars/infobar_button_border.h"
21 #include "chrome/browser/views/infobars/infobar_text_button.h"
20 #include "gfx/canvas.h" 22 #include "gfx/canvas.h"
21 #include "grit/app_resources.h" 23 #include "grit/app_resources.h"
22 #include "grit/generated_resources.h" 24 #include "grit/generated_resources.h"
23 #include "grit/locale_settings.h" 25 #include "grit/locale_settings.h"
24 #include "grit/theme_resources.h" 26 #include "grit/theme_resources.h"
25 #include "views/controls/button/image_button.h" 27 #include "views/controls/button/image_button.h"
26 #include "views/controls/button/menu_button.h" 28 #include "views/controls/button/menu_button.h"
27 #include "views/controls/button/text_button.h" 29 #include "views/controls/button/text_button.h"
28 #include "views/controls/image_view.h" 30 #include "views/controls/image_view.h"
29 #include "views/controls/label.h" 31 #include "views/controls/label.h"
30 32
33 #include "chrome/browser/views/infobars/before_translate_infobar.h"
34
31 // IDs for various menus. 35 // IDs for various menus.
32 static const int kMenuIDOptions = 1000; 36 static const int kMenuIDOptions = 1000;
33 static const int kMenuIDOriginalLanguage = 1001; 37 static const int kMenuIDOriginalLanguage = 1001;
34 static const int kMenuIDTargetLanguage = 1002; 38 static const int kMenuIDTargetLanguage = 1002;
35 39
36 ////////////////////////////////////////////////////////////////////////////////
37 //
38 // TranslateButtonBorder
39 //
40 // A TextButtonBorder subclass that adds to also paint button frame in normal
41 // state, and changes the images used.
42 //
43 ////////////////////////////////////////////////////////////////////////////////
44
45 class TranslateButtonBorder : public views::TextButtonBorder {
46 public:
47 TranslateButtonBorder();
48 virtual ~TranslateButtonBorder();
49
50 // Overriden from Border
51 virtual void Paint(const views::View& view, gfx::Canvas* canvas) const;
52
53 private:
54 MBBImageSet normal_set_;
55
56 private:
57 DISALLOW_COPY_AND_ASSIGN(TranslateButtonBorder);
58 };
59
60 // TranslateButtonBorder, public: ----------------------------------------------
61
62 TranslateButtonBorder::TranslateButtonBorder() {
63 ResourceBundle& rb = ResourceBundle::GetSharedInstance();
64
65 normal_set_.top_left = rb.GetBitmapNamed(IDR_INFOBARBUTTON_TOP_LEFT_N);
66 normal_set_.top = rb.GetBitmapNamed(IDR_INFOBARBUTTON_TOP_N);
67 normal_set_.top_right = rb.GetBitmapNamed(IDR_INFOBARBUTTON_TOP_RIGHT_N);
68 normal_set_.left = rb.GetBitmapNamed(IDR_INFOBARBUTTON_LEFT_N);
69 normal_set_.center = rb.GetBitmapNamed(IDR_INFOBARBUTTON_CENTER_N);
70 normal_set_.right = rb.GetBitmapNamed(IDR_INFOBARBUTTON_RIGHT_N);
71 normal_set_.bottom_left = rb.GetBitmapNamed(IDR_INFOBARBUTTON_BOTTOM_LEFT_N);
72 normal_set_.bottom = rb.GetBitmapNamed(IDR_INFOBARBUTTON_BOTTOM_N);
73 normal_set_.bottom_right = rb.GetBitmapNamed(
74 IDR_INFOBARBUTTON_BOTTOM_RIGHT_N);
75
76 hot_set_.top_left = rb.GetBitmapNamed(IDR_INFOBARBUTTON_TOP_LEFT_H);
77 hot_set_.top = rb.GetBitmapNamed(IDR_INFOBARBUTTON_TOP_H);
78 hot_set_.top_right = rb.GetBitmapNamed(IDR_INFOBARBUTTON_TOP_RIGHT_H);
79 hot_set_.left = rb.GetBitmapNamed(IDR_INFOBARBUTTON_LEFT_H);
80 hot_set_.center = rb.GetBitmapNamed(IDR_INFOBARBUTTON_CENTER_H);
81 hot_set_.right = rb.GetBitmapNamed(IDR_INFOBARBUTTON_RIGHT_H);
82 hot_set_.bottom_left = rb.GetBitmapNamed(IDR_INFOBARBUTTON_BOTTOM_LEFT_H);
83 hot_set_.bottom = rb.GetBitmapNamed(IDR_INFOBARBUTTON_BOTTOM_H);
84 hot_set_.bottom_right = rb.GetBitmapNamed(IDR_INFOBARBUTTON_BOTTOM_RIGHT_H);
85
86 pushed_set_.top_left = rb.GetBitmapNamed(IDR_INFOBARBUTTON_TOP_LEFT_P);
87 pushed_set_.top = rb.GetBitmapNamed(IDR_INFOBARBUTTON_TOP_P);
88 pushed_set_.top_right = rb.GetBitmapNamed(IDR_INFOBARBUTTON_TOP_RIGHT_P);
89 pushed_set_.left = rb.GetBitmapNamed(IDR_INFOBARBUTTON_LEFT_P);
90 pushed_set_.center = rb.GetBitmapNamed(IDR_INFOBARBUTTON_CENTER_P);
91 pushed_set_.right = rb.GetBitmapNamed(IDR_INFOBARBUTTON_RIGHT_P);
92 pushed_set_.bottom_left = rb.GetBitmapNamed(IDR_INFOBARBUTTON_BOTTOM_LEFT_P);
93 pushed_set_.bottom = rb.GetBitmapNamed(IDR_INFOBARBUTTON_BOTTOM_P);
94 pushed_set_.bottom_right = rb.GetBitmapNamed(
95 IDR_INFOBARBUTTON_BOTTOM_RIGHT_P);
96 }
97
98 TranslateButtonBorder::~TranslateButtonBorder() {
99 }
100
101 // TranslateButtonBorder, Border overrides: ------------------------------------
102
103 void TranslateButtonBorder::Paint(const views::View& view, gfx::Canvas* canvas)
104 const {
105 const views::TextButton* mb = static_cast<const views::TextButton*>(&view);
106 int state = mb->state();
107
108 // TextButton takes care of deciding when to call Paint.
109 const MBBImageSet* set = &normal_set_;
110 if (state == views::TextButton::BS_HOT)
111 set = &hot_set_;
112 else if (state == views::TextButton::BS_PUSHED)
113 set = &pushed_set_;
114
115 gfx::Rect bounds = view.bounds();
116
117 // Draw top left image.
118 canvas->DrawBitmapInt(*set->top_left, 0, 0);
119
120 // Stretch top image.
121 canvas->DrawBitmapInt(
122 *set->top,
123 0, 0, set->top->width(), set->top->height(),
124 set->top_left->width(),
125 0,
126 bounds.width() - set->top_right->width() - set->top_left->width(),
127 set->top->height(), false);
128
129 // Draw top right image.
130 canvas->DrawBitmapInt(*set->top_right,
131 bounds.width() - set->top_right->width(), 0);
132
133 // Stretch left image.
134 canvas->DrawBitmapInt(
135 *set->left,
136 0, 0, set->left->width(), set->left->height(),
137 0,
138 set->top_left->height(),
139 set->top_left->width(),
140 bounds.height() - set->top->height() - set->bottom_left->height(), false);
141
142 // Stretch center image.
143 canvas->DrawBitmapInt(
144 *set->center,
145 0, 0, set->center->width(), set->center->height(),
146 set->left->width(),
147 set->top->height(),
148 bounds.width() - set->right->width() - set->left->width(),
149 bounds.height() - set->bottom->height() - set->top->height(), false);
150
151 // Stretch right image.
152 canvas->DrawBitmapInt(
153 *set->right,
154 0, 0, set->right->width(), set->right->height(),
155 bounds.width() - set->right->width(),
156 set->top_right->height(),
157 set->right->width(),
158 bounds.height() - set->bottom_right->height() -
159 set->top_right->height(), false);
160
161 // Draw bottom left image.
162 canvas->DrawBitmapInt(*set->bottom_left,
163 0,
164 bounds.height() - set->bottom_left->height());
165
166 // Stretch bottom image.
167 canvas->DrawBitmapInt(
168 *set->bottom,
169 0, 0, set->bottom->width(), set->bottom->height(),
170 set->bottom_left->width(),
171 bounds.height() - set->bottom->height(),
172 bounds.width() - set->bottom_right->width() -
173 set->bottom_left->width(),
174 set->bottom->height(), false);
175
176 // Draw bottom right image.
177 canvas->DrawBitmapInt(*set->bottom_right,
178 bounds.width() - set->bottom_right->width(),
179 bounds.height() - set->bottom_right->height());
180 }
181
182 ////////////////////////////////////////////////////////////////////////////////
183 //
184 // TranslateTextButton
185 //
186 // A TextButton subclass that overrides OnMousePressed to default to
187 // CustomButton so as to create pressed state effect.
188 //
189 ////////////////////////////////////////////////////////////////////////////////
190
191 class TranslateTextButton : public views::TextButton {
192 public:
193 TranslateTextButton(views::ButtonListener* listener, int label_id);
194 virtual ~TranslateTextButton();
195
196 protected:
197 // Overriden from TextButton:
198 virtual bool OnMousePressed(const views::MouseEvent& e);
199
200 private:
201 DISALLOW_COPY_AND_ASSIGN(TranslateTextButton);
202 };
203
204 // TranslateButtonBorder, public: ----------------------------------------------
205
206 TranslateTextButton::TranslateTextButton(views::ButtonListener* listener,
207 int label_id)
208 // Don't use text to construct TextButton because we need to set font
209 // before setting text so that the button will resize to fit entire text.
210 : TextButton(listener, std::wstring()) {
211 set_border(new TranslateButtonBorder);
212 SetNormalHasBorder(true); // Normal button state has border.
213 SetAnimationDuration(0); // Disable animation during state change.
214 // Set font colors for different states.
215 SetEnabledColor(SK_ColorBLACK);
216 SetHighlightColor(SK_ColorBLACK);
217 SetHoverColor(SK_ColorBLACK);
218 // Set font then text, then size button to fit text.
219 SetFont(ResourceBundle::GetSharedInstance().GetFont(
220 ResourceBundle::MediumFont));
221 SetText(l10n_util::GetString(label_id));
222 ClearMaxTextSize();
223 SizeToPreferredSize();
224 }
225
226 TranslateTextButton::~TranslateTextButton() {
227 }
228
229 // TranslateTextButton, protected: ---------------------------------------------
230
231 bool TranslateTextButton::OnMousePressed(const views::MouseEvent& e) {
232 return views::CustomButton::OnMousePressed(e);
233 }
234
235 // TranslateInfoBar, public: --------------------------------------------------- 40 // TranslateInfoBar, public: ---------------------------------------------------
236 41
237 TranslateInfoBar::TranslateInfoBar(TranslateInfoBarDelegate* delegate) 42 TranslateInfoBar::TranslateInfoBar(TranslateInfoBarDelegate* delegate)
238 : InfoBar(delegate), 43 : InfoBar(delegate),
239 state_(TranslateInfoBarDelegate::kTranslateNone), 44 state_(TranslateInfoBarDelegate::kTranslateNone),
240 translation_pending_(false), 45 translation_pending_(false),
241 label_1_(NULL), 46 label_1_(NULL),
242 label_2_(NULL), 47 label_2_(NULL),
243 label_3_(NULL), 48 label_3_(NULL),
244 translating_label_(NULL), 49 translating_label_(NULL),
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
314 if (!target_language_menu_button_) { 119 if (!target_language_menu_button_) {
315 CreateLabels(); 120 CreateLabels();
316 string16 language_name = 121 string16 language_name =
317 GetDelegate()->GetDisplayNameForLocale( 122 GetDelegate()->GetDisplayNameForLocale(
318 GetDelegate()->target_lang_code()); 123 GetDelegate()->target_lang_code());
319 target_language_menu_button_ = CreateMenuButton(kMenuIDTargetLanguage, 124 target_language_menu_button_ = CreateMenuButton(kMenuIDTargetLanguage,
320 UTF16ToWideHack(language_name), true); 125 UTF16ToWideHack(language_name), true);
321 AddChildView(target_language_menu_button_); 126 AddChildView(target_language_menu_button_);
322 } 127 }
323 if (!revert_button_) { 128 if (!revert_button_) {
324 revert_button_ = new TranslateTextButton(this, 129 revert_button_ = InfoBarTextButton::CreateWithMessageID(this,
325 IDS_TRANSLATE_INFOBAR_REVERT); 130 IDS_TRANSLATE_INFOBAR_REVERT);
326 AddChildView(revert_button_); 131 AddChildView(revert_button_);
327 } 132 }
328 break; 133 break;
329 134
330 case TranslateInfoBarDelegate::kBeforeTranslate: 135 case TranslateInfoBarDelegate::kBeforeTranslate:
331 if (!label_1_) 136 if (!label_1_)
332 CreateLabels(); 137 CreateLabels();
333 if (!accept_button_) { 138 if (!accept_button_) {
334 accept_button_ = new TranslateTextButton(this, 139 accept_button_ = InfoBarTextButton::CreateWithMessageID(this,
335 IDS_TRANSLATE_INFOBAR_ACCEPT); 140 IDS_TRANSLATE_INFOBAR_ACCEPT);
336 AddChildView(accept_button_); 141 AddChildView(accept_button_);
337 } 142 }
338 if (!deny_button_) { 143 if (!deny_button_) {
339 deny_button_ = new TranslateTextButton(this, 144 deny_button_ = InfoBarTextButton::CreateWithMessageID(this,
340 IDS_TRANSLATE_INFOBAR_DENY); 145 IDS_TRANSLATE_INFOBAR_DENY);
341 AddChildView(deny_button_); 146 AddChildView(deny_button_);
342 } 147 }
343 break; 148 break;
344 149
345 case TranslateInfoBarDelegate::kTranslateError: { 150 case TranslateInfoBarDelegate::kTranslateError: {
346 string16 error_message_utf16 = GetDelegate()->GetErrorMessage(error_type); 151 string16 error_message_utf16 = GetDelegate()->GetErrorMessage(error_type);
347 std::wstring error_message = UTF16ToWideHack(error_message_utf16); 152 std::wstring error_message = UTF16ToWideHack(error_message_utf16);
348 if (error_label_) { 153 if (error_label_) {
349 error_label_->SetText(error_message); 154 error_label_->SetText(error_message);
350 } else { 155 } else {
351 error_label_ = CreateLabel(error_message); 156 error_label_ = CreateLabel(error_message);
352 AddChildView(error_label_); 157 AddChildView(error_label_);
353 } 158 }
354 if (!retry_button_) { 159 if (!retry_button_) {
355 retry_button_ = new TranslateTextButton(this, 160 retry_button_ = InfoBarTextButton::CreateWithMessageID(this,
356 IDS_TRANSLATE_INFOBAR_RETRY); 161 IDS_TRANSLATE_INFOBAR_RETRY);
357 AddChildView(retry_button_); 162 AddChildView(retry_button_);
358 } 163 }
359 break; 164 break;
360 } 165 }
361 166
362 default: 167 default:
363 NOTREACHED() << "Invalid translate state change"; 168 NOTREACHED() << "Invalid translate state change";
364 break; 169 break;
365 } 170 }
(...skipping 502 matching lines...) Expand 10 before | Expand all | Expand 10 after
868 return label; 673 return label;
869 } 674 }
870 675
871 views::MenuButton* TranslateInfoBar::CreateMenuButton(int menu_id, 676 views::MenuButton* TranslateInfoBar::CreateMenuButton(int menu_id,
872 const std::wstring& text, bool normal_has_border) { 677 const std::wstring& text, bool normal_has_border) {
873 // Don't use text to instantiate MenuButton because we need to set font before 678 // Don't use text to instantiate MenuButton because we need to set font before
874 // setting text so that the button will resize to fit entire text. 679 // setting text so that the button will resize to fit entire text.
875 views::MenuButton* menu_button = 680 views::MenuButton* menu_button =
876 new views::MenuButton(NULL, std::wstring(), this, true); 681 new views::MenuButton(NULL, std::wstring(), this, true);
877 menu_button->SetID(menu_id); 682 menu_button->SetID(menu_id);
878 menu_button->set_border(new TranslateButtonBorder); 683 menu_button->set_border(new InfoBarButtonBorder);
879 menu_button->set_menu_marker(ResourceBundle::GetSharedInstance(). 684 menu_button->set_menu_marker(ResourceBundle::GetSharedInstance().
880 GetBitmapNamed(IDR_INFOBARBUTTON_MENU_DROPARROW)); 685 GetBitmapNamed(IDR_INFOBARBUTTON_MENU_DROPARROW));
881 if (normal_has_border) { 686 if (normal_has_border) {
882 menu_button->SetNormalHasBorder(true); // Normal button state has border. 687 menu_button->SetNormalHasBorder(true); // Normal button state has border.
883 // Disable animation during state change. 688 // Disable animation during state change.
884 menu_button->SetAnimationDuration(0); 689 menu_button->SetAnimationDuration(0);
885 } 690 }
886 // Set font colors for different states. 691 // Set font colors for different states.
887 menu_button->SetEnabledColor(SK_ColorBLACK); 692 menu_button->SetEnabledColor(SK_ColorBLACK);
888 menu_button->SetHighlightColor(SK_ColorBLACK); 693 menu_button->SetHighlightColor(SK_ColorBLACK);
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
972 inline int TranslateInfoBar::GetSpacingAfterFirstLanguageButton() const { 777 inline int TranslateInfoBar::GetSpacingAfterFirstLanguageButton() const {
973 return (state_ == TranslateInfoBarDelegate::kAfterTranslate ? 778 return (state_ == TranslateInfoBarDelegate::kAfterTranslate ?
974 kButtonInLabelSpacing : 10); 779 kButtonInLabelSpacing : 10);
975 } 780 }
976 781
977 // TranslateInfoBarDelegate, InfoBarDelegate overrides: ------------------ 782 // TranslateInfoBarDelegate, InfoBarDelegate overrides: ------------------
978 783
979 InfoBar* TranslateInfoBarDelegate::CreateInfoBar() { 784 InfoBar* TranslateInfoBarDelegate::CreateInfoBar() {
980 return new TranslateInfoBar(this); 785 return new TranslateInfoBar(this);
981 } 786 }
OLDNEW
« no previous file with comments | « chrome/browser/views/infobars/translate_infobars.h ('k') | chrome/browser/views/infobars/translate_message_infobar.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698