| 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" |
| 11 #include "ui/base/resource/resource_bundle.h" |
| 10 #include "ui/gfx/compositor/compositor.h" | 12 #include "ui/gfx/compositor/compositor.h" |
| 11 #include "views/focus/view_storage.h" | 13 #include "views/focus/view_storage.h" |
| 12 #include "views/ime/input_method.h" | 14 #include "views/ime/input_method.h" |
| 13 #include "views/views_delegate.h" | 15 #include "views/views_delegate.h" |
| 14 #include "views/widget/default_theme_provider.h" | 16 #include "views/widget/default_theme_provider.h" |
| 15 #include "views/widget/root_view.h" | 17 #include "views/widget/root_view.h" |
| 16 #include "views/widget/native_widget.h" | 18 #include "views/widget/native_widget.h" |
| 17 #include "views/widget/widget_delegate.h" | 19 #include "views/widget/widget_delegate.h" |
| 18 #include "views/window/custom_frame_view.h" | 20 #include "views/window/custom_frame_view.h" |
| 19 | 21 |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 91 : is_mouse_button_pressed_(false), | 93 : is_mouse_button_pressed_(false), |
| 92 last_mouse_event_was_move_(false), | 94 last_mouse_event_was_move_(false), |
| 93 native_widget_(NULL), | 95 native_widget_(NULL), |
| 94 widget_delegate_(NULL), | 96 widget_delegate_(NULL), |
| 95 non_client_view_(NULL), | 97 non_client_view_(NULL), |
| 96 dragged_view_(NULL), | 98 dragged_view_(NULL), |
| 97 ownership_(InitParams::NATIVE_WIDGET_OWNS_WIDGET), | 99 ownership_(InitParams::NATIVE_WIDGET_OWNS_WIDGET), |
| 98 is_secondary_widget_(true), | 100 is_secondary_widget_(true), |
| 99 frame_type_(FRAME_TYPE_DEFAULT), | 101 frame_type_(FRAME_TYPE_DEFAULT), |
| 100 disable_inactive_rendering_(false), | 102 disable_inactive_rendering_(false), |
| 101 widget_closed_(false) { | 103 widget_closed_(false), |
| 104 saved_maximized_state_(false), |
| 105 minimum_size_(100, 100) { |
| 102 } | 106 } |
| 103 | 107 |
| 104 Widget::~Widget() { | 108 Widget::~Widget() { |
| 105 DestroyRootView(); | 109 DestroyRootView(); |
| 106 | 110 |
| 107 if (ownership_ == InitParams::WIDGET_OWNS_NATIVE_WIDGET) | 111 if (ownership_ == InitParams::WIDGET_OWNS_NATIVE_WIDGET) |
| 108 delete native_widget_; | 112 delete native_widget_; |
| 109 } | 113 } |
| 110 | 114 |
| 111 // static | 115 // static |
| 112 void Widget::SetPureViews(bool pure) { | 116 void Widget::SetPureViews(bool pure) { |
| 113 use_pure_views = pure; | 117 use_pure_views = pure; |
| 114 } | 118 } |
| 115 | 119 |
| 116 // static | 120 // static |
| 117 bool Widget::IsPureViews() { | 121 bool Widget::IsPureViews() { |
| 118 return use_pure_views; | 122 return use_pure_views; |
| 119 } | 123 } |
| 120 | 124 |
| 121 // static | 125 // static |
| 122 Widget* Widget::GetWidgetForNativeView(gfx::NativeView native_view) { | 126 Widget* Widget::GetWidgetForNativeView(gfx::NativeView native_view) { |
| 123 NativeWidget* native_widget = | 127 NativeWidget* native_widget = |
| 124 NativeWidget::GetNativeWidgetForNativeView(native_view); | 128 NativeWidget::GetNativeWidgetForNativeView(native_view); |
| 125 return native_widget ? native_widget->GetWidget() : NULL; | 129 return native_widget ? native_widget->GetWidget() : NULL; |
| 126 } | 130 } |
| 127 | 131 |
| 132 // static |
| 133 int Widget::GetLocalizedContentsWidth(int col_resource_id) { |
| 134 return ui::GetLocalizedContentsWidthForFont(col_resource_id, |
| 135 ResourceBundle::GetSharedInstance().GetFont(ResourceBundle::BaseFont)); |
| 136 } |
| 137 |
| 138 // static |
| 139 int Widget::GetLocalizedContentsHeight(int row_resource_id) { |
| 140 return ui::GetLocalizedContentsHeightForFont(row_resource_id, |
| 141 ResourceBundle::GetSharedInstance().GetFont(ResourceBundle::BaseFont)); |
| 142 } |
| 143 |
| 144 // static |
| 145 gfx::Size Widget::GetLocalizedContentsSize(int col_resource_id, |
| 146 int row_resource_id) { |
| 147 return gfx::Size(GetLocalizedContentsWidth(col_resource_id), |
| 148 GetLocalizedContentsHeight(row_resource_id)); |
| 149 } |
| 150 |
| 128 void Widget::Init(const InitParams& params) { | 151 void Widget::Init(const InitParams& params) { |
| 129 widget_delegate_ = | 152 widget_delegate_ = |
| 130 params.delegate ? params.delegate : new DefaultWidgetDelegate; | 153 params.delegate ? params.delegate : new DefaultWidgetDelegate; |
| 131 ownership_ = params.ownership; | 154 ownership_ = params.ownership; |
| 132 native_widget_ = | 155 native_widget_ = |
| 133 params.native_widget ? params.native_widget | 156 params.native_widget ? params.native_widget |
| 134 : NativeWidget::CreateNativeWidget(this); | 157 : NativeWidget::CreateNativeWidget(this); |
| 135 GetRootView(); | 158 GetRootView(); |
| 136 default_theme_provider_.reset(new DefaultThemeProvider); | 159 default_theme_provider_.reset(new DefaultThemeProvider); |
| 137 if (params.type == InitParams::TYPE_MENU) | 160 if (params.type == InitParams::TYPE_MENU) |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 277 void Widget::CloseNow() { | 300 void Widget::CloseNow() { |
| 278 native_widget_->CloseNow(); | 301 native_widget_->CloseNow(); |
| 279 } | 302 } |
| 280 | 303 |
| 281 void Widget::EnableClose(bool enable) { | 304 void Widget::EnableClose(bool enable) { |
| 282 non_client_view_->EnableClose(enable); | 305 non_client_view_->EnableClose(enable); |
| 283 native_widget_->EnableClose(enable); | 306 native_widget_->EnableClose(enable); |
| 284 } | 307 } |
| 285 | 308 |
| 286 void Widget::Show() { | 309 void Widget::Show() { |
| 287 native_widget_->Show(); | 310 if (non_client_view_) { |
| 311 native_widget_->ShowNativeWidget( |
| 312 saved_maximized_state_ ? NativeWidget::SHOW_MAXIMIZED |
| 313 : NativeWidget::SHOW_RESTORED); |
| 314 // |saved_maximized_state_| only applies the first time the window is shown. |
| 315 // If we don't reset the value the window will be shown maximized every time |
| 316 // it is subsequently shown after being hidden. |
| 317 saved_maximized_state_ = false; |
| 318 } else { |
| 319 native_widget_->Show(); |
| 320 } |
| 288 } | 321 } |
| 289 | 322 |
| 290 void Widget::Hide() { | 323 void Widget::Hide() { |
| 291 native_widget_->Hide(); | 324 native_widget_->Hide(); |
| 292 } | 325 } |
| 293 | 326 |
| 294 void Widget::ShowInactive() { | 327 void Widget::ShowInactive() { |
| 295 native_widget_->ShowNativeWidget(NativeWidget::SHOW_INACTIVE); | 328 native_widget_->ShowNativeWidget(NativeWidget::SHOW_INACTIVE); |
| 296 } | 329 } |
| 297 | 330 |
| (...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 517 if (ViewsDelegate::views_delegate) | 550 if (ViewsDelegate::views_delegate) |
| 518 ViewsDelegate::views_delegate->NotifyAccessibilityEvent(view, event_type); | 551 ViewsDelegate::views_delegate->NotifyAccessibilityEvent(view, event_type); |
| 519 | 552 |
| 520 if (send_native_event) | 553 if (send_native_event) |
| 521 native_widget_->SendNativeAccessibilityEvent(view, event_type); | 554 native_widget_->SendNativeAccessibilityEvent(view, event_type); |
| 522 } | 555 } |
| 523 | 556 |
| 524 //////////////////////////////////////////////////////////////////////////////// | 557 //////////////////////////////////////////////////////////////////////////////// |
| 525 // Widget, NativeWidgetDelegate implementation: | 558 // Widget, NativeWidgetDelegate implementation: |
| 526 | 559 |
| 560 bool Widget::IsModal() const { |
| 561 return widget_delegate_->IsModal(); |
| 562 } |
| 563 |
| 564 bool Widget::IsDialogBox() const { |
| 565 return !!widget_delegate_->AsDialogDelegate(); |
| 566 } |
| 567 |
| 527 bool Widget::CanActivate() const { | 568 bool Widget::CanActivate() const { |
| 528 return widget_delegate_->CanActivate(); | 569 return widget_delegate_->CanActivate(); |
| 529 } | 570 } |
| 530 | 571 |
| 531 bool Widget::IsInactiveRenderingDisabled() const { | 572 bool Widget::IsInactiveRenderingDisabled() const { |
| 532 return disable_inactive_rendering_; | 573 return disable_inactive_rendering_; |
| 533 } | 574 } |
| 534 | 575 |
| 535 void Widget::EnableInactiveRendering() { | 576 void Widget::EnableInactiveRendering() { |
| 536 disable_inactive_rendering_ = false; | 577 disable_inactive_rendering_ = false; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 551 focused_view, | 592 focused_view, |
| 552 GetNativeView()); | 593 GetNativeView()); |
| 553 } | 594 } |
| 554 | 595 |
| 555 void Widget::OnNativeBlur(gfx::NativeView focused_view) { | 596 void Widget::OnNativeBlur(gfx::NativeView focused_view) { |
| 556 GetFocusManager()->GetWidgetFocusManager()->OnWidgetFocusEvent( | 597 GetFocusManager()->GetWidgetFocusManager()->OnWidgetFocusEvent( |
| 557 GetNativeView(), | 598 GetNativeView(), |
| 558 focused_view); | 599 focused_view); |
| 559 } | 600 } |
| 560 | 601 |
| 561 void Widget::OnNativeWidgetCreated() { | 602 void Widget::OnNativeWidgetCreated(const gfx::Rect& create_bounds) { |
| 562 if (GetTopLevelWidget() == this) { | 603 if (GetTopLevelWidget() == this) { |
| 563 // Only the top level Widget in a native widget hierarchy has a focus | 604 // Only the top level Widget in a native widget hierarchy has a focus |
| 564 // manager. | 605 // manager. |
| 565 focus_manager_.reset(new FocusManager(this)); | 606 focus_manager_.reset(new FocusManager(this)); |
| 566 } | 607 } |
| 567 EnsureCompositor(); | 608 EnsureCompositor(); |
| 568 | 609 |
| 569 native_widget_->SetAccessibleRole( | 610 native_widget_->SetAccessibleRole( |
| 570 widget_delegate_->GetAccessibleWindowRole()); | 611 widget_delegate_->GetAccessibleWindowRole()); |
| 571 native_widget_->SetAccessibleState( | 612 native_widget_->SetAccessibleState( |
| 572 widget_delegate_->GetAccessibleWindowState()); | 613 widget_delegate_->GetAccessibleWindowState()); |
| 614 |
| 615 if (widget_delegate_->IsModal()) |
| 616 native_widget_->BecomeModal(); |
| 617 |
| 618 UpdateWindowTitle(); |
| 619 SetInitialBounds(create_bounds); |
| 573 } | 620 } |
| 574 | 621 |
| 575 void Widget::OnNativeWidgetDestroying() { | 622 void Widget::OnNativeWidgetDestroying() { |
| 576 if (non_client_view_) | 623 if (non_client_view_) |
| 577 non_client_view_->WindowClosing(); | 624 non_client_view_->WindowClosing(); |
| 578 widget_delegate_->WindowClosing(); | 625 widget_delegate_->WindowClosing(); |
| 579 } | 626 } |
| 580 | 627 |
| 581 void Widget::OnNativeWidgetDestroyed() { | 628 void Widget::OnNativeWidgetDestroyed() { |
| 582 widget_delegate_->DeleteDelegate(); | 629 widget_delegate_->DeleteDelegate(); |
| (...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 772 // bail. | 819 // bail. |
| 773 if (!widget_delegate_) | 820 if (!widget_delegate_) |
| 774 return; | 821 return; |
| 775 | 822 |
| 776 bool maximized; | 823 bool maximized; |
| 777 gfx::Rect bounds; | 824 gfx::Rect bounds; |
| 778 native_widget_->GetWindowBoundsAndMaximizedState(&bounds, &maximized); | 825 native_widget_->GetWindowBoundsAndMaximizedState(&bounds, &maximized); |
| 779 widget_delegate_->SaveWindowPlacement(bounds, maximized); | 826 widget_delegate_->SaveWindowPlacement(bounds, maximized); |
| 780 } | 827 } |
| 781 | 828 |
| 829 void Widget::SetInitialBounds(const gfx::Rect& bounds) { |
| 830 if (!non_client_view_) |
| 831 return; |
| 832 |
| 833 // First we obtain the window's saved show-style and store it. We need to do |
| 834 // this here, rather than in Show() because by the time Show() is called, |
| 835 // the window's size will have been reset (below) and the saved maximized |
| 836 // state will have been lost. Sadly there's no way to tell on Windows when |
| 837 // a window is restored from maximized state, so we can't more accurately |
| 838 // track maximized state independently of sizing information. |
| 839 widget_delegate_->GetSavedMaximizedState( |
| 840 &saved_maximized_state_); |
| 841 |
| 842 // Restore the window's placement from the controller. |
| 843 gfx::Rect saved_bounds = bounds; |
| 844 if (widget_delegate_->GetSavedWindowBounds(&saved_bounds)) { |
| 845 if (!widget_delegate_->ShouldRestoreWindowSize()) { |
| 846 saved_bounds.set_size(non_client_view_->GetPreferredSize()); |
| 847 } else { |
| 848 // Make sure the bounds are at least the minimum size. |
| 849 if (saved_bounds.width() < minimum_size_.width()) { |
| 850 saved_bounds.SetRect(saved_bounds.x(), saved_bounds.y(), |
| 851 saved_bounds.right() + minimum_size_.width() - |
| 852 saved_bounds.width(), |
| 853 saved_bounds.bottom()); |
| 854 } |
| 855 |
| 856 if (saved_bounds.height() < minimum_size_.height()) { |
| 857 saved_bounds.SetRect(saved_bounds.x(), saved_bounds.y(), |
| 858 saved_bounds.right(), |
| 859 saved_bounds.bottom() + minimum_size_.height() - |
| 860 saved_bounds.height()); |
| 861 } |
| 862 } |
| 863 |
| 864 // Widget's SetBounds method does not further modify the bounds that are |
| 865 // passed to it. |
| 866 SetBounds(saved_bounds); |
| 867 } else { |
| 868 if (bounds.IsEmpty()) { |
| 869 // No initial bounds supplied, so size the window to its content and |
| 870 // center over its parent. |
| 871 native_widget_->CenterWindow(non_client_view_->GetPreferredSize()); |
| 872 } else { |
| 873 // Use the supplied initial bounds. |
| 874 SetBoundsConstrained(bounds, NULL); |
| 875 } |
| 876 } |
| 877 } |
| 782 | 878 |
| 783 | 879 |
| 784 } // namespace views | 880 } // namespace views |
| OLD | NEW |