| OLD | NEW |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <limits> | 5 #include <limits> |
| 6 | 6 |
| 7 #include "chrome/browser/views/tabs/tab_renderer.h" | 7 #include "chrome/browser/views/tabs/tab_renderer.h" |
| 8 | 8 |
| 9 #include "chrome/browser/browser.h" | 9 #include "chrome/browser/browser.h" |
| 10 #include "chrome/browser/profile.h" | 10 #include "chrome/browser/profile.h" |
| 11 #include "chrome/browser/tab_contents/tab_contents.h" | 11 #include "chrome/browser/tab_contents/tab_contents.h" |
| 12 #include "chrome/browser/tabs/tab_strip_model.h" | 12 #include "chrome/browser/tabs/tab_strip_model.h" |
| 13 #include "chrome/common/gfx/chrome_canvas.h" | 13 #include "chrome/common/gfx/chrome_canvas.h" |
| 14 #include "chrome/common/gfx/chrome_font.h" | 14 #include "chrome/common/gfx/chrome_font.h" |
| 15 #include "chrome/common/l10n_util.h" | 15 #include "chrome/common/l10n_util.h" |
| 16 #include "chrome/common/resource_bundle.h" | 16 #include "chrome/common/resource_bundle.h" |
| 17 #include "chrome/common/win_util.h" | 17 #include "chrome/common/win_util.h" |
| 18 #include "chrome/views/window.h" |
| 18 #include "grit/generated_resources.h" | 19 #include "grit/generated_resources.h" |
| 19 #include "grit/theme_resources.h" | 20 #include "grit/theme_resources.h" |
| 20 #include "skia/ext/image_operations.h" | 21 #include "skia/ext/image_operations.h" |
| 21 | 22 |
| 22 static const int kLeftPadding = 16; | 23 static const int kLeftPadding = 16; |
| 23 static const int kTopPadding = 6; | 24 static const int kTopPadding = 6; |
| 24 static const int kRightPadding = 15; | 25 static const int kRightPadding = 15; |
| 25 static const int kBottomPadding = 5; | 26 static const int kBottomPadding = 5; |
| 26 static const int kFavIconTitleSpacing = 4; | 27 static const int kFavIconTitleSpacing = 4; |
| 27 static const int kTitleCloseButtonSpacing = 5; | 28 static const int kTitleCloseButtonSpacing = 5; |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 71 static SkBitmap* crashed_fav_icon = NULL; | 72 static SkBitmap* crashed_fav_icon = NULL; |
| 72 static int loading_animation_frame_count = 0; | 73 static int loading_animation_frame_count = 0; |
| 73 static int waiting_animation_frame_count = 0; | 74 static int waiting_animation_frame_count = 0; |
| 74 static int waiting_to_loading_frame_count_ratio = 0; | 75 static int waiting_to_loading_frame_count_ratio = 0; |
| 75 static SkBitmap* download_icon = NULL; | 76 static SkBitmap* download_icon = NULL; |
| 76 static int download_icon_width = 0; | 77 static int download_icon_width = 0; |
| 77 static int download_icon_height = 0; | 78 static int download_icon_height = 0; |
| 78 | 79 |
| 79 namespace { | 80 namespace { |
| 80 | 81 |
| 82 // Loads the images to be used for the tab background. Uses the images for |
| 83 // Vista if |use_vista_images| is true. |
| 84 void LoadTabImages(bool use_vista_images) { |
| 85 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
| 86 if (use_vista_images) { |
| 87 tab_inactive_l = rb.GetBitmapNamed(IDR_TAB_INACTIVE_LEFT_V); |
| 88 tab_inactive_c = rb.GetBitmapNamed(IDR_TAB_INACTIVE_CENTER_V); |
| 89 tab_inactive_r = rb.GetBitmapNamed(IDR_TAB_INACTIVE_RIGHT_V); |
| 90 |
| 91 // Our Vista frame doesn't change background color to show OTR, |
| 92 // so we continue to use the existing background tabs. |
| 93 tab_inactive_otr_l = rb.GetBitmapNamed(IDR_TAB_INACTIVE_LEFT_V); |
| 94 tab_inactive_otr_c = rb.GetBitmapNamed(IDR_TAB_INACTIVE_CENTER_V); |
| 95 tab_inactive_otr_r = rb.GetBitmapNamed(IDR_TAB_INACTIVE_RIGHT_V); |
| 96 } else { |
| 97 tab_inactive_l = rb.GetBitmapNamed(IDR_TAB_INACTIVE_LEFT); |
| 98 tab_inactive_c = rb.GetBitmapNamed(IDR_TAB_INACTIVE_CENTER); |
| 99 tab_inactive_r = rb.GetBitmapNamed(IDR_TAB_INACTIVE_RIGHT); |
| 100 |
| 101 tab_inactive_otr_l = rb.GetBitmapNamed(IDR_TAB_INACTIVE_LEFT_OTR); |
| 102 tab_inactive_otr_c = rb.GetBitmapNamed(IDR_TAB_INACTIVE_CENTER_OTR); |
| 103 tab_inactive_otr_r = rb.GetBitmapNamed(IDR_TAB_INACTIVE_RIGHT_OTR); |
| 104 } |
| 105 } |
| 106 |
| 81 void InitResources() { | 107 void InitResources() { |
| 82 static bool initialized = false; | 108 static bool initialized = false; |
| 83 if (!initialized) { | 109 if (!initialized) { |
| 84 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); | 110 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
| 85 title_font = rb.GetFont(ResourceBundle::BaseFont); | 111 title_font = rb.GetFont(ResourceBundle::BaseFont); |
| 86 title_font_height = title_font.height(); | 112 title_font_height = title_font.height(); |
| 87 | 113 |
| 88 close_button_n = rb.GetBitmapNamed(IDR_TAB_CLOSE); | 114 close_button_n = rb.GetBitmapNamed(IDR_TAB_CLOSE); |
| 89 close_button_h = rb.GetBitmapNamed(IDR_TAB_CLOSE_H); | 115 close_button_h = rb.GetBitmapNamed(IDR_TAB_CLOSE_H); |
| 90 close_button_p = rb.GetBitmapNamed(IDR_TAB_CLOSE_P); | 116 close_button_p = rb.GetBitmapNamed(IDR_TAB_CLOSE_P); |
| 91 close_button_width = close_button_n->width(); | 117 close_button_width = close_button_n->width(); |
| 92 close_button_height = close_button_n->height(); | 118 close_button_height = close_button_n->height(); |
| 93 | 119 |
| 94 tab_active_l = rb.GetBitmapNamed(IDR_TAB_ACTIVE_LEFT); | 120 tab_active_l = rb.GetBitmapNamed(IDR_TAB_ACTIVE_LEFT); |
| 95 tab_active_c = rb.GetBitmapNamed(IDR_TAB_ACTIVE_CENTER); | 121 tab_active_c = rb.GetBitmapNamed(IDR_TAB_ACTIVE_CENTER); |
| 96 tab_active_r = rb.GetBitmapNamed(IDR_TAB_ACTIVE_RIGHT); | 122 tab_active_r = rb.GetBitmapNamed(IDR_TAB_ACTIVE_RIGHT); |
| 97 tab_active_l_width = tab_active_l->width(); | 123 tab_active_l_width = tab_active_l->width(); |
| 98 tab_active_r_width = tab_active_r->width(); | 124 tab_active_r_width = tab_active_r->width(); |
| 99 | 125 |
| 100 if (win_util::ShouldUseVistaFrame()) { | 126 LoadTabImages(win_util::ShouldUseVistaFrame()); |
| 101 tab_inactive_l = rb.GetBitmapNamed(IDR_TAB_INACTIVE_LEFT_V); | |
| 102 tab_inactive_c = rb.GetBitmapNamed(IDR_TAB_INACTIVE_CENTER_V); | |
| 103 tab_inactive_r = rb.GetBitmapNamed(IDR_TAB_INACTIVE_RIGHT_V); | |
| 104 | |
| 105 // Our Vista frame doesn't change background color to show OTR, | |
| 106 // so we continue to use the existing background tabs. | |
| 107 tab_inactive_otr_l = rb.GetBitmapNamed(IDR_TAB_INACTIVE_LEFT_V); | |
| 108 tab_inactive_otr_c = rb.GetBitmapNamed(IDR_TAB_INACTIVE_CENTER_V); | |
| 109 tab_inactive_otr_r = rb.GetBitmapNamed(IDR_TAB_INACTIVE_RIGHT_V); | |
| 110 } else { | |
| 111 tab_inactive_l = rb.GetBitmapNamed(IDR_TAB_INACTIVE_LEFT); | |
| 112 tab_inactive_c = rb.GetBitmapNamed(IDR_TAB_INACTIVE_CENTER); | |
| 113 tab_inactive_r = rb.GetBitmapNamed(IDR_TAB_INACTIVE_RIGHT); | |
| 114 | |
| 115 tab_inactive_otr_l = rb.GetBitmapNamed(IDR_TAB_INACTIVE_LEFT_OTR); | |
| 116 tab_inactive_otr_c = rb.GetBitmapNamed(IDR_TAB_INACTIVE_CENTER_OTR); | |
| 117 tab_inactive_otr_r = rb.GetBitmapNamed(IDR_TAB_INACTIVE_RIGHT_OTR); | |
| 118 } | |
| 119 | 127 |
| 120 tab_hover_l = rb.GetBitmapNamed(IDR_TAB_HOVER_LEFT); | 128 tab_hover_l = rb.GetBitmapNamed(IDR_TAB_HOVER_LEFT); |
| 121 tab_hover_c = rb.GetBitmapNamed(IDR_TAB_HOVER_CENTER); | 129 tab_hover_c = rb.GetBitmapNamed(IDR_TAB_HOVER_CENTER); |
| 122 tab_hover_r = rb.GetBitmapNamed(IDR_TAB_HOVER_RIGHT); | 130 tab_hover_r = rb.GetBitmapNamed(IDR_TAB_HOVER_RIGHT); |
| 123 | 131 |
| 124 tab_inactive_l_width = tab_inactive_l->width(); | 132 tab_inactive_l_width = tab_inactive_l->width(); |
| 125 tab_inactive_r_width = tab_inactive_r->width(); | 133 tab_inactive_r_width = tab_inactive_r->width(); |
| 126 | 134 |
| 127 // The loading animation image is a strip of states. Each state must be | 135 // The loading animation image is a strip of states. Each state must be |
| 128 // square, so the height must divide the width evenly. | 136 // square, so the height must divide the width evenly. |
| (...skipping 399 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 528 void TabRenderer::OnMouseEntered(const views::MouseEvent& e) { | 536 void TabRenderer::OnMouseEntered(const views::MouseEvent& e) { |
| 529 hover_animation_->SetTweenType(SlideAnimation::EASE_OUT); | 537 hover_animation_->SetTweenType(SlideAnimation::EASE_OUT); |
| 530 hover_animation_->Show(); | 538 hover_animation_->Show(); |
| 531 } | 539 } |
| 532 | 540 |
| 533 void TabRenderer::OnMouseExited(const views::MouseEvent& e) { | 541 void TabRenderer::OnMouseExited(const views::MouseEvent& e) { |
| 534 hover_animation_->SetTweenType(SlideAnimation::EASE_IN); | 542 hover_animation_->SetTweenType(SlideAnimation::EASE_IN); |
| 535 hover_animation_->Hide(); | 543 hover_animation_->Hide(); |
| 536 } | 544 } |
| 537 | 545 |
| 546 void TabRenderer::ThemeChanged() { |
| 547 if (GetWidget() && GetWidget()->AsWindow()) |
| 548 LoadTabImages(GetWidget()->AsWindow()->UseNativeFrame()); |
| 549 View::ThemeChanged(); |
| 550 } |
| 551 |
| 538 /////////////////////////////////////////////////////////////////////////////// | 552 /////////////////////////////////////////////////////////////////////////////// |
| 539 // TabRenderer, AnimationDelegate implementation: | 553 // TabRenderer, AnimationDelegate implementation: |
| 540 | 554 |
| 541 void TabRenderer::AnimationProgressed(const Animation* animation) { | 555 void TabRenderer::AnimationProgressed(const Animation* animation) { |
| 542 SchedulePaint(); | 556 SchedulePaint(); |
| 543 } | 557 } |
| 544 | 558 |
| 545 void TabRenderer::AnimationCanceled(const Animation* animation) { | 559 void TabRenderer::AnimationCanceled(const Animation* animation) { |
| 546 AnimationEnded(animation); | 560 AnimationEnded(animation); |
| 547 } | 561 } |
| (...skipping 11 matching lines...) Expand all Loading... |
| 559 // as not being selected, so is_drag_clone_ ensures that we always paint | 573 // as not being selected, so is_drag_clone_ ensures that we always paint |
| 560 // the active representation for the dragged tab. | 574 // the active representation for the dragged tab. |
| 561 PaintActiveTabBackground(canvas); | 575 PaintActiveTabBackground(canvas); |
| 562 } else { | 576 } else { |
| 563 // Draw our hover state. | 577 // Draw our hover state. |
| 564 Animation* animation = hover_animation_.get(); | 578 Animation* animation = hover_animation_.get(); |
| 565 if (pulse_animation_->IsAnimating()) | 579 if (pulse_animation_->IsAnimating()) |
| 566 animation = pulse_animation_.get(); | 580 animation = pulse_animation_.get(); |
| 567 if (animation->GetCurrentValue() > 0) { | 581 if (animation->GetCurrentValue() > 0) { |
| 568 PaintHoverTabBackground(canvas, animation->GetCurrentValue() * | 582 PaintHoverTabBackground(canvas, animation->GetCurrentValue() * |
| 569 (win_util::ShouldUseVistaFrame() ? | 583 (GetWidget()->AsWindow()->UseNativeFrame() ? |
| 570 kHoverOpacityVista : kHoverOpacity)); | 584 kHoverOpacityVista : kHoverOpacity)); |
| 571 } else { | 585 } else { |
| 572 PaintInactiveTabBackground(canvas); | 586 PaintInactiveTabBackground(canvas); |
| 573 } | 587 } |
| 574 } | 588 } |
| 575 } | 589 } |
| 576 | 590 |
| 577 void TabRenderer::PaintInactiveTabBackground(ChromeCanvas* canvas) { | 591 void TabRenderer::PaintInactiveTabBackground(ChromeCanvas* canvas) { |
| 578 bool is_otr = data_.off_the_record; | 592 bool is_otr = data_.off_the_record; |
| 579 canvas->DrawBitmapInt(is_otr ? *tab_inactive_otr_l : *tab_inactive_l, 0, 0); | 593 canvas->DrawBitmapInt(is_otr ? *tab_inactive_otr_l : *tab_inactive_l, 0, 0); |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 680 } | 694 } |
| 681 | 695 |
| 682 void TabRenderer::DisplayCrashedFavIcon() { | 696 void TabRenderer::DisplayCrashedFavIcon() { |
| 683 should_display_crashed_favicon_ = true; | 697 should_display_crashed_favicon_ = true; |
| 684 } | 698 } |
| 685 | 699 |
| 686 void TabRenderer::ResetCrashedFavIcon() { | 700 void TabRenderer::ResetCrashedFavIcon() { |
| 687 should_display_crashed_favicon_ = false; | 701 should_display_crashed_favicon_ = false; |
| 688 } | 702 } |
| 689 | 703 |
| OLD | NEW |