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)#include "chrome/browser/chromeos/options/network_config_view.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shell.h"
105e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string_util.h"
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/ui/login_display_host_impl.h"
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/users/user.h"
1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/chromeos/options/network_property_ui_data.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/options/vpn_config_view.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/options/wifi_config_view.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/options/wimax_config_view.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_finder.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/host_desktop.h"
23a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "chromeos/login/login_state.h"
24ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chromeos/network/network_state.h"
25ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chromeos/network/network_state_handler.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/chromium_strings.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/locale_settings.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/theme_resources.h"
30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/accessibility/ax_view_state.h"
31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/aura/window_event_dispatcher.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect.h"
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/controls/button/label_button.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/image_view.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/layout_constants.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using views::Widget;
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)gfx::NativeWindow GetParentForUnhostedDialog() {
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (chromeos::LoginDisplayHostImpl::default_host()) {
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return chromeos::LoginDisplayHostImpl::default_host()->GetNativeWindow();
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Browser* browser = chrome::FindTabbedBrowser(
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ProfileManager::GetPrimaryUserProfile(),
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        true,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        chrome::HOST_DESKTOP_TYPE_ASH);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (browser)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return browser->window()->GetNativeWindow();
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Avoid global static initializer.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)chromeos::NetworkConfigView** GetActiveDialogPointer() {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static chromeos::NetworkConfigView* active_dialog = NULL;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return &active_dialog;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)chromeos::NetworkConfigView* GetActiveDialog() {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return *(GetActiveDialogPointer());
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetActiveDialog(chromeos::NetworkConfigView* dialog) {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *(GetActiveDialogPointer()) = dialog;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int ChildNetworkConfigView::kInputFieldMinWidth = 270;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
80ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochNetworkConfigView::NetworkConfigView()
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : child_config_view_(NULL),
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      delegate_(NULL),
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      advanced_button_(NULL) {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(GetActiveDialog() == NULL);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetActiveDialog(this);
86ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
87ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool NetworkConfigView::InitWithNetworkState(const NetworkState* network) {
89ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DCHECK(network);
90ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  std::string service_path = network->path();
91effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (network->type() == shill::kTypeWifi ||
92effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      network->type() == shill::kTypeEthernet) {
93ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    child_config_view_ = new WifiConfigView(this, service_path, false);
94effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  } else if (network->type() == shill::kTypeWimax) {
95ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    child_config_view_ = new WimaxConfigView(this, service_path);
96effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  } else if (network->type() == shill::kTypeVPN) {
97ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    child_config_view_ = new VPNConfigView(this, service_path);
98effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return child_config_view_ != NULL;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool NetworkConfigView::InitWithType(const std::string& type) {
10368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (type == shill::kTypeWifi) {
104ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    child_config_view_ = new WifiConfigView(this,
105ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                            "" /* service_path */,
106ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                            false /* show_8021x */);
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    advanced_button_ = new views::LabelButton(this, l10n_util::GetStringUTF16(
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_ADVANCED_BUTTON));
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    advanced_button_->SetStyle(views::Button::STYLE_BUTTON);
11068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  } else if (type == shill::kTypeVPN) {
111ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    child_config_view_ = new VPNConfigView(this,
112ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                           "" /* service_path */);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return child_config_view_ != NULL;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NetworkConfigView::~NetworkConfigView() {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(GetActiveDialog() == this);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetActiveDialog(NULL);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
123ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid NetworkConfigView::Show(const std::string& service_path,
124ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                             gfx::NativeWindow parent) {
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetActiveDialog() != NULL)
1267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
127ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  NetworkConfigView* view = new NetworkConfigView();
128ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  const NetworkState* network = NetworkHandler::Get()->network_state_handler()->
129ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GetNetworkState(service_path);
130ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if (!network) {
131ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    LOG(ERROR) << "NetworkConfigView::Show called with invalid service_path";
1327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
133ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
1344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!view->InitWithNetworkState(network)) {
1354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    LOG(ERROR) << "NetworkConfigView::Show called with invalid network type: "
1364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)               << network->type();
1374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    delete view;
1384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return;
1394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  view->ShowDialog(parent);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1432385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// static
144ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid NetworkConfigView::ShowForType(const std::string& type,
1452385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch                                    gfx::NativeWindow parent) {
1462385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  if (GetActiveDialog() != NULL)
1472385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    return;
148ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  NetworkConfigView* view = new NetworkConfigView();
1494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!view->InitWithType(type)) {
1504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    LOG(ERROR) << "NetworkConfigView::ShowForType called with invalid type: "
1514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)               << type;
1524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    delete view;
1534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return;
1544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1552385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  view->ShowDialog(parent);
1562385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch}
1572385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeWindow NetworkConfigView::GetNativeWindow() const {
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetWidget()->GetNativeWindow();
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
162a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 NetworkConfigView::GetDialogButtonLabel(
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::DialogButton button) const {
164effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (button == ui::DIALOG_BUTTON_OK) {
165effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    if (child_config_view_->IsConfigureDialog())
166effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      return l10n_util::GetStringUTF16(IDS_OPTIONS_SETTINGS_CONFIGURE);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return l10n_util::GetStringUTF16(IDS_OPTIONS_SETTINGS_CONNECT);
168effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return views::DialogDelegateView::GetDialogButtonLabel(button);
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool NetworkConfigView::IsDialogButtonEnabled(ui::DialogButton button) const {
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Disable connect button if cannot login.
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (button == ui::DIALOG_BUTTON_OK)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return child_config_view_->CanLogin();
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool NetworkConfigView::Cancel() {
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->OnDialogCancelled();
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  child_config_view_->Cancel();
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool NetworkConfigView::Accept() {
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Do not attempt login if it is guaranteed to fail, keep the dialog open.
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!child_config_view_->CanLogin())
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool result = child_config_view_->Login();
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (result && delegate_)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->OnDialogAccepted();
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)views::View* NetworkConfigView::CreateExtraView() {
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return advanced_button_;
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* NetworkConfigView::GetInitiallyFocusedView() {
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return child_config_view_->GetInitiallyFocusedView();
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
204a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 NetworkConfigView::GetWindowTitle() const {
20590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(!child_config_view_->GetTitle().empty());
20690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return child_config_view_->GetTitle();
20790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
20890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::ModalType NetworkConfigView::GetModalType() const {
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ui::MODAL_TYPE_SYSTEM;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
213a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void NetworkConfigView::GetAccessibleState(ui::AXViewState* state) {
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  state->name =
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_OPTIONS_SETTINGS_OTHER_WIFI_NETWORKS);
216a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  state->role = ui::AX_ROLE_DIALOG;
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetworkConfigView::ButtonPressed(views::Button* sender,
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const ui::Event& event) {
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (advanced_button_ && sender == advanced_button_) {
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    advanced_button_->SetVisible(false);
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ShowAdvancedView();
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetworkConfigView::ShowAdvancedView() {
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clear out the old widgets and build new ones.
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RemoveChildView(child_config_view_);
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete child_config_view_;
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For now, there is only an advanced view for Wi-Fi 802.1X.
232ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  child_config_view_ = new WifiConfigView(this,
233ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                          "" /* service_path */,
234ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                          true /* show_8021x */);
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddChildView(child_config_view_);
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Resize the window to be able to hold the new widgets.
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size size = views::Widget::GetLocalizedContentsSize(
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDS_JOIN_WIFI_NETWORK_DIALOG_ADVANCED_WIDTH_CHARS,
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDS_JOIN_WIFI_NETWORK_DIALOG_ADVANCED_MINIMUM_HEIGHT_LINES);
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get the new bounds with desired size at the same center point.
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect bounds = GetWidget()->GetWindowBoundsInScreen();
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int horiz_padding = bounds.width() - size.width();
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int vert_padding = bounds.height() - size.height();
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bounds.Inset(horiz_padding / 2, vert_padding / 2,
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               horiz_padding / 2, vert_padding / 2);
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetWidget()->SetBoundsConstrained(bounds);
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Layout();
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  child_config_view_->InitFocus();
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetworkConfigView::Layout() {
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  child_config_view_->SetBounds(0, 0, width(), height());
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)gfx::Size NetworkConfigView::GetPreferredSize() const {
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size result(views::Widget::GetLocalizedContentsSize(
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDS_JOIN_WIFI_NETWORK_DIALOG_WIDTH_CHARS,
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDS_JOIN_WIFI_NETWORK_DIALOG_MINIMUM_HEIGHT_LINES));
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size size = child_config_view_->GetPreferredSize();
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result.set_height(size.height());
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (size.width() > result.width())
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result.set_width(size.width());
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetworkConfigView::ViewHierarchyChanged(
267a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    const ViewHierarchyChangedDetails& details) {
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Can't init before we're inserted into a Container, because we require
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // a HWND to parent native child controls to.
270a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  if (details.is_add && details.child == this) {
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddChildView(child_config_view_);
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkConfigView::ShowDialog(gfx::NativeWindow parent) {
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (parent == NULL)
277a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    parent = GetParentForUnhostedDialog();
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Failed connections may result in a pop-up with no natural parent window,
279d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // so provide a fallback context on the primary display. This is necessary
280d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // becase one of parent or context must be non NULL.
281d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  gfx::NativeWindow context =
282d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      parent ? NULL : ash::Shell::GetPrimaryRootWindow();
28390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  Widget* window = DialogDelegate::CreateDialogWidget(this, context, parent);
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window->SetAlwaysOnTop(true);
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window->Show();
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
288ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// ChildNetworkConfigView
289ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
290ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochChildNetworkConfigView::ChildNetworkConfigView(
291ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    NetworkConfigView* parent,
292ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const std::string& service_path)
293ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    : parent_(parent),
294ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      service_path_(service_path) {
295ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
296ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
297ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochChildNetworkConfigView::~ChildNetworkConfigView() {
298ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
299ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
300effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochbool ChildNetworkConfigView::IsConfigureDialog() {
301effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return false;
302effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
303effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
304a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// static
305a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid ChildNetworkConfigView::GetShareStateForLoginState(bool* default_value,
306a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                                        bool* modifiable) {
307a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  *default_value = !LoginState::Get()->UserHasNetworkProfile();
308a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Allow only authenticated user to change the share state.
309a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  *modifiable = LoginState::Get()->IsUserAuthenticated();
310a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
311a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
312ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// ControlledSettingIndicatorView
313ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ControlledSettingIndicatorView::ControlledSettingIndicatorView()
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : managed_(false),
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      image_view_(NULL) {
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Init();
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ControlledSettingIndicatorView::ControlledSettingIndicatorView(
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const NetworkPropertyUIData& ui_data)
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : managed_(false),
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      image_view_(NULL) {
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Init();
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Update(ui_data);
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ControlledSettingIndicatorView::~ControlledSettingIndicatorView() {}
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ControlledSettingIndicatorView::Update(
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const NetworkPropertyUIData& ui_data) {
33290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (managed_ == ui_data.IsManaged())
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  managed_ = ui_data.IsManaged();
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PreferredSizeChanged();
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
339cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)gfx::Size ControlledSettingIndicatorView::GetPreferredSize() const {
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (managed_ && visible()) ? image_view_->GetPreferredSize()
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 : gfx::Size();
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ControlledSettingIndicatorView::Layout() {
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  image_view_->SetBounds(0, 0, width(), height());
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ControlledSettingIndicatorView::Init() {
349f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  image_ = ResourceBundle::GetSharedInstance().GetImageNamed(
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDR_CONTROLLED_SETTING_MANDATORY).ToImageSkia();
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  image_view_ = new views::ImageView();
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Disable |image_view_| so mouse events propagate to the parent.
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  image_view_->SetEnabled(false);
354f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  image_view_->SetImage(image_);
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  image_view_->SetTooltipText(
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_OPTIONS_CONTROLLED_SETTING_POLICY));
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddChildView(image_view_);
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
361