blob: 35e5ec75104d62c60cdf8b572be0e9e706e9adf7 [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_UI_VIEWS_DEVICE_CHOOSER_CONTENT_VIEW_H_
#define CHROME_BROWSER_UI_VIEWS_DEVICE_CHOOSER_CONTENT_VIEW_H_
#include <memory>
#include "base/macros.h"
#include "base/strings/string16.h"
#include "chrome/browser/chooser_controller/chooser_controller.h"
#include "ui/base/models/table_model.h"
#include "ui/gfx/range/range.h"
#include "ui/views/controls/button/button.h"
#include "ui/views/controls/label.h"
#include "ui/views/controls/styled_label_listener.h"
#include "ui/views/view.h"
namespace views {
class LabelButton;
class StyledLabel;
class TableView;
class TableViewObserver;
class Throbber;
}
// A bubble or dialog view for choosing among several options in a table.
// Used for WebUSB/WebBluetooth device selection for Chrome and extensions.
class DeviceChooserContentView : public views::View,
public ui::TableModel,
public ChooserController::View,
public views::StyledLabelListener,
public views::ButtonListener {
public:
DeviceChooserContentView(
views::TableViewObserver* table_view_observer,
std::unique_ptr<ChooserController> chooser_controller);
~DeviceChooserContentView() override;
// views::View:
gfx::Size GetMinimumSize() const override;
void Layout() override;
gfx::Size CalculatePreferredSize() const override;
// ui::TableModel:
int RowCount() override;
base::string16 GetText(int row, int column_id) override;
void SetObserver(ui::TableModelObserver* observer) override;
gfx::ImageSkia GetIcon(int row) override;
// ChooserController::View:
void OnOptionsInitialized() override;
void OnOptionAdded(size_t index) override;
void OnOptionRemoved(size_t index) override;
void OnOptionUpdated(size_t index) override;
void OnAdapterEnabledChanged(bool enabled) override;
void OnRefreshStateChanged(bool refreshing) override;
// views::StyledLabelListener:
void StyledLabelLinkClicked(views::StyledLabel* label,
const gfx::Range& range,
int event_flags) override;
// views::ButtonListener:
void ButtonPressed(views::Button* sender, const ui::Event& event) override;
base::string16 GetWindowTitle() const;
std::unique_ptr<views::View> CreateExtraView();
base::string16 GetDialogButtonLabel(ui::DialogButton button) const;
bool IsDialogButtonEnabled(ui::DialogButton button) const;
void Accept();
void Cancel();
void Close();
void UpdateTableView();
private:
friend class ChooserDialogViewTest;
friend class DeviceChooserContentViewTest;
FRIEND_TEST_ALL_PREFIXES(DeviceChooserContentViewTest, ClickRescanLink);
FRIEND_TEST_ALL_PREFIXES(DeviceChooserContentViewTest, ClickGetHelpLink);
class BluetoothStatusContainer : public views::View {
public:
explicit BluetoothStatusContainer(views::ButtonListener* listener);
// view::Views:
gfx::Size CalculatePreferredSize() const override;
void Layout() override;
void ShowScanningLabelAndThrobber();
void ShowReScanButton(bool enabled);
views::LabelButton* re_scan_button() { return re_scan_button_; }
views::Throbber* throbber() { return throbber_; }
views::Label* scanning_label() { return scanning_label_; }
private:
int GetThrobberLabelSpacing() const;
void CenterVertically(views::View* view);
views::LabelButton* re_scan_button_;
views::Throbber* throbber_;
views::Label* scanning_label_;
DISALLOW_COPY_AND_ASSIGN(BluetoothStatusContainer);
};
std::unique_ptr<ChooserController> chooser_controller_;
bool adapter_enabled_ = true;
views::TableView* table_view_ = nullptr;
views::View* table_parent_ = nullptr;
views::Label* no_options_help_ = nullptr;
views::StyledLabel* adapter_off_help_ = nullptr;
BluetoothStatusContainer* bluetooth_status_container_ = nullptr;
DISALLOW_COPY_AND_ASSIGN(DeviceChooserContentView);
};
#endif // CHROME_BROWSER_UI_VIEWS_DEVICE_CHOOSER_CONTENT_VIEW_H_