Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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/chooser_content_view.h" | 5 #include "chrome/browser/ui/views/chooser_content_view.h" |
| 6 | 6 |
| 7 #include "base/numerics/safe_conversions.h" | 7 #include "base/numerics/safe_conversions.h" |
| 8 #include "chrome/grit/generated_resources.h" | 8 #include "chrome/grit/generated_resources.h" |
| 9 #include "ui/base/l10n/l10n_util.h" | 9 #include "ui/base/l10n/l10n_util.h" |
| 10 #include "ui/base/resource/resource_bundle.h" | 10 #include "ui/base/resource/resource_bundle.h" |
| 11 #include "ui/gfx/color_palette.h" | 11 #include "ui/gfx/color_palette.h" |
| 12 #include "ui/gfx/geometry/point.h" | 12 #include "ui/gfx/geometry/point.h" |
| 13 #include "ui/gfx/geometry/rect.h" | 13 #include "ui/gfx/geometry/rect.h" |
| 14 #include "ui/gfx/image/image_skia.h" | 14 #include "ui/gfx/image/image_skia.h" |
| 15 #include "ui/gfx/paint_vector_icon.h" | 15 #include "ui/gfx/paint_vector_icon.h" |
| 16 #include "ui/gfx/vector_icons_public.h" | 16 #include "ui/gfx/vector_icons_public.h" |
| 17 #include "ui/resources/grit/ui_resources.h" | 17 #include "ui/resources/grit/ui_resources.h" |
| 18 #include "ui/views/controls/link.h" | |
| 19 #include "ui/views/controls/styled_label.h" | 18 #include "ui/views/controls/styled_label.h" |
| 20 #include "ui/views/controls/table/table_view.h" | 19 #include "ui/views/controls/table/table_view.h" |
| 21 #include "ui/views/controls/throbber.h" | 20 #include "ui/views/controls/throbber.h" |
| 21 #include "ui/views/widget/widget.h" | |
| 22 | 22 |
| 23 namespace { | 23 namespace { |
| 24 | 24 |
| 25 const int kChooserWidth = 330; | 25 const int kChooserWidth = 370; |
| 26 | 26 |
| 27 const int kChooserHeight = 220; | 27 const int kChooserHeight = 260; |
| 28 | 28 |
| 29 const int kThrobberDiameter = 24; | 29 const int kThrobberDiameter = 24; |
| 30 | 30 |
| 31 const int kAdapterOffHelpLinkPadding = 5; | 31 const int kAdapterOffHelpLinkPadding = 5; |
| 32 | 32 |
| 33 // The lookup table for signal strength level image. | 33 // The lookup table for signal strength level image. |
| 34 const int kSignalStrengthLevelImageIds[5] = {IDR_SIGNAL_0_BAR, IDR_SIGNAL_1_BAR, | 34 const int kSignalStrengthLevelImageIds[5] = {IDR_SIGNAL_0_BAR, IDR_SIGNAL_1_BAR, |
| 35 IDR_SIGNAL_2_BAR, IDR_SIGNAL_3_BAR, | 35 IDR_SIGNAL_2_BAR, IDR_SIGNAL_3_BAR, |
| 36 IDR_SIGNAL_4_BAR}; | 36 IDR_SIGNAL_4_BAR}; |
| 37 | 37 |
| 38 } // namespace | 38 } // namespace |
| 39 | 39 |
| 40 ChooserContentView::ChooserContentView( | 40 ChooserContentView::ChooserContentView( |
| 41 views::TableViewObserver* table_view_observer, | 41 views::TableViewObserver* table_view_observer, |
| 42 std::unique_ptr<ChooserController> chooser_controller) | 42 std::unique_ptr<ChooserController> chooser_controller) |
| 43 : chooser_controller_(std::move(chooser_controller)) { | 43 : chooser_controller_(std::move(chooser_controller)), |
| 44 help_text_(l10n_util::GetStringFUTF16( | |
| 45 IDS_DEVICE_CHOOSER_GET_HELP_LINK_WITH_SCANNING_STATUS, | |
| 46 base::string16())), | |
| 47 help_and_scanning_text_(l10n_util::GetStringFUTF16( | |
| 48 IDS_DEVICE_CHOOSER_GET_HELP_LINK_WITH_SCANNING_STATUS, | |
| 49 l10n_util::GetStringUTF16(IDS_BLUETOOTH_DEVICE_CHOOSER_SCANNING))) { | |
| 50 base::string16 re_scan_text = | |
| 51 l10n_util::GetStringUTF16(IDS_BLUETOOTH_DEVICE_CHOOSER_RE_SCAN); | |
| 52 std::vector<size_t> offsets; | |
| 53 help_and_re_scan_text_ = l10n_util::GetStringFUTF16( | |
| 54 IDS_DEVICE_CHOOSER_GET_HELP_LINK_WITH_RE_SCAN_LINK, help_text_, | |
| 55 re_scan_text, &offsets); | |
| 56 help_text_range_ = gfx::Range(offsets[0], offsets[0] + help_text_.size()); | |
| 57 re_scan_text_range_ = | |
| 58 gfx::Range(offsets[1], offsets[1] + re_scan_text.size()); | |
| 44 chooser_controller_->set_view(this); | 59 chooser_controller_->set_view(this); |
| 45 std::vector<ui::TableColumn> table_columns; | 60 std::vector<ui::TableColumn> table_columns; |
| 46 table_columns.push_back(ui::TableColumn()); | 61 table_columns.push_back(ui::TableColumn()); |
| 47 table_view_ = new views::TableView( | 62 table_view_ = new views::TableView( |
| 48 this, table_columns, | 63 this, table_columns, |
| 49 chooser_controller_->ShouldShowIconBeforeText() ? views::ICON_AND_TEXT | 64 chooser_controller_->ShouldShowIconBeforeText() ? views::ICON_AND_TEXT |
| 50 : views::TEXT_ONLY, | 65 : views::TEXT_ONLY, |
| 51 true /* single_selection */); | 66 true /* single_selection */); |
| 52 table_view_->set_select_on_remove(false); | 67 table_view_->set_select_on_remove(false); |
| 53 table_view_->SetObserver(table_view_observer); | 68 table_view_->SetObserver(table_view_observer); |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 70 gfx::Range(0, link_text.size()), | 85 gfx::Range(0, link_text.size()), |
| 71 views::StyledLabel::RangeStyleInfo::CreateForLink()); | 86 views::StyledLabel::RangeStyleInfo::CreateForLink()); |
| 72 turn_adapter_off_help_->SetVisible(false); | 87 turn_adapter_off_help_->SetVisible(false); |
| 73 AddChildView(turn_adapter_off_help_); | 88 AddChildView(turn_adapter_off_help_); |
| 74 } | 89 } |
| 75 | 90 |
| 76 ChooserContentView::~ChooserContentView() { | 91 ChooserContentView::~ChooserContentView() { |
| 77 chooser_controller_->set_view(nullptr); | 92 chooser_controller_->set_view(nullptr); |
| 78 table_view_->SetObserver(nullptr); | 93 table_view_->SetObserver(nullptr); |
| 79 table_view_->SetModel(nullptr); | 94 table_view_->SetModel(nullptr); |
| 80 if (discovery_state_) | |
| 81 discovery_state_->set_listener(nullptr); | |
| 82 } | 95 } |
| 83 | 96 |
| 84 gfx::Size ChooserContentView::GetPreferredSize() const { | 97 gfx::Size ChooserContentView::GetPreferredSize() const { |
| 85 return gfx::Size(kChooserWidth, kChooserHeight); | 98 return gfx::Size(kChooserWidth, kChooserHeight); |
| 86 } | 99 } |
| 87 | 100 |
| 88 void ChooserContentView::Layout() { | 101 void ChooserContentView::Layout() { |
| 89 gfx::Rect rect(GetContentsBounds()); | 102 gfx::Rect rect(GetContentsBounds()); |
| 90 table_parent_->SetBoundsRect(rect); | 103 table_parent_->SetBoundsRect(rect); |
| 91 // Set the throbber in the center of the chooser. | 104 // Set the throbber in the center of the chooser. |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 182 // This will also disable the OK button if it was enabled because | 195 // This will also disable the OK button if it was enabled because |
| 183 // of a previously selected row. | 196 // of a previously selected row. |
| 184 table_view_->Select(-1); | 197 table_view_->Select(-1); |
| 185 UpdateTableView(); | 198 UpdateTableView(); |
| 186 table_view_->SetVisible(enabled); | 199 table_view_->SetVisible(enabled); |
| 187 turn_adapter_off_help_->SetVisible(!enabled); | 200 turn_adapter_off_help_->SetVisible(!enabled); |
| 188 | 201 |
| 189 throbber_->Stop(); | 202 throbber_->Stop(); |
| 190 throbber_->SetVisible(false); | 203 throbber_->SetVisible(false); |
| 191 | 204 |
| 192 discovery_state_->SetText(chooser_controller_->GetStatus()); | 205 if (enabled) { |
| 193 discovery_state_->SetEnabled(enabled); | 206 SetGetHelpAndReScanLink(); |
| 207 } else { | |
| 208 footnote_link_->SetText(help_text_); | |
| 209 footnote_link_->AddStyleRange( | |
| 210 help_text_range_, views::StyledLabel::RangeStyleInfo::CreateForLink()); | |
| 211 } | |
| 212 | |
| 213 footnote_link_->GetWidget()->GetRootView()->Layout(); | |
|
sky
2016/11/03 22:33:52
You really don't need footnote_link_ here (and bel
juncai
2016/11/04 02:27:47
I tested it with a long string, and the widget has
| |
| 194 } | 214 } |
| 195 | 215 |
| 196 void ChooserContentView::OnRefreshStateChanged(bool refreshing) { | 216 void ChooserContentView::OnRefreshStateChanged(bool refreshing) { |
| 197 if (refreshing) { | 217 if (refreshing) { |
| 198 // No row is selected since the chooser is refreshing. This will also | 218 // No row is selected since the chooser is refreshing. This will also |
| 199 // disable the OK button if it was enabled because of a previously | 219 // disable the OK button if it was enabled because of a previously |
| 200 // selected row. | 220 // selected row. |
| 201 table_view_->Select(-1); | 221 table_view_->Select(-1); |
| 202 UpdateTableView(); | 222 UpdateTableView(); |
| 203 } | 223 } |
| 204 | 224 |
| 205 // When refreshing and no option available yet, hide |table_view_| and show | 225 // When refreshing and no option available yet, hide |table_view_| and show |
| 206 // |throbber_|. Otherwise show |table_view_| and hide |throbber_|. | 226 // |throbber_|. Otherwise show |table_view_| and hide |throbber_|. |
| 207 bool throbber_visible = | 227 bool throbber_visible = |
| 208 refreshing && (chooser_controller_->NumOptions() == 0); | 228 refreshing && (chooser_controller_->NumOptions() == 0); |
| 209 table_view_->SetVisible(!throbber_visible); | 229 table_view_->SetVisible(!throbber_visible); |
| 210 throbber_->SetVisible(throbber_visible); | 230 throbber_->SetVisible(throbber_visible); |
| 211 if (throbber_visible) | 231 if (throbber_visible) |
| 212 throbber_->Start(); | 232 throbber_->Start(); |
| 213 else | 233 else |
| 214 throbber_->Stop(); | 234 throbber_->Stop(); |
| 215 | 235 |
| 216 discovery_state_->SetText(chooser_controller_->GetStatus()); | 236 if (refreshing) { |
| 217 // When refreshing, disable |discovery_state_| to show it as a text label. | 237 footnote_link_->SetText(help_and_scanning_text_); |
| 218 // When complete, enable |discovery_state_| to show it as a link. | 238 footnote_link_->AddStyleRange( |
| 219 discovery_state_->SetEnabled(!refreshing); | 239 help_text_range_, views::StyledLabel::RangeStyleInfo::CreateForLink()); |
| 220 } | 240 } else { |
| 241 SetGetHelpAndReScanLink(); | |
| 242 } | |
| 221 | 243 |
| 222 void ChooserContentView::LinkClicked(views::Link* source, int event_flags) { | 244 footnote_link_->GetWidget()->GetRootView()->Layout(); |
| 223 if (source == discovery_state_) | |
| 224 chooser_controller_->RefreshOptions(); | |
| 225 else | |
| 226 NOTREACHED(); | |
| 227 } | 245 } |
| 228 | 246 |
| 229 void ChooserContentView::StyledLabelLinkClicked(views::StyledLabel* label, | 247 void ChooserContentView::StyledLabelLinkClicked(views::StyledLabel* label, |
| 230 const gfx::Range& range, | 248 const gfx::Range& range, |
| 231 int event_flags) { | 249 int event_flags) { |
| 232 if (label == turn_adapter_off_help_) | 250 if (label == turn_adapter_off_help_) { |
| 233 chooser_controller_->OpenAdapterOffHelpUrl(); | 251 chooser_controller_->OpenAdapterOffHelpUrl(); |
| 234 else if (label == help_link_) | 252 } else if (label == footnote_link_) { |
| 235 chooser_controller_->OpenHelpCenterUrl(); | 253 if (range == help_text_range_) |
| 236 else | 254 chooser_controller_->OpenHelpCenterUrl(); |
| 255 else if (range == re_scan_text_range_) | |
| 256 chooser_controller_->RefreshOptions(); | |
| 257 else | |
| 258 NOTREACHED(); | |
| 259 } else { | |
| 237 NOTREACHED(); | 260 NOTREACHED(); |
| 261 } | |
| 238 } | 262 } |
| 239 | 263 |
| 240 base::string16 ChooserContentView::GetWindowTitle() const { | 264 base::string16 ChooserContentView::GetWindowTitle() const { |
| 241 return chooser_controller_->GetTitle(); | 265 return chooser_controller_->GetTitle(); |
| 242 } | 266 } |
| 243 | 267 |
| 244 base::string16 ChooserContentView::GetDialogButtonLabel( | 268 base::string16 ChooserContentView::GetDialogButtonLabel( |
| 245 ui::DialogButton button) const { | 269 ui::DialogButton button) const { |
| 246 return button == ui::DIALOG_BUTTON_OK | 270 return button == ui::DIALOG_BUTTON_OK |
| 247 ? chooser_controller_->GetOkButtonLabel() | 271 ? chooser_controller_->GetOkButtonLabel() |
| 248 : l10n_util::GetStringUTF16(IDS_DEVICE_CHOOSER_CANCEL_BUTTON_TEXT); | 272 : l10n_util::GetStringUTF16(IDS_DEVICE_CHOOSER_CANCEL_BUTTON_TEXT); |
| 249 } | 273 } |
| 250 | 274 |
| 251 bool ChooserContentView::IsDialogButtonEnabled(ui::DialogButton button) const { | 275 bool ChooserContentView::IsDialogButtonEnabled(ui::DialogButton button) const { |
| 252 return button != ui::DIALOG_BUTTON_OK || | 276 return button != ui::DIALOG_BUTTON_OK || |
| 253 !table_view_->selection_model().empty(); | 277 !table_view_->selection_model().empty(); |
| 254 } | 278 } |
| 255 | 279 |
| 256 views::Link* ChooserContentView::CreateExtraView() { | |
| 257 discovery_state_ = new views::Link(chooser_controller_->GetStatus()); | |
| 258 discovery_state_->SetHandlesTooltips(false); | |
| 259 discovery_state_->SetUnderline(false); | |
| 260 discovery_state_->SetMultiLine(true); | |
| 261 discovery_state_->SizeToFit(kChooserWidth / 2); | |
| 262 discovery_state_->SetHorizontalAlignment(gfx::ALIGN_LEFT); | |
| 263 discovery_state_->set_listener(this); | |
| 264 return discovery_state_; | |
| 265 } | |
| 266 | |
| 267 views::StyledLabel* ChooserContentView::CreateFootnoteView() { | 280 views::StyledLabel* ChooserContentView::CreateFootnoteView() { |
| 268 base::string16 link = | 281 footnote_link_ = new views::StyledLabel(help_text_, this); |
| 269 l10n_util::GetStringUTF16(IDS_DEVICE_CHOOSER_GET_HELP_LINK_TEXT); | 282 footnote_link_->AddStyleRange( |
| 270 size_t offset = 0; | 283 help_text_range_, views::StyledLabel::RangeStyleInfo::CreateForLink()); |
| 271 base::string16 text = l10n_util::GetStringFUTF16( | 284 return footnote_link_; |
| 272 IDS_DEVICE_CHOOSER_FOOTNOTE_TEXT, link, &offset); | |
| 273 help_link_ = new views::StyledLabel(text, this); | |
| 274 help_link_->AddStyleRange( | |
| 275 gfx::Range(offset, offset + link.length()), | |
| 276 views::StyledLabel::RangeStyleInfo::CreateForLink()); | |
| 277 return help_link_; | |
| 278 } | 285 } |
| 279 | 286 |
| 280 void ChooserContentView::Accept() { | 287 void ChooserContentView::Accept() { |
| 281 chooser_controller_->Select(table_view_->selection_model().active()); | 288 chooser_controller_->Select(table_view_->selection_model().active()); |
| 282 } | 289 } |
| 283 | 290 |
| 284 void ChooserContentView::Cancel() { | 291 void ChooserContentView::Cancel() { |
| 285 chooser_controller_->Cancel(); | 292 chooser_controller_->Cancel(); |
| 286 } | 293 } |
| 287 | 294 |
| 288 void ChooserContentView::Close() { | 295 void ChooserContentView::Close() { |
| 289 chooser_controller_->Close(); | 296 chooser_controller_->Close(); |
| 290 } | 297 } |
| 291 | 298 |
| 292 void ChooserContentView::UpdateTableView() { | 299 void ChooserContentView::UpdateTableView() { |
| 293 if (chooser_controller_->NumOptions() == 0) { | 300 if (chooser_controller_->NumOptions() == 0) { |
| 294 table_view_->OnModelChanged(); | 301 table_view_->OnModelChanged(); |
| 295 table_view_->SetEnabled(false); | 302 table_view_->SetEnabled(false); |
| 296 } else { | 303 } else { |
| 297 table_view_->SetEnabled(true); | 304 table_view_->SetEnabled(true); |
| 298 } | 305 } |
| 299 } | 306 } |
| 307 | |
| 308 void ChooserContentView::SetGetHelpAndReScanLink() { | |
| 309 footnote_link_->SetText(help_and_re_scan_text_); | |
| 310 footnote_link_->AddStyleRange( | |
| 311 help_text_range_, views::StyledLabel::RangeStyleInfo::CreateForLink()); | |
| 312 footnote_link_->AddStyleRange( | |
| 313 re_scan_text_range_, views::StyledLabel::RangeStyleInfo::CreateForLink()); | |
| 314 } | |
| OLD | NEW |