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