default_header_painter.cc revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// found in the LICENSE file. 4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ash/frame/default_header_painter.h" 6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ash/frame/caption_buttons/frame_caption_button_container_view.h" 8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ash/frame/header_painter_util.h" 9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/debug/leak_annotations.h" 10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/logging.h" // DCHECK 11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "grit/ash_resources.h" 12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "third_party/skia/include/core/SkColor.h" 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "third_party/skia/include/core/SkPaint.h" 14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "third_party/skia/include/core/SkPath.h" 15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/gfx/animation/slide_animation.h" 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/gfx/canvas.h" 18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/gfx/font_list.h" 19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/gfx/image/image.h" 20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/gfx/rect.h" 21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/gfx/skia_util.h" 22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/views/view.h" 23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/views/widget/native_widget_aura.h" 24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/views/widget/widget.h" 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/views/widget/widget_delegate.h" 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)using views::Widget; 28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace { 30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Color for the window title text. 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const SkColor kTitleTextColor = SkColorSetRGB(40, 40, 40); 33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Size of header/content separator line. 34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const int kHeaderContentSeparatorSize = 1; 35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Color of the active window header/content separator line. 36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const SkColor kHeaderContentSeparatorColor = SkColorSetRGB(180, 180, 182); 37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Color of the inactive window header/content separator line. 38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const SkColor kHeaderContentSeparatorInactiveColor = 39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SkColorSetRGB(150, 150, 152); 40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Duration of crossfade animation for activating and deactivating frame. 41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const int kActivationCrossfadeDurationMs = 200; 42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Tiles an image into an area, rounding the top corners. 44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void TileRoundRect(gfx::Canvas* canvas, 45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const gfx::ImageSkia& image, 46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const SkPaint& paint, 47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const gfx::Rect& bounds, 48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int corner_radius) { 49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SkRect rect = gfx::RectToSkRect(bounds); 50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const SkScalar corner_radius_scalar = SkIntToScalar(corner_radius); 51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SkScalar radii[8] = { 52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) corner_radius_scalar, corner_radius_scalar, // top-left 53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) corner_radius_scalar, corner_radius_scalar, // top-right 54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 0, 0, // bottom-right 55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 0, 0}; // bottom-left 56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SkPath path; 57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) path.addRoundRect(rect, radii, SkPath::kCW_Direction); 58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) canvas->DrawImageInPath(image, 0, 0, path, paint); 59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Returns the FontList to use for the title. 62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const gfx::FontList& GetTitleFontList() { 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static const gfx::FontList* title_font_list = 64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new gfx::FontList(views::NativeWidgetAura::GetWindowTitleFontList()); 65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ANNOTATE_LEAKING_OBJECT_PTR(title_font_list); 66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return *title_font_list; 67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace 70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace ash { 72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// DefaultHeaderPainter, public: 75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)DefaultHeaderPainter::DefaultHeaderPainter() 77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) : frame_(NULL), 78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) view_(NULL), 79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) window_icon_(NULL), 80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) caption_button_container_(NULL), 81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) height_(0), 82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) mode_(MODE_INACTIVE), 83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) initial_paint_(true), 84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) activation_animation_(new gfx::SlideAnimation(this)) { 85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)DefaultHeaderPainter::~DefaultHeaderPainter() { 88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void DefaultHeaderPainter::Init( 91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) views::Widget* frame, 92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) views::View* header_view, 93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) views::View* window_icon, 94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FrameCaptionButtonContainerView* caption_button_container) { 95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(frame); 96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(header_view); 97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // window_icon may be NULL. 98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(caption_button_container); 99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) frame_ = frame; 100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) view_ = header_view; 101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) window_icon_ = window_icon; 102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) caption_button_container_ = caption_button_container; 103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) caption_button_container_->SetButtonImages( 105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CAPTION_BUTTON_ICON_MINIMIZE, 106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_ICON_MINIMIZE, 107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_ICON_MINIMIZE_I, 108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_BACKGROUND_H, 109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_BACKGROUND_P); 110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) caption_button_container_->SetButtonImages( 111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CAPTION_BUTTON_ICON_MAXIMIZE_RESTORE, 112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_ICON_SIZE, 113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_ICON_SIZE_I, 114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_BACKGROUND_H, 115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_BACKGROUND_P); 116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) caption_button_container_->SetButtonImages( 117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CAPTION_BUTTON_ICON_CLOSE, 118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_ICON_CLOSE, 119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_ICON_CLOSE_I, 120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_BACKGROUND_H, 121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_BACKGROUND_P); 122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // There is no dedicated icon for the snap-left and snap-right buttons 124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // when |frame_| is inactive because they should never be visible while 125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // |frame_| is inactive. 126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) caption_button_container_->SetButtonImages( 127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CAPTION_BUTTON_ICON_LEFT_SNAPPED, 128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_ICON_LEFT_SNAPPED, 129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_ICON_LEFT_SNAPPED, 130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_BACKGROUND_H, 131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_BACKGROUND_P); 132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) caption_button_container_->SetButtonImages( 133a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CAPTION_BUTTON_ICON_RIGHT_SNAPPED, 134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_ICON_RIGHT_SNAPPED, 135a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_ICON_RIGHT_SNAPPED, 136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_BACKGROUND_H, 137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_BACKGROUND_P); 138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)int DefaultHeaderPainter::GetMinimumHeaderWidth() const { 141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Ensure we have enough space for the window icon and buttons. We allow 142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // the title string to collapse to zero width. 143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return GetTitleBounds().x() + 144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) caption_button_container_->GetMinimumSize().width(); 145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void DefaultHeaderPainter::PaintHeader(gfx::Canvas* canvas, Mode mode) { 148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Mode old_mode = mode_; 149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) mode_ = mode; 150a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (mode_ != old_mode) { 152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!initial_paint_ && HeaderPainterUtil::CanAnimateActivation(frame_)) { 153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) activation_animation_->SetSlideDuration(kActivationCrossfadeDurationMs); 154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (mode_ == MODE_ACTIVE) 155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) activation_animation_->Show(); 156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) else 157a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) activation_animation_->Hide(); 158a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } else { 159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (mode_ == MODE_ACTIVE) 160a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) activation_animation_->Reset(1); 161a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) else 162a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) activation_animation_->Reset(0); 163a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 164a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) initial_paint_ = false; 165a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 166a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 167a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int corner_radius = (frame_->IsMaximized() || frame_->IsFullscreen()) ? 168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 0 : HeaderPainterUtil::GetTopCornerRadiusWhenRestored(); 169a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int active_alpha = activation_animation_->CurrentValueBetween(0, 255); 171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int inactive_alpha = 255 - active_alpha; 172a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 173a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 174a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SkPaint paint; 175a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (inactive_alpha > 0) { 176a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (active_alpha > 0) 177a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) paint.setXfermodeMode(SkXfermode::kPlus_Mode); 178a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 179a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) paint.setAlpha(inactive_alpha); 180a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::ImageSkia inactive_frame = 181a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) *rb.GetImageSkiaNamed(IDR_AURA_WINDOW_HEADER_BASE_INACTIVE); 182a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) TileRoundRect(canvas, inactive_frame, paint, GetLocalBounds(), 183a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) corner_radius); 184a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 185a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 186a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (active_alpha > 0) { 187a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) paint.setAlpha(active_alpha); 188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::ImageSkia active_frame = 189a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) *rb.GetImageSkiaNamed(IDR_AURA_WINDOW_HEADER_BASE_ACTIVE); 190a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) TileRoundRect(canvas, active_frame, paint, GetLocalBounds(), 191a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) corner_radius); 192a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 193a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 194a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!frame_->IsMaximized() && 195a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) !frame_->IsFullscreen() && 196a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) mode_ == MODE_INACTIVE) { 197a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PaintHighlightForInactiveRestoredWindow(canvas); 198a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 199a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (frame_->widget_delegate() && 200a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) frame_->widget_delegate()->ShouldShowWindowTitle()) { 201a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PaintTitleBar(canvas); 202a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 203a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PaintHeaderContentSeparator(canvas); 204a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 205a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 206a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void DefaultHeaderPainter::LayoutHeader() { 207a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) caption_button_container_->Layout(); 208a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 209a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::Size caption_button_container_size = 210a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) caption_button_container_->GetPreferredSize(); 211a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) caption_button_container_->SetBounds( 212a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) view_->width() - caption_button_container_size.width(), 213a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 0, 214a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) caption_button_container_size.width(), 215a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) caption_button_container_size.height()); 216a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 217a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (window_icon_) { 218a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Vertically center the window icon with respect to the caption button 219a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // container. 220a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int icon_size = HeaderPainterUtil::GetIconSize(); 221a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int icon_offset_y = (caption_button_container_->height() - icon_size) / 2; 222a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) window_icon_->SetBounds(HeaderPainterUtil::GetIconXOffset(), icon_offset_y, 223a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) icon_size, icon_size); 224a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 225a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 226a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SetHeaderHeightForPainting(caption_button_container_->height() + 227a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kHeaderContentSeparatorSize); 228a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 229a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 230a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)int DefaultHeaderPainter::GetHeaderHeightForPainting() const { 231a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return height_; 232a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 233a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 234a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void DefaultHeaderPainter::SetHeaderHeightForPainting(int height) { 235a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) height_ = height; 236a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 237a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 238a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void DefaultHeaderPainter::SchedulePaintForTitle() { 239a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) view_->SchedulePaintInRect(GetTitleBounds()); 240a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 241a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 242a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 243a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// gfx::AnimationDelegate overrides: 244a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 245a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void DefaultHeaderPainter::AnimationProgressed( 246a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const gfx::Animation* animation) { 247a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) view_->SchedulePaintInRect(GetLocalBounds()); 248a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 249a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 250a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 251a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// DefaultHeaderPainter, private: 252a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 253a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void DefaultHeaderPainter::PaintHighlightForInactiveRestoredWindow( 254a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::Canvas* canvas) { 255a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 256a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::ImageSkia top_edge = *rb.GetImageSkiaNamed( 257a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_HEADER_SHADE_INACTIVE_TOP); 258a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::ImageSkia left_edge = *rb.GetImageSkiaNamed( 259a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_HEADER_SHADE_INACTIVE_LEFT); 260a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::ImageSkia right_edge = *rb.GetImageSkiaNamed( 261a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_HEADER_SHADE_INACTIVE_RIGHT); 262a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::ImageSkia bottom_edge = *rb.GetImageSkiaNamed( 263a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_HEADER_SHADE_INACTIVE_BOTTOM); 264a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 265a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int left_edge_width = left_edge.width(); 266a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int right_edge_width = right_edge.width(); 267a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) canvas->DrawImageInt(left_edge, 0, 0); 268a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) canvas->DrawImageInt(right_edge, view_->width() - right_edge_width, 0); 269a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) canvas->TileImageInt( 270a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) top_edge, 271a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) left_edge_width, 272a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 0, 273a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) view_->width() - left_edge_width - right_edge_width, 274a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) top_edge.height()); 275a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 276a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK_EQ(left_edge.height(), right_edge.height()); 277a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int bottom = left_edge.height(); 278a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int bottom_height = bottom_edge.height(); 279a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) canvas->TileImageInt( 280a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bottom_edge, 281a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) left_edge_width, 282a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bottom - bottom_height, 283a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) view_->width() - left_edge_width - right_edge_width, 284a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bottom_height); 285a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 286a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 287a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void DefaultHeaderPainter::PaintTitleBar(gfx::Canvas* canvas) { 288a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // The window icon is painted by its own views::View. 289a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::Rect title_bounds = GetTitleBounds(); 290a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) title_bounds.set_x(view_->GetMirroredXForRect(title_bounds)); 291a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) canvas->DrawStringRectWithFlags(frame_->widget_delegate()->GetWindowTitle(), 292a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GetTitleFontList(), 293a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kTitleTextColor, 294a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) title_bounds, 295a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::Canvas::NO_SUBPIXEL_RENDERING); 296a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 297a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 298a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void DefaultHeaderPainter::PaintHeaderContentSeparator(gfx::Canvas* canvas) { 299a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SkColor color = (mode_ == MODE_ACTIVE) ? 300a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kHeaderContentSeparatorColor : 301a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kHeaderContentSeparatorInactiveColor; 302a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 303a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) canvas->FillRect(gfx::Rect(0, 304a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) height_ - kHeaderContentSeparatorSize, 305a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) view_->width(), 306a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kHeaderContentSeparatorSize), 307a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) color); 308a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 309a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 310a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)gfx::Rect DefaultHeaderPainter::GetLocalBounds() const { 311a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return gfx::Rect(view_->width(), height_); 312a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 313a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 314a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)gfx::Rect DefaultHeaderPainter::GetTitleBounds() const { 315a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return HeaderPainterUtil::GetTitleBounds( 316a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) window_icon_, caption_button_container_, GetTitleFontList()); 317a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 318a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 319a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace ash 320