1// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/ui/views/detachable_toolbar_view.h"
6
7#include "chrome/browser/themes/theme_service.h"
8#include "grit/theme_resources.h"
9#include "third_party/skia/include/core/SkBitmap.h"
10#include "third_party/skia/include/core/SkShader.h"
11#include "ui/base/resource/resource_bundle.h"
12#include "ui/gfx/canvas_skia.h"
13#include "ui/gfx/skia_util.h"
14#include "views/window/non_client_view.h"
15
16// How round the 'new tab' style bookmarks bar is.
17static const int kNewtabBarRoundness = 5;
18
19const SkColor DetachableToolbarView::kEdgeDividerColor =
20    SkColorSetRGB(222, 234, 248);
21const SkColor DetachableToolbarView::kMiddleDividerColor =
22    SkColorSetRGB(194, 205, 212);
23
24// static
25void DetachableToolbarView::PaintBackgroundAttachedMode(
26    gfx::Canvas* canvas,
27    views::View* view,
28    const gfx::Point& background_origin) {
29  ui::ThemeProvider* tp = view->GetThemeProvider();
30  SkColor theme_toolbar_color =
31      tp->GetColor(ThemeService::COLOR_TOOLBAR);
32  canvas->FillRectInt(theme_toolbar_color, 0, 0,
33                      view->width(), view->height());
34  canvas->TileImageInt(*tp->GetBitmapNamed(IDR_THEME_TOOLBAR),
35                       background_origin.x(), background_origin.y(), 0, 0,
36                       view->width(), view->height());
37}
38
39// static
40void DetachableToolbarView::CalculateContentArea(
41    double animation_state, double horizontal_padding,
42    double vertical_padding, SkRect* rect,
43    double* roundness, views::View* view) {
44  // The 0.5 is to correct for Skia's "draw on pixel boundaries"ness.
45  rect->set(SkDoubleToScalar(horizontal_padding - 0.5),
46           SkDoubleToScalar(vertical_padding - 0.5),
47           SkDoubleToScalar(view->width() - horizontal_padding - 0.5),
48           SkDoubleToScalar(view->height() - vertical_padding - 0.5));
49
50  *roundness = static_cast<double>(kNewtabBarRoundness) * animation_state;
51}
52
53// static
54void DetachableToolbarView::PaintHorizontalBorder(gfx::Canvas* canvas,
55                                                  DetachableToolbarView* view) {
56  // Border can be at the top or at the bottom of the view depending on whether
57  // the view (bar/shelf) is attached or detached.
58  int thickness = views::NonClientFrameView::kClientEdgeThickness;
59  int y = view->IsDetached() ? 0 : (view->height() - thickness);
60  canvas->FillRectInt(ResourceBundle::toolbar_separator_color,
61      0, y, view->width(), thickness);
62}
63
64// static
65void DetachableToolbarView::PaintContentAreaBackground(
66    gfx::Canvas* canvas, ui::ThemeProvider* theme_provider,
67    const SkRect& rect, double roundness) {
68  SkPaint paint;
69  paint.setAntiAlias(true);
70  paint.setColor(theme_provider->GetColor(ThemeService::COLOR_TOOLBAR));
71
72  canvas->AsCanvasSkia()->drawRoundRect(
73      rect, SkDoubleToScalar(roundness), SkDoubleToScalar(roundness), paint);
74}
75
76// static
77void DetachableToolbarView::PaintContentAreaBorder(
78    gfx::Canvas* canvas, ui::ThemeProvider* theme_provider,
79    const SkRect& rect, double roundness) {
80  SkPaint border_paint;
81  border_paint.setColor(
82      theme_provider->GetColor(ThemeService::COLOR_NTP_HEADER));
83  border_paint.setStyle(SkPaint::kStroke_Style);
84  border_paint.setAlpha(96);
85  border_paint.setAntiAlias(true);
86
87  canvas->AsCanvasSkia()->drawRoundRect(
88      rect, SkDoubleToScalar(roundness), SkDoubleToScalar(roundness),
89      border_paint);
90}
91
92// static
93void DetachableToolbarView::PaintVerticalDivider(
94    gfx::Canvas* canvas, int x, int height, int vertical_padding,
95    const SkColor& top_color,
96    const SkColor& middle_color,
97    const SkColor& bottom_color) {
98  // Draw the upper half of the divider.
99  SkPaint paint;
100  SkSafeUnref(paint.setShader(gfx::CreateGradientShader(vertical_padding + 1,
101                                                        height / 2,
102                                                        top_color,
103                                                        middle_color)));
104  SkRect rc = { SkIntToScalar(x),
105                SkIntToScalar(vertical_padding + 1),
106                SkIntToScalar(x + 1),
107                SkIntToScalar(height / 2) };
108  canvas->AsCanvasSkia()->drawRect(rc, paint);
109
110  // Draw the lower half of the divider.
111  SkPaint paint_down;
112  SkSafeUnref(paint_down.setShader(gfx::CreateGradientShader(
113          height / 2, height - vertical_padding, middle_color, bottom_color)));
114  SkRect rc_down = { SkIntToScalar(x),
115                     SkIntToScalar(height / 2),
116                     SkIntToScalar(x + 1),
117                     SkIntToScalar(height - vertical_padding) };
118  canvas->AsCanvasSkia()->drawRect(rc_down, paint_down);
119}
120