| 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/window/window.h" | 5 #include "views/window/window.h" |
| 6 | 6 |
| 7 #include "base/string_util.h" | 7 #include "base/string_util.h" |
| 8 #include "third_party/skia/include/core/SkBitmap.h" | 8 #include "third_party/skia/include/core/SkBitmap.h" |
| 9 #include "ui/base/l10n/l10n_font_util.h" | |
| 10 #include "ui/base/resource/resource_bundle.h" | |
| 11 #include "ui/gfx/font.h" | 9 #include "ui/gfx/font.h" |
| 12 #include "ui/gfx/rect.h" | 10 #include "ui/gfx/rect.h" |
| 13 #include "ui/gfx/size.h" | 11 #include "ui/gfx/size.h" |
| 14 #include "views/widget/widget.h" | 12 #include "views/widget/widget.h" |
| 15 #include "views/widget/native_widget.h" | 13 #include "views/widget/native_widget.h" |
| 16 #include "views/window/native_window.h" | 14 #include "views/window/native_window.h" |
| 17 #include "views/window/window_delegate.h" | 15 #include "views/window/window_delegate.h" |
| 18 | 16 |
| 19 namespace views { | 17 namespace views { |
| 20 | 18 |
| 21 //////////////////////////////////////////////////////////////////////////////// | 19 //////////////////////////////////////////////////////////////////////////////// |
| 22 // Window, public: | 20 // Window, public: |
| 23 | 21 |
| 24 Window::InitParams::InitParams(WindowDelegate* window_delegate) | 22 Window::InitParams::InitParams(WindowDelegate* window_delegate) |
| 25 : window_delegate(window_delegate), | 23 : window_delegate(window_delegate), |
| 26 parent_window(NULL), | 24 parent_window(NULL), |
| 27 native_window(NULL), | 25 native_window(NULL), |
| 28 widget_init_params(Widget::InitParams::TYPE_WINDOW) { | 26 widget_init_params(Widget::InitParams::TYPE_WINDOW) { |
| 29 } | 27 } |
| 30 | 28 |
| 31 Window::Window() | 29 Window::Window() |
| 32 : native_window_(NULL), | 30 : native_window_(NULL) { |
| 33 saved_maximized_state_(false), | |
| 34 minimum_size_(100, 100) { | |
| 35 } | 31 } |
| 36 | 32 |
| 37 Window::~Window() { | 33 Window::~Window() { |
| 38 } | 34 } |
| 39 | 35 |
| 40 // static | 36 // static |
| 41 Window* Window::CreateChromeWindow(gfx::NativeWindow parent, | 37 Window* Window::CreateChromeWindow(gfx::NativeWindow parent, |
| 42 const gfx::Rect& bounds, | 38 const gfx::Rect& bounds, |
| 43 WindowDelegate* window_delegate) { | 39 WindowDelegate* window_delegate) { |
| 44 Window* window = new Window; | 40 Window* window = new Window; |
| 45 Window::InitParams params(window_delegate); | 41 Window::InitParams params(window_delegate); |
| 46 params.parent_window = parent; | 42 params.parent_window = parent; |
| 47 #if defined(OS_WIN) | 43 #if defined(OS_WIN) |
| 48 params.widget_init_params.parent = parent; | 44 params.widget_init_params.parent = parent; |
| 49 #endif | 45 #endif |
| 50 params.widget_init_params.bounds = bounds; | 46 params.widget_init_params.bounds = bounds; |
| 51 window->InitWindow(params); | 47 window->InitWindow(params); |
| 52 return window; | 48 return window; |
| 53 } | 49 } |
| 54 | 50 |
| 55 // static | |
| 56 int Window::GetLocalizedContentsWidth(int col_resource_id) { | |
| 57 return ui::GetLocalizedContentsWidthForFont(col_resource_id, | |
| 58 ResourceBundle::GetSharedInstance().GetFont(ResourceBundle::BaseFont)); | |
| 59 } | |
| 60 | |
| 61 // static | |
| 62 int Window::GetLocalizedContentsHeight(int row_resource_id) { | |
| 63 return ui::GetLocalizedContentsHeightForFont(row_resource_id, | |
| 64 ResourceBundle::GetSharedInstance().GetFont(ResourceBundle::BaseFont)); | |
| 65 } | |
| 66 | |
| 67 // static | |
| 68 gfx::Size Window::GetLocalizedContentsSize(int col_resource_id, | |
| 69 int row_resource_id) { | |
| 70 return gfx::Size(GetLocalizedContentsWidth(col_resource_id), | |
| 71 GetLocalizedContentsHeight(row_resource_id)); | |
| 72 } | |
| 73 | |
| 74 void Window::InitWindow(const InitParams& params) { | 51 void Window::InitWindow(const InitParams& params) { |
| 75 native_window_ = | 52 native_window_ = |
| 76 params.native_window ? params.native_window | 53 params.native_window ? params.native_window |
| 77 : NativeWindow::CreateNativeWindow(this); | 54 : NativeWindow::CreateNativeWindow(this); |
| 78 InitParams modified_params = params; | 55 InitParams modified_params = params; |
| 79 modified_params.widget_init_params.delegate = params.window_delegate; | 56 modified_params.widget_init_params.delegate = params.window_delegate; |
| 80 DCHECK(!modified_params.widget_init_params.delegate->window_); | 57 DCHECK(!modified_params.widget_init_params.delegate->window_); |
| 81 modified_params.widget_init_params.delegate->window_ = this; | 58 modified_params.widget_init_params.delegate->window_ = this; |
| 82 modified_params.widget_init_params.native_widget = | 59 modified_params.widget_init_params.native_widget = |
| 83 native_window_->AsNativeWidget(); | 60 native_window_->AsNativeWidget(); |
| 84 Init(modified_params.widget_init_params); | 61 Init(modified_params.widget_init_params); |
| 85 OnNativeWindowCreated(modified_params.widget_init_params.bounds); | |
| 86 } | 62 } |
| 87 | 63 |
| 88 //////////////////////////////////////////////////////////////////////////////// | 64 //////////////////////////////////////////////////////////////////////////////// |
| 89 // Window, Widget overrides: | 65 // Window, Widget overrides: |
| 90 | 66 |
| 91 void Window::Show() { | |
| 92 native_window_->AsNativeWidget()->ShowNativeWidget( | |
| 93 saved_maximized_state_ ? NativeWidget::SHOW_MAXIMIZED | |
| 94 : NativeWidget::SHOW_RESTORED); | |
| 95 // |saved_maximized_state_| only applies the first time the window is shown. | |
| 96 // If we don't reset the value the window will be shown maximized every time | |
| 97 // it is subsequently shown after being hidden. | |
| 98 saved_maximized_state_ = false; | |
| 99 } | |
| 100 | |
| 101 Window* Window::AsWindow() { | 67 Window* Window::AsWindow() { |
| 102 return this; | 68 return this; |
| 103 } | 69 } |
| 104 | 70 |
| 105 const Window* Window::AsWindow() const { | 71 const Window* Window::AsWindow() const { |
| 106 return this; | 72 return this; |
| 107 } | 73 } |
| 108 | 74 |
| 109 //////////////////////////////////////////////////////////////////////////////// | 75 //////////////////////////////////////////////////////////////////////////////// |
| 110 // Window, internal::NativeWindowDelegate implementation: | 76 // Window, internal::NativeWindowDelegate implementation: |
| 111 | 77 |
| 112 bool Window::IsModal() const { | |
| 113 return widget_delegate()->IsModal(); | |
| 114 } | |
| 115 | |
| 116 bool Window::IsDialogBox() const { | |
| 117 return !!widget_delegate()->AsDialogDelegate(); | |
| 118 } | |
| 119 | |
| 120 void Window::OnNativeWindowCreated(const gfx::Rect& bounds) { | |
| 121 if (widget_delegate()->IsModal()) | |
| 122 native_window_->BecomeModal(); | |
| 123 | |
| 124 UpdateWindowTitle(); | |
| 125 SetInitialBounds(bounds); | |
| 126 } | |
| 127 | |
| 128 internal::NativeWidgetDelegate* Window::AsNativeWidgetDelegate() { | 78 internal::NativeWidgetDelegate* Window::AsNativeWidgetDelegate() { |
| 129 return this; | 79 return this; |
| 130 } | 80 } |
| 131 | 81 |
| 132 //////////////////////////////////////////////////////////////////////////////// | |
| 133 // Window, private: | |
| 134 | |
| 135 void Window::SetInitialBounds(const gfx::Rect& bounds) { | |
| 136 // First we obtain the window's saved show-style and store it. We need to do | |
| 137 // this here, rather than in Show() because by the time Show() is called, | |
| 138 // the window's size will have been reset (below) and the saved maximized | |
| 139 // state will have been lost. Sadly there's no way to tell on Windows when | |
| 140 // a window is restored from maximized state, so we can't more accurately | |
| 141 // track maximized state independently of sizing information. | |
| 142 widget_delegate()->GetSavedMaximizedState( | |
| 143 &saved_maximized_state_); | |
| 144 | |
| 145 // Restore the window's placement from the controller. | |
| 146 gfx::Rect saved_bounds = bounds; | |
| 147 if (widget_delegate()->GetSavedWindowBounds(&saved_bounds)) { | |
| 148 if (!widget_delegate()->ShouldRestoreWindowSize()) { | |
| 149 saved_bounds.set_size(non_client_view()->GetPreferredSize()); | |
| 150 } else { | |
| 151 // Make sure the bounds are at least the minimum size. | |
| 152 if (saved_bounds.width() < minimum_size_.width()) { | |
| 153 saved_bounds.SetRect(saved_bounds.x(), saved_bounds.y(), | |
| 154 saved_bounds.right() + minimum_size_.width() - | |
| 155 saved_bounds.width(), | |
| 156 saved_bounds.bottom()); | |
| 157 } | |
| 158 | |
| 159 if (saved_bounds.height() < minimum_size_.height()) { | |
| 160 saved_bounds.SetRect(saved_bounds.x(), saved_bounds.y(), | |
| 161 saved_bounds.right(), | |
| 162 saved_bounds.bottom() + minimum_size_.height() - | |
| 163 saved_bounds.height()); | |
| 164 } | |
| 165 } | |
| 166 | |
| 167 // Widget's SetBounds method does not further modify the bounds that are | |
| 168 // passed to it. | |
| 169 SetBounds(saved_bounds); | |
| 170 } else { | |
| 171 if (bounds.IsEmpty()) { | |
| 172 // No initial bounds supplied, so size the window to its content and | |
| 173 // center over its parent. | |
| 174 native_window_->AsNativeWidget()->CenterWindow( | |
| 175 non_client_view()->GetPreferredSize()); | |
| 176 } else { | |
| 177 // Use the supplied initial bounds. | |
| 178 SetBoundsConstrained(bounds, NULL); | |
| 179 } | |
| 180 } | |
| 181 } | |
| 182 | |
| 183 } // namespace views | 82 } // namespace views |
| OLD | NEW |