detachable_toolbar_view.cc revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
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
3// found in the LICENSE file.
4
5#include "chrome/browser/ui/views/detachable_toolbar_view.h"
6
7#include "chrome/browser/themes/theme_properties.h"
8#include "grit/theme_resources.h"
9#include "third_party/skia/include/core/SkShader.h"
10#include "ui/base/resource/resource_bundle.h"
11#include "ui/base/theme_provider.h"
12#include "ui/gfx/canvas.h"
13#include "ui/gfx/image/image_skia.h"
14#include "ui/gfx/skia_util.h"
15#include "ui/views/window/non_client_view.h"
16
17// How round the 'new tab' style bookmarks bar is.
18static const int kNewtabBarRoundness = 5;
19
20const SkColor DetachableToolbarView::kEdgeDividerColor =
21    SkColorSetRGB(222, 234, 248);
22const SkColor DetachableToolbarView::kMiddleDividerColor =
23    SkColorSetRGB(194, 205, 212);
24
25// static
26void DetachableToolbarView::PaintBackgroundAttachedMode(
27    gfx::Canvas* canvas,
28    ui::ThemeProvider* theme_provider,
29    const gfx::Rect& bounds,
30    const gfx::Point& background_origin,
31    chrome::HostDesktopType host_desktop_type) {
32  canvas->FillRect(bounds,
33                   theme_provider->GetColor(ThemeProperties::COLOR_TOOLBAR));
34  canvas->TileImageInt(*theme_provider->GetImageSkiaNamed(IDR_THEME_TOOLBAR),
35                       background_origin.x(), background_origin.y(), bounds.x(),
36                       bounds.y(), bounds.width(), bounds.height());
37#if defined(USE_ASH)
38  if (host_desktop_type == chrome::HOST_DESKTOP_TYPE_ASH) {
39    // Ash provides additional lightening at the edges of the toolbar.
40    gfx::ImageSkia* toolbar_left =
41        theme_provider->GetImageSkiaNamed(IDR_TOOLBAR_SHADE_LEFT);
42    canvas->TileImageInt(*toolbar_left,
43                         bounds.x(), bounds.y(),
44                         toolbar_left->width(), bounds.height());
45    gfx::ImageSkia* toolbar_right =
46        theme_provider->GetImageSkiaNamed(IDR_TOOLBAR_SHADE_RIGHT);
47    canvas->TileImageInt(*toolbar_right,
48                         bounds.right() - toolbar_right->width(), bounds.y(),
49                         toolbar_right->width(), bounds.height());
50  }
51#endif
52}
53
54// static
55void DetachableToolbarView::CalculateContentArea(
56    double animation_state, double horizontal_padding,
57    double vertical_padding, SkRect* rect,
58    double* roundness, views::View* view) {
59  // The 0.5 is to correct for Skia's "draw on pixel boundaries"ness.
60  rect->set(SkDoubleToScalar(horizontal_padding - 0.5),
61           SkDoubleToScalar(vertical_padding - 0.5),
62           SkDoubleToScalar(view->width() - horizontal_padding - 0.5),
63           SkDoubleToScalar(view->height() - vertical_padding - 0.5));
64
65  *roundness = static_cast<double>(kNewtabBarRoundness) * animation_state;
66}
67
68// static
69void DetachableToolbarView::PaintHorizontalBorder(
70    gfx::Canvas* canvas,
71    DetachableToolbarView* view,
72    bool at_top,
73    SkColor color) {
74  int thickness = views::NonClientFrameView::kClientEdgeThickness;
75  int y = at_top ? 0 : (view->height() - thickness);
76  canvas->FillRect(gfx::Rect(0, y, view->width(), thickness), color);
77}
78
79// static
80void DetachableToolbarView::PaintContentAreaBackground(
81    gfx::Canvas* canvas,
82    ui::ThemeProvider* theme_provider,
83    const SkRect& rect,
84    double roundness) {
85  SkPaint paint;
86  paint.setAntiAlias(true);
87  paint.setColor(theme_provider->GetColor(ThemeProperties::COLOR_TOOLBAR));
88
89  canvas->sk_canvas()->drawRoundRect(
90      rect, SkDoubleToScalar(roundness), SkDoubleToScalar(roundness), paint);
91}
92
93// static
94void DetachableToolbarView::PaintContentAreaBorder(
95    gfx::Canvas* canvas, ui::ThemeProvider* theme_provider,
96    const SkRect& rect, double roundness) {
97  SkPaint border_paint;
98  border_paint.setColor(
99      theme_provider->GetColor(ThemeProperties::COLOR_NTP_HEADER));
100  border_paint.setStyle(SkPaint::kStroke_Style);
101  border_paint.setAlpha(96);
102  border_paint.setAntiAlias(true);
103
104  canvas->sk_canvas()->drawRoundRect(
105      rect, SkDoubleToScalar(roundness), SkDoubleToScalar(roundness),
106      border_paint);
107}
108
109// static
110void DetachableToolbarView::PaintVerticalDivider(gfx::Canvas* canvas,
111                                                 int x,
112                                                 int height,
113                                                 int vertical_padding,
114                                                 SkColor top_color,
115                                                 SkColor middle_color,
116                                                 SkColor bottom_color) {
117  // Draw the upper half of the divider.
118  SkPaint paint;
119  skia::RefPtr<SkShader> shader = gfx::CreateGradientShader(
120      vertical_padding + 1, height / 2, top_color, middle_color);
121  paint.setShader(shader.get());
122  SkRect rc = { SkIntToScalar(x),
123                SkIntToScalar(vertical_padding + 1),
124                SkIntToScalar(x + 1),
125                SkIntToScalar(height / 2) };
126  canvas->sk_canvas()->drawRect(rc, paint);
127
128  // Draw the lower half of the divider.
129  SkPaint paint_down;
130  shader = gfx::CreateGradientShader(
131      height / 2, height - vertical_padding, middle_color, bottom_color);
132  paint_down.setShader(shader.get());
133  SkRect rc_down = { SkIntToScalar(x),
134                     SkIntToScalar(height / 2),
135                     SkIntToScalar(x + 1),
136                     SkIntToScalar(height - vertical_padding) };
137  canvas->sk_canvas()->drawRect(rc_down, paint_down);
138}
139