Chromium Code Reviews| Index: ash/system/network/tray_network.cc |
| diff --git a/ash/system/network/tray_network.cc b/ash/system/network/tray_network.cc |
| index 8837feb1205ed2e30966b46ac59ec3d80c0b572e..06d6d47dd7d5c1a5b84fa8f297bf20b62c3bf7fa 100644 |
| --- a/ash/system/network/tray_network.cc |
| +++ b/ash/system/network/tray_network.cc |
| @@ -5,12 +5,112 @@ |
| #include "ash/system/network/tray_network.h" |
| #include "ash/shell.h" |
| +#include "ash/system/tray/system_tray.h" |
| #include "ash/system/tray/system_tray_delegate.h" |
| +#include "base/utf_string_conversions.h" |
| +#include "grit/ash_strings.h" |
| +#include "grit/ui_resources.h" |
| +#include "ui/base/resource/resource_bundle.h" |
| +#include "ui/gfx/font.h" |
| +#include "ui/gfx/image/image.h" |
| #include "ui/views/controls/image_view.h" |
| #include "ui/views/controls/label.h" |
| +#include "ui/views/controls/scroll_view.h" |
| #include "ui/views/layout/fill_layout.h" |
| #include "ui/views/layout/box_layout.h" |
| #include "ui/views/view.h" |
| +#include "ui/views/widget/widget.h" |
| + |
| +namespace { |
| + |
| +// Padding for items that do not have any icons. |
| +const int kItemPaddingLeft = 27; |
| +// Height of the list of networks in the popup. |
| +const int kNetworkListHeight = 160; |
| + |
| +class ViewClickListener { |
| + public: |
| + virtual void ClickedOn(views::View* sender) = 0; |
| +}; |
| + |
| +class HoverHighlightView : public views::View { |
| + public: |
| + explicit HoverHighlightView(ViewClickListener* listener) |
| + : listener_(listener) { |
| + set_notify_enter_exit_on_child(true); |
| + } |
| + |
| + virtual ~HoverHighlightView() {} |
| + |
| + // Convenience function for adding an icon and a label. |
| + void AddIconAndLabel(const SkBitmap& image, string16 label) { |
|
Nikita (slow)
2012/03/14 16:48:45
const string16&
sadrul
2012/03/14 18:37:46
Done.
|
| + SetLayoutManager(new views::BoxLayout( |
| + views::BoxLayout::kHorizontal, 0, 3, 5)); |
| + views::ImageView* image_view = new views::ImageView; |
| + image_view->SetImage(image); |
| + AddChildView(image_view); |
| + AddChildView(new views::Label(label)); |
| + } |
| + |
| + void AddLabel(string16 text) { |
|
Nikita (slow)
2012/03/14 16:48:45
const string16&
sadrul
2012/03/14 18:37:46
Done.
|
| + SetLayoutManager(new views::FillLayout()); |
| + views::Label* label = new views::Label(text); |
| + label->set_border(views::Border::CreateEmptyBorder(5, kItemPaddingLeft, |
| + 5, 0)); |
| + label->SetHorizontalAlignment(views::Label::ALIGN_LEFT); |
| + AddChildView(label); |
| + } |
| + |
| + private: |
| + // Overridden from views::View. |
| + virtual bool OnMousePressed(const views::MouseEvent& event) OVERRIDE { |
| + if (!listener_) |
| + return false; |
| + listener_->ClickedOn(this); |
| + return true; |
| + } |
| + |
| + virtual void OnMouseEntered(const views::MouseEvent& event) OVERRIDE { |
| + set_background(views::Background::CreateSolidBackground( |
| + SkColorSetARGB(10, 0, 0, 0))); |
| + SchedulePaint(); |
| + } |
| + |
| + virtual void OnMouseExited(const views::MouseEvent& event) OVERRIDE { |
| + set_background(NULL); |
| + SchedulePaint(); |
| + } |
| + |
| + ViewClickListener* listener_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(HoverHighlightView); |
| +}; |
| + |
| +// A custom scroll-view that has a specified dimension. |
| +class FixedSizedScrollView : public views::ScrollView { |
| + public: |
| + FixedSizedScrollView() {} |
| + virtual ~FixedSizedScrollView() {} |
| + |
| + void SetContentsView(View* view) { |
| + SetContents(view); |
| + view->SetBoundsRect(gfx::Rect(view->GetPreferredSize())); |
| + } |
| + |
| + void set_fixed_size(gfx::Size size) { fixed_size_ = size; } |
| + |
| + private: |
| + // Overridden from views::View. |
| + virtual gfx::Size GetPreferredSize() OVERRIDE { |
| + return fixed_size_; |
| + } |
| + |
| + gfx::Size fixed_size_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(FixedSizedScrollView); |
| +}; |
| + |
| +} |
| namespace ash { |
| namespace internal { |
| @@ -30,7 +130,8 @@ class NetworkTrayView : public views::View { |
| image_view_ = new views::ImageView; |
| AddChildView(image_view_); |
| - Update(Shell::GetInstance()->tray_delegate()->GetMostRelevantNetworkIcon()); |
| + Update(Shell::GetInstance()->tray_delegate()-> |
| + GetMostRelevantNetworkIcon(resource_size_ == LARGE)); |
| } |
| virtual ~NetworkTrayView() {} |
| @@ -49,7 +150,7 @@ class NetworkTrayView : public views::View { |
| class NetworkDefaultView : public views::View { |
| public: |
| - NetworkDefaultView() { |
| + explicit NetworkDefaultView(SystemTrayItem* owner) : owner_(owner) { |
| SetLayoutManager(new views::BoxLayout(views::BoxLayout::kHorizontal, |
| 0, 0, 5)); |
| @@ -59,7 +160,13 @@ class NetworkDefaultView : public views::View { |
| label_ = new views::Label(); |
| AddChildView(label_); |
| - Update(Shell::GetInstance()->tray_delegate()->GetMostRelevantNetworkIcon()); |
| + views::ImageView* more = new views::ImageView; |
| + more->SetImage(ui::ResourceBundle::GetSharedInstance().GetImageNamed( |
| + IDR_AURA_UBER_TRAY_MORE).ToSkBitmap()); |
| + AddChildView(more); |
| + |
| + Update(Shell::GetInstance()->tray_delegate()-> |
| + GetMostRelevantNetworkIcon(true)); |
| } |
| virtual ~NetworkDefaultView() {} |
| @@ -70,12 +177,147 @@ class NetworkDefaultView : public views::View { |
| } |
| private: |
| + // Overridden from views::View. |
| + virtual bool OnMousePressed(const views::MouseEvent& event) OVERRIDE { |
| + owner_->PopupDetailedView(0, true); |
| + return true; |
| + } |
| + |
| + SystemTrayItem* owner_; |
| NetworkTrayView* icon_; |
| views::Label* label_; |
| DISALLOW_COPY_AND_ASSIGN(NetworkDefaultView); |
| }; |
| +class NetworkDetailedView : public views::View, |
| + public ViewClickListener { |
| + public: |
| + explicit NetworkDetailedView(user::LoginStatus login) |
| + : login_(login), |
| + header_(NULL), |
| + airplane_(NULL), |
| + settings_(NULL), |
| + proxy_settings_(NULL) { |
| + SetLayoutManager(new views::BoxLayout( |
| + views::BoxLayout::kVertical, 1, 1, 1)); |
| + Update(); |
| + } |
| + |
| + virtual ~NetworkDetailedView() {} |
| + |
| + void Update() { |
| + RemoveAllChildViews(true); |
| + |
| + AppendHeaderEntry(); |
| + AppendNetworkEntries(); |
| + AppendAirplaneModeEntry(); |
| + AppendSettingsEntry(); |
| + } |
| + |
| + private: |
| + void AppendHeaderEntry() { |
| + ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); |
| + HoverHighlightView* container = new HoverHighlightView(this); |
| + container->SetLayoutManager(new |
| + views::BoxLayout(views::BoxLayout::kHorizontal, 0, 3, 5)); |
| + views::ImageView* back = new views::ImageView; |
| + back->SetImage(rb.GetImageNamed(IDR_AURA_UBER_TRAY_LESS).ToSkBitmap()); |
| + container->AddChildView(back); |
| + views::Label* header = new views::Label(rb.GetLocalizedString( |
| + IDS_ASH_STATUS_TRAY_NETWORK)); |
| + header->SetHorizontalAlignment(views::Label::ALIGN_LEFT); |
| + header->SetFont(header->font().DeriveFont(4)); |
| + container->AddChildView(header); |
| + AddChildView(container); |
| + header_ = container; |
| + } |
| + |
| + void AppendNetworkEntries() { |
| + std::vector<NetworkIconInfo> list; |
| + Shell::GetInstance()->tray_delegate()->GetAvailableNetworks(&list); |
| + FixedSizedScrollView* scroller = new FixedSizedScrollView; |
| + views::View* networks = new views::View; |
| + networks->SetLayoutManager(new views::BoxLayout( |
| + views::BoxLayout::kVertical, 0, 0, 1)); |
| + for (size_t i = 0; i < list.size(); i++) { |
| + HoverHighlightView* container = new HoverHighlightView(this); |
| + container->AddIconAndLabel(list[i].image, list[i].name); |
| + networks->AddChildView(container); |
| + network_map_[container] = list[i].unique_id; |
| + } |
| + scroller->set_border(views::Border::CreateSolidSidedBorder(1, 0, 1, 0, |
| + SkColorSetARGB(25, 0, 0, 0))); |
| + scroller->set_fixed_size( |
| + gfx::Size(networks->GetPreferredSize().width() + |
| + scroller->GetScrollBarWidth(), |
| + kNetworkListHeight)); |
| + scroller->SetContentsView(networks); |
| + AddChildView(scroller); |
| + } |
| + |
| + void AppendAirplaneModeEntry() { |
| + ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); |
| + HoverHighlightView* container = new HoverHighlightView(this); |
| + container->AddIconAndLabel( |
| + *rb.GetImageNamed(IDR_AURA_UBER_TRAY_NETWORK_AIRPLANE).ToSkBitmap(), |
| + rb.GetLocalizedString(IDS_ASH_STATUS_TRAY_AIRPLANE_MODE)); |
| + AddChildView(container); |
| + airplane_ = container; |
| + } |
| + |
| + // Adds a settings entry when logged in, and an entry for changing proxy |
| + // settings otherwise. |
| + void AppendSettingsEntry() { |
| + ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); |
| + if (login_ != user::LOGGED_IN_NONE) { |
| + // Settings, only if logged in. |
| + HoverHighlightView* container = new HoverHighlightView(this); |
| + container->AddLabel(rb.GetLocalizedString( |
| + IDS_ASH_STATUS_TRAY_NETWORK_SETTINGS)); |
| + AddChildView(container); |
| + settings_ = container; |
| + } else { |
| + // Allow changing proxy settings in the login screen. |
| + HoverHighlightView* container = new HoverHighlightView(this); |
| + container->AddLabel(rb.GetLocalizedString( |
| + IDS_ASH_STATUS_TRAY_NETWORK_PROXY_SETTINGS)); |
| + AddChildView(container); |
| + proxy_settings_ = container; |
| + } |
| + } |
| + |
| + // Overridden from ViewClickListener. |
| + virtual void ClickedOn(views::View* sender) OVERRIDE { |
| + ash::SystemTrayDelegate* delegate = |
| + ash::Shell::GetInstance()->tray_delegate(); |
| + if (sender == header_) { |
| + Shell::GetInstance()->tray()->ShowDefaultView(); |
| + } else if (sender == settings_) { |
| + delegate->ShowNetworkSettings(); |
| + } else if (sender == proxy_settings_) { |
| + delegate->ChangeProxySettings(); |
| + } else if (sender == airplane_) { |
| + delegate->ToggleAirplaneMode(); |
| + } else { |
| + std::map<views::View*, std::string>::iterator find; |
| + find = network_map_.find(sender); |
| + if (find != network_map_.end()) { |
| + std::string network_id = find->second; |
| + delegate->ConnectToNetwork(network_id); |
| + } |
| + } |
| + } |
| + |
| + user::LoginStatus login_; |
| + std::map<views::View*, std::string> network_map_; |
| + views::View* header_; |
| + views::View* airplane_; |
| + views::View* settings_; |
| + views::View* proxy_settings_; |
| + DISALLOW_COPY_AND_ASSIGN(NetworkDetailedView); |
| +}; |
| + |
| } // namespace tray |
| TrayNetwork::TrayNetwork() { |
| @@ -90,12 +332,13 @@ views::View* TrayNetwork::CreateTrayView(user::LoginStatus status) { |
| } |
| views::View* TrayNetwork::CreateDefaultView(user::LoginStatus status) { |
| - default_.reset(new tray::NetworkDefaultView); |
| + default_.reset(new tray::NetworkDefaultView(this)); |
| return default_.get(); |
| } |
| views::View* TrayNetwork::CreateDetailedView(user::LoginStatus status) { |
| - return NULL; |
| + detailed_.reset(new tray::NetworkDetailedView(status)); |
| + return detailed_.get(); |
| } |
| void TrayNetwork::DestroyTrayView() { |
| @@ -107,6 +350,7 @@ void TrayNetwork::DestroyDefaultView() { |
| } |
| void TrayNetwork::DestroyDetailedView() { |
| + detailed_.reset(); |
| } |
| void TrayNetwork::OnNetworkRefresh(const NetworkIconInfo& info) { |
| @@ -114,6 +358,8 @@ void TrayNetwork::OnNetworkRefresh(const NetworkIconInfo& info) { |
| tray_->Update(info); |
| if (default_.get()) |
| default_->Update(info); |
| + if (detailed_.get()) |
| + detailed_->Update(); |
| } |
| } // namespace internal |