network_menu.h revision 5e3f23d412006dc4db4e659864679f29341e113f
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_CHROMEOS_STATUS_NETWORK_MENU_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_CHROMEOS_STATUS_NETWORK_MENU_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
135e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string16.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/native_widget_types.h"  // gfx::NativeWindow
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Browser;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MenuModel;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MenuItemView;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MenuButton;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MenuRunner;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NetworkMenuModel;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class builds and manages a ui::MenuModel used to build network
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// menus. It does not represent an actual menu widget. The menu is populated
34868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// with the list of wifi and mobile networks, and handles connecting to
35868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// existing networks or spawning UI to configure a new network.
36868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)//
37868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// This class is now only used to build the dropdown menu in the oobe and
38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// other web based login screen UI. See ash::NetworkStateListDetailedView for
39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// the status area network list. TODO(stevenjb): Integrate this with the
40868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// login UI code.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The network menu model looks like this:
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// <icon>  Ethernet
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// <icon>  Wifi Network A
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// <icon>  Wifi Network B
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// <icon>  Wifi Network C
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// <icon>  Cellular Network A
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// <icon>  Cellular Network B
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// <icon>  Cellular Network C
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// <icon>  Other Wi-Fi network...
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// --------------------------------
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//         Disable Wifi
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//         Disable Celluar
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// --------------------------------
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//         <IP Address>
57868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)//         Proxy settings...
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// <icon> will show the strength of the wifi/cellular networks.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The label will be BOLD if the network is currently connected.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NetworkMenu {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class Delegate {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual gfx::NativeWindow GetNativeWindow() const = 0;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void OpenButtonOptions() = 0;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool ShouldOpenButtonOptions() const = 0;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit NetworkMenu(Delegate* delegate);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~NetworkMenu();
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Access to menu definition.
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::MenuModel* GetMenuModel();
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Update the menu (e.g. when the network list or status has changed).
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void UpdateMenu();
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private:
8190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  friend class NetworkMenuModel;
8290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Getters.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Delegate* delegate() const { return delegate_; }
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Weak ptr to delegate.
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Delegate* delegate_;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set to true if we are currently refreshing the menu.
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool refreshing_menu_;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The network menu.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<NetworkMenuModel> main_menu_model_;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Weak pointer factory so we can start connections at a later time
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // without worrying that they will actually try to happen after the lifetime
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // of this object.
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtrFactory<NetworkMenu> weak_pointer_factory_;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(NetworkMenu);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_CHROMEOS_STATUS_NETWORK_MENU_H_
106