Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2040)

Side by Side Diff: ash/system/network/tray_network.cc

Issue 9704029: Reland r126700: ash uber tray: Add the detailed network popup (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 8 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « ash/system/network/tray_network.h ('k') | ash/system/tray/system_tray.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "ash/system/network/tray_network.h" 5 #include "ash/system/network/tray_network.h"
6 6
7 #include "ash/shell.h" 7 #include "ash/shell.h"
8 #include "ash/system/tray/system_tray.h"
8 #include "ash/system/tray/system_tray_delegate.h" 9 #include "ash/system/tray/system_tray_delegate.h"
10 #include "base/utf_string_conversions.h"
11 #include "grit/ash_strings.h"
12 #include "grit/ui_resources.h"
13 #include "ui/base/resource/resource_bundle.h"
14 #include "ui/gfx/font.h"
15 #include "ui/gfx/image/image.h"
9 #include "ui/views/controls/image_view.h" 16 #include "ui/views/controls/image_view.h"
10 #include "ui/views/controls/label.h" 17 #include "ui/views/controls/label.h"
18 #include "ui/views/controls/scroll_view.h"
11 #include "ui/views/layout/fill_layout.h" 19 #include "ui/views/layout/fill_layout.h"
12 #include "ui/views/layout/box_layout.h" 20 #include "ui/views/layout/box_layout.h"
13 #include "ui/views/view.h" 21 #include "ui/views/view.h"
22 #include "ui/views/widget/widget.h"
23
24 namespace {
25
26 // Width of the icon, and the padding on the right of the icon. These are used
27 // to make sure that all icons are of the same size so that they line up
28 // properly, including the items that don't have any icons.
29 const int kIconWidth = 27;
30 const int kIconPaddingLeft = 5;
31
32 // Height of the list of networks in the popup.
33 const int kNetworkListHeight = 160;
34
35 // An image view with that always has a fixed width (kIconWidth) so that
36 // all the items line up properly.
37 class FixedWidthImageView : public views::ImageView {
38 public:
39 FixedWidthImageView() {
40 SetHorizontalAlignment(views::ImageView::CENTER);
41 SetVerticalAlignment(views::ImageView::CENTER);
42 }
43
44 virtual ~FixedWidthImageView() {}
45
46 private:
47 virtual gfx::Size GetPreferredSize() OVERRIDE {
48 gfx::Size size = views::ImageView::GetPreferredSize();
49 return gfx::Size(kIconWidth, size.height());
50 }
51
52 DISALLOW_COPY_AND_ASSIGN(FixedWidthImageView);
53 };
54
55 class ViewClickListener {
56 public:
57 virtual ~ViewClickListener() {}
58 virtual void ClickedOn(views::View* sender) = 0;
59 };
60
61 class HoverHighlightView : public views::View {
62 public:
63 explicit HoverHighlightView(ViewClickListener* listener)
64 : listener_(listener) {
65 set_notify_enter_exit_on_child(true);
66 }
67
68 virtual ~HoverHighlightView() {}
69
70 // Convenience function for adding an icon and a label.
71 void AddIconAndLabel(const SkBitmap& image, const string16& label) {
72 SetLayoutManager(new views::BoxLayout(
73 views::BoxLayout::kHorizontal, 0, 3, kIconPaddingLeft));
74 views::ImageView* image_view = new FixedWidthImageView;
75 image_view->SetImage(image);
76 AddChildView(image_view);
77 AddChildView(new views::Label(label));
78 }
79
80 void AddLabel(const string16& text) {
81 SetLayoutManager(new views::FillLayout());
82 views::Label* label = new views::Label(text);
83 label->set_border(views::Border::CreateEmptyBorder(
84 5, kIconWidth + kIconPaddingLeft, 5, 0));
85 label->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
86 AddChildView(label);
87 }
88
89 private:
90 // Overridden from views::View.
91 virtual bool OnMousePressed(const views::MouseEvent& event) OVERRIDE {
92 if (!listener_)
93 return false;
94 listener_->ClickedOn(this);
95 return true;
96 }
97
98 virtual void OnMouseEntered(const views::MouseEvent& event) OVERRIDE {
99 set_background(views::Background::CreateSolidBackground(
100 SkColorSetARGB(10, 0, 0, 0)));
101 SchedulePaint();
102 }
103
104 virtual void OnMouseExited(const views::MouseEvent& event) OVERRIDE {
105 set_background(NULL);
106 SchedulePaint();
107 }
108
109 ViewClickListener* listener_;
110
111 DISALLOW_COPY_AND_ASSIGN(HoverHighlightView);
112 };
113
114 // A custom scroll-view that has a specified dimension.
115 class FixedSizedScrollView : public views::ScrollView {
116 public:
117 FixedSizedScrollView() {}
118 virtual ~FixedSizedScrollView() {}
119
120 void SetContentsView(View* view) {
121 SetContents(view);
122 view->SetBoundsRect(gfx::Rect(view->GetPreferredSize()));
123 }
124
125 void set_fixed_size(gfx::Size size) { fixed_size_ = size; }
126
127 private:
128 // Overridden from views::View.
129 virtual gfx::Size GetPreferredSize() OVERRIDE {
130 return fixed_size_;
131 }
132
133 gfx::Size fixed_size_;
134
135 DISALLOW_COPY_AND_ASSIGN(FixedSizedScrollView);
136 };
137
138 }
14 139
15 namespace ash { 140 namespace ash {
16 namespace internal { 141 namespace internal {
17 142
18 namespace tray { 143 namespace tray {
19 144
20 enum ResourceSize { 145 enum ResourceSize {
21 SMALL, 146 SMALL,
22 LARGE, 147 LARGE,
23 }; 148 };
24 149
25 class NetworkTrayView : public views::View { 150 class NetworkTrayView : public views::View {
26 public: 151 public:
27 explicit NetworkTrayView(ResourceSize size) : resource_size_(size) { 152 explicit NetworkTrayView(ResourceSize size) : resource_size_(size) {
28 SetLayoutManager(new views::FillLayout()); 153 SetLayoutManager(new views::FillLayout());
29 154
30 image_view_ = new views::ImageView; 155 image_view_ = new views::ImageView;
31 AddChildView(image_view_); 156 AddChildView(image_view_);
32 157
33 Update(Shell::GetInstance()->tray_delegate()->GetMostRelevantNetworkIcon()); 158 Update(Shell::GetInstance()->tray_delegate()->
159 GetMostRelevantNetworkIcon(resource_size_ == LARGE));
34 } 160 }
35 161
36 virtual ~NetworkTrayView() {} 162 virtual ~NetworkTrayView() {}
37 163
38 void Update(const NetworkIconInfo& info) { 164 void Update(const NetworkIconInfo& info) {
39 image_view_->SetImage(info.image); 165 image_view_->SetImage(info.image);
40 SchedulePaint(); 166 SchedulePaint();
41 } 167 }
42 168
43 private: 169 private:
44 views::ImageView* image_view_; 170 views::ImageView* image_view_;
45 ResourceSize resource_size_; 171 ResourceSize resource_size_;
46 172
47 DISALLOW_COPY_AND_ASSIGN(NetworkTrayView); 173 DISALLOW_COPY_AND_ASSIGN(NetworkTrayView);
48 }; 174 };
49 175
50 class NetworkDefaultView : public views::View { 176 class NetworkDefaultView : public views::View {
51 public: 177 public:
52 NetworkDefaultView() { 178 explicit NetworkDefaultView(SystemTrayItem* owner) : owner_(owner) {
53 SetLayoutManager(new views::BoxLayout(views::BoxLayout::kHorizontal, 179 SetLayoutManager(new views::BoxLayout(views::BoxLayout::kHorizontal,
54 0, 0, 5)); 180 0, 0, 5));
55 181
56 icon_ = new NetworkTrayView(LARGE); 182 icon_ = new NetworkTrayView(LARGE);
57 AddChildView(icon_); 183 AddChildView(icon_);
58 184
59 label_ = new views::Label(); 185 label_ = new views::Label();
60 AddChildView(label_); 186 AddChildView(label_);
61 187
62 Update(Shell::GetInstance()->tray_delegate()->GetMostRelevantNetworkIcon()); 188 views::ImageView* more = new views::ImageView;
189 more->SetImage(ui::ResourceBundle::GetSharedInstance().GetImageNamed(
190 IDR_AURA_UBER_TRAY_MORE).ToSkBitmap());
191 AddChildView(more);
192
193 Update(Shell::GetInstance()->tray_delegate()->
194 GetMostRelevantNetworkIcon(true));
63 } 195 }
64 196
65 virtual ~NetworkDefaultView() {} 197 virtual ~NetworkDefaultView() {}
66 198
67 void Update(const NetworkIconInfo& info) { 199 void Update(const NetworkIconInfo& info) {
68 icon_->Update(info); 200 icon_->Update(info);
69 label_->SetText(info.description); 201 label_->SetText(info.description);
70 } 202 }
71 203
72 private: 204 private:
205 // Overridden from views::View.
206 virtual bool OnMousePressed(const views::MouseEvent& event) OVERRIDE {
207 owner_->PopupDetailedView(0, true);
208 return true;
209 }
210
211 SystemTrayItem* owner_;
73 NetworkTrayView* icon_; 212 NetworkTrayView* icon_;
74 views::Label* label_; 213 views::Label* label_;
75 214
76 DISALLOW_COPY_AND_ASSIGN(NetworkDefaultView); 215 DISALLOW_COPY_AND_ASSIGN(NetworkDefaultView);
77 }; 216 };
78 217
218 class NetworkDetailedView : public views::View,
219 public ViewClickListener {
220 public:
221 explicit NetworkDetailedView(user::LoginStatus login)
222 : login_(login),
223 header_(NULL),
224 airplane_(NULL),
225 settings_(NULL),
226 proxy_settings_(NULL) {
227 SetLayoutManager(new views::BoxLayout(
228 views::BoxLayout::kVertical, 1, 1, 1));
229 Update();
230 }
231
232 virtual ~NetworkDetailedView() {}
233
234 void Update() {
235 RemoveAllChildViews(true);
236
237 AppendHeaderEntry();
238 AppendNetworkEntries();
239 AppendAirplaneModeEntry();
240 AppendSettingsEntry();
241 }
242
243 private:
244 void AppendHeaderEntry() {
245 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
246 HoverHighlightView* container = new HoverHighlightView(this);
247 container->SetLayoutManager(new
248 views::BoxLayout(views::BoxLayout::kHorizontal, 0, 3, 5));
249 views::ImageView* back = new FixedWidthImageView;
250 back->SetImage(rb.GetImageNamed(IDR_AURA_UBER_TRAY_LESS).ToSkBitmap());
251 container->AddChildView(back);
252 views::Label* header = new views::Label(rb.GetLocalizedString(
253 IDS_ASH_STATUS_TRAY_NETWORK));
254 header->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
255 header->SetFont(header->font().DeriveFont(4));
256 container->AddChildView(header);
257 AddChildView(container);
258 header_ = container;
259 }
260
261 void AppendNetworkEntries() {
262 std::vector<NetworkIconInfo> list;
263 Shell::GetInstance()->tray_delegate()->GetAvailableNetworks(&list);
264 FixedSizedScrollView* scroller = new FixedSizedScrollView;
265 views::View* networks = new views::View;
266 networks->SetLayoutManager(new views::BoxLayout(
267 views::BoxLayout::kVertical, 0, 0, 1));
268 for (size_t i = 0; i < list.size(); i++) {
269 HoverHighlightView* container = new HoverHighlightView(this);
270 container->AddIconAndLabel(list[i].image, list[i].name);
271 networks->AddChildView(container);
272 network_map_[container] = list[i].unique_id;
273 }
274 scroller->set_border(views::Border::CreateSolidSidedBorder(1, 0, 1, 0,
275 SkColorSetARGB(25, 0, 0, 0)));
276 scroller->set_fixed_size(
277 gfx::Size(networks->GetPreferredSize().width() +
278 scroller->GetScrollBarWidth(),
279 kNetworkListHeight));
280 scroller->SetContentsView(networks);
281 AddChildView(scroller);
282 }
283
284 void AppendAirplaneModeEntry() {
285 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
286 HoverHighlightView* container = new HoverHighlightView(this);
287 container->AddIconAndLabel(
288 *rb.GetImageNamed(IDR_AURA_UBER_TRAY_NETWORK_AIRPLANE).ToSkBitmap(),
289 rb.GetLocalizedString(IDS_ASH_STATUS_TRAY_AIRPLANE_MODE));
290 AddChildView(container);
291 airplane_ = container;
292 }
293
294 // Adds a settings entry when logged in, and an entry for changing proxy
295 // settings otherwise.
296 void AppendSettingsEntry() {
297 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
298 if (login_ != user::LOGGED_IN_NONE) {
299 // Settings, only if logged in.
300 HoverHighlightView* container = new HoverHighlightView(this);
301 container->AddLabel(rb.GetLocalizedString(
302 IDS_ASH_STATUS_TRAY_NETWORK_SETTINGS));
303 AddChildView(container);
304 settings_ = container;
305 } else {
306 // Allow changing proxy settings in the login screen.
307 HoverHighlightView* container = new HoverHighlightView(this);
308 container->AddLabel(rb.GetLocalizedString(
309 IDS_ASH_STATUS_TRAY_NETWORK_PROXY_SETTINGS));
310 AddChildView(container);
311 proxy_settings_ = container;
312 }
313 }
314
315 // Overridden from ViewClickListener.
316 virtual void ClickedOn(views::View* sender) OVERRIDE {
317 ash::SystemTrayDelegate* delegate =
318 ash::Shell::GetInstance()->tray_delegate();
319 if (sender == header_) {
320 Shell::GetInstance()->tray()->ShowDefaultView();
321 } else if (sender == settings_) {
322 delegate->ShowNetworkSettings();
323 } else if (sender == proxy_settings_) {
324 delegate->ChangeProxySettings();
325 } else if (sender == airplane_) {
326 delegate->ToggleAirplaneMode();
327 } else {
328 std::map<views::View*, std::string>::iterator find;
329 find = network_map_.find(sender);
330 if (find != network_map_.end()) {
331 std::string network_id = find->second;
332 delegate->ConnectToNetwork(network_id);
333 }
334 }
335 }
336
337 user::LoginStatus login_;
338 std::map<views::View*, std::string> network_map_;
339 views::View* header_;
340 views::View* airplane_;
341 views::View* settings_;
342 views::View* proxy_settings_;
343 DISALLOW_COPY_AND_ASSIGN(NetworkDetailedView);
344 };
345
79 } // namespace tray 346 } // namespace tray
80 347
81 TrayNetwork::TrayNetwork() { 348 TrayNetwork::TrayNetwork() {
82 } 349 }
83 350
84 TrayNetwork::~TrayNetwork() { 351 TrayNetwork::~TrayNetwork() {
85 } 352 }
86 353
87 views::View* TrayNetwork::CreateTrayView(user::LoginStatus status) { 354 views::View* TrayNetwork::CreateTrayView(user::LoginStatus status) {
88 tray_.reset(new tray::NetworkTrayView(tray::SMALL)); 355 tray_.reset(new tray::NetworkTrayView(tray::SMALL));
89 return tray_.get(); 356 return tray_.get();
90 } 357 }
91 358
92 views::View* TrayNetwork::CreateDefaultView(user::LoginStatus status) { 359 views::View* TrayNetwork::CreateDefaultView(user::LoginStatus status) {
93 default_.reset(new tray::NetworkDefaultView); 360 default_.reset(new tray::NetworkDefaultView(this));
94 return default_.get(); 361 return default_.get();
95 } 362 }
96 363
97 views::View* TrayNetwork::CreateDetailedView(user::LoginStatus status) { 364 views::View* TrayNetwork::CreateDetailedView(user::LoginStatus status) {
98 return NULL; 365 detailed_.reset(new tray::NetworkDetailedView(status));
366 return detailed_.get();
99 } 367 }
100 368
101 void TrayNetwork::DestroyTrayView() { 369 void TrayNetwork::DestroyTrayView() {
102 tray_.reset(); 370 tray_.reset();
103 } 371 }
104 372
105 void TrayNetwork::DestroyDefaultView() { 373 void TrayNetwork::DestroyDefaultView() {
106 default_.reset(); 374 default_.reset();
107 } 375 }
108 376
109 void TrayNetwork::DestroyDetailedView() { 377 void TrayNetwork::DestroyDetailedView() {
378 detailed_.reset();
110 } 379 }
111 380
112 void TrayNetwork::OnNetworkRefresh(const NetworkIconInfo& info) { 381 void TrayNetwork::OnNetworkRefresh(const NetworkIconInfo& info) {
113 if (tray_.get()) 382 if (tray_.get())
114 tray_->Update(info); 383 tray_->Update(info);
115 if (default_.get()) 384 if (default_.get())
116 default_->Update(info); 385 default_->Update(info);
386 if (detailed_.get())
387 detailed_->Update();
117 } 388 }
118 389
119 } // namespace internal 390 } // namespace internal
120 } // namespace ash 391 } // namespace ash
OLDNEW
« no previous file with comments | « ash/system/network/tray_network.h ('k') | ash/system/tray/system_tray.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698