Refactor ItemTable into ItemListView and ItemView base class

Add combo box for selecting view
This commit is contained in:
drdev
2013-12-19 04:29:59 +00:00
parent 4b02708bb0
commit 7e32b752a0
35 changed files with 914 additions and 857 deletions

18
.gitattributes vendored
View File

@@ -15489,15 +15489,15 @@ forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/TextSearchFilter.j
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/ToggleButtonsFilter.java -text forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/ToggleButtonsFilter.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/ValueRangeFilter.java -text forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/ValueRangeFilter.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/package-info.java -text forge-gui/src/main/java/forge/gui/toolbox/itemmanager/package-info.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/table/AlwaysShowToolTip.java -text forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/AlwaysShowToolTip.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/table/IntegerRenderer.java -text forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/IntegerRenderer.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/table/ItemTable.java -text forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ItemListView.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/table/ItemTableModel.java -text forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ItemView.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/table/ManaCostRenderer.java -text forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ManaCostRenderer.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/table/SColumnUtil.java -text forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/SColumnUtil.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/table/SetCodeRenderer.java -text forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/SetCodeRenderer.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/table/TableColumnInfo.java -text forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/TableColumnInfo.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/table/TableSorterCascade.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/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/CardViewer.java -text
forge-gui/src/main/java/forge/gui/toolbox/special/CardZoomer.java -text forge-gui/src/main/java/forge/gui/toolbox/special/CardZoomer.java -text

View File

@@ -351,7 +351,7 @@ public class ImportDialog {
}); });
_unknownDeckLabel = new FLabel.Builder().text("Treat unknown decks as:").build(); _unknownDeckLabel = new FLabel.Builder().text("Treat unknown decks as:").build();
unknownDeckPanel.add(_unknownDeckLabel); unknownDeckPanel.add(_unknownDeckLabel);
_unknownDeckCombo.addTo(unknownDeckPanel); unknownDeckPanel.add(_unknownDeckCombo.getComponent());
knownDeckPanel.add(unknownDeckPanel, "span"); knownDeckPanel.add(unknownDeckPanel, "span");
cbPanel.add(knownDeckPanel, "aligny top"); cbPanel.add(knownDeckPanel, "aligny top");

View File

@@ -277,7 +277,7 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener {
setupUI(); setupUI();
removeAll(); removeAll();
this.setLayout(new MigLayout("insets 0, gap 0, flowy")); this.setLayout(new MigLayout("insets 0, gap 0, flowy"));
decksComboBox.addTo(this, "w 10:100%, h 30px!"); this.add(decksComboBox.getComponent(), "w 10:100%, h 30px!");
this.add(scrDecks, "w 10:100%, growy, pushy"); this.add(scrDecks, "w 10:100%, growy, pushy");
this.add(btnRandom, "w 10:100%, h 26px!, gap 0 0 2px 0"); this.add(btnRandom, "w 10:100%, h 26px!, gap 0 0 2px 0");
this.add(lblDecklist, "w 10:100%, h 20px!, , gap 0 0 5px 0"); this.add(lblDecklist, "w 10:100%, h 20px!, , gap 0 0 5px 0");

View File

@@ -33,7 +33,6 @@ import java.util.List;
import javax.swing.JMenu; import javax.swing.JMenu;
import javax.swing.JPopupMenu; import javax.swing.JPopupMenu;
import javax.swing.JTable;
import javax.swing.KeyStroke; import javax.swing.KeyStroke;
import javax.swing.Popup; import javax.swing.Popup;
import javax.swing.PopupFactory; import javax.swing.PopupFactory;
@@ -69,8 +68,7 @@ import forge.gui.toolbox.FSkin;
import forge.gui.toolbox.itemmanager.ItemManager; import forge.gui.toolbox.itemmanager.ItemManager;
import forge.gui.toolbox.itemmanager.SItemManagerIO; import forge.gui.toolbox.itemmanager.SItemManagerIO;
import forge.gui.toolbox.itemmanager.SItemManagerIO.EditorPreference; import forge.gui.toolbox.itemmanager.SItemManagerIO.EditorPreference;
import forge.gui.toolbox.itemmanager.table.ItemTable; import forge.gui.toolbox.itemmanager.views.ItemListView;
import forge.gui.toolbox.itemmanager.table.ItemTableModel;
import forge.item.InventoryItem; import forge.item.InventoryItem;
/** /**
@@ -194,30 +192,31 @@ public enum CDeckEditorUI implements ICDoc, IMenuProvider {
private class _ContextMenuBuilder implements ACEditorBase.ContextMenuBuilder { private class _ContextMenuBuilder implements ACEditorBase.ContextMenuBuilder {
private final MouseEvent _e; private final MouseEvent _e;
private final JTable _nextTable; private final ItemListView<?> _nextTable;
private final _MoveCard _onMove; private final _MoveCard _onMove;
private final int _numSelected; private final int _numSelected;
private final JPopupMenu _menu = new JPopupMenu("TableContextMenu"); private final JPopupMenu _menu = new JPopupMenu("TableContextMenu");
private boolean _showTextFilterItem = false; private boolean _showTextFilterItem = false;
public _ContextMenuBuilder(MouseEvent e, JTable table, JTable nextTable, _MoveCard onMove) { public _ContextMenuBuilder(MouseEvent e, ItemListView<?> table, ItemListView<?> nextTable, _MoveCard onMove) {
_e = e; _e = e;
_nextTable = nextTable; _nextTable = nextTable;
_onMove = onMove; _onMove = onMove;
// ensure the table has focus // ensure the table has focus
if (!table.hasFocus()) { if (!table.hasFocus()) {
table.requestFocusInWindow(); table.focus();
} }
// if item under the cursor is not selected, select it // if item under the cursor is not selected, select it
int row = table.rowAtPoint(e.getPoint()); int index = table.getIndexAtPoint(e.getPoint());
if (!Ints.contains(table.getSelectedRows(), row)) { int[] selectedIndices = table.getSelectedIndices();
table.setRowSelectionInterval(row, row); if (!Ints.contains(selectedIndices, index)) {
table.setSelectedIndex(index);
} }
// record selection count // record selection count
_numSelected = table.getSelectedRowCount(); _numSelected = selectedIndices.length;
} }
private void show() { private void show() {
@@ -225,11 +224,11 @@ public enum CDeckEditorUI implements ICDoc, IMenuProvider {
GuiUtils.addMenuItem(_menu, "Jump to previous table", GuiUtils.addMenuItem(_menu, "Jump to previous table",
KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), new Runnable() { KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), new Runnable() {
@Override public void run() { _nextTable.requestFocusInWindow(); } @Override public void run() { _nextTable.focus(); }
}); });
GuiUtils.addMenuItem(_menu, "Jump to next table", GuiUtils.addMenuItem(_menu, "Jump to next table",
KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), new Runnable() { KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), new Runnable() {
@Override public void run() { _nextTable.requestFocusInWindow(); } @Override public void run() { _nextTable.focus(); }
}); });
if (_showTextFilterItem) { if (_showTextFilterItem) {
@@ -313,20 +312,20 @@ public enum CDeckEditorUI implements ICDoc, IMenuProvider {
final ItemManager<? extends InventoryItem> catView = childController.getCatalogManager(); final ItemManager<? extends InventoryItem> catView = childController.getCatalogManager();
final ItemManager<? extends InventoryItem> deckView = childController.getDeckManager(); final ItemManager<? extends InventoryItem> deckView = childController.getDeckManager();
final ItemTable<? extends InventoryItem> catTable = catView.getTable(); final ItemListView<? extends InventoryItem> catTable = catView.getTable();
final ItemTable<? extends InventoryItem> deckTable = deckView.getTable(); final ItemListView<? extends InventoryItem> deckTable = deckView.getTable();
VCardCatalog.SINGLETON_INSTANCE.setItemManager(catView); VCardCatalog.SINGLETON_INSTANCE.setItemManager(catView);
VCurrentDeck.SINGLETON_INSTANCE.setItemManager(deckView); VCurrentDeck.SINGLETON_INSTANCE.setItemManager(deckView);
if (!childController.listenersHooked) { //hook listeners the first time the controller is updated if (!childController.listenersHooked) { //hook listeners the first time the controller is updated
catTable.addKeyListener(new KeyAdapter() { catTable.getComponent().addKeyListener(new KeyAdapter() {
@Override @Override
public void keyPressed(KeyEvent e) { public void keyPressed(KeyEvent e) {
if (!isFindingAsYouType && KeyEvent.VK_SPACE == e.getKeyCode()) { if (!isFindingAsYouType && KeyEvent.VK_SPACE == e.getKeyCode()) {
addSelectedCards(e.isControlDown() || e.isMetaDown(), e.isShiftDown() ? 4: 1); addSelectedCards(e.isControlDown() || e.isMetaDown(), e.isShiftDown() ? 4: 1);
} else if (KeyEvent.VK_LEFT == e.getKeyCode() || KeyEvent.VK_RIGHT == e.getKeyCode()) { } else if (KeyEvent.VK_LEFT == e.getKeyCode() || KeyEvent.VK_RIGHT == e.getKeyCode()) {
deckTable.requestFocusInWindow(); deckTable.focus();
} else if (KeyEvent.VK_F == e.getKeyCode()) { } else if (KeyEvent.VK_F == e.getKeyCode()) {
// let ctrl/cmd-F set focus to the text filter box // let ctrl/cmd-F set focus to the text filter box
if (e.isControlDown() || e.isMetaDown()) { if (e.isControlDown() || e.isMetaDown()) {
@@ -336,13 +335,13 @@ public enum CDeckEditorUI implements ICDoc, IMenuProvider {
} }
}); });
deckTable.addKeyListener(new KeyAdapter() { deckTable.getComponent().addKeyListener(new KeyAdapter() {
@Override @Override
public void keyPressed(KeyEvent e) { public void keyPressed(KeyEvent e) {
if (!isFindingAsYouType && KeyEvent.VK_SPACE == e.getKeyCode()) { if (!isFindingAsYouType && KeyEvent.VK_SPACE == e.getKeyCode()) {
removeSelectedCards(e.isControlDown() || e.isMetaDown(), e.isShiftDown() ? 4: 1); removeSelectedCards(e.isControlDown() || e.isMetaDown(), e.isShiftDown() ? 4: 1);
} else if (KeyEvent.VK_LEFT == e.getKeyCode() || KeyEvent.VK_RIGHT == e.getKeyCode()) { } else if (KeyEvent.VK_LEFT == e.getKeyCode() || KeyEvent.VK_RIGHT == e.getKeyCode()) {
catTable.requestFocusInWindow(); catTable.focus();
} }
} }
}); });
@@ -360,7 +359,7 @@ public enum CDeckEditorUI implements ICDoc, IMenuProvider {
} }
}; };
catTable.addMouseListener(new FMouseAdapter() { catTable.getComponent().addMouseListener(new FMouseAdapter() {
@Override @Override
public void onLeftDoubleClick(MouseEvent e) { public void onLeftDoubleClick(MouseEvent e) {
addSelectedCards(false, 1); addSelectedCards(false, 1);
@@ -374,7 +373,7 @@ public enum CDeckEditorUI implements ICDoc, IMenuProvider {
} }
}); });
deckTable.addMouseListener(new FMouseAdapter() { deckTable.getComponent().addMouseListener(new FMouseAdapter() {
@Override @Override
public void onLeftDoubleClick(MouseEvent e) { public void onLeftDoubleClick(MouseEvent e) {
removeSelectedCards(false, 1); removeSelectedCards(false, 1);
@@ -391,13 +390,13 @@ public enum CDeckEditorUI implements ICDoc, IMenuProvider {
final _FindAsYouType catFind = new _FindAsYouType(catView); final _FindAsYouType catFind = new _FindAsYouType(catView);
final _FindAsYouType deckFind = new _FindAsYouType(deckView); final _FindAsYouType deckFind = new _FindAsYouType(deckView);
catTable.addFocusListener(new FocusAdapter() { catTable.getComponent().addFocusListener(new FocusAdapter() {
@Override @Override
public void focusLost(FocusEvent arg0) { public void focusLost(FocusEvent arg0) {
catFind.cancel(); catFind.cancel();
} }
}); });
deckTable.addFocusListener(new FocusAdapter() { deckTable.getComponent().addFocusListener(new FocusAdapter() {
@Override @Override
public void focusLost(FocusEvent arg0) { public void focusLost(FocusEvent arg0) {
deckFind.cancel(); deckFind.cancel();
@@ -405,8 +404,8 @@ public enum CDeckEditorUI implements ICDoc, IMenuProvider {
}); });
// highlight items as the user types a portion of their names // highlight items as the user types a portion of their names
catTable.addKeyListener(catFind); catTable.getComponent().addKeyListener(catFind);
deckTable.addKeyListener(deckFind); deckTable.getComponent().addKeyListener(deckFind);
//set card when selection changes //set card when selection changes
catView.addSelectionListener(new ListSelectionListener() { catView.addSelectionListener(new ListSelectionListener() {
@@ -462,7 +461,7 @@ public enum CDeckEditorUI implements ICDoc, IMenuProvider {
} }
private void _findNextMatch(int startIdx, boolean reverse) { private void _findNextMatch(int startIdx, boolean reverse) {
int numItems = tableView.getTable().getRowCount(); int numItems = tableView.getTable().getCount();
if (0 == numItems) { if (0 == numItems) {
cancel(); cancel();
return; return;
@@ -475,9 +474,8 @@ public enum CDeckEditorUI implements ICDoc, IMenuProvider {
String searchStr = str.toString(); String searchStr = str.toString();
boolean found = false; boolean found = false;
for (int idx = startIdx;; idx = (idx + increment) % numItems) { for (int idx = startIdx;; idx = (idx + increment) % numItems) {
ItemTableModel<? extends InventoryItem> tableModel = tableView.getTable().getTableModel(); if (StringUtils.containsIgnoreCase(tableView.getTable().getItemAtIndex(idx).getName(), searchStr)) {
if (StringUtils.containsIgnoreCase(tableModel.rowToItem(idx).getKey().getName(), searchStr)) { tableView.getTable().setSelectedIndex(idx);
tableView.getTable().selectAndScrollTo(idx);
found = true; found = true;
break; break;
} }
@@ -506,7 +504,7 @@ public enum CDeckEditorUI implements ICDoc, IMenuProvider {
popupTimer.restart(); popupTimer.restart();
} else { } else {
PopupFactory factory = PopupFactory.getSharedInstance(); PopupFactory factory = PopupFactory.getSharedInstance();
Point tableLoc = tableView.getTable().getTableHeader().getLocationOnScreen(); Point tableLoc = tableView.getTable().getTable().getTableHeader().getLocationOnScreen();
popup = factory.getPopup(null, popupLabel, tableLoc.x + 10, tableLoc.y + 10); popup = factory.getPopup(null, popupLabel, tableLoc.x + 10, tableLoc.y + 10);
FSkin.get(SwingUtilities.getRoot(popupLabel)).setBackground(FSkin.getColor(FSkin.Colors.CLR_INACTIVE)); FSkin.get(SwingUtilities.getRoot(popupLabel)).setBackground(FSkin.getColor(FSkin.Colors.CLR_INACTIVE));
@@ -558,7 +556,7 @@ public enum CDeckEditorUI implements ICDoc, IMenuProvider {
if (!str.toString().isEmpty()) { if (!str.toString().isEmpty()) {
// no need to add (or subtract) 1 -- the table selection will already // no need to add (or subtract) 1 -- the table selection will already
// have been advanced by the (shift+) enter key // have been advanced by the (shift+) enter key
_findNextMatch(tableView.getTable().getSelectedRow(), e.isShiftDown()); _findNextMatch(tableView.getTable().getSelectedIndex(), e.isShiftDown());
} }
return; return;
@@ -584,7 +582,7 @@ public enum CDeckEditorUI implements ICDoc, IMenuProvider {
str.append(e.getKeyChar()); str.append(e.getKeyChar());
} }
_findNextMatch(Math.max(0, tableView.getTable().getSelectedRow()), false); _findNextMatch(Math.max(0, tableView.getTable().getSelectedIndex()), false);
} }
} }

View File

@@ -143,9 +143,9 @@ public class DeckImport<TItem extends InventoryItem, TModel extends DeckBase> ex
fp.add(this.scrollInput, "cell 0 0, w 50%, growy, pushy"); fp.add(this.scrollInput, "cell 0 0, w 50%, growy, pushy");
fp.add(this.newEditionCheck, "cell 0 1, w 50%, ax c"); fp.add(this.newEditionCheck, "cell 0 1, w 50%, ax c");
fp.add(this.dateTimeCheck, "cell 0 2, w 50%, ax c"); fp.add(this.dateTimeCheck, "cell 0 2, w 50%, ax c");
monthDropdown.addTo(fp, "cell 0 3, w 20%, ax r, split 2"); fp.add(monthDropdown.getComponent(), "cell 0 3, w 20%, ax r, split 2");
yearDropdown.addTo(fp, "w 15%, pad 0 0 0 -10"); fp.add(yearDropdown.getComponent(), "w 15%, pad 0 0 0 -10");
fillDateDropdowns(); fillDateDropdowns();
fp.add(this.scrollOutput, "cell 1 0, w 50%, growy, pushy"); fp.add(this.scrollOutput, "cell 1 0, w 50%, growy, pushy");

View File

@@ -41,9 +41,9 @@ import forge.gui.toolbox.itemmanager.CardManager;
import forge.gui.toolbox.itemmanager.SItemManagerIO; import forge.gui.toolbox.itemmanager.SItemManagerIO;
import forge.gui.toolbox.itemmanager.SItemManagerUtil; import forge.gui.toolbox.itemmanager.SItemManagerUtil;
import forge.gui.toolbox.itemmanager.SItemManagerIO.EditorPreference; import forge.gui.toolbox.itemmanager.SItemManagerIO.EditorPreference;
import forge.gui.toolbox.itemmanager.table.TableColumnInfo; import forge.gui.toolbox.itemmanager.views.SColumnUtil;
import forge.gui.toolbox.itemmanager.table.SColumnUtil; import forge.gui.toolbox.itemmanager.views.TableColumnInfo;
import forge.gui.toolbox.itemmanager.table.SColumnUtil.ColumnName; import forge.gui.toolbox.itemmanager.views.SColumnUtil.ColumnName;
import forge.item.PaperCard; import forge.item.PaperCard;
import forge.item.InventoryItem; import forge.item.InventoryItem;
import forge.util.ItemPool; import forge.util.ItemPool;

View File

@@ -37,9 +37,9 @@ import forge.gui.toolbox.itemmanager.CardManager;
import forge.gui.toolbox.itemmanager.SItemManagerIO; import forge.gui.toolbox.itemmanager.SItemManagerIO;
import forge.gui.toolbox.itemmanager.SItemManagerUtil; import forge.gui.toolbox.itemmanager.SItemManagerUtil;
import forge.gui.toolbox.itemmanager.SItemManagerIO.EditorPreference; import forge.gui.toolbox.itemmanager.SItemManagerIO.EditorPreference;
import forge.gui.toolbox.itemmanager.table.TableColumnInfo; import forge.gui.toolbox.itemmanager.views.SColumnUtil;
import forge.gui.toolbox.itemmanager.table.SColumnUtil; import forge.gui.toolbox.itemmanager.views.TableColumnInfo;
import forge.gui.toolbox.itemmanager.table.SColumnUtil.ColumnName; import forge.gui.toolbox.itemmanager.views.SColumnUtil.ColumnName;
import forge.item.PaperCard; import forge.item.PaperCard;
import forge.item.InventoryItem; import forge.item.InventoryItem;
import forge.util.ItemPool; import forge.util.ItemPool;

View File

@@ -18,7 +18,6 @@
package forge.gui.deckeditor.controllers; package forge.gui.deckeditor.controllers;
import javax.swing.JOptionPane; import javax.swing.JOptionPane;
import javax.swing.ListSelectionModel;
import forge.Singletons; import forge.Singletons;
import forge.card.CardEdition; import forge.card.CardEdition;
@@ -38,7 +37,7 @@ import forge.gui.framework.DragCell;
import forge.gui.framework.FScreen; import forge.gui.framework.FScreen;
import forge.gui.home.sanctioned.CSubmenuDraft; import forge.gui.home.sanctioned.CSubmenuDraft;
import forge.gui.toolbox.itemmanager.CardManager; import forge.gui.toolbox.itemmanager.CardManager;
import forge.gui.toolbox.itemmanager.table.SColumnUtil; import forge.gui.toolbox.itemmanager.views.SColumnUtil;
import forge.item.PaperCard; import forge.item.PaperCard;
import forge.item.InventoryItem; import forge.item.InventoryItem;
import forge.util.ItemPoolView; import forge.util.ItemPoolView;
@@ -274,9 +273,9 @@ public class CEditorDraftingProcess extends ACEditorBase<PaperCard, DeckGroup> {
deckGenParent = removeTab(VDeckgen.SINGLETON_INSTANCE); deckGenParent = removeTab(VDeckgen.SINGLETON_INSTANCE);
allDecksParent = removeTab(VAllDecks.SINGLETON_INSTANCE); allDecksParent = removeTab(VAllDecks.SINGLETON_INSTANCE);
// set catalog table to single-selection only mode // set catalog table to single-selection only mode
getCatalogManager().getTable().setSelectionMode(ListSelectionModel.SINGLE_SELECTION); getCatalogManager().setAllowMultipleSelections(false);
} }
/* (non-Javadoc) /* (non-Javadoc)
@@ -311,6 +310,6 @@ public class CEditorDraftingProcess extends ACEditorBase<PaperCard, DeckGroup> {
} }
// set catalog table back to free-selection mode // set catalog table back to free-selection mode
getCatalogManager().getTable().setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); getCatalogManager().setAllowMultipleSelections(true);
} }
} }

View File

@@ -33,7 +33,7 @@ import forge.gui.home.sanctioned.CSubmenuDraft;
import forge.gui.home.sanctioned.CSubmenuSealed; import forge.gui.home.sanctioned.CSubmenuSealed;
import forge.gui.toolbox.itemmanager.CardManager; import forge.gui.toolbox.itemmanager.CardManager;
import forge.gui.toolbox.itemmanager.SItemManagerUtil; import forge.gui.toolbox.itemmanager.SItemManagerUtil;
import forge.gui.toolbox.itemmanager.table.SColumnUtil; import forge.gui.toolbox.itemmanager.views.SColumnUtil;
import forge.item.PaperCard; import forge.item.PaperCard;
import forge.item.InventoryItem; import forge.item.InventoryItem;
import forge.util.storage.IStorage; import forge.util.storage.IStorage;

View File

@@ -5,15 +5,15 @@ import java.awt.event.ItemListener;
import java.util.HashMap; import java.util.HashMap;
import javax.swing.JCheckBox; import javax.swing.JCheckBox;
import javax.swing.JTable;
import forge.Command; import forge.Command;
import forge.gui.deckeditor.CDeckEditorUI; import forge.gui.deckeditor.CDeckEditorUI;
import forge.gui.toolbox.itemmanager.ItemManager;
import forge.gui.toolbox.itemmanager.SItemManagerIO; import forge.gui.toolbox.itemmanager.SItemManagerIO;
import forge.gui.toolbox.itemmanager.SItemManagerIO.EditorPreference; import forge.gui.toolbox.itemmanager.SItemManagerIO.EditorPreference;
import forge.gui.toolbox.itemmanager.table.TableColumnInfo; import forge.gui.toolbox.itemmanager.views.SColumnUtil;
import forge.gui.toolbox.itemmanager.table.SColumnUtil; import forge.gui.toolbox.itemmanager.views.TableColumnInfo;
import forge.gui.toolbox.itemmanager.table.SColumnUtil.ColumnName; import forge.gui.toolbox.itemmanager.views.SColumnUtil.ColumnName;
import forge.gui.deckeditor.views.VEditorPreferences; import forge.gui.deckeditor.views.VEditorPreferences;
import forge.gui.framework.ICDoc; import forge.gui.framework.ICDoc;
import forge.item.InventoryItem; import forge.item.InventoryItem;
@@ -79,11 +79,11 @@ public enum CEditorPreferences implements ICDoc {
@Override @Override
public void itemStateChanged(ItemEvent arg0) { public void itemStateChanged(ItemEvent arg0) {
TableColumnInfo<InventoryItem> col = SColumnUtil.getColumn(name); TableColumnInfo<InventoryItem> col = SColumnUtil.getColumn(name);
final JTable table = (col.getEnumValue().substring(0, 4).equals("DECK")) final ItemManager<?> itemManager = (col.getEnumValue().substring(0, 4).equals("DECK"))
? CDeckEditorUI.SINGLETON_INSTANCE.getCurrentEditorController().getDeckManager().getTable() ? CDeckEditorUI.SINGLETON_INSTANCE.getCurrentEditorController().getDeckManager()
: CDeckEditorUI.SINGLETON_INSTANCE.getCurrentEditorController().getCatalogManager().getTable(); : CDeckEditorUI.SINGLETON_INSTANCE.getCurrentEditorController().getCatalogManager();
SColumnUtil.toggleColumn(table, col); SColumnUtil.toggleColumn(itemManager.getTable().getTable(), col);
SItemManagerIO.savePreferences(table); SItemManagerIO.savePreferences(itemManager);
} }
}); });
} }
@@ -115,7 +115,7 @@ public enum CEditorPreferences implements ICDoc {
curEditor.getDeckManager().getTable().setWantElasticColumns(wantElastic); curEditor.getDeckManager().getTable().setWantElasticColumns(wantElastic);
} }
SItemManagerIO.setPref(EditorPreference.elastic_columns, wantElastic); SItemManagerIO.setPref(EditorPreference.elastic_columns, wantElastic);
SItemManagerIO.savePreferences(curEditor.getCatalogManager().getTable()); } }); SItemManagerIO.savePreferences(curEditor.getCatalogManager()); } });
VEditorPreferences.SINGLETON_INSTANCE.getChbCardDisplayUnique().addItemListener(new ItemListener() { VEditorPreferences.SINGLETON_INSTANCE.getChbCardDisplayUnique().addItemListener(new ItemListener() {
@Override public void itemStateChanged(final ItemEvent e) { @Override public void itemStateChanged(final ItemEvent e) {
@@ -128,7 +128,7 @@ public enum CEditorPreferences implements ICDoc {
curEditor.getDeckManager().updateView(true); curEditor.getDeckManager().updateView(true);
} }
SItemManagerIO.setPref(EditorPreference.display_unique_only, wantUnique); SItemManagerIO.setPref(EditorPreference.display_unique_only, wantUnique);
SItemManagerIO.savePreferences(curEditor.getCatalogManager().getTable()); } }); SItemManagerIO.savePreferences(curEditor.getCatalogManager()); } });
} }
/* (non-Javadoc) /* (non-Javadoc)

View File

@@ -40,9 +40,9 @@ import forge.gui.framework.FScreen;
import forge.gui.home.quest.CSubmenuQuestDecks; import forge.gui.home.quest.CSubmenuQuestDecks;
import forge.gui.toolbox.itemmanager.CardManager; import forge.gui.toolbox.itemmanager.CardManager;
import forge.gui.toolbox.itemmanager.SItemManagerUtil; import forge.gui.toolbox.itemmanager.SItemManagerUtil;
import forge.gui.toolbox.itemmanager.table.TableColumnInfo; import forge.gui.toolbox.itemmanager.views.SColumnUtil;
import forge.gui.toolbox.itemmanager.table.SColumnUtil; import forge.gui.toolbox.itemmanager.views.TableColumnInfo;
import forge.gui.toolbox.itemmanager.table.SColumnUtil.ColumnName; import forge.gui.toolbox.itemmanager.views.SColumnUtil.ColumnName;
import forge.item.PaperCard; import forge.item.PaperCard;
import forge.item.InventoryItem; import forge.item.InventoryItem;
import forge.quest.QuestController; import forge.quest.QuestController;

View File

@@ -50,9 +50,9 @@ import forge.gui.toolbox.FLabel;
import forge.gui.toolbox.FSkin; import forge.gui.toolbox.FSkin;
import forge.gui.toolbox.itemmanager.SpellShopManager; import forge.gui.toolbox.itemmanager.SpellShopManager;
import forge.gui.toolbox.itemmanager.SItemManagerUtil; import forge.gui.toolbox.itemmanager.SItemManagerUtil;
import forge.gui.toolbox.itemmanager.table.TableColumnInfo; import forge.gui.toolbox.itemmanager.views.SColumnUtil;
import forge.gui.toolbox.itemmanager.table.SColumnUtil; import forge.gui.toolbox.itemmanager.views.TableColumnInfo;
import forge.gui.toolbox.itemmanager.table.SColumnUtil.ColumnName; import forge.gui.toolbox.itemmanager.views.SColumnUtil.ColumnName;
import forge.item.BoosterPack; import forge.item.BoosterPack;
import forge.item.PaperCard; import forge.item.PaperCard;
import forge.item.FatPack; import forge.item.FatPack;

View File

@@ -33,9 +33,9 @@ import forge.gui.framework.DragCell;
import forge.gui.framework.FScreen; import forge.gui.framework.FScreen;
import forge.gui.toolbox.itemmanager.CardManager; import forge.gui.toolbox.itemmanager.CardManager;
import forge.gui.toolbox.itemmanager.SItemManagerUtil; import forge.gui.toolbox.itemmanager.SItemManagerUtil;
import forge.gui.toolbox.itemmanager.table.TableColumnInfo; import forge.gui.toolbox.itemmanager.views.SColumnUtil;
import forge.gui.toolbox.itemmanager.table.SColumnUtil; import forge.gui.toolbox.itemmanager.views.TableColumnInfo;
import forge.gui.toolbox.itemmanager.table.SColumnUtil.ColumnName; import forge.gui.toolbox.itemmanager.views.SColumnUtil.ColumnName;
import forge.item.PaperCard; import forge.item.PaperCard;
import forge.item.InventoryItem; import forge.item.InventoryItem;
import forge.util.ItemPool; import forge.util.ItemPool;

View File

@@ -111,7 +111,7 @@ public enum VSubmenuChallenges implements IVSubmenu<CSubmenuChallenges>, IVQuest
pnlStats.add(lblWorld, constraints); pnlStats.add(lblWorld, constraints);
pnlStats.add(cbPlant, constraints); pnlStats.add(cbPlant, constraints);
pnlStats.add(cbCharm, constraints); pnlStats.add(cbCharm, constraints);
cbxPet.addTo(pnlStats, constraints); pnlStats.add(cbxPet.getComponent(), constraints);
pnlStats.add(lblZep, "w 130px!, h 60px!, gap 0 0 0 5px"); pnlStats.add(lblZep, "w 130px!, h 60px!, gap 0 0 0 5px");
pnlStats.setOpaque(false); pnlStats.setOpaque(false);
} }

View File

@@ -109,7 +109,7 @@ public enum VSubmenuDuels implements IVSubmenu<CSubmenuDuels>, IVQuestStats {
pnlStats.add(lblWorld, constraints); pnlStats.add(lblWorld, constraints);
pnlStats.add(cbPlant, constraints); pnlStats.add(cbPlant, constraints);
pnlStats.add(cbCharm, constraints); pnlStats.add(cbCharm, constraints);
cbxPet.addTo(pnlStats, constraints); pnlStats.add(cbxPet.getComponent(), constraints);
pnlStats.setOpaque(false); pnlStats.setOpaque(false);
} }

View File

@@ -324,28 +324,28 @@ public enum VSubmenuQuestData implements IVSubmenu<CSubmenuQuestData> {
pnlRestrictions.add(lblStartingPool, constraints + lblWidthStart); pnlRestrictions.add(lblStartingPool, constraints + lblWidthStart);
cbxStartingPool.addTo(pnlRestrictions, constraints + cboWidthStart); pnlRestrictions.add(cbxStartingPool.getComponent(), constraints + cboWidthStart);
/* out of these 3 groups only one will be visible */ /* out of these 3 groups only one will be visible */
pnlRestrictions.add(lblUnrestricted, constraints + hidemode + "spanx 2"); pnlRestrictions.add(lblUnrestricted, constraints + hidemode + "spanx 2");
pnlRestrictions.add(lblPreconDeck, constraints + lblWidthStart); pnlRestrictions.add(lblPreconDeck, constraints + lblWidthStart);
cbxPreconDeck.addTo(pnlRestrictions, constraints + cboWidthStart); pnlRestrictions.add(cbxPreconDeck.getComponent(), constraints + cboWidthStart);
pnlRestrictions.add(lblCustomDeck, constraints + lblWidthStart); pnlRestrictions.add(lblCustomDeck, constraints + lblWidthStart);
cbxCustomDeck.addTo(pnlRestrictions, constraints + cboWidthStart); // , skip 1 pnlRestrictions.add(cbxCustomDeck.getComponent(), constraints + cboWidthStart); // , skip 1
pnlRestrictions.add(lblFormat, constraints + lblWidthStart); pnlRestrictions.add(lblFormat, constraints + lblWidthStart);
cbxFormat.addTo(pnlRestrictions, constraints + cboWidthStart); // , skip 1 pnlRestrictions.add(cbxFormat.getComponent(), constraints + cboWidthStart); // , skip 1
pnlRestrictions.add(btnDefineCustomFormat, constraints + hidemode + "spanx 2, w 240px"); pnlRestrictions.add(btnDefineCustomFormat, constraints + hidemode + "spanx 2, w 240px");
// Prized cards options // Prized cards options
pnlRestrictions.add(lblPrizedCards, constraints + lblWidth); pnlRestrictions.add(lblPrizedCards, constraints + lblWidth);
cbxPrizedCards.addTo(pnlRestrictions, constraints + cboWidth); pnlRestrictions.add(cbxPrizedCards.getComponent(), constraints + cboWidth);
pnlRestrictions.add(lblPrizeFormat, constraints + lblWidthStart); pnlRestrictions.add(lblPrizeFormat, constraints + lblWidthStart);
cbxPrizeFormat.addTo(pnlRestrictions, constraints + cboWidthStart); // , skip 1 pnlRestrictions.add(cbxPrizeFormat.getComponent(), constraints + cboWidthStart); // , skip 1
pnlRestrictions.add(btnPrizeDefineCustomFormat, constraints + hidemode + "spanx 2, w 240px"); pnlRestrictions.add(btnPrizeDefineCustomFormat, constraints + hidemode + "spanx 2, w 240px");
pnlRestrictions.add(lblPrizeSameAsStarting, constraints + hidemode + "spanx 2"); pnlRestrictions.add(lblPrizeSameAsStarting, constraints + hidemode + "spanx 2");
pnlRestrictions.add(lblPrizeUnrestricted, constraints + hidemode + "spanx 2"); pnlRestrictions.add(lblPrizeUnrestricted, constraints + hidemode + "spanx 2");
@@ -354,10 +354,10 @@ public enum VSubmenuQuestData implements IVSubmenu<CSubmenuQuestData> {
pnlRestrictions.add(lblPreferredColor, constraints + lblWidthStart); pnlRestrictions.add(lblPreferredColor, constraints + lblWidthStart);
cbxPreferredColor.addTo(pnlRestrictions, constraints + cboWidthStart + ", wrap"); pnlRestrictions.add(cbxPreferredColor.getComponent(), constraints + cboWidthStart + ", wrap");
pnlRestrictions.add(lblStartingWorld, constraints + lblWidthStart); pnlRestrictions.add(lblStartingWorld, constraints + lblWidthStart);
cbxStartingWorld.addTo(pnlRestrictions, constraints + cboWidthStart); pnlRestrictions.add(cbxStartingWorld.getComponent(), constraints + cboWidthStart);
// cboAllowUnlocks.setOpaque(false); // cboAllowUnlocks.setOpaque(false);
pnlRestrictions.setOpaque(false); pnlRestrictions.setOpaque(false);

View File

@@ -1,6 +1,7 @@
package forge.gui.toolbox; package forge.gui.toolbox;
import java.awt.Component; import java.awt.Component;
import java.awt.FontMetrics;
import java.awt.Graphics; import java.awt.Graphics;
import java.awt.Graphics2D; import java.awt.Graphics2D;
import java.awt.LayoutManager; import java.awt.LayoutManager;
@@ -80,6 +81,18 @@ public class FComboBox<E> extends JComboBox<E> {
FSkin.get(this).setFont(skinFont0); FSkin.get(this).setFont(skinFont0);
} }
public int getAutoSizeWidth() {
int maxWidth = 0;
FontMetrics metrics = this.getGraphics().getFontMetrics(this.getFont());
for (int i = 0; i < this.getItemCount(); i++) {
int width = metrics.stringWidth(this.getItemAt(i).toString());
if (width > maxWidth) {
maxWidth = width;
}
}
return maxWidth + 28; //leave room for arrow and padding
}
@Override @Override
protected void paintComponent(Graphics g) { protected void paintComponent(Graphics g) {
super.paintComponent(g); super.paintComponent(g);

View File

@@ -128,14 +128,9 @@ public class FComboBoxWrapper<E> {
public void setEnabled(boolean aFlag) { public void setEnabled(boolean aFlag) {
this.comboBox.setEnabled(aFlag); this.comboBox.setEnabled(aFlag);
} }
public void addTo(Container container) { public int getAutoSizeWidth() {
addTo(container, null); return this.comboBox.getAutoSizeWidth();
}
public void addTo(Container container, Object constraints0) {
container.add(this.comboBox, constraints0);
this.constraints = constraints0;
} }
public JComponent getComponent() { //disguise as component for sake of rare places that need to access component in wrapper public JComponent getComponent() { //disguise as component for sake of rare places that need to access component in wrapper

View File

@@ -33,7 +33,6 @@ import javax.swing.JPanel;
import javax.swing.JPopupMenu; import javax.swing.JPopupMenu;
import javax.swing.JScrollPane; import javax.swing.JScrollPane;
import javax.swing.KeyStroke; import javax.swing.KeyStroke;
import javax.swing.ListSelectionModel;
import javax.swing.SwingConstants; import javax.swing.SwingConstants;
import javax.swing.SwingUtilities; import javax.swing.SwingUtilities;
import javax.swing.event.ListSelectionListener; import javax.swing.event.ListSelectionListener;
@@ -46,6 +45,7 @@ import com.google.common.collect.Iterables;
import forge.Command; import forge.Command;
import forge.gui.GuiUtils; import forge.gui.GuiUtils;
import forge.gui.toolbox.FComboBoxWrapper;
import forge.gui.toolbox.FLabel; import forge.gui.toolbox.FLabel;
import forge.gui.toolbox.FSkin; import forge.gui.toolbox.FSkin;
import forge.gui.toolbox.FTextField; import forge.gui.toolbox.FTextField;
@@ -53,8 +53,8 @@ import forge.gui.toolbox.LayoutHelper;
import forge.gui.toolbox.ToolTipListener; import forge.gui.toolbox.ToolTipListener;
import forge.gui.toolbox.FSkin.Colors; import forge.gui.toolbox.FSkin.Colors;
import forge.gui.toolbox.itemmanager.filters.ItemFilter; import forge.gui.toolbox.itemmanager.filters.ItemFilter;
import forge.gui.toolbox.itemmanager.table.ItemTable; import forge.gui.toolbox.itemmanager.views.ItemListView;
import forge.gui.toolbox.itemmanager.table.ItemTableModel; import forge.gui.toolbox.itemmanager.views.ItemView;
import forge.item.InventoryItem; import forge.item.InventoryItem;
import forge.util.Aggregates; import forge.util.Aggregates;
import forge.util.ItemPool; import forge.util.ItemPool;
@@ -100,17 +100,18 @@ public abstract class ItemManager<T extends InventoryItem> extends JPanel {
private final FLabel lblCaption = new FLabel.Builder() private final FLabel lblCaption = new FLabel.Builder()
.fontAlign(SwingConstants.LEFT) .fontAlign(SwingConstants.LEFT)
.fontSize(11) .fontSize(12)
.build(); .build();
private final FLabel lblRatio = new FLabel.Builder() private final FLabel lblRatio = new FLabel.Builder()
.tooltip("Number of cards shown / Total available cards") .tooltip("Number of cards shown / Total available cards")
.fontAlign(SwingConstants.LEFT) .fontAlign(SwingConstants.LEFT)
.fontSize(11) .fontSize(12)
.build(); .build();
private final ItemTable<T> table; private final FComboBoxWrapper<ItemView<T>> cbViews = new FComboBoxWrapper<ItemView<T>>();
private final JScrollPane tableScroller; private final ItemListView<T> table;
private final JScrollPane viewScroller;
private boolean initialized; private boolean initialized;
protected boolean lockFiltering; protected boolean lockFiltering;
@@ -125,8 +126,10 @@ public abstract class ItemManager<T extends InventoryItem> extends JPanel {
this.genericType = genericType0; this.genericType = genericType0;
this.wantUnique = wantUnique0; this.wantUnique = wantUnique0;
this.model = new ItemManagerModel<T>(this, genericType0); this.model = new ItemManagerModel<T>(this, genericType0);
this.table = new ItemTable<T>(this, this.model); this.table = new ItemListView<T>(this, this.model);
this.tableScroller = new JScrollPane(this.table); this.table.setAllowMultipleSelections(false);
this.viewScroller = new JScrollPane(this.table.getComponent());
this.cbViews.addItem(this.table);
} }
/** /**
@@ -136,12 +139,11 @@ public abstract class ItemManager<T extends InventoryItem> extends JPanel {
if (this.initialized) { return; } //avoid initializing more than once if (this.initialized) { return; } //avoid initializing more than once
//build table view //build table view
this.table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); this.viewScroller.setOpaque(false);
this.tableScroller.setOpaque(false); this.viewScroller.getViewport().setOpaque(false);
this.tableScroller.getViewport().setOpaque(false); this.viewScroller.setBorder(null);
this.tableScroller.setBorder(null); this.viewScroller.getViewport().setBorder(null);
this.tableScroller.getViewport().setBorder(null); this.viewScroller.getVerticalScrollBar().addAdjustmentListener(new ToolTipListener());
this.tableScroller.getVerticalScrollBar().addAdjustmentListener(new ToolTipListener());
//build enable filters checkbox //build enable filters checkbox
ItemFilter.layoutCheckbox(this.chkEnableFilters); ItemFilter.layoutCheckbox(this.chkEnableFilters);
@@ -177,7 +179,8 @@ public abstract class ItemManager<T extends InventoryItem> extends JPanel {
this.add(this.btnFilters); this.add(this.btnFilters);
this.add(this.lblCaption); this.add(this.lblCaption);
this.add(this.lblRatio); this.add(this.lblRatio);
this.add(this.tableScroller); this.add(this.cbViews.getComponent());
this.add(this.viewScroller);
final Runnable cmdAddCurrentSearch = new Runnable() { final Runnable cmdAddCurrentSearch = new Runnable() {
@Override @Override
@@ -245,8 +248,9 @@ public abstract class ItemManager<T extends InventoryItem> extends JPanel {
helper.fillLine(this.pnlButtons, this.pnlButtons.getComponentCount() > 0 ? 32: 1); //just show border if no bottoms helper.fillLine(this.pnlButtons, this.pnlButtons.getComponentCount() > 0 ? 32: 1); //just show border if no bottoms
helper.include(this.btnFilters, 61, FTextField.HEIGHT); helper.include(this.btnFilters, 61, FTextField.HEIGHT);
helper.include(this.lblCaption, this.lblCaption.getAutoSizeWidth(), FTextField.HEIGHT); helper.include(this.lblCaption, this.lblCaption.getAutoSizeWidth(), FTextField.HEIGHT);
helper.fillLine(this.lblRatio, FTextField.HEIGHT); helper.fillLine(this.lblRatio, FTextField.HEIGHT, this.cbViews.getAutoSizeWidth()); //leave room for cbViews
helper.fill(this.tableScroller); helper.fillLine(this.cbViews.getComponent(), FTextField.HEIGHT);
helper.fill(this.viewScroller);
} }
/** /**
@@ -336,26 +340,10 @@ public abstract class ItemManager<T extends InventoryItem> extends JPanel {
this.updateView(true); this.updateView(true);
} }
/** public ItemListView<T> getTable() {
*
* getTable.
*
* @return ItemTable<T>
*/
public ItemTable<T> getTable() {
return this.table; return this.table;
} }
/**
*
* getTableModel.
*
* @return ItemTableModel<T>
*/
public ItemTableModel<T> getTableModel() {
return this.table.getTableModel();
}
/** /**
* *
* getSelectedItem. * getSelectedItem.
@@ -386,6 +374,26 @@ public abstract class ItemManager<T extends InventoryItem> extends JPanel {
this.table.setSelectedItem(item); this.table.setSelectedItem(item);
} }
/**
*
* getSelectedItem.
*
* @return T
*/
public int getSelectedIndex() {
return this.table.getSelectedIndex();
}
/**
*
* setSelectedItem.
*
* @param item - Item to select
*/
public void setSelectedIndex(int index) {
this.table.setSelectedIndex(index);
}
/** /**
* *
* addItem. * addItem.
@@ -394,7 +402,7 @@ public abstract class ItemManager<T extends InventoryItem> extends JPanel {
* @param qty * @param qty
*/ */
public void addItem(final T item, int qty) { public void addItem(final T item, int qty) {
final int n = this.table.getSelectedRow(); final int n = this.table.getSelectedIndex();
this.pool.add(item, qty); this.pool.add(item, qty);
if (this.isUnfiltered()) { if (this.isUnfiltered()) {
this.model.addItem(item, qty); this.model.addItem(item, qty);
@@ -410,7 +418,7 @@ public abstract class ItemManager<T extends InventoryItem> extends JPanel {
* @param itemsToAdd * @param itemsToAdd
*/ */
public void addItems(Iterable<Map.Entry<T, Integer>> itemsToAdd) { public void addItems(Iterable<Map.Entry<T, Integer>> itemsToAdd) {
final int n = this.table.getSelectedRow(); final int n = this.table.getSelectedIndex();
this.pool.addAll(itemsToAdd); this.pool.addAll(itemsToAdd);
if (this.isUnfiltered()) { if (this.isUnfiltered()) {
this.model.addItems(itemsToAdd); this.model.addItems(itemsToAdd);
@@ -427,7 +435,7 @@ public abstract class ItemManager<T extends InventoryItem> extends JPanel {
* @param qty * @param qty
*/ */
public void removeItem(final T item, int qty) { public void removeItem(final T item, int qty) {
final int n = this.table.getSelectedRow(); final int n = this.table.getSelectedIndex();
this.pool.remove(item, qty); this.pool.remove(item, qty);
if (this.isUnfiltered()) { if (this.isUnfiltered()) {
this.model.removeItem(item, qty); this.model.removeItem(item, qty);
@@ -443,7 +451,7 @@ public abstract class ItemManager<T extends InventoryItem> extends JPanel {
* @param itemsToRemove * @param itemsToRemove
*/ */
public void removeItems(List<Map.Entry<T, Integer>> itemsToRemove) { public void removeItems(List<Map.Entry<T, Integer>> itemsToRemove) {
final int n = this.table.getSelectedRow(); final int n = this.table.getSelectedIndex();
for (Map.Entry<T, Integer> item : itemsToRemove) { for (Map.Entry<T, Integer> item : itemsToRemove) {
this.pool.remove(item.getKey(), item.getValue()); this.pool.remove(item.getKey(), item.getValue());
if (this.isUnfiltered()) { if (this.isUnfiltered()) {
@@ -627,8 +635,8 @@ public abstract class ItemManager<T extends InventoryItem> extends JPanel {
SwingUtilities.invokeLater(new Runnable() { SwingUtilities.invokeLater(new Runnable() {
@Override @Override
public void run() { public void run() {
if (table.getRowCount() > 0 && table.getSelectedRowCount() == 0) { if (table.getCount() > 0 && table.getSelectedIndices().length == 0) {
table.selectAndScrollTo(0); table.setSelectedIndex(0);
} }
} }
}); });
@@ -703,7 +711,7 @@ public abstract class ItemManager<T extends InventoryItem> extends JPanel {
public void setAllowMultipleSelections(boolean allowMultipleSelections0) { public void setAllowMultipleSelections(boolean allowMultipleSelections0) {
if (this.allowMultipleSelections == allowMultipleSelections0) { return; } if (this.allowMultipleSelections == allowMultipleSelections0) { return; }
this.allowMultipleSelections = allowMultipleSelections0; this.allowMultipleSelections = allowMultipleSelections0;
this.table.setSelectionMode(allowMultipleSelections0 ? ListSelectionModel.MULTIPLE_INTERVAL_SELECTION : ListSelectionModel.SINGLE_SELECTION); this.table.setAllowMultipleSelections(allowMultipleSelections0);
} }
/** /**
@@ -712,7 +720,7 @@ public abstract class ItemManager<T extends InventoryItem> extends JPanel {
* *
*/ */
public void focus() { public void focus() {
this.table.requestFocusInWindow(); this.table.getComponent().requestFocusInWindow();
} }
/** /**

View File

@@ -98,7 +98,7 @@ public final class ItemManagerModel<T extends InventoryItem> {
final boolean wasThere = this.data.count(item0) > 0; final boolean wasThere = this.data.count(item0) > 0;
if (wasThere) { if (wasThere) {
this.data.remove(item0, qty); this.data.remove(item0, qty);
this.itemManager.getTableModel().fireTableDataChanged(); this.itemManager.getTable().getTableModel().fireTableDataChanged();
} }
} }
@@ -109,7 +109,7 @@ public final class ItemManagerModel<T extends InventoryItem> {
*/ */
public void addItem(final T item0, int qty) { public void addItem(final T item0, int qty) {
this.data.add(item0, qty); this.data.add(item0, qty);
this.itemManager.getTableModel().fireTableDataChanged(); this.itemManager.getTable().getTableModel().fireTableDataChanged();
} }
/** /**
@@ -119,8 +119,9 @@ public final class ItemManagerModel<T extends InventoryItem> {
*/ */
public void addItems(final Iterable<Entry<T, Integer>> items0) { public void addItems(final Iterable<Entry<T, Integer>> items0) {
this.data.addAll(items0); this.data.addAll(items0);
this.itemManager.getTableModel().fireTableDataChanged(); this.itemManager.getTable().getTableModel().fireTableDataChanged();
} }
/** /**
* Sets whether this table's pool of items is in infinite supply. If false, items in the * Sets whether this table's pool of items is in infinite supply. If false, items in the
* table have a limited number of copies. * table have a limited number of copies.

View File

@@ -7,7 +7,7 @@ import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
import java.util.Map; import java.util.Map;
import java.util.TreeMap; import java.util.TreeMap;
import javax.swing.JTable;
import javax.xml.stream.XMLEventFactory; import javax.xml.stream.XMLEventFactory;
import javax.xml.stream.XMLEventReader; import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLEventWriter; import javax.xml.stream.XMLEventWriter;
@@ -18,10 +18,10 @@ import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.StartElement; import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent; import javax.xml.stream.events.XMLEvent;
import forge.gui.toolbox.itemmanager.table.TableColumnInfo; import forge.gui.toolbox.itemmanager.views.SColumnUtil;
import forge.gui.toolbox.itemmanager.table.SColumnUtil; import forge.gui.toolbox.itemmanager.views.TableColumnInfo;
import forge.gui.toolbox.itemmanager.table.SColumnUtil.ColumnName; import forge.gui.toolbox.itemmanager.views.SColumnUtil.ColumnName;
import forge.gui.toolbox.itemmanager.table.SColumnUtil.SortState; import forge.gui.toolbox.itemmanager.views.SColumnUtil.SortState;
import forge.item.InventoryItem; import forge.item.InventoryItem;
import forge.properties.NewConstants; import forge.properties.NewConstants;
@@ -89,8 +89,8 @@ public class SItemManagerIO {
} }
/** Publicly-accessible save method, to neatly handle exception handling. */ /** Publicly-accessible save method, to neatly handle exception handling. */
public static void savePreferences(JTable table) { public static void savePreferences(ItemManager<?> itemManager) {
try { save(table); } try { save(itemManager); }
catch (final Exception e) { e.printStackTrace(); } catch (final Exception e) { e.printStackTrace(); }
} }
@@ -104,9 +104,9 @@ public class SItemManagerIO {
* *
* Save list view * Save list view
* *
* @param table * @param itemManager
*/ */
private static void save(JTable table) throws Exception { private static void save(ItemManager<?> itemManager) throws Exception {
final XMLOutputFactory out = XMLOutputFactory.newInstance(); final XMLOutputFactory out = XMLOutputFactory.newInstance();
final XMLEventWriter writer = out.createXMLEventWriter(new FileOutputStream(NewConstants.EDITOR_PREFERENCES_FILE.userPrefLoc)); final XMLEventWriter writer = out.createXMLEventWriter(new FileOutputStream(NewConstants.EDITOR_PREFERENCES_FILE.userPrefLoc));
@@ -130,7 +130,7 @@ public class SItemManagerIO {
for (final ColumnName c : COLS.keySet()) { for (final ColumnName c : COLS.keySet()) {
// If column is not in view, retain previous model index for the next time // If column is not in view, retain previous model index for the next time
// that the column will be in the view. // that the column will be in the view.
int index = SColumnUtil.getColumnViewIndex(table, c); int index = SColumnUtil.getColumnViewIndex(itemManager.getTable().getTable(), c);
if (index == -1) { if (index == -1) {
index = COLS.get(c).getModelIndex(); index = COLS.get(c).getModelIndex();
} }

View File

@@ -68,7 +68,7 @@ public class CardSearchFilter extends TextSearchFilter<PaperCard> {
cbSearchMode = new FComboBoxWrapper<String>(); cbSearchMode = new FComboBoxWrapper<String>();
cbSearchMode.addItem("in"); cbSearchMode.addItem("in");
cbSearchMode.addItem("not in"); cbSearchMode.addItem("not in");
cbSearchMode.addTo(widget); widget.add(cbSearchMode.getComponent());
cbSearchMode.addItemListener(new ItemListener() { cbSearchMode.addItemListener(new ItemListener() {
@Override @Override
public void itemStateChanged(ItemEvent arg0) { public void itemStateChanged(ItemEvent arg0) {

View File

@@ -1,335 +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 <http://www.gnu.org/licenses/>.
*/
package forge.gui.toolbox.itemmanager.table;
import java.awt.Color;
import java.awt.Component;
import java.awt.KeyboardFocusManager;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import javax.swing.JComponent;
import javax.swing.JTable;
import javax.swing.JViewport;
import javax.swing.table.DefaultTableColumnModel;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import forge.gui.toolbox.FSkin;
import forge.gui.toolbox.itemmanager.ItemManager;
import forge.gui.toolbox.itemmanager.ItemManagerModel;
import forge.item.InventoryItem;
/**
* ItemTable.
*
* @param <T>
* the generic type
*/
@SuppressWarnings("serial")
public final class ItemTable<T extends InventoryItem> extends JTable {
private final FSkin.JTableSkin<ItemTable<T>> skin;
private final ItemManager<T> itemManager;
private final ItemTableModel<T> tableModel;
public ItemManager<T> getItemManager() {
return this.itemManager;
}
public ItemTableModel<T> getTableModel() {
return this.tableModel;
}
/**
* ItemTable Constructor.
*
* @param itemManager0
* @param model0
*/
public ItemTable(ItemManager<T> itemManager0, ItemManagerModel<T> model0) {
this.itemManager = itemManager0;
this.tableModel = new ItemTableModel<T>(this, model0);
// use different selection highlight colors for focused vs. unfocused tables
skin = FSkin.get(this);
skin.setSelectionBackground(FSkin.getColor(FSkin.Colors.CLR_INACTIVE));
skin.setSelectionForeground(FSkin.getColor(FSkin.Colors.CLR_TEXT));
addFocusListener(new FocusListener() {
@Override
public void focusLost(FocusEvent e) {
if (!e.isTemporary()) {
skin.setSelectionBackground(FSkin.getColor(FSkin.Colors.CLR_INACTIVE));
}
}
@Override
public void focusGained(FocusEvent e) {
skin.setSelectionBackground(FSkin.getColor(FSkin.Colors.CLR_ACTIVE));
// if nothing selected when we gain focus, select the first row (if exists)
if (-1 == getSelectedRow() && 0 < getRowCount()) {
setRowSelectionInterval(0, 0);
}
}
});
skin.setFont(FSkin.getFont(12));
setBorder(null);
getTableHeader().setBorder(null);
setRowHeight(18);
setWantElasticColumns(false);
// prevent tables from intercepting tab focus traversals
setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, null);
setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, null);
}
/**
* Applies a EditorTableModel and a model listener to this instance's JTable.
*
* @param cols &emsp; List<TableColumnInfo<InventoryItem>> of additional columns for this
*/
public void setup(final List<TableColumnInfo<InventoryItem>> cols) {
final DefaultTableColumnModel colmodel = new DefaultTableColumnModel();
//ensure columns ordered properly
Collections.sort(cols, new Comparator<TableColumnInfo<InventoryItem>>() {
@Override
public int compare(TableColumnInfo<InventoryItem> arg0, TableColumnInfo<InventoryItem> arg1) {
return Integer.compare(arg0.getIndex(), arg1.getIndex());
}
});
for (TableColumnInfo<InventoryItem> item : cols) {
item.setModelIndex(colmodel.getColumnCount());
if (item.isShowing()) { colmodel.addColumn(item); }
}
this.tableModel.addListeners();
setModel(this.tableModel);
setColumnModel(colmodel);
this.tableModel.setup();
this.tableModel.refreshSort();
getTableHeader().setBackground(new Color(200, 200, 200));
}
private String _getCellTooltip(TableCellRenderer renderer, int row, int col, Object val) {
Component cell = renderer.getTableCellRendererComponent(
this, val, false, false, row, col);
// if we're conditionally showing the tooltip, check to see
// if we shouldn't show it
if (!(cell instanceof AlwaysShowToolTip))
{
// if there's enough room (or there's no value), no tooltip
// we use '>' here instead of '>=' since that seems to be the
// threshold for where the ellipses appear for the default
// JTable renderer
int requiredWidth = cell.getPreferredSize().width;
TableColumn tableColumn = columnModel.getColumn(col);
if (null == val || tableColumn.getWidth() > requiredWidth) {
return null;
}
}
// use a pre-set tooltip if it exists
if (cell instanceof JComponent)
{
JComponent jcell = (JComponent)cell;
String tip = jcell.getToolTipText();
if (null != tip)
{
return tip;
}
}
// otherwise, show the full text in the tooltip
return String.valueOf(val);
}
// column headers
@Override
protected JTableHeader createDefaultTableHeader() {
return new JTableHeader(columnModel) {
public String getToolTipText(MouseEvent e) {
int col = columnModel.getColumnIndexAtX(e.getPoint().x);
if (col < 0) { return null; }
TableColumn tableColumn = columnModel.getColumn(col);
TableCellRenderer headerRenderer = tableColumn.getHeaderRenderer();
if (null == headerRenderer) {
headerRenderer = getDefaultRenderer();
}
return _getCellTooltip(
headerRenderer, -1, col, tableColumn.getHeaderValue());
}
};
}
// cell data
@Override
public String getToolTipText(MouseEvent e) {
Point p = e.getPoint();
int row = rowAtPoint(p);
int col = columnAtPoint(p);
if (col >= getColumnCount() || row >= getRowCount()) {
return null;
}
Object val = getValueAt(row, col);
if (null == val) {
return null;
}
return _getCellTooltip(getCellRenderer(row, col), row, col, val);
}
private int lastTooltipRow = -1;
private int lastTooltipCol = -1;
private Point lastTooltipPt;
@Override
public Point getToolTipLocation(MouseEvent e) {
Point p = e.getPoint();
final int row = rowAtPoint(p);
final int col = columnAtPoint(p);
if (row == lastTooltipRow && col == lastTooltipCol) {
p = lastTooltipPt;
} else {
lastTooltipRow = row;
lastTooltipCol = col;
lastTooltipPt = p;
}
return new Point(p.x + 10, p.y + 20);
}
public void setAvailableColumns(final List<TableColumnInfo<InventoryItem>> cols) {
final DefaultTableColumnModel colModel = new DefaultTableColumnModel();
for (TableColumnInfo<InventoryItem> item : cols) {
item.setModelIndex(colModel.getColumnCount());
if (item.isShowing()) { colModel.addColumn(item); }
}
setColumnModel(colModel);
}
/**
*
* fixSelection. Call this after deleting an item from table.
*
* @param rowLastSelected
* an int
*/
public void fixSelection(final int rowLastSelected) {
if (0 > rowLastSelected) {
return;
}
// 3 cases: 0 items left, select the same row, select prev row
int numRows = getRowCount();
if (numRows == 0) {
return;
}
int newRow = rowLastSelected;
if (numRows <= newRow) {
// move selection away from the last, already missing, option
newRow = numRows - 1;
}
selectAndScrollTo(newRow);
}
/**
*
* getSelectedItem.
*
* @return InventoryItem
*/
public T getSelectedItem() {
final int iRow = getSelectedRow();
return iRow >= 0 ? this.tableModel.rowToItem(iRow).getKey() : null;
}
/**
*
* getSelectedItems.
*
* @return List<InventoryItem>
*/
public List<T> getSelectedItems() {
List<T> items = new ArrayList<T>();
for (int row : getSelectedRows()) {
items.add(tableModel.rowToItem(row).getKey());
}
return items;
}
/**
*
* setSelectedItem.
*
* @param item - Item to select
*/
public void setSelectedItem(T item) {
int row = this.tableModel.itemToRow(item);
if (row != -1) {
selectAndScrollTo(row);
}
}
public void setWantElasticColumns(boolean value) {
setAutoResizeMode(value ? JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS : JTable.AUTO_RESIZE_OFF);
}
public void selectAndScrollTo(int rowIdx) {
if (!(getParent() instanceof JViewport)) {
return;
}
JViewport viewport = (JViewport)getParent();
// compute where we're going and where we are
Rectangle targetRect = getCellRect(rowIdx, 0, true);
Rectangle curViewRect = viewport.getViewRect();
// if the target cell is not visible, attempt to jump to a location where it is
// visible but not on the edge of the viewport
if (targetRect.y + targetRect.height > curViewRect.y + curViewRect.height) {
// target is below us, move to position 3 rows below target
targetRect.setLocation(targetRect.x, targetRect.y + (targetRect.height * 3));
} else if (targetRect.y < curViewRect.y) {
// target is above is, move to position 3 rows above target
targetRect.setLocation(targetRect.x, targetRect.y - (targetRect.height * 3));
}
scrollRectToVisible(targetRect);
setRowSelectionInterval(rowIdx, rowIdx);
}
}

View File

@@ -1,357 +0,0 @@
/*
* Forge: Play Magic: the Gathering.
* Copyright (C) 2011
*
* 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 <http://www.gnu.org/licenses/>.
*/
package forge.gui.toolbox.itemmanager.table;
import java.awt.Cursor;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Enumeration;
import java.util.List;
import java.util.Map.Entry;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.TableModelEvent;
import javax.swing.table.AbstractTableModel;
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.itemmanager.ItemManagerModel;
import forge.gui.toolbox.itemmanager.SItemManagerIO;
import forge.gui.toolbox.itemmanager.table.SColumnUtil.ColumnName;
import forge.gui.toolbox.itemmanager.table.SColumnUtil.SortState;
import forge.item.InventoryItem;
import forge.util.ItemPoolSorter;
/**
* <p>
* ItemTableModel class.
* </p>
*
* @param <T>
* the generic type
* @author Forge
* @version $Id: ItemTableModel.java 19857 2013-02-24 08:49:52Z Max mtg $
*/
@SuppressWarnings("serial")
public final class ItemTableModel<T extends InventoryItem> extends AbstractTableModel {
private final ItemTable<T> table;
private final ItemManagerModel<T> model;
private final CascadeManager cascadeManager = new CascadeManager();
private final int maxSortDepth = 3;
/**
* Instantiates a new table model.
*
* @param table0 &emsp; {@link forge.gui.ItemManager.ItemTable<T>}
* @param model0 &emsp; {@link forge.gui.ItemManager.ItemManagerModel<T>}
*/
public ItemTableModel(final ItemTable<T> table0, final ItemManagerModel<T> model0) {
this.table = table0;
this.model = model0;
}
/** */
@SuppressWarnings("unchecked")
public void setup() {
final Enumeration<TableColumn> e = table.getColumnModel().getColumns();
final TableColumn[] sortcols = new TableColumn[table.getColumnCount()];
// Assemble priority sort.
while (e.hasMoreElements()) {
final TableColumnInfo<InventoryItem> col = (TableColumnInfo<InventoryItem>) e.nextElement();
if (col.getSortPriority() > 0) {
sortcols[col.getSortPriority()] = col;
}
}
final boolean isDeckTable = ((TableColumnInfo<InventoryItem>) table.getColumnModel()
.getColumn(0)).getEnumValue().substring(0, 4).equals("DECK")
? true : false;
cascadeManager.reset();
if (sortcols[1] == null) {
if (isDeckTable) {
cascadeManager.add((TableColumnInfo<T>) SColumnUtil.getColumn(ColumnName.DECK_NAME), true);
}
else {
cascadeManager.add((TableColumnInfo<T>) SColumnUtil.getColumn(ColumnName.CAT_NAME), true);
}
}
else {
ArrayUtils.reverse(sortcols);
for (int i = 1; i < sortcols.length; i++) {
if (sortcols[i] != null) {
cascadeManager.add((TableColumnInfo<T>) sortcols[i], true);
}
}
}
}
/**
* Row to item.
*
* @param row - the row
* @return the item
*/
public Entry<T, Integer> rowToItem(final int row) {
final List<Entry<T, Integer>> orderedList = this.model.getOrderedList();
return (row >= 0) && (row < orderedList.size()) ? orderedList.get(row) : null;
}
/**
* Item to row.
*
* @param item - the item
* @return the row
*/
public int itemToRow(final T item) { //TODO: Consider optimizing this if used frequently
final List<Entry<T, Integer>> orderedList = this.model.getOrderedList();
for (int i = 0; i < orderedList.size(); i++) {
if (orderedList.get(i).getKey() == item) {
return i;
}
}
return -1;
}
public void onSelectionChange(final ItemTable<T> table) {
final int row = table.getSelectedRow();
if (row != -1) {
ListSelectionEvent event = new ListSelectionEvent(table.getItemManager(), row, row, false);
for (ListSelectionListener listener : table.getItemManager().getSelectionListeners()) {
listener.valueChanged(event);
}
}
}
private final ListSelectionListener listSelectionListener = new ListSelectionListener() {
@Override
public void valueChanged(final ListSelectionEvent arg0) {
ItemTableModel.this.onSelectionChange(table);
}
};
private final FocusAdapter focusAdapter = new FocusAdapter() {
@Override
public void focusGained(final FocusEvent e) {
ItemTableModel.this.onSelectionChange(table);
}
};
private final FMouseAdapter headerMouseAdapter = new FMouseAdapter(true) {
@SuppressWarnings("unchecked")
@Override
public void onLeftClick(MouseEvent e) {
if (Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR) == table.getTableHeader().getCursor()) {
return;
}
//toggle column sort
final TableColumnModel colModel = ItemTableModel.this.table.getColumnModel();
final int columnModelIndex = colModel.getColumnIndexAtX(e.getX());
final int modelIndex = colModel.getColumn(columnModelIndex).getModelIndex();
if (modelIndex < 0) {
return;
}
// This will invert if needed
// 2012/07/21 - Changed from modelIndex to ColumnModelIndex due to a crash
// Crash was: Hide 2 columns, then search by last column.
ItemTableModel.this.cascadeManager.add((TableColumnInfo<T>) ItemTableModel.this.table.getColumnModel().getColumn(columnModelIndex), false);
ItemTableModel.this.refreshSort();
ItemTableModel.this.table.tableChanged(new TableModelEvent(ItemTableModel.this));
ItemTableModel.this.table.repaint();
if (ItemTableModel.this.table.getRowCount() > 0) {
ItemTableModel.this.table.setRowSelectionInterval(0, 0);
}
SItemManagerIO.savePreferences(ItemTableModel.this.table);
}
@Override
public void onLeftMouseDragDrop(MouseEvent e) { //save preferences after column moved/resized
SItemManagerIO.savePreferences(ItemTableModel.this.table);
}
};
/**
* <p>
* addListeners.
* </p>
*/
public void addListeners() {
// updates card detail, listens to any key strokes
table.getSelectionModel().removeListSelectionListener(listSelectionListener); //ensure listener not added multiple times
table.getSelectionModel().addListSelectionListener(listSelectionListener);
table.removeFocusListener(focusAdapter); //ensure listener not added multiple times
table.addFocusListener(focusAdapter);
table.getTableHeader().removeMouseListener(headerMouseAdapter); //ensure listener not added multiple times
table.getTableHeader().addMouseListener(headerMouseAdapter);
}
/**
* Resort.
*/
public void refreshSort() {
if (this.model.getOrderedList().size() == 0) { return; }
Collections.sort(this.model.getOrderedList(), new MyComparator());
}
//========== Overridden from AbstractTableModel
/** {@inheritDoc} */
@Override
public int findColumn(final String name0) {
return table.getColumnModel().getColumnIndex(name0);
}
/* (non-Javadoc)
* @see javax.swing.table.TableModel#getColumnCount()
*/
@Override
public int getColumnCount() {
return table.getColumnCount();
}
/* (non-Javadoc)
* @see javax.swing.table.TableModel#getRowCount()
*/
@Override
public int getRowCount() {
return this.model.countDistinct();
}
/* (non-Javadoc)
* @see javax.swing.table.TableModel#getValueAt(int, int)
*/
@Override
@SuppressWarnings("unchecked")
public Object getValueAt(int iRow, int iCol) {
Entry<T, Integer> card = this.rowToItem(iRow);
if (null == card) {
return null;
}
return ((TableColumnInfo<T>) table.getColumnModel().getColumn(table.convertColumnIndexToView(iCol))).getFnDisplay().apply(card);
}
//========= Custom class handling
/**
* Manages sorting orders for multiple depths of sorting.
*/
private final class CascadeManager {
private final List<TableColumnInfo<InventoryItem>> colsToSort = new ArrayList<TableColumnInfo<InventoryItem>>(3);
private TableSorterCascade<InventoryItem> 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.
@SuppressWarnings("unchecked")
public void add(final TableColumnInfo<T> col0, boolean forSetup) {
this.sorter = null;
if (forSetup) { //just add column unmodified if setting up sort columns
this.colsToSort.add(0, (TableColumnInfo<InventoryItem>) col0);
}
else {
// Found at top level, should invert
if (colsToSort.size() > 0 && colsToSort.get(0).equals(col0)) {
col0.setSortPriority(1);
col0.setSortState(col0.getSortState() == SortState.ASC
? SortState.DESC : SortState.ASC);
}
// Found somewhere: move down others, this one to top.
else if (colsToSort.contains(col0)) {
col0.setSortState(SortState.ASC);
this.colsToSort.remove(col0);
this.colsToSort.add(0, (TableColumnInfo<InventoryItem>) col0);
}
// No column in list; add directly.
else {
col0.setSortPriority(1);
col0.setSortState(SortState.ASC);
this.colsToSort.add(0, (TableColumnInfo<InventoryItem>) 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).setSortState(SortState.NONE);
this.colsToSort.get(maxSortDepth).setSortPriority(0);
this.colsToSort.remove(maxSortDepth);
}
}
public TableSorterCascade<InventoryItem> getSorter() {
if (this.sorter == null) {
this.sorter = createSorter();
}
return this.sorter;
}
public void reset() {
this.colsToSort.clear();
this.sorter = null;
}
private TableSorterCascade<InventoryItem> createSorter() {
final List<ItemPoolSorter<InventoryItem>> oneColSorters
= new ArrayList<ItemPoolSorter<InventoryItem>>(maxSortDepth);
for (final TableColumnInfo<InventoryItem> col : this.colsToSort) {
oneColSorters.add(new ItemPoolSorter<InventoryItem>(
col.getFnSort(),
col.getSortState().equals(SortState.ASC) ? true : false));
}
return new TableSorterCascade<InventoryItem>(oneColSorters);
}
}
private class MyComparator implements Comparator<Entry<T, Integer>> {
/* (non-Javadoc)
* @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
*/
@SuppressWarnings("unchecked")
@Override
public int compare(Entry<T, Integer> o1, Entry<T, Integer> o2) {
return ItemTableModel.this.cascadeManager.getSorter().compare(
(Entry<InventoryItem, Integer>) o1, (Entry<InventoryItem, Integer>) o2);
}
}
} // ItemTableModel

View File

@@ -15,7 +15,7 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package forge.gui.toolbox.itemmanager.table; package forge.gui.toolbox.itemmanager.views;
/** /**
* A marker interface for indicating that tooltips should always be shown for * A marker interface for indicating that tooltips should always be shown for

View File

@@ -15,7 +15,7 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package forge.gui.toolbox.itemmanager.table; package forge.gui.toolbox.itemmanager.views;
import java.awt.Component; import java.awt.Component;

View File

@@ -0,0 +1,679 @@
/*
* 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 <http://www.gnu.org/licenses/>.
*/
package forge.gui.toolbox.itemmanager.views;
import java.awt.Color;
import java.awt.Component;
import java.awt.Cursor;
import java.awt.KeyboardFocusManager;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Enumeration;
import java.util.List;
import java.util.Map.Entry;
import javax.swing.JComponent;
import javax.swing.JTable;
import javax.swing.JViewport;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.TableModelEvent;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableColumnModel;
import javax.swing.table.JTableHeader;
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.itemmanager.ItemManager;
import forge.gui.toolbox.itemmanager.ItemManagerModel;
import forge.gui.toolbox.itemmanager.SItemManagerIO;
import forge.gui.toolbox.itemmanager.views.SColumnUtil.ColumnName;
import forge.gui.toolbox.itemmanager.views.SColumnUtil.SortState;
import forge.item.InventoryItem;
import forge.util.ItemPoolSorter;
/**
* ItemTable.
*
* @param <T>
* the generic type
*/
@SuppressWarnings("serial")
public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
private final ItemTable table = new ItemTable();
private final FSkin.JTableSkin<ItemTable> skin;
private final ItemTableModel tableModel;
public ItemTableModel getTableModel() {
return this.tableModel;
}
/**
* ItemTable Constructor.
*
* @param itemManager0
* @param model0
*/
public ItemListView(ItemManager<T> itemManager0, ItemManagerModel<T> model0) {
super(itemManager0);
this.tableModel = new ItemTableModel(model0);
// use different selection highlight colors for focused vs. unfocused tables
this.skin = FSkin.get(this.table);
this.skin.setSelectionBackground(FSkin.getColor(FSkin.Colors.CLR_INACTIVE));
this.skin.setSelectionForeground(FSkin.getColor(FSkin.Colors.CLR_TEXT));
this.table.addFocusListener(new FocusListener() {
@Override
public void focusLost(FocusEvent e) {
if (!e.isTemporary()) {
skin.setSelectionBackground(FSkin.getColor(FSkin.Colors.CLR_INACTIVE));
}
}
@Override
public void focusGained(FocusEvent e) {
skin.setSelectionBackground(FSkin.getColor(FSkin.Colors.CLR_ACTIVE));
// if nothing selected when we gain focus, select the first row (if exists)
if (-1 == getSelectedIndex() && getCount() > 0) {
table.setRowSelectionInterval(0, 0);
}
}
});
this.skin.setFont(FSkin.getFont(12));
this.table.setBorder(null);
this.table.getTableHeader().setBorder(null);
this.table.setRowHeight(18);
setWantElasticColumns(false);
// prevent tables from intercepting tab focus traversals
this.table.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, null);
this.table.setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, null);
}
/**
* Applies a EditorTableModel and a model listener to this instance's JTable.
*
* @param cols &emsp; List<TableColumnInfo<InventoryItem>> of additional columns for this
*/
public void setup(final List<TableColumnInfo<InventoryItem>> cols) {
final DefaultTableColumnModel colmodel = new DefaultTableColumnModel();
//ensure columns ordered properly
Collections.sort(cols, new Comparator<TableColumnInfo<InventoryItem>>() {
@Override
public int compare(TableColumnInfo<InventoryItem> arg0, TableColumnInfo<InventoryItem> arg1) {
return Integer.compare(arg0.getIndex(), arg1.getIndex());
}
});
for (TableColumnInfo<InventoryItem> item : cols) {
item.setModelIndex(colmodel.getColumnCount());
if (item.isShowing()) { colmodel.addColumn(item); }
}
this.tableModel.addListeners();
this.table.setModel(this.tableModel);
this.table.setColumnModel(colmodel);
this.tableModel.setup();
this.tableModel.refreshSort();
this.table.getTableHeader().setBackground(new Color(200, 200, 200));
}
private String getCellTooltip(TableCellRenderer renderer, int row, int col, Object val) {
Component cell = renderer.getTableCellRendererComponent(
this.table, val, false, false, row, col);
// if we're conditionally showing the tooltip, check to see
// if we shouldn't show it
if (!(cell instanceof AlwaysShowToolTip))
{
// if there's enough room (or there's no value), no tooltip
// we use '>' here instead of '>=' since that seems to be the
// threshold for where the ellipses appear for the default
// JTable renderer
int requiredWidth = cell.getPreferredSize().width;
TableColumn tableColumn = this.table.getColumnModel().getColumn(col);
if (null == val || tableColumn.getWidth() > requiredWidth) {
return null;
}
}
// use a pre-set tooltip if it exists
if (cell instanceof JComponent)
{
JComponent jcell = (JComponent)cell;
String tip = jcell.getToolTipText();
if (null != tip)
{
return tip;
}
}
// otherwise, show the full text in the tooltip
return String.valueOf(val);
}
public void setAvailableColumns(final List<TableColumnInfo<InventoryItem>> cols) {
final DefaultTableColumnModel colModel = new DefaultTableColumnModel();
for (TableColumnInfo<InventoryItem> item : cols) {
item.setModelIndex(colModel.getColumnCount());
if (item.isShowing()) { colModel.addColumn(item); }
}
table.setColumnModel(colModel);
}
/**
*
* fixSelection. Call this after deleting an item from table.
*
* @param rowLastSelected
* an int
*/
public void fixSelection(final int rowLastSelected) {
if (0 > rowLastSelected) {
return;
}
// 3 cases: 0 items left, select the same row, select prev row
int numRows = getCount();
if (numRows == 0) {
return;
}
int newRow = rowLastSelected;
if (numRows <= newRow) {
// move selection away from the last, already missing, option
newRow = numRows - 1;
}
setSelectedIndex(newRow);
}
public JTable getTable() {
return this.table;
}
@Override
public JComponent getComponent() {
return this.table;
}
@Override
protected String getCaption() {
return "List View";
}
@Override
public void setAllowMultipleSelections(boolean allowMultipleSelections) {
this.table.setSelectionMode(allowMultipleSelections ? ListSelectionModel.MULTIPLE_INTERVAL_SELECTION : ListSelectionModel.SINGLE_SELECTION);
}
@Override
public int getSelectedIndex() {
return this.table.getSelectedRow();
}
@Override
public T getSelectedItem() {
final int iRow = this.table.getSelectedRow();
return iRow >= 0 ? this.tableModel.rowToItem(iRow).getKey() : null;
}
@Override
public int[] getSelectedIndices() {
return this.table.getSelectedRows();
}
@Override
public List<T> getSelectedItems() {
List<T> items = new ArrayList<T>();
for (int row : this.table.getSelectedRows()) {
items.add(tableModel.rowToItem(row).getKey());
}
return items;
}
@Override
public void setSelectedIndex(int index) {
if (!(this.table.getParent() instanceof JViewport)) {
return;
}
JViewport viewport = (JViewport)this.table.getParent();
// compute where we're going and where we are
Rectangle targetRect = this.table.getCellRect(index, 0, true);
Rectangle curViewRect = viewport.getViewRect();
// if the target cell is not visible, attempt to jump to a location where it is
// visible but not on the edge of the viewport
if (targetRect.y + targetRect.height > curViewRect.y + curViewRect.height) {
// target is below us, move to position 3 rows below target
targetRect.setLocation(targetRect.x, targetRect.y + (targetRect.height * 3));
}
else if (targetRect.y < curViewRect.y) {
// target is above is, move to position 3 rows above target
targetRect.setLocation(targetRect.x, targetRect.y - (targetRect.height * 3));
}
this.table.scrollRectToVisible(targetRect);
this.table.setRowSelectionInterval(index, index);
}
@Override
public void selectAll() {
this.table.selectAll();
}
@Override
public int getIndexOfItem(T item) {
return this.tableModel.itemToRow(item);
}
@Override
public T getItemAtIndex(int index) {
return this.tableModel.rowToItem(index).getKey();
}
@Override
public int getCount() {
return this.table.getRowCount();
}
@Override
public int getIndexAtPoint(Point p) {
return this.table.rowAtPoint(p);
}
public void setWantElasticColumns(boolean value) {
this.table.setAutoResizeMode(value ? JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS : JTable.AUTO_RESIZE_OFF);
}
public final class ItemTable extends JTable {
@Override
protected JTableHeader createDefaultTableHeader() {
return new JTableHeader(columnModel) {
public String getToolTipText(MouseEvent e) {
int col = columnModel.getColumnIndexAtX(e.getPoint().x);
if (col < 0) { return null; }
TableColumn tableColumn = columnModel.getColumn(col);
TableCellRenderer headerRenderer = tableColumn.getHeaderRenderer();
if (null == headerRenderer) {
headerRenderer = getDefaultRenderer();
}
return getCellTooltip(
headerRenderer, -1, col, tableColumn.getHeaderValue());
}
};
}
@Override
public String getToolTipText(MouseEvent e) {
Point p = e.getPoint();
int row = rowAtPoint(p);
int col = columnAtPoint(p);
if (col >= getColumnCount() || row >= getRowCount()) {
return null;
}
Object val = getValueAt(row, col);
if (null == val) {
return null;
}
return getCellTooltip(getCellRenderer(row, col), row, col, val);
}
private int lastTooltipRow = -1;
private int lastTooltipCol = -1;
private Point lastTooltipPt;
@Override
public Point getToolTipLocation(MouseEvent e) {
Point p = e.getPoint();
final int row = rowAtPoint(p);
final int col = columnAtPoint(p);
if (row == lastTooltipRow && col == lastTooltipCol) {
p = lastTooltipPt;
} else {
lastTooltipRow = row;
lastTooltipCol = col;
lastTooltipPt = p;
}
return new Point(p.x + 10, p.y + 20);
}
}
public final class ItemTableModel extends AbstractTableModel {
private final ItemManagerModel<T> model;
private final CascadeManager cascadeManager = new CascadeManager();
private final int maxSortDepth = 3;
/**
* Instantiates a new table model.
*
* @param table0 &emsp; {@link forge.gui.ItemManager.ItemTable<T>}
* @param model0 &emsp; {@link forge.gui.ItemManager.ItemManagerModel<T>}
*/
public ItemTableModel(final ItemManagerModel<T> model0) {
this.model = model0;
}
/** */
@SuppressWarnings("unchecked")
public void setup() {
final Enumeration<TableColumn> e = table.getColumnModel().getColumns();
final TableColumn[] sortcols = new TableColumn[table.getColumnCount()];
// Assemble priority sort.
while (e.hasMoreElements()) {
final TableColumnInfo<InventoryItem> col = (TableColumnInfo<InventoryItem>) e.nextElement();
if (col.getSortPriority() > 0) {
sortcols[col.getSortPriority()] = col;
}
}
final boolean isDeckTable = ((TableColumnInfo<InventoryItem>) table.getColumnModel()
.getColumn(0)).getEnumValue().substring(0, 4).equals("DECK")
? true : false;
cascadeManager.reset();
if (sortcols[1] == null) {
if (isDeckTable) {
cascadeManager.add((TableColumnInfo<T>) SColumnUtil.getColumn(ColumnName.DECK_NAME), true);
}
else {
cascadeManager.add((TableColumnInfo<T>) SColumnUtil.getColumn(ColumnName.CAT_NAME), true);
}
}
else {
ArrayUtils.reverse(sortcols);
for (int i = 1; i < sortcols.length; i++) {
if (sortcols[i] != null) {
cascadeManager.add((TableColumnInfo<T>) sortcols[i], true);
}
}
}
}
/**
* Row to item.
*
* @param row - the row
* @return the item
*/
public Entry<T, Integer> rowToItem(final int row) {
final List<Entry<T, Integer>> orderedList = this.model.getOrderedList();
return (row >= 0) && (row < orderedList.size()) ? orderedList.get(row) : null;
}
/**
* Item to row.
*
* @param item - the item
* @return the row
*/
public int itemToRow(final T item) { //TODO: Consider optimizing this if used frequently
final List<Entry<T, Integer>> orderedList = this.model.getOrderedList();
for (int i = 0; i < orderedList.size(); i++) {
if (orderedList.get(i).getKey() == item) {
return i;
}
}
return -1;
}
public void onSelectionChange() {
final int row = getSelectedIndex();
if (row != -1) {
ListSelectionEvent event = new ListSelectionEvent(getItemManager(), row, row, false);
for (ListSelectionListener listener : getItemManager().getSelectionListeners()) {
listener.valueChanged(event);
}
}
}
private final ListSelectionListener listSelectionListener = new ListSelectionListener() {
@Override
public void valueChanged(final ListSelectionEvent arg0) {
ItemTableModel.this.onSelectionChange();
}
};
private final FocusAdapter focusAdapter = new FocusAdapter() {
@Override
public void focusGained(final FocusEvent e) {
ItemTableModel.this.onSelectionChange();
}
};
private final FMouseAdapter headerMouseAdapter = new FMouseAdapter(true) {
@SuppressWarnings("unchecked")
@Override
public void onLeftClick(MouseEvent e) {
if (Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR) == table.getTableHeader().getCursor()) {
return;
}
//toggle column sort
final TableColumnModel colModel = table.getColumnModel();
final int columnModelIndex = colModel.getColumnIndexAtX(e.getX());
final int modelIndex = colModel.getColumn(columnModelIndex).getModelIndex();
if (modelIndex < 0) {
return;
}
// This will invert if needed
// 2012/07/21 - Changed from modelIndex to ColumnModelIndex due to a crash
// Crash was: Hide 2 columns, then search by last column.
ItemTableModel.this.cascadeManager.add((TableColumnInfo<T>) table.getColumnModel().getColumn(columnModelIndex), false);
ItemTableModel.this.refreshSort();
table.tableChanged(new TableModelEvent(ItemTableModel.this));
table.repaint();
if (getCount() > 0) {
table.setRowSelectionInterval(0, 0);
}
SItemManagerIO.savePreferences(getItemManager());
}
@Override
public void onLeftMouseDragDrop(MouseEvent e) { //save preferences after column moved/resized
SItemManagerIO.savePreferences(getItemManager());
}
};
/**
* <p>
* addListeners.
* </p>
*/
public void addListeners() {
// updates card detail, listens to any key strokes
table.getSelectionModel().removeListSelectionListener(listSelectionListener); //ensure listener not added multiple times
table.getSelectionModel().addListSelectionListener(listSelectionListener);
table.removeFocusListener(focusAdapter); //ensure listener not added multiple times
table.addFocusListener(focusAdapter);
table.getTableHeader().removeMouseListener(headerMouseAdapter); //ensure listener not added multiple times
table.getTableHeader().addMouseListener(headerMouseAdapter);
}
/**
* Resort.
*/
public void refreshSort() {
if (this.model.getOrderedList().size() == 0) { return; }
Collections.sort(this.model.getOrderedList(), new MyComparator());
}
//========== Overridden from AbstractTableModel
/** {@inheritDoc} */
@Override
public int findColumn(final String name0) {
return table.getColumnModel().getColumnIndex(name0);
}
/* (non-Javadoc)
* @see javax.swing.table.TableModel#getColumnCount()
*/
@Override
public int getColumnCount() {
return table.getColumnCount();
}
/* (non-Javadoc)
* @see javax.swing.table.TableModel#getRowCount()
*/
@Override
public int getRowCount() {
return this.model.countDistinct();
}
/* (non-Javadoc)
* @see javax.swing.table.TableModel#getValueAt(int, int)
*/
@Override
@SuppressWarnings("unchecked")
public Object getValueAt(int iRow, int iCol) {
Entry<T, Integer> card = this.rowToItem(iRow);
if (null == card) {
return null;
}
return ((TableColumnInfo<T>) table.getColumnModel().getColumn(table.convertColumnIndexToView(iCol))).getFnDisplay().apply(card);
}
//========= Custom class handling
/**
* Manages sorting orders for multiple depths of sorting.
*/
private final class CascadeManager {
private final List<TableColumnInfo<InventoryItem>> colsToSort = new ArrayList<TableColumnInfo<InventoryItem>>(3);
private TableSorterCascade<InventoryItem> 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.
@SuppressWarnings("unchecked")
public void add(final TableColumnInfo<T> col0, boolean forSetup) {
this.sorter = null;
if (forSetup) { //just add column unmodified if setting up sort columns
this.colsToSort.add(0, (TableColumnInfo<InventoryItem>) col0);
}
else {
// Found at top level, should invert
if (colsToSort.size() > 0 && colsToSort.get(0).equals(col0)) {
col0.setSortPriority(1);
col0.setSortState(col0.getSortState() == SortState.ASC
? SortState.DESC : SortState.ASC);
}
// Found somewhere: move down others, this one to top.
else if (colsToSort.contains(col0)) {
col0.setSortState(SortState.ASC);
this.colsToSort.remove(col0);
this.colsToSort.add(0, (TableColumnInfo<InventoryItem>) col0);
}
// No column in list; add directly.
else {
col0.setSortPriority(1);
col0.setSortState(SortState.ASC);
this.colsToSort.add(0, (TableColumnInfo<InventoryItem>) 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).setSortState(SortState.NONE);
this.colsToSort.get(maxSortDepth).setSortPriority(0);
this.colsToSort.remove(maxSortDepth);
}
}
public TableSorterCascade<InventoryItem> getSorter() {
if (this.sorter == null) {
this.sorter = createSorter();
}
return this.sorter;
}
public void reset() {
this.colsToSort.clear();
this.sorter = null;
}
private TableSorterCascade<InventoryItem> createSorter() {
final List<ItemPoolSorter<InventoryItem>> oneColSorters
= new ArrayList<ItemPoolSorter<InventoryItem>>(maxSortDepth);
for (final TableColumnInfo<InventoryItem> col : this.colsToSort) {
oneColSorters.add(new ItemPoolSorter<InventoryItem>(
col.getFnSort(),
col.getSortState().equals(SortState.ASC) ? true : false));
}
return new TableSorterCascade<InventoryItem>(oneColSorters);
}
}
private class MyComparator implements Comparator<Entry<T, Integer>> {
/* (non-Javadoc)
* @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
*/
@SuppressWarnings("unchecked")
@Override
public int compare(Entry<T, Integer> o1, Entry<T, Integer> o2) {
return ItemTableModel.this.cascadeManager.getSorter().compare(
(Entry<InventoryItem, Integer>) o1, (Entry<InventoryItem, Integer>) o2);
}
}
}
}

View File

@@ -0,0 +1,55 @@
package forge.gui.toolbox.itemmanager.views;
import java.awt.Point;
import java.util.List;
import javax.swing.JComponent;
import forge.gui.toolbox.itemmanager.ItemManager;
import forge.item.InventoryItem;
public abstract class ItemView<T extends InventoryItem> {
private final ItemManager<T> itemManager;
protected ItemView(ItemManager<T> itemManager0) {
this.itemManager = itemManager0;
}
public ItemManager<T> getItemManager() {
return this.itemManager;
}
public void setSelectedItem(T item) {
int index = this.getIndexOfItem(item);
if (index != -1) {
setSelectedIndex(index);
}
}
public void focus() {
this.getComponent().requestFocusInWindow();
}
public boolean hasFocus() {
return this.getComponent().hasFocus();
}
@Override
public String toString() {
return this.getCaption(); //return caption as string for display in combo box
}
public abstract JComponent getComponent();
public abstract void setAllowMultipleSelections(boolean allowMultipleSelections);
public abstract T getItemAtIndex(int index);
public abstract int getIndexOfItem(T item);
public abstract int getSelectedIndex();
public abstract int[] getSelectedIndices();
public abstract T getSelectedItem();
public abstract List<T> getSelectedItems();
public abstract void setSelectedIndex(int index);
public abstract void selectAll();
public abstract int getCount();
public abstract int getIndexAtPoint(Point p);
protected abstract String getCaption();
}

View File

@@ -15,7 +15,7 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package forge.gui.toolbox.itemmanager.table; package forge.gui.toolbox.itemmanager.views;
import java.awt.Component; import java.awt.Component;
import java.awt.Graphics; import java.awt.Graphics;

View File

@@ -15,7 +15,7 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package forge.gui.toolbox.itemmanager.table; package forge.gui.toolbox.itemmanager.views;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Enumeration; import java.util.Enumeration;

View File

@@ -15,7 +15,7 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package forge.gui.toolbox.itemmanager.table; package forge.gui.toolbox.itemmanager.views;
import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.DefaultTableCellRenderer;

View File

@@ -15,7 +15,7 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package forge.gui.toolbox.itemmanager.table; package forge.gui.toolbox.itemmanager.views;
import java.util.Map.Entry; import java.util.Map.Entry;
@@ -23,7 +23,7 @@ import javax.swing.table.TableColumn;
import com.google.common.base.Function; import com.google.common.base.Function;
import forge.gui.toolbox.itemmanager.table.SColumnUtil.SortState; import forge.gui.toolbox.itemmanager.views.SColumnUtil.SortState;
/** /**
* A column object in a EditorTableModel in the card editor. * A column object in a EditorTableModel in the card editor.

View File

@@ -15,7 +15,7 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package forge.gui.toolbox.itemmanager.table; package forge.gui.toolbox.itemmanager.views;
import java.util.Comparator; import java.util.Comparator;
import java.util.List; import java.util.List;

View File

@@ -28,7 +28,7 @@ import forge.gui.menus.IMenuProvider;
import forge.gui.toolbox.itemmanager.CardManager; import forge.gui.toolbox.itemmanager.CardManager;
import forge.gui.toolbox.itemmanager.SItemManagerIO; import forge.gui.toolbox.itemmanager.SItemManagerIO;
import forge.gui.toolbox.itemmanager.SItemManagerIO.EditorPreference; import forge.gui.toolbox.itemmanager.SItemManagerIO.EditorPreference;
import forge.gui.toolbox.itemmanager.table.ItemTable; import forge.gui.toolbox.itemmanager.views.ItemListView;
import forge.gui.workshop.menus.CWorkshopUIMenus; import forge.gui.workshop.menus.CWorkshopUIMenus;
import forge.gui.workshop.views.VWorkshopCatalog; import forge.gui.workshop.views.VWorkshopCatalog;
import forge.item.PaperCard; import forge.item.PaperCard;
@@ -71,7 +71,7 @@ public enum CWorkshopUI implements ICDoc, IMenuProvider {
public void initialize() { public void initialize() {
Singletons.getControl().getForgeMenu().setProvider(this); Singletons.getControl().getForgeMenu().setProvider(this);
final CardManager cardManager = VWorkshopCatalog.SINGLETON_INSTANCE.getCardManager(); final CardManager cardManager = VWorkshopCatalog.SINGLETON_INSTANCE.getCardManager();
final ItemTable<PaperCard> cardTable = cardManager.getTable(); final ItemListView<PaperCard> cardTable = cardManager.getTable();
boolean wantElastic = SItemManagerIO.getPref(EditorPreference.elastic_columns); boolean wantElastic = SItemManagerIO.getPref(EditorPreference.elastic_columns);
boolean wantUnique = SItemManagerIO.getPref(EditorPreference.display_unique_only); boolean wantUnique = SItemManagerIO.getPref(EditorPreference.display_unique_only);

View File

@@ -1,12 +1,13 @@
package forge.gui.workshop.controllers; package forge.gui.workshop.controllers;
import java.util.List; import java.util.List;
import forge.Command; import forge.Command;
import forge.gui.workshop.views.VWorkshopCatalog; import forge.gui.workshop.views.VWorkshopCatalog;
import forge.gui.framework.ICDoc; import forge.gui.framework.ICDoc;
import forge.gui.toolbox.itemmanager.table.SColumnUtil; import forge.gui.toolbox.itemmanager.views.SColumnUtil;
import forge.gui.toolbox.itemmanager.table.TableColumnInfo; import forge.gui.toolbox.itemmanager.views.TableColumnInfo;
import forge.gui.toolbox.itemmanager.table.SColumnUtil.ColumnName; import forge.gui.toolbox.itemmanager.views.SColumnUtil.ColumnName;
import forge.item.InventoryItem; import forge.item.InventoryItem;
/** /**