| 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/base/material_design/material_design_controller.h" | 10 #include "ui/base/material_design/material_design_controller.h" |
| 11 #include "ui/events/keycodes/keyboard_codes.h" | 11 #include "ui/events/keycodes/keyboard_codes.h" |
| 12 #include "ui/views/background.h" | 12 #include "ui/views/background.h" |
| 13 #include "ui/views/border.h" | 13 #include "ui/views/border.h" |
| 14 #include "ui/views/controls/button/blue_button.h" | 14 #include "ui/views/controls/button/blue_button.h" |
| 15 #include "ui/views/controls/button/custom_button.h" | 15 #include "ui/views/controls/button/custom_button.h" |
| 16 #include "ui/views/controls/button/label_button.h" | 16 #include "ui/views/controls/button/label_button.h" |
| 17 #include "ui/views/controls/button/md_text_button.h" | 17 #include "ui/views/controls/button/md_text_button.h" |
| 18 #include "ui/views/layout/layout_constants.h" |
| 18 #include "ui/views/style/platform_style.h" | 19 #include "ui/views/style/platform_style.h" |
| 19 #include "ui/views/views_delegate.h" | 20 #include "ui/views/views_delegate.h" |
| 20 #include "ui/views/widget/widget.h" | 21 #include "ui/views/widget/widget.h" |
| 21 #include "ui/views/window/dialog_delegate.h" | 22 #include "ui/views/window/dialog_delegate.h" |
| 22 | 23 |
| 23 namespace views { | 24 namespace views { |
| 24 | 25 |
| 25 namespace { | 26 namespace { |
| 26 | 27 |
| 27 // The group used by the buttons. This name is chosen voluntarily big not to | 28 // The group used by the buttons. This name is chosen voluntarily big not to |
| (...skipping 19 matching lines...) Expand all Loading... |
| 47 if (!button) | 48 if (!button) |
| 48 return; | 49 return; |
| 49 | 50 |
| 50 const gfx::Size size = button->GetPreferredSize(); | 51 const gfx::Size size = button->GetPreferredSize(); |
| 51 row_bounds->set_width(row_bounds->width() - size.width()); | 52 row_bounds->set_width(row_bounds->width() - size.width()); |
| 52 DCHECK_LE(button_height, row_bounds->height()); | 53 DCHECK_LE(button_height, row_bounds->height()); |
| 53 button->SetBounds( | 54 button->SetBounds( |
| 54 row_bounds->right(), | 55 row_bounds->right(), |
| 55 row_bounds->y() + (row_bounds->height() - button_height) / 2, | 56 row_bounds->y() + (row_bounds->height() - button_height) / 2, |
| 56 size.width(), button_height); | 57 size.width(), button_height); |
| 57 const int spacing = | 58 int spacing = ViewsDelegate::GetInstance() |
| 58 ViewsDelegate::GetInstance()->GetDialogRelatedButtonHorizontalSpacing(); | 59 ? ViewsDelegate::GetInstance()->GetSpacingMetric( |
| 60 SpacingMetric::RELATED_HORIZONTAL_BUTTON) |
| 61 : kRelatedButtonHSpacing; |
| 59 row_bounds->set_width(row_bounds->width() - spacing); | 62 row_bounds->set_width(row_bounds->width() - spacing); |
| 60 } | 63 } |
| 61 | 64 |
| 62 } // namespace | 65 } // namespace |
| 63 | 66 |
| 64 /////////////////////////////////////////////////////////////////////////////// | 67 /////////////////////////////////////////////////////////////////////////////// |
| 65 // DialogClientView, public: | 68 // DialogClientView, public: |
| 66 | 69 |
| 67 DialogClientView::DialogClientView(Widget* owner, View* contents_view) | 70 DialogClientView::DialogClientView(Widget* owner, View* contents_view) |
| 68 : ClientView(owner, contents_view), | 71 : ClientView(owner, contents_view), |
| 69 button_row_insets_( | 72 button_row_insets_(ViewsDelegate::GetInstance() |
| 70 ViewsDelegate::GetInstance()->GetDialogButtonInsets()) { | 73 ? ViewsDelegate::GetInstance()->GetInsetsMetric( |
| 74 InsetsMetric::DIALOG_BUTTON) |
| 75 : gfx::Insets(0, |
| 76 kButtonHEdgeMarginNew, |
| 77 kButtonVEdgeMarginNew, |
| 78 kButtonHEdgeMarginNew)) { |
| 71 // Doing this now ensures this accelerator will have lower priority than | 79 // Doing this now ensures this accelerator will have lower priority than |
| 72 // one set by the contents view. | 80 // one set by the contents view. |
| 73 AddAccelerator(ui::Accelerator(ui::VKEY_ESCAPE, ui::EF_NONE)); | 81 AddAccelerator(ui::Accelerator(ui::VKEY_ESCAPE, ui::EF_NONE)); |
| 74 } | 82 } |
| 75 | 83 |
| 76 DialogClientView::~DialogClientView() { | 84 DialogClientView::~DialogClientView() { |
| 77 } | 85 } |
| 78 | 86 |
| 79 void DialogClientView::AcceptWindow() { | 87 void DialogClientView::AcceptWindow() { |
| 80 // Only notify the delegate once. See |delegate_allowed_close_|'s comment. | 88 // Only notify the delegate once. See |delegate_allowed_close_|'s comment. |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 114 | 122 |
| 115 const DialogClientView* DialogClientView::AsDialogClientView() const { | 123 const DialogClientView* DialogClientView::AsDialogClientView() const { |
| 116 return this; | 124 return this; |
| 117 } | 125 } |
| 118 | 126 |
| 119 //////////////////////////////////////////////////////////////////////////////// | 127 //////////////////////////////////////////////////////////////////////////////// |
| 120 // DialogClientView, View overrides: | 128 // DialogClientView, View overrides: |
| 121 | 129 |
| 122 gfx::Size DialogClientView::GetPreferredSize() const { | 130 gfx::Size DialogClientView::GetPreferredSize() const { |
| 123 // Initialize the size to fit the buttons and extra view row. | 131 // Initialize the size to fit the buttons and extra view row. |
| 132 int extra_view_padding = 0; |
| 133 if (!GetDialogDelegate()->GetExtraViewPadding(&extra_view_padding)) |
| 134 extra_view_padding = ViewsDelegate::GetInstance() |
| 135 ? ViewsDelegate::GetInstance()->GetSpacingMetric( |
| 136 SpacingMetric::RELATED_HORIZONTAL_BUTTON) |
| 137 : kRelatedButtonHSpacing; |
| 124 gfx::Size size( | 138 gfx::Size size( |
| 125 (ok_button_ ? ok_button_->GetPreferredSize().width() : 0) + | 139 (ok_button_ ? ok_button_->GetPreferredSize().width() : 0) + |
| 126 (cancel_button_ ? cancel_button_->GetPreferredSize().width() : 0) + | 140 (cancel_button_ ? cancel_button_->GetPreferredSize().width() : 0) + |
| 127 (cancel_button_ && ok_button_ | 141 (cancel_button_ && ok_button_ |
| 128 ? ViewsDelegate::GetInstance() | 142 ? (ViewsDelegate::GetInstance() |
| 129 ->GetDialogRelatedButtonHorizontalSpacing() | 143 ? ViewsDelegate::GetInstance()->GetSpacingMetric( |
| 144 SpacingMetric::RELATED_HORIZONTAL_BUTTON) |
| 145 : kRelatedButtonHSpacing) |
| 130 : 0) + | 146 : 0) + |
| 131 (ShouldShow(extra_view_) ? extra_view_->GetPreferredSize().width() | 147 (ShouldShow(extra_view_) ? extra_view_->GetPreferredSize().width() |
| 132 : 0) + | 148 : 0) + |
| 133 GetExtraViewSpacing(), | 149 GetExtraViewSpacing(), |
| 134 0); | 150 0); |
| 135 | 151 |
| 136 int buttons_height = GetButtonsAndExtraViewRowHeight(); | 152 int buttons_height = GetButtonsAndExtraViewRowHeight(); |
| 137 if (buttons_height != 0) { | 153 if (buttons_height != 0) { |
| 138 size.Enlarge(0, buttons_height); | 154 size.Enlarge(0, buttons_height); |
| 139 // Inset the buttons and extra view. | 155 // Inset the buttons and extra view. |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 176 } else { | 192 } else { |
| 177 LayoutButton(ok_button_, &row_bounds, button_height); | 193 LayoutButton(ok_button_, &row_bounds, button_height); |
| 178 LayoutButton(cancel_button_, &row_bounds, button_height); | 194 LayoutButton(cancel_button_, &row_bounds, button_height); |
| 179 } | 195 } |
| 180 if (extra_view_) { | 196 if (extra_view_) { |
| 181 int custom_padding = 0; | 197 int custom_padding = 0; |
| 182 if (has_dialog_buttons() && | 198 if (has_dialog_buttons() && |
| 183 GetDialogDelegate()->GetExtraViewPadding(&custom_padding)) { | 199 GetDialogDelegate()->GetExtraViewPadding(&custom_padding)) { |
| 184 // The padding between buttons applied in LayoutButton() will already | 200 // The padding between buttons applied in LayoutButton() will already |
| 185 // have accounted for some of the distance here. | 201 // have accounted for some of the distance here. |
| 186 custom_padding -= ViewsDelegate::GetInstance() | 202 custom_padding -= ViewsDelegate::GetInstance()->GetSpacingMetric( |
| 187 ->GetDialogRelatedButtonHorizontalSpacing(); | 203 SpacingMetric::RELATED_HORIZONTAL_BUTTON); |
| 188 row_bounds.set_width(row_bounds.width() - custom_padding); | 204 row_bounds.set_width(row_bounds.width() - custom_padding); |
| 189 } | 205 } |
| 190 row_bounds.set_width(std::min(row_bounds.width(), | 206 row_bounds.set_width(std::min(row_bounds.width(), |
| 191 extra_view_->GetPreferredSize().width())); | 207 extra_view_->GetPreferredSize().width())); |
| 192 extra_view_->SetBoundsRect(row_bounds); | 208 extra_view_->SetBoundsRect(row_bounds); |
| 193 } | 209 } |
| 194 | 210 |
| 195 if (height > 0) { | 211 if (height > 0) { |
| 196 // Inset to the top of the buttons, plus their top padding, in order to | 212 // Inset to the top of the buttons, plus their top padding, in order to |
| 197 // exclude that area from the content view's bounds. | 213 // exclude that area from the content view's bounds. |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 289 PlatformStyle::kDialogDefaultButtonCanBeCancel); | 305 PlatformStyle::kDialogDefaultButtonCanBeCancel); |
| 290 | 306 |
| 291 // The default button is always blue in Harmony. | 307 // The default button is always blue in Harmony. |
| 292 if (is_default && (ui::MaterialDesignController::IsSecondaryUiMaterial() || | 308 if (is_default && (ui::MaterialDesignController::IsSecondaryUiMaterial() || |
| 293 GetDialogDelegate()->ShouldDefaultButtonBeBlue())) { | 309 GetDialogDelegate()->ShouldDefaultButtonBeBlue())) { |
| 294 button = MdTextButton::CreateSecondaryUiBlueButton(this, title); | 310 button = MdTextButton::CreateSecondaryUiBlueButton(this, title); |
| 295 } else { | 311 } else { |
| 296 button = MdTextButton::CreateSecondaryUiButton(this, title); | 312 button = MdTextButton::CreateSecondaryUiButton(this, title); |
| 297 } | 313 } |
| 298 | 314 |
| 299 const int minimum_width = | 315 // TODO(bsep): Setting the minimum size is redundant with MdTextButton, so |
| 300 ViewsDelegate::GetInstance()->GetDialogButtonMinimumWidth(); | 316 // this can be deleted when harmony is always on. |
| 317 const int minimum_width = ViewsDelegate::GetInstance()->GetSpacingMetric( |
| 318 SpacingMetric::DIALOG_BUTTON_MINIMUM_WIDTH); |
| 301 button->SetMinSize(gfx::Size(minimum_width, 0)); | 319 button->SetMinSize(gfx::Size(minimum_width, 0)); |
| 302 | 320 |
| 303 button->SetGroup(kButtonGroup); | 321 button->SetGroup(kButtonGroup); |
| 304 return button; | 322 return button; |
| 305 } | 323 } |
| 306 | 324 |
| 307 int DialogClientView::GetButtonHeight() const { | 325 int DialogClientView::GetButtonHeight() const { |
| 308 return std::max( | 326 return std::max( |
| 309 ok_button_ ? ok_button_->GetPreferredSize().height() : 0, | 327 ok_button_ ? ok_button_->GetPreferredSize().height() : 0, |
| 310 cancel_button_ ? cancel_button_->GetPreferredSize().height() : 0); | 328 cancel_button_ ? cancel_button_->GetPreferredSize().height() : 0); |
| 311 } | 329 } |
| 312 | 330 |
| 313 int DialogClientView::GetExtraViewHeight() const { | 331 int DialogClientView::GetExtraViewHeight() const { |
| 314 return ShouldShow(extra_view_) ? extra_view_->GetPreferredSize().height() : 0; | 332 return ShouldShow(extra_view_) ? extra_view_->GetPreferredSize().height() : 0; |
| 315 } | 333 } |
| 316 | 334 |
| 317 int DialogClientView::GetButtonsAndExtraViewRowHeight() const { | 335 int DialogClientView::GetButtonsAndExtraViewRowHeight() const { |
| 318 return std::max(GetExtraViewHeight(), GetButtonHeight()); | 336 return std::max(GetExtraViewHeight(), GetButtonHeight()); |
| 319 } | 337 } |
| 320 | 338 |
| 321 gfx::Insets DialogClientView::GetButtonRowInsets() const { | 339 gfx::Insets DialogClientView::GetButtonRowInsets() const { |
| 322 if (GetButtonsAndExtraViewRowHeight() == 0) | 340 if (GetButtonsAndExtraViewRowHeight() == 0) |
| 323 return gfx::Insets(); | 341 return gfx::Insets(); |
| 324 | 342 |
| 325 // Some subclasses of DialogClientView, in order to do their own layout, set | 343 // Some subclasses of DialogClientView, in order to do their own layout, set |
| 326 // button_row_insets_ to gfx::Insets(). To avoid breaking behavior of those | 344 // button_row_insets_ to gfx::Insets(). To avoid breaking behavior of those |
| 327 // dialogs, supplying 0 for the top inset of the row falls back to | 345 // dialogs, supplying 0 for the top inset of the row falls back to |
| 328 // ViewsDelegate::GetRelatedControlVerticalSpacing. | 346 // ViewsDelegate::GetSpacingMetric(SpacingMetric::RELATED_VERTICAL_CONTROL). |
| 329 // TODO(bsep): The top inset should never be 0 when harmony is enabled. | 347 // TODO(bsep): The top inset should never be 0 when harmony is enabled. |
| 330 const int top = button_row_insets_.top() == 0 | 348 const int top = button_row_insets_.top() == 0 |
| 331 ? ViewsDelegate::GetInstance() | 349 ? ViewsDelegate::GetInstance()->GetSpacingMetric( |
| 332 ->GetDialogRelatedControlVerticalSpacing() | 350 SpacingMetric::RELATED_VERTICAL_CONTROL) |
| 333 : button_row_insets_.top(); | 351 : button_row_insets_.top(); |
| 334 return gfx::Insets(top, button_row_insets_.left(), | 352 return gfx::Insets(top, button_row_insets_.left(), |
| 335 button_row_insets_.bottom(), button_row_insets_.right()); | 353 button_row_insets_.bottom(), button_row_insets_.right()); |
| 336 } | 354 } |
| 337 | 355 |
| 338 void DialogClientView::SetupFocusChain() { | 356 void DialogClientView::SetupFocusChain() { |
| 339 // Create a vector of child views in the order of intended focus. | 357 // Create a vector of child views in the order of intended focus. |
| 340 std::vector<View*> child_views; | 358 std::vector<View*> child_views; |
| 341 child_views.push_back(contents_view()); | 359 child_views.push_back(contents_view()); |
| 342 child_views.push_back(extra_view_); | 360 child_views.push_back(extra_view_); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 360 } | 378 } |
| 361 | 379 |
| 362 int DialogClientView::GetExtraViewSpacing() const { | 380 int DialogClientView::GetExtraViewSpacing() const { |
| 363 if (!ShouldShow(extra_view_) || !has_dialog_buttons()) | 381 if (!ShouldShow(extra_view_) || !has_dialog_buttons()) |
| 364 return 0; | 382 return 0; |
| 365 | 383 |
| 366 int extra_view_padding = 0; | 384 int extra_view_padding = 0; |
| 367 if (GetDialogDelegate()->GetExtraViewPadding(&extra_view_padding)) | 385 if (GetDialogDelegate()->GetExtraViewPadding(&extra_view_padding)) |
| 368 return extra_view_padding; | 386 return extra_view_padding; |
| 369 | 387 |
| 370 return ViewsDelegate::GetInstance() | 388 return ViewsDelegate::GetInstance()->GetSpacingMetric( |
| 371 ->GetDialogRelatedButtonHorizontalSpacing(); | 389 views::SpacingMetric::RELATED_HORIZONTAL_BUTTON); |
| 372 } | 390 } |
| 373 | 391 |
| 374 void DialogClientView::SetupViews() { | 392 void DialogClientView::SetupViews() { |
| 375 const int buttons = GetDialogDelegate()->GetDialogButtons(); | 393 const int buttons = GetDialogDelegate()->GetDialogButtons(); |
| 376 | 394 |
| 377 if (buttons & ui::DIALOG_BUTTON_OK) { | 395 if (buttons & ui::DIALOG_BUTTON_OK) { |
| 378 if (!ok_button_) { | 396 if (!ok_button_) { |
| 379 ok_button_ = CreateDialogButton(ui::DIALOG_BUTTON_OK); | 397 ok_button_ = CreateDialogButton(ui::DIALOG_BUTTON_OK); |
| 380 AddChildView(ok_button_); | 398 AddChildView(ok_button_); |
| 381 } | 399 } |
| (...skipping 20 matching lines...) Expand all Loading... |
| 402 return; | 420 return; |
| 403 | 421 |
| 404 extra_view_ = GetDialogDelegate()->CreateExtraView(); | 422 extra_view_ = GetDialogDelegate()->CreateExtraView(); |
| 405 if (extra_view_) { | 423 if (extra_view_) { |
| 406 extra_view_->SetGroup(kButtonGroup); | 424 extra_view_->SetGroup(kButtonGroup); |
| 407 AddChildView(extra_view_); | 425 AddChildView(extra_view_); |
| 408 } | 426 } |
| 409 } | 427 } |
| 410 | 428 |
| 411 } // namespace views | 429 } // namespace views |
| OLD | NEW |