diff --git a/forge-core/src/main/java/forge/deck/DeckBase.java b/forge-core/src/main/java/forge/deck/DeckBase.java index 847879d982e..40f3ba83ff3 100644 --- a/forge-core/src/main/java/forge/deck/DeckBase.java +++ b/forge-core/src/main/java/forge/deck/DeckBase.java @@ -76,6 +76,16 @@ public abstract class DeckBase implements Serializable, Comparable, In return this.name; } + @Override + public String toString() { + return this.name; + } + + @Override + public Comparable getCompareValue() { + return this.name; + } + /** * Sets the comment. * @@ -133,5 +143,4 @@ public abstract class DeckBase implements Serializable, Comparable, In public final String getBestFileName() { return this.getName().replaceAll("[^-_$#@.,{[()]} a-zA-Z0-9]", ""); } - } diff --git a/forge-core/src/main/java/forge/item/InventoryItem.java b/forge-core/src/main/java/forge/item/InventoryItem.java index 79d8775dbe7..650f259857d 100644 --- a/forge-core/src/main/java/forge/item/InventoryItem.java +++ b/forge-core/src/main/java/forge/item/InventoryItem.java @@ -31,4 +31,11 @@ public interface InventoryItem extends IHasName * @return the type */ String getItemType(); + + /** + * Return object used to compare this item with other items + * + * @return the compare object + */ + Comparable getCompareValue(); } diff --git a/forge-core/src/main/java/forge/item/PaperCard.java b/forge-core/src/main/java/forge/item/PaperCard.java index 50faeb151aa..260894943b8 100644 --- a/forge-core/src/main/java/forge/item/PaperCard.java +++ b/forge-core/src/main/java/forge/item/PaperCard.java @@ -172,6 +172,11 @@ public final class PaperCard implements Comparable, InventoryItemFro // return String.format("%s|%s", name, cardSet); } + @Override + public Comparable getCompareValue() { + return this.name; + } + /* * (non-Javadoc) * diff --git a/forge-core/src/main/java/forge/item/PaperToken.java b/forge-core/src/main/java/forge/item/PaperToken.java index e5a2fc7303f..65be20acbb6 100644 --- a/forge-core/src/main/java/forge/item/PaperToken.java +++ b/forge-core/src/main/java/forge/item/PaperToken.java @@ -47,6 +47,10 @@ public class PaperToken implements InventoryItemFromSet, IPaperCard { @Override public String getName() { return name; } + @Override public String toString() { return name; } + + @Override public Comparable getCompareValue() { return name; } + @Override public String getEdition() { return edition.getCode(); } @Override public int getArtIndex() { return 0; } // This might change however diff --git a/forge-core/src/main/java/forge/item/PreconDeck.java b/forge-core/src/main/java/forge/item/PreconDeck.java index 448a7cd5376..1b9f42cbe25 100644 --- a/forge-core/src/main/java/forge/item/PreconDeck.java +++ b/forge-core/src/main/java/forge/item/PreconDeck.java @@ -63,6 +63,16 @@ public class PreconDeck implements InventoryItemFromSet { return "Prebuilt Deck"; } + @Override + public String toString() { + return this.deck.toString(); + } + + @Override + public Comparable getCompareValue() { + return this.deck.getCompareValue(); + } + public PreconDeck(final Deck d, String set, String description) { deck = d; this.set = set; diff --git a/forge-core/src/main/java/forge/item/SealedProduct.java b/forge-core/src/main/java/forge/item/SealedProduct.java index 6327653af4f..239e4224ac7 100644 --- a/forge-core/src/main/java/forge/item/SealedProduct.java +++ b/forge-core/src/main/java/forge/item/SealedProduct.java @@ -99,6 +99,16 @@ public abstract class SealedProduct implements InventoryItemFromSet { return hash; } + @Override + public String toString() { + return getName(); + } + + @Override + public Comparable getCompareValue() { + return getName(); + } + protected List generate() { return BoosterGenerator.getBoosterPack(contents); } diff --git a/forge-gui/src/main/java/forge/gui/deckchooser/FDeckChooser.java b/forge-gui/src/main/java/forge/gui/deckchooser/FDeckChooser.java index c8d288df2a3..c674f8e50aa 100644 --- a/forge-gui/src/main/java/forge/gui/deckchooser/FDeckChooser.java +++ b/forge-gui/src/main/java/forge/gui/deckchooser/FDeckChooser.java @@ -5,6 +5,7 @@ import java.util.Arrays; import java.util.List; import javax.swing.JPanel; + import net.miginfocom.swing.MigLayout; import org.apache.commons.lang3.StringUtils; @@ -113,8 +114,16 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener { } private class ColorDeckGenerator extends DeckGenerator { - public ColorDeckGenerator(String name0) { + private int index; + + public ColorDeckGenerator(String name0, int index0) { super(name0); + this.index = index0; + } + + @Override + public Comparable getCompareValue() { + return this.index; //ensure color items appear in proper order } @Override @@ -133,15 +142,12 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener { private void updateColors() { lstDecks.setAllowMultipleSelections(true); + String[] colors = new String[] { "Random 1", "Random 2", "Random 3", + "White", "Blue", "Black", "Red", "Green" }; ArrayList decks = new ArrayList(); - decks.add(new ColorDeckGenerator("Random 1")); - decks.add(new ColorDeckGenerator("Random 2")); - decks.add(new ColorDeckGenerator("Random 3")); - decks.add(new ColorDeckGenerator("White")); - decks.add(new ColorDeckGenerator("Blue")); - decks.add(new ColorDeckGenerator("Black")); - decks.add(new ColorDeckGenerator("Red")); - decks.add(new ColorDeckGenerator("Green")); + for (int i = 0; i < colors.length; i++) { + decks.add(new ColorDeckGenerator(colors[i], i)); + } lstDecks.setPool(decks); lstDecks.update(true); diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/DeckManager.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/DeckManager.java index 879335227fc..ac7bd747103 100644 --- a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/DeckManager.java +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/DeckManager.java @@ -6,8 +6,6 @@ import java.awt.Rectangle; import java.awt.event.MouseEvent; import java.util.List; import java.util.Map; -import java.util.Map.Entry; - import javax.swing.JMenu; import javax.swing.JTable; import javax.swing.event.ListSelectionEvent; @@ -56,7 +54,7 @@ public final class DeckManager extends ItemManager { private static final FSkin.SkinIcon icoEditOver = FSkin.getIcon(FSkin.InterfaceIcons.ICO_EDIT_OVER); private final GameType gametype; - private boolean nameOnly, preventEdit; + private boolean stringOnly, preventEdit; private Command cmdDelete, cmdSelect; private final Map columns = SColumnUtil.getColumns( ColumnDef.DECK_ACTIONS, @@ -102,28 +100,27 @@ public final class DeckManager extends ItemManager { public void update() { update(false, false); } - public void update(boolean nameOnly0) { - update(nameOnly0, nameOnly0); + public void update(boolean stringOnly0) { + update(stringOnly0, stringOnly0); } - public void update(boolean nameOnly0, boolean preventEdit0) { - if (this.nameOnly != nameOnly0) { - this.nameOnly = nameOnly0; - boolean visible = !nameOnly0; - for (Entry column : columns.entrySet()) { - if (column.getKey() != ColumnDef.NAME) { - column.getValue().setVisible(visible); - } - } + public void update(boolean stringOnly0, boolean preventEdit0) { + if (this.stringOnly != stringOnly0) { + this.stringOnly = stringOnly0; this.restoreDefaultFilters(); } - if (nameOnly0) { + if (stringOnly0) { preventEdit0 = true; //if name only, always prevent edit } if (this.preventEdit != preventEdit0) { this.preventEdit = preventEdit0; columns.get(ColumnDef.DECK_ACTIONS).setVisible(!preventEdit0); } - this.getTable().setup(columns); + if (stringOnly0) { + this.getTable().setup(SColumnUtil.getStringColumn()); + } + else { + this.getTable().setup(columns); + } } /** @@ -146,7 +143,7 @@ public final class DeckManager extends ItemManager { @Override protected void addDefaultFilters() { - if (!this.nameOnly) { + if (!this.stringOnly) { addFilter(new DeckColorFilter(this)); } } @@ -158,7 +155,7 @@ public final class DeckManager extends ItemManager { @Override protected void buildAddFilterMenu(JMenu menu) { - if (this.nameOnly) { return; } + if (this.stringOnly) { return; } GuiUtils.addSeparator(menu); //separate from current search item diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/ItemManager.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/ItemManager.java index dd394bce315..174456ba51a 100644 --- a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/ItemManager.java +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/ItemManager.java @@ -917,7 +917,7 @@ public abstract class ItemManager extends JPanel { this.model.addItems(this.pool); } - this.table.refresh(itemsToSelect, backupIndexToSelect, false); + this.table.refresh(itemsToSelect, backupIndexToSelect); for (ItemFilter filter : this.orderedFilters) { filter.afterFiltersApplied(); diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ItemColumn.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ItemColumn.java index 64f7a12972c..ca37c09b05a 100644 --- a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ItemColumn.java +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ItemColumn.java @@ -52,7 +52,6 @@ import forge.limited.DraftRankCache; * * @param a generic type */ - public class ItemColumn extends TableColumn { private static final long serialVersionUID = 3749431834643427572L; @@ -166,6 +165,19 @@ public class ItemColumn extends TableColumn { } public enum ColumnDef { + STRING("", "", 0, -1, -1, SortState.ASC, new ItemCellRenderer(), + new Function, Comparable>() { + @Override + public Comparable apply(final Entry from) { + return from.getKey().getCompareValue(); + } + }, + new Function, Object>() { + @Override + public Object apply(final Entry from) { + return from.getKey().toString(); + } + }), NAME("Name", "Name", 180, -1, -1, SortState.ASC, new ItemCellRenderer(), new Function, Comparable>() { @Override 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 7a85a02790e..2c2e3c34df7 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 @@ -20,6 +20,7 @@ package forge.gui.toolbox.itemmanager.views; import java.awt.Color; import java.awt.Component; import java.awt.Cursor; +import java.awt.Dimension; import java.awt.KeyboardFocusManager; import java.awt.Point; import java.awt.Rectangle; @@ -53,8 +54,6 @@ import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; import javax.swing.table.TableColumnModel; -import org.apache.commons.lang3.ArrayUtils; - import forge.gui.toolbox.FMouseAdapter; import forge.gui.toolbox.FSkin; import forge.gui.toolbox.FSkin.SkinnedTable; @@ -75,6 +74,8 @@ import forge.util.ItemPoolSorter; */ @SuppressWarnings("serial") public final class ItemListView extends ItemView { + private static final int ROW_HEIGHT = 20; + private final ItemTable table = new ItemTable(); private final ItemTableModel tableModel; @@ -127,8 +128,7 @@ public final class ItemListView extends ItemView { this.table.setFont(FSkin.getFont(12)); this.table.setBorder((Border)null); - this.table.getTableHeader().setBorder(null); - this.table.setRowHeight(20); + this.table.setRowHeight(ROW_HEIGHT); this.table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); // prevent tables from intercepting tab focus traversals @@ -160,14 +160,20 @@ public final class ItemListView extends ItemView { if (col.isVisible()) { colmodel.addColumn(col); } } + //hide table header if only showing single string column + if (cols.size() == 1 && cols.containsKey(ColumnDef.STRING)) { + this.table.getTableHeader().setPreferredSize(new Dimension(0, 0)); + } + else { + this.table.getTableHeader().setPreferredSize(new Dimension(0, ROW_HEIGHT)); + } + this.tableModel.addListeners(); this.table.setModel(this.tableModel); this.table.setColumnModel(colmodel); this.tableModel.setup(); - this.refresh(selectedItemsBefore, 0, false); - - this.table.getTableHeader().setBackground(new Color(200, 200, 200)); + this.refresh(selectedItemsBefore, 0); } public JTable getTable() { @@ -292,6 +298,8 @@ public final class ItemListView extends ItemView { return tableColumn.getLongName(); } }; + header.setBorder(null); + header.setBackground(new Color(200, 200, 200)); ((DefaultTableCellRenderer)header.getDefaultRenderer()).setHorizontalAlignment(SwingConstants.LEFT); return header; } @@ -412,22 +420,22 @@ public final class ItemListView extends ItemView { public void setup() { final Enumeration e = table.getColumnModel().getColumns(); - final TableColumn[] sortcols = new TableColumn[table.getColumnCount()]; + final ItemColumn[] sortcols = new ItemColumn[table.getColumnCount()]; // Assemble priority sort. while (e.hasMoreElements()) { final ItemColumn col = (ItemColumn) e.nextElement(); - if (col.getSortPriority() > 0 && col.getSortPriority() < sortcols.length) { - sortcols[col.getSortPriority()] = col; + if (col.getSortPriority() > 0 && col.getSortPriority() <= sortcols.length) { + sortcols[col.getSortPriority() - 1] = col; } } cascadeManager.reset(); - ArrayUtils.reverse(sortcols); - for (int i = 1; i < sortcols.length; i++) { - if (sortcols[i] != null) { - cascadeManager.add((ItemColumn) sortcols[i], true); + for (int i = sortcols.length - 1; i >= 0; i--) { + ItemColumn col = sortcols[i]; + if (col != null) { + cascadeManager.add(col, true); } } } @@ -499,14 +507,12 @@ public final class ItemListView extends ItemView { return; } - //backup selected items to restore - final Iterable selectedItemsBefore = getSelectedItems(); - // This will invert if needed ItemTableModel.this.cascadeManager.add((ItemColumn) table.getColumnModel().getColumn(columnModelIndex), false); - refresh(selectedItemsBefore, 0, true); + ItemTableModel.this.refreshSort(); table.tableChanged(new TableModelEvent(ItemTableModel.this)); table.repaint(); + ItemListView.this.setSelectedIndex(0); SItemManagerIO.savePreferences(getItemManager()); } 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 b18cc400923..bc04e987962 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 @@ -59,20 +59,9 @@ public abstract class ItemView { return this.isIncrementalSearchActive; } - public void refresh(final Iterable itemsToSelect, final int backupIndexToSelect, final boolean delaySelection) { + public void refresh(final Iterable itemsToSelect, final int backupIndexToSelect) { onRefresh(); - - if (delaySelection) { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - fixSelection(itemsToSelect, backupIndexToSelect); - } - }); - } - else { - fixSelection(itemsToSelect, backupIndexToSelect); - } + fixSelection(itemsToSelect, backupIndexToSelect); } protected abstract void onRefresh(); private void fixSelection(final Iterable itemsToSelect, final int backupIndexToSelect) { diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/SColumnUtil.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/SColumnUtil.java index f7bec11e88a..9ae3cc9cd8b 100644 --- a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/SColumnUtil.java +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/SColumnUtil.java @@ -46,6 +46,12 @@ public final class SColumnUtil { return columns; } + public static Map getStringColumn() { + Map columns = getColumns(ColumnDef.STRING); + columns.get(ColumnDef.STRING).setSortPriority(1); + return columns; + } + public static Map getCatalogDefaultColumns() { Map columns = getColumns( ColumnDef.FAVORITE, diff --git a/forge-gui/src/main/java/forge/quest/QuestRewardCardChooser.java b/forge-gui/src/main/java/forge/quest/QuestRewardCardChooser.java index 6b9ec883ad9..f099dc86b0a 100644 --- a/forge-gui/src/main/java/forge/quest/QuestRewardCardChooser.java +++ b/forge-gui/src/main/java/forge/quest/QuestRewardCardChooser.java @@ -19,7 +19,6 @@ import forge.util.ItemPool; * */ public class QuestRewardCardChooser extends QuestRewardCard implements InventoryItem { - /** * Possible types for this object. */ @@ -61,6 +60,16 @@ public class QuestRewardCardChooser extends QuestRewardCard implements Inventory return description; } + @Override + public String toString() { + return description; + } + + @Override + public Comparable getCompareValue() { + return description; + } + /** * The item type. * diff --git a/forge-gui/src/main/java/forge/quest/QuestRewardCardDuplicate.java b/forge-gui/src/main/java/forge/quest/QuestRewardCardDuplicate.java index c8014eac524..7136d13e189 100644 --- a/forge-gui/src/main/java/forge/quest/QuestRewardCardDuplicate.java +++ b/forge-gui/src/main/java/forge/quest/QuestRewardCardDuplicate.java @@ -14,7 +14,6 @@ import forge.util.ItemPool; * */ public class QuestRewardCardDuplicate implements IQuestRewardCard { - private final String description; /** @@ -45,6 +44,16 @@ public class QuestRewardCardDuplicate implements IQuestRewardCard { return "duplicate card"; } + @Override + public String toString() { + return description; + } + + @Override + public Comparable getCompareValue() { + return description; + } + /** * Produces a list of options to choose from, in this case, * the player's current cards. diff --git a/forge-gui/src/main/java/forge/quest/QuestRewardCardFiltered.java b/forge-gui/src/main/java/forge/quest/QuestRewardCardFiltered.java index b46ae1d4449..6eee6bb4fea 100644 --- a/forge-gui/src/main/java/forge/quest/QuestRewardCardFiltered.java +++ b/forge-gui/src/main/java/forge/quest/QuestRewardCardFiltered.java @@ -15,7 +15,6 @@ import forge.item.PaperCard; * */ public class QuestRewardCardFiltered extends QuestRewardCard implements IQuestRewardCard { - private final String description; private final Predicate predicates; @@ -39,6 +38,15 @@ public class QuestRewardCardFiltered extends QuestRewardCard implements IQuestRe return description; } + @Override + public String toString() { + return description; + } + + @Override + public Comparable getCompareValue() { + return description; + } /** * The item type.