OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/chromeos/login/network_selection_view.h" | 5 #include "chrome/browser/chromeos/login/network_selection_view.h" |
6 | 6 |
7 #include <signal.h> | 7 #include <signal.h> |
8 #include <sys/types.h> | 8 #include <sys/types.h> |
9 #include <string> | 9 #include <string> |
10 | 10 |
11 #include "app/l10n_util.h" | 11 #include "app/l10n_util.h" |
12 #include "app/resource_bundle.h" | 12 #include "app/resource_bundle.h" |
13 #include "base/utf_string_conversions.h" | 13 #include "base/utf_string_conversions.h" |
14 #include "chrome/browser/chromeos/login/network_screen_delegate.h" | 14 #include "chrome/browser/chromeos/login/network_screen_delegate.h" |
15 #include "chrome/browser/chromeos/login/rounded_rect_painter.h" | 15 #include "chrome/browser/chromeos/login/rounded_rect_painter.h" |
16 #include "chrome/browser/chromeos/login/language_switch_menu.h" | 16 #include "chrome/browser/chromeos/login/language_switch_menu.h" |
| 17 #include "chrome/browser/chromeos/status/network_dropdown_button.h" |
17 #include "grit/chromium_strings.h" | 18 #include "grit/chromium_strings.h" |
18 #include "grit/generated_resources.h" | 19 #include "grit/generated_resources.h" |
19 #include "grit/theme_resources.h" | 20 #include "grit/theme_resources.h" |
20 #include "views/controls/button/native_button.h" | 21 #include "views/controls/button/native_button.h" |
21 #include "views/controls/combobox/combobox.h" | 22 #include "views/controls/combobox/combobox.h" |
22 #include "views/controls/label.h" | 23 #include "views/controls/label.h" |
23 #include "views/controls/throbber.h" | 24 #include "views/controls/throbber.h" |
24 #include "views/widget/widget.h" | 25 #include "views/widget/widget.h" |
25 #include "views/widget/widget_gtk.h" | 26 #include "views/widget/widget_gtk.h" |
26 #include "views/window/non_client_view.h" | 27 #include "views/window/non_client_view.h" |
(...skipping 13 matching lines...) Expand all Loading... |
40 const int kContinueButtonSpacingX = 30; | 41 const int kContinueButtonSpacingX = 30; |
41 const int kSpacing = 25; | 42 const int kSpacing = 25; |
42 const int kHorizontalSpacing = 25; | 43 const int kHorizontalSpacing = 25; |
43 const int kSelectionBoxWidthMin = 200; | 44 const int kSelectionBoxWidthMin = 200; |
44 const int kSelectionBoxHeight = 29; | 45 const int kSelectionBoxHeight = 29; |
45 const int kSelectionBoxSpacing = 7; | 46 const int kSelectionBoxSpacing = 7; |
46 | 47 |
47 // Menu button is drawn using our custom icons in resources. See | 48 // Menu button is drawn using our custom icons in resources. See |
48 // TextButtonBorder::Paint() for details. So this offset compensate | 49 // TextButtonBorder::Paint() for details. So this offset compensate |
49 // horizontal size, eaten by those icons. | 50 // horizontal size, eaten by those icons. |
50 const int kMenuButtonHorizontalOffset = 1; | 51 const int kMenuHorizontalOffset = -1; |
51 | 52 |
52 // Vertical addition to the menu window to make it appear exactly below | 53 // Vertical addition to the menu window to make it appear exactly below |
53 // MenuButton. | 54 // MenuButton. |
54 const int kMenuButtonVerticalOffset = 3; | 55 const int kMenuVerticalOffset = 3; |
| 56 |
| 57 // Offset that compensates menu width so that it matches |
| 58 // menu button visual width when being in pushed state. |
| 59 const int kMenuWidthOffset = 6; |
55 | 60 |
56 const SkColor kWelcomeColor = 0xFF1D6AB1; | 61 const SkColor kWelcomeColor = 0xFF1D6AB1; |
57 | 62 |
58 const int kThrobberFrameMs = 60; | 63 const int kThrobberFrameMs = 60; |
59 const int kThrobberStartDelayMs = 500; | 64 const int kThrobberStartDelayMs = 500; |
60 | 65 |
61 } // namespace | 66 } // namespace |
62 | 67 |
63 namespace chromeos { | 68 namespace chromeos { |
64 | 69 |
65 NetworkSelectionView::NetworkSelectionView(NetworkScreenDelegate* delegate) | 70 NetworkSelectionView::NetworkSelectionView(NetworkScreenDelegate* delegate) |
66 : network_combobox_(NULL), | 71 : languages_menubutton_(NULL), |
67 languages_menubutton_(NULL), | |
68 welcome_label_(NULL), | 72 welcome_label_(NULL), |
69 select_language_label_(NULL), | 73 select_language_label_(NULL), |
70 select_network_label_(NULL), | 74 select_network_label_(NULL), |
71 connecting_network_label_(NULL), | 75 connecting_network_label_(NULL), |
72 continue_button_(NULL), | 76 continue_button_(NULL), |
73 throbber_(NULL), | 77 throbber_(NULL), |
74 continue_button_order_index_(-1), | 78 continue_button_order_index_(-1), |
| 79 network_dropdown_(NULL), |
75 delegate_(delegate) { | 80 delegate_(delegate) { |
76 } | 81 } |
77 | 82 |
78 NetworkSelectionView::~NetworkSelectionView() { | 83 NetworkSelectionView::~NetworkSelectionView() { |
79 network_combobox_->set_listener(NULL); | |
80 network_combobox_ = NULL; | |
81 throbber_->Stop(); | 84 throbber_->Stop(); |
82 throbber_ = NULL; | 85 throbber_ = NULL; |
83 } | 86 } |
84 | 87 |
85 void NetworkSelectionView::Init() { | 88 void NetworkSelectionView::Init() { |
86 // Use rounded rect background. | 89 // Use rounded rect background. |
87 views::Painter* painter = CreateWizardPainter( | 90 views::Painter* painter = CreateWizardPainter( |
88 &BorderDefinition::kScreenBorder); | 91 &BorderDefinition::kScreenBorder); |
89 set_background( | 92 set_background( |
90 views::Background::CreateBackgroundPainter(true, painter)); | 93 views::Background::CreateBackgroundPainter(true, painter)); |
(...skipping 16 matching lines...) Expand all Loading... |
107 connecting_network_label_ = new views::Label(); | 110 connecting_network_label_ = new views::Label(); |
108 connecting_network_label_->SetFont(rb.GetFont(ResourceBundle::MediumFont)); | 111 connecting_network_label_->SetFont(rb.GetFont(ResourceBundle::MediumFont)); |
109 connecting_network_label_->SetVisible(false); | 112 connecting_network_label_->SetVisible(false); |
110 | 113 |
111 throbber_ = new views::SmoothedThrobber(kThrobberFrameMs); | 114 throbber_ = new views::SmoothedThrobber(kThrobberFrameMs); |
112 throbber_->SetFrames( | 115 throbber_->SetFrames( |
113 ResourceBundle::GetSharedInstance().GetBitmapNamed(IDR_SPINNER)); | 116 ResourceBundle::GetSharedInstance().GetBitmapNamed(IDR_SPINNER)); |
114 throbber_->set_start_delay_ms(kThrobberStartDelayMs); | 117 throbber_->set_start_delay_ms(kThrobberStartDelayMs); |
115 AddChildView(throbber_); | 118 AddChildView(throbber_); |
116 | 119 |
117 network_combobox_ = new views::Combobox(delegate_); | |
118 network_combobox_->set_listener(delegate_); | |
119 | |
120 languages_menubutton_ = new views::MenuButton( | 120 languages_menubutton_ = new views::MenuButton( |
121 NULL, std::wstring(), delegate_->language_switch_menu(), true); | 121 NULL, std::wstring(), delegate_->language_switch_menu(), true); |
122 languages_menubutton_->SetFocusable(true); | 122 languages_menubutton_->SetFocusable(true); |
123 languages_menubutton_->SetNormalHasBorder(true); | 123 languages_menubutton_->SetNormalHasBorder(true); |
124 delegate_->language_switch_menu()->set_menu_offset( | 124 // Menu is positioned by bottom right corner of the MenuButton. |
125 kMenuButtonHorizontalOffset, kMenuButtonVerticalOffset); | 125 delegate_->language_switch_menu()->set_menu_offset(kMenuHorizontalOffset, |
| 126 kMenuVerticalOffset); |
126 | 127 |
127 AddChildView(welcome_label_); | 128 AddChildView(welcome_label_); |
128 AddChildView(select_language_label_); | 129 AddChildView(select_language_label_); |
129 AddChildView(select_network_label_); | 130 AddChildView(select_network_label_); |
130 AddChildView(connecting_network_label_); | 131 AddChildView(connecting_network_label_); |
131 AddChildView(languages_menubutton_); | 132 AddChildView(languages_menubutton_); |
132 AddChildView(network_combobox_); | 133 |
| 134 network_dropdown_ = new NetworkDropdownButton(false, GetNativeWindow()); |
| 135 network_dropdown_->SetNormalHasBorder(true); |
| 136 network_dropdown_->SetFocusable(true); |
| 137 AddChildView(network_dropdown_); |
133 | 138 |
134 UpdateLocalizedStrings(); | 139 UpdateLocalizedStrings(); |
135 } | 140 } |
136 | 141 |
137 void NetworkSelectionView::UpdateLocalizedStrings() { | 142 void NetworkSelectionView::UpdateLocalizedStrings() { |
138 RecreateNativeControls(); | 143 RecreateNativeControls(); |
139 languages_menubutton_->SetText( | 144 languages_menubutton_->SetText( |
140 delegate_->language_switch_menu()->GetCurrentLocaleName()); | 145 delegate_->language_switch_menu()->GetCurrentLocaleName()); |
141 welcome_label_->SetText(l10n_util::GetStringF(IDS_NETWORK_SELECTION_TITLE, | 146 welcome_label_->SetText(l10n_util::GetStringF(IDS_NETWORK_SELECTION_TITLE, |
142 l10n_util::GetString(IDS_PRODUCT_OS_NAME))); | 147 l10n_util::GetString(IDS_PRODUCT_OS_NAME))); |
143 select_language_label_->SetText( | 148 select_language_label_->SetText( |
144 l10n_util::GetString(IDS_LANGUAGE_SELECTION_SELECT)); | 149 l10n_util::GetString(IDS_LANGUAGE_SELECTION_SELECT)); |
145 select_network_label_->SetText( | 150 select_network_label_->SetText( |
146 l10n_util::GetString(IDS_NETWORK_SELECTION_SELECT)); | 151 l10n_util::GetString(IDS_NETWORK_SELECTION_SELECT)); |
147 UpdateConnectingNetworkLabel(); | 152 UpdateConnectingNetworkLabel(); |
148 } | 153 } |
149 | 154 |
150 //////////////////////////////////////////////////////////////////////////////// | 155 //////////////////////////////////////////////////////////////////////////////// |
151 // views::View: implementation: | 156 // views::View: implementation: |
152 | 157 |
153 void NetworkSelectionView::ChildPreferredSizeChanged(View* child) { | 158 void NetworkSelectionView::ChildPreferredSizeChanged(View* child) { |
154 Layout(); | 159 Layout(); |
155 SchedulePaint(); | 160 SchedulePaint(); |
156 } | 161 } |
157 | 162 |
158 void NetworkSelectionView::OnLocaleChanged() { | 163 void NetworkSelectionView::OnLocaleChanged() { |
159 UpdateLocalizedStrings(); | 164 UpdateLocalizedStrings(); |
160 | |
161 int index_to_restore = GetSelectedNetworkItem(); | |
162 NetworkModelChanged(); | |
163 index_to_restore = std::max(index_to_restore, 0); | |
164 index_to_restore = std::min<int>(index_to_restore, | |
165 delegate_->GetItemCount() - 1); | |
166 if (index_to_restore >= 0) { | |
167 // Only localized names of networking options has changed | |
168 // so we should restore networking option selected previously. | |
169 SetSelectedNetworkItem(index_to_restore); | |
170 } | |
171 | |
172 Layout(); | 165 Layout(); |
173 SchedulePaint(); | 166 SchedulePaint(); |
174 } | 167 } |
175 | 168 |
176 gfx::Size NetworkSelectionView::GetPreferredSize() { | 169 gfx::Size NetworkSelectionView::GetPreferredSize() { |
177 return gfx::Size(width(), height()); | 170 return gfx::Size(width(), height()); |
178 } | 171 } |
179 | 172 |
180 void NetworkSelectionView::Layout() { | 173 void NetworkSelectionView::Layout() { |
181 gfx::Insets insets = GetInsets(); | 174 gfx::Insets insets = GetInsets(); |
182 int max_width = this->width() - insets.width() - 2 * kHorizontalSpacing; | 175 int max_width = this->width() - insets.width() - 2 * kHorizontalSpacing; |
183 welcome_label_->SizeToFit(max_width); | 176 welcome_label_->SizeToFit(max_width); |
184 int y = kWelcomeLabelY; | 177 int y = kWelcomeLabelY; |
185 y -= welcome_label_->GetPreferredSize().height() / 2; | 178 y -= welcome_label_->GetPreferredSize().height() / 2; |
186 | 179 |
187 welcome_label_->SetBounds( | 180 welcome_label_->SetBounds( |
188 (width() - welcome_label_->GetPreferredSize().width()) / 2, | 181 (width() - welcome_label_->GetPreferredSize().width()) / 2, |
189 y, | 182 y, |
190 welcome_label_->GetPreferredSize().width(), | 183 welcome_label_->GetPreferredSize().width(), |
191 welcome_label_->GetPreferredSize().height()); | 184 welcome_label_->GetPreferredSize().height()); |
192 y += welcome_label_->GetPreferredSize().height() + kSpacing; | 185 y += welcome_label_->GetPreferredSize().height() + kSpacing; |
193 | 186 |
194 // Use menu preffered size to calculate boxes width accordingly. | 187 // Use menu preffered size to calculate boxes width accordingly. |
195 int box_width = delegate_->language_switch_menu()->GetFirstLevelMenuWidth() + | 188 int box_width = delegate_->language_switch_menu()->GetFirstLevelMenuWidth() + |
196 kMenuButtonHorizontalOffset * 2; | 189 kMenuWidthOffset; |
197 const int widest_label = std::max( | 190 const int widest_label = std::max( |
198 select_language_label_->GetPreferredSize().width(), | 191 select_language_label_->GetPreferredSize().width(), |
199 select_network_label_->GetPreferredSize().width()); | 192 select_network_label_->GetPreferredSize().width()); |
200 if (box_width < kSelectionBoxWidthMin) { | 193 if (box_width < kSelectionBoxWidthMin) { |
201 box_width = kSelectionBoxWidthMin; | 194 box_width = kSelectionBoxWidthMin; |
202 delegate_->language_switch_menu()->SetFirstLevelMenuWidth( | 195 delegate_->language_switch_menu()->SetFirstLevelMenuWidth( |
203 box_width - kMenuButtonHorizontalOffset * 2); | 196 box_width - kMenuWidthOffset); |
204 } else if (widest_label + box_width + 2 * kHorizontalSpacing > width()) { | 197 } else if (widest_label + box_width + 2 * kHorizontalSpacing > width()) { |
205 box_width = width() - widest_label - 2 * kHorizontalSpacing; | 198 box_width = width() - widest_label - 2 * kHorizontalSpacing; |
206 } | 199 } |
207 const int labels_x = (width() - widest_label - box_width) / 2; | 200 const int labels_x = (width() - widest_label - box_width) / 2; |
208 select_language_label_->SetBounds( | 201 select_language_label_->SetBounds( |
209 labels_x, | 202 labels_x, |
210 y, | 203 y, |
211 select_language_label_->GetPreferredSize().width(), | 204 select_language_label_->GetPreferredSize().width(), |
212 select_language_label_->GetPreferredSize().height()); | 205 select_language_label_->GetPreferredSize().height()); |
213 | 206 |
(...skipping 18 matching lines...) Expand all Loading... |
232 connecting_network_label_->GetPreferredSize().height()); | 225 connecting_network_label_->GetPreferredSize().height()); |
233 | 226 |
234 throbber_->SetBounds( | 227 throbber_->SetBounds( |
235 width() / 2 + connecting_network_label_->GetPreferredSize().width() / 2 + | 228 width() / 2 + connecting_network_label_->GetPreferredSize().width() / 2 + |
236 kHorizontalSpacing, | 229 kHorizontalSpacing, |
237 y + (connecting_network_label_->GetPreferredSize().height() - | 230 y + (connecting_network_label_->GetPreferredSize().height() - |
238 throbber_->GetPreferredSize().height()) / 2, | 231 throbber_->GetPreferredSize().height()) / 2, |
239 throbber_->GetPreferredSize().width(), | 232 throbber_->GetPreferredSize().width(), |
240 throbber_->GetPreferredSize().height()); | 233 throbber_->GetPreferredSize().height()); |
241 | 234 |
242 network_combobox_->SetBounds(selection_box_x, y - label_y_offset, | 235 network_dropdown_->SetBounds(selection_box_x, y - label_y_offset, |
243 box_width, kSelectionBoxHeight); | 236 box_width, kSelectionBoxHeight); |
244 | 237 |
245 y = height() - continue_button_->GetPreferredSize().height() - kSpacing; | 238 y = height() - continue_button_->GetPreferredSize().height() - kSpacing; |
246 continue_button_->SetBounds( | 239 continue_button_->SetBounds( |
247 width() - kContinueButtonSpacingX - | 240 width() - kContinueButtonSpacingX - |
248 continue_button_->GetPreferredSize().width(), | 241 continue_button_->GetPreferredSize().width(), |
249 y, | 242 y, |
250 continue_button_->GetPreferredSize().width(), | 243 continue_button_->GetPreferredSize().width(), |
251 continue_button_->GetPreferredSize().height()); | 244 continue_button_->GetPreferredSize().height()); |
252 | 245 |
253 // Need to refresh combobox layout explicitly. | 246 // Need to refresh combobox layout explicitly. |
254 network_combobox_->Layout(); | |
255 continue_button_->Layout(); | 247 continue_button_->Layout(); |
256 } | 248 } |
257 | 249 |
258 //////////////////////////////////////////////////////////////////////////////// | 250 //////////////////////////////////////////////////////////////////////////////// |
259 // NetworkSelectionView, public: | 251 // NetworkSelectionView, public: |
260 | 252 |
261 int NetworkSelectionView::GetSelectedNetworkItem() const { | |
262 return network_combobox_->selected_item(); | |
263 } | |
264 | |
265 void NetworkSelectionView::SetSelectedNetworkItem(int index) { | |
266 network_combobox_->SetSelectedItem(index); | |
267 } | |
268 | |
269 gfx::NativeWindow NetworkSelectionView::GetNativeWindow() { | 253 gfx::NativeWindow NetworkSelectionView::GetNativeWindow() { |
270 return GTK_WINDOW(static_cast<WidgetGtk*>(GetWidget())->GetNativeView()); | 254 return GTK_WINDOW(static_cast<WidgetGtk*>(GetWidget())->GetNativeView()); |
271 } | 255 } |
272 | 256 |
273 void NetworkSelectionView::NetworkModelChanged() { | |
274 network_combobox_->ModelChanged(); | |
275 } | |
276 | |
277 void NetworkSelectionView::ShowConnectingStatus(bool connecting, | 257 void NetworkSelectionView::ShowConnectingStatus(bool connecting, |
278 const string16& network_id) { | 258 const string16& network_id) { |
279 network_id_ = network_id; | 259 network_id_ = network_id; |
280 UpdateConnectingNetworkLabel(); | 260 UpdateConnectingNetworkLabel(); |
281 select_language_label_->SetVisible(!connecting); | 261 select_language_label_->SetVisible(!connecting); |
282 languages_menubutton_->SetVisible(!connecting); | 262 languages_menubutton_->SetVisible(!connecting); |
283 select_network_label_->SetVisible(!connecting); | 263 select_network_label_->SetVisible(!connecting); |
284 network_combobox_->SetVisible(!connecting); | 264 network_dropdown_->SetVisible(!connecting); |
285 continue_button_->SetVisible(!connecting); | 265 continue_button_->SetVisible(!connecting); |
286 connecting_network_label_->SetVisible(connecting); | 266 connecting_network_label_->SetVisible(connecting); |
287 Layout(); | 267 Layout(); |
288 if (connecting) { | 268 if (connecting) { |
289 throbber_->Start(); | 269 throbber_->Start(); |
| 270 network_dropdown_->CancelMenu(); |
290 } else { | 271 } else { |
291 throbber_->Stop(); | 272 throbber_->Stop(); |
292 } | 273 } |
293 } | 274 } |
294 | 275 |
295 void NetworkSelectionView::EnableContinue(bool enabled) { | 276 void NetworkSelectionView::EnableContinue(bool enabled) { |
296 if (continue_button_) | 277 if (continue_button_) |
297 continue_button_->SetEnabled(enabled); | 278 continue_button_->SetEnabled(enabled); |
298 } | 279 } |
299 | 280 |
(...skipping 13 matching lines...) Expand all Loading... |
313 } | 294 } |
314 AddChildView(continue_button_order_index_, continue_button_); | 295 AddChildView(continue_button_order_index_, continue_button_); |
315 } | 296 } |
316 | 297 |
317 void NetworkSelectionView::UpdateConnectingNetworkLabel() { | 298 void NetworkSelectionView::UpdateConnectingNetworkLabel() { |
318 connecting_network_label_->SetText(l10n_util::GetStringF( | 299 connecting_network_label_->SetText(l10n_util::GetStringF( |
319 IDS_NETWORK_SELECTION_CONNECTING, UTF16ToWide(network_id_))); | 300 IDS_NETWORK_SELECTION_CONNECTING, UTF16ToWide(network_id_))); |
320 } | 301 } |
321 | 302 |
322 } // namespace chromeos | 303 } // namespace chromeos |
OLD | NEW |