| 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..d3892c47b70d819ac1932d4caaf75b0282367be1 100644
|
| --- a/chrome/browser/ui/views/chooser_content_view.cc
|
| +++ b/chrome/browser/ui/views/chooser_content_view.cc
|
| @@ -4,66 +4,72 @@
|
|
|
| #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);
|
| + 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);
|
| + if (chooser_controller_->NeedsThrobber()) {
|
| + throbber_ = new views::Throbber();
|
| + // Set the throbber in the center of the chooser rectangular.
|
| + 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);
|
| +}
|
| +
|
| +gfx::Size ChooserContentView::GetPreferredSize() const {
|
| + return gfx::Size(kChooserWidth, kChooserHeight);
|
| }
|
|
|
| -int ChooserTableModel::RowCount() {
|
| +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);
|
| @@ -76,71 +82,84 @@ 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::AdapterOn() {
|
| + table_view_->Select(-1);
|
| + UpdateTableView();
|
| + discovery_state_->SetText(
|
| + l10n_util::GetStringUTF16(IDS_BLUETOOTH_DEVICE_CHOOSER_RE_SCAN));
|
| + // Enable |discovery_state_| to show it as a link.
|
| + discovery_state_->SetEnabled(true);
|
| +}
|
|
|
| - if (chooser_controller_->NumOptions() == 0) {
|
| - observer_->OnModelChanged();
|
| - table_view->SetEnabled(false);
|
| - } else {
|
| - table_view->SetEnabled(true);
|
| - }
|
| +void ChooserContentView::AdapterOff() {
|
| + // No row is selected since the adapter is off.
|
| + // This will also disable the OK button if it is enabled because
|
| + // of previously selected row.
|
| + table_view_->Select(-1);
|
| + UpdateTableView();
|
| + table_view_->SetVisible(true);
|
| + throbber_->Stop();
|
| + throbber_->SetVisible(false);
|
| + discovery_state_->SetText(l10n_util::GetStringUTF16(
|
| + IDS_BLUETOOTH_DEVICE_CHOOSER_BLUETOOTH_ADAPTER_OFF));
|
| + // Disable |discovery_state_| to show it as a text label instead of a link.
|
| + discovery_state_->SetEnabled(false);
|
| }
|
|
|
| -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::Refresh() {
|
| + // No row is selected since |table_view_| will be refreshed.
|
| + // This will also disable the OK button if it is enabled because
|
| + // of previously selected row.
|
| + table_view_->Select(-1);
|
| + UpdateTableView();
|
| + // Hide |table_view_| and make |throbber_| visible.
|
| + table_view_->SetVisible(false);
|
| + throbber_->Start();
|
| + throbber_->SetVisible(true);
|
| + discovery_state_->SetText(
|
| + l10n_util::GetStringUTF16(IDS_BLUETOOTH_DEVICE_CHOOSER_SCANNING));
|
| + // Disable |discovery_state_| to show it as a text label instead of a link.
|
| + discovery_state_->SetEnabled(false);
|
| +}
|
|
|
| - 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);
|
| +void ChooserContentView::Idle() {
|
| + table_view_->Select(-1);
|
| + UpdateTableView();
|
| + // Hide |throbber_| and make |table_view_| visible.
|
| + table_view_->SetVisible(true);
|
| + throbber_->Stop();
|
| + throbber_->SetVisible(false);
|
| + discovery_state_->SetText(
|
| + l10n_util::GetStringUTF16(IDS_BLUETOOTH_DEVICE_CHOOSER_RE_SCAN));
|
| + // Enable |discovery_state_| to show it as a link.
|
| + discovery_state_->SetEnabled(true);
|
| }
|
|
|
| -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 +178,25 @@ bool ChooserContentView::IsDialogButtonEnabled(ui::DialogButton button) const {
|
| !table_view_->selection_model().empty();
|
| }
|
|
|
| -views::StyledLabel* ChooserContentView::CreateFootnoteView(
|
| - views::StyledLabelListener* listener) const {
|
| +views::View* ChooserContentView::CreateExtraView() {
|
| + if (chooser_controller_->NeedsStatus()) {
|
| + discovery_state_ = new views::Link(
|
| + l10n_util::GetStringUTF16(IDS_BLUETOOTH_DEVICE_CHOOSER_RE_SCAN));
|
| + 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 +215,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);
|
| + }
|
| }
|
|
|