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

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: Fixes for merge with trunk. 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/choose_mobile_network_dialog.h" 11 #include "chrome/browser/chromeos/choose_mobile_network_dialog.h"
12 #include "chrome/browser/chromeos/cros/cros_library.h" 12 #include "chrome/browser/chromeos/cros/cros_library.h"
13 #include "chrome/browser/chromeos/sim_unlock_dialog_delegate.h" 13 #include "chrome/browser/chromeos/sim_unlock_dialog_delegate.h"
14 #include "chrome/browser/ui/browser.h" 14 #include "chrome/browser/ui/browser.h"
15 #include "chrome/browser/ui/browser_list.h" 15 #include "chrome/browser/ui/browser_list.h"
16 #include "chrome/browser/ui/views/window.h" 16 #include "chrome/browser/ui/views/window.h"
17 #include "chrome/common/url_constants.h" 17 #include "chrome/common/url_constants.h"
18 #include "grit/generated_resources.h" 18 #include "grit/generated_resources.h"
19 #include "grit/theme_resources.h" 19 #include "grit/theme_resources.h"
20 #include "net/base/escape.h" 20 #include "net/base/escape.h"
21 #include "ui/base/l10n/l10n_util.h" 21 #include "ui/base/l10n/l10n_util.h"
22 #include "ui/base/resource/resource_bundle.h" 22 #include "ui/base/resource/resource_bundle.h"
23 #include "ui/gfx/canvas_skia.h" 23 #include "ui/gfx/canvas_skia.h"
24 #include "ui/gfx/skbitmap_operations.h" 24 #include "ui/gfx/skbitmap_operations.h"
25 #include "views/controls/menu/menu_2.h" 25 #include "views/controls/menu/menu_item_view.h"
26 #include "views/controls/menu/submenu_view.h"
27 #include "views/widget/widget.h"
26 #include "views/window/window.h" 28 #include "views/window/window.h"
27 29
30 using views::MenuItemView;
31
28 namespace chromeos { 32 namespace chromeos {
29 33
30 //////////////////////////////////////////////////////////////////////////////// 34 ////////////////////////////////////////////////////////////////////////////////
31 // NetworkMenu 35 // NetworkMenu
32 36
33 // static 37 // static
34 const int NetworkMenu::kNumBarsImages = 4; 38 const int NetworkMenu::kNumBarsImages = 4;
35 39
36 // NOTE: Use an array rather than just calculating a resource number to avoid 40 // NOTE: Use an array rather than just calculating a resource number to avoid
37 // creating implicit ordering dependencies on the resource values. 41 // creating implicit ordering dependencies on the resource values.
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
70 const int NetworkMenu::kNumAnimatingImages = 10; 74 const int NetworkMenu::kNumAnimatingImages = 10;
71 75
72 // static 76 // static
73 SkBitmap NetworkMenu::kAnimatingImages[kNumAnimatingImages]; 77 SkBitmap NetworkMenu::kAnimatingImages[kNumAnimatingImages];
74 78
75 // static 79 // static
76 SkBitmap NetworkMenu::kAnimatingImagesBlack[kNumAnimatingImages]; 80 SkBitmap NetworkMenu::kAnimatingImagesBlack[kNumAnimatingImages];
77 81
78 NetworkMenu::NetworkMenu() 82 NetworkMenu::NetworkMenu()
79 : min_width_(-1) { 83 : min_width_(-1) {
80 network_menu_.reset(new views::Menu2(this)); 84 network_menu_.reset(new views::MenuItemView(this));
85 network_menu_->set_has_icons(true);
81 } 86 }
82 87
83 NetworkMenu::~NetworkMenu() { 88 NetworkMenu::~NetworkMenu() {
84 } 89 }
85 90
86 bool NetworkMenu::ConnectToNetworkAt(int index, 91 bool NetworkMenu::ConnectToNetworkAt(int index,
87 const std::string& passphrase, 92 const std::string& passphrase,
88 const std::string& ssid, 93 const std::string& ssid,
89 int auto_connect) const { 94 int auto_connect) const {
90 int flags = menu_items_[index].flags; 95 int flags = menu_items_[index].flags;
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
140 } 145 }
141 } else if (flags & FLAG_OTHER_WIFI_NETWORK) { 146 } else if (flags & FLAG_OTHER_WIFI_NETWORK) {
142 ShowOtherWifi(); 147 ShowOtherWifi();
143 } else if (flags & FLAG_OTHER_CELLULAR_NETWORK) { 148 } else if (flags & FLAG_OTHER_CELLULAR_NETWORK) {
144 ShowOtherCellular(); 149 ShowOtherCellular();
145 } 150 }
146 return true; 151 return true;
147 } 152 }
148 153
149 //////////////////////////////////////////////////////////////////////////////// 154 ////////////////////////////////////////////////////////////////////////////////
150 // NetworkMenu, ui::MenuModel implementation: 155 // NetworkMenu, views::MenuItemView implementation:
151 156 std::wstring NetworkMenu::GetLabel(int id) const {
152 int NetworkMenu::GetItemCount() const { 157 DCHECK_LE(0,id);
oshima 2011/04/15 17:40:12 space after , . same for the rest
rhashimoto 2011/04/15 21:20:27 Done.
153 return static_cast<int>(menu_items_.size()); 158 DCHECK_GT(static_cast<int>(menu_items_.size()),id);
159 return UTF16ToWide(menu_items_[id].label);
154 } 160 }
155 161
156 ui::MenuModel::ItemType NetworkMenu::GetTypeAt(int index) const { 162 const gfx::Font* NetworkMenu::GetLabelFont(int id) const
157 return menu_items_[index].type; 163 {
164 return (menu_items_[id].flags & FLAG_ASSOCIATED) ?
165 &ResourceBundle::GetSharedInstance().GetFont(ResourceBundle::BoldFont) :
166 &ResourceBundle::GetSharedInstance().GetFont(ResourceBundle::BaseFont);
158 } 167 }
159 168
160 string16 NetworkMenu::GetLabelAt(int index) const { 169 bool NetworkMenu::IsCommandEnabled(int id) const {
161 return menu_items_[index].label; 170 if (id < static_cast<int>(menu_items_.size()))
171 return !(menu_items_[id].flags & FLAG_DISABLED);
172 else
173 return false;
162 } 174 }
163 175
164 const gfx::Font* NetworkMenu::GetLabelFontAt(int index) const { 176 bool NetworkMenu::IsItemChecked(int id) const {
165 return (menu_items_[index].flags & FLAG_ASSOCIATED) ? 177 DCHECK_LE(0,id);
166 &ResourceBundle::GetSharedInstance().GetFont(ResourceBundle::BoldFont) : 178 DCHECK_GT(static_cast<int>(menu_items_.size()),id);
167 NULL; 179 return menu_items_[id].type == ui::MenuModel::TYPE_CHECK;
168 } 180 }
169 181
170 bool NetworkMenu::IsItemCheckedAt(int index) const { 182 void NetworkMenu::ExecuteCommand(int id) {
171 // All ui::MenuModel::TYPE_CHECK menu items are checked. 183 DCHECK_LE(0,id);
172 return true; 184 DCHECK_GT(static_cast<int>(menu_items_.size()),id);
173 }
174 185
175 bool NetworkMenu::GetIconAt(int index, SkBitmap* icon) {
176 if (!menu_items_[index].icon.empty()) {
177 *icon = menu_items_[index].icon;
178 return true;
179 }
180 return false;
181 }
182
183 bool NetworkMenu::IsEnabledAt(int index) const {
184 return !(menu_items_[index].flags & FLAG_DISABLED);
185 }
186
187 void NetworkMenu::ActivatedAt(int index) {
188 // When we are refreshing the menu, ignore menu item activation. 186 // When we are refreshing the menu, ignore menu item activation.
189 if (refreshing_menu_) 187 if (refreshing_menu_)
190 return; 188 return;
191 189
192 NetworkLibrary* cros = CrosLibrary::Get()->GetNetworkLibrary(); 190 NetworkLibrary* cros = CrosLibrary::Get()->GetNetworkLibrary();
193 int flags = menu_items_[index].flags; 191 int flags = menu_items_[id].flags;
194 if (flags & FLAG_OPTIONS) { 192 if (flags & FLAG_OPTIONS) {
195 OpenButtonOptions(); 193 OpenButtonOptions();
196 } else if (flags & FLAG_TOGGLE_ETHERNET) { 194 } else if (flags & FLAG_TOGGLE_ETHERNET) {
197 cros->EnableEthernetNetworkDevice(!cros->ethernet_enabled()); 195 cros->EnableEthernetNetworkDevice(!cros->ethernet_enabled());
198 } else if (flags & FLAG_TOGGLE_WIFI) { 196 } else if (flags & FLAG_TOGGLE_WIFI) {
199 cros->EnableWifiNetworkDevice(!cros->wifi_enabled()); 197 cros->EnableWifiNetworkDevice(!cros->wifi_enabled());
200 } else if (flags & FLAG_TOGGLE_CELLULAR) { 198 } else if (flags & FLAG_TOGGLE_CELLULAR) {
201 cros->EnableCellularNetworkDevice(!cros->cellular_enabled()); 199 cros->EnableCellularNetworkDevice(!cros->cellular_enabled());
202 // TODO(nkostylev): Integrate with SIM locked state. crosbug.com/12007. 200 // TODO(nkostylev): Integrate with SIM locked state. crosbug.com/12007.
203 // SimUnlockDialogDelegate::ShowDialog(GetNativeWindow()); 201 // SimUnlockDialogDelegate::ShowDialog(GetNativeWindow());
204 } else if (flags & FLAG_TOGGLE_OFFLINE) { 202 } else if (flags & FLAG_TOGGLE_OFFLINE) {
205 cros->EnableOfflineMode(!cros->offline_mode()); 203 cros->EnableOfflineMode(!cros->offline_mode());
206 } else if (flags & FLAG_ETHERNET) { 204 } else if (flags & FLAG_ETHERNET) {
207 if (cros->ethernet_connected()) { 205 if (cros->ethernet_connected()) {
208 ShowTabbedNetworkSettings(cros->ethernet_network()); 206 ShowTabbedNetworkSettings(cros->ethernet_network());
209 } 207 }
210 } else if (flags & FLAG_WIFI) { 208 } else if (flags & FLAG_WIFI) {
211 ConnectToNetworkAt(index, std::string(), std::string(), -1); 209 ConnectToNetworkAt(id, std::string(), std::string(), -1);
212 } else if (flags & FLAG_OTHER_WIFI_NETWORK) { 210 } else if (flags & FLAG_OTHER_WIFI_NETWORK) {
213 ConnectToNetworkAt(index, std::string(), std::string(), -1); 211 ConnectToNetworkAt(id, std::string(), std::string(), -1);
214 } else if (flags & FLAG_CELLULAR) { 212 } else if (flags & FLAG_CELLULAR) {
215 ConnectToNetworkAt(index, std::string(), std::string(), -1); 213 ConnectToNetworkAt(id, std::string(), std::string(), -1);
216 } else if (flags & FLAG_OTHER_CELLULAR_NETWORK) { 214 } else if (flags & FLAG_OTHER_CELLULAR_NETWORK) {
217 ConnectToNetworkAt(index, std::string(), std::string(), -1); 215 ConnectToNetworkAt(id, std::string(), std::string(), -1);
218 } 216 }
219 } 217 }
220 218
221 void NetworkMenu::SetFirstLevelMenuWidth(int width) { 219 void NetworkMenu::SetFirstLevelMenuWidth(int width) {
222 min_width_ = width; 220 min_width_ = width;
223 // This actually has no effect since menu is rebuilt before showing. 221 // This actually has no effect since menu is rebuilt before showing.
224 network_menu_->SetMinimumWidth(width);
225 } 222 }
226 223
227 void NetworkMenu::CancelMenu() { 224 void NetworkMenu::CancelMenu() {
228 network_menu_->CancelMenu(); 225 network_menu_->Cancel();
229 } 226 }
230 227
231 void NetworkMenu::UpdateMenu() { 228 void NetworkMenu::UpdateMenu() {
232 refreshing_menu_ = true; 229 refreshing_menu_ = true;
230
231 // Rebuild list of available networks.
233 InitMenuItems(); 232 InitMenuItems();
234 network_menu_->Rebuild(); 233
234 // Clear and repopulate MenuItemView.
235 network_menu_->CreateSubmenu()->RemoveAllChildViews(true);
236 for (int i = 0, n = menu_items_.size(); i < n; ++i) {
237 if (menu_items_[i].type == ui::MenuModel::TYPE_SEPARATOR)
238 network_menu_->AppendSeparator();
239 else
240 network_menu_->AppendMenuItemWithIcon(
241 i,
242 UTF16ToWide(menu_items_[i].label),
243 menu_items_[i].icon);
244 }
245
246 network_menu_->ChildrenChanged();
235 refreshing_menu_ = false; 247 refreshing_menu_ = false;
236 } 248 }
237 249
238 // static 250 // static
239 const SkBitmap* NetworkMenu::IconForNetworkStrength(const WifiNetwork* wifi, 251 const SkBitmap* NetworkMenu::IconForNetworkStrength(const WifiNetwork* wifi,
240 bool black) { 252 bool black) {
241 DCHECK(wifi); 253 DCHECK(wifi);
242 if (wifi->strength() == 0) { 254 if (wifi->strength() == 0) {
243 return ResourceBundle::GetSharedInstance().GetBitmapNamed( 255 return ResourceBundle::GetSharedInstance().GetBitmapNamed(
244 black ? IDR_STATUSBAR_NETWORK_BARS0_BLACK : 256 black ? IDR_STATUSBAR_NETWORK_BARS0_BLACK :
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
407 kBottomRightBadgeY); 419 kBottomRightBadgeY);
408 if (top_left_badge != NULL) 420 if (top_left_badge != NULL)
409 canvas.DrawBitmapInt(*top_left_badge, kTopLeftBadgeX, kTopLeftBadgeY); 421 canvas.DrawBitmapInt(*top_left_badge, kTopLeftBadgeX, kTopLeftBadgeY);
410 return canvas.ExtractBitmap(); 422 return canvas.ExtractBitmap();
411 } 423 }
412 424
413 //////////////////////////////////////////////////////////////////////////////// 425 ////////////////////////////////////////////////////////////////////////////////
414 // NetworkMenu, views::ViewMenuDelegate implementation: 426 // NetworkMenu, views::ViewMenuDelegate implementation:
415 427
416 void NetworkMenu::RunMenu(views::View* source, const gfx::Point& pt) { 428 void NetworkMenu::RunMenu(views::View* source, const gfx::Point& pt) {
417 refreshing_menu_ = true; 429 DCHECK_EQ(GetMenuButton(),source);
430
418 NetworkLibrary* cros = CrosLibrary::Get()->GetNetworkLibrary(); 431 NetworkLibrary* cros = CrosLibrary::Get()->GetNetworkLibrary();
419 cros->RequestNetworkScan(); 432 cros->RequestNetworkScan();
420 433
421 // Build initial menu items. They will be updated when UpdateMenu is 434 UpdateMenu();
422 // called from NetworkChanged.
423 InitMenuItems();
424 network_menu_->Rebuild();
425 435
426 // Restore menu width, if it was set up. 436 // TODO(rhashimoto): Remove this workaround when WebUI provides a
427 // NOTE: width isn't checked for correctness here since all width-related 437 // top-level widget on the ChromeOS login screen that is a window.
428 // logic implemented inside |network_menu_|. 438 // The current BackgroundView class for the ChromeOS login screen
429 if (min_width_ != -1) 439 // creates a owning Widget that has a native GtkWindow but is not a
430 network_menu_->SetMinimumWidth(min_width_); 440 // Window. This makes it impossible to get the NativeWindow via
431 refreshing_menu_ = false; 441 // the views API. This workaround casts the top-level NativeWidget
432 network_menu_->RunMenuAt(pt, views::Menu2::ALIGN_TOPRIGHT); 442 // to a NativeWindow that we can pass to MenuItemView::RunMenuAt().
443 gfx::NativeWindow window;
444 if (source->GetWindow()) {
445 // This is the normal case with a browser.
446 window = source->GetWindow()->GetNativeWindow();
447 } else {
448 #if defined(OS_WIN)
449 NOTREACHED();
450 #elif defined(USE_X11)
451 window = GTK_WINDOW(source->GetWidget()->GetNativeView());
452 #endif
453 }
454
455 gfx::Point screen_loc;
456 views::View::ConvertPointToScreen(source, &screen_loc);
457 gfx::Rect bounds(screen_loc, source->size());
458 network_menu_->RunMenuAt(
459 window,
460 GetMenuButton(),
461 bounds,
462 base::i18n::IsRTL() ? MenuItemView::TOPLEFT : MenuItemView::TOPRIGHT,
463 true);
433 } 464 }
434 465
435 void NetworkMenu::InitMenuItems() { 466 void NetworkMenu::InitMenuItems() {
436 // This gets called on initialization, so any changes should be reflected 467 // This gets called on initialization, so any changes should be reflected
437 // in CrosMock::SetNetworkLibraryStatusAreaExpectations(). 468 // in CrosMock::SetNetworkLibraryStatusAreaExpectations().
438 469
439 menu_items_.clear(); 470 menu_items_.clear();
440 // Populate our MenuItems with the current list of wifi networks. 471 // Populate our MenuItems with the current list of wifi networks.
441 NetworkLibrary* cros = CrosLibrary::Get()->GetNetworkLibrary(); 472 NetworkLibrary* cros = CrosLibrary::Get()->GetNetworkLibrary();
442 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); 473 ResourceBundle& rb = ResourceBundle::GetSharedInstance();
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after
726 757
727 void NetworkMenu::ShowOtherWifi() const { 758 void NetworkMenu::ShowOtherWifi() const {
728 ShowNetworkConfigView(new NetworkConfigView()); 759 ShowNetworkConfigView(new NetworkConfigView());
729 } 760 }
730 761
731 void NetworkMenu::ShowOtherCellular() const { 762 void NetworkMenu::ShowOtherCellular() const {
732 ChooseMobileNetworkDialog::ShowDialog(GetNativeWindow()); 763 ChooseMobileNetworkDialog::ShowDialog(GetNativeWindow());
733 } 764 }
734 765
735 } // namespace chromeos 766 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698