diff options
4 files changed, 343 insertions, 54 deletions
diff --git a/plugins/org.eclipse.eef.properties.ui.legacy/src/org/eclipse/eef/properties/ui/legacy/internal/extension/impl/LegacyPropertyTabRegistry.java b/plugins/org.eclipse.eef.properties.ui.legacy/src/org/eclipse/eef/properties/ui/legacy/internal/extension/impl/LegacyPropertyTabRegistry.java index ef9a6d5e0..a3e9839ba 100644 --- a/plugins/org.eclipse.eef.properties.ui.legacy/src/org/eclipse/eef/properties/ui/legacy/internal/extension/impl/LegacyPropertyTabRegistry.java +++ b/plugins/org.eclipse.eef.properties.ui.legacy/src/org/eclipse/eef/properties/ui/legacy/internal/extension/impl/LegacyPropertyTabRegistry.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2015, 2018 Obeo. + * Copyright (c) 2015, 2019 Obeo. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v2.0 * which accompanies this distribution, and is available at @@ -16,7 +16,6 @@ import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; -import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Objects; @@ -36,11 +35,6 @@ import org.eclipse.eef.properties.ui.legacy.internal.extension.IItemRegistry; public class LegacyPropertyTabRegistry implements IItemRegistry { /** - * The after tab top value. - */ - private static final String TOP = "top"; //$NON-NLS-1$ - - /** * The map of the identifier of the description to the {@link LegacyPropertyTabItemDescriptor}. */ private Map<String, List<IItemDescriptor>> id2descriptors = new HashMap<>(); @@ -112,31 +106,21 @@ public class LegacyPropertyTabRegistry implements IItemRegistry { return tabs; } List<IEEFTabDescriptor> sorted = new ArrayList<IEEFTabDescriptor>(); - int categoryIndex = 0; for (int i = 0; i < propertyCategories.size(); i++) { // Get all the tabs of a category final List<IEEFTabDescriptor> categoryList = new ArrayList<IEEFTabDescriptor>(); String category = propertyCategories.get(i); - int topOfCategory = categoryIndex; - int endOfCategory = categoryIndex; - while (endOfCategory < tabs.size() && tabs.get(endOfCategory).getCategory().equals(category)) { - endOfCategory++; - } - for (int j = topOfCategory; j < endOfCategory; j++) { - IEEFTabDescriptor tab = tabs.get(j); - if (tab.getAfterTab().equals(TOP)) { - categoryList.add(0, tabs.get(j)); - } else { - categoryList.add(tabs.get(j)); + + for (IEEFTabDescriptor tab : tabs) { + if (category.equals(tab.getCategory())) { + categoryList.add(tab); } } - List<IEEFTabDescriptor> sortedTabs = sortCategoryTabsByAfterTab(categoryList); for (int j = 0; j < sortedTabs.size(); j++) { sorted.add(sortedTabs.get(j)); } - categoryIndex = endOfCategory; } return sorted; } @@ -149,37 +133,7 @@ public class LegacyPropertyTabRegistry implements IItemRegistry { * @return List of tabs sorted by after tab */ private List<IEEFTabDescriptor> sortCategoryTabsByAfterTab(List<IEEFTabDescriptor> categoryList) { - List<IEEFTabDescriptor> sorted = new LinkedList<IEEFTabDescriptor>(); - for (IEEFTabDescriptor tab : categoryList) { - String afterTabId = tab.getAfterTab(); - int indexOfAfterTab = -1; - if (afterTabId != null && !afterTabId.isEmpty()) { - IEEFTabDescriptor afterTab = getTab(categoryList, afterTabId); - if (afterTab != null) { - indexOfAfterTab = sorted.indexOf(afterTab); - } - } - sorted.add(indexOfAfterTab + 1, tab); - } - return sorted; - } - - /** - * Get a tab in a list of tabs according to its id. - * - * @param tabId - * The tab id - * @param tabs - * The tabs list - * @return the Tab - */ - private IEEFTabDescriptor getTab(List<IEEFTabDescriptor> tabs, String tabId) { - for (IEEFTabDescriptor tab : tabs) { - if (tabId.equals(tab.getId())) { - return tab; - } - } - return null; + return new LegacyPropertyTabSorter().sortTabsByAfterTab(categoryList); } /** diff --git a/plugins/org.eclipse.eef.properties.ui.legacy/src/org/eclipse/eef/properties/ui/legacy/internal/extension/impl/LegacyPropertyTabSorter.java b/plugins/org.eclipse.eef.properties.ui.legacy/src/org/eclipse/eef/properties/ui/legacy/internal/extension/impl/LegacyPropertyTabSorter.java new file mode 100644 index 000000000..738ef66a6 --- /dev/null +++ b/plugins/org.eclipse.eef.properties.ui.legacy/src/org/eclipse/eef/properties/ui/legacy/internal/extension/impl/LegacyPropertyTabSorter.java @@ -0,0 +1,109 @@ +/******************************************************************************* + * Copyright (c) 2019 Obeo. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.eef.properties.ui.legacy.internal.extension.impl; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import org.eclipse.eef.properties.ui.api.IEEFTabDescriptor; + +/** + * Utility class used to sort the property tabs. + * + * @author arichard + */ +public class LegacyPropertyTabSorter { + + /** + * Sort tabs by after tab. Top tabs and tabs without after tab are put at the beginning of the list as they appear. + * + * @param tabs + * List of tabs + * @return List of tabs sorted by after tab + */ + public List<IEEFTabDescriptor> sortTabsByAfterTab(Collection<IEEFTabDescriptor> tabs) { + List<IEEFTabDescriptor> sorted = new ArrayList<IEEFTabDescriptor>(tabs); + List<IEEFTabDescriptor> processed = new ArrayList<IEEFTabDescriptor>(); + int lastIndex = sorted.size() - 1; + + for (int i = 0; i <= lastIndex; i++) { + IEEFTabDescriptor lastUnprocessedTab = getLastUnprocessedTab(sorted, processed); + if (lastUnprocessedTab != null) { + String lastUnprocessedTabId = lastUnprocessedTab.getId(); + if (!isNullEmpty(lastUnprocessedTabId)) { + for (IEEFTabDescriptor tab : tabs) { + if (lastUnprocessedTabId.equals(tab.getAfterTab())) { + sorted.remove(tab); + sorted.add(sorted.indexOf(lastUnprocessedTab) + 1, tab); + } + } + } + processed.add(lastUnprocessedTab); + } + } + + // Move top tabs and tabs without afterTab at the beginning of the list + int index = 0; + for (IEEFTabDescriptor tab : tabs) { + String afterTab = tab.getAfterTab(); + if (isNullEmpty(afterTab) || isTop(afterTab)) { + sorted.remove(tab); + sorted.add(index, tab); + index++; + } + } + + return sorted; + } + + /** + * Get the last tab that has not been processed yet by {@link #sortTabsByAfterTab(Collection)}. + * + * @param tabs + * The list of tabs. + * @param processed + * The list of already processed tabs. + * @return The last tab that has not been processed yet by {@link #sortTabsByAfterTab(Collection)} + */ + private IEEFTabDescriptor getLastUnprocessedTab(List<IEEFTabDescriptor> tabs, List<IEEFTabDescriptor> processed) { + for (int i = tabs.size() - 1; i >= 0; i--) { + IEEFTabDescriptor lastUnprocessedTab = tabs.get(i); + if (!processed.contains(lastUnprocessedTab)) { + return lastUnprocessedTab; + } + } + return null; + } + + /** + * Indicates if the given id is null, or an empty string. + * + * @param id + * The id + * @return <code>true</code> if the id is null, or an empty string + */ + private boolean isNullEmpty(String id) { + return id == null || id.isEmpty(); + } + + /** + * Indicates if the given after tab is top. + * + * @param afterTab + * The after tab + * @return <code>true</code> if the after tab is top + */ + private boolean isTop(String afterTab) { + return "top".equals(afterTab); //$NON-NLS-1$ + } +} diff --git a/tests/org.eclipse.eef.ui.tests/src/org/eclipse/eef/ui/tests/internal/AllUiTests.java b/tests/org.eclipse.eef.ui.tests/src/org/eclipse/eef/ui/tests/internal/AllUiTests.java index e6e61c57c..bfa1beeef 100644 --- a/tests/org.eclipse.eef.ui.tests/src/org/eclipse/eef/ui/tests/internal/AllUiTests.java +++ b/tests/org.eclipse.eef.ui.tests/src/org/eclipse/eef/ui/tests/internal/AllUiTests.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2018 Obeo. + * Copyright (c) 2018, 2019 Obeo. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v2.0 * which accompanies this distribution, and is available at @@ -21,7 +21,7 @@ import org.junit.runners.Suite.SuiteClasses; * @author sbegaudeau */ @RunWith(Suite.class) -@SuiteClasses({ LegacyPropertySectionSorterTests.class }) +@SuiteClasses({ LegacyPropertySectionSorterTests.class, LegacyPropertyTabSorterTests.class }) public final class AllUiTests { /** * The constructor. diff --git a/tests/org.eclipse.eef.ui.tests/src/org/eclipse/eef/ui/tests/internal/LegacyPropertyTabSorterTests.java b/tests/org.eclipse.eef.ui.tests/src/org/eclipse/eef/ui/tests/internal/LegacyPropertyTabSorterTests.java new file mode 100644 index 000000000..1c99271bc --- /dev/null +++ b/tests/org.eclipse.eef.ui.tests/src/org/eclipse/eef/ui/tests/internal/LegacyPropertyTabSorterTests.java @@ -0,0 +1,226 @@ +/******************************************************************************* + * Copyright (c) 2019 Obeo. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.eef.ui.tests.internal; + +import static org.junit.Assert.assertEquals; + +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.eef.properties.ui.api.EEFTabContents; +import org.eclipse.eef.properties.ui.api.IEEFSectionDescriptor; +import org.eclipse.eef.properties.ui.api.IEEFTabDescriptor; +import org.eclipse.eef.properties.ui.legacy.internal.extension.impl.LegacyPropertyTabSorter; +import org.eclipse.swt.graphics.Image; +import org.junit.Test; + +/** + * Test class for the LegacyPropertyTabSorter. + * + * @author arichard + */ +@SuppressWarnings({ "checkstyle:javadocmethod" }) +public class LegacyPropertyTabSorterTests { + + /** + * The special after tab for the TOP tab. + */ + private static final String TOP = "top"; //$NON-NLS-1$ + + /** + * Utility class to test the tab descriptor. + * + * @author arichard + */ + private static class TestTabDescriptor implements IEEFTabDescriptor { + + /** + * The id. + */ + private String id; + + /** + * The after tab. + */ + private String afterTab; + + /** + * The constructor. + * + * @param id + * The id + * @param afterTab + * The after tab + */ + TestTabDescriptor(String id, String afterTab) { + this.id = id; + this.afterTab = afterTab; + } + + @Override + public String getId() { + return this.id; + } + + @Override + public String getAfterTab() { + return this.afterTab; + } + + @Override + public String toString() { + return this.id; + } + + @Override + public Image getImage() { + return null; + } + + @Override + public String getText() { + return null; + } + + @Override + public boolean isSelected() { + return false; + } + + @Override + public boolean isIndented() { + return false; + } + + @Override + public EEFTabContents createTab() { + return null; + } + + @Override + public String getCategory() { + return null; + } + + @Override + public String getLabel() { + return null; + } + + @Override + public List<IEEFSectionDescriptor> getSectionDescriptors() { + return null; + } + + } + + @Test + public void testOrderedTabs() { + List<IEEFTabDescriptor> tabs = new ArrayList<>(); + tabs.add(new TestTabDescriptor("1", null)); //$NON-NLS-1$ + tabs.add(new TestTabDescriptor("2", null)); //$NON-NLS-1$ + tabs.add(new TestTabDescriptor("3", null)); //$NON-NLS-1$ + + List<IEEFTabDescriptor> sortedTabs = new LegacyPropertyTabSorter().sortTabsByAfterTab(tabs); + + assertEquals("[1, 2, 3]", sortedTabs.toString()); //$NON-NLS-1$ + } + + @Test + public void testOrderedTabsWithAfterTab() { + List<IEEFTabDescriptor> tabs = new ArrayList<>(); + tabs.add(new TestTabDescriptor("4", "6")); //$NON-NLS-1$ //$NON-NLS-2$ + tabs.add(new TestTabDescriptor("5", TOP)); //$NON-NLS-1$ + tabs.add(new TestTabDescriptor("6", "5")); //$NON-NLS-1$ //$NON-NLS-2$ + + List<IEEFTabDescriptor> sortedTabs = new LegacyPropertyTabSorter().sortTabsByAfterTab(tabs); + + assertEquals("[5, 6, 4]", sortedTabs.toString()); //$NON-NLS-1$ + } + + @Test + public void testOrderedTabsWithAfterTab2() { + List<IEEFTabDescriptor> tabs = new ArrayList<>(); + tabs.add(new TestTabDescriptor("9", "10")); //$NON-NLS-1$ //$NON-NLS-2$ + tabs.add(new TestTabDescriptor("7", "8")); //$NON-NLS-1$ //$NON-NLS-2$ + tabs.add(new TestTabDescriptor("8", "9")); //$NON-NLS-1$ //$NON-NLS-2$ + tabs.add(new TestTabDescriptor("10", TOP)); //$NON-NLS-1$ + + List<IEEFTabDescriptor> sortedTabs = new LegacyPropertyTabSorter().sortTabsByAfterTab(tabs); + + assertEquals("[10, 9, 8, 7]", sortedTabs.toString()); //$NON-NLS-1$ + } + + @Test + public void testOrderedTabsWithAfterTab3() { + List<IEEFTabDescriptor> tabs = new ArrayList<>(); + tabs.add(new TestTabDescriptor("17", TOP)); //$NON-NLS-1$ + tabs.add(new TestTabDescriptor("16", "17")); //$NON-NLS-1$ //$NON-NLS-2$ + tabs.add(new TestTabDescriptor("13", "14")); //$NON-NLS-1$ //$NON-NLS-2$ + tabs.add(new TestTabDescriptor("14", "15")); //$NON-NLS-1$ //$NON-NLS-2$ + tabs.add(new TestTabDescriptor("15", "16")); //$NON-NLS-1$ //$NON-NLS-2$ + tabs.add(new TestTabDescriptor("12", "13")); //$NON-NLS-1$ //$NON-NLS-2$ + tabs.add(new TestTabDescriptor("11", "12")); //$NON-NLS-1$ //$NON-NLS-2$ + + List<IEEFTabDescriptor> sortedTabs = new LegacyPropertyTabSorter().sortTabsByAfterTab(tabs); + + assertEquals("[17, 16, 15, 14, 13, 12, 11]", sortedTabs.toString()); //$NON-NLS-1$ + } + + @Test + public void testOrderedTabsWithAfterTab4() { + List<IEEFTabDescriptor> tabs = new ArrayList<>(); + tabs.add(new TestTabDescriptor("1", null)); //$NON-NLS-1$ + tabs.add(new TestTabDescriptor("2", "1")); //$NON-NLS-1$ //$NON-NLS-2$ + tabs.add(new TestTabDescriptor("3", null)); //$NON-NLS-1$ + tabs.add(new TestTabDescriptor("5", null)); //$NON-NLS-1$ + tabs.add(new TestTabDescriptor("4", "5")); //$NON-NLS-1$ //$NON-NLS-2$ + tabs.add(new TestTabDescriptor("6", "5")); //$NON-NLS-1$ //$NON-NLS-2$ + + List<IEEFTabDescriptor> sortedTabs = new LegacyPropertyTabSorter().sortTabsByAfterTab(tabs); + + assertEquals("[1, 3, 5, 2, 6, 4]", sortedTabs.toString()); //$NON-NLS-1$ + } + + @Test + public void testOrderedTabsWithAfterTab5() { + List<IEEFTabDescriptor> tabs = new ArrayList<>(); + tabs.add(new TestTabDescriptor("5b", "4")); //$NON-NLS-1$ //$NON-NLS-2$ + tabs.add(new TestTabDescriptor("1", null)); //$NON-NLS-1$ + tabs.add(new TestTabDescriptor("2", "1")); //$NON-NLS-1$ //$NON-NLS-2$ + tabs.add(new TestTabDescriptor("3", "2")); //$NON-NLS-1$ //$NON-NLS-2$ + tabs.add(new TestTabDescriptor("4", "3")); //$NON-NLS-1$ //$NON-NLS-2$ + tabs.add(new TestTabDescriptor("5", "4")); //$NON-NLS-1$ //$NON-NLS-2$ + tabs.add(new TestTabDescriptor("6", "5")); //$NON-NLS-1$ //$NON-NLS-2$ + + List<IEEFTabDescriptor> sortedTabs = new LegacyPropertyTabSorter().sortTabsByAfterTab(tabs); + + assertEquals("[1, 2, 3, 4, 5, 5b, 6]", sortedTabs.toString()); //$NON-NLS-1$ + } + + @Test + public void testOrderedTabsWithAfterTab6() { + List<IEEFTabDescriptor> tabs = new ArrayList<>(); + tabs.add(new TestTabDescriptor("A", "C")); //$NON-NLS-1$ //$NON-NLS-2$ + tabs.add(new TestTabDescriptor("B", null)); //$NON-NLS-1$ + tabs.add(new TestTabDescriptor("C", "H")); //$NON-NLS-1$ //$NON-NLS-2$ + tabs.add(new TestTabDescriptor("D", "E")); //$NON-NLS-1$ //$NON-NLS-2$ + tabs.add(new TestTabDescriptor("E", "H")); //$NON-NLS-1$ //$NON-NLS-2$ + tabs.add(new TestTabDescriptor("F", null)); //$NON-NLS-1$ + tabs.add(new TestTabDescriptor("G", "B")); //$NON-NLS-1$ //$NON-NLS-2$ + tabs.add(new TestTabDescriptor("H", "G")); //$NON-NLS-1$ //$NON-NLS-2$ + + List<IEEFTabDescriptor> sortedTabs = new LegacyPropertyTabSorter().sortTabsByAfterTab(tabs); + + assertEquals("[B, F, G, H, E, D, C, A]", sortedTabs.toString()); //$NON-NLS-1$ + } +} |