| 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 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 102 | 102 |
| 103 // See UpdateLayoutTypeFromMouseEvent() for a description of these. | 103 // See UpdateLayoutTypeFromMouseEvent() for a description of these. |
| 104 #if !defined(USE_ASH) | 104 #if !defined(USE_ASH) |
| 105 const int kMouseMoveTimeMS = 200; | 105 const int kMouseMoveTimeMS = 200; |
| 106 const int kMouseMoveCountBeforeConsiderReal = 3; | 106 const int kMouseMoveCountBeforeConsiderReal = 3; |
| 107 #endif | 107 #endif |
| 108 | 108 |
| 109 // Amount of time we delay before resizing after a close from a touch. | 109 // Amount of time we delay before resizing after a close from a touch. |
| 110 const int kTouchResizeLayoutTimeMS = 2000; | 110 const int kTouchResizeLayoutTimeMS = 2000; |
| 111 | 111 |
| 112 // Amount to adjust the clip by when the tab is stacked before the active index. | |
| 113 const int kStackedTabLeftClip = 20; | |
| 114 | |
| 115 // Amount to adjust the clip by when the tab is stacked after the active index. | |
| 116 const int kStackedTabRightClip = 20; | |
| 117 | |
| 118 #if defined(OS_MACOSX) | 112 #if defined(OS_MACOSX) |
| 119 const int kPinnedToNonPinnedOffset = 2; | 113 const int kPinnedToNonPinnedOffset = 2; |
| 120 #else | 114 #else |
| 121 const int kPinnedToNonPinnedOffset = 3; | 115 const int kPinnedToNonPinnedOffset = 3; |
| 122 #endif | 116 #endif |
| 123 | 117 |
| 124 // Returns the offset from the top of the tabstrip at which the new tab button's | 118 // Returns the offset from the top of the tabstrip at which the new tab button's |
| 125 // visible region begins. | 119 // visible region begins. |
| 126 int GetNewTabButtonTopOffset() { | 120 int GetNewTabButtonTopOffset() { |
| 127 // The vertical distance between the bottom of the new tab button and the | 121 // The vertical distance between the bottom of the new tab button and the |
| (...skipping 1030 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1158 } | 1152 } |
| 1159 | 1153 |
| 1160 bool TabStrip::ShouldHideCloseButtonForInactiveTabs() { | 1154 bool TabStrip::ShouldHideCloseButtonForInactiveTabs() { |
| 1161 if (!touch_layout_) | 1155 if (!touch_layout_) |
| 1162 return false; | 1156 return false; |
| 1163 | 1157 |
| 1164 return !base::CommandLine::ForCurrentProcess()->HasSwitch( | 1158 return !base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 1165 switches::kDisableHideInactiveStackedTabCloseButtons); | 1159 switches::kDisableHideInactiveStackedTabCloseButtons); |
| 1166 } | 1160 } |
| 1167 | 1161 |
| 1162 bool TabStrip::MaySetClip() { |
| 1163 // Only touch layout needs to restrict the clip. |
| 1164 return touch_layout_ || IsStackingDraggedTabs(); |
| 1165 } |
| 1166 |
| 1168 void TabStrip::SelectTab(Tab* tab) { | 1167 void TabStrip::SelectTab(Tab* tab) { |
| 1169 int model_index = GetModelIndexOfTab(tab); | 1168 int model_index = GetModelIndexOfTab(tab); |
| 1170 if (IsValidModelIndex(model_index)) | 1169 if (IsValidModelIndex(model_index)) |
| 1171 controller_->SelectTab(model_index); | 1170 controller_->SelectTab(model_index); |
| 1172 } | 1171 } |
| 1173 | 1172 |
| 1174 void TabStrip::ExtendSelectionTo(Tab* tab) { | 1173 void TabStrip::ExtendSelectionTo(Tab* tab) { |
| 1175 int model_index = GetModelIndexOfTab(tab); | 1174 int model_index = GetModelIndexOfTab(tab); |
| 1176 if (IsValidModelIndex(model_index)) | 1175 if (IsValidModelIndex(model_index)) |
| 1177 controller_->ExtendSelectionTo(model_index); | 1176 controller_->ExtendSelectionTo(model_index); |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1339 view = view->parent(); | 1338 view = view->parent(); |
| 1340 | 1339 |
| 1341 return view && view->id() == VIEW_ID_TAB ? static_cast<Tab*>(view) : NULL; | 1340 return view && view->id() == VIEW_ID_TAB ? static_cast<Tab*>(view) : NULL; |
| 1342 } | 1341 } |
| 1343 | 1342 |
| 1344 void TabStrip::OnMouseEventInTab(views::View* source, | 1343 void TabStrip::OnMouseEventInTab(views::View* source, |
| 1345 const ui::MouseEvent& event) { | 1344 const ui::MouseEvent& event) { |
| 1346 UpdateStackedLayoutFromMouseEvent(source, event); | 1345 UpdateStackedLayoutFromMouseEvent(source, event); |
| 1347 } | 1346 } |
| 1348 | 1347 |
| 1349 bool TabStrip::ShouldPaintTab(const Tab* tab, gfx::Rect* clip) { | 1348 bool TabStrip::ShouldPaintTab( |
| 1350 // Only touch layout needs to restrict the clip. | 1349 const Tab* tab, |
| 1351 if (!touch_layout_ && !IsStackingDraggedTabs()) | 1350 const base::Callback<gfx::Path(const gfx::Size&)>& border_callback, |
| 1351 gfx::Path* clip) { |
| 1352 if (!MaySetClip()) |
| 1352 return true; | 1353 return true; |
| 1353 | 1354 |
| 1354 int index = GetModelIndexOfTab(tab); | 1355 int index = GetModelIndexOfTab(tab); |
| 1355 if (index == -1) | 1356 if (index == -1) |
| 1356 return true; // Tab is closing, paint it all. | 1357 return true; // Tab is closing, paint it all. |
| 1357 | 1358 |
| 1358 int active_index = IsStackingDraggedTabs() ? | 1359 int active_index = IsStackingDraggedTabs() ? |
| 1359 controller_->GetActiveIndex() : touch_layout_->active_index(); | 1360 controller_->GetActiveIndex() : touch_layout_->active_index(); |
| 1360 if (active_index == tab_count()) | 1361 if (active_index == tab_count()) |
| 1361 active_index--; | 1362 active_index--; |
| 1362 | 1363 |
| 1363 const int current_x = tab_at(index)->x(); | 1364 const int current_x = tab_at(index)->x(); |
| 1364 if (index < active_index) { | 1365 if (index < active_index) { |
| 1365 const int next_x = tab_at(index + 1)->x(); | 1366 const int next_x = tab_at(index + 1)->x(); |
| 1366 if (current_x == next_x) | 1367 if (current_x == next_x) |
| 1367 return false; | 1368 return false; |
| 1368 | 1369 |
| 1369 if (current_x > next_x) | 1370 if (current_x > next_x) |
| 1370 return true; // Can happen during dragging. | 1371 return true; // Can happen during dragging. |
| 1371 | 1372 |
| 1372 clip->SetRect( | 1373 *clip = border_callback.Run(tab_at(index + 1)->size()); |
| 1373 0, 0, next_x - current_x + kStackedTabLeftClip, | 1374 clip->offset(SkIntToScalar(next_x - current_x), 0); |
| 1374 tab_at(index)->height()); | |
| 1375 } else if (index > active_index && index > 0) { | 1375 } else if (index > active_index && index > 0) { |
| 1376 const gfx::Rect& previous_bounds(tab_at(index - 1)->bounds()); | 1376 const gfx::Rect& previous_bounds(tab_at(index - 1)->bounds()); |
| 1377 const int previous_x = previous_bounds.x(); | 1377 const int previous_x = previous_bounds.x(); |
| 1378 if (current_x == previous_x) | 1378 if (current_x == previous_x) |
| 1379 return false; | 1379 return false; |
| 1380 | 1380 |
| 1381 if (current_x < previous_x) | 1381 if (current_x < previous_x) |
| 1382 return true; // Can happen during dragging. | 1382 return true; // Can happen during dragging. |
| 1383 | 1383 |
| 1384 if (previous_bounds.right() - GetLayoutConstant(TABSTRIP_TAB_OVERLAP) != | 1384 if (previous_bounds.right() - GetLayoutConstant(TABSTRIP_TAB_OVERLAP) != |
| 1385 current_x) { | 1385 current_x) { |
| 1386 int x = previous_bounds.right() - current_x - kStackedTabRightClip; | 1386 *clip = border_callback.Run(tab_at(index - 1)->size()); |
| 1387 const gfx::Rect& tab_bounds(tab_at(index)->bounds()); | 1387 clip->offset(SkIntToScalar(previous_x - current_x), 0); |
| 1388 clip->SetRect(x, 0, tab_bounds.width() - x, tab_bounds.height()); | |
| 1389 } | 1388 } |
| 1390 } | 1389 } |
| 1391 return true; | 1390 return true; |
| 1392 } | 1391 } |
| 1393 | 1392 |
| 1394 bool TabStrip::CanPaintThrobberToLayer() const { | 1393 bool TabStrip::CanPaintThrobberToLayer() const { |
| 1395 // Disable layer-painting of throbbers if dragging, if any tab animation is in | 1394 // Disable layer-painting of throbbers if dragging, if any tab animation is in |
| 1396 // progress, or if stacked tabs are enabled. Also disable in fullscreen: when | 1395 // progress, or if stacked tabs are enabled. Also disable in fullscreen: when |
| 1397 // "immersive" the tab strip could be sliding in or out while transitioning to | 1396 // "immersive" the tab strip could be sliding in or out while transitioning to |
| 1398 // or away from |immersive_style_| and, for other modes, there's no tab strip. | 1397 // or away from |immersive_style_| and, for other modes, there's no tab strip. |
| (...skipping 1488 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2887 ConvertPointToViewAndGetEventHandler(this, newtab_button_, point); | 2886 ConvertPointToViewAndGetEventHandler(this, newtab_button_, point); |
| 2888 if (view) | 2887 if (view) |
| 2889 return view; | 2888 return view; |
| 2890 } | 2889 } |
| 2891 Tab* tab = FindTabForEvent(point); | 2890 Tab* tab = FindTabForEvent(point); |
| 2892 if (tab) | 2891 if (tab) |
| 2893 return ConvertPointToViewAndGetEventHandler(this, tab, point); | 2892 return ConvertPointToViewAndGetEventHandler(this, tab, point); |
| 2894 } | 2893 } |
| 2895 return this; | 2894 return this; |
| 2896 } | 2895 } |
| OLD | NEW |