OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "ui/views/window/dialog_client_view.h" | 5 #include "ui/views/window/dialog_client_view.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "build/build_config.h" | 9 #include "build/build_config.h" |
10 #include "ui/events/keycodes/keyboard_codes.h" | 10 #include "ui/events/keycodes/keyboard_codes.h" |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
49 | 49 |
50 } // namespace | 50 } // namespace |
51 | 51 |
52 /////////////////////////////////////////////////////////////////////////////// | 52 /////////////////////////////////////////////////////////////////////////////// |
53 // DialogClientView, public: | 53 // DialogClientView, public: |
54 | 54 |
55 DialogClientView::DialogClientView(Widget* owner, View* contents_view) | 55 DialogClientView::DialogClientView(Widget* owner, View* contents_view) |
56 : ClientView(owner, contents_view), | 56 : ClientView(owner, contents_view), |
57 ok_button_(NULL), | 57 ok_button_(NULL), |
58 cancel_button_(NULL), | 58 cancel_button_(NULL), |
59 default_button_(NULL), | |
60 focus_manager_(NULL), | |
61 extra_view_(NULL), | 59 extra_view_(NULL), |
62 footnote_view_(NULL), | 60 footnote_view_(NULL), |
63 notified_delegate_(false) { | 61 notified_delegate_(false) { |
64 } | 62 } |
65 | 63 |
66 DialogClientView::~DialogClientView() { | 64 DialogClientView::~DialogClientView() { |
67 } | 65 } |
68 | 66 |
69 void DialogClientView::AcceptWindow() { | 67 void DialogClientView::AcceptWindow() { |
70 // Only notify the delegate once. See |notified_delegate_|'s comment. | 68 // Only notify the delegate once. See |notified_delegate_|'s comment. |
71 if (!notified_delegate_ && GetDialogDelegate()->Accept(false)) { | 69 if (!notified_delegate_ && GetDialogDelegate()->Accept(false)) { |
72 notified_delegate_ = true; | 70 notified_delegate_ = true; |
73 Close(); | 71 Close(); |
74 } | 72 } |
75 } | 73 } |
76 | 74 |
77 void DialogClientView::CancelWindow() { | 75 void DialogClientView::CancelWindow() { |
78 // Only notify the delegate once. See |notified_delegate_|'s comment. | 76 // Only notify the delegate once. See |notified_delegate_|'s comment. |
79 if (!notified_delegate_ && GetDialogDelegate()->Cancel()) { | 77 if (!notified_delegate_ && GetDialogDelegate()->Cancel()) { |
80 notified_delegate_ = true; | 78 notified_delegate_ = true; |
81 Close(); | 79 Close(); |
82 } | 80 } |
83 } | 81 } |
84 | 82 |
85 void DialogClientView::UpdateDialogButtons() { | 83 void DialogClientView::UpdateDialogButtons() { |
86 const int buttons = GetDialogDelegate()->GetDialogButtons(); | 84 const int buttons = GetDialogDelegate()->GetDialogButtons(); |
87 ui::Accelerator escape(ui::VKEY_ESCAPE, ui::EF_NONE); | 85 ui::Accelerator escape(ui::VKEY_ESCAPE, ui::EF_NONE); |
88 if (default_button_) | |
89 default_button_->SetIsDefault(false); | |
90 default_button_ = NULL; | |
91 | 86 |
92 if (buttons & ui::DIALOG_BUTTON_OK) { | 87 if (buttons & ui::DIALOG_BUTTON_OK) { |
93 if (!ok_button_) { | 88 if (!ok_button_) { |
94 ok_button_ = CreateDialogButton(ui::DIALOG_BUTTON_OK); | 89 ok_button_ = CreateDialogButton(ui::DIALOG_BUTTON_OK); |
95 if (!(buttons & ui::DIALOG_BUTTON_CANCEL)) | 90 if (!(buttons & ui::DIALOG_BUTTON_CANCEL)) |
96 ok_button_->AddAccelerator(escape); | 91 ok_button_->AddAccelerator(escape); |
97 AddChildView(ok_button_); | 92 AddChildView(ok_button_); |
98 } | 93 } |
99 | 94 |
100 UpdateButton(ok_button_, ui::DIALOG_BUTTON_OK); | 95 UpdateButton(ok_button_, ui::DIALOG_BUTTON_OK); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
141 } | 136 } |
142 | 137 |
143 DialogClientView* DialogClientView::AsDialogClientView() { | 138 DialogClientView* DialogClientView::AsDialogClientView() { |
144 return this; | 139 return this; |
145 } | 140 } |
146 | 141 |
147 const DialogClientView* DialogClientView::AsDialogClientView() const { | 142 const DialogClientView* DialogClientView::AsDialogClientView() const { |
148 return this; | 143 return this; |
149 } | 144 } |
150 | 145 |
151 void DialogClientView::OnWillChangeFocus(View* focused_before, | |
152 View* focused_now) { | |
153 // Make the newly focused button default or restore the dialog's default. | |
154 const int default_button = GetDialogDelegate()->GetDefaultDialogButton(); | |
155 LabelButton* new_default_button = NULL; | |
156 if (focused_now && | |
157 !strcmp(focused_now->GetClassName(), LabelButton::kViewClassName)) { | |
158 new_default_button = static_cast<LabelButton*>(focused_now); | |
159 } else if (default_button == ui::DIALOG_BUTTON_OK && ok_button_) { | |
160 new_default_button = ok_button_; | |
161 } else if (default_button == ui::DIALOG_BUTTON_CANCEL && cancel_button_) { | |
162 new_default_button = cancel_button_; | |
163 } | |
164 | |
165 if (default_button_ && default_button_ != new_default_button) | |
166 default_button_->SetIsDefault(false); | |
167 default_button_ = new_default_button; | |
168 if (default_button_ && !default_button_->is_default()) | |
169 default_button_->SetIsDefault(true); | |
170 } | |
171 | |
172 void DialogClientView::OnDidChangeFocus(View* focused_before, | |
173 View* focused_now) { | |
174 } | |
175 | |
176 //////////////////////////////////////////////////////////////////////////////// | 146 //////////////////////////////////////////////////////////////////////////////// |
177 // DialogClientView, View overrides: | 147 // DialogClientView, View overrides: |
178 | 148 |
179 gfx::Size DialogClientView::GetPreferredSize() const { | 149 gfx::Size DialogClientView::GetPreferredSize() const { |
180 // Initialize the size to fit the buttons and extra view row. | 150 // Initialize the size to fit the buttons and extra view row. |
181 int extra_view_padding = 0; | 151 int extra_view_padding = 0; |
182 if (!GetDialogDelegate()->GetExtraViewPadding(&extra_view_padding)) | 152 if (!GetDialogDelegate()->GetExtraViewPadding(&extra_view_padding)) |
183 extra_view_padding = kRelatedButtonHSpacing; | 153 extra_view_padding = kRelatedButtonHSpacing; |
184 gfx::Size size( | 154 gfx::Size size( |
185 (ok_button_ ? ok_button_->GetPreferredSize().width() : 0) + | 155 (ok_button_ ? ok_button_->GetPreferredSize().width() : 0) + |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
270 bool DialogClientView::AcceleratorPressed(const ui::Accelerator& accelerator) { | 240 bool DialogClientView::AcceleratorPressed(const ui::Accelerator& accelerator) { |
271 DCHECK_EQ(accelerator.key_code(), ui::VKEY_ESCAPE); | 241 DCHECK_EQ(accelerator.key_code(), ui::VKEY_ESCAPE); |
272 Close(); | 242 Close(); |
273 return true; | 243 return true; |
274 } | 244 } |
275 | 245 |
276 void DialogClientView::ViewHierarchyChanged( | 246 void DialogClientView::ViewHierarchyChanged( |
277 const ViewHierarchyChangedDetails& details) { | 247 const ViewHierarchyChangedDetails& details) { |
278 ClientView::ViewHierarchyChanged(details); | 248 ClientView::ViewHierarchyChanged(details); |
279 if (details.is_add && details.child == this) { | 249 if (details.is_add && details.child == this) { |
280 focus_manager_ = GetFocusManager(); | |
281 if (focus_manager_) | |
282 GetFocusManager()->AddFocusChangeListener(this); | |
283 | |
284 UpdateDialogButtons(); | 250 UpdateDialogButtons(); |
285 CreateExtraView(); | 251 CreateExtraView(); |
286 CreateFootnoteView(); | 252 CreateFootnoteView(); |
287 } else if (!details.is_add && details.child == this) { | 253 } else if (!details.is_add && details.child != this) { |
288 if (focus_manager_) | |
289 focus_manager_->RemoveFocusChangeListener(this); | |
290 focus_manager_ = NULL; | |
291 } else if (!details.is_add) { | |
292 if (details.child == default_button_) | |
293 default_button_ = NULL; | |
294 if (details.child == ok_button_) | 254 if (details.child == ok_button_) |
295 ok_button_ = NULL; | 255 ok_button_ = NULL; |
296 if (details.child == cancel_button_) | 256 if (details.child == cancel_button_) |
297 cancel_button_ = NULL; | 257 cancel_button_ = NULL; |
298 } | 258 } |
299 } | 259 } |
300 | 260 |
301 void DialogClientView::NativeViewHierarchyChanged() { | |
302 FocusManager* focus_manager = GetFocusManager(); | |
303 if (focus_manager_ != focus_manager) { | |
304 if (focus_manager_) | |
305 focus_manager_->RemoveFocusChangeListener(this); | |
306 focus_manager_ = focus_manager; | |
307 if (focus_manager_) | |
308 focus_manager_->AddFocusChangeListener(this); | |
309 } | |
310 } | |
311 | |
312 void DialogClientView::OnNativeThemeChanged(const ui::NativeTheme* theme) { | 261 void DialogClientView::OnNativeThemeChanged(const ui::NativeTheme* theme) { |
313 // The old dialog style needs an explicit background color, while the new | 262 // The old dialog style needs an explicit background color, while the new |
314 // dialog style simply inherits the bubble's frame view color. | 263 // dialog style simply inherits the bubble's frame view color. |
315 const DialogDelegate* dialog = GetDialogDelegate(); | 264 const DialogDelegate* dialog = GetDialogDelegate(); |
316 | 265 |
317 if (dialog && !dialog->UseNewStyleForThisDialog()) { | 266 if (dialog && !dialog->UseNewStyleForThisDialog()) { |
318 set_background(views::Background::CreateSolidBackground(GetNativeTheme()-> | 267 set_background(views::Background::CreateSolidBackground(GetNativeTheme()-> |
319 GetSystemColor(ui::NativeTheme::kColorId_DialogBackground))); | 268 GetSystemColor(ui::NativeTheme::kColorId_DialogBackground))); |
320 } | 269 } |
321 } | 270 } |
(...skipping 14 matching lines...) Expand all Loading... |
336 NOTREACHED(); | 285 NOTREACHED(); |
337 } | 286 } |
338 | 287 |
339 //////////////////////////////////////////////////////////////////////////////// | 288 //////////////////////////////////////////////////////////////////////////////// |
340 // DialogClientView, protected: | 289 // DialogClientView, protected: |
341 | 290 |
342 DialogClientView::DialogClientView(View* contents_view) | 291 DialogClientView::DialogClientView(View* contents_view) |
343 : ClientView(NULL, contents_view), | 292 : ClientView(NULL, contents_view), |
344 ok_button_(NULL), | 293 ok_button_(NULL), |
345 cancel_button_(NULL), | 294 cancel_button_(NULL), |
346 default_button_(NULL), | |
347 focus_manager_(NULL), | |
348 extra_view_(NULL), | 295 extra_view_(NULL), |
349 footnote_view_(NULL), | 296 footnote_view_(NULL), |
350 notified_delegate_(false) {} | 297 notified_delegate_(false) {} |
351 | 298 |
352 DialogDelegate* DialogClientView::GetDialogDelegate() const { | 299 DialogDelegate* DialogClientView::GetDialogDelegate() const { |
353 return GetWidget()->widget_delegate()->AsDialogDelegate(); | 300 return GetWidget()->widget_delegate()->AsDialogDelegate(); |
354 } | 301 } |
355 | 302 |
356 void DialogClientView::CreateExtraView() { | 303 void DialogClientView::CreateExtraView() { |
357 if (extra_view_) | 304 if (extra_view_) |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
402 button->SetMinSize(gfx::Size(kDialogMinButtonWidth, 0)); | 349 button->SetMinSize(gfx::Size(kDialogMinButtonWidth, 0)); |
403 button->SetGroup(kButtonGroup); | 350 button->SetGroup(kButtonGroup); |
404 return button; | 351 return button; |
405 } | 352 } |
406 | 353 |
407 void DialogClientView::UpdateButton(LabelButton* button, | 354 void DialogClientView::UpdateButton(LabelButton* button, |
408 ui::DialogButton type) { | 355 ui::DialogButton type) { |
409 DialogDelegate* dialog = GetDialogDelegate(); | 356 DialogDelegate* dialog = GetDialogDelegate(); |
410 button->SetText(dialog->GetDialogButtonLabel(type)); | 357 button->SetText(dialog->GetDialogButtonLabel(type)); |
411 button->SetEnabled(dialog->IsDialogButtonEnabled(type)); | 358 button->SetEnabled(dialog->IsDialogButtonEnabled(type)); |
412 | 359 button->SetIsDefault(type == dialog->GetDefaultDialogButton()); |
413 if (type == dialog->GetDefaultDialogButton()) { | |
414 default_button_ = button; | |
415 button->SetIsDefault(true); | |
416 } | |
417 } | 360 } |
418 | 361 |
419 int DialogClientView::GetButtonsAndExtraViewRowHeight() const { | 362 int DialogClientView::GetButtonsAndExtraViewRowHeight() const { |
420 int extra_view_height = ShouldShow(extra_view_) ? | 363 int extra_view_height = ShouldShow(extra_view_) ? |
421 extra_view_->GetPreferredSize().height() : 0; | 364 extra_view_->GetPreferredSize().height() : 0; |
422 int buttons_height = std::max( | 365 int buttons_height = std::max( |
423 ok_button_ ? ok_button_->GetPreferredSize().height() : 0, | 366 ok_button_ ? ok_button_->GetPreferredSize().height() : 0, |
424 cancel_button_ ? cancel_button_->GetPreferredSize().height() : 0); | 367 cancel_button_ ? cancel_button_->GetPreferredSize().height() : 0); |
425 return std::max(extra_view_height, buttons_height); | 368 return std::max(extra_view_height, buttons_height); |
426 } | 369 } |
427 | 370 |
428 gfx::Insets DialogClientView::GetButtonRowInsets() const { | 371 gfx::Insets DialogClientView::GetButtonRowInsets() const { |
429 // NOTE: The insets only apply to the buttons, extra view, and footnote view. | 372 // NOTE: The insets only apply to the buttons, extra view, and footnote view. |
430 return GetButtonsAndExtraViewRowHeight() == 0 ? gfx::Insets() : | 373 return GetButtonsAndExtraViewRowHeight() == 0 ? gfx::Insets() : |
431 gfx::Insets(0, kButtonHEdgeMarginNew, | 374 gfx::Insets(0, kButtonHEdgeMarginNew, |
432 kButtonVEdgeMarginNew, kButtonHEdgeMarginNew); | 375 kButtonVEdgeMarginNew, kButtonHEdgeMarginNew); |
433 } | 376 } |
434 | 377 |
435 void DialogClientView::Close() { | 378 void DialogClientView::Close() { |
436 GetWidget()->Close(); | 379 GetWidget()->Close(); |
437 GetDialogDelegate()->OnClosed(); | 380 GetDialogDelegate()->OnClosed(); |
438 } | 381 } |
439 | 382 |
440 } // namespace views | 383 } // namespace views |
OLD | NEW |