Chromium Code Reviews| Index: chrome/browser/ui/views/chooser_content_view.cc |
| diff --git a/chrome/browser/ui/views/chooser_content_view.cc b/chrome/browser/ui/views/chooser_content_view.cc |
| index 24b0e25489da46e501a1e28a8c4d6ea38be7739b..3b5b05b6f0dba7554e349f55b958b6fbd0ad6a3a 100644 |
| --- a/chrome/browser/ui/views/chooser_content_view.cc |
| +++ b/chrome/browser/ui/views/chooser_content_view.cc |
| @@ -4,71 +4,74 @@ |
| #include "chrome/browser/ui/views/chooser_content_view.h" |
| -#include "chrome/browser/chooser_controller/chooser_controller.h" |
| #include "chrome/grit/generated_resources.h" |
| #include "ui/base/l10n/l10n_util.h" |
| -#include "ui/base/models/table_model.h" |
| +#include "ui/views/controls/link.h" |
| #include "ui/views/controls/styled_label.h" |
| #include "ui/views/controls/table/table_view.h" |
| -#include "ui/views/controls/table/table_view_observer.h" |
| -#include "ui/views/layout/box_layout.h" |
| -#include "ui/views/layout/layout_constants.h" |
| +#include "ui/views/controls/throbber.h" |
| +#include "ui/views/layout/fill_layout.h" |
| namespace { |
| -const int kChooserWidth = 300; |
| +const int kChooserWidth = 330; |
| -const int kChooserHeight = 200; |
| +const int kChooserHeight = 220; |
| -} // namespace |
| - |
| -class ChooserTableModel : public ui::TableModel, |
| - public ChooserController::Observer { |
| - public: |
| - explicit ChooserTableModel(ChooserController* chooser_controller); |
| - ~ChooserTableModel() override; |
| - |
| - // ui::TableModel: |
| - int RowCount() override; |
| - base::string16 GetText(int row, int column_id) override; |
| - void SetObserver(ui::TableModelObserver* observer) override; |
| - |
| - // ChooserController::Observer: |
| - void OnOptionsInitialized() override; |
| - void OnOptionAdded(size_t index) override; |
| - void OnOptionRemoved(size_t index) override; |
| +const int kThrobberDiameter = 50; |
| - void Update(); |
| - void ChooserControllerDestroying(); |
| +} // namespace |
| - private: |
| - ui::TableModelObserver* observer_; |
| - ChooserController* chooser_controller_; |
| +ChooserContentView::ChooserContentView( |
| + views::TableViewObserver* table_view_observer, |
| + std::unique_ptr<ChooserController> chooser_controller) |
| + : chooser_controller_(std::move(chooser_controller)) { |
| + chooser_controller_->set_observer(this); |
| + std::vector<ui::TableColumn> table_columns; |
| + table_columns.push_back(ui::TableColumn()); |
| + table_view_ = |
| + new views::TableView(this, table_columns, views::TEXT_ONLY, true); |
| + table_view_->set_select_on_remove(false); |
| + table_view_->SetObserver(table_view_observer); |
| + table_view_->SetEnabled(chooser_controller_->NumOptions() > 0); |
| - DISALLOW_COPY_AND_ASSIGN(ChooserTableModel); |
| -}; |
| + views::FillLayout* layout = new views::FillLayout(); |
| + SetLayoutManager(layout); |
|
msw
2016/07/18 23:01:31
nit: inline |new views::FillLayout()| here; |layou
juncai
2016/07/19 20:42:46
Done.
|
| + views::View* table_parent = table_view_->CreateParentIfNecessary(); |
| + AddChildView(table_parent); |
| -ChooserTableModel::ChooserTableModel(ChooserController* chooser_controller) |
| - : observer_(nullptr), chooser_controller_(chooser_controller) { |
| - chooser_controller_->set_observer(this); |
| + throbber_ = new views::Throbber(); |
| + // Set the throbber in the center of the chooser rectangular. |
|
msw
2016/07/18 23:01:30
nit: 'rectangle' or just "in the center of the cho
juncai
2016/07/19 20:42:46
Done.
|
| + throbber_->SetBounds((kChooserWidth - kThrobberDiameter) / 2, |
| + (kChooserHeight - kThrobberDiameter) / 2, |
| + kThrobberDiameter, kThrobberDiameter); |
| + throbber_->SetVisible(false); |
| + AddChildView(throbber_); |
| } |
| -ChooserTableModel::~ChooserTableModel() { |
| +ChooserContentView::~ChooserContentView() { |
| chooser_controller_->set_observer(nullptr); |
| + table_view_->SetObserver(nullptr); |
| + table_view_->SetModel(nullptr); |
| + if (discovery_state_) |
| + discovery_state_->set_listener(nullptr); |
| } |
| -int ChooserTableModel::RowCount() { |
| +gfx::Size ChooserContentView::GetPreferredSize() const { |
| + return gfx::Size(kChooserWidth, kChooserHeight); |
| +} |
| + |
| +int ChooserContentView::RowCount() { |
| // When there are no devices, the table contains a message saying there |
| // are no devices, so the number of rows is always at least 1. |
| return std::max(static_cast<int>(chooser_controller_->NumOptions()), 1); |
| } |
| -base::string16 ChooserTableModel::GetText(int row, int column_id) { |
| +base::string16 ChooserContentView::GetText(int row, int column_id) { |
| int num_options = static_cast<int>(chooser_controller_->NumOptions()); |
| if (num_options == 0) { |
| DCHECK_EQ(0, row); |
| - return l10n_util::GetStringUTF16( |
| - IDS_DEVICE_CHOOSER_NO_DEVICES_FOUND_PROMPT); |
| + return chooser_controller_->GetNoOptionsText(); |
| } |
| DCHECK_GE(row, 0); |
| @@ -76,71 +79,71 @@ base::string16 ChooserTableModel::GetText(int row, int column_id) { |
| return chooser_controller_->GetOption(static_cast<size_t>(row)); |
| } |
| -void ChooserTableModel::SetObserver(ui::TableModelObserver* observer) { |
| - observer_ = observer; |
| -} |
| +void ChooserContentView::SetObserver(ui::TableModelObserver* observer) {} |
| -void ChooserTableModel::OnOptionsInitialized() { |
| - if (observer_) { |
| - observer_->OnModelChanged(); |
| - Update(); |
| - } |
| +void ChooserContentView::OnOptionsInitialized() { |
| + table_view_->OnModelChanged(); |
| + UpdateTableView(); |
| } |
| -void ChooserTableModel::OnOptionAdded(size_t index) { |
| - if (observer_) { |
| - observer_->OnItemsAdded(static_cast<int>(index), 1); |
| - Update(); |
| - } |
| +void ChooserContentView::OnOptionAdded(size_t index) { |
| + table_view_->OnItemsAdded(static_cast<int>(index), 1); |
| + UpdateTableView(); |
| } |
| -void ChooserTableModel::OnOptionRemoved(size_t index) { |
| - if (observer_) { |
| - observer_->OnItemsRemoved(static_cast<int>(index), 1); |
| - Update(); |
| - } |
| +void ChooserContentView::OnOptionRemoved(size_t index) { |
| + table_view_->OnItemsRemoved(static_cast<int>(index), 1); |
| + UpdateTableView(); |
| } |
| -void ChooserTableModel::Update() { |
| - views::TableView* table_view = static_cast<views::TableView*>(observer_); |
| +void ChooserContentView::AdapterEnabled(bool enabled) { |
| + // No row is selected since the adapter status is changed. |
|
msw
2016/07/18 23:01:30
nit: "has changed"
juncai
2016/07/19 20:42:46
Done.
|
| + // This will also disable the OK button if it is enabled because |
|
msw
2016/07/18 23:01:30
nit: "if it was"
juncai
2016/07/19 20:42:46
Done.
|
| + // of previously selected row. |
|
msw
2016/07/18 23:01:30
nit: "a previously"
juncai
2016/07/19 20:42:46
Done.
|
| + table_view_->Select(-1); |
| + UpdateTableView(); |
| + table_view_->SetVisible(true); |
| - if (chooser_controller_->NumOptions() == 0) { |
| - observer_->OnModelChanged(); |
| - table_view->SetEnabled(false); |
| - } else { |
| - table_view->SetEnabled(true); |
| - } |
| + throbber_->Stop(); |
| + throbber_->SetVisible(false); |
| + |
| + discovery_state_->SetText(chooser_controller_->GetStatus()); |
| + discovery_state_->SetEnabled(enabled); |
| } |
| -ChooserContentView::ChooserContentView( |
| - views::TableViewObserver* observer, |
| - std::unique_ptr<ChooserController> chooser_controller) |
| - : chooser_controller_(std::move(chooser_controller)), table_view_(nullptr) { |
| - std::vector<ui::TableColumn> table_columns; |
| - table_columns.push_back(ui::TableColumn()); |
| - chooser_table_model_.reset(new ChooserTableModel(chooser_controller_.get())); |
| - table_view_ = new views::TableView(chooser_table_model_.get(), table_columns, |
| - views::TEXT_ONLY, true); |
| - table_view_->set_select_on_remove(false); |
| - chooser_table_model_->SetObserver(table_view_); |
| - table_view_->SetObserver(observer); |
| - table_view_->SetEnabled(chooser_controller_->NumOptions() > 0); |
| +void ChooserContentView::SetRefreshing(bool refreshing) { |
| + // No row is selected since the chooser is refreshing or just refreshed. |
| + // This will also disable the OK button if it is enabled because |
|
msw
2016/07/18 23:01:30
nit: "if it was"
juncai
2016/07/19 20:42:46
Done.
|
| + // of previously selected row. |
|
msw
2016/07/18 23:01:30
nit: "a previously"
juncai
2016/07/19 20:42:46
Done.
|
| + table_view_->Select(-1); |
| + UpdateTableView(); |
| + // When refreshing, hide |table_view_|. When refreshing is complete, show |
| + // |table_view_|. |
| + table_view_->SetVisible(!refreshing); |
| - views::BoxLayout* layout = new views::BoxLayout( |
| - views::BoxLayout::kVertical, 0, 0, views::kRelatedControlVerticalSpacing); |
| - SetLayoutManager(layout); |
| - views::View* table_parent = table_view_->CreateParentIfNecessary(); |
| - AddChildView(table_parent); |
| - layout->SetFlexForView(table_parent, 1); |
| + if (refreshing) |
| + throbber_->Start(); |
| + else |
| + throbber_->Stop(); |
| + // When refreshing, show |throbber_|. When refreshing is complete, hide |
|
msw
2016/07/18 23:01:31
nit: "When complete"
juncai
2016/07/19 20:42:46
Done.
|
| + // |throbber_|. |
| + throbber_->SetVisible(refreshing); |
| + |
| + discovery_state_->SetText(chooser_controller_->GetStatus()); |
| + // When refreshing, disable |discovery_state_| to show it as a text label. |
| + // When refreshing is complete, enable |discovery_state_| to show it as a |
| + // link. |
| + discovery_state_->SetEnabled(!refreshing); |
| } |
| -ChooserContentView::~ChooserContentView() { |
| - table_view_->SetModel(nullptr); |
| - chooser_table_model_->SetObserver(nullptr); |
| +void ChooserContentView::LinkClicked(views::Link* source, int event_flags) { |
| + chooser_controller_->RefreshOptions(); |
| } |
| -gfx::Size ChooserContentView::GetPreferredSize() const { |
| - return gfx::Size(kChooserWidth, kChooserHeight); |
| +void ChooserContentView::StyledLabelLinkClicked(views::StyledLabel* label, |
| + const gfx::Range& range, |
| + int event_flags) { |
| + chooser_controller_->OpenHelpCenterUrl(); |
| } |
| base::string16 ChooserContentView::GetWindowTitle() const { |
| @@ -159,14 +162,21 @@ bool ChooserContentView::IsDialogButtonEnabled(ui::DialogButton button) const { |
| !table_view_->selection_model().empty(); |
| } |
| -views::StyledLabel* ChooserContentView::CreateFootnoteView( |
| - views::StyledLabelListener* listener) const { |
| +views::View* ChooserContentView::CreateExtraView() { |
| + discovery_state_ = new views::Link(chooser_controller_->GetStatus()); |
| + discovery_state_->SetHandlesTooltips(false); |
| + discovery_state_->SetUnderline(false); |
| + discovery_state_->set_listener(this); |
| + return discovery_state_; |
| +} |
| + |
| +views::StyledLabel* ChooserContentView::CreateFootnoteView() { |
| base::string16 link = |
| l10n_util::GetStringUTF16(IDS_DEVICE_CHOOSER_GET_HELP_LINK_TEXT); |
| size_t offset = 0; |
| base::string16 text = l10n_util::GetStringFUTF16( |
| IDS_DEVICE_CHOOSER_FOOTNOTE_TEXT, link, &offset); |
| - views::StyledLabel* styled_label = new views::StyledLabel(text, listener); |
| + views::StyledLabel* styled_label = new views::StyledLabel(text, this); |
| styled_label->AddStyleRange( |
| gfx::Range(offset, offset + link.length()), |
| views::StyledLabel::RangeStyleInfo::CreateForLink()); |
| @@ -185,10 +195,11 @@ void ChooserContentView::Close() { |
| chooser_controller_->Close(); |
| } |
| -void ChooserContentView::StyledLabelLinkClicked() { |
| - chooser_controller_->OpenHelpCenterUrl(); |
| -} |
| - |
| -void ChooserContentView::UpdateTableModel() { |
| - chooser_table_model_->Update(); |
| +void ChooserContentView::UpdateTableView() { |
| + if (chooser_controller_->NumOptions() == 0) { |
| + table_view_->OnModelChanged(); |
| + table_view_->SetEnabled(false); |
| + } else { |
| + table_view_->SetEnabled(true); |
| + } |
| } |