| Index: chrome/browser/ui/views/tabs/tab.cc
|
| diff --git a/chrome/browser/ui/views/tabs/tab.cc b/chrome/browser/ui/views/tabs/tab.cc
|
| index d5c252c7c883e28d0612b7500956254e12f134f9..ff64038d66a9a274103338c77e8c3abfd468707d 100644
|
| --- a/chrome/browser/ui/views/tabs/tab.cc
|
| +++ b/chrome/browser/ui/views/tabs/tab.cc
|
| @@ -35,6 +35,7 @@
|
| #include "ui/gfx/canvas.h"
|
| #include "ui/gfx/color_analysis.h"
|
| #include "ui/gfx/favicon_size.h"
|
| +#include "ui/gfx/font.h"
|
| #include "ui/gfx/image/image_skia_operations.h"
|
| #include "ui/gfx/path.h"
|
| #include "ui/gfx/rect_conversions.h"
|
| @@ -42,7 +43,6 @@
|
| #include "ui/gfx/text_elider.h"
|
| #include "ui/views/border.h"
|
| #include "ui/views/controls/button/image_button.h"
|
| -#include "ui/views/controls/label.h"
|
| #include "ui/views/rect_based_targeting_utils.h"
|
| #include "ui/views/widget/tooltip_manager.h"
|
| #include "ui/views/widget/widget.h"
|
| @@ -375,6 +375,10 @@
|
| Tab::TabImage Tab::tab_active_ = {0};
|
| Tab::TabImage Tab::tab_inactive_ = {0};
|
| // static
|
| +gfx::Font* Tab::font_ = NULL;
|
| +// static
|
| +int Tab::font_height_ = 0;
|
| +// static
|
| Tab::ImageCache* Tab::image_cache_ = NULL;
|
|
|
| ////////////////////////////////////////////////////////////////////////////////
|
| @@ -389,8 +393,6 @@
|
| immersive_loading_step_(0),
|
| should_display_crashed_favicon_(false),
|
| animating_media_state_(TAB_MEDIA_STATE_NONE),
|
| - close_button_(NULL),
|
| - title_(new views::Label()),
|
| tab_activated_with_last_gesture_begin_(false),
|
| hover_controller_(this),
|
| showing_icon_(false),
|
| @@ -405,10 +407,6 @@
|
| set_notify_enter_exit_on_child(true);
|
|
|
| set_id(VIEW_ID_TAB);
|
| -
|
| - title_->set_directionality_mode(gfx::DIRECTIONALITY_FROM_TEXT);
|
| - title_->SetHorizontalAlignment(gfx::ALIGN_TO_HEAD);
|
| - title_->SetElideBehavior(gfx::FADE_TAIL);
|
|
|
| // Add the Close Button.
|
| close_button_ = new TabCloseButton(this);
|
| @@ -451,16 +449,6 @@
|
|
|
| TabRendererData old(data_);
|
| data_ = data;
|
| -
|
| - base::string16 title = data_.title;
|
| - if (title.empty()) {
|
| - title = data_.loading ?
|
| - l10n_util::GetStringUTF16(IDS_TAB_LOADING_TITLE) :
|
| - CoreTabHelper::GetDefaultTitle();
|
| - } else {
|
| - Browser::FormatTitleForDisplay(&title);
|
| - }
|
| - title_->SetText(title);
|
|
|
| if (data_.IsCrashed()) {
|
| if (!should_display_crashed_favicon_ && !IsPerformingCrashAnimation()) {
|
| @@ -698,8 +686,7 @@
|
| // The height of the content of the Tab is the largest of the favicon,
|
| // the title text and the close button graphic.
|
| const int kTabIconSize = gfx::kFaviconSize;
|
| - const int font_height = title_->font_list().GetHeight();
|
| - int content_height = std::max(kTabIconSize, font_height);
|
| + int content_height = std::max(kTabIconSize, font_height_);
|
| close_button_->SetBorder(views::Border::NullBorder());
|
| gfx::Size close_button_size(close_button_->GetPreferredSize());
|
| content_height = std::max(content_height, close_button_size.height());
|
| @@ -771,15 +758,14 @@
|
| kTitleTextOffsetYAsh : kTitleTextOffsetY;
|
| int title_left = favicon_bounds_.right() + kFaviconTitleSpacing;
|
| int title_top = kTopPadding + title_text_offset +
|
| - (content_height - font_height) / 2;
|
| - gfx::Rect title_bounds(title_left, title_top, 0, 0);
|
| + (content_height - font_height_) / 2;
|
| // Size the Title text to fill the remaining space.
|
| if (!data().mini || width() >= kMiniTabRendererAsNormalTabWidth) {
|
| // If the user has big fonts, the title will appear rendered too far down
|
| // on the y-axis if we use the regular top padding, so we need to adjust it
|
| // so that the text appears centered.
|
| gfx::Size minimum_size = GetMinimumUnselectedSize();
|
| - int text_height = title_top + font_height + kBottomPadding;
|
| + int text_height = title_top + font_height_ + kBottomPadding;
|
| if (text_height > minimum_size.height())
|
| title_top -= (text_height - minimum_size.height()) / 2;
|
|
|
| @@ -797,11 +783,19 @@
|
| title_width = lb.width() - title_left;
|
| }
|
| title_width = std::max(title_width, 0);
|
| - title_bounds.SetRect(title_left, title_top, title_width, font_height);
|
| - }
|
| -
|
| - title_bounds.set_x(GetMirroredXForRect(title_bounds));
|
| - title_->SetBoundsRect(title_bounds);
|
| + title_bounds_.SetRect(title_left, title_top, title_width, font_height_);
|
| + } else {
|
| + title_bounds_.SetRect(title_left, title_top, 0, 0);
|
| + }
|
| +
|
| + // Certain UI elements within the Tab (the favicon, etc.) are not represented
|
| + // as child Views (which is the preferred method). Instead, these UI elements
|
| + // are drawn directly on the canvas from within Tab::OnPaint(). The Tab's
|
| + // child Views (for example, the Tab's close button which is a views::Button
|
| + // instance) are automatically mirrored by the mirroring infrastructure in
|
| + // views. The elements Tab draws directly on the canvas need to be manually
|
| + // mirrored if the View's layout is right-to-left.
|
| + title_bounds_.set_x(GetMirroredXForRect(title_bounds_));
|
| }
|
|
|
| void Tab::OnThemeChanged() {
|
| @@ -846,7 +840,7 @@
|
| }
|
|
|
| bool Tab::GetTooltipTextOrigin(const gfx::Point& p, gfx::Point* origin) const {
|
| - origin->set_x(title_->x() + 10);
|
| + origin->set_x(title_bounds_.x() + 10);
|
| origin->set_y(-views::TooltipManager::GetTooltipHeight() - 4);
|
| return true;
|
| }
|
| @@ -989,6 +983,14 @@
|
| ////////////////////////////////////////////////////////////////////////////////
|
| // Tab, private
|
|
|
| +const gfx::Rect& Tab::GetTitleBounds() const {
|
| + return title_bounds_;
|
| +}
|
| +
|
| +const gfx::Rect& Tab::GetIconBounds() const {
|
| + return favicon_bounds_;
|
| +}
|
| +
|
| void Tab::MaybeAdjustLeftForMiniTab(gfx::Rect* bounds) const {
|
| if (!data().mini || width() >= kMiniTabRendererAsNormalTabWidth)
|
| return;
|
| @@ -1026,13 +1028,13 @@
|
|
|
| PaintTabBackground(canvas);
|
|
|
| - const SkColor title_color = GetThemeProvider()->GetColor(IsSelected() ?
|
| - ThemeProperties::COLOR_TAB_TEXT :
|
| - ThemeProperties::COLOR_BACKGROUND_TAB_TEXT);
|
| - if (!data().mini || width() > kMiniTabRendererAsNormalTabWidth) {
|
| - title_->SetEnabledColor(title_color);
|
| - title_->Paint(canvas, views::CullSet());
|
| - }
|
| + SkColor title_color = GetThemeProvider()->
|
| + GetColor(IsSelected() ?
|
| + ThemeProperties::COLOR_TAB_TEXT :
|
| + ThemeProperties::COLOR_BACKGROUND_TAB_TEXT);
|
| +
|
| + if (!data().mini || width() > kMiniTabRendererAsNormalTabWidth)
|
| + PaintTitle(canvas, title_color);
|
|
|
| if (show_icon)
|
| PaintIcon(canvas);
|
| @@ -1329,7 +1331,7 @@
|
| }
|
|
|
| void Tab::PaintIcon(gfx::Canvas* canvas) {
|
| - gfx::Rect bounds = favicon_bounds_;
|
| + gfx::Rect bounds = GetIconBounds();
|
| if (bounds.IsEmpty())
|
| return;
|
|
|
| @@ -1353,9 +1355,9 @@
|
| gfx::ImageSkia crashed_favicon(*rb.GetImageSkiaNamed(IDR_SAD_FAVICON));
|
| bounds.set_y(bounds.y() + favicon_hiding_offset_);
|
| DrawIconCenter(canvas, crashed_favicon, 0,
|
| - crashed_favicon.width(),
|
| - crashed_favicon.height(),
|
| - bounds, true, SkPaint());
|
| + crashed_favicon.width(),
|
| + crashed_favicon.height(),
|
| + bounds, true, SkPaint());
|
| } else if (!data().favicon.isNull()) {
|
| // Paint the normal favicon.
|
| DrawIconCenter(canvas, data().favicon, 0,
|
| @@ -1385,6 +1387,21 @@
|
| DrawIconAtLocation(canvas, media_indicator_image, 0,
|
| bounds.x(), bounds.y(), media_indicator_image.width(),
|
| media_indicator_image.height(), true, paint);
|
| +}
|
| +
|
| +void Tab::PaintTitle(gfx::Canvas* canvas, SkColor title_color) {
|
| + // Paint the Title.
|
| + base::string16 title = data().title;
|
| + if (title.empty()) {
|
| + title = data().loading ?
|
| + l10n_util::GetStringUTF16(IDS_TAB_LOADING_TITLE) :
|
| + CoreTabHelper::GetDefaultTitle();
|
| + } else {
|
| + Browser::FormatTitleForDisplay(&title);
|
| + }
|
| +
|
| + canvas->DrawFadedString(title, gfx::FontList(*font_), title_color,
|
| + GetTitleBounds(), 0);
|
| }
|
|
|
| void Tab::AdvanceLoadingAnimation(TabRendererData::NetworkState old_state,
|
| @@ -1529,11 +1546,12 @@
|
| }
|
|
|
| void Tab::ScheduleIconPaint() {
|
| - gfx::Rect bounds = favicon_bounds_;
|
| + gfx::Rect bounds = GetIconBounds();
|
| if (bounds.IsEmpty())
|
| return;
|
|
|
| - // Extends the area to the bottom when sad_favicon is animating.
|
| + // Extends the area to the bottom when sad_favicon is
|
| + // animating.
|
| if (IsPerformingCrashAnimation())
|
| bounds.set_height(height() - bounds.y());
|
| bounds.set_x(GetMirroredXForRect(bounds));
|
| @@ -1577,6 +1595,11 @@
|
| return;
|
|
|
| initialized = true;
|
| +
|
| + ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
|
| + font_ = new gfx::Font(rb.GetFont(ui::ResourceBundle::BaseFont));
|
| + font_height_ = font_->GetHeight();
|
| +
|
| image_cache_ = new ImageCache();
|
|
|
| // Load the tab images once now, and maybe again later if the theme changes.
|
|
|