From c3d7a9f07560b615ec252c945b56d4e30a1db8c1 Mon Sep 17 00:00:00 2001 From: drdev Date: Sat, 1 Feb 2014 21:16:12 +0000 Subject: [PATCH] Refactor so Image View shares sort order of List View --- .gitattributes | 1 - .../toolbox/itemmanager/ItemManagerModel.java | 140 ++++++++++++++++++ .../toolbox/itemmanager/views/ImageView.java | 29 ++-- .../itemmanager/views/ItemListView.java | 114 ++------------ .../toolbox/itemmanager/views/ItemView.java | 14 +- .../itemmanager/views/TableSorterCascade.java | 72 --------- 6 files changed, 165 insertions(+), 205 deletions(-) delete mode 100644 forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/TableSorterCascade.java diff --git a/.gitattributes b/.gitattributes index a807929da24..181e30486ca 100644 --- a/.gitattributes +++ b/.gitattributes @@ -15698,7 +15698,6 @@ forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ManaCostRenderer.jav forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/SColumnUtil.java -text forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/SetCodeRenderer.java -text forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/StarRenderer.java -text -forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/TableSorterCascade.java -text forge-gui/src/main/java/forge/gui/toolbox/package-info.java svneol=native#text/plain forge-gui/src/main/java/forge/gui/toolbox/special/CardViewer.java -text forge-gui/src/main/java/forge/gui/toolbox/special/CardZoomer.java -text diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/ItemManagerModel.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/ItemManagerModel.java index aaf7f356d52..881947cac6d 100644 --- a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/ItemManagerModel.java +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/ItemManagerModel.java @@ -18,12 +18,17 @@ package forge.gui.toolbox.itemmanager; import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import forge.gui.toolbox.itemmanager.views.ItemColumn; +import forge.gui.toolbox.itemmanager.views.ItemColumn.SortState; import forge.item.InventoryItem; import forge.util.ItemPool; +import forge.util.ItemPoolSorter; /** *

@@ -36,8 +41,11 @@ import forge.util.ItemPool; * @version $Id: ItemManagerModel.java 19857 2013-02-24 08:49:52Z Max mtg $ */ public final class ItemManagerModel { + private static final int maxSortDepth = 3; + private final ItemPool data; private boolean infiniteSupply; + private final CascadeManager cascadeManager = new CascadeManager(); /** * Instantiates a new list view model @@ -152,4 +160,136 @@ public final class ItemManagerModel { public boolean isInfinite() { return infiniteSupply; } + + public CascadeManager getCascadeManager() { + return cascadeManager; + } + + /** + * Resort. + */ + public void refreshSort() { + if (this.getOrderedList().isEmpty()) { return; } + + Collections.sort(this.getOrderedList(), new MyComparator()); + } + + /** + * Manages sorting orders for multiple depths of sorting. + */ + public final class CascadeManager { + private final List colsToSort = new ArrayList(3); + private Sorter sorter = null; + + // Adds a column to sort cascade list. + // If column is first in the cascade, inverts direction of sort. + // Otherwise, sorts in ascending direction. + public void add(final ItemColumn col0, boolean forSetup) { + this.sorter = null; + + if (forSetup) { //just add column unmodified if setting up sort columns + this.colsToSort.add(0, (ItemColumn) col0); + } + else { + if (colsToSort.size() > 0 && colsToSort.get(0).equals(col0)) { //if column already at top level, just invert + col0.setSortPriority(1); + col0.setSortState(col0.getSortState() == SortState.ASC ? SortState.DESC : SortState.ASC); + } + else { //otherwise move column to top level and move others down + this.colsToSort.remove(col0); + col0.setSortPriority(1); + col0.setSortState(col0.getDefaultSortState()); + this.colsToSort.add(0, (ItemColumn) col0); + } + + //decrement sort priority on remaining columns + for (int i = 1; i < maxSortDepth; i++) { + if (colsToSort.size() == i) { break; } + + if (colsToSort.get(i).getSortPriority() != 0) { + colsToSort.get(i).setSortPriority(i + 1); + } + } + } + + //unset and remove boundary columns. + if (this.colsToSort.size() > maxSortDepth) { + this.colsToSort.get(maxSortDepth).setSortPriority(0); + this.colsToSort.remove(maxSortDepth); + } + } + + public Sorter getSorter() { + if (this.sorter == null) { + this.sorter = createSorter(); + } + return this.sorter; + } + + public void reset() { + this.colsToSort.clear(); + this.sorter = null; + } + + private Sorter createSorter() { + final List> oneColSorters + = new ArrayList>(maxSortDepth); + + for (final ItemColumn col : this.colsToSort) { + oneColSorters.add(new ItemPoolSorter( + col.getFnSort(), + col.getSortState().equals(SortState.ASC) ? true : false)); + } + + return new Sorter(oneColSorters); + } + + public class Sorter implements Comparator> { + private final List> sorters; + private final int cntFields; + + /** + * + * Sorter Constructor. + * + * @param sorters0 + * a List> + */ + public Sorter(final List> sorters0) { + this.sorters = sorters0; + this.cntFields = sorters0.size(); + } + + /* + * (non-Javadoc) + * + * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object) + */ + @Override + public final int compare(final Entry arg0, final Entry arg1) { + int lastCompare = 0; + int iField = -1; + while ((++iField < this.cntFields) && (lastCompare == 0)) { // reverse + // iteration + final ItemPoolSorter sorter = this.sorters.get(iField); + if (sorter == null) { + break; + } + lastCompare = sorter.compare(arg0, arg1); + } + return lastCompare; + } + } + } + + private class MyComparator implements Comparator> { + /* (non-Javadoc) + * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object) + */ + @SuppressWarnings("unchecked") + @Override + public int compare(Entry o1, Entry o2) { + return cascadeManager.getSorter().compare((Entry)o1, (Entry)o2); + } + } } // ItemManagerModel diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ImageView.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ImageView.java index 5a5af02fb03..0a8f5d310af 100644 --- a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ImageView.java +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ImageView.java @@ -13,8 +13,6 @@ import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; import java.awt.image.BufferedImage; import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; import java.util.List; import java.util.Map.Entry; @@ -46,16 +44,14 @@ public class ImageView extends ItemView { } private final CardViewDisplay display; - private final ItemManagerModel model; private List selectedIndices = new ArrayList(); private int imageScaleFactor = 3; private boolean allowMultipleSelections; private LayoutType layoutType = LayoutType.Spreadsheet; public ImageView(ItemManager itemManager0, ItemManagerModel model0) { - super(itemManager0); + super(itemManager0, model0); this.display = new CardViewDisplay(); - this.model = model0; this.display.addMouseListener(new FMouseAdapter() { @Override public void onLeftMouseDown(MouseEvent e) { @@ -64,13 +60,13 @@ public class ImageView extends ItemView { @Override public void onLeftDoubleClick(MouseEvent e) { - getItemManager().activateSelectedItems(); + itemManager.activateSelectedItems(); } @Override public void onRightClick(MouseEvent e) { selectItem(e); - getItemManager().showContextMenu(e); + itemManager.showContextMenu(e); } private void selectItem(MouseEvent e) { @@ -192,7 +188,7 @@ public class ImageView extends ItemView { @Override protected SkinImage getIcon() { - if (getItemManager().getGenericType().equals(DeckProxy.class)) { + if (itemManager.getGenericType().equals(DeckProxy.class)) { return FSkin.getImage(FSkin.EditorImages.IMG_PACK).resize(18, 18); } return FSkin.getIcon(FSkin.InterfaceIcons.ICO_CARD_IMAGE); @@ -291,8 +287,9 @@ public class ImageView extends ItemView { private Integer index; private boolean selected; - private ItemInfo(T item0) { + private ItemInfo(T item0, int index0) { this.item = item0; + this.index = index0; } @Override @@ -315,21 +312,13 @@ public class ImageView extends ItemView { } private void refresh() { + int index = 0; this.items.clear(); - for (Entry itemEntry : model.getItems()) { + for (Entry itemEntry : model.getOrderedList()) { for (int i = 0; i < itemEntry.getValue(); i++) { - this.items.add(new ItemInfo(itemEntry.getKey())); + this.items.add(new ItemInfo(itemEntry.getKey(), index++)); } } - Collections.sort(this.items, new Comparator() { - @Override - public int compare(ItemInfo arg0, ItemInfo arg1) { - return arg0.item.getName().compareTo(arg1.item.getName()); - } - }); - for (int i = 0; i < this.items.size(); i++) { - this.items.get(i).index = i; - } this.refreshSections(); } diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ItemListView.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ItemListView.java index d11b2d5ded8..57b23df82e0 100644 --- a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ItemListView.java +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ItemListView.java @@ -66,9 +66,7 @@ import forge.gui.toolbox.FSkin.SkinnedTableHeader; import forge.gui.toolbox.itemmanager.ItemManager; import forge.gui.toolbox.itemmanager.ItemManagerModel; import forge.gui.toolbox.itemmanager.SItemManagerIO; -import forge.gui.toolbox.itemmanager.views.ItemColumn.SortState; import forge.item.InventoryItem; -import forge.util.ItemPoolSorter; /** @@ -104,7 +102,7 @@ public final class ItemListView extends ItemView { * @param model0 */ public ItemListView(ItemManager itemManager0, ItemManagerModel model0) { - super(itemManager0); + super(itemManager0, model0); this.tableModel = new ItemTableModel(model0); // use different selection highlight colors for focused vs. unfocused tables @@ -112,12 +110,12 @@ public final class ItemListView extends ItemView { @Override public void onLeftDoubleClick(MouseEvent e) { if (e.isConsumed()) { return; } //don't activate if inline button double clicked - getItemManager().activateSelectedItems(); + itemManager.activateSelectedItems(); } @Override public void onRightClick(MouseEvent e) { - getItemManager().showContextMenu(e); + itemManager.showContextMenu(e); } }); @@ -274,7 +272,6 @@ public final class ItemListView extends ItemView { @Override protected void onRefresh() { - this.tableModel.refreshSort(); this.tableModel.fireTableDataChanged(); } @@ -444,8 +441,6 @@ public final class ItemListView extends ItemView { public final class ItemTableModel extends AbstractTableModel { private final ItemManagerModel model; - private final CascadeManager cascadeManager = new CascadeManager(); - private final int maxSortDepth = 3; /** * Instantiates a new table model. @@ -469,12 +464,12 @@ public final class ItemListView extends ItemView { } } - cascadeManager.reset(); + model.getCascadeManager().reset(); for (int i = sortcols.length - 1; i >= 0; i--) { ItemColumn col = sortcols[i]; if (col != null) { - cascadeManager.add(col, true); + model.getCascadeManager().add(col, true); } } } @@ -537,17 +532,17 @@ public final class ItemListView extends ItemView { } // This will invert if needed - ItemTableModel.this.cascadeManager.add((ItemColumn) table.getColumnModel().getColumn(columnModelIndex), false); - ItemTableModel.this.refreshSort(); + model.getCascadeManager().add((ItemColumn) table.getColumnModel().getColumn(columnModelIndex), false); + model.refreshSort(); table.tableChanged(new TableModelEvent(ItemTableModel.this)); table.repaint(); ItemListView.this.setSelectedIndex(0); - SItemManagerIO.savePreferences(getItemManager()); + SItemManagerIO.savePreferences(itemManager); } @Override public void onLeftMouseDragDrop(MouseEvent e) { //save preferences after column moved/resized - SItemManagerIO.savePreferences(getItemManager()); + SItemManagerIO.savePreferences(itemManager); } }; @@ -568,15 +563,6 @@ public final class ItemListView extends ItemView { table.getTableHeader().addMouseListener(headerMouseAdapter); } - /** - * Resort. - */ - private void refreshSort() { - if (this.model.getOrderedList().size() == 0) { return; } - - Collections.sort(this.model.getOrderedList(), new MyComparator()); - } - //========== Overridden from AbstractTableModel /** {@inheritDoc} */ @Override @@ -614,87 +600,5 @@ public final class ItemListView extends ItemView { //========= Custom class handling - /** - * Manages sorting orders for multiple depths of sorting. - */ - private final class CascadeManager { - private final List colsToSort = new ArrayList(3); - private TableSorterCascade sorter = null; - - // Adds a column to sort cascade list. - // If column is first in the cascade, inverts direction of sort. - // Otherwise, sorts in ascending direction. - public void add(final ItemColumn col0, boolean forSetup) { - this.sorter = null; - - if (forSetup) { //just add column unmodified if setting up sort columns - this.colsToSort.add(0, (ItemColumn) col0); - } - else { - if (colsToSort.size() > 0 && colsToSort.get(0).equals(col0)) { //if column already at top level, just invert - col0.setSortPriority(1); - col0.setSortState(col0.getSortState() == SortState.ASC ? SortState.DESC : SortState.ASC); - } - else { //otherwise move column to top level and move others down - this.colsToSort.remove(col0); - col0.setSortPriority(1); - col0.setSortState(col0.getDefaultSortState()); - this.colsToSort.add(0, (ItemColumn) col0); - } - - //decrement sort priority on remaining columns - for (int i = 1; i < maxSortDepth; i++) { - if (colsToSort.size() == i) { break; } - - if (colsToSort.get(i).getSortPriority() != 0) { - colsToSort.get(i).setSortPriority(i + 1); - } - } - } - - //unset and remove boundary columns. - if (this.colsToSort.size() > maxSortDepth) { - this.colsToSort.get(maxSortDepth).setSortPriority(0); - this.colsToSort.remove(maxSortDepth); - } - } - - public TableSorterCascade getSorter() { - if (this.sorter == null) { - this.sorter = createSorter(); - } - return this.sorter; - } - - public void reset() { - this.colsToSort.clear(); - this.sorter = null; - } - - private TableSorterCascade createSorter() { - final List> oneColSorters - = new ArrayList>(maxSortDepth); - - for (final ItemColumn col : this.colsToSort) { - oneColSorters.add(new ItemPoolSorter( - col.getFnSort(), - col.getSortState().equals(SortState.ASC) ? true : false)); - } - - return new TableSorterCascade(oneColSorters); - } - } - - private class MyComparator implements Comparator> { - /* (non-Javadoc) - * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object) - */ - @SuppressWarnings("unchecked") - @Override - public int compare(Entry o1, Entry o2) { - return ItemTableModel.this.cascadeManager.getSorter().compare( - (Entry) o1, (Entry) o2); - } - } } } diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ItemView.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ItemView.java index 1e0742a7175..b6c6b0b303b 100644 --- a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ItemView.java +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ItemView.java @@ -36,17 +36,20 @@ import forge.gui.toolbox.FSkin; import forge.gui.toolbox.FSkin.SkinImage; import forge.gui.toolbox.ToolTipListener; import forge.gui.toolbox.itemmanager.ItemManager; +import forge.gui.toolbox.itemmanager.ItemManagerModel; import forge.item.InventoryItem; public abstract class ItemView { - private final ItemManager itemManager; + protected final ItemManager itemManager; + protected final ItemManagerModel model; private final FScrollPane scroller; private final FLabel button; private int heightBackup; private boolean isIncrementalSearchActive = false; - protected ItemView(ItemManager itemManager0) { + protected ItemView(ItemManager itemManager0, ItemManagerModel model0) { this.itemManager = itemManager0; + this.model = model0; this.scroller = new FScrollPane(false); this.scroller.setBorder(new FSkin.LineSkinBorder(FSkin.getColor(FSkin.Colors.CLR_TEXT))); this.button = new FLabel.Builder().hoverable().selectable(true) @@ -90,10 +93,6 @@ public abstract class ItemView { }); } - public ItemManager getItemManager() { - return this.itemManager; - } - public FLabel getButton() { return this.button; } @@ -107,6 +106,7 @@ public abstract class ItemView { } public void refresh(final Iterable itemsToSelect, final int backupIndexToSelect) { + this.model.refreshSort(); onRefresh(); fixSelection(itemsToSelect, backupIndexToSelect); } @@ -222,7 +222,7 @@ public abstract class ItemView { protected void onSelectionChange() { final int index = getSelectedIndex(); if (index != -1) { - ListSelectionEvent event = new ListSelectionEvent(getItemManager(), index, index, false); + ListSelectionEvent event = new ListSelectionEvent(itemManager, index, index, false); for (ListSelectionListener listener : itemManager.getSelectionListeners()) { listener.valueChanged(event); } diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/TableSorterCascade.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/TableSorterCascade.java deleted file mode 100644 index 0859b3b1006..00000000000 --- a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/TableSorterCascade.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Forge: Play Magic: the Gathering. - * Copyright (C) 2011 Forge Team - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package forge.gui.toolbox.itemmanager.views; - -import java.util.Comparator; -import java.util.List; -import java.util.Map.Entry; - -import forge.item.InventoryItem; -import forge.util.ItemPoolSorter; - -/** - *

- * TableSorter class. - *

- * - * @param - * extends InventoryItem - * @author Forge - * @version $Id: TableSorter.java 10146 2011-09-01 18:11:00Z Max mtg $ - */ -public class TableSorterCascade implements Comparator> { - private final List> sorters; - private final int cntFields; - - /** - * - * TableSorterCascade Constructor. - * - * @param sortersCascade - * a List> - */ - public TableSorterCascade(final List> sortersCascade) { - this.sorters = sortersCascade; - this.cntFields = sortersCascade.size(); - } - - /* - * (non-Javadoc) - * - * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object) - */ - @Override - public final int compare(final Entry arg0, final Entry arg1) { - int lastCompare = 0; - int iField = -1; - while ((++iField < this.cntFields) && (lastCompare == 0)) { // reverse - // iteration - final ItemPoolSorter sorter = this.sorters.get(iField); - if (sorter == null) { - break; - } - lastCompare = sorter.compare(arg0, arg1); - } - return lastCompare; - } -}