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 "chrome/browser/ui/views/frame/app_non_client_frame_view_aura.h" | 5 #include "chrome/browser/ui/views/frame/app_non_client_frame_view_ash.h" |
6 | 6 |
| 7 #include "ash/wm/workspace/frame_maximize_button.h" |
7 #include "base/debug/stack_trace.h" | 8 #include "base/debug/stack_trace.h" |
8 #include "chrome/browser/ui/views/frame/browser_frame.h" | 9 #include "chrome/browser/ui/views/frame/browser_frame.h" |
9 #include "chrome/browser/ui/views/frame/browser_view.h" | 10 #include "chrome/browser/ui/views/frame/browser_view.h" |
10 #include "grit/ash_resources.h" | 11 #include "grit/ash_resources.h" |
11 #include "grit/generated_resources.h" // Accessibility names | 12 #include "grit/generated_resources.h" // Accessibility names |
12 #include "grit/theme_resources.h" | 13 #include "grit/theme_resources.h" |
13 #include "ui/aura/window.h" | 14 #include "ui/aura/window.h" |
14 #include "ui/base/hit_test.h" | 15 #include "ui/base/hit_test.h" |
15 #include "ui/base/l10n/l10n_util.h" | 16 #include "ui/base/l10n/l10n_util.h" |
16 #include "ui/base/resource/resource_bundle.h" | 17 #include "ui/base/resource/resource_bundle.h" |
17 #include "ui/base/theme_provider.h" | 18 #include "ui/base/theme_provider.h" |
18 #include "ui/gfx/canvas.h" | 19 #include "ui/gfx/canvas.h" |
19 #include "ui/gfx/image/image.h" | 20 #include "ui/gfx/image/image.h" |
20 #include "ui/gfx/point.h" | 21 #include "ui/gfx/point.h" |
21 #include "ui/gfx/rect.h" | 22 #include "ui/gfx/rect.h" |
22 #include "ui/gfx/size.h" | 23 #include "ui/gfx/size.h" |
23 #include "ui/views/controls/button/image_button.h" | 24 #include "ui/views/controls/button/image_button.h" |
24 #include "ui/views/widget/widget.h" | 25 #include "ui/views/widget/widget.h" |
25 #include "ui/views/window/non_client_view.h" | 26 #include "ui/views/window/non_client_view.h" |
26 | 27 |
27 #if defined(USE_ASH) | |
28 #include "ash/wm/workspace/frame_maximize_button.h" | |
29 #endif | |
30 | |
31 namespace { | 28 namespace { |
32 // The number of pixels within the shadow to draw the buttons. | 29 // The number of pixels within the shadow to draw the buttons. |
33 const int kShadowStart = 16; | 30 const int kShadowStart = 16; |
34 // The size and close buttons are designed to overlap. | 31 // The size and close buttons are designed to overlap. |
35 const int kButtonOverlap = 1; | 32 const int kButtonOverlap = 1; |
36 | 33 |
37 // TODO(pkotwicz): Remove these constants once the IDR_AURA_FULLSCREEN_SHADOW | 34 // TODO(pkotwicz): Remove these constants once the IDR_AURA_FULLSCREEN_SHADOW |
38 // resource is updated. | 35 // resource is updated. |
39 const int kShadowHeightStretch = -1; | 36 const int kShadowHeightStretch = -1; |
40 } | 37 } |
41 | 38 |
42 class AppNonClientFrameViewAura::ControlView | 39 class AppNonClientFrameViewAsh::ControlView |
43 : public views::View, public views::ButtonListener { | 40 : public views::View, public views::ButtonListener { |
44 public: | 41 public: |
45 explicit ControlView(AppNonClientFrameViewAura* owner) : | 42 explicit ControlView(AppNonClientFrameViewAsh* owner) : |
46 owner_(owner), | 43 owner_(owner), |
47 close_button_(new views::ImageButton(this)), | 44 close_button_(new views::ImageButton(this)), |
48 #if defined(USE_ASH) | |
49 restore_button_(new ash::FrameMaximizeButton(this, owner_)) | 45 restore_button_(new ash::FrameMaximizeButton(this, owner_)) |
50 #else | |
51 restore_button_(new views::ImageButton(this)) | |
52 #endif | |
53 { | 46 { |
54 close_button_->SetAccessibleName( | 47 close_button_->SetAccessibleName( |
55 l10n_util::GetStringUTF16(IDS_ACCNAME_CLOSE)); | 48 l10n_util::GetStringUTF16(IDS_ACCNAME_CLOSE)); |
56 restore_button_->SetAccessibleName( | 49 restore_button_->SetAccessibleName( |
57 l10n_util::GetStringUTF16(IDS_ACCNAME_MAXIMIZE)); | 50 l10n_util::GetStringUTF16(IDS_ACCNAME_MAXIMIZE)); |
58 | 51 |
59 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); | 52 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); |
60 | 53 |
61 int control_base_resource_id = owner->browser_view()->IsOffTheRecord() ? | 54 int control_base_resource_id = owner->browser_view()->IsOffTheRecord() ? |
62 IDR_AURA_WINDOW_HEADER_BASE_INCOGNITO_ACTIVE : | 55 IDR_AURA_WINDOW_HEADER_BASE_INCOGNITO_ACTIVE : |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
127 int hot_image_id, int pushed_image_id) { | 120 int hot_image_id, int pushed_image_id) { |
128 ui::ThemeProvider* theme_provider = GetThemeProvider(); | 121 ui::ThemeProvider* theme_provider = GetThemeProvider(); |
129 button->SetImage(views::CustomButton::BS_NORMAL, | 122 button->SetImage(views::CustomButton::BS_NORMAL, |
130 theme_provider->GetImageSkiaNamed(normal_image_id)); | 123 theme_provider->GetImageSkiaNamed(normal_image_id)); |
131 button->SetImage(views::CustomButton::BS_HOT, | 124 button->SetImage(views::CustomButton::BS_HOT, |
132 theme_provider->GetImageSkiaNamed(hot_image_id)); | 125 theme_provider->GetImageSkiaNamed(hot_image_id)); |
133 button->SetImage(views::CustomButton::BS_PUSHED, | 126 button->SetImage(views::CustomButton::BS_PUSHED, |
134 theme_provider->GetImageSkiaNamed(pushed_image_id)); | 127 theme_provider->GetImageSkiaNamed(pushed_image_id)); |
135 } | 128 } |
136 | 129 |
137 AppNonClientFrameViewAura* owner_; | 130 AppNonClientFrameViewAsh* owner_; |
138 views::ImageButton* close_button_; | 131 views::ImageButton* close_button_; |
139 views::ImageButton* restore_button_; | 132 views::ImageButton* restore_button_; |
140 const gfx::ImageSkia* control_base_; | 133 const gfx::ImageSkia* control_base_; |
141 const gfx::ImageSkia* shadow_; | 134 const gfx::ImageSkia* shadow_; |
142 | 135 |
143 DISALLOW_COPY_AND_ASSIGN(ControlView); | 136 DISALLOW_COPY_AND_ASSIGN(ControlView); |
144 }; | 137 }; |
145 | 138 |
146 // Observer to detect when the browser frame widget closes so we can clean | 139 // Observer to detect when the browser frame widget closes so we can clean |
147 // up our ControlView. Because we can be closed via a keyboard shortcut we | 140 // up our ControlView. Because we can be closed via a keyboard shortcut we |
148 // are not guaranteed to run AppNonClientFrameView's Close() or Restore(). | 141 // are not guaranteed to run AppNonClientFrameView's Close() or Restore(). |
149 class AppNonClientFrameViewAura::FrameObserver : public views::WidgetObserver { | 142 class AppNonClientFrameViewAsh::FrameObserver : public views::WidgetObserver { |
150 public: | 143 public: |
151 explicit FrameObserver(AppNonClientFrameViewAura* owner) : owner_(owner) {} | 144 explicit FrameObserver(AppNonClientFrameViewAsh* owner) : owner_(owner) {} |
152 virtual ~FrameObserver() {} | 145 virtual ~FrameObserver() {} |
153 | 146 |
154 // views::WidgetObserver: | 147 // views::WidgetObserver: |
155 virtual void OnWidgetClosing(views::Widget* widget) OVERRIDE { | 148 virtual void OnWidgetClosing(views::Widget* widget) OVERRIDE { |
156 owner_->CloseControlWidget(); | 149 owner_->CloseControlWidget(); |
157 } | 150 } |
158 | 151 |
159 private: | 152 private: |
160 AppNonClientFrameViewAura* owner_; | 153 AppNonClientFrameViewAsh* owner_; |
161 | 154 |
162 DISALLOW_COPY_AND_ASSIGN(FrameObserver); | 155 DISALLOW_COPY_AND_ASSIGN(FrameObserver); |
163 }; | 156 }; |
164 | 157 |
165 // static | 158 // static |
166 const char AppNonClientFrameViewAura::kViewClassName[] = | 159 const char AppNonClientFrameViewAsh::kViewClassName[] = |
167 "AppNonClientFrameViewAura"; | 160 "AppNonClientFrameViewAsh"; |
168 // static | 161 // static |
169 const char AppNonClientFrameViewAura::kControlWindowName[] = | 162 const char AppNonClientFrameViewAsh::kControlWindowName[] = |
170 "AppNonClientFrameViewAuraControls"; | 163 "AppNonClientFrameViewAshControls"; |
171 | 164 |
172 AppNonClientFrameViewAura::AppNonClientFrameViewAura( | 165 AppNonClientFrameViewAsh::AppNonClientFrameViewAsh( |
173 BrowserFrame* frame, BrowserView* browser_view) | 166 BrowserFrame* frame, BrowserView* browser_view) |
174 : BrowserNonClientFrameView(frame, browser_view), | 167 : BrowserNonClientFrameView(frame, browser_view), |
175 control_view_(new ControlView(this)), | 168 control_view_(new ControlView(this)), |
176 control_widget_(NULL), | 169 control_widget_(NULL), |
177 frame_observer_(new FrameObserver(this)) { | 170 frame_observer_(new FrameObserver(this)) { |
178 // This FrameView is always maximized so we don't want the window to have | 171 // This FrameView is always maximized so we don't want the window to have |
179 // resize borders. | 172 // resize borders. |
180 frame->GetNativeView()->set_hit_test_bounds_override_inner(gfx::Insets()); | 173 frame->GetNativeView()->set_hit_test_bounds_override_inner(gfx::Insets()); |
181 // Watch for frame close so we can clean up the control widget. | 174 // Watch for frame close so we can clean up the control widget. |
182 frame->AddObserver(frame_observer_.get()); | 175 frame->AddObserver(frame_observer_.get()); |
183 set_background(views::Background::CreateSolidBackground(SK_ColorBLACK)); | 176 set_background(views::Background::CreateSolidBackground(SK_ColorBLACK)); |
184 // Create the controls. | 177 // Create the controls. |
185 control_widget_ = new views::Widget; | 178 control_widget_ = new views::Widget; |
186 views::Widget::InitParams params(views::Widget::InitParams::TYPE_CONTROL); | 179 views::Widget::InitParams params(views::Widget::InitParams::TYPE_CONTROL); |
187 params.parent = browser_view->GetNativeWindow(); | 180 params.parent = browser_view->GetNativeWindow(); |
188 params.transparent = true; | 181 params.transparent = true; |
189 control_widget_->Init(params); | 182 control_widget_->Init(params); |
190 control_widget_->SetContentsView(control_view_); | 183 control_widget_->SetContentsView(control_view_); |
191 aura::Window* window = control_widget_->GetNativeView(); | 184 aura::Window* window = control_widget_->GetNativeView(); |
192 window->SetName(kControlWindowName); | 185 window->SetName(kControlWindowName); |
193 gfx::Rect control_bounds = GetControlBounds(); | 186 gfx::Rect control_bounds = GetControlBounds(); |
194 window->SetBounds(control_bounds); | 187 window->SetBounds(control_bounds); |
195 control_widget_->Show(); | 188 control_widget_->Show(); |
196 } | 189 } |
197 | 190 |
198 AppNonClientFrameViewAura::~AppNonClientFrameViewAura() { | 191 AppNonClientFrameViewAsh::~AppNonClientFrameViewAsh() { |
199 frame()->RemoveObserver(frame_observer_.get()); | 192 frame()->RemoveObserver(frame_observer_.get()); |
200 // This frame view can be replaced (and deleted) if the window is restored | 193 // This frame view can be replaced (and deleted) if the window is restored |
201 // via a keyboard shortcut like Alt-[. Ensure we close the control widget. | 194 // via a keyboard shortcut like Alt-[. Ensure we close the control widget. |
202 CloseControlWidget(); | 195 CloseControlWidget(); |
203 } | 196 } |
204 | 197 |
205 gfx::Rect AppNonClientFrameViewAura::GetBoundsForClientView() const { | 198 gfx::Rect AppNonClientFrameViewAsh::GetBoundsForClientView() const { |
206 return GetLocalBounds(); | 199 return GetLocalBounds(); |
207 } | 200 } |
208 | 201 |
209 gfx::Rect AppNonClientFrameViewAura::GetWindowBoundsForClientBounds( | 202 gfx::Rect AppNonClientFrameViewAsh::GetWindowBoundsForClientBounds( |
210 const gfx::Rect& client_bounds) const { | 203 const gfx::Rect& client_bounds) const { |
211 return client_bounds; | 204 return client_bounds; |
212 } | 205 } |
213 | 206 |
214 int AppNonClientFrameViewAura::NonClientHitTest( | 207 int AppNonClientFrameViewAsh::NonClientHitTest( |
215 const gfx::Point& point) { | 208 const gfx::Point& point) { |
216 return HTNOWHERE; | 209 return HTNOWHERE; |
217 } | 210 } |
218 | 211 |
219 void AppNonClientFrameViewAura::GetWindowMask(const gfx::Size& size, | 212 void AppNonClientFrameViewAsh::GetWindowMask(const gfx::Size& size, |
220 gfx::Path* window_mask) { | 213 gfx::Path* window_mask) { |
221 } | 214 } |
222 | 215 |
223 void AppNonClientFrameViewAura::ResetWindowControls() { | 216 void AppNonClientFrameViewAsh::ResetWindowControls() { |
224 } | 217 } |
225 | 218 |
226 void AppNonClientFrameViewAura::UpdateWindowIcon() { | 219 void AppNonClientFrameViewAsh::UpdateWindowIcon() { |
227 } | 220 } |
228 | 221 |
229 void AppNonClientFrameViewAura::UpdateWindowTitle() { | 222 void AppNonClientFrameViewAsh::UpdateWindowTitle() { |
230 } | 223 } |
231 | 224 |
232 gfx::Rect AppNonClientFrameViewAura::GetBoundsForTabStrip( | 225 gfx::Rect AppNonClientFrameViewAsh::GetBoundsForTabStrip( |
233 views::View* tabstrip) const { | 226 views::View* tabstrip) const { |
234 return gfx::Rect(); | 227 return gfx::Rect(); |
235 } | 228 } |
236 | 229 |
237 BrowserNonClientFrameView::TabStripInsets | 230 BrowserNonClientFrameView::TabStripInsets |
238 AppNonClientFrameViewAura::GetTabStripInsets(bool restored) const { | 231 AppNonClientFrameViewAsh::GetTabStripInsets(bool restored) const { |
239 return TabStripInsets(); | 232 return TabStripInsets(); |
240 } | 233 } |
241 | 234 |
242 int AppNonClientFrameViewAura::GetThemeBackgroundXInset() const { | 235 int AppNonClientFrameViewAsh::GetThemeBackgroundXInset() const { |
243 return 0; | 236 return 0; |
244 } | 237 } |
245 | 238 |
246 void AppNonClientFrameViewAura::UpdateThrobber(bool running) { | 239 void AppNonClientFrameViewAsh::UpdateThrobber(bool running) { |
247 } | 240 } |
248 | 241 |
249 std::string AppNonClientFrameViewAura::GetClassName() const { | 242 std::string AppNonClientFrameViewAsh::GetClassName() const { |
250 return kViewClassName; | 243 return kViewClassName; |
251 } | 244 } |
252 | 245 |
253 void AppNonClientFrameViewAura::OnBoundsChanged( | 246 void AppNonClientFrameViewAsh::OnBoundsChanged( |
254 const gfx::Rect& previous_bounds) { | 247 const gfx::Rect& previous_bounds) { |
255 if (control_widget_) | 248 if (control_widget_) |
256 control_widget_->GetNativeView()->SetBounds(GetControlBounds()); | 249 control_widget_->GetNativeView()->SetBounds(GetControlBounds()); |
257 } | 250 } |
258 | 251 |
259 gfx::Rect AppNonClientFrameViewAura::GetControlBounds() const { | 252 gfx::Rect AppNonClientFrameViewAsh::GetControlBounds() const { |
260 if (!control_view_) | 253 if (!control_view_) |
261 return gfx::Rect(); | 254 return gfx::Rect(); |
262 gfx::Size preferred = control_view_->GetPreferredSize(); | 255 gfx::Size preferred = control_view_->GetPreferredSize(); |
263 return gfx::Rect( | 256 return gfx::Rect( |
264 width() - preferred.width(), 0, | 257 width() - preferred.width(), 0, |
265 preferred.width(), preferred.height()); | 258 preferred.width(), preferred.height()); |
266 } | 259 } |
267 | 260 |
268 void AppNonClientFrameViewAura::CloseControlWidget() { | 261 void AppNonClientFrameViewAsh::CloseControlWidget() { |
269 if (control_widget_) { | 262 if (control_widget_) { |
270 control_widget_->Close(); | 263 control_widget_->Close(); |
271 control_widget_ = NULL; | 264 control_widget_ = NULL; |
272 } | 265 } |
273 } | 266 } |
OLD | NEW |