Index: chrome/browser/chromeos/network_menu_button.cc |
=================================================================== |
--- chrome/browser/chromeos/network_menu_button.cc (revision 0) |
+++ chrome/browser/chromeos/network_menu_button.cc (revision 0) |
@@ -0,0 +1,172 @@ |
+// Copyright (c) 2009 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. |
+ |
+#include "chrome/browser/chromeos/network_menu_button.h" |
+ |
+#include "app/l10n_util.h" |
+#include "app/resource_bundle.h" |
+#include "base/string_util.h" |
+#include "chrome/browser/browser.h" |
+#include "chrome/browser/browser_window.h" |
+#include "grit/generated_resources.h" |
+#include "grit/theme_resources.h" |
+#include "views/widget/widget.h" |
+#include "views/window/window.h" |
+ |
+//////////////////////////////////////////////////////////////////////////////// |
+// NetworkMenuButton |
+ |
+// static |
+const int NetworkMenuButton::kNumWifiImages = 8; |
+SkBitmap* NetworkMenuButton::wifi_images_[kNumWifiImages]; |
+SkBitmap* NetworkMenuButton::wired_image_ = NULL; |
+SkBitmap* NetworkMenuButton::disconnected_image_ = NULL; |
+ |
+NetworkMenuButton::NetworkMenuButton(Browser* browser) |
+ : MenuButton(NULL, std::wstring(), this, false), |
+ refreshing_menu_(false), |
+ network_menu_(this), |
+ browser_(browser) { |
+ static bool initialized = false; |
+ if (!initialized) { |
+ ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
+ int image_index = IDR_STATUSBAR_WIFI_1; |
+ for (int i = 0; i < kNumWifiImages; i++) |
+ wifi_images_[i] = rb.GetBitmapNamed(image_index + i); |
+ wired_image_ = rb.GetBitmapNamed(IDR_STATUSBAR_WIRED); |
+ disconnected_image_ = rb.GetBitmapNamed(IDR_STATUSBAR_DISCONNECTED); |
+ initialized = true; |
+ } |
+ SetIcon(*disconnected_image_); |
+} |
+ |
+//////////////////////////////////////////////////////////////////////////////// |
+// NetworkMenuButton, views::Menu2Model implementation: |
+ |
+int NetworkMenuButton::GetItemCount() const { |
+ // The menu contains the available wifi networks. If there are none, then it |
+ // only has one item with a message that no networks are available. |
+ return wifi_networks_.empty() ? 1 : static_cast<int>(wifi_networks_.size()); |
+} |
+ |
+views::Menu2Model::ItemType NetworkMenuButton::GetTypeAt(int index) const { |
+ return views::Menu2Model::TYPE_CHECK; |
+} |
+ |
+int NetworkMenuButton::GetCommandIdAt(int index) const { |
+ return index; |
+} |
+ |
+string16 NetworkMenuButton::GetLabelAt(int index) const { |
+ return wifi_networks_.empty() ? |
+ l10n_util::GetStringUTF16(IDS_STATUSBAR_NO_NETWORKS_MESSAGE) : |
+ wifi_networks_[index].ssid; |
+} |
+ |
+bool NetworkMenuButton::IsItemCheckedAt(int index) const { |
+ return GetLabelAt(index) == current_ssid_; |
+} |
+ |
+bool NetworkMenuButton::IsEnabledAt(int index) const { |
+ return !wifi_networks_.empty(); |
+} |
+ |
+void NetworkMenuButton::ActivatedAt(int index) { |
+ // When we are refreshing the menu, ignore menu item activation. |
+ if (refreshing_menu_) |
+ return; |
+ |
+ connecting_ssid_ = wifi_networks_[index].ssid; |
+ if (wifi_networks_[index].encryption.empty()) { |
+ ConnectToWifiNetwork(connecting_ssid_, string16()); |
+ } else { |
+ // If network requires password, we open a password dialog window. |
+ gfx::NativeWindow parent = browser_->window()->GetNativeHandle(); |
+ PasswordDialogView* dialog = new PasswordDialogView(this); |
+ views::Window* window = views::Window::CreateChromeWindow( |
+ parent, gfx::Rect(), dialog); |
+ // Draw the password dialog right below this button and right aligned. |
+ gfx::Size size = dialog->GetPreferredSize(); |
+ gfx::Rect rect = bounds(); |
+ gfx::Point point = gfx::Point(rect.width() - size.width(), rect.height()); |
+ ConvertPointToScreen(this, &point); |
+ window->SetBounds(gfx::Rect(point, size), parent); |
+ window->Show(); |
+ } |
+} |
+ |
+//////////////////////////////////////////////////////////////////////////////// |
+// NetworkMenuButton, PasswordDialogDelegate implementation: |
+ |
+bool NetworkMenuButton::OnPasswordDialogCancel() { |
+ connecting_ssid_.clear(); |
+ return true; |
+} |
+ |
+bool NetworkMenuButton::OnPasswordDialogAccept(const string16& password) { |
+ return ConnectToWifiNetwork(connecting_ssid_, password); |
+} |
+ |
+//////////////////////////////////////////////////////////////////////////////// |
+// NetworkMenuButton, views::ViewMenuDelegate implementation: |
+ |
+void NetworkMenuButton::RunMenu(views::View* source, const gfx::Point& pt, |
+ gfx::NativeView hwnd) { |
+ RefreshWifiNetworks(); |
+ refreshing_menu_ = true; |
+ network_menu_.Rebuild(); |
+ network_menu_.UpdateStates(); |
+ refreshing_menu_ = false; |
+ network_menu_.RunMenuAt(pt, views::Menu2::ALIGN_TOPRIGHT); |
+} |
+ |
+void NetworkMenuButton::AddWifiNetwork(const string16& ssid, |
+ const string16& encryption, |
+ int strength) { |
+ wifi_networks_.push_back(WifiNetwork(ssid, encryption, strength)); |
+} |
+ |
+void NetworkMenuButton::RefreshWifiNetworks() { |
+ // TODO(chocobo): Refresh wifi model here. |
+ wifi_networks_.clear(); |
+ AddWifiNetwork(ASCIIToUTF16("Wifi 12"), string16(), 12); |
+ AddWifiNetwork(ASCIIToUTF16("Wifi 28"), string16(), 28); |
+ AddWifiNetwork(ASCIIToUTF16("Wifi 70"), string16(), 70); |
+ AddWifiNetwork(ASCIIToUTF16("Wifi 99"), ASCIIToUTF16("WPA-PSK"), 99); |
+ |
+ // TODO(chocobo): Handle the case where current_ssid_ or connecting_ssid_ are |
+ // no longer found in the list of wifi networks. |
+ |
+ // Refresh the menu button image. |
+ if (current_ssid_.empty()) { |
+ SetIcon(*disconnected_image_); |
+ } else { |
+ int size = static_cast<int>(wifi_networks_.size()); |
+ for (int i = 0; i < size; i++) { |
+ if (wifi_networks_[i].ssid == current_ssid_) { |
+ SetIcon(GetWifiImage(wifi_networks_[i])); |
+ } |
+ } |
+ } |
+ SchedulePaint(); |
+} |
+ |
+bool NetworkMenuButton::ConnectToWifiNetwork(const string16& ssid, |
+ const string16& password) { |
+ // TODO(chocobo): Connect to wifi here. |
+ current_ssid_ = ssid; |
+ connecting_ssid_.clear(); |
+ RefreshWifiNetworks(); |
+ return true; |
+} |
+ |
+SkBitmap NetworkMenuButton::GetWifiImage(WifiNetwork wifi_network) const { |
+ // Returns the wifi image of 1-8 bars depending on signal strength. |
+ // Since signal strenght is from 0 to 100, we need to convert that to 0 to 7. |
+ int index = floor(wifi_network.strength / (100.0 / kNumWifiImages)); |
+ // This can happen if the signal strength is 100. |
+ if (index == kNumWifiImages) |
+ index--; |
+ return *wifi_images_[index]; |
+} |
Property changes on: chrome/browser/chromeos/network_menu_button.cc |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |