OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/ui/views/tabs/tab_strip.h" | 5 #include "chrome/browser/ui/views/tabs/tab_strip.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <iterator> | 10 #include <iterator> |
(...skipping 1044 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1055 | 1055 |
1056 void TabStrip::Layout() { | 1056 void TabStrip::Layout() { |
1057 // Only do a layout if our size changed. | 1057 // Only do a layout if our size changed. |
1058 if (last_layout_size_ == size()) | 1058 if (last_layout_size_ == size()) |
1059 return; | 1059 return; |
1060 if (IsDragSessionActive()) | 1060 if (IsDragSessionActive()) |
1061 return; | 1061 return; |
1062 DoLayout(); | 1062 DoLayout(); |
1063 } | 1063 } |
1064 | 1064 |
1065 void TabStrip::PaintChildren(const ui::PaintContext& context) { | 1065 void TabStrip::PaintChildren(const views::PaintInfo& paint_info) { |
1066 // The view order doesn't match the paint order (tabs_ contains the tab | 1066 // The view order doesn't match the paint order (tabs_ contains the tab |
1067 // ordering). Additionally we need to paint the tabs that are closing in | 1067 // ordering). Additionally we need to paint the tabs that are closing in |
1068 // |tabs_closing_map_|. | 1068 // |tabs_closing_map_|. |
1069 bool is_dragging = false; | 1069 bool is_dragging = false; |
1070 Tab* active_tab = NULL; | 1070 Tab* active_tab = NULL; |
1071 Tabs tabs_dragging; | 1071 Tabs tabs_dragging; |
1072 Tabs selected_tabs; | 1072 Tabs selected_tabs; |
1073 | 1073 |
1074 { | 1074 { |
1075 // We pass false for |lcd_text_requires_opaque_layer| so that background | 1075 // We pass false for |lcd_text_requires_opaque_layer| so that background |
1076 // tab titles will get LCD AA. These are rendered opaquely on an opaque tab | 1076 // tab titles will get LCD AA. These are rendered opaquely on an opaque tab |
1077 // background before the layer is composited, so this is safe. | 1077 // background before the layer is composited, so this is safe. |
1078 ui::CompositingRecorder opacity_recorder(context, GetInactiveAlpha(false), | 1078 ui::CompositingRecorder opacity_recorder(paint_info.context(), |
1079 false); | 1079 GetInactiveAlpha(false), false); |
1080 | 1080 |
1081 PaintClosingTabs(tab_count(), context); | 1081 PaintClosingTabs(tab_count(), paint_info); |
1082 | 1082 |
1083 int active_tab_index = -1; | 1083 int active_tab_index = -1; |
1084 for (int i = tab_count() - 1; i >= 0; --i) { | 1084 for (int i = tab_count() - 1; i >= 0; --i) { |
1085 Tab* tab = tab_at(i); | 1085 Tab* tab = tab_at(i); |
1086 if (tab->dragging() && !stacked_layout_) { | 1086 if (tab->dragging() && !stacked_layout_) { |
1087 is_dragging = true; | 1087 is_dragging = true; |
1088 if (tab->IsActive()) { | 1088 if (tab->IsActive()) { |
1089 active_tab = tab; | 1089 active_tab = tab; |
1090 active_tab_index = i; | 1090 active_tab_index = i; |
1091 } else { | 1091 } else { |
1092 tabs_dragging.push_back(tab); | 1092 tabs_dragging.push_back(tab); |
1093 } | 1093 } |
1094 } else if (!tab->IsActive()) { | 1094 } else if (!tab->IsActive()) { |
1095 if (!tab->IsSelected()) { | 1095 if (!tab->IsSelected()) { |
1096 if (!stacked_layout_) | 1096 if (!stacked_layout_) |
1097 tab->Paint(context); | 1097 tab->Paint(paint_info); |
1098 } else { | 1098 } else { |
1099 selected_tabs.push_back(tab); | 1099 selected_tabs.push_back(tab); |
1100 } | 1100 } |
1101 } else { | 1101 } else { |
1102 active_tab = tab; | 1102 active_tab = tab; |
1103 active_tab_index = i; | 1103 active_tab_index = i; |
1104 } | 1104 } |
1105 PaintClosingTabs(i, context); | 1105 PaintClosingTabs(i, paint_info); |
1106 } | 1106 } |
1107 | 1107 |
1108 // Draw from the left and then the right if we're in touch mode. | 1108 // Draw from the left and then the right if we're in touch mode. |
1109 if (stacked_layout_ && active_tab_index >= 0) { | 1109 if (stacked_layout_ && active_tab_index >= 0) { |
1110 for (int i = 0; i < active_tab_index; ++i) { | 1110 for (int i = 0; i < active_tab_index; ++i) { |
1111 Tab* tab = tab_at(i); | 1111 Tab* tab = tab_at(i); |
1112 tab->Paint(context); | 1112 tab->Paint(paint_info); |
1113 } | 1113 } |
1114 | 1114 |
1115 for (int i = tab_count() - 1; i > active_tab_index; --i) { | 1115 for (int i = tab_count() - 1; i > active_tab_index; --i) { |
1116 Tab* tab = tab_at(i); | 1116 Tab* tab = tab_at(i); |
1117 tab->Paint(context); | 1117 tab->Paint(paint_info); |
1118 } | 1118 } |
1119 } | 1119 } |
1120 } | 1120 } |
1121 | 1121 |
1122 // Now selected but not active. We don't want these dimmed if using native | 1122 // Now selected but not active. We don't want these dimmed if using native |
1123 // frame, so they're painted after initial pass. | 1123 // frame, so they're painted after initial pass. |
1124 for (size_t i = 0; i < selected_tabs.size(); ++i) | 1124 for (size_t i = 0; i < selected_tabs.size(); ++i) |
1125 selected_tabs[i]->Paint(context); | 1125 selected_tabs[i]->Paint(paint_info); |
1126 | 1126 |
1127 // Next comes the active tab. | 1127 // Next comes the active tab. |
1128 if (active_tab && !is_dragging) | 1128 if (active_tab && !is_dragging) |
1129 active_tab->Paint(context); | 1129 active_tab->Paint(paint_info); |
1130 | 1130 |
1131 // Paint the New Tab button. | 1131 // Paint the New Tab button. |
1132 if (new_tab_button_->state() == views::CustomButton::STATE_PRESSED) { | 1132 if (new_tab_button_->state() == views::CustomButton::STATE_PRESSED) { |
1133 new_tab_button_->Paint(context); | 1133 new_tab_button_->Paint(paint_info); |
1134 } else { | 1134 } else { |
1135 // Match the inactive tab opacity for non-pressed states. See comments in | 1135 // Match the inactive tab opacity for non-pressed states. See comments in |
1136 // NewTabButton::PaintFill() for why we don't do this for the pressed state. | 1136 // NewTabButton::PaintFill() for why we don't do this for the pressed state. |
1137 // This call doesn't need to set |lcd_text_requires_opaque_layer| to false | 1137 // This call doesn't need to set |lcd_text_requires_opaque_layer| to false |
1138 // because no text will be drawn. | 1138 // because no text will be drawn. |
1139 ui::CompositingRecorder opacity_recorder(context, GetInactiveAlpha(true), | 1139 ui::CompositingRecorder opacity_recorder(paint_info.context(), |
1140 true); | 1140 GetInactiveAlpha(true), true); |
1141 new_tab_button_->Paint(context); | 1141 new_tab_button_->Paint(paint_info); |
1142 } | 1142 } |
1143 | 1143 |
1144 // And the dragged tabs. | 1144 // And the dragged tabs. |
1145 for (size_t i = 0; i < tabs_dragging.size(); ++i) | 1145 for (size_t i = 0; i < tabs_dragging.size(); ++i) |
1146 tabs_dragging[i]->Paint(context); | 1146 tabs_dragging[i]->Paint(paint_info); |
1147 | 1147 |
1148 // If the active tab is being dragged, it goes last. | 1148 // If the active tab is being dragged, it goes last. |
1149 if (active_tab && is_dragging) | 1149 if (active_tab && is_dragging) |
1150 active_tab->Paint(context); | 1150 active_tab->Paint(paint_info); |
1151 | 1151 |
1152 ui::PaintRecorder recorder(context, size()); | 1152 ui::PaintRecorder recorder(paint_info.context(), size()); |
1153 gfx::Canvas* canvas = recorder.canvas(); | 1153 gfx::Canvas* canvas = recorder.canvas(); |
1154 if (active_tab) { | 1154 if (active_tab) { |
1155 canvas->sk_canvas()->clipRect( | 1155 canvas->sk_canvas()->clipRect( |
1156 gfx::RectToSkRect(active_tab->GetMirroredBounds()), | 1156 gfx::RectToSkRect(active_tab->GetMirroredBounds()), |
1157 SkClipOp::kDifference); | 1157 SkClipOp::kDifference); |
1158 } | 1158 } |
1159 BrowserView::Paint1pxHorizontalLine(canvas, GetToolbarTopSeparatorColor(), | 1159 BrowserView::Paint1pxHorizontalLine(canvas, GetToolbarTopSeparatorColor(), |
1160 GetLocalBounds(), true); | 1160 GetLocalBounds(), true); |
1161 } | 1161 } |
1162 | 1162 |
(...skipping 610 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1773 for (TabsClosingMap::iterator i(tabs_closing_map_.begin()); | 1773 for (TabsClosingMap::iterator i(tabs_closing_map_.begin()); |
1774 i != tabs_closing_map_.end(); ++i) { | 1774 i != tabs_closing_map_.end(); ++i) { |
1775 Tabs::iterator j = std::find(i->second.begin(), i->second.end(), tab); | 1775 Tabs::iterator j = std::find(i->second.begin(), i->second.end(), tab); |
1776 if (j != i->second.end()) | 1776 if (j != i->second.end()) |
1777 return FindClosingTabResult(i, j); | 1777 return FindClosingTabResult(i, j); |
1778 } | 1778 } |
1779 NOTREACHED(); | 1779 NOTREACHED(); |
1780 return FindClosingTabResult(tabs_closing_map_.end(), Tabs::iterator()); | 1780 return FindClosingTabResult(tabs_closing_map_.end(), Tabs::iterator()); |
1781 } | 1781 } |
1782 | 1782 |
1783 void TabStrip::PaintClosingTabs(int index, const ui::PaintContext& context) { | 1783 void TabStrip::PaintClosingTabs(int index, const views::PaintInfo& paint_info) { |
1784 if (tabs_closing_map_.find(index) == tabs_closing_map_.end()) | 1784 if (tabs_closing_map_.find(index) == tabs_closing_map_.end()) |
1785 return; | 1785 return; |
1786 | 1786 |
1787 const Tabs& tabs = tabs_closing_map_[index]; | 1787 const Tabs& tabs = tabs_closing_map_[index]; |
1788 for (Tabs::const_reverse_iterator i(tabs.rbegin()); i != tabs.rend(); ++i) | 1788 for (Tabs::const_reverse_iterator i(tabs.rbegin()); i != tabs.rend(); ++i) |
1789 (*i)->Paint(context); | 1789 (*i)->Paint(paint_info); |
1790 } | 1790 } |
1791 | 1791 |
1792 void TabStrip::UpdateStackedLayoutFromMouseEvent(views::View* source, | 1792 void TabStrip::UpdateStackedLayoutFromMouseEvent(views::View* source, |
1793 const ui::MouseEvent& event) { | 1793 const ui::MouseEvent& event) { |
1794 if (!adjust_layout_) | 1794 if (!adjust_layout_) |
1795 return; | 1795 return; |
1796 | 1796 |
1797 // The following code attempts to switch to shrink (not stacked) layout when | 1797 // The following code attempts to switch to shrink (not stacked) layout when |
1798 // the mouse exits the tabstrip (or the mouse is pressed on a stacked tab) and | 1798 // the mouse exits the tabstrip (or the mouse is pressed on a stacked tab) and |
1799 // to stacked layout when a touch device is used. This is made problematic by | 1799 // to stacked layout when a touch device is used. This is made problematic by |
(...skipping 682 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2482 ConvertPointToViewAndGetEventHandler(this, new_tab_button_, point); | 2482 ConvertPointToViewAndGetEventHandler(this, new_tab_button_, point); |
2483 if (view) | 2483 if (view) |
2484 return view; | 2484 return view; |
2485 } | 2485 } |
2486 Tab* tab = FindTabForEvent(point); | 2486 Tab* tab = FindTabForEvent(point); |
2487 if (tab) | 2487 if (tab) |
2488 return ConvertPointToViewAndGetEventHandler(this, tab, point); | 2488 return ConvertPointToViewAndGetEventHandler(this, tab, point); |
2489 } | 2489 } |
2490 return this; | 2490 return this; |
2491 } | 2491 } |
OLD | NEW |