172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/views/tabs/side_tab.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/utf_string_conversions.h"
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/app_resources.h"
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/theme_resources.h"
1072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/resource/resource_bundle.h"
1172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/canvas_skia.h"
1272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/favicon_size.h"
1372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/path.h"
1472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/skia_util.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/controls/button/image_button.h"
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace {
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst int kVerticalTabHeight = 27;
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst int kTitleCloseSpacing = 4;
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst SkScalar kRoundRectRadius = 4;
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst SkColor kTabBackgroundColor = SK_ColorWHITE;
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst SkColor kTextColor = SK_ColorBLACK;
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Padding between the edge and the icon.
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst int kIconLeftPadding = 5;
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Location the title starts at.
28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst int kTitleX = kIconLeftPadding + kFaviconSize + 5;
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch////////////////////////////////////////////////////////////////////////////////
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// SideTab, public:
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochSideTab::SideTab(TabController* controller)
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : BaseTab(controller) {
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ResourceBundle& rb = ResourceBundle::GetSharedInstance();
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  close_button()->SetBackground(kTextColor,
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                rb.GetBitmapNamed(IDR_TAB_CLOSE),
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                rb.GetBitmapNamed(IDR_TAB_CLOSE_MASK));
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochSideTab::~SideTab() {
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint SideTab::GetPreferredHeight() {
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return 27;
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch////////////////////////////////////////////////////////////////////////////////
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// SideTab, views::View overrides:
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid SideTab::Layout() {
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (ShouldShowIcon()) {
55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    int icon_y = (height() - kFaviconSize) / 2;
56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    icon_bounds_.SetRect(kIconLeftPadding, icon_y, kFaviconSize, kFaviconSize);
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else {
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    icon_bounds_ = gfx::Rect();
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Size ps = close_button()->GetPreferredSize();
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int close_y = (height() - ps.height()) / 2;
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  close_button()->SetBounds(
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      std::max(0, width() - ps.width() -
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               (GetPreferredHeight() - ps.height()) / 2),
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      close_y,
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ps.width(),
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ps.height());
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int title_y = (height() - font_height()) / 2;
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  title_bounds_.SetRect(
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      kTitleX,
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      title_y,
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      std::max(0, close_button()->x() - kTitleCloseSpacing - kTitleX),
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      font_height());
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
78dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid SideTab::OnPaint(gfx::Canvas* canvas) {
79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // TODO: should render the active tab differently.
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (ShouldPaintHighlight()) {
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    SkPaint paint;
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    paint.setColor(kTabBackgroundColor);
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    paint.setAntiAlias(true);
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    SkRect border_rect = { SkIntToScalar(0), SkIntToScalar(0),
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                           SkIntToScalar(width()), SkIntToScalar(height()) };
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    canvas->AsCanvasSkia()->drawRoundRect(border_rect,
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                          SkIntToScalar(kRoundRectRadius),
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                          SkIntToScalar(kRoundRectRadius),
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                          paint);
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
92731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (ShouldShowIcon())
93dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    PaintIcon(canvas);
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
95731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  PaintTitle(canvas, kTextColor);
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochgfx::Size SideTab::GetPreferredSize() {
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return gfx::Size(0, GetPreferredHeight());
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
102dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst gfx::Rect& SideTab::GetTitleBounds() const {
103dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return title_bounds_;
104dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
105dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
106dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst gfx::Rect& SideTab::GetIconBounds() const {
107dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return icon_bounds_;
108dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
109dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool SideTab::ShouldPaintHighlight() const {
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return IsSelected() || !controller();
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool SideTab::ShouldShowIcon() const {
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return data().mini || data().show_icon;
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
117