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/tabs/side_tab.h"
6
7#include "base/utf_string_conversions.h"
8#include "grit/app_resources.h"
9#include "grit/theme_resources.h"
10#include "ui/base/resource/resource_bundle.h"
11#include "ui/gfx/canvas_skia.h"
12#include "ui/gfx/favicon_size.h"
13#include "ui/gfx/path.h"
14#include "ui/gfx/skia_util.h"
15#include "views/controls/button/image_button.h"
16
17namespace {
18const int kVerticalTabHeight = 27;
19const int kTitleCloseSpacing = 4;
20const SkScalar kRoundRectRadius = 4;
21const SkColor kTabBackgroundColor = SK_ColorWHITE;
22const SkColor kTextColor = SK_ColorBLACK;
23
24// Padding between the edge and the icon.
25const int kIconLeftPadding = 5;
26
27// Location the title starts at.
28const int kTitleX = kIconLeftPadding + kFaviconSize + 5;
29};
30
31////////////////////////////////////////////////////////////////////////////////
32// SideTab, public:
33
34SideTab::SideTab(TabController* controller)
35    : BaseTab(controller) {
36  ResourceBundle& rb = ResourceBundle::GetSharedInstance();
37  close_button()->SetBackground(kTextColor,
38                                rb.GetBitmapNamed(IDR_TAB_CLOSE),
39                                rb.GetBitmapNamed(IDR_TAB_CLOSE_MASK));
40}
41
42SideTab::~SideTab() {
43}
44
45// static
46int SideTab::GetPreferredHeight() {
47  return 27;
48}
49
50////////////////////////////////////////////////////////////////////////////////
51// SideTab, views::View overrides:
52
53void SideTab::Layout() {
54  if (ShouldShowIcon()) {
55    int icon_y = (height() - kFaviconSize) / 2;
56    icon_bounds_.SetRect(kIconLeftPadding, icon_y, kFaviconSize, kFaviconSize);
57  } else {
58    icon_bounds_ = gfx::Rect();
59  }
60
61  gfx::Size ps = close_button()->GetPreferredSize();
62  int close_y = (height() - ps.height()) / 2;
63  close_button()->SetBounds(
64      std::max(0, width() - ps.width() -
65               (GetPreferredHeight() - ps.height()) / 2),
66      close_y,
67      ps.width(),
68      ps.height());
69
70  int title_y = (height() - font_height()) / 2;
71  title_bounds_.SetRect(
72      kTitleX,
73      title_y,
74      std::max(0, close_button()->x() - kTitleCloseSpacing - kTitleX),
75      font_height());
76}
77
78void SideTab::OnPaint(gfx::Canvas* canvas) {
79  // TODO: should render the active tab differently.
80  if (ShouldPaintHighlight()) {
81    SkPaint paint;
82    paint.setColor(kTabBackgroundColor);
83    paint.setAntiAlias(true);
84    SkRect border_rect = { SkIntToScalar(0), SkIntToScalar(0),
85                           SkIntToScalar(width()), SkIntToScalar(height()) };
86    canvas->AsCanvasSkia()->drawRoundRect(border_rect,
87                                          SkIntToScalar(kRoundRectRadius),
88                                          SkIntToScalar(kRoundRectRadius),
89                                          paint);
90  }
91
92  if (ShouldShowIcon())
93    PaintIcon(canvas);
94
95  PaintTitle(canvas, kTextColor);
96}
97
98gfx::Size SideTab::GetPreferredSize() {
99  return gfx::Size(0, GetPreferredHeight());
100}
101
102const gfx::Rect& SideTab::GetTitleBounds() const {
103  return title_bounds_;
104}
105
106const gfx::Rect& SideTab::GetIconBounds() const {
107  return icon_bounds_;
108}
109
110bool SideTab::ShouldPaintHighlight() const {
111  return IsSelected() || !controller();
112}
113
114bool SideTab::ShouldShowIcon() const {
115  return data().mini || data().show_icon;
116}
117