mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-17 11:18:01 +00:00
Refactor ItemTable into ItemListView and ItemView base class
Add combo box for selecting view
This commit is contained in:
18
.gitattributes
vendored
18
.gitattributes
vendored
@@ -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
|
||||||
|
|||||||
@@ -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");
|
||||||
|
|
||||||
|
|||||||
@@ -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");
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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");
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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   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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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   {@link forge.gui.ItemManager.ItemTable<T>}
|
|
||||||
* @param model0   {@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
|
|
||||||
@@ -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
|
||||||
@@ -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;
|
||||||
|
|
||||||
@@ -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   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   {@link forge.gui.ItemManager.ItemTable<T>}
|
||||||
|
* @param model0   {@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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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();
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
|
|
||||||
@@ -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.
|
||||||
@@ -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;
|
||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user