| Index: chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/ScrollingStripStacker.java
|
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/ScrollingStripStacker.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/ScrollingStripStacker.java
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..f356bb0d964b8052f13e04ee051c420f2a127fbb
|
| --- /dev/null
|
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/ScrollingStripStacker.java
|
| @@ -0,0 +1,99 @@
|
| +// Copyright 2016 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.
|
| +
|
| +package org.chromium.chrome.browser.compositor.overlays.strip;
|
| +
|
| +import org.chromium.ui.base.LocalizationUtils;
|
| +
|
| +/**
|
| + * A stacker that tells the {@link StripLayoutHelper} how to layer the tabs for the
|
| + * {@link StaticLayout} when the available window width is < 600dp. Tabs will be stacked side by
|
| + * side and the entire strip will scroll. Tabs will never completely overlap each other.
|
| + */
|
| +public class ScrollingStripStacker extends StripStacker {
|
| + @Override
|
| + public void setTabOffsets(int selectedIndex, StripLayoutTab[] indexOrderedTabs,
|
| + float tabStackWidth, int maxTabsToStack, float tabOverlapWidth, float stripLeftMargin,
|
| + float stripRightMargin, float stripWidth, boolean inReorderMode) {
|
| + for (int i = 0; i < indexOrderedTabs.length; i++) {
|
| + StripLayoutTab tab = indexOrderedTabs[i];
|
| + tab.setDrawX(tab.getIdealX());
|
| + tab.setDrawY(tab.getOffsetY());
|
| + tab.setVisiblePercentage(1.f);
|
| + tab.setContentOffsetX(0.f);
|
| + }
|
| + }
|
| +
|
| + @Override
|
| + public float computeNewTabButtonOffset(StripLayoutTab[] indexOrderedTabs,
|
| + float tabOverlapWidth, float stripLeftMargin, float stripRightMargin, float stripWidth,
|
| + float newTabButtonWidth) {
|
| + return LocalizationUtils.isLayoutRtl()
|
| + ? computeNewTabButtonOffsetRtl(indexOrderedTabs, tabOverlapWidth, stripRightMargin,
|
| + stripWidth, newTabButtonWidth)
|
| + : computeNewTabButtonOffsetLtr(indexOrderedTabs, tabOverlapWidth,
|
| + stripLeftMargin, stripWidth);
|
| + }
|
| +
|
| + @Override
|
| + public void performOcclusionPass(int selectedIndex, StripLayoutTab[] indexOrderedTabs,
|
| + float layoutWidth) {
|
| + for (int i = 0; i < indexOrderedTabs.length; i++) {
|
| + StripLayoutTab tab = indexOrderedTabs[i];
|
| + tab.setVisible((tab.getDrawX() + tab.getWidth()) >= 0 && tab.getDrawX() <= layoutWidth);
|
| + }
|
| + }
|
| +
|
| + private float computeNewTabButtonOffsetLtr(StripLayoutTab[] indexOrderedTabs,
|
| + float tabOverlapWidth, float stripLeftMargin, float stripWidth) {
|
| + float rightEdge = stripLeftMargin;
|
| +
|
| + int numTabs = indexOrderedTabs.length;
|
| + // Need to look at the last two tabs to determine the new tab position in case the last
|
| + // tab is dying.
|
| + int i = numTabs > 0 ? ((numTabs >= 2) ? numTabs - 2 : numTabs - 1) : 0;
|
| + for (; i < numTabs; i++) {
|
| + StripLayoutTab tab = indexOrderedTabs[i];
|
| + float layoutWidth;
|
| + if (tab.isDying()) {
|
| + // If a tab is dying, adjust the tab width by the width weight so that the new
|
| + // tab button slides to the left with the closing tab.
|
| + layoutWidth = tab.getWidth() * tab.getWidthWeight();
|
| + } else {
|
| + // If a tab is being created, disregard its width weight so the new tab button
|
| + // doesn't end up positioned too far to the left. If a tab is neither being
|
| + // created or dying, its width width weight is 1.0 and can also be ignored.
|
| + layoutWidth = tab.getWidth();
|
| + }
|
| +
|
| + rightEdge = Math.max(tab.getDrawX() + layoutWidth, rightEdge);
|
| + }
|
| +
|
| + // Adjust the right edge by the tab overlap width so that the new tab button is nestled
|
| + // closer to the tab.
|
| + rightEdge -= tabOverlapWidth / 2;
|
| +
|
| + // The draw X position for the new tab button is the rightEdge of the tab strip.
|
| + return rightEdge;
|
| + }
|
| +
|
| + private float computeNewTabButtonOffsetRtl(StripLayoutTab[] indexOrderedTabs,
|
| + float tabOverlapWidth, float stripRightMargin, float stripWidth,
|
| + float newTabButtonWidth) {
|
| + float leftEdge = stripWidth - stripRightMargin;
|
| + int numTabs = indexOrderedTabs.length;
|
| + if (numTabs >= 1) {
|
| + StripLayoutTab tab = indexOrderedTabs[numTabs - 1];
|
| + leftEdge = Math.min(tab.getDrawX(), leftEdge);
|
| + }
|
| +
|
| + // Adjust the left edge by the tab overlap width so that the new tab button is nestled
|
| + // closer to the tab.
|
| + leftEdge += tabOverlapWidth / 2;
|
| +
|
| + // The draw X position for the new tab button is the left edge of the tab strip minus
|
| + // the new tab button width.
|
| + return leftEdge - newTabButtonWidth;
|
| + }
|
| +}
|
|
|