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

Side by Side Diff: chrome/browser/chromeos/status/network_menu.cc

Issue 6811025: Change status button menu implementation from Menu2 to MenuItemView. (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Changed refcount guard to use OS_CHROMEOS. Created 9 years, 8 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
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 "chrome/browser/chromeos/status/network_menu.h" 5 #include "chrome/browser/chromeos/status/network_menu.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/stringprintf.h" 9 #include "base/stringprintf.h"
10 #include "base/utf_string_conversions.h" 10 #include "base/utf_string_conversions.h"
11 #include "chrome/browser/chromeos/cros/cros_library.h" 11 #include "chrome/browser/chromeos/cros/cros_library.h"
12 #include "chrome/browser/chromeos/sim_unlock_dialog_delegate.h" 12 #include "chrome/browser/chromeos/sim_unlock_dialog_delegate.h"
13 #include "chrome/browser/ui/browser.h" 13 #include "chrome/browser/ui/browser.h"
14 #include "chrome/browser/ui/browser_list.h" 14 #include "chrome/browser/ui/browser_list.h"
15 #include "chrome/browser/ui/views/window.h" 15 #include "chrome/browser/ui/views/window.h"
16 #include "chrome/common/url_constants.h" 16 #include "chrome/common/url_constants.h"
17 #include "grit/generated_resources.h" 17 #include "grit/generated_resources.h"
18 #include "grit/theme_resources.h" 18 #include "grit/theme_resources.h"
19 #include "net/base/escape.h" 19 #include "net/base/escape.h"
20 #include "ui/base/l10n/l10n_util.h" 20 #include "ui/base/l10n/l10n_util.h"
21 #include "ui/base/resource/resource_bundle.h" 21 #include "ui/base/resource/resource_bundle.h"
22 #include "ui/gfx/canvas_skia.h" 22 #include "ui/gfx/canvas_skia.h"
23 #include "ui/gfx/skbitmap_operations.h" 23 #include "ui/gfx/skbitmap_operations.h"
24 #include "views/controls/menu/menu_2.h" 24 #include "views/controls/menu/menu_item_view.h"
25 #include "views/controls/menu/submenu_view.h"
26 #include "views/widget/widget.h"
25 #include "views/window/window.h" 27 #include "views/window/window.h"
26 28
29 using views::MenuItemView;
30
27 namespace { 31 namespace {
28 // Constants passed to Javascript: 32 // Constants passed to Javascript:
29 static const char* kNetworkTypeEthernet = "ethernet"; 33 static const char* kNetworkTypeEthernet = "ethernet";
30 static const char* kNetworkTypeWifi = "wifi"; 34 static const char* kNetworkTypeWifi = "wifi";
31 static const char* kNetworkTypeCellular = "cellular"; 35 static const char* kNetworkTypeCellular = "cellular";
32 static const char* kNetworkTypeOther = "other"; 36 static const char* kNetworkTypeOther = "other";
33 37
34 static const char* kNetworkStatusConnected = "connected"; 38 static const char* kNetworkStatusConnected = "connected";
35 static const char* kNetworkStatusConnecting = "connecting"; 39 static const char* kNetworkStatusConnecting = "connecting";
36 static const char* kNetworkStatusDisconnected = "disconnected"; 40 static const char* kNetworkStatusDisconnected = "disconnected";
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
82 const int NetworkMenu::kNumAnimatingImages = 10; 86 const int NetworkMenu::kNumAnimatingImages = 10;
83 87
84 // static 88 // static
85 SkBitmap NetworkMenu::kAnimatingImages[kNumAnimatingImages]; 89 SkBitmap NetworkMenu::kAnimatingImages[kNumAnimatingImages];
86 90
87 // static 91 // static
88 SkBitmap NetworkMenu::kAnimatingImagesBlack[kNumAnimatingImages]; 92 SkBitmap NetworkMenu::kAnimatingImagesBlack[kNumAnimatingImages];
89 93
90 NetworkMenu::NetworkMenu() 94 NetworkMenu::NetworkMenu()
91 : min_width_(-1) { 95 : min_width_(-1) {
92 network_menu_.reset(new views::Menu2(this)); 96 network_menu_.reset(new views::MenuItemView(this));
97 network_menu_->set_has_icons(true);
93 } 98 }
94 99
95 NetworkMenu::~NetworkMenu() { 100 NetworkMenu::~NetworkMenu() {
96 } 101 }
97 102
98 bool NetworkMenu::GetNetworkAt(int index, NetworkInfo* info) const { 103 bool NetworkMenu::GetNetworkAt(int index, NetworkInfo* info) const {
99 DCHECK(info); 104 DCHECK(info);
100 bool res = true; // True unless a network doesn't exist. 105 bool res = true; // True unless a network doesn't exist.
101 int flags = menu_items_[index].flags; 106 int flags = menu_items_[index].flags;
102 NetworkLibrary* cros = CrosLibrary::Get()->GetNetworkLibrary(); 107 NetworkLibrary* cros = CrosLibrary::Get()->GetNetworkLibrary();
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
248 // display a notification. 253 // display a notification.
249 // TODO(stevenjb): Show notification. 254 // TODO(stevenjb): Show notification.
250 } 255 }
251 } else if (flags & FLAG_OTHER_NETWORK) { 256 } else if (flags & FLAG_OTHER_NETWORK) {
252 ShowOther(); 257 ShowOther();
253 } 258 }
254 return true; 259 return true;
255 } 260 }
256 261
257 //////////////////////////////////////////////////////////////////////////////// 262 ////////////////////////////////////////////////////////////////////////////////
258 // NetworkMenu, ui::MenuModel implementation: 263 // NetworkMenu, views::MenuItemView implementation:
259 264 std::wstring NetworkMenu::GetLabel(int id) const {
260 int NetworkMenu::GetItemCount() const { 265 DCHECK(id >= 0 && id < static_cast<int>(menu_items_.size()));
oshima 2011/04/14 17:27:31 use two DCHECK_LE (or _GT)
rhashimoto 2011/04/14 18:27:04 Done.
261 return static_cast<int>(menu_items_.size()); 266 return UTF16ToWide(menu_items_[id].label);
262 } 267 }
263 268
264 ui::MenuModel::ItemType NetworkMenu::GetTypeAt(int index) const { 269 const gfx::Font* NetworkMenu::GetLabelFont(int id) const
265 return menu_items_[index].type; 270 {
271 return (menu_items_[id].flags & FLAG_ASSOCIATED) ?
272 &ResourceBundle::GetSharedInstance().GetFont(ResourceBundle::BoldFont) :
273 &ResourceBundle::GetSharedInstance().GetFont(ResourceBundle::BaseFont);
266 } 274 }
267 275
268 string16 NetworkMenu::GetLabelAt(int index) const { 276 bool NetworkMenu::IsCommandEnabled(int id) const {
269 return menu_items_[index].label; 277 if (id < static_cast<int>(menu_items_.size()))
278 return !(menu_items_[id].flags & FLAG_DISABLED);
279 else
280 return false;
oshima 2011/04/14 17:27:31 can this happen? or should we use DCHECK?
rhashimoto 2011/04/14 18:27:04 This can happen. This method is called with 0 bef
oshima 2011/04/15 22:26:51 Hmm, that sounds odd. Can you check why this is ha
rhashimoto 2011/04/15 23:44:32 Commands are ids, not indices, and there is one na
oshima 2011/04/15 23:52:19 Yes, but i still don't understand why we're doing
270 } 281 }
271 282
272 const gfx::Font* NetworkMenu::GetLabelFontAt(int index) const { 283 bool NetworkMenu::IsItemChecked(int id) const {
273 return (menu_items_[index].flags & FLAG_ASSOCIATED) ? 284 DCHECK(id >= 0 && id < static_cast<int>(menu_items_.size()));
oshima 2011/04/14 17:27:31 same here
rhashimoto 2011/04/14 18:27:04 Done.
274 &ResourceBundle::GetSharedInstance().GetFont(ResourceBundle::BoldFont) : 285 return menu_items_[id].type == ui::MenuModel::TYPE_CHECK;
275 NULL;
276 } 286 }
277 287
278 bool NetworkMenu::IsItemCheckedAt(int index) const { 288 void NetworkMenu::ExecuteCommand(int id) {
279 // All ui::MenuModel::TYPE_CHECK menu items are checked. 289 DCHECK(id >= 0 && id < static_cast<int>(menu_items_.size()));
oshima 2011/04/14 17:27:31 same here
rhashimoto 2011/04/14 18:27:04 Done.
280 return true;
281 }
282 290
283 bool NetworkMenu::GetIconAt(int index, SkBitmap* icon) {
284 if (!menu_items_[index].icon.empty()) {
285 *icon = menu_items_[index].icon;
286 return true;
287 }
288 return false;
289 }
290
291 bool NetworkMenu::IsEnabledAt(int index) const {
292 return !(menu_items_[index].flags & FLAG_DISABLED);
293 }
294
295 void NetworkMenu::ActivatedAt(int index) {
296 // When we are refreshing the menu, ignore menu item activation. 291 // When we are refreshing the menu, ignore menu item activation.
297 if (refreshing_menu_) 292 if (refreshing_menu_)
298 return; 293 return;
299 294
300 NetworkLibrary* cros = CrosLibrary::Get()->GetNetworkLibrary(); 295 NetworkLibrary* cros = CrosLibrary::Get()->GetNetworkLibrary();
301 int flags = menu_items_[index].flags; 296 int flags = menu_items_[id].flags;
302 if (flags & FLAG_OPTIONS) { 297 if (flags & FLAG_OPTIONS) {
303 OpenButtonOptions(); 298 OpenButtonOptions();
304 } else if (flags & FLAG_TOGGLE_ETHERNET) { 299 } else if (flags & FLAG_TOGGLE_ETHERNET) {
305 cros->EnableEthernetNetworkDevice(!cros->ethernet_enabled()); 300 cros->EnableEthernetNetworkDevice(!cros->ethernet_enabled());
306 } else if (flags & FLAG_TOGGLE_WIFI) { 301 } else if (flags & FLAG_TOGGLE_WIFI) {
307 cros->EnableWifiNetworkDevice(!cros->wifi_enabled()); 302 cros->EnableWifiNetworkDevice(!cros->wifi_enabled());
308 } else if (flags & FLAG_TOGGLE_CELLULAR) { 303 } else if (flags & FLAG_TOGGLE_CELLULAR) {
309 cros->EnableCellularNetworkDevice(!cros->cellular_enabled()); 304 cros->EnableCellularNetworkDevice(!cros->cellular_enabled());
310 // TODO(nkostylev): Integrate with SIM locked state. crosbug.com/12007. 305 // TODO(nkostylev): Integrate with SIM locked state. crosbug.com/12007.
311 // SimUnlockDialogDelegate::ShowDialog(GetNativeWindow()); 306 // SimUnlockDialogDelegate::ShowDialog(GetNativeWindow());
312 } else if (flags & FLAG_TOGGLE_OFFLINE) { 307 } else if (flags & FLAG_TOGGLE_OFFLINE) {
313 cros->EnableOfflineMode(!cros->offline_mode()); 308 cros->EnableOfflineMode(!cros->offline_mode());
314 } else if (flags & FLAG_ETHERNET) { 309 } else if (flags & FLAG_ETHERNET) {
315 if (cros->ethernet_connected()) { 310 if (cros->ethernet_connected()) {
316 ShowTabbedNetworkSettings(cros->ethernet_network()); 311 ShowTabbedNetworkSettings(cros->ethernet_network());
317 } 312 }
318 } else if (flags & FLAG_WIFI) { 313 } else if (flags & FLAG_WIFI) {
319 ConnectToNetworkAt(index, std::string(), std::string(), -1); 314 ConnectToNetworkAt(id, std::string(), std::string(), -1);
320 } else if (flags & FLAG_OTHER_NETWORK) { 315 } else if (flags & FLAG_OTHER_NETWORK) {
321 ConnectToNetworkAt(index, std::string(), std::string(), -1); 316 ConnectToNetworkAt(id, std::string(), std::string(), -1);
322 } else if (flags & FLAG_CELLULAR) { 317 } else if (flags & FLAG_CELLULAR) {
323 ConnectToNetworkAt(index, std::string(), std::string(), -1); 318 ConnectToNetworkAt(id, std::string(), std::string(), -1);
324 } 319 }
325 } 320 }
326 321
327 void NetworkMenu::SetFirstLevelMenuWidth(int width) { 322 void NetworkMenu::SetFirstLevelMenuWidth(int width) {
328 min_width_ = width; 323 min_width_ = width;
329 // This actually has no effect since menu is rebuilt before showing. 324 // This actually has no effect since menu is rebuilt before showing.
330 network_menu_->SetMinimumWidth(width);
331 } 325 }
332 326
333 void NetworkMenu::CancelMenu() { 327 void NetworkMenu::CancelMenu() {
334 network_menu_->CancelMenu(); 328 network_menu_->Cancel();
335 } 329 }
336 330
337 void NetworkMenu::UpdateMenu() { 331 void NetworkMenu::UpdateMenu() {
338 refreshing_menu_ = true; 332 refreshing_menu_ = true;
333
334 // Rebuild list of available networks.
339 InitMenuItems(); 335 InitMenuItems();
340 network_menu_->Rebuild(); 336
337 // Clear and repopulate MenuItemView.
338 network_menu_->CreateSubmenu()->RemoveAllChildViews(true);
339 for (int i = 0, n = menu_items_.size(); i < n; ++i)
340 {
oshima 2011/04/14 17:27:31 move { to previous ine
rhashimoto 2011/04/14 18:27:04 Done.
341 if (menu_items_[i].type == ui::MenuModel::TYPE_SEPARATOR)
342 network_menu_->AppendSeparator();
343 else
344 network_menu_->AppendMenuItemWithIcon(
345 i,
346 UTF16ToWide(menu_items_[i].label),
347 menu_items_[i].icon);
348 }
349
350 network_menu_->ChildrenChanged();
341 refreshing_menu_ = false; 351 refreshing_menu_ = false;
342 } 352 }
343 353
344 // static 354 // static
345 const SkBitmap* NetworkMenu::IconForNetworkStrength(const WifiNetwork* wifi, 355 const SkBitmap* NetworkMenu::IconForNetworkStrength(const WifiNetwork* wifi,
346 bool black) { 356 bool black) {
347 DCHECK(wifi); 357 DCHECK(wifi);
348 if (wifi->strength() == 0) { 358 if (wifi->strength() == 0) {
349 return ResourceBundle::GetSharedInstance().GetBitmapNamed( 359 return ResourceBundle::GetSharedInstance().GetBitmapNamed(
350 black ? IDR_STATUSBAR_NETWORK_BARS0_BLACK : 360 black ? IDR_STATUSBAR_NETWORK_BARS0_BLACK :
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
513 kBottomRightBadgeY); 523 kBottomRightBadgeY);
514 if (top_left_badge != NULL) 524 if (top_left_badge != NULL)
515 canvas.DrawBitmapInt(*top_left_badge, kTopLeftBadgeX, kTopLeftBadgeY); 525 canvas.DrawBitmapInt(*top_left_badge, kTopLeftBadgeX, kTopLeftBadgeY);
516 return canvas.ExtractBitmap(); 526 return canvas.ExtractBitmap();
517 } 527 }
518 528
519 //////////////////////////////////////////////////////////////////////////////// 529 ////////////////////////////////////////////////////////////////////////////////
520 // NetworkMenu, views::ViewMenuDelegate implementation: 530 // NetworkMenu, views::ViewMenuDelegate implementation:
521 531
522 void NetworkMenu::RunMenu(views::View* source, const gfx::Point& pt) { 532 void NetworkMenu::RunMenu(views::View* source, const gfx::Point& pt) {
523 refreshing_menu_ = true; 533 DCHECK(source == GetMenuButton());
oshima 2011/04/14 17:27:31 DCHECK_EQ
rhashimoto 2011/04/14 18:27:04 Done.
534
524 NetworkLibrary* cros = CrosLibrary::Get()->GetNetworkLibrary(); 535 NetworkLibrary* cros = CrosLibrary::Get()->GetNetworkLibrary();
525 cros->RequestNetworkScan(); 536 cros->RequestNetworkScan();
526 537
527 // Build initial menu items. They will be updated when UpdateMenu is 538 UpdateMenu();
528 // called from NetworkChanged.
529 InitMenuItems();
530 network_menu_->Rebuild();
531 539
532 // Restore menu width, if it was set up. 540 // TODO(rhashimoto): Remove this workaround when WebUI provides a
533 // NOTE: width isn't checked for correctness here since all width-related 541 // top-level widget on the ChromeOS login screen that is a window.
534 // logic implemented inside |network_menu_|. 542 // The current BackgroundView class for the ChromeOS login screen
535 if (min_width_ != -1) 543 // creates a owning Widget that has a native GtkWindow but is not a
536 network_menu_->SetMinimumWidth(min_width_); 544 // Window. This makes it impossible to get the NativeWindow via
537 refreshing_menu_ = false; 545 // the views API. This workaround casts the top-level NativeWidget
538 network_menu_->RunMenuAt(pt, views::Menu2::ALIGN_TOPRIGHT); 546 // to a NativeWindow that we can pass to MenuItemView::RunMenuAt().
547 gfx::NativeWindow window;
548 if (source->GetWindow()) {
549 // This is the normal case with a browser.
550 window = source->GetWindow()->GetNativeWindow();
551 } else {
552 #if defined(OS_WIN)
553 NOTREACHED();
554 #elif defined(USE_X11)
555 window = GTK_WINDOW(source->GetWidget()->GetNativeView());
556 #endif
557 }
558
559 gfx::Point screen_loc;
560 views::View::ConvertPointToScreen(source, &screen_loc);
561 gfx::Rect bounds(screen_loc, source->size());
562 network_menu_->RunMenuAt(
563 window,
564 GetMenuButton(),
565 bounds,
566 base::i18n::IsRTL() ? MenuItemView::TOPLEFT : MenuItemView::TOPRIGHT,
567 true);
539 } 568 }
540 569
541 void NetworkMenu::InitMenuItems() { 570 void NetworkMenu::InitMenuItems() {
542 // This gets called on initialization, so any changes should be reflected 571 // This gets called on initialization, so any changes should be reflected
543 // in CrosMock::SetNetworkLibraryStatusAreaExpectations(). 572 // in CrosMock::SetNetworkLibraryStatusAreaExpectations().
544 573
545 menu_items_.clear(); 574 menu_items_.clear();
546 // Populate our MenuItems with the current list of wifi networks. 575 // Populate our MenuItems with the current list of wifi networks.
547 NetworkLibrary* cros = CrosLibrary::Get()->GetNetworkLibrary(); 576 NetworkLibrary* cros = CrosLibrary::Get()->GetNetworkLibrary();
548 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); 577 ResourceBundle& rb = ResourceBundle::GetSharedInstance();
(...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after
814 if (!browser) 843 if (!browser)
815 return; 844 return;
816 browser->OpenMobilePlanTabAndActivate(); 845 browser->OpenMobilePlanTabAndActivate();
817 } 846 }
818 847
819 void NetworkMenu::ShowOther() const { 848 void NetworkMenu::ShowOther() const {
820 ShowNetworkConfigView(new NetworkConfigView()); 849 ShowNetworkConfigView(new NetworkConfigView());
821 } 850 }
822 851
823 } // namespace chromeos 852 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698