Don't retain selection when clicking to change column sort

Support showing color deck options in proper order with no column header
This commit is contained in:
drdev
2014-01-19 18:15:02 +00:00
parent 95709401a3
commit f0ce722aa4
16 changed files with 151 additions and 64 deletions

View File

@@ -76,6 +76,16 @@ public abstract class DeckBase implements Serializable, Comparable<DeckBase>, In
return this.name; return this.name;
} }
@Override
public String toString() {
return this.name;
}
@Override
public Comparable<?> getCompareValue() {
return this.name;
}
/** /**
* Sets the comment. * Sets the comment.
* *
@@ -133,5 +143,4 @@ public abstract class DeckBase implements Serializable, Comparable<DeckBase>, In
public final String getBestFileName() { public final String getBestFileName() {
return this.getName().replaceAll("[^-_$#@.,{[()]} a-zA-Z0-9]", ""); return this.getName().replaceAll("[^-_$#@.,{[()]} a-zA-Z0-9]", "");
} }
} }

View File

@@ -31,4 +31,11 @@ public interface InventoryItem extends IHasName
* @return the type * @return the type
*/ */
String getItemType(); String getItemType();
/**
* Return object used to compare this item with other items
*
* @return the compare object
*/
Comparable<?> getCompareValue();
} }

View File

@@ -172,6 +172,11 @@ public final class PaperCard implements Comparable<IPaperCard>, InventoryItemFro
// return String.format("%s|%s", name, cardSet); // return String.format("%s|%s", name, cardSet);
} }
@Override
public Comparable<?> getCompareValue() {
return this.name;
}
/* /*
* (non-Javadoc) * (non-Javadoc)
* *

View File

@@ -47,6 +47,10 @@ public class PaperToken implements InventoryItemFromSet, IPaperCard {
@Override public String getName() { return name; } @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 String getEdition() { return edition.getCode(); }
@Override public int getArtIndex() { return 0; } // This might change however @Override public int getArtIndex() { return 0; } // This might change however

View File

@@ -63,6 +63,16 @@ public class PreconDeck implements InventoryItemFromSet {
return "Prebuilt Deck"; 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) { public PreconDeck(final Deck d, String set, String description) {
deck = d; deck = d;
this.set = set; this.set = set;

View File

@@ -99,6 +99,16 @@ public abstract class SealedProduct implements InventoryItemFromSet {
return hash; return hash;
} }
@Override
public String toString() {
return getName();
}
@Override
public Comparable<?> getCompareValue() {
return getName();
}
protected List<PaperCard> generate() { protected List<PaperCard> generate() {
return BoosterGenerator.getBoosterPack(contents); return BoosterGenerator.getBoosterPack(contents);
} }

View File

@@ -5,6 +5,7 @@ import java.util.Arrays;
import java.util.List; import java.util.List;
import javax.swing.JPanel; import javax.swing.JPanel;
import net.miginfocom.swing.MigLayout; import net.miginfocom.swing.MigLayout;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@@ -113,8 +114,16 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener {
} }
private class ColorDeckGenerator extends DeckGenerator { private class ColorDeckGenerator extends DeckGenerator {
public ColorDeckGenerator(String name0) { private int index;
public ColorDeckGenerator(String name0, int index0) {
super(name0); super(name0);
this.index = index0;
}
@Override
public Comparable<?> getCompareValue() {
return this.index; //ensure color items appear in proper order
} }
@Override @Override
@@ -133,15 +142,12 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener {
private void updateColors() { private void updateColors() {
lstDecks.setAllowMultipleSelections(true); lstDecks.setAllowMultipleSelections(true);
String[] colors = new String[] { "Random 1", "Random 2", "Random 3",
"White", "Blue", "Black", "Red", "Green" };
ArrayList<Deck> decks = new ArrayList<Deck>(); ArrayList<Deck> decks = new ArrayList<Deck>();
decks.add(new ColorDeckGenerator("Random 1")); for (int i = 0; i < colors.length; i++) {
decks.add(new ColorDeckGenerator("Random 2")); decks.add(new ColorDeckGenerator(colors[i], i));
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"));
lstDecks.setPool(decks); lstDecks.setPool(decks);
lstDecks.update(true); lstDecks.update(true);

View File

@@ -6,8 +6,6 @@ import java.awt.Rectangle;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry;
import javax.swing.JMenu; import javax.swing.JMenu;
import javax.swing.JTable; import javax.swing.JTable;
import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionEvent;
@@ -56,7 +54,7 @@ public final class DeckManager extends ItemManager<Deck> {
private static final FSkin.SkinIcon icoEditOver = FSkin.getIcon(FSkin.InterfaceIcons.ICO_EDIT_OVER); private static final FSkin.SkinIcon icoEditOver = FSkin.getIcon(FSkin.InterfaceIcons.ICO_EDIT_OVER);
private final GameType gametype; private final GameType gametype;
private boolean nameOnly, preventEdit; private boolean stringOnly, preventEdit;
private Command cmdDelete, cmdSelect; private Command cmdDelete, cmdSelect;
private final Map<ColumnDef, ItemColumn> columns = SColumnUtil.getColumns( private final Map<ColumnDef, ItemColumn> columns = SColumnUtil.getColumns(
ColumnDef.DECK_ACTIONS, ColumnDef.DECK_ACTIONS,
@@ -102,29 +100,28 @@ public final class DeckManager extends ItemManager<Deck> {
public void update() { public void update() {
update(false, false); update(false, false);
} }
public void update(boolean nameOnly0) { public void update(boolean stringOnly0) {
update(nameOnly0, nameOnly0); update(stringOnly0, stringOnly0);
}
public void update(boolean nameOnly0, boolean preventEdit0) {
if (this.nameOnly != nameOnly0) {
this.nameOnly = nameOnly0;
boolean visible = !nameOnly0;
for (Entry<ColumnDef, ItemColumn> 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(); this.restoreDefaultFilters();
} }
if (nameOnly0) { if (stringOnly0) {
preventEdit0 = true; //if name only, always prevent edit preventEdit0 = true; //if name only, always prevent edit
} }
if (this.preventEdit != preventEdit0) { if (this.preventEdit != preventEdit0) {
this.preventEdit = preventEdit0; this.preventEdit = preventEdit0;
columns.get(ColumnDef.DECK_ACTIONS).setVisible(!preventEdit0); columns.get(ColumnDef.DECK_ACTIONS).setVisible(!preventEdit0);
} }
if (stringOnly0) {
this.getTable().setup(SColumnUtil.getStringColumn());
}
else {
this.getTable().setup(columns); this.getTable().setup(columns);
} }
}
/** /**
* Sets the delete command. * Sets the delete command.
@@ -146,7 +143,7 @@ public final class DeckManager extends ItemManager<Deck> {
@Override @Override
protected void addDefaultFilters() { protected void addDefaultFilters() {
if (!this.nameOnly) { if (!this.stringOnly) {
addFilter(new DeckColorFilter(this)); addFilter(new DeckColorFilter(this));
} }
} }
@@ -158,7 +155,7 @@ public final class DeckManager extends ItemManager<Deck> {
@Override @Override
protected void buildAddFilterMenu(JMenu menu) { protected void buildAddFilterMenu(JMenu menu) {
if (this.nameOnly) { return; } if (this.stringOnly) { return; }
GuiUtils.addSeparator(menu); //separate from current search item GuiUtils.addSeparator(menu); //separate from current search item

View File

@@ -917,7 +917,7 @@ public abstract class ItemManager<T extends InventoryItem> extends JPanel {
this.model.addItems(this.pool); this.model.addItems(this.pool);
} }
this.table.refresh(itemsToSelect, backupIndexToSelect, false); this.table.refresh(itemsToSelect, backupIndexToSelect);
for (ItemFilter<? extends T> filter : this.orderedFilters) { for (ItemFilter<? extends T> filter : this.orderedFilters) {
filter.afterFiltersApplied(); filter.afterFiltersApplied();

View File

@@ -52,7 +52,6 @@ import forge.limited.DraftRankCache;
* *
* @param <T> a generic type * @param <T> a generic type
*/ */
public class ItemColumn extends TableColumn { public class ItemColumn extends TableColumn {
private static final long serialVersionUID = 3749431834643427572L; private static final long serialVersionUID = 3749431834643427572L;
@@ -166,6 +165,19 @@ public class ItemColumn extends TableColumn {
} }
public enum ColumnDef { public enum ColumnDef {
STRING("", "", 0, -1, -1, SortState.ASC, new ItemCellRenderer(),
new Function<Entry<InventoryItem, Integer>, Comparable<?>>() {
@Override
public Comparable<?> apply(final Entry<InventoryItem, Integer> from) {
return from.getKey().getCompareValue();
}
},
new Function<Entry<? extends InventoryItem, Integer>, Object>() {
@Override
public Object apply(final Entry<? extends InventoryItem, Integer> from) {
return from.getKey().toString();
}
}),
NAME("Name", "Name", 180, -1, -1, SortState.ASC, new ItemCellRenderer(), NAME("Name", "Name", 180, -1, -1, SortState.ASC, new ItemCellRenderer(),
new Function<Entry<InventoryItem, Integer>, Comparable<?>>() { new Function<Entry<InventoryItem, Integer>, Comparable<?>>() {
@Override @Override

View File

@@ -20,6 +20,7 @@ package forge.gui.toolbox.itemmanager.views;
import java.awt.Color; import java.awt.Color;
import java.awt.Component; import java.awt.Component;
import java.awt.Cursor; import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.KeyboardFocusManager; import java.awt.KeyboardFocusManager;
import java.awt.Point; import java.awt.Point;
import java.awt.Rectangle; import java.awt.Rectangle;
@@ -53,8 +54,6 @@ import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn; import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel; import javax.swing.table.TableColumnModel;
import org.apache.commons.lang3.ArrayUtils;
import forge.gui.toolbox.FMouseAdapter; import forge.gui.toolbox.FMouseAdapter;
import forge.gui.toolbox.FSkin; import forge.gui.toolbox.FSkin;
import forge.gui.toolbox.FSkin.SkinnedTable; import forge.gui.toolbox.FSkin.SkinnedTable;
@@ -75,6 +74,8 @@ import forge.util.ItemPoolSorter;
*/ */
@SuppressWarnings("serial") @SuppressWarnings("serial")
public final class ItemListView<T extends InventoryItem> extends ItemView<T> { public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
private static final int ROW_HEIGHT = 20;
private final ItemTable table = new ItemTable(); private final ItemTable table = new ItemTable();
private final ItemTableModel tableModel; private final ItemTableModel tableModel;
@@ -127,8 +128,7 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
this.table.setFont(FSkin.getFont(12)); this.table.setFont(FSkin.getFont(12));
this.table.setBorder((Border)null); this.table.setBorder((Border)null);
this.table.getTableHeader().setBorder(null); this.table.setRowHeight(ROW_HEIGHT);
this.table.setRowHeight(20);
this.table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); this.table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
// prevent tables from intercepting tab focus traversals // prevent tables from intercepting tab focus traversals
@@ -160,14 +160,20 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
if (col.isVisible()) { colmodel.addColumn(col); } 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.tableModel.addListeners();
this.table.setModel(this.tableModel); this.table.setModel(this.tableModel);
this.table.setColumnModel(colmodel); this.table.setColumnModel(colmodel);
this.tableModel.setup(); this.tableModel.setup();
this.refresh(selectedItemsBefore, 0, false); this.refresh(selectedItemsBefore, 0);
this.table.getTableHeader().setBackground(new Color(200, 200, 200));
} }
public JTable getTable() { public JTable getTable() {
@@ -292,6 +298,8 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
return tableColumn.getLongName(); return tableColumn.getLongName();
} }
}; };
header.setBorder(null);
header.setBackground(new Color(200, 200, 200));
((DefaultTableCellRenderer)header.getDefaultRenderer()).setHorizontalAlignment(SwingConstants.LEFT); ((DefaultTableCellRenderer)header.getDefaultRenderer()).setHorizontalAlignment(SwingConstants.LEFT);
return header; return header;
} }
@@ -412,22 +420,22 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
public void setup() { public void setup() {
final Enumeration<TableColumn> e = table.getColumnModel().getColumns(); final Enumeration<TableColumn> e = table.getColumnModel().getColumns();
final TableColumn[] sortcols = new TableColumn[table.getColumnCount()]; final ItemColumn[] sortcols = new ItemColumn[table.getColumnCount()];
// Assemble priority sort. // Assemble priority sort.
while (e.hasMoreElements()) { while (e.hasMoreElements()) {
final ItemColumn col = (ItemColumn) e.nextElement(); final ItemColumn col = (ItemColumn) e.nextElement();
if (col.getSortPriority() > 0 && col.getSortPriority() < sortcols.length) { if (col.getSortPriority() > 0 && col.getSortPriority() <= sortcols.length) {
sortcols[col.getSortPriority()] = col; sortcols[col.getSortPriority() - 1] = col;
} }
} }
cascadeManager.reset(); cascadeManager.reset();
ArrayUtils.reverse(sortcols); for (int i = sortcols.length - 1; i >= 0; i--) {
for (int i = 1; i < sortcols.length; i++) { ItemColumn col = sortcols[i];
if (sortcols[i] != null) { if (col != null) {
cascadeManager.add((ItemColumn) sortcols[i], true); cascadeManager.add(col, true);
} }
} }
} }
@@ -499,14 +507,12 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
return; return;
} }
//backup selected items to restore
final Iterable<T> selectedItemsBefore = getSelectedItems();
// This will invert if needed // This will invert if needed
ItemTableModel.this.cascadeManager.add((ItemColumn) table.getColumnModel().getColumn(columnModelIndex), false); ItemTableModel.this.cascadeManager.add((ItemColumn) table.getColumnModel().getColumn(columnModelIndex), false);
refresh(selectedItemsBefore, 0, true); ItemTableModel.this.refreshSort();
table.tableChanged(new TableModelEvent(ItemTableModel.this)); table.tableChanged(new TableModelEvent(ItemTableModel.this));
table.repaint(); table.repaint();
ItemListView.this.setSelectedIndex(0);
SItemManagerIO.savePreferences(getItemManager()); SItemManagerIO.savePreferences(getItemManager());
} }

View File

@@ -59,21 +59,10 @@ public abstract class ItemView<T extends InventoryItem> {
return this.isIncrementalSearchActive; return this.isIncrementalSearchActive;
} }
public void refresh(final Iterable<T> itemsToSelect, final int backupIndexToSelect, final boolean delaySelection) { public void refresh(final Iterable<T> itemsToSelect, final int backupIndexToSelect) {
onRefresh(); onRefresh();
if (delaySelection) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
fixSelection(itemsToSelect, backupIndexToSelect); fixSelection(itemsToSelect, backupIndexToSelect);
} }
});
}
else {
fixSelection(itemsToSelect, backupIndexToSelect);
}
}
protected abstract void onRefresh(); protected abstract void onRefresh();
private void fixSelection(final Iterable<T> itemsToSelect, final int backupIndexToSelect) { private void fixSelection(final Iterable<T> itemsToSelect, final int backupIndexToSelect) {
if (itemsToSelect == null) { if (itemsToSelect == null) {

View File

@@ -46,6 +46,12 @@ public final class SColumnUtil {
return columns; return columns;
} }
public static Map<ColumnDef, ItemColumn> getStringColumn() {
Map<ColumnDef, ItemColumn> columns = getColumns(ColumnDef.STRING);
columns.get(ColumnDef.STRING).setSortPriority(1);
return columns;
}
public static Map<ColumnDef, ItemColumn> getCatalogDefaultColumns() { public static Map<ColumnDef, ItemColumn> getCatalogDefaultColumns() {
Map<ColumnDef, ItemColumn> columns = getColumns( Map<ColumnDef, ItemColumn> columns = getColumns(
ColumnDef.FAVORITE, ColumnDef.FAVORITE,

View File

@@ -19,7 +19,6 @@ import forge.util.ItemPool;
* *
*/ */
public class QuestRewardCardChooser extends QuestRewardCard implements InventoryItem { public class QuestRewardCardChooser extends QuestRewardCard implements InventoryItem {
/** /**
* Possible types for this object. * Possible types for this object.
*/ */
@@ -61,6 +60,16 @@ public class QuestRewardCardChooser extends QuestRewardCard implements Inventory
return description; return description;
} }
@Override
public String toString() {
return description;
}
@Override
public Comparable<?> getCompareValue() {
return description;
}
/** /**
* The item type. * The item type.
* *

View File

@@ -14,7 +14,6 @@ import forge.util.ItemPool;
* *
*/ */
public class QuestRewardCardDuplicate implements IQuestRewardCard { public class QuestRewardCardDuplicate implements IQuestRewardCard {
private final String description; private final String description;
/** /**
@@ -45,6 +44,16 @@ public class QuestRewardCardDuplicate implements IQuestRewardCard {
return "duplicate card"; 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, * Produces a list of options to choose from, in this case,
* the player's current cards. * the player's current cards.

View File

@@ -15,7 +15,6 @@ import forge.item.PaperCard;
* *
*/ */
public class QuestRewardCardFiltered extends QuestRewardCard implements IQuestRewardCard { public class QuestRewardCardFiltered extends QuestRewardCard implements IQuestRewardCard {
private final String description; private final String description;
private final Predicate<PaperCard> predicates; private final Predicate<PaperCard> predicates;
@@ -39,6 +38,15 @@ public class QuestRewardCardFiltered extends QuestRewardCard implements IQuestRe
return description; return description;
} }
@Override
public String toString() {
return description;
}
@Override
public Comparable<?> getCompareValue() {
return description;
}
/** /**
* The item type. * The item type.