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

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

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

Powered by Google App Engine
This is Rietveld 408576698