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