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/SkPaint.h" 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "third_party/skia/include/core/SkPath.h" 14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/gfx/animation/slide_animation.h" 16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/gfx/canvas.h" 176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "ui/gfx/color_utils.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)// Color of the active window header/content separator line. 34effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochconst SkColor kHeaderContentSeparatorColor = SkColorSetRGB(150, 150, 152); 35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Color of the inactive window header/content separator line. 36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const SkColor kHeaderContentSeparatorInactiveColor = 37effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SkColorSetRGB(180, 180, 182); 386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// The color of the frame. 396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)const SkColor kFrameColor = SkColorSetRGB(242, 242, 242); 406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// The alpha of the inactive frame. 416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)const SkAlpha kInactiveFrameAlpha = 204; 42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Duration of crossfade animation for activating and deactivating frame. 43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const int kActivationCrossfadeDurationMs = 200; 44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Tiles an image into an area, rounding the top corners. 46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void TileRoundRect(gfx::Canvas* canvas, 47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const SkPaint& paint, 48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const gfx::Rect& bounds, 49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int corner_radius) { 50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SkRect rect = gfx::RectToSkRect(bounds); 51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const SkScalar corner_radius_scalar = SkIntToScalar(corner_radius); 52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SkScalar radii[8] = { 53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) corner_radius_scalar, corner_radius_scalar, // top-left 54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) corner_radius_scalar, corner_radius_scalar, // top-right 55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 0, 0, // bottom-right 56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 0, 0}; // bottom-left 57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SkPath path; 58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) path.addRoundRect(rect, radii, SkPath::kCW_Direction); 596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) canvas->DrawPath(path, paint); 60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Returns the FontList to use for the title. 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const gfx::FontList& GetTitleFontList() { 64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static const gfx::FontList* title_font_list = 65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new gfx::FontList(views::NativeWidgetAura::GetWindowTitleFontList()); 66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ANNOTATE_LEAKING_OBJECT_PTR(title_font_list); 67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return *title_font_list; 68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace 71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace ash { 73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// DefaultHeaderPainter, public: 76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)DefaultHeaderPainter::DefaultHeaderPainter() 78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) : frame_(NULL), 79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) view_(NULL), 8003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) left_header_view_(NULL), 8103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) left_view_x_inset_(HeaderPainterUtil::GetDefaultLeftViewXInset()), 82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) caption_button_container_(NULL), 83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) height_(0), 84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) mode_(MODE_INACTIVE), 85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) initial_paint_(true), 86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) activation_animation_(new gfx::SlideAnimation(this)) { 87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)DefaultHeaderPainter::~DefaultHeaderPainter() { 90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void DefaultHeaderPainter::Init( 93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) views::Widget* frame, 94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) views::View* header_view, 95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FrameCaptionButtonContainerView* caption_button_container) { 96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(frame); 97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(header_view); 98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(caption_button_container); 99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) frame_ = frame; 100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) view_ = header_view; 101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) caption_button_container_ = caption_button_container; 102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) caption_button_container_->SetButtonImages( 104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CAPTION_BUTTON_ICON_MINIMIZE, 105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_ICON_MINIMIZE, 106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_ICON_MINIMIZE_I, 107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_BACKGROUND_H, 108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_BACKGROUND_P); 10903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) UpdateSizeButtonImages(); 110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) caption_button_container_->SetButtonImages( 111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CAPTION_BUTTON_ICON_CLOSE, 112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_ICON_CLOSE, 113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_ICON_CLOSE_I, 114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_BACKGROUND_H, 115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_BACKGROUND_P); 116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // There is no dedicated icon for the snap-left and snap-right buttons 118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // when |frame_| is inactive because they should never be visible while 119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // |frame_| is inactive. 120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) caption_button_container_->SetButtonImages( 121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CAPTION_BUTTON_ICON_LEFT_SNAPPED, 122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_ICON_LEFT_SNAPPED, 123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_ICON_LEFT_SNAPPED, 124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_BACKGROUND_H, 125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_BACKGROUND_P); 126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) caption_button_container_->SetButtonImages( 127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CAPTION_BUTTON_ICON_RIGHT_SNAPPED, 128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_ICON_RIGHT_SNAPPED, 129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_ICON_RIGHT_SNAPPED, 130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_BACKGROUND_H, 131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_BACKGROUND_P); 132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 133a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)int DefaultHeaderPainter::GetMinimumHeaderWidth() const { 135a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Ensure we have enough space for the window icon and buttons. We allow 136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // the title string to collapse to zero width. 137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return GetTitleBounds().x() + 138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) caption_button_container_->GetMinimumSize().width(); 139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void DefaultHeaderPainter::PaintHeader(gfx::Canvas* canvas, Mode mode) { 142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Mode old_mode = mode_; 143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) mode_ = mode; 144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (mode_ != old_mode) { 146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!initial_paint_ && HeaderPainterUtil::CanAnimateActivation(frame_)) { 147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) activation_animation_->SetSlideDuration(kActivationCrossfadeDurationMs); 148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (mode_ == MODE_ACTIVE) 149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) activation_animation_->Show(); 150a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) else 151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) activation_animation_->Hide(); 152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } else { 153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (mode_ == MODE_ACTIVE) 154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) activation_animation_->Reset(1); 155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) else 156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) activation_animation_->Reset(0); 157a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 158a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) initial_paint_ = false; 159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 160a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 161a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int corner_radius = (frame_->IsMaximized() || frame_->IsFullscreen()) ? 162a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 0 : HeaderPainterUtil::GetTopCornerRadiusWhenRestored(); 163a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 164a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SkPaint paint; 1656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) int active_alpha = activation_animation_->CurrentValueBetween(0, 255); 1666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) paint.setColor(color_utils::AlphaBlend( 1676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) kFrameColor, GetInactiveFrameColor(), active_alpha)); 168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) TileRoundRect(canvas, paint, GetLocalBounds(), corner_radius); 170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!frame_->IsMaximized() && 172a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) !frame_->IsFullscreen() && 173a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) mode_ == MODE_INACTIVE) { 174a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PaintHighlightForInactiveRestoredWindow(canvas); 175a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 176a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (frame_->widget_delegate() && 177a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) frame_->widget_delegate()->ShouldShowWindowTitle()) { 178a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PaintTitleBar(canvas); 179a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 180a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PaintHeaderContentSeparator(canvas); 181a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 182a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 183a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void DefaultHeaderPainter::LayoutHeader() { 18403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) UpdateSizeButtonImages(); 1856d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) caption_button_container_->Layout(); 1866d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 187a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::Size caption_button_container_size = 188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) caption_button_container_->GetPreferredSize(); 189a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) caption_button_container_->SetBounds( 190a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) view_->width() - caption_button_container_size.width(), 191a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 0, 192a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) caption_button_container_size.width(), 193a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) caption_button_container_size.height()); 1946d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 19503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) LayoutLeftHeaderView(); 196a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 19723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // The header/content separator line overlays the caption buttons. 19823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) SetHeaderHeightForPainting(caption_button_container_->height()); 199a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 200a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 201a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)int DefaultHeaderPainter::GetHeaderHeightForPainting() const { 202a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return height_; 203a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 204a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 205a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void DefaultHeaderPainter::SetHeaderHeightForPainting(int height) { 206a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) height_ = height; 207a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 208a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 209a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void DefaultHeaderPainter::SchedulePaintForTitle() { 210a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) view_->SchedulePaintInRect(GetTitleBounds()); 211a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 212a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 21303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void DefaultHeaderPainter::UpdateLeftViewXInset(int left_view_x_inset) { 21403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (left_view_x_inset_ != left_view_x_inset) { 21503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) left_view_x_inset_ = left_view_x_inset; 21603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) LayoutLeftHeaderView(); 21703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 21803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 21903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 22003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void DefaultHeaderPainter::UpdateLeftHeaderView(views::View* left_header_view) { 22103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) left_header_view_ = left_header_view; 222effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 223effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 224a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 225a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// gfx::AnimationDelegate overrides: 226a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 227a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void DefaultHeaderPainter::AnimationProgressed( 228a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const gfx::Animation* animation) { 229a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) view_->SchedulePaintInRect(GetLocalBounds()); 230a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 231a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 232a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 233a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// DefaultHeaderPainter, private: 234a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 235a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void DefaultHeaderPainter::PaintHighlightForInactiveRestoredWindow( 236a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::Canvas* canvas) { 237a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 238a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::ImageSkia top_edge = *rb.GetImageSkiaNamed( 239a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_HEADER_SHADE_INACTIVE_TOP); 240a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::ImageSkia left_edge = *rb.GetImageSkiaNamed( 241a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_HEADER_SHADE_INACTIVE_LEFT); 242a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::ImageSkia right_edge = *rb.GetImageSkiaNamed( 243a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_HEADER_SHADE_INACTIVE_RIGHT); 244a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::ImageSkia bottom_edge = *rb.GetImageSkiaNamed( 245a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_HEADER_SHADE_INACTIVE_BOTTOM); 246a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 247a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int left_edge_width = left_edge.width(); 248a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int right_edge_width = right_edge.width(); 249a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) canvas->DrawImageInt(left_edge, 0, 0); 250a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) canvas->DrawImageInt(right_edge, view_->width() - right_edge_width, 0); 251a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) canvas->TileImageInt( 252a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) top_edge, 253a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) left_edge_width, 254a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 0, 255a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) view_->width() - left_edge_width - right_edge_width, 256a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) top_edge.height()); 257a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 258a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK_EQ(left_edge.height(), right_edge.height()); 259a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int bottom = left_edge.height(); 260a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int bottom_height = bottom_edge.height(); 261a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) canvas->TileImageInt( 262a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bottom_edge, 263a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) left_edge_width, 264a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bottom - bottom_height, 265a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) view_->width() - left_edge_width - right_edge_width, 266a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bottom_height); 267a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 268a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 269a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void DefaultHeaderPainter::PaintTitleBar(gfx::Canvas* canvas) { 270a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // The window icon is painted by its own views::View. 271a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::Rect title_bounds = GetTitleBounds(); 272a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) title_bounds.set_x(view_->GetMirroredXForRect(title_bounds)); 273a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) canvas->DrawStringRectWithFlags(frame_->widget_delegate()->GetWindowTitle(), 274a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GetTitleFontList(), 275a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kTitleTextColor, 276a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) title_bounds, 277a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::Canvas::NO_SUBPIXEL_RENDERING); 278a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 279a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 280a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void DefaultHeaderPainter::PaintHeaderContentSeparator(gfx::Canvas* canvas) { 281a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SkColor color = (mode_ == MODE_ACTIVE) ? 282a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kHeaderContentSeparatorColor : 283a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kHeaderContentSeparatorInactiveColor; 284a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 28523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) SkPaint paint; 28623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) paint.setColor(color); 28723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // Draw the line as 1px thick regardless of scale factor. 28823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) paint.setStrokeWidth(0); 28923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 29023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) float thickness = 1 / canvas->image_scale(); 29123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) SkScalar y = SkIntToScalar(height_) - SkFloatToScalar(thickness); 29223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) canvas->sk_canvas()->drawLine(0, y, SkIntToScalar(view_->width()), y, paint); 293a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 294a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 29503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void DefaultHeaderPainter::LayoutLeftHeaderView() { 29603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (left_header_view_) { 29703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Vertically center the left header view with respect to the caption button 29803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // container. 29903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Floor when computing the center of |caption_button_container_|. 30003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) gfx::Size size = left_header_view_->GetPreferredSize(); 30103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) int icon_offset_y = caption_button_container_->height() / 2 - 30203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) size.height() / 2; 30303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) left_header_view_->SetBounds( 30403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) left_view_x_inset_, icon_offset_y, size.width(), size.height()); 30503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 30603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 30703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 30803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void DefaultHeaderPainter::UpdateSizeButtonImages() { 30903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) int icon_id = 0; 31003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) int inactive_icon_id = 0; 31103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (frame_->IsMaximized() || frame_->IsFullscreen()) { 31203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) icon_id = IDR_AURA_WINDOW_CONTROL_ICON_RESTORE; 31303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) inactive_icon_id = IDR_AURA_WINDOW_CONTROL_ICON_RESTORE_I; 31403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } else { 31503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) icon_id = IDR_AURA_WINDOW_CONTROL_ICON_MAXIMIZE; 31603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) inactive_icon_id = IDR_AURA_WINDOW_CONTROL_ICON_MAXIMIZE_I; 31703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 31803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) caption_button_container_->SetButtonImages( 31903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) CAPTION_BUTTON_ICON_MAXIMIZE_RESTORE, 32003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) icon_id, 32103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) inactive_icon_id, 32203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_BACKGROUND_H, 32303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_BACKGROUND_P); 32403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 32503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 326a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)gfx::Rect DefaultHeaderPainter::GetLocalBounds() const { 327a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return gfx::Rect(view_->width(), height_); 328a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 329a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 330a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)gfx::Rect DefaultHeaderPainter::GetTitleBounds() const { 331a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return HeaderPainterUtil::GetTitleBounds( 33203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) left_header_view_, caption_button_container_, GetTitleFontList()); 333a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 334a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)SkColor DefaultHeaderPainter::GetInactiveFrameColor() const { 3366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) SkColor color = kFrameColor; 3376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (!frame_->IsMaximized() && !frame_->IsFullscreen()) { 3386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) color = SkColorSetARGB(kInactiveFrameAlpha, 3396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) SkColorGetR(color), 3406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) SkColorGetG(color), 3416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) SkColorGetB(color)); 3426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 3436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return color; 344effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 345effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 346a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace ash 347