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 3 // found in the LICENSE file. 4 5 #ifndef ASH_SYSTEM_CHROMEOS_NETWORK_NETWORK_STATE_LIST_DETAILED_VIEW_H 6 #define ASH_SYSTEM_CHROMEOS_NETWORK_NETWORK_STATE_LIST_DETAILED_VIEW_H 7 8 #include <map> 9 #include <string> 10 #include <vector> 11 12 #include "ash/system/chromeos/network/network_detailed_view.h" 13 #include "ash/system/chromeos/network/network_icon.h" 14 #include "ash/system/chromeos/network/network_icon_animation_observer.h" 15 #include "ash/system/tray/view_click_listener.h" 16 #include "ash/system/user/login_status.h" 17 #include "base/memory/scoped_vector.h" 18 #include "base/memory/weak_ptr.h" 19 #include "ui/views/controls/button/button.h" 20 21 namespace chromeos { 22 class NetworkTypePattern; 23 } 24 25 namespace views { 26 class BubbleDelegateView; 27 } 28 29 namespace ash { 30 class HoverHighlightView; 31 class SystemTrayItem; 32 class TrayPopupLabelButton; 33 34 namespace tray { 35 36 struct NetworkInfo; 37 38 class NetworkStateListDetailedView 39 : public NetworkDetailedView, 40 public views::ButtonListener, 41 public ViewClickListener, 42 public network_icon::AnimationObserver, 43 public base::SupportsWeakPtr<NetworkStateListDetailedView> { 44 public: 45 enum ListType { 46 LIST_TYPE_NETWORK, 47 LIST_TYPE_VPN 48 }; 49 50 NetworkStateListDetailedView(SystemTrayItem* owner, 51 ListType list_type, 52 user::LoginStatus login); 53 virtual ~NetworkStateListDetailedView(); 54 55 // Overridden from NetworkDetailedView: 56 virtual void Init() OVERRIDE; 57 virtual DetailedViewType GetViewType() const OVERRIDE; 58 virtual void ManagerChanged() OVERRIDE; 59 virtual void NetworkListChanged() OVERRIDE; 60 virtual void NetworkServiceChanged( 61 const chromeos::NetworkState* network) OVERRIDE; 62 63 // network_icon::AnimationObserver overrides 64 virtual void NetworkIconChanged() OVERRIDE; 65 66 protected: 67 // Overridden from ButtonListener. 68 virtual void ButtonPressed(views::Button* sender, 69 const ui::Event& event) OVERRIDE; 70 71 // Overridden from ViewClickListener. 72 virtual void OnViewClicked(views::View* sender) OVERRIDE; 73 74 private: 75 class InfoBubble; 76 77 typedef std::map<views::View*, std::string> NetworkMap; 78 typedef std::map<std::string, HoverHighlightView*> ServicePathMap; 79 80 // Create UI components. 81 void CreateHeaderEntry(); 82 void CreateHeaderButtons(); 83 void CreateNetworkExtra(); 84 85 // Update UI components. 86 void UpdateHeaderButtons(); 87 void UpdateTechnologyButton(TrayPopupHeaderButton* button, 88 const chromeos::NetworkTypePattern& technology); 89 90 void UpdateNetworks( 91 const chromeos::NetworkStateHandler::NetworkStateList& networks); 92 void UpdateNetworkList(); 93 bool CreateOrUpdateInfoLabel( 94 int index, const base::string16& text, views::Label** label); 95 bool UpdateNetworkChild(int index, const NetworkInfo* info); 96 bool OrderChild(views::View* view, int index); 97 bool UpdateNetworkListEntries(std::set<std::string>* new_service_paths); 98 void UpdateNetworkExtra(); 99 100 // Adds a settings entry when logged in, and an entry for changing proxy 101 // settings otherwise. 102 void CreateSettingsEntry(); 103 104 // Create and manage the network info bubble. 105 void ToggleInfoBubble(); 106 bool ResetInfoBubble(); 107 void OnInfoBubbleDestroyed(); 108 views::View* CreateNetworkInfoView(); 109 110 // Periodically request a network scan. 111 void CallRequestScan(); 112 113 // Handle toggile mobile action 114 void ToggleMobile(); 115 116 // Type of list (all networks or vpn) 117 ListType list_type_; 118 119 // Track login state. 120 user::LoginStatus login_; 121 122 // A map of child views to their network service path. 123 NetworkMap network_map_; 124 125 // A map of network service paths to their view. 126 ServicePathMap service_path_map_; 127 128 // An owned list of network info. 129 ScopedVector<NetworkInfo> network_list_; 130 131 // Child views. 132 TrayPopupHeaderButton* info_icon_; 133 TrayPopupHeaderButton* button_wifi_; 134 TrayPopupHeaderButton* button_mobile_; 135 TrayPopupLabelButton* other_wifi_; 136 TrayPopupLabelButton* turn_on_wifi_; 137 TrayPopupLabelButton* other_mobile_; 138 TrayPopupLabelButton* other_vpn_; 139 TrayPopupLabelButton* settings_; 140 TrayPopupLabelButton* proxy_settings_; 141 views::Label* scanning_view_; 142 views::Label* no_wifi_networks_view_; 143 views::Label* no_cellular_networks_view_; 144 145 // A small bubble for displaying network info. 146 views::BubbleDelegateView* info_bubble_; 147 148 DISALLOW_COPY_AND_ASSIGN(NetworkStateListDetailedView); 149 }; 150 151 } // namespace tray 152 } // namespace ash 153 154 #endif // ASH_SYSTEM_CHROMEOS_NETWORK_NETWORK_STATE_LIST_DETAILED_VIEW 155