Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "views/widget/widget.h" | 5 #include "views/widget/widget.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "base/message_loop.h" | 8 #include "base/message_loop.h" |
| 9 #include "base/utf_string_conversions.h" | 9 #include "base/utf_string_conversions.h" |
| 10 #include "ui/base/l10n/l10n_font_util.h" | 10 #include "ui/base/l10n/l10n_font_util.h" |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 89 delegate(NULL), | 89 delegate(NULL), |
| 90 child(false), | 90 child(false), |
| 91 transient(false), | 91 transient(false), |
| 92 transparent(false), | 92 transparent(false), |
| 93 accept_events(true), | 93 accept_events(true), |
| 94 can_activate(true), | 94 can_activate(true), |
| 95 keep_on_top(false), | 95 keep_on_top(false), |
| 96 ownership(NATIVE_WIDGET_OWNS_WIDGET), | 96 ownership(NATIVE_WIDGET_OWNS_WIDGET), |
| 97 mirror_origin_in_rtl(false), | 97 mirror_origin_in_rtl(false), |
| 98 has_dropshadow(false), | 98 has_dropshadow(false), |
| 99 maximize(false), | |
| 99 double_buffer(false), | 100 double_buffer(false), |
| 100 parent(NULL), | 101 parent(NULL), |
| 101 parent_widget(NULL), | 102 parent_widget(NULL), |
| 102 native_widget(NULL) { | 103 native_widget(NULL) { |
| 103 } | 104 } |
| 104 | 105 |
| 105 Widget::InitParams::InitParams(Type type) | 106 Widget::InitParams::InitParams(Type type) |
| 106 : type(type), | 107 : type(type), |
| 107 delegate(NULL), | 108 delegate(NULL), |
| 108 child(type == TYPE_CONTROL), | 109 child(type == TYPE_CONTROL), |
| 109 transient(type == TYPE_POPUP || type == TYPE_MENU), | 110 transient(type == TYPE_POPUP || type == TYPE_MENU), |
| 110 transparent(false), | 111 transparent(false), |
| 111 accept_events(true), | 112 accept_events(true), |
| 112 can_activate(type != TYPE_POPUP && type != TYPE_MENU), | 113 can_activate(type != TYPE_POPUP && type != TYPE_MENU), |
| 113 keep_on_top(type == TYPE_MENU), | 114 keep_on_top(type == TYPE_MENU), |
| 114 ownership(NATIVE_WIDGET_OWNS_WIDGET), | 115 ownership(NATIVE_WIDGET_OWNS_WIDGET), |
| 115 mirror_origin_in_rtl(false), | 116 mirror_origin_in_rtl(false), |
| 116 has_dropshadow(false), | 117 has_dropshadow(false), |
| 118 maximize(false), | |
| 117 double_buffer(false), | 119 double_buffer(false), |
| 118 parent(NULL), | 120 parent(NULL), |
| 119 parent_widget(NULL), | 121 parent_widget(NULL), |
| 120 native_widget(NULL) { | 122 native_widget(NULL) { |
| 121 } | 123 } |
| 122 | 124 |
| 123 //////////////////////////////////////////////////////////////////////////////// | 125 //////////////////////////////////////////////////////////////////////////////// |
| 124 // Widget, public: | 126 // Widget, public: |
| 125 | 127 |
| 126 // static | 128 // static |
| (...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 418 } | 420 } |
| 419 | 421 |
| 420 void Widget::EnableClose(bool enable) { | 422 void Widget::EnableClose(bool enable) { |
| 421 if (non_client_view_) | 423 if (non_client_view_) |
| 422 non_client_view_->EnableClose(enable); | 424 non_client_view_->EnableClose(enable); |
| 423 native_widget_->EnableClose(enable); | 425 native_widget_->EnableClose(enable); |
| 424 } | 426 } |
| 425 | 427 |
| 426 void Widget::Show() { | 428 void Widget::Show() { |
| 427 if (non_client_view_) { | 429 if (non_client_view_) { |
| 428 native_widget_->ShowNativeWidget( | 430 if (saved_maximized_state_ && !initial_restored_bounds_.IsEmpty()) { |
| 429 saved_maximized_state_ ? internal::NativeWidgetPrivate::SHOW_MAXIMIZED | 431 native_widget_->ShowMaximizedWithBounds(initial_restored_bounds_); |
| 430 : internal::NativeWidgetPrivate::SHOW_RESTORED); | 432 } else { |
| 433 native_widget_->ShowWithState(saved_maximized_state_ ? | |
| 434 internal::NativeWidgetPrivate::SHOW_MAXIMIZED : | |
| 435 internal::NativeWidgetPrivate::SHOW_RESTORED); | |
| 436 } | |
| 431 // |saved_maximized_state_| only applies the first time the window is shown. | 437 // |saved_maximized_state_| only applies the first time the window is shown. |
| 432 // If we don't reset the value the window will be shown maximized every time | 438 // If we don't reset the value the window will be shown maximized every time |
| 433 // it is subsequently shown after being hidden. | 439 // it is subsequently shown after being hidden. |
| 434 saved_maximized_state_ = false; | 440 saved_maximized_state_ = false; |
| 435 } else { | 441 } else { |
| 436 native_widget_->Show(); | 442 native_widget_->Show(); |
| 437 } | 443 } |
| 438 } | 444 } |
| 439 | 445 |
| 440 void Widget::Hide() { | 446 void Widget::Hide() { |
| 441 native_widget_->Hide(); | 447 native_widget_->Hide(); |
| 442 } | 448 } |
| 443 | 449 |
| 444 void Widget::ShowInactive() { | 450 void Widget::ShowInactive() { |
| 445 native_widget_->ShowNativeWidget( | 451 native_widget_->ShowWithState(internal::NativeWidgetPrivate::SHOW_INACTIVE); |
| 446 internal::NativeWidgetPrivate::SHOW_INACTIVE); | |
| 447 } | 452 } |
| 448 | 453 |
| 449 void Widget::Activate() { | 454 void Widget::Activate() { |
| 450 native_widget_->Activate(); | 455 native_widget_->Activate(); |
| 451 } | 456 } |
| 452 | 457 |
| 453 void Widget::Deactivate() { | 458 void Widget::Deactivate() { |
| 454 native_widget_->Deactivate(); | 459 native_widget_->Deactivate(); |
| 455 } | 460 } |
| 456 | 461 |
| (...skipping 535 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 992 bool maximized; | 997 bool maximized; |
| 993 gfx::Rect bounds; | 998 gfx::Rect bounds; |
| 994 native_widget_->GetWindowBoundsAndMaximizedState(&bounds, &maximized); | 999 native_widget_->GetWindowBoundsAndMaximizedState(&bounds, &maximized); |
| 995 widget_delegate_->SaveWindowPlacement(bounds, maximized); | 1000 widget_delegate_->SaveWindowPlacement(bounds, maximized); |
| 996 } | 1001 } |
| 997 | 1002 |
| 998 void Widget::SetInitialBounds(const gfx::Rect& bounds) { | 1003 void Widget::SetInitialBounds(const gfx::Rect& bounds) { |
| 999 if (!non_client_view_) | 1004 if (!non_client_view_) |
| 1000 return; | 1005 return; |
| 1001 | 1006 |
| 1002 // First we obtain the window's saved show-style and store it. We need to do | 1007 gfx::Rect saved_bounds; |
| 1003 // this here, rather than in Show() because by the time Show() is called, | 1008 if (GetSavedBounds(&saved_bounds, &saved_maximized_state_)) { |
| 1004 // the window's size will have been reset (below) and the saved maximized | 1009 if (saved_maximized_state_) { |
| 1005 // state will have been lost. Sadly there's no way to tell on Windows when | 1010 // If we're going to maximize, wait until Show is invoked to set the |
| 1006 // a window is restored from maximized state, so we can't more accurately | 1011 // bounds. That way we avoid a noticable resize. |
| 1007 // track maximized state independently of sizing information. | 1012 initial_restored_bounds_ = saved_bounds; |
| 1008 widget_delegate_->GetSavedMaximizedState(&saved_maximized_state_); | |
| 1009 | |
| 1010 // Restore the window's placement from the controller. | |
| 1011 gfx::Rect saved_bounds = bounds; | |
| 1012 if (widget_delegate_->GetSavedWindowBounds(&saved_bounds)) { | |
| 1013 if (!widget_delegate_->ShouldRestoreWindowSize()) { | |
| 1014 saved_bounds.set_size(non_client_view_->GetPreferredSize()); | |
| 1015 } else { | 1013 } else { |
| 1016 // Make sure the bounds are at least the minimum size. | 1014 SetBounds(saved_bounds); |
| 1017 if (saved_bounds.width() < minimum_size_.width()) { | |
| 1018 saved_bounds.SetRect(saved_bounds.x(), saved_bounds.y(), | |
| 1019 saved_bounds.right() + minimum_size_.width() - | |
| 1020 saved_bounds.width(), | |
| 1021 saved_bounds.bottom()); | |
| 1022 } | |
| 1023 | |
| 1024 if (saved_bounds.height() < minimum_size_.height()) { | |
| 1025 saved_bounds.SetRect(saved_bounds.x(), saved_bounds.y(), | |
| 1026 saved_bounds.right(), | |
| 1027 saved_bounds.bottom() + minimum_size_.height() - | |
| 1028 saved_bounds.height()); | |
| 1029 } | |
| 1030 } | 1015 } |
| 1031 | |
| 1032 // Widget's SetBounds method does not further modify the bounds that are | |
| 1033 // passed to it. | |
| 1034 SetBounds(saved_bounds); | |
| 1035 } else { | 1016 } else { |
| 1036 if (bounds.IsEmpty()) { | 1017 if (bounds.IsEmpty()) { |
| 1037 // No initial bounds supplied, so size the window to its content and | 1018 // No initial bounds supplied, so size the window to its content and |
| 1038 // center over its parent. | 1019 // center over its parent. |
| 1039 native_widget_->CenterWindow(non_client_view_->GetPreferredSize()); | 1020 native_widget_->CenterWindow(non_client_view_->GetPreferredSize()); |
| 1040 } else { | 1021 } else { |
| 1041 // Use the supplied initial bounds. | 1022 // Use the supplied initial bounds. |
| 1042 SetBoundsConstrained(bounds, NULL); | 1023 SetBoundsConstrained(bounds, NULL); |
| 1043 } | 1024 } |
| 1044 } | 1025 } |
| 1045 } | 1026 } |
| 1046 | 1027 |
| 1028 bool Widget::GetSavedBounds(gfx::Rect* bounds, bool* maximize) { | |
| 1029 // First we obtain the window's saved show-style and store it. We need to do | |
| 1030 // this here, rather than in Show() because by the time Show() is called, | |
| 1031 // the window's size will have been reset (below) and the saved maximized | |
| 1032 // state will have been lost. Sadly there's no way to tell on Windows when | |
| 1033 // a window is restored from maximized state, so we can't more accurately | |
| 1034 // track maximized state independently of sizing information. | |
| 1035 widget_delegate_->GetSavedMaximizedState(maximize); | |
|
oshima
2011/07/19 16:23:44
no need to change in this CL, but looks like all t
| |
| 1036 | |
| 1037 // Restore the window's placement from the controller. | |
| 1038 if (widget_delegate_->GetSavedWindowBounds(bounds)) { | |
| 1039 if (!widget_delegate_->ShouldRestoreWindowSize()) { | |
| 1040 bounds->set_size(non_client_view_->GetPreferredSize()); | |
| 1041 } else { | |
| 1042 // Make sure the bounds are at least the minimum size. | |
| 1043 if (bounds->width() < minimum_size_.width()) | |
| 1044 bounds->set_width(minimum_size_.width()); | |
| 1045 | |
| 1046 if (bounds->height() < minimum_size_.height()) | |
| 1047 bounds->set_height(minimum_size_.height()); | |
| 1048 } | |
| 1049 return true; | |
| 1050 } | |
| 1051 return false; | |
| 1052 } | |
| 1053 | |
| 1047 namespace internal { | 1054 namespace internal { |
| 1048 | 1055 |
| 1049 //////////////////////////////////////////////////////////////////////////////// | 1056 //////////////////////////////////////////////////////////////////////////////// |
| 1050 // internal::NativeWidgetPrivate, NativeWidget implementation: | 1057 // internal::NativeWidgetPrivate, NativeWidget implementation: |
| 1051 | 1058 |
| 1052 internal::NativeWidgetPrivate* NativeWidgetPrivate::AsNativeWidgetPrivate() { | 1059 internal::NativeWidgetPrivate* NativeWidgetPrivate::AsNativeWidgetPrivate() { |
| 1053 return this; | 1060 return this; |
| 1054 } | 1061 } |
| 1055 | 1062 |
| 1056 } // namespace internal | 1063 } // namespace internal |
| 1057 } // namespace views | 1064 } // namespace views |
| OLD | NEW |