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

Side by Side Diff: chrome/browser/ui/views/translate/translate_bubble_view.cc

Issue 26775007: Translate: Add TranslateBubbleView (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Move implementation of the view type transitions to TranslateBubbleModel Created 7 years, 2 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
(Empty)
1 // Copyright 2013 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/ui/views/translate/translate_bubble_view.h"
6
7 #include <algorithm>
8 #include <string>
9 #include <vector>
10
11 #include "base/i18n/string_compare.h"
12 #include "base/memory/singleton.h"
13 #include "base/metrics/histogram.h"
14 #include "base/prefs/pref_service.h"
15 #include "base/strings/utf_string_conversions.h"
16 #include "chrome/browser/browser_process.h"
17 #include "chrome/browser/profiles/profile.h"
18 #include "chrome/browser/translate/translate_manager.h"
19 #include "chrome/browser/translate/translate_tab_helper.h"
20 #include "chrome/browser/translate/translate_ui_delegate.h"
21 #include "chrome/browser/ui/browser.h"
22 #include "chrome/browser/ui/translate/translate_bubble_model_impl.h"
23 #include "chrome/common/url_constants.h"
24 #include "content/public/browser/web_contents.h"
25 #include "grit/generated_resources.h"
26 #include "ui/base/l10n/l10n_util.h"
27 #include "ui/base/models/combobox_model.h"
28 #include "ui/base/resource/resource_bundle.h"
29 #include "ui/views/controls/button/checkbox.h"
30 #include "ui/views/controls/button/label_button.h"
31 #include "ui/views/controls/combobox/combobox.h"
32 #include "ui/views/controls/label.h"
33 #include "ui/views/controls/link.h"
34 #include "ui/views/layout/box_layout.h"
35 #include "ui/views/layout/grid_layout.h"
36 #include "ui/views/layout/layout_constants.h"
37 #include "ui/views/widget/widget.h"
38
39 namespace {
40
41 views::LabelButton* CreateLabelButton(views::ButtonListener* listener,
42 const string16& label, int id) {
43 views::LabelButton* button = new views::LabelButton(listener, label);
44 button->set_id(id);
45 button->SetStyle(views::Button::STYLE_NATIVE_TEXTBUTTON);
46 return button;
47 }
48
49 views::Link* CreateLink(views::LinkListener* listener,
50 int resource_id,
51 int id) {
52 views::Link* link = new views::Link(
53 l10n_util::GetStringUTF16(resource_id));
54 link->set_listener(listener);
55 link->set_id(id);
56 return link;
57 }
58
59 void GetTranslateLanguages(content::WebContents* web_contents,
60 std::string* source,
61 std::string* target) {
62 DCHECK(source != NULL);
63 DCHECK(target != NULL);
64
65 TranslateTabHelper* translate_tab_helper =
66 TranslateTabHelper::FromWebContents(web_contents);
67 if (!translate_tab_helper)
68 return;
69
70 *source = translate_tab_helper->language_state().original_language();
71 *target = g_browser_process->GetApplicationLocale();
72 *target = TranslateManager::GetLanguageCode(*target);
73 }
74
75 // TODO(hajimehoshi): The interface to offer denial choices should be another
76 // control instead of Combobox. See crbug/305494.
77 class TranslateDenialComboboxModel : public ui::ComboboxModel {
78 public:
79 enum {
80 INDEX_NOPE = 0,
81 INDEX_NEVER_TRANSLATE_LANGUAGE = 2,
82 INDEX_NEVER_TRANSLATE_SITE = 4,
83 };
84
85 explicit TranslateDenialComboboxModel(
86 const string16& original_language_name) {
87 items_.push_back(l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_DENY));
88 items_.push_back(string16());
89 items_.push_back(l10n_util::GetStringFUTF16(
90 IDS_TRANSLATE_BUBBLE_NEVER_TRANSLATE_LANG,
91 original_language_name));
92 items_.push_back(string16());
93 items_.push_back(l10n_util::GetStringUTF16(
94 IDS_TRANSLATE_BUBBLE_NEVER_TRANSLATE_SITE));
95 }
96 virtual ~TranslateDenialComboboxModel() {}
97
98 private:
99 // Overridden from ui::ComboboxModel:
100 virtual int GetItemCount() const OVERRIDE {
101 return items_.size();
102 }
103 virtual string16 GetItemAt(int index) OVERRIDE {
104 return items_.at(index);
105 }
106 virtual bool IsItemSeparatorAt(int index) OVERRIDE {
107 return items_.at(index).empty();
108 }
109 virtual int GetDefaultIndex() const OVERRIDE {
110 return 0;
111 }
112
113 std::vector<string16> items_;
114
115 DISALLOW_COPY_AND_ASSIGN(TranslateDenialComboboxModel);
116 };
117
118 const char* kUMATranslateModifyOriginalLang = "Translate.ModifyOriginalLang";
119 const char* kUMATranslateModifyTargetLang = "Translate.ModifyTargetLang";
120
121 } // namespace
122
123 TranslateBubbleView* TranslateBubbleView::translate_bubble_view_;
124
125 // static
126 void TranslateBubbleView::ShowBubble(views::View* anchor_view,
127 content::WebContents* web_contents,
128 TranslateBubbleModel::ViewType type,
129 Browser* browser) {
130 if (IsShowing()) {
131 translate_bubble_view_->SwitchView(type);
132 return;
133 }
134
135 std::string source_language;
136 std::string target_language;
137 GetTranslateLanguages(web_contents, &source_language, &target_language);
138
139 scoped_ptr<TranslateUIDelegate> ui_delegate(
140 new TranslateUIDelegate(web_contents, source_language, target_language));
141 scoped_ptr<TranslateBubbleModel> model(
142 new TranslateBubbleModelImpl(type, ui_delegate.Pass()));
143 bool is_in_incognito_window =
144 web_contents->GetBrowserContext()->IsOffTheRecord();
145 TranslateBubbleView* view = new TranslateBubbleView(anchor_view,
146 model.Pass(),
147 is_in_incognito_window,
148 browser);
149 views::BubbleDelegateView::CreateBubble(view)->Show();
150 }
151
152 // static
153 bool TranslateBubbleView::IsShowing() {
154 return translate_bubble_view_ != NULL;
155 }
156
157 TranslateBubbleView::TranslateBubbleView(
158 views::View* anchor_view,
159 scoped_ptr<TranslateBubbleModel> model,
160 bool is_in_incognito_window,
161 Browser* browser)
162 : BubbleDelegateView(anchor_view, views::BubbleBorder::TOP_RIGHT),
163 source_language_combobox_(NULL),
164 target_language_combobox_(NULL),
165 always_translate_checkbox_(NULL),
166 model_(model.Pass()),
167 is_in_incognito_window_(is_in_incognito_window),
168 browser_(browser),
169 translate_executed_(false) {
170 model_->set_observer(this);
171
172 if (model_->view_type() != TranslateBubbleModel::BEFORE_TRANSLATE)
173 translate_executed_ = true;
174
175 set_margins(gfx::Insets(views::kPanelVertMargin, views::kPanelHorizMargin,
176 views::kPanelVertMargin, views::kPanelHorizMargin));
177
178 translate_bubble_view_ = this;
179 }
180
181 TranslateBubbleView::~TranslateBubbleView() {
182 // A child view could refer to a model which is owned by this class when
183 // the child view is destructed. For example, |source_language_combobx_model_|
184 // is referred by Combobox's destructor. Before destroying the models,
185 // removing the child views is needed.
186 RemoveAllChildViews(true);
187 }
188
189 void TranslateBubbleView::OnViewTypeChanged(
190 TranslateBubbleModel::ViewType view_type) {
191 UpdateChildVisibilities();
192 SizeToContents();
193 }
194
195 void TranslateBubbleView::Init() {
196 SetLayoutManager(new views::BoxLayout(views::BoxLayout::kVertical,
197 0, 0, 0));
198 AddChildViewAt(CreateViewBeforeTranslate(),
199 TranslateBubbleModel::BEFORE_TRANSLATE);
200 AddChildViewAt(CreateViewTranslating(),
201 TranslateBubbleModel::TRANSLATING);
202 AddChildViewAt(CreateViewAfterTranslate(),
203 TranslateBubbleModel::AFTER_TRANSLATE);
204 AddChildViewAt(CreateViewError(),
205 TranslateBubbleModel::ERROR);
206 AddChildViewAt(CreateViewAdvanced(),
207 TranslateBubbleModel::ADVANCED);
208
209 AddAccelerator(ui::Accelerator(ui::VKEY_RETURN, ui::EF_NONE));
210
211 UpdateChildVisibilities();
212 }
213
214 void TranslateBubbleView::ButtonPressed(views::Button* sender,
215 const ui::Event& event) {
216 HandleButtonPressed(sender->id());
217 }
218
219 void TranslateBubbleView::WindowClosing() {
220 if (!translate_executed_)
221 model_->TranslationDeclined();
222
223 // We have to reset |translate_bubble_view_| here, not in our destructor,
224 // because we'll be destroyed asynchronously and the shown state will be
225 // checked before then.
226 DCHECK_EQ(translate_bubble_view_, this);
227 translate_bubble_view_ = NULL;
228 }
229
230 bool TranslateBubbleView::AcceleratorPressed(
231 const ui::Accelerator& accelerator) {
232 switch (model_->view_type()) {
233 case TranslateBubbleModel::BEFORE_TRANSLATE: {
234 if (accelerator.key_code() == ui::VKEY_RETURN) {
235 HandleButtonPressed(BUTTON_ID_TRANSLATE);
236 return true;
237 }
238 break;
239 }
240 case TranslateBubbleModel::TRANSLATING:
241 break;
242 case TranslateBubbleModel::AFTER_TRANSLATE: {
243 if (accelerator.key_code() == ui::VKEY_RETURN) {
244 HandleButtonPressed(BUTTON_ID_SHOW_ORIGINAL);
245 return true;
246 }
247 break;
248 }
249 case TranslateBubbleModel::ERROR:
250 break;
251 case TranslateBubbleModel::ADVANCED: {
252 if (accelerator.key_code() == ui::VKEY_RETURN) {
253 HandleButtonPressed(BUTTON_ID_DONE);
254 return true;
255 }
256 break;
257 }
258 default:
259 NOTREACHED();
260 break;
261 }
262 return BubbleDelegateView::AcceleratorPressed(accelerator);
263 }
264
265 gfx::Size TranslateBubbleView::GetPreferredSize() {
266 int width = 0;
267 for (int i = 0; i < child_count(); i++) {
268 views::View* child = child_at(i);
269 width = std::max(width, child->GetPreferredSize().width());
270 }
271 int height = child_at(model_->view_type())->GetPreferredSize().height();
272 return gfx::Size(width, height);
273 }
274
275 void TranslateBubbleView::OnSelectedIndexChanged(views::Combobox* combobox) {
276 switch (combobox->id()) {
277 case COMBOBOX_ID_DENIAL: {
278 int index = combobox->selected_index();
279 switch (index) {
280 case TranslateDenialComboboxModel::INDEX_NOPE:
281 if (!translate_executed_)
282 model_->TranslationDeclined();
283 StartFade(false);
284 break;
285 case TranslateDenialComboboxModel::INDEX_NEVER_TRANSLATE_LANGUAGE:
286 model_->SetLanguageBlocked(true);
287 StartFade(false);
288 break;
289 case TranslateDenialComboboxModel::INDEX_NEVER_TRANSLATE_SITE:
290 model_->SetSiteBlacklist(true);
291 StartFade(false);
292 break;
293 default:
294 NOTREACHED();
295 break;
296 }
297 break;
298 }
299 case COMBOBOX_ID_SOURCE_LANGUAGE: {
300 // TODO(hajimehoshi): This UMA should be counted at a model or a delegate
301 // not to dependent on platforms. However, this UMA has not been used at
302 // some platforms. See crbug/306365.
303 UMA_HISTOGRAM_BOOLEAN(kUMATranslateModifyOriginalLang, true);
304 UpdateAdvancedView();
305 break;
306 }
307 case COMBOBOX_ID_TARGET_LANGUAGE: {
308 // TODO(hajimehoshi): Ditto.
309 UMA_HISTOGRAM_BOOLEAN(kUMATranslateModifyTargetLang, true);
310 UpdateAdvancedView();
311 break;
312 }
313 default:
314 NOTREACHED();
315 break;
316 }
317 }
318
319 void TranslateBubbleView::LinkClicked(views::Link* source, int event_flags) {
320 HandleLinkClicked(source->id());
321 }
322
323 void TranslateBubbleView::HandleButtonPressed(int sender_id) {
324 switch (sender_id) {
325 case BUTTON_ID_TRANSLATE: {
326 translate_executed_ = true;
327 model_->Translate();
328 break;
329 }
330 case BUTTON_ID_DONE: {
331 translate_executed_ = true;
332 DCHECK(source_language_combobox_);
333 DCHECK(target_language_combobox_);
334
335 model_->SetOriginalLanguageIndex(
336 source_language_combobox_->selected_index());
337 model_->SetTargetLanguageIndex(
338 target_language_combobox_->selected_index());
339 model_->Translate();
340 break;
341 }
342 case BUTTON_ID_CANCEL: {
343 model_->GoBackFromAdvanced();
344 break;
345 }
346 case BUTTON_ID_TRY_AGAIN: {
347 translate_executed_ = true;
348 model_->Translate();
349 break;
350 }
351 case BUTTON_ID_SHOW_ORIGINAL: {
352 model_->RevertTranslation();
353 StartFade(false);
354 break;
355 }
356 case BUTTON_ID_ALWAYS_TRANSLATE: {
357 DCHECK(always_translate_checkbox_);
358 model_->SetAlwaysTranslate(always_translate_checkbox_->checked());
359 UpdateAdvancedView();
360 break;
361 }
362 default:
363 NOTREACHED();
364 break;
365 }
366 }
367
368 void TranslateBubbleView::HandleLinkClicked(int sender_id) {
369 switch (sender_id) {
370 case LINK_ID_ADVANCED: {
371 SwitchView(TranslateBubbleModel::ADVANCED);
372 break;
373 }
374 case LINK_ID_LEARN_MORE: {
375 browser_->OpenURL(content::OpenURLParams(
376 GURL(chrome::kAboutGoogleTranslateURL),
377 content::Referrer(),
378 NEW_FOREGROUND_TAB,
379 content::PAGE_TRANSITION_LINK,
380 false));
381 break;
382 }
383 default:
384 NOTREACHED();
385 break;
386 }
387 }
388
389 void TranslateBubbleView::UpdateChildVisibilities() {
390 for (int i = 0; i < child_count(); i++) {
391 views::View* view = child_at(i);
392 view->SetVisible(i == model_->view_type());
393 }
394 }
395
396 views::View* TranslateBubbleView::CreateViewBeforeTranslate() {
397 views::Label* message_label = new views::Label(
398 l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_BEFORE_TRANSLATE));
399
400 string16 original_language_name =
401 model_->GetLanguageNameAt(model_->GetOriginalLanguageIndex());
402 views::Combobox* denial_combobox = new views::Combobox(
403 new TranslateDenialComboboxModel(original_language_name));
404 denial_combobox->set_id(COMBOBOX_ID_DENIAL);
405 denial_combobox->set_listener(this);
406
407 views::View* view = new views::View();
408 views::GridLayout* layout = new views::GridLayout(view);
409 view->SetLayoutManager(layout);
410
411 using views::GridLayout;
412
413 enum {
414 COLUMN_SET_ID_MESSAGE,
415 COLUMN_SET_ID_CONTENT,
416 };
417
418 views::ColumnSet* cs = layout->AddColumnSet(COLUMN_SET_ID_MESSAGE);
419 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER,
420 0, GridLayout::USE_PREF, 0, 0);
421 cs->AddPaddingColumn(0, views::kRelatedButtonHSpacing);
422 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER,
423 0, GridLayout::USE_PREF, 0, 0);
424 cs->AddPaddingColumn(1, 0);
425
426 cs = layout->AddColumnSet(COLUMN_SET_ID_CONTENT);
427 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER,
428 0, GridLayout::USE_PREF, 0, 0);
429 cs->AddPaddingColumn(1, views::kUnrelatedControlHorizontalSpacing);
430 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER,
431 0, GridLayout::USE_PREF, 0, 0);
432 cs->AddPaddingColumn(0, views::kRelatedButtonHSpacing);
433 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER,
434 0, GridLayout::USE_PREF, 0, 0);
435
436 layout->StartRow(0, COLUMN_SET_ID_MESSAGE);
437 layout->AddView(message_label);
438 layout->AddView(CreateLink(this,
439 IDS_TRANSLATE_BUBBLE_ADVANCED,
440 LINK_ID_ADVANCED));
441
442 layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing);
443
444 layout->StartRow(0, COLUMN_SET_ID_CONTENT);
445 layout->AddView(CreateLink(this,
446 IDS_TRANSLATE_BUBBLE_LEARN_MORE,
447 LINK_ID_LEARN_MORE));
448 layout->AddView(denial_combobox);
449 layout->AddView(CreateLabelButton(
450 this,
451 l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_ACCEPT),
452 BUTTON_ID_TRANSLATE));
453
454 return view;
455 }
456
457 views::View* TranslateBubbleView::CreateViewTranslating() {
458 string16 target_language_name =
459 model_->GetLanguageNameAt(model_->GetTargetLanguageIndex());
460 views::Label* label = new views::Label(
461 l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_TRANSLATING));
462
463 views::View* view = new views::View();
464 views::GridLayout* layout = new views::GridLayout(view);
465 view->SetLayoutManager(layout);
466
467 using views::GridLayout;
468
469 enum {
470 COLUMN_SET_ID_MESSAGE,
471 COLUMN_SET_ID_CONTENT,
472 };
473
474 views::ColumnSet* cs = layout->AddColumnSet(COLUMN_SET_ID_MESSAGE);
475 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER,
476 0, views::GridLayout::USE_PREF, 0, 0);
477 cs->AddPaddingColumn(1, 0);
478
479 cs = layout->AddColumnSet(COLUMN_SET_ID_CONTENT);
480 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER,
481 0, GridLayout::USE_PREF, 0, 0);
482 cs->AddPaddingColumn(1, views::kUnrelatedControlHorizontalSpacing);
483 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER,
484 0, GridLayout::USE_PREF, 0, 0);
485
486 layout->StartRow(0, COLUMN_SET_ID_MESSAGE);
487 layout->AddView(label);
488
489 layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing);
490
491 layout->StartRow(0, COLUMN_SET_ID_CONTENT);
492 layout->AddView(CreateLink(this,
493 IDS_TRANSLATE_BUBBLE_LEARN_MORE,
494 LINK_ID_LEARN_MORE));
495 views::LabelButton* revert_button = CreateLabelButton(
496 this,
497 l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_REVERT),
498 BUTTON_ID_SHOW_ORIGINAL);
499 revert_button->SetEnabled(false);
500 layout->AddView(revert_button);
501
502 return view;
503 }
504
505 views::View* TranslateBubbleView::CreateViewAfterTranslate() {
506 views::Label* label = new views::Label(
507 l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_TRANSLATED));
508
509 views::View* view = new views::View();
510 views::GridLayout* layout = new views::GridLayout(view);
511 view->SetLayoutManager(layout);
512
513 using views::GridLayout;
514
515 enum {
516 COLUMN_SET_ID_MESSAGE,
517 COLUMN_SET_ID_CONTENT,
518 };
519
520 views::ColumnSet* cs = layout->AddColumnSet(COLUMN_SET_ID_MESSAGE);
521 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER,
522 0, views::GridLayout::USE_PREF, 0, 0);
523 cs->AddPaddingColumn(0, views::kRelatedButtonHSpacing);
524 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER,
525 0, views::GridLayout::USE_PREF, 0, 0);
526 cs->AddPaddingColumn(1, 0);
527
528 cs = layout->AddColumnSet(COLUMN_SET_ID_CONTENT);
529 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER,
530 0, GridLayout::USE_PREF, 0, 0);
531 cs->AddPaddingColumn(1, views::kUnrelatedControlHorizontalSpacing);
532 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER,
533 0, GridLayout::USE_PREF, 0, 0);
534
535 layout->StartRow(0, COLUMN_SET_ID_MESSAGE);
536 layout->AddView(label);
537 layout->AddView(CreateLink(this,
538 IDS_TRANSLATE_BUBBLE_ADVANCED,
539 LINK_ID_ADVANCED));
540
541 layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing);
542
543 layout->StartRow(0, COLUMN_SET_ID_CONTENT);
544 layout->AddView(CreateLink(this,
545 IDS_TRANSLATE_BUBBLE_LEARN_MORE,
546 LINK_ID_LEARN_MORE));
547 layout->AddView(CreateLabelButton(
548 this,
549 l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_REVERT),
550 BUTTON_ID_SHOW_ORIGINAL));
551
552 return view;
553 }
554
555 views::View* TranslateBubbleView::CreateViewError() {
556 views::Label* label = new views::Label(
557 l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_COULD_NOT_TRANSLATE));
558
559 views::View* view = new views::View();
560 views::GridLayout* layout = new views::GridLayout(view);
561 view->SetLayoutManager(layout);
562
563 using views::GridLayout;
564
565 enum {
566 COLUMN_SET_ID_MESSAGE,
567 COLUMN_SET_ID_CONTENT,
568 };
569
570 views::ColumnSet* cs = layout->AddColumnSet(COLUMN_SET_ID_MESSAGE);
571 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER,
572 0, GridLayout::USE_PREF, 0, 0);
573 cs->AddPaddingColumn(0, views::kRelatedButtonHSpacing);
574 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER,
575 0, GridLayout::USE_PREF, 0, 0);
576 cs->AddPaddingColumn(1, 0);
577
578 cs = layout->AddColumnSet(COLUMN_SET_ID_CONTENT);
579 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER,
580 0, GridLayout::USE_PREF, 0, 0);
581 cs->AddPaddingColumn(1, views::kUnrelatedControlHorizontalSpacing);
582 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER,
583 0, GridLayout::USE_PREF, 0, 0);
584
585 layout->StartRow(0, COLUMN_SET_ID_MESSAGE);
586 layout->AddView(label);
587 layout->AddView(CreateLink(this,
588 IDS_TRANSLATE_BUBBLE_ADVANCED,
589 LINK_ID_ADVANCED));
590
591 layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing);
592
593 layout->StartRow(0, COLUMN_SET_ID_CONTENT);
594 layout->AddView(CreateLink(this,
595 IDS_TRANSLATE_BUBBLE_LEARN_MORE,
596 LINK_ID_LEARN_MORE));
597 layout->AddView(CreateLabelButton(
598 this,
599 l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_TRY_AGAIN),
600 BUTTON_ID_TRY_AGAIN));
601
602 return view;
603 }
604
605 // TODO(hajimehoshi): Revice this later to show a specific message for each
606 // error. (crbug/307350)
607 views::View* TranslateBubbleView::CreateViewAdvanced() {
608 views::Label* source_language_label = new views::Label(
609 l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_PAGE_LANGUAGE));
610
611 views::Label* target_language_label = new views::Label(
612 l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_TRANSLATION_LANGUAGE));
613
614 int source_default_index = model_->GetOriginalLanguageIndex();
615 source_language_combobox_model_.reset(
616 new LanguageComboboxModel(source_default_index, model_.get()));
617 source_language_combobox_ =
618 new views::Combobox(source_language_combobox_model_.get());
619
620 source_language_combobox_->set_id(COMBOBOX_ID_SOURCE_LANGUAGE);
621 source_language_combobox_->set_listener(this);
622
623 int target_default_index = model_->GetTargetLanguageIndex();
624 target_language_combobox_model_.reset(
625 new LanguageComboboxModel(target_default_index, model_.get()));
626 target_language_combobox_ =
627 new views::Combobox(target_language_combobox_model_.get());
628
629 target_language_combobox_->set_id(COMBOBOX_ID_TARGET_LANGUAGE);
630 target_language_combobox_->set_listener(this);
631
632 // In an incognito window, "Always translate" checkbox shouldn't be shown.
633 if (!is_in_incognito_window_) {
634 always_translate_checkbox_ = new views::Checkbox(string16());
635 always_translate_checkbox_->set_id(BUTTON_ID_ALWAYS_TRANSLATE);
636 always_translate_checkbox_->set_listener(this);
637 }
638
639 views::View* view = new views::View();
640 views::GridLayout* layout = new views::GridLayout(view);
641 view->SetLayoutManager(layout);
642
643 using views::GridLayout;
644
645 enum {
646 COLUMN_SET_ID_LANGUAGES,
647 COLUMN_SET_ID_ALWAYS_TRANSLATE,
648 COLUMN_SET_ID_BUTTONS,
649 };
650
651 views::ColumnSet* cs = layout->AddColumnSet(COLUMN_SET_ID_LANGUAGES);
652 cs->AddColumn(GridLayout::TRAILING, GridLayout::CENTER,
653 0, GridLayout::USE_PREF, 0, 0);
654 cs->AddPaddingColumn(0, views::kRelatedControlHorizontalSpacing);
655 cs->AddColumn(GridLayout::FILL, GridLayout::CENTER,
656 0, GridLayout::USE_PREF, 0, 0);
657 cs->AddPaddingColumn(1, 0);
658
659 if (!is_in_incognito_window_) {
660 cs = layout->AddColumnSet(COLUMN_SET_ID_ALWAYS_TRANSLATE);
661 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER,
662 0, GridLayout::USE_PREF, 0, 0);
663 cs->AddPaddingColumn(1, 0);
664 }
665
666 cs = layout->AddColumnSet(COLUMN_SET_ID_BUTTONS);
667 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER,
668 0, GridLayout::USE_PREF, 0, 0);
669 cs->AddPaddingColumn(1, views::kUnrelatedControlHorizontalSpacing);
670 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER,
671 0, GridLayout::USE_PREF, 0, 0);
672 cs->AddPaddingColumn(0, views::kRelatedButtonHSpacing);
673 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER,
674 0, GridLayout::USE_PREF, 0, 0);
675
676 layout->StartRow(0, COLUMN_SET_ID_LANGUAGES);
677 layout->AddView(source_language_label);
678 layout->AddView(source_language_combobox_);
679
680 layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
681
682 layout->StartRow(0, COLUMN_SET_ID_LANGUAGES);
683 layout->AddView(target_language_label);
684 layout->AddView(target_language_combobox_);
685
686 if (!is_in_incognito_window_) {
687 layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing);
688
689 layout->StartRow(0, COLUMN_SET_ID_ALWAYS_TRANSLATE);
690 layout->AddView(always_translate_checkbox_);
691 }
692
693 layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing);
694
695 layout->StartRow(0, COLUMN_SET_ID_BUTTONS);
696 layout->AddView(CreateLink(this,
697 IDS_TRANSLATE_BUBBLE_LEARN_MORE,
698 LINK_ID_LEARN_MORE));
699 views::LabelButton* cancel_button = CreateLabelButton(
700 this, l10n_util::GetStringUTF16(IDS_CANCEL), BUTTON_ID_CANCEL);
701 layout->AddView(cancel_button);
702 views::LabelButton* done_button = CreateLabelButton(
703 this, l10n_util::GetStringUTF16(IDS_DONE), BUTTON_ID_DONE);
704 done_button->SetIsDefault(true);
705 layout->AddView(done_button);
706
707 UpdateAdvancedView();
708
709 return view;
710 }
711
712 void TranslateBubbleView::SwitchView(TranslateBubbleModel::ViewType view_type) {
713 model_->SetViewType(view_type);
714 }
715
716 void TranslateBubbleView::UpdateAdvancedView() {
717 DCHECK(source_language_combobox_);
718 DCHECK(target_language_combobox_);
719
720 model_->SetOriginalLanguageIndex(
721 source_language_combobox_->selected_index());
722 model_->SetTargetLanguageIndex(
723 target_language_combobox_->selected_index());
724
725 string16 source_language_name =
726 model_->GetLanguageNameAt(model_->GetOriginalLanguageIndex());
727 string16 target_language_name =
728 model_->GetLanguageNameAt(model_->GetTargetLanguageIndex());
729
730 string16 message =
731 l10n_util::GetStringFUTF16(IDS_TRANSLATE_BUBBLE_ALWAYS,
732 source_language_name,
733 target_language_name);
734 // "Always translate" checkbox doesn't exist in an incognito window.
735 if (always_translate_checkbox_) {
736 always_translate_checkbox_->SetText(message);
737 always_translate_checkbox_->SetChecked(
738 model_->ShouldAlwaysTranslate());
739 }
740 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698