summaryrefslogtreecommitdiffstats
path: root/chrome/browser/views/tabs/tab_2.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/views/tabs/tab_2.cc')
-rw-r--r--chrome/browser/views/tabs/tab_2.cc685
1 files changed, 0 insertions, 685 deletions
diff --git a/chrome/browser/views/tabs/tab_2.cc b/chrome/browser/views/tabs/tab_2.cc
deleted file mode 100644
index 8cfe8a5..0000000
--- a/chrome/browser/views/tabs/tab_2.cc
+++ /dev/null
@@ -1,685 +0,0 @@
-// Copyright (c) 2009 The Chromium Authors. All rights reserved. Use of this
-// source code is governed by a BSD-style license that can be found in the
-// LICENSE file.
-
-#include "chrome/browser/views/tabs/tab_2.h"
-
-#include "app/gfx/canvas.h"
-#include "app/gfx/font.h"
-#include "app/gfx/path.h"
-#include "app/gfx/skbitmap_operations.h"
-#include "app/l10n_util.h"
-#include "app/resource_bundle.h"
-#include "app/slide_animation.h"
-#include "app/throb_animation.h"
-#include "base/string_util.h"
-#include "chrome/browser/browser.h" // required for FormatTitleForDisplay.
-#include "chrome/browser/browser_theme_provider.h"
-#include "grit/app_resources.h"
-#include "grit/generated_resources.h"
-#include "grit/theme_resources.h"
-#include "views/animator.h"
-#include "views/controls/button/image_button.h"
-#include "views/widget/widget.h"
-#include "views/window/non_client_view.h"
-#include "views/window/window.h"
-
-static const SkScalar kTabCapWidth = 15;
-static const SkScalar kTabTopCurveWidth = 4;
-static const SkScalar kTabBottomCurveWidth = 3;
-
-// Space between the edges of the tab's bounds and its content.
-static const int kLeftPadding = 16;
-static const int kTopPadding = 6;
-static const int kRightPadding = 15;
-static const int kBottomPadding = 5;
-
-// The height of the "drop shadow" drawn across the top of the tab. We allow
-// the containing window to consider this region part of the window caption
-// rather than the tab, since we are otherwise starved for drag area.
-static const int kDropShadowHeight = 2;
-
-// By how much the bottom edge of the tab overlaps the top of the toolbar.
-static const int kToolbarOverlap = 1;
-
-// The space between the tab icon and the title.
-static const int kIconTitleSpacing = 4;
-
-// The space between the tab title and the close button.
-static const int kTitleCloseButtonSpacing = 5;
-
-// The ideal width of a tab, provided sufficient width is available.
-static const int kStandardTitleWidth = 175;
-
-// TODO(beng): figure out what these are used for.
-static const int kCloseButtonVertFuzz = 0;
-static const int kCloseButtonHorzFuzz = 5;
-
-// The size (both width and height) of the tab icon.
-static const int kIconSize = 16;
-
-// The color of the text painted in tabs.
-static const int kSelectedTitleColor = SK_ColorBLACK;
-
-// How long the hover state takes.
-static const int kHoverDurationMs = 90;
-
-// How long the pulse throb takes.
-static const int kPulseDurationMs = 200;
-
-// How opaque to make the hover state (out of 1).
-static const double kHoverOpacity = 0.33;
-
-// Resources for rendering tabs.
-static gfx::Font* title_font = NULL;
-static int title_font_height = 0;
-static SkBitmap* close_button_n = NULL;
-static SkBitmap* close_button_h = NULL;
-static SkBitmap* close_button_p = NULL;
-static int close_button_height = 0;
-static int close_button_width = 0;
-
-static SkBitmap* waiting_animation_frames = NULL;
-static SkBitmap* loading_animation_frames = NULL;
-static SkBitmap* crashed_icon = NULL;
-static int loading_animation_frame_count = 0;
-static int waiting_animation_frame_count = 0;
-static int waiting_to_loading_frame_count_ratio = 0;
-
-Tab2::TabImage Tab2::tab_alpha_ = {0};
-Tab2::TabImage Tab2::tab_active_ = {0};
-Tab2::TabImage Tab2::tab_inactive_ = {0};
-
-namespace {
-
-////////////////////////////////////////////////////////////////////////////////
-// TabCloseButton
-//
-// This is a Button subclass that causes middle clicks to be forwarded to the
-// parent View by explicitly not handling them in OnMousePressed.
-class TabCloseButton : public views::ImageButton {
- public:
- explicit TabCloseButton(views::ButtonListener* listener)
- : views::ImageButton(listener) {
- }
- virtual ~TabCloseButton() {}
-
- virtual bool OnMousePressed(const views::MouseEvent& event) {
- bool handled = ImageButton::OnMousePressed(event);
- // Explicitly mark midle-mouse clicks as non-handled to ensure the tab
- // sees them.
- return event.IsOnlyMiddleMouseButton() ? false : handled;
- }
-
- // We need to let the parent know about mouse state so that it
- // can highlight itself appropriately. Note that Exit events
- // fire before Enter events, so this works.
- virtual void OnMouseEntered(const views::MouseEvent& event) {
- ImageButton::OnMouseEntered(event);
- GetParent()->OnMouseEntered(event);
- }
-
- virtual void OnMouseExited(const views::MouseEvent& event) {
- ImageButton::OnMouseExited(event);
- GetParent()->OnMouseExited(event);
- }
-
- private:
- DISALLOW_COPY_AND_ASSIGN(TabCloseButton);
-};
-
-void InitResources() {
- static bool initialized = false;
- if (!initialized) {
- // TODO(glen): Allow theming of these.
- ResourceBundle& rb = ResourceBundle::GetSharedInstance();
- title_font = new gfx::Font(rb.GetFont(ResourceBundle::BaseFont));
- title_font_height = title_font->height();
-
- close_button_n = rb.GetBitmapNamed(IDR_TAB_CLOSE);
- close_button_h = rb.GetBitmapNamed(IDR_TAB_CLOSE_H);
- close_button_p = rb.GetBitmapNamed(IDR_TAB_CLOSE_P);
- close_button_width = close_button_n->width();
- close_button_height = close_button_n->height();
-
- Tab2::LoadTabImages();
-
- // The loading animation image is a strip of states. Each state must be
- // square, so the height must divide the width evenly.
- loading_animation_frames = rb.GetBitmapNamed(IDR_THROBBER);
- DCHECK(loading_animation_frames);
- DCHECK(loading_animation_frames->width() %
- loading_animation_frames->height() == 0);
- loading_animation_frame_count =
- loading_animation_frames->width() / loading_animation_frames->height();
-
- waiting_animation_frames = rb.GetBitmapNamed(IDR_THROBBER_WAITING);
- DCHECK(waiting_animation_frames);
- DCHECK(waiting_animation_frames->width() %
- waiting_animation_frames->height() == 0);
- waiting_animation_frame_count =
- waiting_animation_frames->width() / waiting_animation_frames->height();
-
- waiting_to_loading_frame_count_ratio =
- waiting_animation_frame_count / loading_animation_frame_count;
-
- crashed_icon = rb.GetBitmapNamed(IDR_SAD_FAVICON);
-
- initialized = true;
- }
-}
-
-int GetContentHeight() {
- // The height of the content of the Tab is the largest of the icon,
- // the title text and the close button graphic.
- int content_height = std::max(kIconSize, title_font_height);
- return std::max(content_height, close_button_height);
-}
-
-} // namespace
-
-////////////////////////////////////////////////////////////////////////////////
-// Tab2, public:
-
-Tab2::Tab2(Tab2Model* model)
- : model_(model),
- dragging_(false),
- removing_(false) {
- InitResources();
-
- // Add the Close Button.
- close_button_ = new TabCloseButton(this);
- close_button_->SetImage(views::CustomButton::BS_NORMAL, close_button_n);
- close_button_->SetImage(views::CustomButton::BS_HOT, close_button_h);
- close_button_->SetImage(views::CustomButton::BS_PUSHED, close_button_p);
- AddChildView(close_button_);
-
- hover_animation_.reset(new SlideAnimation(this));
- hover_animation_->SetSlideDuration(kHoverDurationMs);
-
- pulse_animation_.reset(new ThrobAnimation(this));
- pulse_animation_->SetSlideDuration(kPulseDurationMs);
-}
-
-Tab2::~Tab2() {
-}
-
-void Tab2::SetRemovingModel(Tab2Model* model) {
- removing_model_.reset(model);
- model_ = removing_model_.get();
-}
-
-bool Tab2::IsAnimating() const {
- return animator_.get() && animator_->IsAnimating();
-}
-
-views::Animator* Tab2::GetAnimator() {
- if (!animator_.get())
- animator_.reset(new views::Animator(this, model_->AsAnimatorDelegate()));
- return animator_.get();
-}
-
-// static
-gfx::Size Tab2::GetMinimumUnselectedSize() {
- InitResources();
-
- gfx::Size minimum_size;
- minimum_size.set_width(kLeftPadding + kRightPadding);
- // Since we use bitmap images, the real minimum height of the image is
- // defined most accurately by the height of the end cap images.
- minimum_size.set_height(tab_active_.image_l->height());
- return minimum_size;
-}
-
-// static
-gfx::Size Tab2::GetMinimumSelectedSize() {
- gfx::Size minimum_size = GetMinimumUnselectedSize();
- minimum_size.set_width(kLeftPadding + kIconSize + kRightPadding);
- return minimum_size;
-}
-
-// static
-gfx::Size Tab2::GetStandardSize() {
- gfx::Size standard_size = GetMinimumUnselectedSize();
- standard_size.set_width(
- standard_size.width() + kIconTitleSpacing + kStandardTitleWidth);
- return standard_size;
-}
-
-void Tab2::AddTabShapeToPath(gfx::Path* path) const {
- SkScalar h = SkIntToScalar(height());
- SkScalar w = SkIntToScalar(width());
-
- path->moveTo(0, h);
-
- // Left end cap.
- path->lineTo(kTabBottomCurveWidth, h - kTabBottomCurveWidth);
- path->lineTo(kTabCapWidth - kTabTopCurveWidth, kTabTopCurveWidth);
- path->lineTo(kTabCapWidth, 0);
-
- // Connect to the right cap.
- path->lineTo(w - kTabCapWidth, 0);
-
- // Right end cap.
- path->lineTo(w - kTabCapWidth + kTabTopCurveWidth, kTabTopCurveWidth);
- path->lineTo(w - kTabBottomCurveWidth, h - kTabBottomCurveWidth);
- path->lineTo(w, h);
-
- // Close out the path.
- path->lineTo(0, h);
- path->close();
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Tab2, views::ButtonListener implementation:
-
-void Tab2::ButtonPressed(views::Button* sender, const views::Event& event) {
- if (sender == close_button_)
- model_->CloseTab(this);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// Tab2, views::View overrides:
-
-void Tab2::Layout() {
- gfx::Rect content_rect = GetLocalBounds(false);
- if (content_rect.IsEmpty())
- return;
- content_rect.Inset(kLeftPadding, kTopPadding, kRightPadding, kBottomPadding);
-
- int content_height = GetContentHeight();
- LayoutIcon(content_height, content_rect);
- LayoutCloseButton(content_height, content_rect);
- LayoutTitle(content_height, content_rect);
-}
-
-void Tab2::Paint(gfx::Canvas* canvas) {
- // Don't paint if we're narrower than we can render correctly. (This should
- // only happen during animations).
- if (width() < GetMinimumUnselectedSize().width())
- return;
-
- PaintTabBackground(canvas);
- if (ShouldShowIcon())
- PaintIcon(canvas);
- PaintTitle(canvas);
-}
-
-void Tab2::OnMouseEntered(const views::MouseEvent& e) {
- hover_animation_->SetTweenType(SlideAnimation::EASE_OUT);
- hover_animation_->Show();
-}
-
-void Tab2::OnMouseExited(const views::MouseEvent& e) {
- hover_animation_->SetTweenType(SlideAnimation::EASE_IN);
- hover_animation_->Hide();
-}
-
-bool Tab2::OnMousePressed(const views::MouseEvent& event) {
- if (event.IsLeftMouseButton()) {
- model_->SelectTab(this);
- model_->CaptureDragInfo(this, event);
- }
- return true;
-}
-
-bool Tab2::OnMouseDragged(const views::MouseEvent& event) {
- dragging_ = true;
- return model_->DragTab(this, event);
-}
-
-void Tab2::OnMouseReleased(const views::MouseEvent& event, bool canceled) {
- if (dragging_) {
- dragging_ = false;
- model_->DragEnded(this);
- }
-}
-
-void Tab2::ThemeChanged() {
- LoadTabImages();
- View::ThemeChanged();
-}
-
-void Tab2::ViewHierarchyChanged(bool is_add, views::View* parent,
- views::View* child) {
- if (parent->GetThemeProvider())
- theme_provider_ = parent->GetThemeProvider();
-}
-
-ThemeProvider* Tab2::GetThemeProvider() {
- ThemeProvider* provider = View::GetThemeProvider();
- if (provider)
- return provider;
-
- if (theme_provider_)
- return theme_provider_;
-
- // return contents->profile()->GetThemeProvider();
- NOTREACHED() << "Unable to find a theme provider";
- return NULL;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// Tab2, views::AnimationDelegate implementation:
-
-void Tab2::AnimationProgressed(const Animation* animation) {
- SchedulePaint();
-}
-
-void Tab2::AnimationCanceled(const Animation* animation) {
- AnimationEnded(animation);
-}
-
-void Tab2::AnimationEnded(const Animation* animation) {
- SchedulePaint();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// Tab2, private:
-
-void Tab2::LayoutIcon(int content_height, const gfx::Rect& content_rect) {
- showing_icon_ = ShouldShowIcon();
- if (showing_icon_) {
- int icon_y = kTopPadding + (content_height - kIconSize) / 2;
- icon_bounds_.SetRect(content_rect.x(), icon_y, kIconSize, kIconSize);
- } else {
- icon_bounds_.SetRect(content_rect.x(), content_rect.y(), 0, 0);
- }
-
- // Since we paint the icon manually instead of using a child view, we need
- // to adjust its bounds for RTL.
- icon_bounds_.set_x(MirroredLeftPointForRect(icon_bounds_));
-}
-
-void Tab2::LayoutCloseButton(int content_height,
- const gfx::Rect& content_rect) {
- showing_close_button_ = ShouldShowCloseBox();
- if (showing_close_button_) {
- int close_button_top =
- kTopPadding + kCloseButtonVertFuzz +
- (content_height - close_button_height) / 2;
- // If the ratio of the close button size to tab width exceeds the maximum.
- close_button_->SetBounds(content_rect.width() + kCloseButtonHorzFuzz,
- close_button_top, close_button_width,
- close_button_height);
- close_button_->SetVisible(true);
- } else {
- close_button_->SetBounds(0, 0, 0, 0);
- close_button_->SetVisible(false);
- }
-}
-
-void Tab2::LayoutTitle(int content_height, const gfx::Rect& content_rect) {
- // Size the Title text to fill the remaining space.
- int title_left = icon_bounds_.right() + kIconTitleSpacing;
- int title_top = kTopPadding + (content_height - title_font_height) / 2;
-
- // 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 + title_font_height + kBottomPadding;
- if (text_height > minimum_size.height())
- title_top -= (text_height - minimum_size.height()) / 2;
-
- int title_width;
- if (close_button_->IsVisible()) {
- title_width = std::max(close_button_->x() -
- kTitleCloseButtonSpacing - title_left, 0);
- } else {
- title_width = std::max(content_rect.width() - title_left, 0);
- }
- title_bounds_.SetRect(title_left, title_top, title_width, title_font_height);
-
- // Since we paint the title manually instead of using a child view, we need
- // to adjust its bounds for RTL.
- title_bounds_.set_x(MirroredLeftPointForRect(title_bounds_));
-}
-
-void Tab2::PaintIcon(gfx::Canvas* canvas) {
- if (animation_state_ != ANIMATION_NONE) {
- PaintLoadingAnimation(canvas);
- } else {
- canvas->save();
- canvas->ClipRectInt(0, 0, width(), height() - 4);
- SkBitmap icon = model_->GetIcon(this);
- if (!icon.isNull()) {
- // TODO(pkasting): Use code in tab_icon_view.cc:PaintIcon() (or switch
- // to using that class to render the icon).
- canvas->DrawBitmapInt(icon, 0, 0, icon.width(), icon.height(),
- icon_bounds_.x(),
- icon_bounds_.y() + icon_hiding_offset_,
- kIconSize, kIconSize, true);
- }
- canvas->restore();
- }
-}
-
-void Tab2::PaintTitle(gfx::Canvas* canvas) {
- // Paint the Title.
- string16 title = model_->GetTitle(this);
- if (title.empty()) {
- if (model_->IsLoading(this))
- title = l10n_util::GetStringUTF16(IDS_TAB_LOADING_TITLE);
- else
- title = l10n_util::GetStringUTF16(IDS_TAB_UNTITLED_TITLE);
- } else {
- Browser::FormatTitleForDisplay(&title);
- }
-
- SkColor title_color = GetThemeProvider()->
- GetColor(model_->IsSelected(this) ?
- BrowserThemeProvider::COLOR_TAB_TEXT :
- BrowserThemeProvider::COLOR_BACKGROUND_TAB_TEXT);
-
- canvas->DrawStringInt(UTF16ToWideHack(title), *title_font, title_color,
- title_bounds_.x(), title_bounds_.y(),
- title_bounds_.width(), title_bounds_.height());
-}
-
-void Tab2::PaintTabBackground(gfx::Canvas* canvas) {
- if (model_->IsSelected(this)) {
- // Sometimes detaching a tab quickly can result in the model reporting it
- // as not being selected, so is_drag_clone_ ensures that we always paint
- // the active representation for the dragged tab.
- PaintActiveTabBackground(canvas);
- } else {
- // Draw our hover state.
- Animation* animation = hover_animation_.get();
- if (pulse_animation_->IsAnimating())
- animation = pulse_animation_.get();
-
- PaintInactiveTabBackground(canvas);
- if (animation->GetCurrentValue() > 0) {
- SkRect bounds;
- bounds.set(0, 0, SkIntToScalar(width()), SkIntToScalar(height()));
- canvas->saveLayerAlpha(&bounds,
- static_cast<int>(animation->GetCurrentValue() * kHoverOpacity * 0xff),
- SkCanvas::kARGB_ClipLayer_SaveFlag);
- canvas->drawARGB(0, 255, 255, 255, SkXfermode::kClear_Mode);
- PaintActiveTabBackground(canvas);
- canvas->restore();
- }
- }
-}
-
-void Tab2::PaintInactiveTabBackground(gfx::Canvas* canvas) {
- bool is_otr = model_->IsIncognito(this);
-
- // The tab image needs to be lined up with the background image
- // so that it feels partially transparent. These offsets represent the tab
- // position within the frame background image.
- int offset = GetX(views::View::APPLY_MIRRORING_TRANSFORMATION) +
- background_offset_.x();
-
- int tab_id;
- if (GetWidget() &&
- GetWidget()->GetWindow()->GetNonClientView()->UseNativeFrame()) {
- tab_id = IDR_THEME_TAB_BACKGROUND_V;
- } else {
- tab_id = is_otr ? IDR_THEME_TAB_BACKGROUND_INCOGNITO :
- IDR_THEME_TAB_BACKGROUND;
- }
-
- SkBitmap* tab_bg = GetThemeProvider()->GetBitmapNamed(tab_id);
-
- // Draw left edge. Don't draw over the toolbar, as we're not the foreground
- // tab.
- SkBitmap tab_l = SkBitmapOperations::CreateTiledBitmap(
- *tab_bg, offset, background_offset_.y(), tab_active_.l_width, height());
- SkBitmap theme_l =
- SkBitmapOperations::CreateMaskedBitmap(tab_l, *tab_alpha_.image_l);
- canvas->DrawBitmapInt(theme_l,
- 0, 0, theme_l.width(), theme_l.height() - kToolbarOverlap,
- 0, 0, theme_l.width(), theme_l.height() - kToolbarOverlap,
- false);
-
- // Draw right edge. Again, don't draw over the toolbar.
- SkBitmap tab_r = SkBitmapOperations::CreateTiledBitmap(*tab_bg,
- offset + width() - tab_active_.r_width, background_offset_.y(),
- tab_active_.r_width, height());
- SkBitmap theme_r =
- SkBitmapOperations::CreateMaskedBitmap(tab_r, *tab_alpha_.image_r);
- canvas->DrawBitmapInt(theme_r,
- 0, 0, theme_r.width(), theme_r.height() - kToolbarOverlap,
- width() - theme_r.width(), 0, theme_r.width(),
- theme_r.height() - kToolbarOverlap, false);
-
- // Draw center. Instead of masking out the top portion we simply skip over it
- // by incrementing by kDropShadowHeight, since it's a simple rectangle. And
- // again, don't draw over the toolbar.
- canvas->TileImageInt(*tab_bg,
- offset + tab_active_.l_width, background_offset_.y() + kDropShadowHeight,
- tab_active_.l_width, kDropShadowHeight,
- width() - tab_active_.l_width - tab_active_.r_width,
- height() - kDropShadowHeight - kToolbarOverlap);
-
- // Now draw the highlights/shadows around the tab edge.
- canvas->DrawBitmapInt(*tab_inactive_.image_l, 0, 0);
- canvas->TileImageInt(*tab_inactive_.image_c,
- tab_inactive_.l_width, 0,
- width() - tab_inactive_.l_width - tab_inactive_.r_width,
- height());
- canvas->DrawBitmapInt(*tab_inactive_.image_r,
- width() - tab_inactive_.r_width, 0);
-}
-
-void Tab2::PaintActiveTabBackground(gfx::Canvas* canvas) {
- int offset = GetX(views::View::APPLY_MIRRORING_TRANSFORMATION) +
- background_offset_.x();
- ThemeProvider* tp = GetThemeProvider();
- if (!tp)
- NOTREACHED() << "Unable to get theme provider";
-
- SkBitmap* tab_bg = GetThemeProvider()->GetBitmapNamed(IDR_THEME_TOOLBAR);
-
- // Draw left edge.
- SkBitmap tab_l = SkBitmapOperations::CreateTiledBitmap(
- *tab_bg, offset, 0, tab_active_.l_width, height());
- SkBitmap theme_l =
- SkBitmapOperations::CreateMaskedBitmap(tab_l, *tab_alpha_.image_l);
- canvas->DrawBitmapInt(theme_l, 0, 0);
-
- // Draw right edge.
- SkBitmap tab_r = SkBitmapOperations::CreateTiledBitmap(*tab_bg,
- offset + width() - tab_active_.r_width, 0, tab_active_.r_width, height());
- SkBitmap theme_r =
- SkBitmapOperations::CreateMaskedBitmap(tab_r, *tab_alpha_.image_r);
- canvas->DrawBitmapInt(theme_r, width() - tab_active_.r_width, 0);
-
- // Draw center. Instead of masking out the top portion we simply skip over it
- // by incrementing by kDropShadowHeight, since it's a simple rectangle.
- canvas->TileImageInt(*tab_bg,
- offset + tab_active_.l_width, kDropShadowHeight,
- tab_active_.l_width, kDropShadowHeight,
- width() - tab_active_.l_width - tab_active_.r_width,
- height() - kDropShadowHeight);
-
- // Now draw the highlights/shadows around the tab edge.
- canvas->DrawBitmapInt(*tab_active_.image_l, 0, 0);
- canvas->TileImageInt(*tab_active_.image_c, tab_active_.l_width, 0,
- width() - tab_active_.l_width - tab_active_.r_width, height());
- canvas->DrawBitmapInt(*tab_active_.image_r, width() - tab_active_.r_width, 0);
-}
-
-void Tab2::PaintHoverTabBackground(gfx::Canvas* canvas, double opacity) {
- SkBitmap left = SkBitmapOperations::CreateBlendedBitmap(
- *tab_inactive_.image_l, *tab_active_.image_l, opacity);
- SkBitmap center = SkBitmapOperations::CreateBlendedBitmap(
- *tab_inactive_.image_c, *tab_active_.image_c, opacity);
- SkBitmap right = SkBitmapOperations::CreateBlendedBitmap(
- *tab_inactive_.image_r, *tab_active_.image_r, opacity);
-
- canvas->DrawBitmapInt(left, 0, 0);
- canvas->TileImageInt(center, tab_active_.l_width, 0,
- width() - tab_active_.l_width - tab_active_.r_width, height());
- canvas->DrawBitmapInt(right, width() - tab_active_.r_width, 0);
-}
-
-void Tab2::PaintLoadingAnimation(gfx::Canvas* canvas) {
- SkBitmap* frames = (animation_state_ == ANIMATION_WAITING) ?
- waiting_animation_frames : loading_animation_frames;
- int image_size = frames->height();
- int image_offset = animation_frame_ * image_size;
- int dst_y = (height() - image_size) / 2;
-
- // Just like with the Tab's title and icon, the position for the page
- // loading animation also needs to be mirrored if the View's UI layout is
- // right-to-left.
- int dst_x;
- if (UILayoutIsRightToLeft()) {
- dst_x = width() - kLeftPadding - image_size;
- } else {
- dst_x = kLeftPadding;
- }
- canvas->DrawBitmapInt(*frames, image_offset, 0, image_size,
- image_size, dst_x, dst_y, image_size, image_size,
- false);
-}
-
-int Tab2::IconCapacity() const {
- if (height() < GetMinimumUnselectedSize().height())
- return 0;
- return (width() - kLeftPadding - kRightPadding) / kIconSize;
-}
-
-bool Tab2::ShouldShowIcon() const {
- if (!model_->ShouldShowIcon(const_cast<Tab2*>(this))) {
- return false;
- } else if (model_->IsSelected(const_cast<Tab2*>(this))) {
- // The selected tab clips icon before close button.
- return IconCapacity() >= 2;
- }
- // Non-selected tabs clip close button before icon.
- return IconCapacity() >= 1;
-}
-
-bool Tab2::ShouldShowCloseBox() const {
- // The selected tab never clips close button.
- return model_->IsSelected(const_cast<Tab2*>(this)) || IconCapacity() >= 3;
-}
-
-// static
-void Tab2::LoadTabImages() {
- // We're not letting people override tab images just yet.
- ResourceBundle& rb = ResourceBundle::GetSharedInstance();
-
- tab_alpha_.image_l = rb.GetBitmapNamed(IDR_TAB_ALPHA_LEFT);
- tab_alpha_.image_r = rb.GetBitmapNamed(IDR_TAB_ALPHA_RIGHT);
-
- tab_active_.image_l = rb.GetBitmapNamed(IDR_TAB_ACTIVE_LEFT);
- tab_active_.image_c = rb.GetBitmapNamed(IDR_TAB_ACTIVE_CENTER);
- tab_active_.image_r = rb.GetBitmapNamed(IDR_TAB_ACTIVE_RIGHT);
- tab_active_.l_width = tab_active_.image_l->width();
- tab_active_.r_width = tab_active_.image_r->width();
-
- tab_inactive_.image_l = rb.GetBitmapNamed(IDR_TAB_INACTIVE_LEFT);
- tab_inactive_.image_c = rb.GetBitmapNamed(IDR_TAB_INACTIVE_CENTER);
- tab_inactive_.image_r = rb.GetBitmapNamed(IDR_TAB_INACTIVE_RIGHT);
-
- tab_inactive_.l_width = tab_inactive_.image_l->width();
- tab_inactive_.r_width = tab_inactive_.image_r->width();
-
- loading_animation_frames = rb.GetBitmapNamed(IDR_THROBBER);
- waiting_animation_frames = rb.GetBitmapNamed(IDR_THROBBER_WAITING);
-}