network_config_view.cc revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
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"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/string_util.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/utf_string_conversions.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/cros/network_property_ui_data.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/login_display_host_impl.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/options/vpn_config_view.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/options/wifi_config_view.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/options/wimax_config_view.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_finder.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/host_desktop.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/chromium_strings.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/locale_settings.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/theme_resources.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/root_window.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/accessibility/accessible_view_state.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect.h"
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/controls/button/label_button.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/image_view.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/layout_constants.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using views::Widget;
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeWindow GetDialogParent() {
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (chromeos::LoginDisplayHostImpl::default_host()) {
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return chromeos::LoginDisplayHostImpl::default_host()->GetNativeWindow();
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Browser* browser = chrome::FindTabbedBrowser(
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ProfileManager::GetDefaultProfileOrOffTheRecord(),
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        true,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        chrome::HOST_DESKTOP_TYPE_ASH);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (browser)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return browser->window()->GetNativeWindow();
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Avoid global static initializer.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)chromeos::NetworkConfigView** GetActiveDialogPointer() {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static chromeos::NetworkConfigView* active_dialog = NULL;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return &active_dialog;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)chromeos::NetworkConfigView* GetActiveDialog() {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return *(GetActiveDialogPointer());
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetActiveDialog(chromeos::NetworkConfigView* dialog) {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *(GetActiveDialogPointer()) = dialog;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int ChildNetworkConfigView::kInputFieldMinWidth = 270;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NetworkConfigView::NetworkConfigView(Network* network)
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : child_config_view_(NULL),
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      delegate_(NULL),
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      advanced_button_(NULL) {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(GetActiveDialog() == NULL);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetActiveDialog(this);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (network->type() == TYPE_WIFI) {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child_config_view_ =
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new WifiConfigView(this, static_cast<WifiNetwork*>(network));
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (network->type() == TYPE_WIMAX) {
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child_config_view_ =
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new WimaxConfigView(this, static_cast<WimaxNetwork*>(network));
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (network->type() == TYPE_VPN) {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child_config_view_ =
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new VPNConfigView(this, static_cast<VirtualNetwork*>(network));
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NetworkConfigView::NetworkConfigView(ConnectionType type)
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : child_config_view_(NULL),
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      delegate_(NULL),
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      advanced_button_(NULL) {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(GetActiveDialog() == NULL);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetActiveDialog(this);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (type == TYPE_WIFI) {
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child_config_view_ = new WifiConfigView(this, false /* show_8021x */);
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    advanced_button_ = new views::LabelButton(this, l10n_util::GetStringUTF16(
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_ADVANCED_BUTTON));
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    advanced_button_->SetStyle(views::Button::STYLE_NATIVE_TEXTBUTTON);
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (type == TYPE_VPN) {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child_config_view_ = new VPNConfigView(this);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NetworkConfigView::~NetworkConfigView() {
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(GetActiveDialog() == this);
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetActiveDialog(NULL);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool NetworkConfigView::Show(Network* network, gfx::NativeWindow parent) {
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetActiveDialog() != NULL)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NetworkConfigView* view = new NetworkConfigView(network);
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  view->ShowDialog(parent);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool NetworkConfigView::ShowForType(ConnectionType type,
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    gfx::NativeWindow parent) {
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetActiveDialog() != NULL)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NetworkConfigView* view = new NetworkConfigView(type);
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  view->ShowDialog(parent);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeWindow NetworkConfigView::GetNativeWindow() const {
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetWidget()->GetNativeWindow();
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 NetworkConfigView::GetDialogButtonLabel(
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::DialogButton button) const {
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (button == ui::DIALOG_BUTTON_OK)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return l10n_util::GetStringUTF16(IDS_OPTIONS_SETTINGS_CONNECT);
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return views::DialogDelegateView::GetDialogButtonLabel(button);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool NetworkConfigView::IsDialogButtonEnabled(ui::DialogButton button) const {
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Disable connect button if cannot login.
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (button == ui::DIALOG_BUTTON_OK)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return child_config_view_->CanLogin();
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool NetworkConfigView::Cancel() {
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->OnDialogCancelled();
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  child_config_view_->Cancel();
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool NetworkConfigView::Accept() {
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Do not attempt login if it is guaranteed to fail, keep the dialog open.
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!child_config_view_->CanLogin())
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool result = child_config_view_->Login();
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (result && delegate_)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->OnDialogAccepted();
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)views::View* NetworkConfigView::CreateExtraView() {
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return advanced_button_;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* NetworkConfigView::GetInitiallyFocusedView() {
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return child_config_view_->GetInitiallyFocusedView();
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::ModalType NetworkConfigView::GetModalType() const {
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ui::MODAL_TYPE_SYSTEM;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetworkConfigView::GetAccessibleState(ui::AccessibleViewState* state) {
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  state->name =
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_OPTIONS_SETTINGS_OTHER_WIFI_NETWORKS);
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  state->role = ui::AccessibilityTypes::ROLE_DIALOG;
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetworkConfigView::ButtonPressed(views::Button* sender,
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const ui::Event& event) {
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (advanced_button_ && sender == advanced_button_) {
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    advanced_button_->SetVisible(false);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ShowAdvancedView();
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetworkConfigView::ShowAdvancedView() {
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clear out the old widgets and build new ones.
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RemoveChildView(child_config_view_);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete child_config_view_;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For now, there is only an advanced view for Wi-Fi 802.1X.
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  child_config_view_ = new WifiConfigView(this, true /* show_8021x */);
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddChildView(child_config_view_);
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Resize the window to be able to hold the new widgets.
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size size = views::Widget::GetLocalizedContentsSize(
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDS_JOIN_WIFI_NETWORK_DIALOG_ADVANCED_WIDTH_CHARS,
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDS_JOIN_WIFI_NETWORK_DIALOG_ADVANCED_MINIMUM_HEIGHT_LINES);
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get the new bounds with desired size at the same center point.
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect bounds = GetWidget()->GetWindowBoundsInScreen();
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int horiz_padding = bounds.width() - size.width();
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int vert_padding = bounds.height() - size.height();
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bounds.Inset(horiz_padding / 2, vert_padding / 2,
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               horiz_padding / 2, vert_padding / 2);
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetWidget()->SetBoundsConstrained(bounds);
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Layout();
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  child_config_view_->InitFocus();
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetworkConfigView::Layout() {
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  child_config_view_->SetBounds(0, 0, width(), height());
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Size NetworkConfigView::GetPreferredSize() {
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size result(views::Widget::GetLocalizedContentsSize(
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDS_JOIN_WIFI_NETWORK_DIALOG_WIDTH_CHARS,
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDS_JOIN_WIFI_NETWORK_DIALOG_MINIMUM_HEIGHT_LINES));
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size size = child_config_view_->GetPreferredSize();
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result.set_height(size.height());
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (size.width() > result.width())
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result.set_width(size.width());
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetworkConfigView::ViewHierarchyChanged(
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_add, views::View* parent, views::View* child) {
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Can't init before we're inserted into a Container, because we require
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // a HWND to parent native child controls to.
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_add && child == this) {
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddChildView(child_config_view_);
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkConfigView::ShowDialog(gfx::NativeWindow parent) {
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (parent == NULL)
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    parent = GetDialogParent();
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Failed connections may result in a pop-up with no natural parent window,
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // so provide a fallback context on the active display.
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Widget* window = parent ?
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Widget::CreateWindowWithParent(this, parent) :
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Widget::CreateWindowWithContext(this, ash::Shell::GetActiveRootWindow());
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window->SetAlwaysOnTop(true);
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window->Show();
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ControlledSettingIndicatorView::ControlledSettingIndicatorView()
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : managed_(false),
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      image_view_(NULL) {
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Init();
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ControlledSettingIndicatorView::ControlledSettingIndicatorView(
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const NetworkPropertyUIData& ui_data)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : managed_(false),
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      image_view_(NULL) {
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Init();
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Update(ui_data);
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ControlledSettingIndicatorView::~ControlledSettingIndicatorView() {}
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ControlledSettingIndicatorView::Update(
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const NetworkPropertyUIData& ui_data) {
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (managed_ == ui_data.managed())
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  managed_ = ui_data.managed();
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PreferredSizeChanged();
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Size ControlledSettingIndicatorView::GetPreferredSize() {
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (managed_ && visible()) ? image_view_->GetPreferredSize()
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 : gfx::Size();
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ControlledSettingIndicatorView::Layout() {
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  image_view_->SetBounds(0, 0, width(), height());
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ControlledSettingIndicatorView::OnMouseEntered(
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ui::MouseEvent& event) {
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  image_view_->SetImage(color_image_);
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ControlledSettingIndicatorView::OnMouseExited(
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ui::MouseEvent& event) {
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  image_view_->SetImage(gray_image_);
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ControlledSettingIndicatorView::Init() {
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  color_image_ = ResourceBundle::GetSharedInstance().GetImageNamed(
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDR_CONTROLLED_SETTING_MANDATORY).ToImageSkia();
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gray_image_ = ResourceBundle::GetSharedInstance().GetImageNamed(
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDR_CONTROLLED_SETTING_MANDATORY_GRAY).ToImageSkia();
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  image_view_ = new views::ImageView();
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Disable |image_view_| so mouse events propagate to the parent.
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  image_view_->SetEnabled(false);
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  image_view_->SetImage(gray_image_);
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  image_view_->SetTooltipText(
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_OPTIONS_CONTROLLED_SETTING_POLICY));
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddChildView(image_view_);
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
316