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 "ash/frame/custom_frame_view_ash.h" | 5 #include "ash/frame/custom_frame_view_ash.h" |
6 | 6 |
7 #include "ash/ash_switches.h" | 7 #include "ash/ash_switches.h" |
8 #include "ash/frame/caption_buttons/frame_caption_button_container_view.h" | 8 #include "ash/frame/caption_buttons/frame_caption_button_container_view.h" |
9 #include "ash/frame/caption_buttons/frame_maximize_button.h" | 9 #include "ash/frame/caption_buttons/frame_maximize_button.h" |
10 #include "ash/frame/caption_buttons/frame_maximize_button_observer.h" | 10 #include "ash/frame/caption_buttons/frame_maximize_button_observer.h" |
11 #include "ash/frame/default_header_painter.h" | 11 #include "ash/frame/default_header_painter.h" |
12 #include "ash/frame/frame_border_hit_test_controller.h" | 12 #include "ash/frame/frame_border_hit_test_controller.h" |
| 13 #include "ash/frame/frame_util.h" |
13 #include "ash/frame/header_painter.h" | 14 #include "ash/frame/header_painter.h" |
| 15 #include "ash/session_state_delegate.h" |
| 16 #include "ash/shell.h" |
14 #include "ash/wm/immersive_fullscreen_controller.h" | 17 #include "ash/wm/immersive_fullscreen_controller.h" |
15 #include "ash/wm/window_state.h" | 18 #include "ash/wm/window_state.h" |
16 #include "ash/wm/window_state_delegate.h" | 19 #include "ash/wm/window_state_delegate.h" |
17 #include "ash/wm/window_state_observer.h" | 20 #include "ash/wm/window_state_observer.h" |
18 #include "base/command_line.h" | 21 #include "base/command_line.h" |
19 #include "ui/aura/client/aura_constants.h" | 22 #include "ui/aura/client/aura_constants.h" |
20 #include "ui/aura/window.h" | 23 #include "ui/aura/window.h" |
21 #include "ui/aura/window_observer.h" | 24 #include "ui/aura/window_observer.h" |
22 #include "ui/gfx/canvas.h" | 25 #include "ui/gfx/canvas.h" |
| 26 #include "ui/gfx/image/image.h" |
23 #include "ui/gfx/rect.h" | 27 #include "ui/gfx/rect.h" |
24 #include "ui/gfx/rect_conversions.h" | 28 #include "ui/gfx/rect_conversions.h" |
25 #include "ui/gfx/size.h" | 29 #include "ui/gfx/size.h" |
| 30 #include "ui/views/controls/image_view.h" |
26 #include "ui/views/view.h" | 31 #include "ui/views/view.h" |
27 #include "ui/views/widget/widget.h" | 32 #include "ui/views/widget/widget.h" |
28 #include "ui/views/widget/widget_delegate.h" | 33 #include "ui/views/widget/widget_delegate.h" |
29 #include "ui/views/widget/widget_deletion_observer.h" | 34 #include "ui/views/widget/widget_deletion_observer.h" |
30 | 35 |
31 namespace { | 36 namespace { |
32 | 37 |
33 /////////////////////////////////////////////////////////////////////////////// | 38 /////////////////////////////////////////////////////////////////////////////// |
34 // CustomFrameViewAshWindowStateDelegate | 39 // CustomFrameViewAshWindowStateDelegate |
35 | 40 |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
139 | 144 |
140 // Returns the amount of the view's pixels which should be on screen. | 145 // Returns the amount of the view's pixels which should be on screen. |
141 int GetPreferredOnScreenHeight() const; | 146 int GetPreferredOnScreenHeight() const; |
142 | 147 |
143 // Returns the view's preferred height. | 148 // Returns the view's preferred height. |
144 int GetPreferredHeight() const; | 149 int GetPreferredHeight() const; |
145 | 150 |
146 // Returns the view's minimum width. | 151 // Returns the view's minimum width. |
147 int GetMinimumWidth() const; | 152 int GetMinimumWidth() const; |
148 | 153 |
| 154 void UpdateAvatarIcon(); |
| 155 |
149 // views::View overrides: | 156 // views::View overrides: |
150 virtual void Layout() OVERRIDE; | 157 virtual void Layout() OVERRIDE; |
151 virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE; | 158 virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE; |
152 | 159 |
153 FrameCaptionButtonContainerView* caption_button_container() { | 160 FrameCaptionButtonContainerView* caption_button_container() { |
154 return caption_button_container_; | 161 return caption_button_container_; |
155 } | 162 } |
156 | 163 |
| 164 views::View* avatar_icon() const { |
| 165 return avatar_icon_; |
| 166 } |
| 167 |
157 private: | 168 private: |
158 // ImmersiveFullscreenController::Delegate overrides: | 169 // ImmersiveFullscreenController::Delegate overrides: |
159 virtual void OnImmersiveRevealStarted() OVERRIDE; | 170 virtual void OnImmersiveRevealStarted() OVERRIDE; |
160 virtual void OnImmersiveRevealEnded() OVERRIDE; | 171 virtual void OnImmersiveRevealEnded() OVERRIDE; |
161 virtual void OnImmersiveFullscreenExited() OVERRIDE; | 172 virtual void OnImmersiveFullscreenExited() OVERRIDE; |
162 virtual void SetVisibleFraction(double visible_fraction) OVERRIDE; | 173 virtual void SetVisibleFraction(double visible_fraction) OVERRIDE; |
163 virtual std::vector<gfx::Rect> GetVisibleBoundsInScreen() const OVERRIDE; | 174 virtual std::vector<gfx::Rect> GetVisibleBoundsInScreen() const OVERRIDE; |
164 | 175 |
165 // FrameMaximizeButtonObserver overrides: | 176 // FrameMaximizeButtonObserver overrides: |
166 virtual void OnMaximizeBubbleShown(views::Widget* bubble) OVERRIDE; | 177 virtual void OnMaximizeBubbleShown(views::Widget* bubble) OVERRIDE; |
167 | 178 |
168 // The widget that the caption buttons act on. | 179 // The widget that the caption buttons act on. |
169 views::Widget* frame_; | 180 views::Widget* frame_; |
170 | 181 |
171 // Helper for painting the header. | 182 // Helper for painting the header. |
172 scoped_ptr<DefaultHeaderPainter> header_painter_; | 183 scoped_ptr<DefaultHeaderPainter> header_painter_; |
173 | 184 |
| 185 views::ImageView* avatar_icon_; |
| 186 |
174 // View which contains the window caption buttons. | 187 // View which contains the window caption buttons. |
175 FrameCaptionButtonContainerView* caption_button_container_; | 188 FrameCaptionButtonContainerView* caption_button_container_; |
176 | 189 |
177 // The maximize bubble widget. |maximize_bubble_| may be non-NULL but have | 190 // The maximize bubble widget. |maximize_bubble_| may be non-NULL but have |
178 // been already destroyed. | 191 // been already destroyed. |
179 views::Widget* maximize_bubble_; | 192 views::Widget* maximize_bubble_; |
180 | 193 |
181 // Keeps track of whether |maximize_bubble_| is still alive. | 194 // Keeps track of whether |maximize_bubble_| is still alive. |
182 scoped_ptr<views::WidgetDeletionObserver> maximize_bubble_lifetime_observer_; | 195 scoped_ptr<views::WidgetDeletionObserver> maximize_bubble_lifetime_observer_; |
183 | 196 |
184 // The fraction of the header's height which is visible while in fullscreen. | 197 // The fraction of the header's height which is visible while in fullscreen. |
185 // This value is meaningless when not in fullscreen. | 198 // This value is meaningless when not in fullscreen. |
186 double fullscreen_visible_fraction_; | 199 double fullscreen_visible_fraction_; |
187 | 200 |
188 DISALLOW_COPY_AND_ASSIGN(HeaderView); | 201 DISALLOW_COPY_AND_ASSIGN(HeaderView); |
189 }; | 202 }; |
190 | 203 |
191 CustomFrameViewAsh::HeaderView::HeaderView(views::Widget* frame) | 204 CustomFrameViewAsh::HeaderView::HeaderView(views::Widget* frame) |
192 : frame_(frame), | 205 : frame_(frame), |
193 header_painter_(new ash::DefaultHeaderPainter), | 206 header_painter_(new ash::DefaultHeaderPainter), |
| 207 avatar_icon_(NULL), |
194 caption_button_container_(NULL), | 208 caption_button_container_(NULL), |
195 maximize_bubble_(NULL), | 209 maximize_bubble_(NULL), |
196 fullscreen_visible_fraction_(0) { | 210 fullscreen_visible_fraction_(0) { |
197 // Unfortunately, there is no views::WidgetDelegate::CanMinimize(). Assume | 211 // Unfortunately, there is no views::WidgetDelegate::CanMinimize(). Assume |
198 // that the window frame can be minimized if it can be maximized. | 212 // that the window frame can be minimized if it can be maximized. |
199 FrameCaptionButtonContainerView::MinimizeAllowed minimize_allowed = | 213 FrameCaptionButtonContainerView::MinimizeAllowed minimize_allowed = |
200 frame_->widget_delegate()->CanMaximize() ? | 214 frame_->widget_delegate()->CanMaximize() ? |
201 FrameCaptionButtonContainerView::MINIMIZE_ALLOWED : | 215 FrameCaptionButtonContainerView::MINIMIZE_ALLOWED : |
202 FrameCaptionButtonContainerView::MINIMIZE_DISALLOWED; | 216 FrameCaptionButtonContainerView::MINIMIZE_DISALLOWED; |
203 caption_button_container_ = new FrameCaptionButtonContainerView(frame_, | 217 caption_button_container_ = new FrameCaptionButtonContainerView(frame_, |
204 minimize_allowed); | 218 minimize_allowed); |
205 AddChildView(caption_button_container_); | 219 AddChildView(caption_button_container_); |
206 FrameMaximizeButton* frame_maximize_button = | 220 FrameMaximizeButton* frame_maximize_button = |
207 caption_button_container_->GetOldStyleSizeButton(); | 221 caption_button_container_->GetOldStyleSizeButton(); |
208 if (frame_maximize_button) | 222 if (frame_maximize_button) |
209 frame_maximize_button->AddObserver(this); | 223 frame_maximize_button->AddObserver(this); |
210 | 224 |
211 header_painter_->Init(frame_, this, NULL, caption_button_container_); | 225 header_painter_->Init(frame_, this, NULL, caption_button_container_); |
| 226 UpdateAvatarIcon(); |
212 } | 227 } |
213 | 228 |
214 CustomFrameViewAsh::HeaderView::~HeaderView() { | 229 CustomFrameViewAsh::HeaderView::~HeaderView() { |
215 FrameMaximizeButton* frame_maximize_button = | 230 FrameMaximizeButton* frame_maximize_button = |
216 caption_button_container_->GetOldStyleSizeButton(); | 231 caption_button_container_->GetOldStyleSizeButton(); |
217 if (frame_maximize_button) | 232 if (frame_maximize_button) |
218 frame_maximize_button->RemoveObserver(this); | 233 frame_maximize_button->RemoveObserver(this); |
219 } | 234 } |
220 | 235 |
221 void CustomFrameViewAsh::HeaderView::SchedulePaintForTitle() { | 236 void CustomFrameViewAsh::HeaderView::SchedulePaintForTitle() { |
(...skipping 13 matching lines...) Expand all Loading... |
235 } | 250 } |
236 | 251 |
237 int CustomFrameViewAsh::HeaderView::GetPreferredHeight() const { | 252 int CustomFrameViewAsh::HeaderView::GetPreferredHeight() const { |
238 return header_painter_->GetHeaderHeightForPainting(); | 253 return header_painter_->GetHeaderHeightForPainting(); |
239 } | 254 } |
240 | 255 |
241 int CustomFrameViewAsh::HeaderView::GetMinimumWidth() const { | 256 int CustomFrameViewAsh::HeaderView::GetMinimumWidth() const { |
242 return header_painter_->GetMinimumHeaderWidth(); | 257 return header_painter_->GetMinimumHeaderWidth(); |
243 } | 258 } |
244 | 259 |
| 260 void CustomFrameViewAsh::HeaderView::UpdateAvatarIcon() { |
| 261 SessionStateDelegate* delegate = |
| 262 Shell::GetInstance()->session_state_delegate(); |
| 263 aura::Window* window = frame_->GetNativeView(); |
| 264 bool show = delegate->ShouldShowAvatar(window); |
| 265 int icon_size = 0; |
| 266 if (!show) { |
| 267 if (!avatar_icon_) |
| 268 return; |
| 269 delete avatar_icon_; |
| 270 avatar_icon_ = NULL; |
| 271 } else { |
| 272 gfx::ImageSkia image = GetAvatarImageForContext( |
| 273 delegate->GetBrowserContextForWindow(window)).AsImageSkia(); |
| 274 DCHECK(!image.isNull()); |
| 275 DCHECK_EQ(image.width(), image.height()); |
| 276 if (!avatar_icon_) { |
| 277 avatar_icon_ = new views::ImageView(); |
| 278 AddChildView(avatar_icon_); |
| 279 } |
| 280 avatar_icon_->SetImage(image); |
| 281 icon_size = image.width(); |
| 282 } |
| 283 header_painter_->UpdateWindowIcon(avatar_icon_, icon_size); |
| 284 Layout(); |
| 285 } |
| 286 |
245 void CustomFrameViewAsh::HeaderView::Layout() { | 287 void CustomFrameViewAsh::HeaderView::Layout() { |
246 header_painter_->LayoutHeader(); | 288 header_painter_->LayoutHeader(); |
247 } | 289 } |
248 | 290 |
249 void CustomFrameViewAsh::HeaderView::OnPaint(gfx::Canvas* canvas) { | 291 void CustomFrameViewAsh::HeaderView::OnPaint(gfx::Canvas* canvas) { |
250 bool paint_as_active = | 292 bool paint_as_active = |
251 frame_->non_client_view()->frame_view()->ShouldPaintAsActive(); | 293 frame_->non_client_view()->frame_view()->ShouldPaintAsActive(); |
252 caption_button_container_->SetPaintAsActive(paint_as_active); | 294 caption_button_container_->SetPaintAsActive(paint_as_active); |
253 | 295 |
254 HeaderPainter::Mode header_mode = paint_as_active ? | 296 HeaderPainter::Mode header_mode = paint_as_active ? |
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
472 views::NonClientFrameView::SchedulePaintInRect(r); | 514 views::NonClientFrameView::SchedulePaintInRect(r); |
473 } | 515 } |
474 } | 516 } |
475 | 517 |
476 bool CustomFrameViewAsh::HitTestRect(const gfx::Rect& rect) const { | 518 bool CustomFrameViewAsh::HitTestRect(const gfx::Rect& rect) const { |
477 // NonClientView hit tests the NonClientFrameView first instead of going in | 519 // NonClientView hit tests the NonClientFrameView first instead of going in |
478 // z-order. Return false so that events get to the OverlayView. | 520 // z-order. Return false so that events get to the OverlayView. |
479 return false; | 521 return false; |
480 } | 522 } |
481 | 523 |
| 524 void CustomFrameViewAsh::VisibilityChanged(views::View* starting_from, |
| 525 bool is_visible) { |
| 526 if (is_visible) |
| 527 header_view_->UpdateAvatarIcon(); |
| 528 } |
| 529 |
482 views::View* CustomFrameViewAsh::GetHeaderView() { | 530 views::View* CustomFrameViewAsh::GetHeaderView() { |
483 return header_view_; | 531 return header_view_; |
484 } | 532 } |
485 | 533 |
| 534 const views::View* CustomFrameViewAsh::GetAvatarIconViewForTest() const { |
| 535 return header_view_->avatar_icon(); |
| 536 } |
| 537 |
486 //////////////////////////////////////////////////////////////////////////////// | 538 //////////////////////////////////////////////////////////////////////////////// |
487 // CustomFrameViewAsh, private: | 539 // CustomFrameViewAsh, private: |
488 | 540 |
489 int CustomFrameViewAsh::NonClientTopBorderHeight() const { | 541 int CustomFrameViewAsh::NonClientTopBorderHeight() const { |
490 return frame_->IsFullscreen() ? 0 : header_view_->GetPreferredHeight(); | 542 return frame_->IsFullscreen() ? 0 : header_view_->GetPreferredHeight(); |
491 } | 543 } |
492 | 544 |
493 } // namespace ash | 545 } // namespace ash |
OLD | NEW |