mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-18 03:38:01 +00:00
Make selection after adding/removing cards from deck behave as expected and improve performance of adding multiple cards at once
Support Ctrl+F in Current Deck pane Prevent losing multi-selection when using Left/Right arrow keys to switch focus between Catalog and Deck
This commit is contained in:
@@ -19,6 +19,8 @@ The Total stat label has been removed in favor of showing a caption and (# SHOWN
|
|||||||
Checkboxes are now available for each filter type, allowing that filter to be disabled and re-enabled without losing the configuration of that filter (such as chosen sets)
|
Checkboxes are now available for each filter type, allowing that filter to be disabled and re-enabled without losing the configuration of that filter (such as chosen sets)
|
||||||
Adding a filter for formats, sets, and quest worlds now merges into existing filters of that type if possible to apply OR logic, rather than both appearing as separate filters with AND logic applied, likely resulting in no results
|
Adding a filter for formats, sets, and quest worlds now merges into existing filters of that type if possible to apply OR logic, rather than both appearing as separate filters with AND logic applied, likely resulting in no results
|
||||||
Pressing Ctrl+Enter to add a filter for the current search now adds another editable search bar rather than just a label.
|
Pressing Ctrl+Enter to add a filter for the current search now adds another editable search bar rather than just a label.
|
||||||
|
Cards added to deck are now selected, even if multiple are added at once. The performance of adding and removing multiple cards at once has also been improved.
|
||||||
|
When some but not all copies of a selected card are removed from the deck, that card now remains selected in the case of multiple cards being selected.
|
||||||
|
|
||||||
|
|
||||||
- Constructed mode -
|
- Constructed mode -
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ import java.awt.event.KeyEvent;
|
|||||||
import java.awt.event.MouseEvent;
|
import java.awt.event.MouseEvent;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
import javax.swing.JMenu;
|
import javax.swing.JMenu;
|
||||||
import javax.swing.JPopupMenu;
|
import javax.swing.JPopupMenu;
|
||||||
@@ -45,8 +46,6 @@ import javax.swing.event.ListSelectionListener;
|
|||||||
import org.apache.commons.lang3.CharUtils;
|
import org.apache.commons.lang3.CharUtils;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
|
||||||
import com.google.common.primitives.Ints;
|
|
||||||
|
|
||||||
import forge.Command;
|
import forge.Command;
|
||||||
import forge.Singletons;
|
import forge.Singletons;
|
||||||
import forge.deck.DeckBase;
|
import forge.deck.DeckBase;
|
||||||
@@ -70,6 +69,7 @@ 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.views.ItemListView;
|
import forge.gui.toolbox.itemmanager.views.ItemListView;
|
||||||
import forge.item.InventoryItem;
|
import forge.item.InventoryItem;
|
||||||
|
import forge.util.ItemPool;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructs instance of deck editor UI controller, used as a single point of
|
* Constructs instance of deck editor UI controller, used as a single point of
|
||||||
@@ -132,74 +132,75 @@ public enum CDeckEditorUI implements ICDoc, IMenuProvider {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private interface _MoveAction {
|
|
||||||
void move(InventoryItem item, int qty);
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public void incrementDeckQuantity(InventoryItem item, int delta) {
|
public <T extends InventoryItem> void incrementDeckQuantity(T item, int delta) {
|
||||||
if (item == null || delta == 0) { return; }
|
if (item == null || delta == 0) { return; }
|
||||||
|
|
||||||
if (delta > 0) { //add items
|
if (delta > 0) { //add items
|
||||||
int qty = Math.min(delta, ((ItemManager<InventoryItem>)childController.getCatalogManager()).getItemCount(item));
|
int qty = Math.min(delta, ((ItemManager<T>)childController.getCatalogManager()).getItemCount(item));
|
||||||
if (qty == 0) { return; }
|
if (qty == 0) { return; }
|
||||||
childController.addCard(item, false, qty);
|
((ACEditorBase<T, ?>)childController).addItem(item, qty, false);
|
||||||
}
|
}
|
||||||
else { //remove items
|
else { //remove items
|
||||||
int qty = Math.min(-delta, ((ItemManager<InventoryItem>)childController.getDeckManager()).getItemCount(item));
|
int qty = Math.min(-delta, ((ItemManager<T>)childController.getDeckManager()).getItemCount(item));
|
||||||
if (qty == 0) { return; }
|
if (qty == 0) { return; }
|
||||||
childController.removeCard(item, false, qty);
|
((ACEditorBase<T, ?>)childController).removeItem(item, qty, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
CStatistics.SINGLETON_INSTANCE.update();
|
CStatistics.SINGLETON_INSTANCE.update();
|
||||||
CProbabilities.SINGLETON_INSTANCE.update();
|
CProbabilities.SINGLETON_INSTANCE.update();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void moveSelectedCards(ItemManager<InventoryItem> itemManager, _MoveAction moveAction, int maxQty) {
|
private interface _MoveAction {
|
||||||
List<? extends InventoryItem> items = itemManager.getSelectedItems();
|
public <T extends InventoryItem> void move(Iterable<Entry<T, Integer>> items);
|
||||||
if (items.isEmpty()) {
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (InventoryItem item : items) {
|
private <T extends InventoryItem> void moveSelectedItems(ItemManager<T> itemManager, _MoveAction moveAction, int maxQty) {
|
||||||
int toMove = Math.min(maxQty, itemManager.getItemCount(item));
|
if (maxQty == 0) { return; }
|
||||||
moveAction.move(item, toMove);
|
|
||||||
|
ItemPool<T> items = new ItemPool<T>(itemManager.getGenericType());
|
||||||
|
for (T item : itemManager.getSelectedItems()) {
|
||||||
|
int qty = Math.min(maxQty, itemManager.getItemCount(item));
|
||||||
|
if (qty > 0) {
|
||||||
|
items.add(item, qty);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (items.isEmpty()) { return; }
|
||||||
|
|
||||||
|
moveAction.move(items);
|
||||||
CStatistics.SINGLETON_INSTANCE.update();
|
CStatistics.SINGLETON_INSTANCE.update();
|
||||||
CProbabilities.SINGLETON_INSTANCE.update();
|
CProbabilities.SINGLETON_INSTANCE.update();
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public void addSelectedCards(final boolean toAlternate, int number) {
|
public void addSelectedCards(final boolean toAlternate, int number) {
|
||||||
moveSelectedCards((ItemManager<InventoryItem>)childController.getCatalogManager(),
|
moveSelectedItems(childController.getCatalogManager(), new _MoveAction() {
|
||||||
new _MoveAction() {
|
|
||||||
@Override
|
@Override
|
||||||
public void move(InventoryItem item, int qty) {
|
public <T extends InventoryItem> void move(Iterable<Entry<T, Integer>> items) {
|
||||||
childController.addCard(item, toAlternate, qty);
|
((ACEditorBase<T, ?>)childController).addItems(items, toAlternate);
|
||||||
}
|
}
|
||||||
}, number);
|
}, number);
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public void removeSelectedCards(final boolean toAlternate, int number) {
|
public void removeSelectedCards(final boolean toAlternate, int number) {
|
||||||
moveSelectedCards((ItemManager<InventoryItem>)childController.getDeckManager(),
|
moveSelectedItems(childController.getDeckManager(), new _MoveAction() {
|
||||||
new _MoveAction() {
|
|
||||||
@Override
|
@Override
|
||||||
public void move(InventoryItem item, int qty) {
|
public <T extends InventoryItem> void move(Iterable<Entry<T, Integer>> items) {
|
||||||
childController.removeCard(item, toAlternate, qty);
|
((ACEditorBase<T, ?>)childController).removeItems(items, toAlternate);
|
||||||
}
|
}
|
||||||
}, number);
|
}, number);
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public void removeAllCards(final boolean toAlternate) {
|
public void removeAllCards(final boolean toAlternate) {
|
||||||
ItemManager<InventoryItem> v = (ItemManager<InventoryItem>)childController.getDeckManager();
|
ItemManager<?> v = childController.getDeckManager();
|
||||||
v.getTable().selectAll();
|
v.getTable().selectAll();
|
||||||
moveSelectedCards(v, new _MoveAction() {
|
moveSelectedItems(v, new _MoveAction() {
|
||||||
@Override
|
@Override
|
||||||
public void move(InventoryItem item, int qty) {
|
public <T extends InventoryItem> void move(Iterable<Entry<T, Integer>> items) {
|
||||||
childController.removeCard(item, toAlternate, qty);
|
((ACEditorBase<T, ?>)childController).removeItems(items, toAlternate);
|
||||||
}
|
}
|
||||||
}, Integer.MAX_VALUE);
|
}, Integer.MAX_VALUE);
|
||||||
}
|
}
|
||||||
@@ -211,31 +212,32 @@ 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 ItemListView<?> _nextTable;
|
private final ItemManager<?> _itemManager;
|
||||||
|
private final ItemManager<?> _nextItemManager;
|
||||||
private final _MoveCard _onMove;
|
private final _MoveCard _onMove;
|
||||||
private final int _numSelected;
|
private final JPopupMenu _menu = new JPopupMenu("ItemViewContextMenu");
|
||||||
private final JPopupMenu _menu = new JPopupMenu("TableContextMenu");
|
|
||||||
private boolean _showTextFilterItem = false;
|
|
||||||
|
|
||||||
public _ContextMenuBuilder(MouseEvent e, ItemListView<?> table, ItemListView<?> nextTable, _MoveCard onMove) {
|
public _ContextMenuBuilder(MouseEvent e, ItemManager<?> itemManager, ItemManager<?> nextItemManager, _MoveCard onMove) {
|
||||||
_e = e;
|
_e = e;
|
||||||
_nextTable = nextTable;
|
_itemManager = itemManager;
|
||||||
|
_nextItemManager = nextItemManager;
|
||||||
_onMove = onMove;
|
_onMove = onMove;
|
||||||
|
|
||||||
// ensure the table has focus
|
//ensure the item manager has focus
|
||||||
if (!table.hasFocus()) {
|
itemManager.focus();
|
||||||
table.focus();
|
|
||||||
}
|
|
||||||
|
|
||||||
// if item under the cursor is not selected, select it
|
//if item under the cursor is not selected, select it
|
||||||
int index = table.getIndexAtPoint(e.getPoint());
|
int index = itemManager.getTable().getIndexAtPoint(e.getPoint());
|
||||||
int[] selectedIndices = table.getSelectedIndices();
|
boolean needSelection = true;
|
||||||
if (!Ints.contains(selectedIndices, index)) {
|
for (Integer selectedIndex : itemManager.getSelectedIndices()) {
|
||||||
table.setSelectedIndex(index);
|
if (selectedIndex == index) {
|
||||||
|
needSelection = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (needSelection) {
|
||||||
|
itemManager.setSelectedIndex(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
// record selection count
|
|
||||||
_numSelected = selectedIndices.length;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void show() {
|
private void show() {
|
||||||
@@ -243,31 +245,29 @@ 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.focus(); }
|
@Override public void run() { _nextItemManager.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.focus(); }
|
@Override public void run() { _nextItemManager.focus(); }
|
||||||
});
|
});
|
||||||
|
|
||||||
if (_showTextFilterItem) {
|
|
||||||
GuiUtils.addMenuItem(_menu, "Jump to text filter",
|
GuiUtils.addMenuItem(_menu, "Jump to text filter",
|
||||||
KeyStroke.getKeyStroke(KeyEvent.VK_F, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()),
|
KeyStroke.getKeyStroke(KeyEvent.VK_F, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()),
|
||||||
new Runnable() {
|
new Runnable() {
|
||||||
@Override public void run() {
|
@Override public void run() {
|
||||||
VCardCatalog.SINGLETON_INSTANCE.getItemManager().focusSearch();
|
_itemManager.focusSearch();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
|
||||||
|
|
||||||
_menu.show(_e.getComponent(), _e.getX(), _e.getY());
|
_menu.show(_e.getComponent(), _e.getX(), _e.getY());
|
||||||
}
|
}
|
||||||
|
|
||||||
private String _doNoun(String nounSingular, String nounPlural) {
|
private String _doNoun(String nounSingular, String nounPlural) {
|
||||||
if (1 == _numSelected) {
|
int numSelected = _itemManager.getSelectionCount();
|
||||||
|
if (1 == numSelected) {
|
||||||
return nounSingular;
|
return nounSingular;
|
||||||
}
|
}
|
||||||
return String.format("%d %s", _numSelected, nounPlural);
|
return String.format("%d %s", numSelected, nounPlural);
|
||||||
}
|
}
|
||||||
|
|
||||||
private String _doDest(String destination) {
|
private String _doDest(String destination) {
|
||||||
@@ -314,11 +314,6 @@ public enum CDeckEditorUI implements ICDoc, IMenuProvider {
|
|||||||
@Override public void run() { _onMove.moveCard(true, 4); }
|
@Override public void run() { _onMove.moveCard(true, 4); }
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void addTextFilterItem() {
|
|
||||||
_showTextFilterItem = true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -343,12 +338,15 @@ public enum CDeckEditorUI implements ICDoc, IMenuProvider {
|
|||||||
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.focus();
|
deckTable.focus();
|
||||||
} else if (KeyEvent.VK_F == e.getKeyCode()) {
|
e.consume(); //prevent losing selection
|
||||||
|
}
|
||||||
|
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()) {
|
||||||
VCardCatalog.SINGLETON_INSTANCE.getItemManager().focusSearch();
|
catView.focusSearch();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -359,8 +357,16 @@ public enum CDeckEditorUI implements ICDoc, IMenuProvider {
|
|||||||
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.focus();
|
catTable.focus();
|
||||||
|
e.consume(); //prevent losing selection
|
||||||
|
}
|
||||||
|
else if (KeyEvent.VK_F == e.getKeyCode()) {
|
||||||
|
// let ctrl/cmd-F set focus to the text filter box
|
||||||
|
if (e.isControlDown() || e.isMetaDown()) {
|
||||||
|
deckView.focusSearch();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -387,7 +393,7 @@ public enum CDeckEditorUI implements ICDoc, IMenuProvider {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onRightClick(MouseEvent e) {
|
public void onRightClick(MouseEvent e) {
|
||||||
_ContextMenuBuilder cmb = new _ContextMenuBuilder(e, catTable, deckTable, onAdd);
|
_ContextMenuBuilder cmb = new _ContextMenuBuilder(e, catView, deckView, onAdd);
|
||||||
childController.buildAddContextMenu(cmb);
|
childController.buildAddContextMenu(cmb);
|
||||||
cmb.show();
|
cmb.show();
|
||||||
}
|
}
|
||||||
@@ -402,7 +408,7 @@ public enum CDeckEditorUI implements ICDoc, IMenuProvider {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onRightClick(MouseEvent e) {
|
public void onRightClick(MouseEvent e) {
|
||||||
_ContextMenuBuilder cmb = new _ContextMenuBuilder(e, deckTable, catTable, onRemove);
|
_ContextMenuBuilder cmb = new _ContextMenuBuilder(e, deckView, catView, onRemove);
|
||||||
childController.buildRemoveContextMenu(cmb);
|
childController.buildRemoveContextMenu(cmb);
|
||||||
cmb.show();
|
cmb.show();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,6 +17,8 @@
|
|||||||
*/
|
*/
|
||||||
package forge.gui.deckeditor.controllers;
|
package forge.gui.deckeditor.controllers;
|
||||||
|
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
import javax.swing.SwingUtilities;
|
import javax.swing.SwingUtilities;
|
||||||
|
|
||||||
import forge.Command;
|
import forge.Command;
|
||||||
@@ -31,6 +33,7 @@ import forge.gui.toolbox.FLabel;
|
|||||||
import forge.gui.toolbox.FSkin;
|
import forge.gui.toolbox.FSkin;
|
||||||
import forge.gui.toolbox.itemmanager.ItemManager;
|
import forge.gui.toolbox.itemmanager.ItemManager;
|
||||||
import forge.item.InventoryItem;
|
import forge.item.InventoryItem;
|
||||||
|
import forge.util.ItemPool;
|
||||||
import forge.view.FView;
|
import forge.view.FView;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -60,7 +63,6 @@ public abstract class ACEditorBase<TItem extends InventoryItem, TModel extends D
|
|||||||
*/
|
*/
|
||||||
public void addMoveItems (String verb, String nounSingular, String nounPlural, String destination);
|
public void addMoveItems (String verb, String nounSingular, String nounPlural, String destination);
|
||||||
public void addMoveAlternateItems (String verb, String nounSingular, String nounPlural, String destination);
|
public void addMoveAlternateItems (String verb, String nounSingular, String nounPlural, String destination);
|
||||||
public void addTextFilterItem ();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean listenersHooked;
|
public boolean listenersHooked;
|
||||||
@@ -111,15 +113,54 @@ public abstract class ACEditorBase<TItem extends InventoryItem, TModel extends D
|
|||||||
return this.screen;
|
return this.screen;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public final void addItem(TItem item) {
|
||||||
* Operation to add one of selected card to current deck.
|
onAddItems(createPoolForItem(item, 1), false);
|
||||||
*/
|
}
|
||||||
public abstract void addCard(InventoryItem item, boolean toAlternate, int qty);
|
public final void addItem(TItem item, int qty) {
|
||||||
|
onAddItems(createPoolForItem(item, qty), false);
|
||||||
|
}
|
||||||
|
public final void addItem(TItem item, int qty, boolean toAlternate) {
|
||||||
|
onAddItems(createPoolForItem(item, qty), toAlternate);
|
||||||
|
}
|
||||||
|
|
||||||
|
public final void removeItem(TItem item) {
|
||||||
|
onRemoveItems(createPoolForItem(item, 1), false);
|
||||||
|
}
|
||||||
|
public final void removeItem(TItem item, int qty) {
|
||||||
|
onRemoveItems(createPoolForItem(item, qty), false);
|
||||||
|
}
|
||||||
|
public final void removeItem(TItem item, int qty, boolean toAlternate) {
|
||||||
|
onRemoveItems(createPoolForItem(item, qty), toAlternate);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
private ItemPool<TItem> createPoolForItem(final TItem item, final int qty) {
|
||||||
|
if (item == null || qty <= 0) { return null; }
|
||||||
|
|
||||||
|
ItemPool<TItem> pool = new ItemPool<TItem>((Class<TItem>)item.getClass());
|
||||||
|
pool.add(item, qty);
|
||||||
|
return pool;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final void addItems(Iterable<Entry<TItem, Integer>> items, boolean toAlternate) {
|
||||||
|
if (items == null || !items.iterator().hasNext()) { return; } //do nothing if no items
|
||||||
|
onAddItems(items, toAlternate);
|
||||||
|
}
|
||||||
|
|
||||||
|
public final void removeItems(Iterable<Entry<TItem, Integer>> items, boolean toAlternate) {
|
||||||
|
if (items == null || !items.iterator().hasNext()) { return; } //do nothing if no items
|
||||||
|
onRemoveItems(items, toAlternate);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Operation to remove one of selected card from current deck.
|
* Operation to add selected items to current deck.
|
||||||
*/
|
*/
|
||||||
public abstract void removeCard(InventoryItem item, boolean toAlternate, int qty);
|
protected abstract void onAddItems(Iterable<Entry<TItem, Integer>> items, boolean toAlternate);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Operation to remove selected item from current deck.
|
||||||
|
*/
|
||||||
|
protected abstract void onRemoveItems(Iterable<Entry<TItem, Integer>> items, boolean toAlternate);
|
||||||
|
|
||||||
public abstract void buildAddContextMenu(ContextMenuBuilder cmb);
|
public abstract void buildAddContextMenu(ContextMenuBuilder cmb);
|
||||||
public abstract void buildRemoveContextMenu(ContextMenuBuilder cmb);
|
public abstract void buildRemoveContextMenu(ContextMenuBuilder cmb);
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ package forge.gui.deckeditor.controllers;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
import com.google.common.base.Predicates;
|
import com.google.common.base.Predicates;
|
||||||
import com.google.common.base.Supplier;
|
import com.google.common.base.Supplier;
|
||||||
@@ -101,51 +101,53 @@ public final class CEditorCommander extends ACEditorBase<PaperCard, Deck> {
|
|||||||
//=========== Overridden from ACEditorBase
|
//=========== Overridden from ACEditorBase
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see forge.gui.deckeditor.ACEditorBase#addCard()
|
* @see forge.gui.deckeditor.ACEditorBase#onAddItems()
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void addCard(InventoryItem item, boolean toAlternate, int qty) {
|
protected void onAddItems(Iterable<Entry<PaperCard, Integer>> items, boolean toAlternate) {
|
||||||
if ((item == null) || !(item instanceof PaperCard) || toAlternate) {
|
if (toAlternate) { return; }
|
||||||
return;
|
|
||||||
}
|
|
||||||
List<String> limitExceptions = Arrays.asList(new String[]{"Relentless Rats", "Shadowborn Apostle"});
|
List<String> limitExceptions = Arrays.asList(new String[]{"Relentless Rats", "Shadowborn Apostle"});
|
||||||
|
|
||||||
if((controller.getModel().getMain().contains((PaperCard)item)
|
List<Entry<PaperCard, Integer>> itemList = new ArrayList<Entry<PaperCard, Integer>>();
|
||||||
|| controller.getModel().getOrCreate(DeckSection.Sideboard).contains((PaperCard)item)
|
|
||||||
|| controller.getModel().getOrCreate(DeckSection.Commander).contains((PaperCard)item))
|
for (Entry<PaperCard, Integer> item : items) {
|
||||||
&& !(((PaperCard)item).getRules().getType().isBasic() || limitExceptions.contains(item.getName()))) {
|
PaperCard card = item.getKey();
|
||||||
return;
|
if ((controller.getModel().getMain().contains(card)
|
||||||
|
|| controller.getModel().getOrCreate(DeckSection.Sideboard).contains(card)
|
||||||
|
|| controller.getModel().getOrCreate(DeckSection.Commander).contains(card))
|
||||||
|
&& !(card.getRules().getType().isBasic() || limitExceptions.contains(card.getName()))) {
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
itemList.add(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (itemList.isEmpty()) { return; }
|
||||||
|
|
||||||
if (sectionMode == DeckSection.Commander) {
|
if (sectionMode == DeckSection.Commander) {
|
||||||
for(Map.Entry<PaperCard, Integer> cp : getDeckManager().getPool()) {
|
this.getDeckManager().removeItems(getDeckManager().getPool());
|
||||||
getDeckManager().removeItem(cp.getKey(), cp.getValue());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
final PaperCard card = (PaperCard) item;
|
this.getDeckManager().addItems(itemList);
|
||||||
this.getDeckManager().addItem(card, qty);
|
this.getCatalogManager().selectItemEntrys(itemList); //just select all removed cards in Catalog
|
||||||
this.controller.notifyModelChanged();
|
this.controller.notifyModelChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see forge.gui.deckeditor.ACEditorBase#removeCard()
|
* @see forge.gui.deckeditor.ACEditorBase#onRemoveItems()
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void removeCard(InventoryItem item, boolean toAlternate, int qty) {
|
protected void onRemoveItems(Iterable<Entry<PaperCard, Integer>> items, boolean toAlternate) {
|
||||||
if ((item == null) || !(item instanceof PaperCard) || toAlternate) {
|
if (toAlternate) { return; }
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
final PaperCard card = (PaperCard) item;
|
this.getDeckManager().removeItems(items);
|
||||||
this.getDeckManager().removeItem(card, qty);
|
this.getCatalogManager().selectItemEntrys(items); //just select all removed cards in Catalog
|
||||||
this.controller.notifyModelChanged();
|
this.controller.notifyModelChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void buildAddContextMenu(ContextMenuBuilder cmb) {
|
public void buildAddContextMenu(ContextMenuBuilder cmb) {
|
||||||
cmb.addMoveItems("Move", "card", "cards", "to deck");
|
cmb.addMoveItems("Move", "card", "cards", "to deck");
|
||||||
cmb.addTextFilterItem();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ package forge.gui.deckeditor.controllers;
|
|||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
import com.google.common.base.Predicates;
|
import com.google.common.base.Predicates;
|
||||||
import com.google.common.base.Supplier;
|
import com.google.common.base.Supplier;
|
||||||
@@ -104,54 +104,55 @@ public final class CEditorConstructed extends ACEditorBase<PaperCard, Deck> {
|
|||||||
//=========== Overridden from ACEditorBase
|
//=========== Overridden from ACEditorBase
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see forge.gui.deckeditor.ACEditorBase#addCard()
|
* @see forge.gui.deckeditor.ACEditorBase#onAddItems()
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void addCard(InventoryItem item, boolean toAlternate, int qty) {
|
protected void onAddItems(Iterable<Entry<PaperCard, Integer>> items, boolean toAlternate) {
|
||||||
if ((item == null) || !(item instanceof PaperCard)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sectionMode == DeckSection.Avatar) {
|
if (sectionMode == DeckSection.Avatar) {
|
||||||
for(Map.Entry<PaperCard, Integer> cp : getDeckManager().getPool()) {
|
getDeckManager().removeItems(getDeckManager().getPool());
|
||||||
getDeckManager().removeItem(cp.getKey(), cp.getValue());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
final PaperCard card = (PaperCard) item;
|
|
||||||
if (toAlternate) {
|
if (toAlternate) {
|
||||||
if (sectionMode != DeckSection.Sideboard) {
|
if (sectionMode != DeckSection.Sideboard) {
|
||||||
controller.getModel().getOrCreate(DeckSection.Sideboard).add(card, qty);
|
controller.getModel().getOrCreate(DeckSection.Sideboard).addAll(items);
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
getDeckManager().addItem(card, qty);
|
|
||||||
}
|
}
|
||||||
// if not in sideboard mode, "remove" 0 cards in order to re-show the selected card
|
else {
|
||||||
this.getCatalogManager().removeItem(card, sectionMode == DeckSection.Sideboard ? qty : 0);
|
getDeckManager().addItems(items);
|
||||||
|
}
|
||||||
|
if (sectionMode == DeckSection.Sideboard) {
|
||||||
|
this.getCatalogManager().removeItems(items);
|
||||||
|
}
|
||||||
|
else { //if not in sideboard mode, just select all added cards in Catalog
|
||||||
|
List<PaperCard> cards = new ArrayList<PaperCard>();
|
||||||
|
for (Entry<PaperCard, Integer> itemEntry : items) {
|
||||||
|
cards.add(itemEntry.getKey());
|
||||||
|
}
|
||||||
|
this.getCatalogManager().setSelectedItems(cards);
|
||||||
|
}
|
||||||
this.controller.notifyModelChanged();
|
this.controller.notifyModelChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see forge.gui.deckeditor.ACEditorBase#removeCard()
|
* @see forge.gui.deckeditor.ACEditorBase#onRemoveItems()
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void removeCard(InventoryItem item, boolean toAlternate, int qty) {
|
protected void onRemoveItems(Iterable<Entry<PaperCard, Integer>> items, boolean toAlternate) {
|
||||||
if ((item == null) || !(item instanceof PaperCard)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
final PaperCard card = (PaperCard) item;
|
|
||||||
if (toAlternate) {
|
if (toAlternate) {
|
||||||
if (sectionMode != DeckSection.Sideboard) {
|
if (sectionMode != DeckSection.Sideboard) {
|
||||||
controller.getModel().getOrCreate(DeckSection.Sideboard).add(card, qty);
|
controller.getModel().getOrCreate(DeckSection.Sideboard).addAll(items);
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
// "added" to library, but library will be recalculated when it is shown again
|
// "added" to library, but library will be recalculated when it is shown again
|
||||||
}
|
}
|
||||||
} else if (sectionMode == DeckSection.Sideboard) {
|
|
||||||
this.getCatalogManager().addItem(card, qty);
|
|
||||||
}
|
}
|
||||||
this.getDeckManager().removeItem(card, qty);
|
else if (sectionMode == DeckSection.Sideboard) {
|
||||||
|
this.getCatalogManager().addItems(items);
|
||||||
|
}
|
||||||
|
else { //if not in sideboard mode, just select all removed cards in Catalog
|
||||||
|
this.getCatalogManager().selectItemEntrys(items);
|
||||||
|
}
|
||||||
|
this.getDeckManager().removeItems(items);
|
||||||
this.controller.notifyModelChanged();
|
this.controller.notifyModelChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -159,7 +160,6 @@ public final class CEditorConstructed extends ACEditorBase<PaperCard, Deck> {
|
|||||||
public void buildAddContextMenu(ContextMenuBuilder cmb) {
|
public void buildAddContextMenu(ContextMenuBuilder cmb) {
|
||||||
cmb.addMoveItems(sectionMode == DeckSection.Sideboard ? "Move" : "Add", "card", "cards", sectionMode == DeckSection.Sideboard ? "to sideboard" : "to deck");
|
cmb.addMoveItems(sectionMode == DeckSection.Sideboard ? "Move" : "Add", "card", "cards", sectionMode == DeckSection.Sideboard ? "to sideboard" : "to deck");
|
||||||
cmb.addMoveAlternateItems(sectionMode == DeckSection.Sideboard ? "Remove" : "Add", "card", "cards", sectionMode == DeckSection.Sideboard ? "from deck" : "to sideboard");
|
cmb.addMoveAlternateItems(sectionMode == DeckSection.Sideboard ? "Remove" : "Add", "card", "cards", sectionMode == DeckSection.Sideboard ? "from deck" : "to sideboard");
|
||||||
cmb.addTextFilterItem();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -17,6 +17,8 @@
|
|||||||
*/
|
*/
|
||||||
package forge.gui.deckeditor.controllers;
|
package forge.gui.deckeditor.controllers;
|
||||||
|
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
import javax.swing.JOptionPane;
|
import javax.swing.JOptionPane;
|
||||||
|
|
||||||
import forge.Singletons;
|
import forge.Singletons;
|
||||||
@@ -37,7 +39,6 @@ import forge.gui.home.sanctioned.CSubmenuDraft;
|
|||||||
import forge.gui.toolbox.itemmanager.CardManager;
|
import forge.gui.toolbox.itemmanager.CardManager;
|
||||||
import forge.gui.toolbox.itemmanager.views.SColumnUtil;
|
import forge.gui.toolbox.itemmanager.views.SColumnUtil;
|
||||||
import forge.item.PaperCard;
|
import forge.item.PaperCard;
|
||||||
import forge.item.InventoryItem;
|
|
||||||
import forge.limited.BoosterDraft;
|
import forge.limited.BoosterDraft;
|
||||||
import forge.limited.IBoosterDraft;
|
import forge.limited.IBoosterDraft;
|
||||||
import forge.util.ItemPoolView;
|
import forge.util.ItemPoolView;
|
||||||
@@ -86,17 +87,14 @@ public class CEditorDraftingProcess extends ACEditorBase<PaperCard, DeckGroup> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see forge.gui.deckeditor.ACEditorBase#addCard()
|
* @see forge.gui.deckeditor.ACEditorBase#onAddItems()
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void addCard(InventoryItem item, boolean toAlternate, int qty) {
|
protected void onAddItems(Iterable<Entry<PaperCard, Integer>> items, boolean toAlternate) {
|
||||||
if ((item == null) || !(item instanceof PaperCard) || toAlternate) {
|
if (toAlternate) { return; }
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
final PaperCard card = (PaperCard) item;
|
|
||||||
|
|
||||||
// can only draft one at a time, regardless of the requested quantity
|
// can only draft one at a time, regardless of the requested quantity
|
||||||
|
PaperCard card = items.iterator().next().getKey();
|
||||||
this.getDeckManager().addItem(card, 1);
|
this.getDeckManager().addItem(card, 1);
|
||||||
|
|
||||||
// get next booster pack
|
// get next booster pack
|
||||||
@@ -104,23 +102,23 @@ public class CEditorDraftingProcess extends ACEditorBase<PaperCard, DeckGroup> {
|
|||||||
|
|
||||||
if (this.boosterDraft.hasNextChoice()) {
|
if (this.boosterDraft.hasNextChoice()) {
|
||||||
this.showChoices(this.boosterDraft.nextChoice());
|
this.showChoices(this.boosterDraft.nextChoice());
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
this.boosterDraft.finishedDrafting();
|
this.boosterDraft.finishedDrafting();
|
||||||
this.saveDraft();
|
this.saveDraft();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see forge.gui.deckeditor.ACEditorBase#removeCard()
|
* @see forge.gui.deckeditor.ACEditorBase#onRemoveItems()
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void removeCard(InventoryItem item, boolean toAlternate, int qty) {
|
protected void onRemoveItems(Iterable<Entry<PaperCard, Integer>> items, boolean toAlternate) {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void buildAddContextMenu(ContextMenuBuilder cmb) {
|
public void buildAddContextMenu(ContextMenuBuilder cmb) {
|
||||||
cmb.addMoveItems("Draft", "card", "cards", null);
|
cmb.addMoveItems("Draft", "card", "cards", null);
|
||||||
cmb.addTextFilterItem();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -141,7 +139,7 @@ public class CEditorDraftingProcess extends ACEditorBase<PaperCard, DeckGroup> {
|
|||||||
VCardCatalog.SINGLETON_INSTANCE.getLblTitle().setText("Select a card from pack number "
|
VCardCatalog.SINGLETON_INSTANCE.getLblTitle().setText("Select a card from pack number "
|
||||||
+ (((BoosterDraft) boosterDraft).getCurrentBoosterIndex() + 1) + ".");
|
+ (((BoosterDraft) boosterDraft).getCurrentBoosterIndex() + 1) + ".");
|
||||||
this.getCatalogManager().setPool(list);
|
this.getCatalogManager().setPool(list);
|
||||||
this.getCatalogManager().getTable().fixSelection(0);
|
this.getCatalogManager().getTable().setSelectedIndex(0);
|
||||||
} // showChoices()
|
} // showChoices()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -17,6 +17,8 @@
|
|||||||
*/
|
*/
|
||||||
package forge.gui.deckeditor.controllers;
|
package forge.gui.deckeditor.controllers;
|
||||||
|
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
import com.google.common.base.Supplier;
|
import com.google.common.base.Supplier;
|
||||||
|
|
||||||
import forge.deck.Deck;
|
import forge.deck.Deck;
|
||||||
@@ -35,7 +37,6 @@ import forge.gui.toolbox.itemmanager.CardManager;
|
|||||||
import forge.gui.toolbox.itemmanager.SItemManagerUtil;
|
import forge.gui.toolbox.itemmanager.SItemManagerUtil;
|
||||||
import forge.gui.toolbox.itemmanager.views.SColumnUtil;
|
import forge.gui.toolbox.itemmanager.views.SColumnUtil;
|
||||||
import forge.item.PaperCard;
|
import forge.item.PaperCard;
|
||||||
import forge.item.InventoryItem;
|
|
||||||
import forge.util.storage.IStorage;
|
import forge.util.storage.IStorage;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -91,41 +92,34 @@ public final class CEditorLimited extends ACEditorBase<PaperCard, DeckGroup> {
|
|||||||
//========== Overridden from ACEditorBase
|
//========== Overridden from ACEditorBase
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see forge.gui.deckeditor.ACEditorBase#addCard()
|
* @see forge.gui.deckeditor.ACEditorBase#onAddItems()
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void addCard(InventoryItem item, boolean toAlternate, int qty) {
|
protected void onAddItems(Iterable<Entry<PaperCard, Integer>> items, boolean toAlternate) {
|
||||||
if ((item == null) || !(item instanceof PaperCard) || toAlternate) {
|
if (toAlternate) { return; }
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// update view
|
// update view
|
||||||
final PaperCard card = (PaperCard) item;
|
this.getDeckManager().addItems(items);
|
||||||
this.getDeckManager().addItem(card, qty);
|
this.getCatalogManager().removeItems(items);
|
||||||
this.getCatalogManager().removeItem(card, qty);
|
|
||||||
this.getDeckController().notifyModelChanged();
|
this.getDeckController().notifyModelChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see forge.gui.deckeditor.ACEditorBase#removeCard()
|
* @see forge.gui.deckeditor.ACEditorBase#onRemoveItems()
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void removeCard(InventoryItem item, boolean toAlternate, int qty) {
|
protected void onRemoveItems(Iterable<Entry<PaperCard, Integer>> items, boolean toAlternate) {
|
||||||
if ((item == null) || !(item instanceof PaperCard) || toAlternate) {
|
if (toAlternate) { return; }
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// update view
|
// update view
|
||||||
final PaperCard card = (PaperCard) item;
|
this.getCatalogManager().addItems(items);
|
||||||
this.getCatalogManager().addItem(card, qty);
|
this.getDeckManager().removeItems(items);
|
||||||
this.getDeckManager().removeItem(card, qty);
|
|
||||||
this.getDeckController().notifyModelChanged();
|
this.getDeckController().notifyModelChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void buildAddContextMenu(ContextMenuBuilder cmb) {
|
public void buildAddContextMenu(ContextMenuBuilder cmb) {
|
||||||
cmb.addMoveItems("Move", "card", "cards", "to deck");
|
cmb.addMoveItems("Move", "card", "cards", "to deck");
|
||||||
cmb.addTextFilterItem();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -143,46 +143,38 @@ public final class CEditorQuest extends ACEditorBase<PaperCard, Deck> {
|
|||||||
//=========== Overridden from ACEditorBase
|
//=========== Overridden from ACEditorBase
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see forge.gui.deckeditor.ACEditorBase#addCard()
|
* @see forge.gui.deckeditor.ACEditorBase#onAddItems()
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void addCard(InventoryItem item, boolean toAlternate, int qty) {
|
protected void onAddItems(Iterable<Entry<PaperCard, Integer>> items, boolean toAlternate) {
|
||||||
if ((item == null) || !(item instanceof PaperCard)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
final PaperCard card = (PaperCard) item;
|
|
||||||
if (toAlternate) {
|
if (toAlternate) {
|
||||||
// if we're in sideboard mode, the library will get adjusted properly when we call resetTables()
|
// if we're in sideboard mode, the library will get adjusted properly when we call resetTables()
|
||||||
if (!sideboardMode) {
|
if (!sideboardMode) {
|
||||||
controller.getModel().getOrCreate(DeckSection.Sideboard).add(card, qty);
|
controller.getModel().getOrCreate(DeckSection.Sideboard).addAll(items);
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
getDeckManager().addItem(card, qty);
|
|
||||||
}
|
}
|
||||||
this.getCatalogManager().removeItem(card, qty);
|
else {
|
||||||
|
getDeckManager().addItems(items);
|
||||||
|
}
|
||||||
|
this.getCatalogManager().removeItems(items);
|
||||||
this.controller.notifyModelChanged();
|
this.controller.notifyModelChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see forge.gui.deckeditor.ACEditorBase#removeCard()
|
* @see forge.gui.deckeditor.ACEditorBase#onRemoveItems()
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void removeCard(InventoryItem item, boolean toAlternate, int qty) {
|
protected void onRemoveItems(Iterable<Entry<PaperCard, Integer>> items, boolean toAlternate) {
|
||||||
if ((item == null) || !(item instanceof PaperCard)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
final PaperCard card = (PaperCard) item;
|
|
||||||
if (toAlternate) {
|
if (toAlternate) {
|
||||||
// if we're in sideboard mode, the library will get adjusted properly when we call resetTables()
|
// if we're in sideboard mode, the library will get adjusted properly when we call resetTables()
|
||||||
if (!sideboardMode) {
|
if (!sideboardMode) {
|
||||||
controller.getModel().getOrCreate(DeckSection.Sideboard).add(card, qty);
|
controller.getModel().getOrCreate(DeckSection.Sideboard).addAll(items);
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
this.getCatalogManager().addItem(card, qty);
|
|
||||||
}
|
}
|
||||||
this.getDeckManager().removeItem(card, qty);
|
else {
|
||||||
|
this.getCatalogManager().addItems(items);
|
||||||
|
}
|
||||||
|
this.getDeckManager().removeItems(items);
|
||||||
this.controller.notifyModelChanged();
|
this.controller.notifyModelChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -190,7 +182,6 @@ public final class CEditorQuest extends ACEditorBase<PaperCard, Deck> {
|
|||||||
public void buildAddContextMenu(ContextMenuBuilder cmb) {
|
public void buildAddContextMenu(ContextMenuBuilder cmb) {
|
||||||
cmb.addMoveItems(sideboardMode ? "Move" : "Add", "card", "cards", sideboardMode ? "to sideboard" : "to deck");
|
cmb.addMoveItems(sideboardMode ? "Move" : "Add", "card", "cards", sideboardMode ? "to sideboard" : "to deck");
|
||||||
cmb.addMoveAlternateItems(sideboardMode ? "Remove" : "Add", "card", "cards", sideboardMode ? "from deck" : "to sideboard");
|
cmb.addMoveAlternateItems(sideboardMode ? "Remove" : "Add", "card", "cards", sideboardMode ? "from deck" : "to sideboard");
|
||||||
cmb.addTextFilterItem();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ package forge.gui.deckeditor.controllers;
|
|||||||
|
|
||||||
import java.text.DecimalFormat;
|
import java.text.DecimalFormat;
|
||||||
import java.text.NumberFormat;
|
import java.text.NumberFormat;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@@ -289,82 +290,102 @@ public final class CEditorQuestCardShop extends ACEditorBase<InventoryItem, Deck
|
|||||||
//=========== Overridden from ACEditorBase
|
//=========== Overridden from ACEditorBase
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see forge.gui.deckeditor.ACEditorBase#addCard()
|
* @see forge.gui.deckeditor.ACEditorBase#onAddItems()
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void addCard(InventoryItem item, boolean toAlternate, int qty) {
|
protected void onAddItems(Iterable<Entry<InventoryItem, Integer>> items, boolean toAlternate) {
|
||||||
// disallow "buying" cards while showing the full catalog
|
// disallow "buying" cards while showing the full catalog
|
||||||
if (item == null || showingFullCatalog || toAlternate) {
|
if (showingFullCatalog || toAlternate) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ItemPool<InventoryItem> itemsToAdd = new ItemPool<InventoryItem>(InventoryItem.class);
|
||||||
|
List<Entry<InventoryItem, Integer>> itemsToRemove = new ArrayList<Entry<InventoryItem, Integer>>();
|
||||||
|
|
||||||
|
for (Entry<InventoryItem, Integer> itemEntry : items) {
|
||||||
|
final InventoryItem item = itemEntry.getKey();
|
||||||
|
final int qty = itemEntry.getValue();
|
||||||
final int value = this.getCardValue(item);
|
final int value = this.getCardValue(item);
|
||||||
|
|
||||||
if (value > this.questData.getAssets().getCredits()) {
|
if (value > this.questData.getAssets().getCredits()) {
|
||||||
JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), "Not enough credits!");
|
JOptionPane.showMessageDialog(JOptionPane.getRootFrame(),
|
||||||
return;
|
"Not enough credits to purchase " + (qty == 1 ? "" : qty + " copies of ") + item.getName() + ".");
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item instanceof PaperCard) {
|
if (item instanceof PaperCard) {
|
||||||
final PaperCard card = (PaperCard) item;
|
this.questData.getCards().buyCard((PaperCard) item, qty, value);
|
||||||
this.getDeckManager().addItem(card, qty);
|
itemsToAdd.add(item, qty);
|
||||||
this.questData.getCards().buyCard(card, qty, value);
|
}
|
||||||
|
else if (item instanceof SealedProduct) {
|
||||||
} else if (item instanceof SealedProduct) {
|
for (int i = 0; i < qty; i++) {
|
||||||
for (int i = 0; qty > i; ++i) {
|
|
||||||
SealedProduct booster = null;
|
SealedProduct booster = null;
|
||||||
if (item instanceof BoosterPack) {
|
if (item instanceof BoosterPack) {
|
||||||
booster = (BoosterPack) ((BoosterPack) item).clone();
|
booster = (BoosterPack) ((BoosterPack) item).clone();
|
||||||
} else if (item instanceof TournamentPack) {
|
}
|
||||||
|
else if (item instanceof TournamentPack) {
|
||||||
booster = (TournamentPack) ((TournamentPack) item).clone();
|
booster = (TournamentPack) ((TournamentPack) item).clone();
|
||||||
} else if (item instanceof FatPack) {
|
}
|
||||||
|
else if (item instanceof FatPack) {
|
||||||
booster = (FatPack) ((FatPack) item).clone();
|
booster = (FatPack) ((FatPack) item).clone();
|
||||||
}
|
}
|
||||||
this.questData.getCards().buyPack(booster, value);
|
this.questData.getCards().buyPack(booster, value);
|
||||||
final List<PaperCard> newCards = booster.getCards();
|
final List<PaperCard> newCards = booster.getCards();
|
||||||
|
|
||||||
ItemPool<InventoryItem> newInventory = new ItemPool<InventoryItem>(InventoryItem.class);
|
itemsToAdd.addAllFlat(newCards);
|
||||||
newInventory.addAllFlat(newCards);
|
|
||||||
getDeckManager().addItems(newInventory);
|
|
||||||
final CardListViewer c = new CardListViewer(booster.getName(), "You have found the following cards inside:", newCards);
|
final CardListViewer c = new CardListViewer(booster.getName(), "You have found the following cards inside:", newCards);
|
||||||
c.show();
|
c.show();
|
||||||
}
|
}
|
||||||
} else if (item instanceof PreconDeck) {
|
|
||||||
final PreconDeck deck = (PreconDeck) item;
|
|
||||||
this.questData.getCards().buyPreconDeck(deck, value);
|
|
||||||
final ItemPool<InventoryItem> newInventory =
|
|
||||||
ItemPool.createFrom(deck.getDeck().getMain(), InventoryItem.class);
|
|
||||||
for (int i = 0; qty > i; ++i) {
|
|
||||||
getDeckManager().addItems(newInventory);
|
|
||||||
}
|
}
|
||||||
boolean one = 1 == qty;
|
else if (item instanceof PreconDeck) {
|
||||||
|
final PreconDeck deck = (PreconDeck) item;
|
||||||
|
for (int i = 0; i < qty; i++) {
|
||||||
|
this.questData.getCards().buyPreconDeck(deck, value);
|
||||||
|
|
||||||
|
itemsToAdd.addAll(deck.getDeck().getMain());
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean one = (qty == 1);
|
||||||
JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), String.format(
|
JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), String.format(
|
||||||
"%s '%s' %s added to your decklist.%n%n%s cards were also added to your pool.",
|
"%s '%s' %s added to your decklist.%n%n%s cards were also added to your pool.",
|
||||||
one ? "Deck" : String.format("%d copies of deck", qty),
|
one ? "Deck" : String.format("%d copies of deck", qty),
|
||||||
deck.getName(), one ? "was" : "were", one ? "Its" : "Their"),
|
deck.getName(), one ? "was" : "were", one ? "Its" : "Their"),
|
||||||
"Thanks for purchasing!", JOptionPane.INFORMATION_MESSAGE);
|
"Thanks for purchasing!", JOptionPane.INFORMATION_MESSAGE);
|
||||||
} else return;
|
}
|
||||||
this.getCatalogManager().removeItem(item, qty);
|
else {
|
||||||
|
continue; //don't remove item from Catalog if any other type
|
||||||
|
}
|
||||||
|
itemsToRemove.add(itemEntry);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (itemsToRemove.isEmpty()) { return; }
|
||||||
|
|
||||||
|
this.getDeckManager().addItems(itemsToAdd);
|
||||||
|
this.getCatalogManager().removeItems(itemsToRemove);
|
||||||
|
|
||||||
this.creditsLabel.setText("Credits: " + this.questData.getAssets().getCredits());
|
this.creditsLabel.setText("Credits: " + this.questData.getAssets().getCredits());
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see forge.gui.deckeditor.ACEditorBase#removeCard()
|
* @see forge.gui.deckeditor.ACEditorBase#onRemoveItems()
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void removeCard(InventoryItem item, boolean toAlternate, int qty) {
|
protected void onRemoveItems(Iterable<Entry<InventoryItem, Integer>> items, boolean toAlternate) {
|
||||||
if ((item == null) || !(item instanceof PaperCard) || showingFullCatalog || toAlternate) {
|
if (showingFullCatalog || toAlternate) { return; }
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
this.getCatalogManager().addItems(items);
|
||||||
|
this.getDeckManager().removeItems(items);
|
||||||
|
|
||||||
|
for (Entry<InventoryItem, Integer> itemEntry : items) {
|
||||||
|
final InventoryItem item = itemEntry.getKey();
|
||||||
|
if (item instanceof PaperCard) {
|
||||||
final PaperCard card = (PaperCard) item;
|
final PaperCard card = (PaperCard) item;
|
||||||
this.getCatalogManager().addItem(card, qty);
|
final int qty = itemEntry.getValue();
|
||||||
this.getDeckManager().removeItem(card, qty);
|
final int price = Math.min((int) (this.multiplier * this.getCardValue(card)), this.questData.getCards().getSellPriceLimit());
|
||||||
|
|
||||||
final int price = Math.min((int) (this.multiplier * this.getCardValue(card)), this.questData.getCards()
|
|
||||||
.getSellPriceLimit());
|
|
||||||
this.questData.getCards().sellCard(card, qty, price);
|
this.questData.getCards().sellCard(card, qty, price);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
this.creditsLabel.setText("Credits: " + this.questData.getAssets().getCredits());
|
this.creditsLabel.setText("Credits: " + this.questData.getAssets().getCredits());
|
||||||
}
|
}
|
||||||
@@ -374,7 +395,6 @@ public final class CEditorQuestCardShop extends ACEditorBase<InventoryItem, Deck
|
|||||||
if (!showingFullCatalog) {
|
if (!showingFullCatalog) {
|
||||||
cmb.addMoveItems("Buy", "item", "items", null);
|
cmb.addMoveItems("Buy", "item", "items", null);
|
||||||
}
|
}
|
||||||
cmb.addTextFilterItem();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -384,7 +404,7 @@ public final class CEditorQuestCardShop extends ACEditorBase<InventoryItem, Deck
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void removeCards(List<Map.Entry<InventoryItem, Integer>> cardsToRemove) {
|
public void removeCards(List<Entry<InventoryItem, Integer>> cardsToRemove) {
|
||||||
if (showingFullCatalog) {
|
if (showingFullCatalog) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -392,7 +412,7 @@ public final class CEditorQuestCardShop extends ACEditorBase<InventoryItem, Deck
|
|||||||
this.getCatalogManager().addItems(cardsToRemove);
|
this.getCatalogManager().addItems(cardsToRemove);
|
||||||
this.getDeckManager().removeItems(cardsToRemove);
|
this.getDeckManager().removeItems(cardsToRemove);
|
||||||
|
|
||||||
for (Map.Entry<InventoryItem, Integer> item : cardsToRemove) {
|
for (Entry<InventoryItem, Integer> item : cardsToRemove) {
|
||||||
if (!(item.getKey() instanceof PaperCard)) {
|
if (!(item.getKey() instanceof PaperCard)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -499,8 +519,8 @@ public final class CEditorQuestCardShop extends ACEditorBase<InventoryItem, Deck
|
|||||||
this.getBtnRemove4().setCommand(new Command() {
|
this.getBtnRemove4().setCommand(new Command() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
List<Map.Entry<InventoryItem, Integer>> cardsToRemove = new LinkedList<Map.Entry<InventoryItem,Integer>>();
|
List<Entry<InventoryItem, Integer>> cardsToRemove = new LinkedList<Map.Entry<InventoryItem,Integer>>();
|
||||||
for (Map.Entry<InventoryItem, Integer> item : getDeckManager().getPool()) {
|
for (Entry<InventoryItem, Integer> item : getDeckManager().getPool()) {
|
||||||
PaperCard card = (PaperCard)item.getKey();
|
PaperCard card = (PaperCard)item.getKey();
|
||||||
int numToKeep = card.getRules().getType().isBasic() ? 50 : 4;
|
int numToKeep = card.getRules().getType().isBasic() ? 50 : 4;
|
||||||
if ("Relentless Rats".equals(card.getName())) {
|
if ("Relentless Rats".equals(card.getName())) {
|
||||||
|
|||||||
@@ -18,6 +18,7 @@
|
|||||||
package forge.gui.deckeditor.controllers;
|
package forge.gui.deckeditor.controllers;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
import com.google.common.base.Predicate;
|
import com.google.common.base.Predicate;
|
||||||
import com.google.common.base.Supplier;
|
import com.google.common.base.Supplier;
|
||||||
@@ -83,37 +84,32 @@ public final class CEditorVariant extends ACEditorBase<PaperCard, Deck> {
|
|||||||
//=========== Overridden from ACEditorBase
|
//=========== Overridden from ACEditorBase
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see forge.gui.deckeditor.ACEditorBase#addCard()
|
* @see forge.gui.deckeditor.ACEditorBase#onAddItems()
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void addCard(InventoryItem item, boolean toAlternate, int qty) {
|
protected void onAddItems(Iterable<Entry<PaperCard, Integer>> items, boolean toAlternate) {
|
||||||
if ((item == null) || !(item instanceof PaperCard) || toAlternate) {
|
if (toAlternate) { return; }
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
final PaperCard card = (PaperCard) item;
|
this.getDeckManager().addItems(items);
|
||||||
this.getDeckManager().addItem(card, qty);
|
this.getCatalogManager().selectItemEntrys(items); //just select all added cards in Catalog
|
||||||
this.controller.notifyModelChanged();
|
this.controller.notifyModelChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see forge.gui.deckeditor.ACEditorBase#removeCard()
|
* @see forge.gui.deckeditor.ACEditorBase#onRemoveItems()
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void removeCard(InventoryItem item, boolean toAlternate, int qty) {
|
protected void onRemoveItems(Iterable<Entry<PaperCard, Integer>> items, boolean toAlternate) {
|
||||||
if ((item == null) || !(item instanceof PaperCard) || toAlternate) {
|
if (toAlternate) { return; }
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
final PaperCard card = (PaperCard) item;
|
this.getDeckManager().removeItems(items);
|
||||||
this.getDeckManager().removeItem(card, qty);
|
this.getCatalogManager().selectItemEntrys(items); //just select all removed cards in Catalog
|
||||||
this.controller.notifyModelChanged();
|
this.controller.notifyModelChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void buildAddContextMenu(ContextMenuBuilder cmb) {
|
public void buildAddContextMenu(ContextMenuBuilder cmb) {
|
||||||
cmb.addMoveItems("Move", "card", "cards", "to deck");
|
cmb.addMoveItems("Move", "card", "cards", "to deck");
|
||||||
cmb.addTextFilterItem();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -56,6 +56,7 @@ import forge.gui.toolbox.itemmanager.filters.ItemFilter;
|
|||||||
import forge.gui.toolbox.itemmanager.views.ItemListView;
|
import forge.gui.toolbox.itemmanager.views.ItemListView;
|
||||||
import forge.gui.toolbox.itemmanager.views.ItemView;
|
import forge.gui.toolbox.itemmanager.views.ItemView;
|
||||||
import forge.item.InventoryItem;
|
import forge.item.InventoryItem;
|
||||||
|
import forge.item.PaperCard;
|
||||||
import forge.util.Aggregates;
|
import forge.util.Aggregates;
|
||||||
import forge.util.ItemPool;
|
import forge.util.ItemPool;
|
||||||
import forge.util.ItemPoolView;
|
import forge.util.ItemPoolView;
|
||||||
@@ -253,6 +254,16 @@ public abstract class ItemManager<T extends InventoryItem> extends JPanel {
|
|||||||
helper.fill(this.viewScroller);
|
helper.fill(this.viewScroller);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* getGenericType.
|
||||||
|
*
|
||||||
|
* @return generic type of items
|
||||||
|
*/
|
||||||
|
public Class<T> getGenericType() {
|
||||||
|
return this.genericType;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* getCaption.
|
* getCaption.
|
||||||
@@ -344,6 +355,26 @@ public abstract class ItemManager<T extends InventoryItem> extends JPanel {
|
|||||||
return this.table;
|
return this.table;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* getItemCount.
|
||||||
|
*
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
public int getItemCount() {
|
||||||
|
return this.table.getCount();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* getSelectionCount.
|
||||||
|
*
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
public int getSelectionCount() {
|
||||||
|
return this.table.getSelectionCount();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* getSelectedItem.
|
* getSelectedItem.
|
||||||
@@ -358,9 +389,9 @@ public abstract class ItemManager<T extends InventoryItem> extends JPanel {
|
|||||||
*
|
*
|
||||||
* getSelectedItems.
|
* getSelectedItems.
|
||||||
*
|
*
|
||||||
* @return List<T>
|
* @return Iterable<T>
|
||||||
*/
|
*/
|
||||||
public List<T> getSelectedItems() {
|
public Iterable<T> getSelectedItems() {
|
||||||
return this.table.getSelectedItems();
|
return this.table.getSelectedItems();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -374,6 +405,30 @@ public abstract class ItemManager<T extends InventoryItem> extends JPanel {
|
|||||||
this.table.setSelectedItem(item);
|
this.table.setSelectedItem(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* setSelectedItems.
|
||||||
|
*
|
||||||
|
* @param items - Items to select
|
||||||
|
*/
|
||||||
|
public void setSelectedItems(Iterable<T> items) {
|
||||||
|
this.table.setSelectedItems(items);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* selectItemEntrys.
|
||||||
|
*
|
||||||
|
* @param itemEntrys - Item entrys to select
|
||||||
|
*/
|
||||||
|
public void selectItemEntrys(Iterable<Entry<T, Integer>> itemEntrys) {
|
||||||
|
List<T> items = new ArrayList<T>();
|
||||||
|
for (Entry<T, Integer> itemEntry : itemEntrys) {
|
||||||
|
items.add(itemEntry.getKey());
|
||||||
|
}
|
||||||
|
this.setSelectedItems(items);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* getSelectedItem.
|
* getSelectedItem.
|
||||||
@@ -386,14 +441,34 @@ public abstract class ItemManager<T extends InventoryItem> extends JPanel {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* setSelectedItem.
|
* getSelectedItems.
|
||||||
*
|
*
|
||||||
* @param item - Item to select
|
* @return Iterable<Integer>
|
||||||
|
*/
|
||||||
|
public Iterable<Integer> getSelectedIndices() {
|
||||||
|
return this.table.getSelectedIndices();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* setSelectedIndex.
|
||||||
|
*
|
||||||
|
* @param index - Index to select
|
||||||
*/
|
*/
|
||||||
public void setSelectedIndex(int index) {
|
public void setSelectedIndex(int index) {
|
||||||
this.table.setSelectedIndex(index);
|
this.table.setSelectedIndex(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* setSelectedIndices.
|
||||||
|
*
|
||||||
|
* @param indices - Indices to select
|
||||||
|
*/
|
||||||
|
public void setSelectedIndices(Iterable<Integer> indices) {
|
||||||
|
this.table.setSelectedIndices(indices);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* addItem.
|
* addItem.
|
||||||
@@ -402,13 +477,12 @@ 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.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);
|
||||||
}
|
}
|
||||||
this.updateView(false);
|
this.updateView(false);
|
||||||
this.table.fixSelection(n);
|
this.table.setSelectedItem(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -417,14 +491,18 @@ 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<Entry<T, Integer>> itemsToAdd) {
|
||||||
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);
|
||||||
}
|
}
|
||||||
this.updateView(false);
|
this.updateView(false);
|
||||||
this.table.fixSelection(n);
|
|
||||||
|
List<T> items = new ArrayList<T>();
|
||||||
|
for (Map.Entry<T, Integer> item : itemsToAdd) {
|
||||||
|
items.add(item.getKey());
|
||||||
|
}
|
||||||
|
this.table.setSelectedItems(items);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -435,13 +513,15 @@ 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.getSelectedIndex();
|
final int selectedIndexBefore = this.getSelectedIndex();
|
||||||
|
final Iterable<T> selectedItemsBefore = this.getSelectedItems();
|
||||||
|
|
||||||
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);
|
||||||
}
|
}
|
||||||
this.updateView(false);
|
this.updateView(false);
|
||||||
this.table.fixSelection(n);
|
this.fixSelection(selectedIndexBefore, selectedItemsBefore);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -450,8 +530,10 @@ 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(Iterable<Map.Entry<T, Integer>> itemsToRemove) {
|
||||||
final int n = this.table.getSelectedIndex();
|
final int selectedIndexBefore = this.getSelectedIndex();
|
||||||
|
final Iterable<T> selectedItemsBefore = this.getSelectedItems();
|
||||||
|
|
||||||
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()) {
|
||||||
@@ -459,7 +541,29 @@ public abstract class ItemManager<T extends InventoryItem> extends JPanel {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.updateView(false);
|
this.updateView(false);
|
||||||
this.table.fixSelection(n);
|
this.fixSelection(selectedIndexBefore, selectedItemsBefore);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* fixSelection.
|
||||||
|
*
|
||||||
|
* @param selectedIndexBefore
|
||||||
|
* @param selectedItemsBefore
|
||||||
|
*/
|
||||||
|
private void fixSelection(int selectedIndexBefore, final Iterable<T> selectedItemsBefore) {
|
||||||
|
if (!this.table.setSelectedItems(selectedItemsBefore)) {
|
||||||
|
this.table.setSelectedIndex(selectedIndexBefore); //restore selected index if couldn't restore selected items
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* scrollSelectionIntoView.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void scrollSelectionIntoView() {
|
||||||
|
this.table.scrollSelectionIntoView();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -635,7 +739,7 @@ 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.getCount() > 0 && table.getSelectedIndices().length == 0) {
|
if (table.getCount() > 0 && table.getSelectionCount() == 0) {
|
||||||
table.setSelectedIndex(0);
|
table.setSelectedIndex(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -162,33 +162,6 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
|
|||||||
table.setColumnModel(colModel);
|
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() {
|
public JTable getTable() {
|
||||||
return this.table;
|
return this.table;
|
||||||
}
|
}
|
||||||
@@ -214,34 +187,44 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public T getSelectedItem() {
|
public Iterable<Integer> getSelectedIndices() {
|
||||||
final int iRow = this.table.getSelectedRow();
|
List<Integer> indices = new ArrayList<Integer>();
|
||||||
return iRow >= 0 ? this.tableModel.rowToItem(iRow).getKey() : null;
|
int[] selectedRows = this.table.getSelectedRows();
|
||||||
|
for (int i = 0; i < selectedRows.length; i++) {
|
||||||
|
indices.add(selectedRows[i]);
|
||||||
|
}
|
||||||
|
return indices;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int[] getSelectedIndices() {
|
protected void onSetSelectedIndex(int index) {
|
||||||
return this.table.getSelectedRows();
|
int count = getCount();
|
||||||
|
if (count == 0) { return; }
|
||||||
|
|
||||||
|
if (index >= count) {
|
||||||
|
index = count - 1;
|
||||||
|
}
|
||||||
|
this.table.setRowSelectionInterval(index, index);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<T> getSelectedItems() {
|
protected void onSetSelectedIndices(Iterable<Integer> indices) {
|
||||||
List<T> items = new ArrayList<T>();
|
int count = getCount();
|
||||||
for (int row : this.table.getSelectedRows()) {
|
if (count == 0) { return; }
|
||||||
items.add(tableModel.rowToItem(row).getKey());
|
|
||||||
|
this.table.clearSelection();
|
||||||
|
for (Integer index : indices) {
|
||||||
|
if (index >= count) {
|
||||||
|
index = count - 1;
|
||||||
|
}
|
||||||
|
this.table.addRowSelectionInterval(index, index);
|
||||||
}
|
}
|
||||||
return items;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setSelectedIndex(int index) {
|
protected void onScrollSelectionIntoView(JViewport viewport) {
|
||||||
if (!(this.table.getParent() instanceof JViewport)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
JViewport viewport = (JViewport)this.table.getParent();
|
|
||||||
|
|
||||||
// compute where we're going and where we are
|
// compute where we're going and where we are
|
||||||
Rectangle targetRect = this.table.getCellRect(index, 0, true);
|
Rectangle targetRect = this.table.getCellRect(this.getSelectedIndex(), 0, true);
|
||||||
Rectangle curViewRect = viewport.getViewRect();
|
Rectangle curViewRect = viewport.getViewRect();
|
||||||
|
|
||||||
// if the target cell is not visible, attempt to jump to a location where it is
|
// if the target cell is not visible, attempt to jump to a location where it is
|
||||||
@@ -256,7 +239,6 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
this.table.scrollRectToVisible(targetRect);
|
this.table.scrollRectToVisible(targetRect);
|
||||||
this.table.setRowSelectionInterval(index, index);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -279,6 +261,11 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
|
|||||||
return this.table.getRowCount();
|
return this.table.getRowCount();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getSelectionCount() {
|
||||||
|
return this.table.getSelectedRowCount();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getIndexAtPoint(Point p) {
|
public int getIndexAtPoint(Point p) {
|
||||||
return this.table.rowAtPoint(p);
|
return this.table.rowAtPoint(p);
|
||||||
|
|||||||
@@ -1,9 +1,12 @@
|
|||||||
package forge.gui.toolbox.itemmanager.views;
|
package forge.gui.toolbox.itemmanager.views;
|
||||||
|
|
||||||
|
import java.awt.Container;
|
||||||
import java.awt.Point;
|
import java.awt.Point;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import javax.swing.JComponent;
|
import javax.swing.JComponent;
|
||||||
|
import javax.swing.JViewport;
|
||||||
|
|
||||||
import forge.gui.toolbox.itemmanager.ItemManager;
|
import forge.gui.toolbox.itemmanager.ItemManager;
|
||||||
import forge.item.InventoryItem;
|
import forge.item.InventoryItem;
|
||||||
@@ -19,10 +22,75 @@ public abstract class ItemView<T extends InventoryItem> {
|
|||||||
return this.itemManager;
|
return this.itemManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setSelectedItem(T item) {
|
public final T getSelectedItem() {
|
||||||
int index = this.getIndexOfItem(item);
|
int index = getSelectedIndex();
|
||||||
|
return index >= 0 ? getItemAtIndex(index) : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final Iterable<T> getSelectedItems() {
|
||||||
|
List<T> items = new ArrayList<T>();
|
||||||
|
for (Integer i : getSelectedIndices()) {
|
||||||
|
items.add(getItemAtIndex(i));
|
||||||
|
}
|
||||||
|
return items;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final boolean setSelectedItem(T item) {
|
||||||
|
return setSelectedItem(item, true);
|
||||||
|
}
|
||||||
|
public final boolean setSelectedItem(T item, boolean scrollIntoView) {
|
||||||
|
int index = getIndexOfItem(item);
|
||||||
if (index != -1) {
|
if (index != -1) {
|
||||||
setSelectedIndex(index);
|
setSelectedIndex(index, scrollIntoView);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final boolean setSelectedItems(Iterable<T> items) {
|
||||||
|
return setSelectedItems(items, true);
|
||||||
|
}
|
||||||
|
public final boolean setSelectedItems(Iterable<T> items, boolean scrollIntoView) {
|
||||||
|
if (getCount() == 0) { return false; }
|
||||||
|
|
||||||
|
List<Integer> indices = new ArrayList<Integer>();
|
||||||
|
for (T item : items) {
|
||||||
|
int index = getIndexOfItem(item);
|
||||||
|
if (index != -1) {
|
||||||
|
indices.add(index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (indices.size() > 0) {
|
||||||
|
setSelectedIndices(indices, scrollIntoView);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSelectedIndex(int index) {
|
||||||
|
setSelectedIndex(index, true);
|
||||||
|
}
|
||||||
|
public void setSelectedIndex(int index, boolean scrollIntoView) {
|
||||||
|
onSetSelectedIndex(index);
|
||||||
|
if (scrollIntoView) {
|
||||||
|
scrollSelectionIntoView();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSelectedIndices(Iterable<Integer> indices) {
|
||||||
|
setSelectedIndices(indices, true);
|
||||||
|
}
|
||||||
|
public void setSelectedIndices(Iterable<Integer> indices, boolean scrollIntoView) {
|
||||||
|
onSetSelectedIndices(indices);
|
||||||
|
if (scrollIntoView) {
|
||||||
|
scrollSelectionIntoView();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void scrollSelectionIntoView() {
|
||||||
|
Container parent = getComponent().getParent();
|
||||||
|
if (parent instanceof JViewport) {
|
||||||
|
onScrollSelectionIntoView((JViewport)parent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -44,12 +112,13 @@ public abstract class ItemView<T extends InventoryItem> {
|
|||||||
public abstract T getItemAtIndex(int index);
|
public abstract T getItemAtIndex(int index);
|
||||||
public abstract int getIndexOfItem(T item);
|
public abstract int getIndexOfItem(T item);
|
||||||
public abstract int getSelectedIndex();
|
public abstract int getSelectedIndex();
|
||||||
public abstract int[] getSelectedIndices();
|
public abstract Iterable<Integer> getSelectedIndices();
|
||||||
public abstract T getSelectedItem();
|
|
||||||
public abstract List<T> getSelectedItems();
|
|
||||||
public abstract void setSelectedIndex(int index);
|
|
||||||
public abstract void selectAll();
|
public abstract void selectAll();
|
||||||
public abstract int getCount();
|
public abstract int getCount();
|
||||||
|
public abstract int getSelectionCount();
|
||||||
public abstract int getIndexAtPoint(Point p);
|
public abstract int getIndexAtPoint(Point p);
|
||||||
protected abstract String getCaption();
|
protected abstract String getCaption();
|
||||||
|
protected abstract void onSetSelectedIndex(int index);
|
||||||
|
protected abstract void onSetSelectedIndices(Iterable<Integer> indices);
|
||||||
|
protected abstract void onScrollSelectionIntoView(JViewport viewport);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user