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 "chrome/browser/views/tabs/tab_strip.h" | 5 #include "chrome/browser/views/tabs/tab_strip.h" |
6 | 6 |
7 #include "app/drag_drop_types.h" | 7 #include "app/drag_drop_types.h" |
8 #include "app/gfx/canvas.h" | 8 #include "app/gfx/canvas.h" |
9 #include "app/gfx/path.h" | 9 #include "app/gfx/path.h" |
10 #include "app/l10n_util.h" | 10 #include "app/l10n_util.h" |
11 #include "app/os_exchange_data.h" | 11 #include "app/os_exchange_data.h" |
12 #include "app/resource_bundle.h" | 12 #include "app/resource_bundle.h" |
13 #include "app/slide_animation.h" | 13 #include "app/slide_animation.h" |
14 #if defined(OS_WIN) | 14 #if defined(OS_WIN) |
15 #include "app/win_util.h" | 15 #include "app/win_util.h" |
16 #endif | 16 #endif |
17 #include "base/gfx/size.h" | 17 #include "base/gfx/size.h" |
18 #include "base/stl_util-inl.h" | 18 #include "base/stl_util-inl.h" |
| 19 #include "chrome/browser/browser_theme_provider.h" |
19 #include "chrome/browser/metrics/user_metrics.h" | 20 #include "chrome/browser/metrics/user_metrics.h" |
20 #include "chrome/browser/profile.h" | 21 #include "chrome/browser/profile.h" |
21 #include "chrome/browser/tab_contents/tab_contents.h" | 22 #include "chrome/browser/tab_contents/tab_contents.h" |
22 #include "chrome/browser/tabs/tab_strip_model.h" | 23 #include "chrome/browser/tabs/tab_strip_model.h" |
23 #include "chrome/browser/view_ids.h" | 24 #include "chrome/browser/view_ids.h" |
24 #include "chrome/browser/views/tabs/dragged_tab_controller.h" | 25 #include "chrome/browser/views/tabs/dragged_tab_controller.h" |
25 #include "chrome/browser/views/tabs/tab.h" | 26 #include "chrome/browser/views/tabs/tab.h" |
26 #include "chrome/browser/tab_contents/tab_contents.h" | 27 #include "chrome/browser/tab_contents/tab_contents.h" |
27 #include "chrome/common/pref_names.h" | 28 #include "chrome/common/pref_names.h" |
28 #include "grit/generated_resources.h" | 29 #include "grit/generated_resources.h" |
29 #include "grit/theme_resources.h" | 30 #include "grit/theme_resources.h" |
30 #include "views/controls/image_view.h" | 31 #include "views/controls/image_view.h" |
31 #include "views/painter.h" | 32 #include "views/painter.h" |
| 33 #include "views/widget/default_theme_provider.h" |
32 #include "views/window/non_client_view.h" | 34 #include "views/window/non_client_view.h" |
33 #include "views/window/window.h" | 35 #include "views/window/window.h" |
34 | 36 |
35 #undef min | 37 #undef min |
36 #undef max | 38 #undef max |
37 | 39 |
38 using views::DropTargetEvent; | 40 using views::DropTargetEvent; |
39 | 41 |
40 static const int kDefaultAnimationDurationMs = 100; | 42 static const int kDefaultAnimationDurationMs = 100; |
41 static const int kResizeLayoutAnimationDurationMs = 166; | 43 static const int kResizeLayoutAnimationDurationMs = 166; |
(...skipping 546 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
588 } | 590 } |
589 } | 591 } |
590 } | 592 } |
591 | 593 |
592 void TabStrip::SetBackgroundOffset(gfx::Point offset) { | 594 void TabStrip::SetBackgroundOffset(gfx::Point offset) { |
593 int tab_count = GetTabCount(); | 595 int tab_count = GetTabCount(); |
594 for (int i = 0; i < tab_count; ++i) | 596 for (int i = 0; i < tab_count; ++i) |
595 GetTabAt(i)->SetBackgroundOffset(offset); | 597 GetTabAt(i)->SetBackgroundOffset(offset); |
596 } | 598 } |
597 | 599 |
| 600 void TabStrip::InitTabStripButtons() { |
| 601 newtab_button_ = new NewTabButton(this); |
| 602 LoadNewTabButtonImage(); |
| 603 newtab_button_->SetAccessibleName(l10n_util::GetString(IDS_ACCNAME_NEWTAB)); |
| 604 AddChildView(newtab_button_); |
| 605 } |
| 606 |
598 /////////////////////////////////////////////////////////////////////////////// | 607 /////////////////////////////////////////////////////////////////////////////// |
599 // TabStrip, views::View overrides: | 608 // TabStrip, views::View overrides: |
600 | 609 |
601 void TabStrip::PaintChildren(gfx::Canvas* canvas) { | 610 void TabStrip::PaintChildren(gfx::Canvas* canvas) { |
602 // Paint the tabs in reverse order, so they stack to the left. | 611 // Paint the tabs in reverse order, so they stack to the left. |
603 Tab* selected_tab = NULL; | 612 Tab* selected_tab = NULL; |
604 for (int i = GetTabCount() - 1; i >= 0; --i) { | 613 for (int i = GetTabCount() - 1; i >= 0; --i) { |
605 Tab* tab = GetTabAt(i); | 614 Tab* tab = GetTabAt(i); |
606 // We must ask the _Tab's_ model, not ourselves, because in some situations | 615 // We must ask the _Tab's_ model, not ourselves, because in some situations |
607 // the model will be different to this object, e.g. when a Tab is being | 616 // the model will be different to this object, e.g. when a Tab is being |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
761 return next_tab; | 770 return next_tab; |
762 Tab* tab = GetTabAt(i); | 771 Tab* tab = GetTabAt(i); |
763 if (IsPointInTab(tab, point)) | 772 if (IsPointInTab(tab, point)) |
764 return tab; | 773 return tab; |
765 } | 774 } |
766 | 775 |
767 // No need to do any floating view stuff, we don't use them in the TabStrip. | 776 // No need to do any floating view stuff, we don't use them in the TabStrip. |
768 return this; | 777 return this; |
769 } | 778 } |
770 | 779 |
| 780 void TabStrip::ThemeChanged() { |
| 781 LoadNewTabButtonImage(); |
| 782 } |
| 783 |
771 /////////////////////////////////////////////////////////////////////////////// | 784 /////////////////////////////////////////////////////////////////////////////// |
772 // TabStrip, TabStripModelObserver implementation: | 785 // TabStrip, TabStripModelObserver implementation: |
773 | 786 |
774 void TabStrip::TabInsertedAt(TabContents* contents, | 787 void TabStrip::TabInsertedAt(TabContents* contents, |
775 int index, | 788 int index, |
776 bool foreground) { | 789 bool foreground) { |
777 DCHECK(contents); | 790 DCHECK(contents); |
778 DCHECK(index == TabStripModel::kNoTab || model_->ContainsIndex(index)); | 791 DCHECK(index == TabStripModel::kNoTab || model_->ContainsIndex(index)); |
779 | 792 |
780 if (active_animation_.get()) | 793 if (active_animation_.get()) |
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1068 break; | 1081 break; |
1069 } | 1082 } |
1070 } | 1083 } |
1071 #endif | 1084 #endif |
1072 | 1085 |
1073 /////////////////////////////////////////////////////////////////////////////// | 1086 /////////////////////////////////////////////////////////////////////////////// |
1074 // TabStrip, private: | 1087 // TabStrip, private: |
1075 | 1088 |
1076 void TabStrip::Init() { | 1089 void TabStrip::Init() { |
1077 model_->AddObserver(this); | 1090 model_->AddObserver(this); |
1078 newtab_button_ = new NewTabButton(this); | 1091 newtab_button_size_.SetSize(kNewTabButtonWidth, kNewTabButtonHeight); |
1079 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); | |
1080 SkBitmap* bitmap; | |
1081 | |
1082 bitmap = rb.GetBitmapNamed(IDR_NEWTAB_BUTTON); | |
1083 newtab_button_->SetImage(views::CustomButton::BS_NORMAL, bitmap); | |
1084 newtab_button_->SetImage(views::CustomButton::BS_PUSHED, | |
1085 rb.GetBitmapNamed(IDR_NEWTAB_BUTTON_P)); | |
1086 newtab_button_->SetImage(views::CustomButton::BS_HOT, | |
1087 rb.GetBitmapNamed(IDR_NEWTAB_BUTTON_H)); | |
1088 | |
1089 newtab_button_size_.SetSize(bitmap->width(), bitmap->height()); | |
1090 actual_newtab_button_size_ = newtab_button_size_; | |
1091 | |
1092 newtab_button_->SetAccessibleName(l10n_util::GetString(IDS_ACCNAME_NEWTAB)); | |
1093 AddChildView(newtab_button_); | |
1094 | |
1095 if (drop_indicator_width == 0) { | 1092 if (drop_indicator_width == 0) { |
1096 // Direction doesn't matter, both images are the same size. | 1093 // Direction doesn't matter, both images are the same size. |
1097 SkBitmap* drop_image = GetDropArrowImage(true); | 1094 SkBitmap* drop_image = GetDropArrowImage(true); |
1098 drop_indicator_width = drop_image->width(); | 1095 drop_indicator_width = drop_image->width(); |
1099 drop_indicator_height = drop_image->height(); | 1096 drop_indicator_height = drop_image->height(); |
1100 } | 1097 } |
1101 } | 1098 } |
1102 | 1099 |
| 1100 void TabStrip::LoadNewTabButtonImage() { |
| 1101 ThemeProvider* tp = GetThemeProvider(); |
| 1102 |
| 1103 // If we don't have a theme provider yet, it means we do not have a |
| 1104 // root view, and are therefore in a test. |
| 1105 if (tp == NULL) |
| 1106 tp = new views::DefaultThemeProvider(); |
| 1107 |
| 1108 SkBitmap* bitmap = tp->GetBitmapNamed(IDR_NEWTAB_BUTTON); |
| 1109 SkColor color = tp->GetColor(BrowserThemeProvider::COLOR_BUTTON_BACKGROUND); |
| 1110 SkBitmap* background = tp->GetBitmapNamed( |
| 1111 IDR_THEME_WINDOW_CONTROL_BACKGROUND); |
| 1112 |
| 1113 newtab_button_->SetImage(views::CustomButton::BS_NORMAL, bitmap); |
| 1114 newtab_button_->SetImage(views::CustomButton::BS_PUSHED, |
| 1115 tp->GetBitmapNamed(IDR_NEWTAB_BUTTON_P)); |
| 1116 newtab_button_->SetImage(views::CustomButton::BS_HOT, |
| 1117 tp->GetBitmapNamed(IDR_NEWTAB_BUTTON_H)); |
| 1118 newtab_button_->SetBackground(color, background, |
| 1119 tp->GetBitmapNamed(IDR_NEWTAB_BUTTON_MASK)); |
| 1120 } |
| 1121 |
1103 Tab* TabStrip::GetTabAt(int index) const { | 1122 Tab* TabStrip::GetTabAt(int index) const { |
1104 DCHECK(index >= 0 && index < GetTabCount()); | 1123 DCHECK(index >= 0 && index < GetTabCount()); |
1105 return tab_data_.at(index).tab; | 1124 return tab_data_.at(index).tab; |
1106 } | 1125 } |
1107 | 1126 |
1108 Tab* TabStrip::GetTabAtAdjustForAnimation(int index) const { | 1127 Tab* TabStrip::GetTabAtAdjustForAnimation(int index) const { |
1109 if (active_animation_.get() && | 1128 if (active_animation_.get() && |
1110 active_animation_->type() == TabAnimation::REMOVE && | 1129 active_animation_->type() == TabAnimation::REMOVE && |
1111 index >= | 1130 index >= |
1112 static_cast<RemoveTabAnimation*>(active_animation_.get())->index()) { | 1131 static_cast<RemoveTabAnimation*>(active_animation_.get())->index()) { |
(...skipping 464 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1577 &TabStrip::ResizeLayoutTabs), | 1596 &TabStrip::ResizeLayoutTabs), |
1578 kResizeTabsTimeMs); | 1597 kResizeTabsTimeMs); |
1579 } | 1598 } |
1580 } else { | 1599 } else { |
1581 // Mouse moved quickly out of the tab strip and then into it again, so | 1600 // Mouse moved quickly out of the tab strip and then into it again, so |
1582 // cancel the timer so that the strip doesn't move when the mouse moves | 1601 // cancel the timer so that the strip doesn't move when the mouse moves |
1583 // back over it. | 1602 // back over it. |
1584 resize_layout_factory_.RevokeAll(); | 1603 resize_layout_factory_.RevokeAll(); |
1585 } | 1604 } |
1586 } | 1605 } |
OLD | NEW |