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

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: Remove translate_bubble_model.cc 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);
sky 2013/10/16 14:32:36 nit: indent 2 more
hajimehoshi 2013/10/17 05:45:42 Done.
67 if (!translate_tab_helper)
sky 2013/10/16 14:32:36 If there is no translate helper should this code e
hajimehoshi 2013/10/17 05:45:42 Right. Simply removed this.
68 return;
69
70 *source = translate_tab_helper->language_state().original_language();
71 *target = g_browser_process->GetApplicationLocale();
72 *target = TranslateManager::GetLanguageCode(*target);
sky 2013/10/16 14:32:36 nit: make this one line and have TM::GetLanguageCo
hajimehoshi 2013/10/17 05:45:42 Done.
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);
sky 2013/10/16 14:32:36 items_[index]?
hajimehoshi 2013/10/17 05:45:42 Done.
105 }
106 virtual bool IsItemSeparatorAt(int index) OVERRIDE {
107 return items_.at(index).empty();
sky 2013/10/16 14:32:36 items_[index]?
hajimehoshi 2013/10/17 05:45:42 Done.
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_;
sky 2013/10/16 14:32:36 Style guide says statics have: // static on previo
hajimehoshi 2013/10/17 05:45:42 Done.
124
125 // static
126 void TranslateBubbleView::ShowBubble(views::View* anchor_view,
127 content::WebContents* web_contents,
128 TranslateBubbleModel::ViewState 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 if (model_->GetViewState() != TranslateBubbleModel::BEFORE_TRANSLATE)
171 translate_executed_ = true;
172
173 set_margins(gfx::Insets(views::kPanelVertMargin, views::kPanelHorizMargin,
174 views::kPanelVertMargin, views::kPanelHorizMargin));
175
176 translate_bubble_view_ = this;
177 }
178
179 TranslateBubbleView::~TranslateBubbleView() {
180 // A child view could refer to a model which is owned by this class when
181 // the child view is destructed. For example, |source_language_combobx_model_|
182 // is referred by Combobox's destructor. Before destroying the models,
183 // removing the child views is needed.
184 RemoveAllChildViews(true);
185 }
186
187 void TranslateBubbleView::Init() {
188 SetLayoutManager(new views::BoxLayout(views::BoxLayout::kVertical,
189 0, 0, 0));
190 AddChildViewAt(CreateViewBeforeTranslate(),
191 TranslateBubbleModel::BEFORE_TRANSLATE);
192 AddChildViewAt(CreateViewTranslating(),
193 TranslateBubbleModel::TRANSLATING);
194 AddChildViewAt(CreateViewAfterTranslate(),
195 TranslateBubbleModel::AFTER_TRANSLATE);
196 AddChildViewAt(CreateViewError(),
197 TranslateBubbleModel::ERROR);
198 AddChildViewAt(CreateViewAdvanced(),
199 TranslateBubbleModel::ADVANCED);
200
201 AddAccelerator(ui::Accelerator(ui::VKEY_RETURN, ui::EF_NONE));
202
203 UpdateChildVisibilities();
204 }
205
206 void TranslateBubbleView::ButtonPressed(views::Button* sender,
207 const ui::Event& event) {
208 HandleButtonPressed(static_cast<ButtonID>(sender->id()));
209 }
210
211 void TranslateBubbleView::WindowClosing() {
212 if (!translate_executed_)
213 model_->TranslationDeclined();
214
215 // We have to reset |translate_bubble_view_| here, not in our destructor,
216 // because we'll be destroyed asynchronously and the shown state will be
217 // checked before then.
218 DCHECK_EQ(translate_bubble_view_, this);
219 translate_bubble_view_ = NULL;
220 }
221
222 bool TranslateBubbleView::AcceleratorPressed(
223 const ui::Accelerator& accelerator) {
224 switch (model_->GetViewState()) {
225 case TranslateBubbleModel::BEFORE_TRANSLATE: {
226 if (accelerator.key_code() == ui::VKEY_RETURN) {
227 HandleButtonPressed(BUTTON_ID_TRANSLATE);
228 return true;
229 }
230 break;
231 }
232 case TranslateBubbleModel::TRANSLATING:
233 break;
234 case TranslateBubbleModel::AFTER_TRANSLATE: {
235 if (accelerator.key_code() == ui::VKEY_RETURN) {
236 HandleButtonPressed(BUTTON_ID_SHOW_ORIGINAL);
237 return true;
238 }
239 break;
240 }
241 case TranslateBubbleModel::ERROR:
242 break;
243 case TranslateBubbleModel::ADVANCED: {
244 if (accelerator.key_code() == ui::VKEY_RETURN) {
245 HandleButtonPressed(BUTTON_ID_DONE);
246 return true;
247 }
248 break;
249 }
250 default:
sky 2013/10/16 14:32:36 Can this be removed?
hajimehoshi 2013/10/17 05:45:42 Done.
251 NOTREACHED();
252 break;
253 }
254 return BubbleDelegateView::AcceleratorPressed(accelerator);
255 }
256
257 gfx::Size TranslateBubbleView::GetPreferredSize() {
258 int width = 0;
259 for (int i = 0; i < child_count(); i++) {
260 views::View* child = child_at(i);
261 width = std::max(width, child->GetPreferredSize().width());
262 }
263 int height = child_at(model_->GetViewState())->GetPreferredSize().height();
sky 2013/10/16 14:32:36 Assuming a particular view order is fragile. Can y
hajimehoshi 2013/10/17 05:45:42 Done.
264 return gfx::Size(width, height);
265 }
266
267 void TranslateBubbleView::OnSelectedIndexChanged(views::Combobox* combobox) {
268 switch (static_cast<ComboboxID>(combobox->id())) {
269 case COMBOBOX_ID_DENIAL: {
270 int index = combobox->selected_index();
271 switch (index) {
272 case TranslateDenialComboboxModel::INDEX_NOPE:
273 if (!translate_executed_)
274 model_->TranslationDeclined();
275 StartFade(false);
276 break;
277 case TranslateDenialComboboxModel::INDEX_NEVER_TRANSLATE_LANGUAGE:
278 model_->SetNeverTranslateLanguage(true);
279 StartFade(false);
280 break;
281 case TranslateDenialComboboxModel::INDEX_NEVER_TRANSLATE_SITE:
282 model_->SetNeverTranslateSite(true);
283 StartFade(false);
284 break;
285 default:
286 NOTREACHED();
287 break;
288 }
289 break;
290 }
291 case COMBOBOX_ID_SOURCE_LANGUAGE: {
292 // TODO(hajimehoshi): This UMA should be counted at a model or a delegate
293 // not to dependent on platforms. However, this UMA has not been used at
294 // some platforms. See crbug/306365.
295 UMA_HISTOGRAM_BOOLEAN(kUMATranslateModifyOriginalLang, true);
296 UpdateAdvancedView();
297 break;
298 }
299 case COMBOBOX_ID_TARGET_LANGUAGE: {
300 // TODO(hajimehoshi): Ditto.
301 UMA_HISTOGRAM_BOOLEAN(kUMATranslateModifyTargetLang, true);
302 UpdateAdvancedView();
303 break;
304 }
305 default:
sky 2013/10/16 14:32:36 Same comment about removing.
hajimehoshi 2013/10/17 05:45:42 Done.
306 NOTREACHED();
307 break;
308 }
309 }
310
311 void TranslateBubbleView::LinkClicked(views::Link* source, int event_flags) {
312 HandleLinkClicked(static_cast<LinkID>(source->id()));
313 }
314
315 TranslateBubbleModel::ViewState TranslateBubbleView::GetViewState() const {
316 return model_->GetViewState();
317 }
318
319 void TranslateBubbleView::HandleButtonPressed(
320 TranslateBubbleView::ButtonID sender_id) {
321 switch (sender_id) {
322 case BUTTON_ID_TRANSLATE: {
323 translate_executed_ = true;
324 model_->Translate();
325 break;
326 }
327 case BUTTON_ID_DONE: {
328 translate_executed_ = true;
329 DCHECK(source_language_combobox_);
330 DCHECK(target_language_combobox_);
331
332 model_->SetOriginalLanguageIndex(
333 source_language_combobox_->selected_index());
334 model_->SetTargetLanguageIndex(
335 target_language_combobox_->selected_index());
336 model_->Translate();
337 break;
338 }
339 case BUTTON_ID_CANCEL: {
340 model_->GoBackFromAdvanced();
341 UpdateChildVisibilities();
342 SizeToContents();
343 break;
344 }
345 case BUTTON_ID_TRY_AGAIN: {
346 translate_executed_ = true;
347 model_->Translate();
348 break;
349 }
350 case BUTTON_ID_SHOW_ORIGINAL: {
351 model_->RevertTranslation();
352 StartFade(false);
353 break;
354 }
355 case BUTTON_ID_ALWAYS_TRANSLATE: {
356 DCHECK(always_translate_checkbox_);
357 model_->SetAlwaysTranslate(always_translate_checkbox_->checked());
358 UpdateAdvancedView();
359 break;
360 }
361 default:
sky 2013/10/16 14:32:36 Here and in all.
hajimehoshi 2013/10/17 05:45:42 Done.
362 NOTREACHED();
363 break;
364 }
365 }
366
367 void TranslateBubbleView::HandleLinkClicked(
368 TranslateBubbleView::LinkID 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_->GetViewState());
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(
713 TranslateBubbleModel::ViewState view_state) {
714 if (model_->GetViewState() == view_state)
715 return;
716
717 model_->SetViewState(view_state);
718 UpdateChildVisibilities();
719 SizeToContents();
720 }
721
722 void TranslateBubbleView::UpdateAdvancedView() {
723 DCHECK(source_language_combobox_);
724 DCHECK(target_language_combobox_);
725
726 model_->SetOriginalLanguageIndex(
727 source_language_combobox_->selected_index());
728 model_->SetTargetLanguageIndex(
729 target_language_combobox_->selected_index());
730
731 string16 source_language_name =
732 model_->GetLanguageNameAt(model_->GetOriginalLanguageIndex());
733 string16 target_language_name =
734 model_->GetLanguageNameAt(model_->GetTargetLanguageIndex());
735
736 string16 message =
737 l10n_util::GetStringFUTF16(IDS_TRANSLATE_BUBBLE_ALWAYS,
738 source_language_name,
739 target_language_name);
740 // "Always translate" checkbox doesn't exist in an incognito window.
741 if (always_translate_checkbox_) {
742 always_translate_checkbox_->SetText(message);
743 always_translate_checkbox_->SetChecked(
744 model_->ShouldAlwaysTranslate());
745 }
746 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698