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