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