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

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

Issue 1923143003: Implement the 2016Q2 Translate UI designe spec out in (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: minor changes in comments Created 4 years, 7 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 2013 The Chromium Authors. All rights reserved. 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 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/ui/views/translate/translate_bubble_view.h" 5 #include "chrome/browser/ui/views/translate/translate_bubble_view.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <algorithm> 8 #include <algorithm>
9 #include <string> 9 #include <string>
10 #include <utility> 10 #include <utility>
11 #include <vector> 11 #include <vector>
12 12
13 #include "base/i18n/string_compare.h" 13 #include "base/i18n/string_compare.h"
14 #include "base/memory/singleton.h" 14 #include "base/memory/singleton.h"
15 #include "base/metrics/histogram.h" 15 #include "base/metrics/histogram.h"
16 #include "base/strings/utf_string_conversions.h" 16 #include "base/strings/utf_string_conversions.h"
17 #include "chrome/browser/browser_process.h" 17 #include "chrome/browser/browser_process.h"
18 #include "chrome/browser/profiles/profile.h" 18 #include "chrome/browser/profiles/profile.h"
19 #include "chrome/browser/translate/chrome_translate_client.h" 19 #include "chrome/browser/translate/chrome_translate_client.h"
20 #include "chrome/browser/translate/translate_service.h" 20 #include "chrome/browser/translate/translate_service.h"
21 #include "chrome/browser/ui/chrome_pages.h" 21 #include "chrome/browser/ui/chrome_pages.h"
22 #include "chrome/browser/ui/translate/translate_bubble_model_impl.h" 22 #include "chrome/browser/ui/translate/translate_bubble_model_impl.h"
23 #include "chrome/browser/ui/translate/translate_bubble_view_state_transition.h"
23 #include "chrome/common/url_constants.h" 24 #include "chrome/common/url_constants.h"
24 #include "chrome/grit/generated_resources.h" 25 #include "chrome/grit/generated_resources.h"
25 #include "components/prefs/pref_service.h" 26 #include "components/prefs/pref_service.h"
26 #include "components/translate/core/browser/translate_download_manager.h" 27 #include "components/translate/core/browser/translate_download_manager.h"
27 #include "components/translate/core/browser/translate_manager.h" 28 #include "components/translate/core/browser/translate_manager.h"
29 #include "components/translate/core/browser/translate_prefs.h"
28 #include "components/translate/core/browser/translate_ui_delegate.h" 30 #include "components/translate/core/browser/translate_ui_delegate.h"
29 #include "content/public/browser/web_contents.h" 31 #include "content/public/browser/web_contents.h"
30 #include "grit/components_strings.h" 32 #include "grit/components_strings.h"
33 #include "grit/ui_resources.h"
31 #include "ui/base/l10n/l10n_util.h" 34 #include "ui/base/l10n/l10n_util.h"
32 #include "ui/base/models/combobox_model.h" 35 #include "ui/base/models/combobox_model.h"
33 #include "ui/base/models/simple_combobox_model.h" 36 #include "ui/base/models/simple_combobox_model.h"
37 #include "ui/base/resource/resource_bundle.h"
38 #include "ui/views/bubble/bubble_frame_view.h"
39 #include "ui/views/controls/button/blue_button.h"
34 #include "ui/views/controls/button/checkbox.h" 40 #include "ui/views/controls/button/checkbox.h"
35 #include "ui/views/controls/button/label_button.h" 41 #include "ui/views/controls/button/label_button.h"
42 #include "ui/views/controls/button/menu_button.h"
36 #include "ui/views/controls/combobox/combobox.h" 43 #include "ui/views/controls/combobox/combobox.h"
37 #include "ui/views/controls/label.h" 44 #include "ui/views/controls/label.h"
38 #include "ui/views/controls/link.h" 45 #include "ui/views/controls/link.h"
46 #include "ui/views/controls/styled_label.h"
39 #include "ui/views/layout/box_layout.h" 47 #include "ui/views/layout/box_layout.h"
40 #include "ui/views/layout/grid_layout.h" 48 #include "ui/views/layout/grid_layout.h"
41 #include "ui/views/layout/layout_constants.h" 49 #include "ui/views/layout/layout_constants.h"
42 #include "ui/views/widget/widget.h" 50 #include "ui/views/widget/widget.h"
43 51
44 namespace { 52 namespace {
45 53
54 const char kTranslateBubbleUIEvent[] = "Translate.BubbleUiEvent";
55
56 views::LabelButton* CreateBlueButton(views::ButtonListener* listener,
57 const base::string16& label,
58 int id) {
59 views::LabelButton* button = new views::BlueButton(listener, label);
60 button->set_id(id);
61 return button;
62 }
63
46 views::LabelButton* CreateLabelButton(views::ButtonListener* listener, 64 views::LabelButton* CreateLabelButton(views::ButtonListener* listener,
47 const base::string16& label, 65 const base::string16& label,
48 int id) { 66 int id) {
49 views::LabelButton* button = new views::LabelButton(listener, label); 67 views::LabelButton* button = new views::LabelButton(listener, label);
50 button->set_id(id); 68 button->set_id(id);
51 button->SetStyle(views::Button::STYLE_BUTTON); 69 button->SetStyle(views::Button::STYLE_BUTTON);
52 return button; 70 return button;
53 } 71 }
54 72
55 views::Link* CreateLink(views::LinkListener* listener, 73 views::Link* CreateLink(views::LinkListener* listener,
74 const base::string16& text,
75 int id) {
76 views::Link* link = new views::Link(text);
77 link->set_listener(listener);
78 link->set_id(id);
79 return link;
80 }
81
82 views::Link* CreateLink(views::LinkListener* listener,
56 int resource_id, 83 int resource_id,
57 int id) { 84 int id) {
58 views::Link* link = new views::Link( 85 return CreateLink(listener, l10n_util::GetStringUTF16(resource_id), id);
59 l10n_util::GetStringUTF16(resource_id)); 86 }
60 link->set_listener(listener); 87
61 link->set_id(id); 88 void AddIconToLayout(views::GridLayout* layout) {
62 return link; 89 views::ImageView* icon = new views::ImageView();
90 ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
91 icon->SetImage(bundle.GetImageNamed(IDR_TRANSLATE_ICON_BUBBLE).ToImageSkia());
92 layout->AddView(icon);
93 }
94
95 bool Use2016Q2UI() {
96 return base::FeatureList::IsEnabled(translate::kTranslateUI2016Q2);
63 } 97 }
64 98
65 } // namespace 99 } // namespace
66 100
67 // static 101 // static
68 TranslateBubbleView* TranslateBubbleView::translate_bubble_view_ = NULL; 102 TranslateBubbleView* TranslateBubbleView::translate_bubble_view_ = NULL;
69 103
70 TranslateBubbleView::~TranslateBubbleView() { 104 TranslateBubbleView::~TranslateBubbleView() {
71 // A child view could refer to a model which is owned by this class when 105 // A child view could refer to a model which is owned by this class when
72 // the child view is destructed. For example, |source_language_combobx_model_| 106 // the child view is destructed. For example, |source_language_combobx_model_|
73 // is referred by Combobox's destructor. Before destroying the models, 107 // is referred by Combobox's destructor. Before destroying the models,
74 // removing the child views is needed. 108 // removing the child views is needed.
75 RemoveAllChildViews(true); 109 RemoveAllChildViews(true);
76 } 110 }
77 111
78 // static 112 // static
79 views::Widget* TranslateBubbleView::ShowBubble( 113 views::Widget* TranslateBubbleView::ShowBubble(
80 views::View* anchor_view, 114 views::View* anchor_view,
81 content::WebContents* web_contents, 115 content::WebContents* web_contents,
82 translate::TranslateStep step, 116 translate::TranslateStep step,
83 translate::TranslateErrors::Type error_type, 117 translate::TranslateErrors::Type error_type,
84 DisplayReason reason) { 118 DisplayReason reason) {
85 if (translate_bubble_view_) { 119 if (translate_bubble_view_) {
86 // When the user reads the advanced setting panel, the bubble should not be 120 // When the user reads the advanced setting panel, the bubble should not be
87 // changed because they are focusing on the bubble. 121 // changed because they are focusing on the bubble.
88 if (translate_bubble_view_->web_contents() == web_contents && 122 if (translate_bubble_view_->web_contents() == web_contents &&
89 translate_bubble_view_->model()->GetViewState() == 123 translate_bubble_view_->model()->GetViewState() ==
90 TranslateBubbleModel::VIEW_STATE_ADVANCED) { 124 TranslateBubbleModel::VIEW_STATE_ADVANCED) {
91 return nullptr; 125 return nullptr;
92 } 126 }
93 if (step != translate::TRANSLATE_STEP_TRANSLATE_ERROR) { 127 if (step != translate::TRANSLATE_STEP_TRANSLATE_ERROR) {
94 TranslateBubbleModel::ViewState state = 128 TranslateBubbleModel::ViewState state =
95 TranslateBubbleModelImpl::TranslateStepToViewState(step); 129 TranslateBubbleModelImpl::TranslateStepToViewState(step);
96 translate_bubble_view_->SwitchView(state); 130 translate_bubble_view_->SwitchView(state);
97 } else { 131 } else {
98 translate_bubble_view_->SwitchToErrorView(error_type); 132 translate_bubble_view_->SwitchToErrorView(error_type);
99 } 133 }
100 return nullptr; 134 return nullptr;
101 } else { 135 } else {
102 if (step == translate::TRANSLATE_STEP_AFTER_TRANSLATE && 136 if (step == translate::TRANSLATE_STEP_AFTER_TRANSLATE &&
103 reason == AUTOMATIC) { 137 reason == AUTOMATIC) {
104 return nullptr; 138 return nullptr;
105 } 139 }
106 } 140 }
107 141
108 std::string source_language; 142 std::string source_language;
109 std::string target_language; 143 std::string target_language;
110 ChromeTranslateClient::GetTranslateLanguages( 144 ChromeTranslateClient::GetTranslateLanguages(web_contents, &source_language,
111 web_contents, &source_language, &target_language); 145 &target_language);
112 146
113 std::unique_ptr<translate::TranslateUIDelegate> ui_delegate( 147 std::unique_ptr<translate::TranslateUIDelegate> ui_delegate(
114 new translate::TranslateUIDelegate( 148 new translate::TranslateUIDelegate(
115 ChromeTranslateClient::GetManagerFromWebContents(web_contents) 149 ChromeTranslateClient::GetManagerFromWebContents(web_contents)
116 ->GetWeakPtr(), 150 ->GetWeakPtr(),
117 source_language, target_language)); 151 source_language, target_language));
118 std::unique_ptr<TranslateBubbleModel> model( 152 std::unique_ptr<TranslateBubbleModel> model(
119 new TranslateBubbleModelImpl(step, std::move(ui_delegate))); 153 new TranslateBubbleModelImpl(step, std::move(ui_delegate)));
120 TranslateBubbleView* view = new TranslateBubbleView( 154 TranslateBubbleView* view = new TranslateBubbleView(
121 anchor_view, std::move(model), error_type, web_contents); 155 anchor_view, std::move(model), error_type, web_contents);
122 views::Widget* bubble_widget = 156 views::Widget* bubble_widget =
123 views::BubbleDialogDelegateView::CreateBubble(view); 157 views::BubbleDialogDelegateView::CreateBubble(view);
124 view->ShowForReason(reason); 158 view->ShowForReason(reason);
125 return bubble_widget; 159 return bubble_widget;
126 } 160 }
127 161
128 // static 162 // static
129 void TranslateBubbleView::CloseCurrentBubble() { 163 void TranslateBubbleView::CloseCurrentBubble() {
130 if (translate_bubble_view_) 164 if (translate_bubble_view_)
131 translate_bubble_view_->CloseBubble(); 165 translate_bubble_view_->CloseBubble();
132 } 166 }
133 167
134 // static 168 // static
135 TranslateBubbleView* TranslateBubbleView::GetCurrentBubble() { 169 TranslateBubbleView* TranslateBubbleView::GetCurrentBubble() {
136 return translate_bubble_view_; 170 return translate_bubble_view_;
137 } 171 }
138 172
139 void TranslateBubbleView::Init() { 173 void TranslateBubbleView::Init() {
140 SetLayoutManager(new views::BoxLayout(views::BoxLayout::kVertical, 174 SetLayoutManager(new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 0));
141 0, 0, 0));
142 175
143 before_translate_view_ = CreateViewBeforeTranslate(); 176 before_translate_view_ = CreateViewBeforeTranslate();
144 translating_view_ = CreateViewTranslating(); 177 translating_view_ = CreateViewTranslating();
145 after_translate_view_ = CreateViewAfterTranslate(); 178 after_translate_view_ = CreateViewAfterTranslate();
146 error_view_ = CreateViewError(); 179 error_view_ = CreateViewError();
147 advanced_view_ = CreateViewAdvanced(); 180 advanced_view_ = CreateViewAdvanced();
148 181
149 AddChildView(before_translate_view_); 182 AddChildView(before_translate_view_);
150 AddChildView(translating_view_); 183 AddChildView(translating_view_);
151 AddChildView(after_translate_view_); 184 AddChildView(after_translate_view_);
152 AddChildView(error_view_); 185 AddChildView(error_view_);
153 AddChildView(advanced_view_); 186 AddChildView(advanced_view_);
154 187
155 AddAccelerator(ui::Accelerator(ui::VKEY_RETURN, ui::EF_NONE)); 188 AddAccelerator(ui::Accelerator(ui::VKEY_RETURN, ui::EF_NONE));
156 189
157 UpdateChildVisibilities(); 190 UpdateChildVisibilities();
158 191
159 if (model_->GetViewState() == TranslateBubbleModel::VIEW_STATE_ERROR) 192 if (model_->GetViewState() == TranslateBubbleModel::VIEW_STATE_ERROR)
160 model_->ShowError(error_type_); 193 model_->ShowError(error_type_);
161 } 194 }
162 195
163 void TranslateBubbleView::ButtonPressed(views::Button* sender, 196 void TranslateBubbleView::ButtonPressed(views::Button* sender,
164 const ui::Event& event) { 197 const ui::Event& event) {
165 HandleButtonPressed(static_cast<ButtonID>(sender->id())); 198 HandleButtonPressed(static_cast<ButtonID>(sender->id()));
166 } 199 }
167 200
201 bool TranslateBubbleView::ShouldShowCloseButton() const {
202 return Use2016Q2UI();
203 }
204
168 void TranslateBubbleView::WindowClosing() { 205 void TranslateBubbleView::WindowClosing() {
169 // The operations for |model_| are valid only when a WebContents is alive. 206 // The operations for |model_| are valid only when a WebContents is alive.
170 // TODO(hajimehoshi): TranslateBubbleViewModel(Impl) should not hold a 207 // TODO(hajimehoshi): TranslateBubbleViewModel(Impl) should not hold a
171 // WebContents as a member variable because the WebContents might be destroyed 208 // WebContents as a member variable because the WebContents might be destroyed
172 // while the TranslateBubbleViewModel(Impl) is still alive. Instead, 209 // while the TranslateBubbleViewModel(Impl) is still alive. Instead,
173 // TranslateBubbleViewModel should take a reference of a WebContents at each 210 // TranslateBubbleViewModel should take a reference of a WebContents at each
174 // method. (crbug/320497) 211 // method. (crbug/320497)
175 if (web_contents()) 212 if (web_contents())
176 model_->OnBubbleClosing(); 213 model_->OnBubbleClosing();
177 214
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
225 } 262 }
226 263
227 void TranslateBubbleView::OnPerformAction(views::Combobox* combobox) { 264 void TranslateBubbleView::OnPerformAction(views::Combobox* combobox) {
228 HandleComboboxPerformAction(static_cast<ComboboxID>(combobox->id())); 265 HandleComboboxPerformAction(static_cast<ComboboxID>(combobox->id()));
229 } 266 }
230 267
231 void TranslateBubbleView::LinkClicked(views::Link* source, int event_flags) { 268 void TranslateBubbleView::LinkClicked(views::Link* source, int event_flags) {
232 HandleLinkClicked(static_cast<LinkID>(source->id())); 269 HandleLinkClicked(static_cast<LinkID>(source->id()));
233 } 270 }
234 271
272 void TranslateBubbleView::OnMenuButtonClicked(views::MenuButton* source,
273 const gfx::Point& point,
274 const ui::Event* event) {
275 if (!denial_menu_runner_) {
276 denial_menu_model_.reset(new ui::SimpleMenuModel(this));
277 denial_menu_model_->AddItem(
278 DenialMenuItem::NEVER_TRANSLATE_LANGUAGE,
279 l10n_util::GetStringFUTF16(
280 IDS_TRANSLATE_BUBBLE_NEVER_TRANSLATE_LANG,
281 model_->GetLanguageNameAt(model_->GetOriginalLanguageIndex())));
282
283 denial_menu_model_->AddSeparator(ui::NORMAL_SEPARATOR);
284
285 denial_menu_model_->AddItemWithStringId(
286 DenialMenuItem::NEVER_TRANSLATE_SITE,
287 IDS_TRANSLATE_BUBBLE_NEVER_TRANSLATE_SITE);
288
289 denial_menu_runner_.reset(
290 new views::MenuRunner(denial_menu_model_.get(), 0));
291 }
292 gfx::Rect screen_bounds = source->GetBoundsInScreen();
293 screen_bounds.Inset(source->GetInsets());
294 denial_menu_runner_->RunMenuAt(source->GetWidget(), source, screen_bounds,
295 views::MENU_ANCHOR_TOPRIGHT,
296 ui::MENU_SOURCE_MOUSE);
297 }
298
299 bool TranslateBubbleView::IsCommandIdChecked(int command_id) const {
300 return false;
301 }
302
303 bool TranslateBubbleView::IsCommandIdEnabled(int command_id) const {
304 return true;
305 }
306
307 bool TranslateBubbleView::GetAcceleratorForCommandId(
308 int command_id,
309 ui::Accelerator* accelerator) {
310 return false;
311 }
312
313 void TranslateBubbleView::ExecuteCommand(int command_id, int event_flags) {
314 model_->DeclineTranslation();
315 switch (command_id) {
316 case DenialMenuItem::NEVER_TRANSLATE_LANGUAGE:
317 model_->SetNeverTranslateLanguage(true);
318 ReportUiAction(translate::NEVER_TRANSLATE_LANGUAGE_MENU_CLICKED);
319 break;
320 case DenialMenuItem::NEVER_TRANSLATE_SITE:
321 model_->SetNeverTranslateSite(true);
322 ReportUiAction(translate::NEVER_TRANSLATE_SITE_MENU_CLICKED);
323 break;
324 default:
325 NOTREACHED();
326 }
327 GetWidget()->Close();
328 }
329
330 void TranslateBubbleView::StyledLabelLinkClicked(views::StyledLabel* label,
331 const gfx::Range& range,
332 int event_flags) {
333 SwitchView(TranslateBubbleModel::VIEW_STATE_ADVANCED);
334 ReportUiAction(translate::ADVANCED_LINK_CLICKED);
335 }
336
235 void TranslateBubbleView::WebContentsDestroyed() { 337 void TranslateBubbleView::WebContentsDestroyed() {
236 GetWidget()->CloseNow(); 338 GetWidget()->CloseNow();
237 } 339 }
238 340
341 void TranslateBubbleView::OnWidgetClosing(views::Widget* widget) {
342 if (GetBubbleFrameView()->close_button_clicked()) {
343 model_->DeclineTranslation();
344 ReportUiAction(translate::CLOSE_BUTTON_CLICKED);
345 }
346 }
347
239 TranslateBubbleModel::ViewState TranslateBubbleView::GetViewState() const { 348 TranslateBubbleModel::ViewState TranslateBubbleView::GetViewState() const {
240 return model_->GetViewState(); 349 return model_->GetViewState();
241 } 350 }
242 351
243 TranslateBubbleView::TranslateBubbleView( 352 TranslateBubbleView::TranslateBubbleView(
244 views::View* anchor_view, 353 views::View* anchor_view,
245 std::unique_ptr<TranslateBubbleModel> model, 354 std::unique_ptr<TranslateBubbleModel> model,
246 translate::TranslateErrors::Type error_type, 355 translate::TranslateErrors::Type error_type,
247 content::WebContents* web_contents) 356 content::WebContents* web_contents)
248 : LocationBarBubbleDelegateView(anchor_view, web_contents), 357 : LocationBarBubbleDelegateView(anchor_view, web_contents),
249 WebContentsObserver(web_contents), 358 WebContentsObserver(web_contents),
250 before_translate_view_(NULL), 359 before_translate_view_(NULL),
251 translating_view_(NULL), 360 translating_view_(NULL),
252 after_translate_view_(NULL), 361 after_translate_view_(NULL),
253 error_view_(NULL), 362 error_view_(NULL),
254 advanced_view_(NULL), 363 advanced_view_(NULL),
255 denial_combobox_(NULL), 364 denial_combobox_(NULL),
256 source_language_combobox_(NULL), 365 source_language_combobox_(NULL),
257 target_language_combobox_(NULL), 366 target_language_combobox_(NULL),
258 always_translate_checkbox_(NULL), 367 always_translate_checkbox_(NULL),
259 advanced_cancel_button_(NULL), 368 advanced_cancel_button_(NULL),
260 advanced_done_button_(NULL), 369 advanced_done_button_(NULL),
370 denial_menu_button_(NULL),
261 model_(std::move(model)), 371 model_(std::move(model)),
262 error_type_(error_type), 372 error_type_(error_type),
263 is_in_incognito_window_( 373 is_in_incognito_window_(
264 web_contents && web_contents->GetBrowserContext()->IsOffTheRecord()) { 374 web_contents && web_contents->GetBrowserContext()->IsOffTheRecord()) {
265 translate_bubble_view_ = this; 375 translate_bubble_view_ = this;
266 } 376 }
267 377
268 views::View* TranslateBubbleView::GetCurrentView() const { 378 views::View* TranslateBubbleView::GetCurrentView() const {
269 switch (model_->GetViewState()) { 379 switch (model_->GetViewState()) {
270 case TranslateBubbleModel::VIEW_STATE_BEFORE_TRANSLATE: 380 case TranslateBubbleModel::VIEW_STATE_BEFORE_TRANSLATE:
271 return before_translate_view_; 381 return before_translate_view_;
272 case TranslateBubbleModel::VIEW_STATE_TRANSLATING: 382 case TranslateBubbleModel::VIEW_STATE_TRANSLATING:
273 return translating_view_; 383 return translating_view_;
274 case TranslateBubbleModel::VIEW_STATE_AFTER_TRANSLATE: 384 case TranslateBubbleModel::VIEW_STATE_AFTER_TRANSLATE:
275 return after_translate_view_; 385 return after_translate_view_;
276 case TranslateBubbleModel::VIEW_STATE_ERROR: 386 case TranslateBubbleModel::VIEW_STATE_ERROR:
277 return error_view_; 387 return error_view_;
278 case TranslateBubbleModel::VIEW_STATE_ADVANCED: 388 case TranslateBubbleModel::VIEW_STATE_ADVANCED:
279 return advanced_view_; 389 return advanced_view_;
280 } 390 }
281 NOTREACHED(); 391 NOTREACHED();
282 return NULL; 392 return NULL;
283 } 393 }
284 394
285 void TranslateBubbleView::HandleButtonPressed( 395 void TranslateBubbleView::HandleButtonPressed(
286 TranslateBubbleView::ButtonID sender_id) { 396 TranslateBubbleView::ButtonID sender_id) {
287 switch (sender_id) { 397 switch (sender_id) {
288 case BUTTON_ID_TRANSLATE: { 398 case BUTTON_ID_TRANSLATE: {
289 model_->Translate(); 399 model_->Translate();
400 ReportUiAction(translate::TRANSLATE_BUTTON_CLICKED);
290 break; 401 break;
291 } 402 }
292 case BUTTON_ID_DONE: { 403 case BUTTON_ID_DONE: {
293 if (always_translate_checkbox_) 404 if (always_translate_checkbox_)
294 model_->SetAlwaysTranslate(always_translate_checkbox_->checked()); 405 model_->SetAlwaysTranslate(always_translate_checkbox_->checked());
295 if (model_->IsPageTranslatedInCurrentLanguages()) { 406 if (model_->IsPageTranslatedInCurrentLanguages()) {
296 model_->GoBackFromAdvanced(); 407 model_->GoBackFromAdvanced();
297 UpdateChildVisibilities(); 408 UpdateChildVisibilities();
298 SizeToContents(); 409 SizeToContents();
299 } else { 410 } else {
300 model_->Translate(); 411 model_->Translate();
301 SwitchView(TranslateBubbleModel::VIEW_STATE_TRANSLATING); 412 SwitchView(TranslateBubbleModel::VIEW_STATE_TRANSLATING);
302 } 413 }
414 ReportUiAction(translate::DONE_BUTTON_CLICKED);
303 break; 415 break;
304 } 416 }
305 case BUTTON_ID_CANCEL: { 417 case BUTTON_ID_CANCEL: {
306 model_->GoBackFromAdvanced(); 418 model_->GoBackFromAdvanced();
307 UpdateChildVisibilities(); 419 UpdateChildVisibilities();
308 SizeToContents(); 420 SizeToContents();
421 ReportUiAction(translate::CANCEL_BUTTON_CLICKED);
309 break; 422 break;
310 } 423 }
311 case BUTTON_ID_TRY_AGAIN: { 424 case BUTTON_ID_TRY_AGAIN: {
312 model_->Translate(); 425 model_->Translate();
426 ReportUiAction(translate::TRY_AGAIN_BUTTON_CLICKED);
313 break; 427 break;
314 } 428 }
315 case BUTTON_ID_SHOW_ORIGINAL: { 429 case BUTTON_ID_SHOW_ORIGINAL: {
316 model_->RevertTranslation(); 430 model_->RevertTranslation();
317 GetWidget()->Close(); 431 GetWidget()->Close();
432 ReportUiAction(translate::SHOW_ORIGINAL_BUTTON_CLICKED);
318 break; 433 break;
319 } 434 }
320 case BUTTON_ID_ALWAYS_TRANSLATE: { 435 case BUTTON_ID_ALWAYS_TRANSLATE: {
321 // Do nothing. The state of the checkbox affects only when the 'Done' 436 // Do nothing. The state of the checkbox affects only when the 'Done'
322 // button is pressed. 437 // button is pressed.
438 ReportUiAction(always_translate_checkbox_->checked()
439 ? translate::ALWAYS_TRANSLATE_CHECKED
440 : translate::ALWAYS_TRANSLATE_UNCHECKED);
323 break; 441 break;
324 } 442 }
325 } 443 }
326 } 444 }
327 445
328 void TranslateBubbleView::HandleLinkClicked( 446 void TranslateBubbleView::HandleLinkClicked(
329 TranslateBubbleView::LinkID sender_id) { 447 TranslateBubbleView::LinkID sender_id) {
330 switch (sender_id) { 448 switch (sender_id) {
331 case LINK_ID_ADVANCED: { 449 case LINK_ID_ADVANCED: {
332 SwitchView(TranslateBubbleModel::VIEW_STATE_ADVANCED); 450 SwitchView(TranslateBubbleModel::VIEW_STATE_ADVANCED);
451 ReportUiAction(translate::ADVANCED_LINK_CLICKED);
333 break; 452 break;
334 } 453 }
335 case LINK_ID_LANGUAGE_SETTINGS: { 454 case LINK_ID_LANGUAGE_SETTINGS: {
336 GURL url = chrome::GetSettingsUrl(chrome::kLanguageOptionsSubPage); 455 GURL url = chrome::GetSettingsUrl(chrome::kLanguageOptionsSubPage);
337 web_contents()->OpenURL(content::OpenURLParams( 456 web_contents()->OpenURL(
338 url, 457 content::OpenURLParams(url, content::Referrer(), NEW_FOREGROUND_TAB,
339 content::Referrer(), 458 ui::PAGE_TRANSITION_LINK, false));
340 NEW_FOREGROUND_TAB, 459 ReportUiAction(translate::SETTINGS_LINK_CLICKED);
341 ui::PAGE_TRANSITION_LINK,
342 false));
343 break; 460 break;
344 } 461 }
345 } 462 }
346 } 463 }
347 464
348 void TranslateBubbleView::HandleComboboxPerformAction( 465 void TranslateBubbleView::HandleComboboxPerformAction(
349 TranslateBubbleView::ComboboxID sender_id) { 466 TranslateBubbleView::ComboboxID sender_id) {
350 switch (sender_id) { 467 switch (sender_id) {
351 case COMBOBOX_ID_DENIAL: { 468 case COMBOBOX_ID_DENIAL: {
352 model_->DeclineTranslation(); 469 model_->DeclineTranslation();
353 DenialComboboxIndex index = 470 DenialComboboxIndex index =
354 static_cast<DenialComboboxIndex>(denial_combobox_->selected_index()); 471 static_cast<DenialComboboxIndex>(denial_combobox_->selected_index());
355 switch (index) { 472 switch (index) {
356 case DenialComboboxIndex::DONT_TRANSLATE: 473 case DenialComboboxIndex::DONT_TRANSLATE:
474 ReportUiAction(translate::NOPE_MENU_CLICKED);
357 break; 475 break;
358 case DenialComboboxIndex::NEVER_TRANSLATE_LANGUAGE: 476 case DenialComboboxIndex::NEVER_TRANSLATE_LANGUAGE:
359 model_->SetNeverTranslateLanguage(true); 477 model_->SetNeverTranslateLanguage(true);
478 ReportUiAction(translate::NEVER_TRANSLATE_LANGUAGE_MENU_CLICKED);
360 break; 479 break;
361 case DenialComboboxIndex::NEVER_TRANSLATE_SITE: 480 case DenialComboboxIndex::NEVER_TRANSLATE_SITE:
362 model_->SetNeverTranslateSite(true); 481 model_->SetNeverTranslateSite(true);
482 ReportUiAction(translate::NEVER_TRANSLATE_SITE_MENU_CLICKED);
363 break; 483 break;
364 default: 484 default:
365 NOTREACHED(); 485 NOTREACHED();
366 break; 486 break;
367 } 487 }
368 GetWidget()->Close(); 488 GetWidget()->Close();
369 break; 489 break;
370 } 490 }
371 case COMBOBOX_ID_SOURCE_LANGUAGE: { 491 case COMBOBOX_ID_SOURCE_LANGUAGE: {
372 if (model_->GetOriginalLanguageIndex() == 492 if (model_->GetOriginalLanguageIndex() ==
373 source_language_combobox_->selected_index()) { 493 source_language_combobox_->selected_index()) {
374 break; 494 break;
375 } 495 }
376 model_->UpdateOriginalLanguageIndex( 496 model_->UpdateOriginalLanguageIndex(
377 source_language_combobox_->selected_index()); 497 source_language_combobox_->selected_index());
378 UpdateAdvancedView(); 498 UpdateAdvancedView();
499 ReportUiAction(translate::SOURCE_LANGUAGE_MENU_CLICKED);
379 break; 500 break;
380 } 501 }
381 case COMBOBOX_ID_TARGET_LANGUAGE: { 502 case COMBOBOX_ID_TARGET_LANGUAGE: {
382 if (model_->GetTargetLanguageIndex() == 503 if (model_->GetTargetLanguageIndex() ==
383 target_language_combobox_->selected_index()) { 504 target_language_combobox_->selected_index()) {
384 break; 505 break;
385 } 506 }
386 model_->UpdateTargetLanguageIndex( 507 model_->UpdateTargetLanguageIndex(
387 target_language_combobox_->selected_index()); 508 target_language_combobox_->selected_index());
388 UpdateAdvancedView(); 509 UpdateAdvancedView();
510 ReportUiAction(translate::TARGET_LANGUAGE_MENU_CLICKED);
389 break; 511 break;
390 } 512 }
391 } 513 }
392 } 514 }
393 515
394 void TranslateBubbleView::UpdateChildVisibilities() { 516 void TranslateBubbleView::UpdateChildVisibilities() {
395 for (int i = 0; i < child_count(); i++) { 517 for (int i = 0; i < child_count(); i++) {
396 views::View* view = child_at(i); 518 views::View* view = child_at(i);
397 view->SetVisible(view == GetCurrentView()); 519 view->SetVisible(view == GetCurrentView());
398 } 520 }
399 } 521 }
400 522
401 views::View* TranslateBubbleView::CreateViewBeforeTranslate() { 523 views::View* TranslateBubbleView::CreateViewBeforeTranslate() {
402 views::Label* message_label = new views::Label( 524 const int kQuestionWidth = 200;
403 l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_BEFORE_TRANSLATE));
404
405 base::string16 original_language_name = 525 base::string16 original_language_name =
406 model_->GetLanguageNameAt(model_->GetOriginalLanguageIndex()); 526 model_->GetLanguageNameAt(model_->GetOriginalLanguageIndex());
407 527
408 std::vector<base::string16> items(
409 static_cast<size_t>(DenialComboboxIndex::MENU_SIZE));
410 items[static_cast<size_t>(DenialComboboxIndex::DONT_TRANSLATE)] =
411 l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_DENY);
412 items[static_cast<size_t>(DenialComboboxIndex::NEVER_TRANSLATE_LANGUAGE)] =
413 l10n_util::GetStringFUTF16(IDS_TRANSLATE_BUBBLE_NEVER_TRANSLATE_LANG,
414 original_language_name);
415 items[static_cast<size_t>(DenialComboboxIndex::NEVER_TRANSLATE_SITE)] =
416 l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_NEVER_TRANSLATE_SITE);
417
418 denial_combobox_model_.reset(new ui::SimpleComboboxModel(items));
419 denial_combobox_ = new views::Combobox(denial_combobox_model_.get());
420 denial_combobox_->set_id(COMBOBOX_ID_DENIAL);
421 denial_combobox_->set_listener(this);
422 denial_combobox_->SetStyle(views::Combobox::STYLE_ACTION);
423
424 views::View* view = new views::View(); 528 views::View* view = new views::View();
425 views::GridLayout* layout = new views::GridLayout(view); 529 views::GridLayout* layout = new views::GridLayout(view);
426 view->SetLayoutManager(layout); 530 view->SetLayoutManager(layout);
427 531
428 using views::GridLayout; 532 using views::GridLayout;
429 533
430 enum { 534 enum {
431 COLUMN_SET_ID_MESSAGE, 535 COLUMN_SET_ID_MESSAGE,
432 COLUMN_SET_ID_CONTENT, 536 COLUMN_SET_ID_CONTENT,
433 }; 537 };
434 538
435 views::ColumnSet* cs = layout->AddColumnSet(COLUMN_SET_ID_MESSAGE); 539 views::ColumnSet* cs = layout->AddColumnSet(COLUMN_SET_ID_MESSAGE);
436 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 540 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 0,
437 0, GridLayout::USE_PREF, 0, 0); 541 GridLayout::USE_PREF, 0, 0);
438 cs->AddPaddingColumn(0, views::kRelatedButtonHSpacing); 542 cs->AddPaddingColumn(0, views::kRelatedButtonHSpacing);
439 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 543 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 0,
440 0, GridLayout::USE_PREF, 0, 0); 544 GridLayout::USE_PREF, 0, 0);
441 cs->AddPaddingColumn(1, 0); 545 cs->AddPaddingColumn(1, 0);
442 546
443 cs = layout->AddColumnSet(COLUMN_SET_ID_CONTENT); 547 cs = layout->AddColumnSet(COLUMN_SET_ID_CONTENT);
444 cs->AddPaddingColumn(1, 0); 548 cs->AddPaddingColumn(1, 0);
445 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 549 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 0,
446 0, GridLayout::USE_PREF, 0, 0); 550 GridLayout::USE_PREF, 0, 0);
447 cs->AddPaddingColumn(0, views::kRelatedButtonHSpacing); 551 cs->AddPaddingColumn(0, views::kRelatedButtonHSpacing);
448 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 552 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 0,
449 0, GridLayout::USE_PREF, 0, 0); 553 GridLayout::USE_PREF, 0, 0);
450 554
451 layout->StartRow(0, COLUMN_SET_ID_MESSAGE); 555 layout->StartRow(0, COLUMN_SET_ID_MESSAGE);
452 layout->AddView(message_label); 556 if (Use2016Q2UI()) {
453 layout->AddView(CreateLink(this, 557 AddIconToLayout(layout);
454 IDS_TRANSLATE_BUBBLE_ADVANCED,
455 LINK_ID_ADVANCED));
456 558
559 base::string16 target_language_name =
560 model_->GetLanguageNameAt(model_->GetTargetLanguageIndex());
561 std::vector<size_t> offsets;
562 auto styled_label = new views::StyledLabel(
563 l10n_util::GetStringFUTF16(IDS_TRANSLATE_BUBBLE_BEFORE_TRANSLATE_NEW,
564 original_language_name, target_language_name,
565 &offsets),
566 this);
567 auto style_info = views::StyledLabel::RangeStyleInfo::CreateForLink();
568 styled_label->AddStyleRange(
569 gfx::Range(static_cast<uint32_t>(offsets[0]),
570 static_cast<uint32_t>(offsets[0] +
571 original_language_name.length())),
572 style_info);
573 styled_label->AddStyleRange(
574 gfx::Range(
575 static_cast<uint32_t>(offsets[1]),
576 static_cast<uint32_t>(offsets[1] + target_language_name.length())),
577 style_info);
578 styled_label->SizeToFit(kQuestionWidth);
579 layout->AddView(styled_label);
580 } else {
581 layout->AddView(new views::Label(
582 l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_BEFORE_TRANSLATE)));
583 layout->AddView(
584 CreateLink(this, IDS_TRANSLATE_BUBBLE_ADVANCED, LINK_ID_ADVANCED));
585 }
586
587 // In an incognito window, the "Always translate" checkbox shouldn't be shown.
588 if (Use2016Q2UI() && !is_in_incognito_window_) {
589 layout->StartRow(0, COLUMN_SET_ID_MESSAGE);
590 layout->SkipColumns(1);
591 always_translate_checkbox_ = new views::Checkbox(
592 l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_ALWAYS));
593 always_translate_checkbox_->SetChecked(
594 model_->ShouldAlwaysTranslateBeCheckedByDefault());
595 always_translate_checkbox_->set_id(BUTTON_ID_ALWAYS_TRANSLATE);
596 always_translate_checkbox_->set_listener(this);
597 layout->AddView(always_translate_checkbox_);
598 }
457 layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing); 599 layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing);
458 600
459 layout->StartRow(0, COLUMN_SET_ID_CONTENT); 601 layout->StartRow(0, COLUMN_SET_ID_CONTENT);
460 views::LabelButton* accept_button = CreateLabelButton( 602 views::LabelButton* accept_button =
461 this, 603 Use2016Q2UI()
462 l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_ACCEPT), 604 ? CreateBlueButton(
463 BUTTON_ID_TRANSLATE); 605 this, l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_ACCEPT),
606 BUTTON_ID_TRANSLATE)
607 : CreateLabelButton(
608 this, l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_ACCEPT),
609 BUTTON_ID_TRANSLATE);
464 layout->AddView(accept_button); 610 layout->AddView(accept_button);
465 accept_button->SetIsDefault(true); 611 accept_button->SetIsDefault(true);
466 layout->AddView(denial_combobox_); 612 if (Use2016Q2UI()) {
613 denial_menu_button_ = new views::MenuButton(
614 l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_OPTIONS_MENU_BUTTON),
615 this, true);
616 denial_menu_button_->SetStyle(views::Button::STYLE_BUTTON);
617 layout->AddView(denial_menu_button_);
618 } else {
619 std::vector<base::string16> items(
620 static_cast<size_t>(DenialComboboxIndex::MENU_SIZE));
621 items[static_cast<size_t>(DenialComboboxIndex::DONT_TRANSLATE)] =
622 l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_DENY);
623 items[static_cast<size_t>(DenialComboboxIndex::NEVER_TRANSLATE_LANGUAGE)] =
624 l10n_util::GetStringFUTF16(IDS_TRANSLATE_BUBBLE_NEVER_TRANSLATE_LANG,
625 original_language_name);
626 items[static_cast<size_t>(DenialComboboxIndex::NEVER_TRANSLATE_SITE)] =
627 l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_NEVER_TRANSLATE_SITE);
628 denial_combobox_model_.reset(new ui::SimpleComboboxModel(items));
629 denial_combobox_ = new views::Combobox(denial_combobox_model_.get());
630 denial_combobox_->set_id(COMBOBOX_ID_DENIAL);
631 denial_combobox_->set_listener(this);
632 denial_combobox_->SetStyle(views::Combobox::STYLE_ACTION);
633 layout->AddView(denial_combobox_);
634 }
467 635
468 return view; 636 return view;
469 } 637 }
470 638
471 views::View* TranslateBubbleView::CreateViewTranslating() { 639 views::View* TranslateBubbleView::CreateViewTranslating() {
472 base::string16 target_language_name = 640 base::string16 target_language_name =
473 model_->GetLanguageNameAt(model_->GetTargetLanguageIndex()); 641 model_->GetLanguageNameAt(model_->GetTargetLanguageIndex());
474 views::Label* label = new views::Label( 642 views::Label* label = new views::Label(
475 l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_TRANSLATING)); 643 l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_TRANSLATING));
476 644
477 views::View* view = new views::View(); 645 views::View* view = new views::View();
478 views::GridLayout* layout = new views::GridLayout(view); 646 views::GridLayout* layout = new views::GridLayout(view);
479 view->SetLayoutManager(layout); 647 view->SetLayoutManager(layout);
480 648
481 using views::GridLayout; 649 using views::GridLayout;
482 650
483 enum { 651 enum {
484 COLUMN_SET_ID_MESSAGE, 652 COLUMN_SET_ID_MESSAGE,
485 COLUMN_SET_ID_CONTENT, 653 COLUMN_SET_ID_CONTENT,
486 }; 654 };
487 655
488 views::ColumnSet* cs = layout->AddColumnSet(COLUMN_SET_ID_MESSAGE); 656 views::ColumnSet* cs = layout->AddColumnSet(COLUMN_SET_ID_MESSAGE);
489 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 657 if (Use2016Q2UI()) {
490 0, views::GridLayout::USE_PREF, 0, 0); 658 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 0,
659 views::GridLayout::USE_PREF, 0, 0);
660 cs->AddPaddingColumn(0, views::kRelatedButtonHSpacing);
661 }
662 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 0,
663 GridLayout::USE_PREF, 0, 0);
491 cs->AddPaddingColumn(1, 0); 664 cs->AddPaddingColumn(1, 0);
492 665
493 cs = layout->AddColumnSet(COLUMN_SET_ID_CONTENT); 666 cs = layout->AddColumnSet(COLUMN_SET_ID_CONTENT);
494 cs->AddPaddingColumn(1, 0); 667 cs->AddPaddingColumn(1, 0);
495 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 668 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 0,
496 0, GridLayout::USE_PREF, 0, 0); 669 GridLayout::USE_PREF, 0, 0);
497 670
498 layout->StartRow(0, COLUMN_SET_ID_MESSAGE); 671 layout->StartRow(0, COLUMN_SET_ID_MESSAGE);
672 if (Use2016Q2UI())
673 AddIconToLayout(layout);
499 layout->AddView(label); 674 layout->AddView(label);
500 675
501 layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing); 676 layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing);
502 677
503 layout->StartRow(0, COLUMN_SET_ID_CONTENT); 678 layout->StartRow(0, COLUMN_SET_ID_CONTENT);
504 views::LabelButton* revert_button = CreateLabelButton( 679 views::LabelButton* revert_button = CreateLabelButton(
505 this, 680 this, l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_REVERT),
506 l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_REVERT),
507 BUTTON_ID_SHOW_ORIGINAL); 681 BUTTON_ID_SHOW_ORIGINAL);
508 revert_button->SetEnabled(false); 682 revert_button->SetEnabled(false);
509 layout->AddView(revert_button); 683 layout->AddView(revert_button);
510 684
511 return view; 685 return view;
512 } 686 }
513 687
514 views::View* TranslateBubbleView::CreateViewAfterTranslate() { 688 views::View* TranslateBubbleView::CreateViewAfterTranslate() {
515 views::Label* label = new views::Label( 689 views::Label* label = new views::Label(
516 l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_TRANSLATED)); 690 l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_TRANSLATED));
517 691
518 views::View* view = new views::View(); 692 views::View* view = new views::View();
519 views::GridLayout* layout = new views::GridLayout(view); 693 views::GridLayout* layout = new views::GridLayout(view);
520 view->SetLayoutManager(layout); 694 view->SetLayoutManager(layout);
521 695
522 using views::GridLayout; 696 using views::GridLayout;
523 697
524 enum { 698 enum {
525 COLUMN_SET_ID_MESSAGE, 699 COLUMN_SET_ID_MESSAGE,
526 COLUMN_SET_ID_CONTENT, 700 COLUMN_SET_ID_CONTENT,
527 }; 701 };
528 702
529 views::ColumnSet* cs = layout->AddColumnSet(COLUMN_SET_ID_MESSAGE); 703 views::ColumnSet* cs = layout->AddColumnSet(COLUMN_SET_ID_MESSAGE);
530 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 704 if (Use2016Q2UI()) {
531 0, views::GridLayout::USE_PREF, 0, 0); 705 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 0,
706 GridLayout::USE_PREF, 0, 0);
707 cs->AddPaddingColumn(0, views::kRelatedButtonHSpacing);
708 }
709 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 0,
710 GridLayout::USE_PREF, 0, 0);
532 cs->AddPaddingColumn(0, views::kRelatedButtonHSpacing); 711 cs->AddPaddingColumn(0, views::kRelatedButtonHSpacing);
533 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 712 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 0,
534 0, views::GridLayout::USE_PREF, 0, 0); 713 GridLayout::USE_PREF, 0, 0);
535 cs->AddPaddingColumn(1, 0); 714 cs->AddPaddingColumn(1, 0);
536 715
537 cs = layout->AddColumnSet(COLUMN_SET_ID_CONTENT); 716 cs = layout->AddColumnSet(COLUMN_SET_ID_CONTENT);
538 cs->AddPaddingColumn(1, 0); 717 cs->AddPaddingColumn(1, 0);
539 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 718 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 0,
540 0, GridLayout::USE_PREF, 0, 0); 719 GridLayout::USE_PREF, 0, 0);
541 720
542 layout->StartRow(0, COLUMN_SET_ID_MESSAGE); 721 layout->StartRow(0, COLUMN_SET_ID_MESSAGE);
722 if (Use2016Q2UI())
723 AddIconToLayout(layout);
543 layout->AddView(label); 724 layout->AddView(label);
544 layout->AddView(CreateLink(this, 725 layout->AddView(
545 IDS_TRANSLATE_BUBBLE_ADVANCED, 726 CreateLink(this, IDS_TRANSLATE_BUBBLE_ADVANCED, LINK_ID_ADVANCED));
546 LINK_ID_ADVANCED));
547 727
548 layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing); 728 layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing);
549 729
550 layout->StartRow(0, COLUMN_SET_ID_CONTENT); 730 layout->StartRow(0, COLUMN_SET_ID_CONTENT);
551 layout->AddView(CreateLabelButton( 731 layout->AddView(CreateLabelButton(
552 this, 732 this, l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_REVERT),
553 l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_REVERT),
554 BUTTON_ID_SHOW_ORIGINAL)); 733 BUTTON_ID_SHOW_ORIGINAL));
555 734
556 return view; 735 return view;
557 } 736 }
558 737
559 views::View* TranslateBubbleView::CreateViewError() { 738 views::View* TranslateBubbleView::CreateViewError() {
560 views::Label* label = new views::Label( 739 views::Label* label = new views::Label(
561 l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_COULD_NOT_TRANSLATE)); 740 l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_COULD_NOT_TRANSLATE));
562 741
563 views::View* view = new views::View(); 742 views::View* view = new views::View();
564 views::GridLayout* layout = new views::GridLayout(view); 743 views::GridLayout* layout = new views::GridLayout(view);
565 view->SetLayoutManager(layout); 744 view->SetLayoutManager(layout);
566 745
567 using views::GridLayout; 746 using views::GridLayout;
568 747
569 enum { 748 enum {
570 COLUMN_SET_ID_MESSAGE, 749 COLUMN_SET_ID_MESSAGE,
571 COLUMN_SET_ID_CONTENT, 750 COLUMN_SET_ID_CONTENT,
572 }; 751 };
573 752
574 views::ColumnSet* cs = layout->AddColumnSet(COLUMN_SET_ID_MESSAGE); 753 views::ColumnSet* cs = layout->AddColumnSet(COLUMN_SET_ID_MESSAGE);
575 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 754 if (Use2016Q2UI()) {
576 0, GridLayout::USE_PREF, 0, 0); 755 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 0,
756 GridLayout::USE_PREF, 0, 0);
757 cs->AddPaddingColumn(0, views::kRelatedButtonHSpacing);
758 }
759 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 0,
760 GridLayout::USE_PREF, 0, 0);
577 cs->AddPaddingColumn(0, views::kRelatedButtonHSpacing); 761 cs->AddPaddingColumn(0, views::kRelatedButtonHSpacing);
578 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 762 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 0,
579 0, GridLayout::USE_PREF, 0, 0); 763 GridLayout::USE_PREF, 0, 0);
580 cs->AddPaddingColumn(1, 0); 764 cs->AddPaddingColumn(1, 0);
581 765
582 cs = layout->AddColumnSet(COLUMN_SET_ID_CONTENT); 766 cs = layout->AddColumnSet(COLUMN_SET_ID_CONTENT);
583 cs->AddPaddingColumn(1, 0); 767 cs->AddPaddingColumn(1, 0);
584 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 768 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 0,
585 0, GridLayout::USE_PREF, 0, 0); 769 GridLayout::USE_PREF, 0, 0);
586 770
587 layout->StartRow(0, COLUMN_SET_ID_MESSAGE); 771 layout->StartRow(0, COLUMN_SET_ID_MESSAGE);
772 if (Use2016Q2UI())
773 AddIconToLayout(layout);
588 layout->AddView(label); 774 layout->AddView(label);
589 layout->AddView(CreateLink(this, 775 layout->AddView(
590 IDS_TRANSLATE_BUBBLE_ADVANCED, 776 CreateLink(this, IDS_TRANSLATE_BUBBLE_ADVANCED, LINK_ID_ADVANCED));
591 LINK_ID_ADVANCED));
592 777
593 layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing); 778 layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing);
594 779
595 layout->StartRow(0, COLUMN_SET_ID_CONTENT); 780 layout->StartRow(0, COLUMN_SET_ID_CONTENT);
596 layout->AddView(CreateLabelButton( 781 layout->AddView(CreateLabelButton(
597 this, 782 this, l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_TRY_AGAIN),
598 l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_TRY_AGAIN),
599 BUTTON_ID_TRY_AGAIN)); 783 BUTTON_ID_TRY_AGAIN));
600 784
601 return view; 785 return view;
602 } 786 }
603 787
604 // TODO(hajimehoshi): Revice this later to show a specific message for each 788 // TODO(hajimehoshi): Revice this later to show a specific message for each
605 // error. (crbug/307350) 789 // error. (crbug/307350)
606 views::View* TranslateBubbleView::CreateViewAdvanced() { 790 views::View* TranslateBubbleView::CreateViewAdvanced() {
607 views::Label* source_language_label = new views::Label( 791 views::Label* source_language_label = new views::Label(
608 l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_PAGE_LANGUAGE)); 792 l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_PAGE_LANGUAGE));
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
640 view->SetLayoutManager(layout); 824 view->SetLayoutManager(layout);
641 825
642 using views::GridLayout; 826 using views::GridLayout;
643 827
644 enum { 828 enum {
645 COLUMN_SET_ID_LANGUAGES, 829 COLUMN_SET_ID_LANGUAGES,
646 COLUMN_SET_ID_BUTTONS, 830 COLUMN_SET_ID_BUTTONS,
647 }; 831 };
648 832
649 views::ColumnSet* cs = layout->AddColumnSet(COLUMN_SET_ID_LANGUAGES); 833 views::ColumnSet* cs = layout->AddColumnSet(COLUMN_SET_ID_LANGUAGES);
650 cs->AddColumn(GridLayout::TRAILING, GridLayout::CENTER, 834 cs->AddColumn(GridLayout::TRAILING, GridLayout::CENTER, 0,
651 0, GridLayout::USE_PREF, 0, 0); 835 GridLayout::USE_PREF, 0, 0);
652 cs->AddPaddingColumn(0, views::kRelatedControlHorizontalSpacing); 836 cs->AddPaddingColumn(0, views::kRelatedControlHorizontalSpacing);
653 cs->AddColumn(GridLayout::FILL, GridLayout::CENTER, 837 cs->AddColumn(GridLayout::FILL, GridLayout::CENTER, 0, GridLayout::USE_PREF,
654 0, GridLayout::USE_PREF, 0, 0); 838 0, 0);
655 cs->AddPaddingColumn(1, 0); 839 cs->AddPaddingColumn(1, 0);
656 840
657 cs = layout->AddColumnSet(COLUMN_SET_ID_BUTTONS); 841 cs = layout->AddColumnSet(COLUMN_SET_ID_BUTTONS);
658 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 842 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 0,
659 0, GridLayout::USE_PREF, 0, 0); 843 GridLayout::USE_PREF, 0, 0);
660 cs->AddPaddingColumn(1, views::kUnrelatedControlHorizontalSpacing); 844 cs->AddPaddingColumn(1, views::kUnrelatedControlHorizontalSpacing);
661 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 845 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 0,
662 0, GridLayout::USE_PREF, 0, 0); 846 GridLayout::USE_PREF, 0, 0);
663 cs->AddPaddingColumn(0, views::kRelatedButtonHSpacing); 847 cs->AddPaddingColumn(0, views::kRelatedButtonHSpacing);
664 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 848 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 0,
665 0, GridLayout::USE_PREF, 0, 0); 849 GridLayout::USE_PREF, 0, 0);
666 850
667 layout->StartRow(0, COLUMN_SET_ID_LANGUAGES); 851 layout->StartRow(0, COLUMN_SET_ID_LANGUAGES);
668 layout->AddView(source_language_label); 852 layout->AddView(source_language_label);
669 layout->AddView(source_language_combobox_); 853 layout->AddView(source_language_combobox_);
670 854
671 layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); 855 layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
672 856
673 layout->StartRow(0, COLUMN_SET_ID_LANGUAGES); 857 layout->StartRow(0, COLUMN_SET_ID_LANGUAGES);
674 layout->AddView(target_language_label); 858 layout->AddView(target_language_label);
675 layout->AddView(target_language_combobox_); 859 layout->AddView(target_language_combobox_);
676 860
677 if (!is_in_incognito_window_) { 861 if (!is_in_incognito_window_) {
678 layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); 862 layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
679 layout->StartRow(0, COLUMN_SET_ID_LANGUAGES); 863 layout->StartRow(0, COLUMN_SET_ID_LANGUAGES);
680 layout->SkipColumns(1); 864 layout->SkipColumns(1);
681 layout->AddView(always_translate_checkbox_); 865 layout->AddView(always_translate_checkbox_);
682 } 866 }
683 867
684 layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing); 868 layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing);
685 869
686 layout->StartRow(0, COLUMN_SET_ID_BUTTONS); 870 layout->StartRow(0, COLUMN_SET_ID_BUTTONS);
687 layout->AddView(CreateLink(this, 871 layout->AddView(CreateLink(this, IDS_TRANSLATE_BUBBLE_LANGUAGE_SETTINGS,
688 IDS_TRANSLATE_BUBBLE_LANGUAGE_SETTINGS,
689 LINK_ID_LANGUAGE_SETTINGS)); 872 LINK_ID_LANGUAGE_SETTINGS));
690 advanced_done_button_ = CreateLabelButton( 873 advanced_done_button_ =
691 this, l10n_util::GetStringUTF16(IDS_DONE), BUTTON_ID_DONE); 874 Use2016Q2UI()
875 ? CreateBlueButton(this, l10n_util::GetStringUTF16(IDS_DONE),
876 BUTTON_ID_DONE)
877 : CreateLabelButton(this, l10n_util::GetStringUTF16(IDS_DONE),
878 BUTTON_ID_DONE);
692 advanced_done_button_->SetIsDefault(true); 879 advanced_done_button_->SetIsDefault(true);
693 advanced_cancel_button_ = CreateLabelButton( 880 advanced_cancel_button_ = CreateLabelButton(
694 this, l10n_util::GetStringUTF16(IDS_CANCEL), BUTTON_ID_CANCEL); 881 this, l10n_util::GetStringUTF16(IDS_CANCEL), BUTTON_ID_CANCEL);
695 layout->AddView(advanced_done_button_); 882 layout->AddView(advanced_done_button_);
696 layout->AddView(advanced_cancel_button_); 883 layout->AddView(advanced_cancel_button_);
697 884
698 UpdateAdvancedView(); 885 UpdateAdvancedView();
699 886
700 return view; 887 return view;
701 } 888 }
(...skipping 25 matching lines...) Expand all
727 base::string16 source_language_name = 914 base::string16 source_language_name =
728 model_->GetLanguageNameAt(model_->GetOriginalLanguageIndex()); 915 model_->GetLanguageNameAt(model_->GetOriginalLanguageIndex());
729 base::string16 target_language_name = 916 base::string16 target_language_name =
730 model_->GetLanguageNameAt(model_->GetTargetLanguageIndex()); 917 model_->GetLanguageNameAt(model_->GetTargetLanguageIndex());
731 918
732 // "Always translate" checkbox doesn't exist in an incognito window. 919 // "Always translate" checkbox doesn't exist in an incognito window.
733 if (always_translate_checkbox_) { 920 if (always_translate_checkbox_) {
734 always_translate_checkbox_->SetText( 921 always_translate_checkbox_->SetText(
735 l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_ALWAYS)); 922 l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_ALWAYS));
736 always_translate_checkbox_->SetChecked( 923 always_translate_checkbox_->SetChecked(
737 model_->ShouldAlwaysTranslate()); 924 Use2016Q2UI() ? model_->ShouldAlwaysTranslateBeCheckedByDefault()
925 : model_->ShouldAlwaysTranslate());
738 } 926 }
739 927
740 base::string16 label; 928 base::string16 label;
741 if (model_->IsPageTranslatedInCurrentLanguages()) 929 if (model_->IsPageTranslatedInCurrentLanguages())
742 label = l10n_util::GetStringUTF16(IDS_DONE); 930 label = l10n_util::GetStringUTF16(IDS_DONE);
743 else 931 else
744 label = l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_ACCEPT); 932 label = l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_ACCEPT);
745 advanced_done_button_->SetText(label); 933 advanced_done_button_->SetText(label);
746 advanced_done_button_->SizeToPreferredSize(); 934 advanced_done_button_->SizeToPreferredSize();
747 if (advanced_view_) 935 if (advanced_view_)
748 advanced_view_->Layout(); 936 advanced_view_->Layout();
749 } 937 }
938
939 void TranslateBubbleView::ReportUiAction(
940 translate::TranslateBubbleUiEvent action) {
941 UMA_HISTOGRAM_ENUMERATION(kTranslateBubbleUIEvent, action,
942 translate::TRANSLATE_BUBBLE_UI_EVENT_MAX);
943 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698