mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-18 11:48:02 +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:
@@ -30,6 +30,7 @@ import java.awt.event.KeyEvent;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import javax.swing.JMenu;
|
||||
import javax.swing.JPopupMenu;
|
||||
@@ -45,8 +46,6 @@ import javax.swing.event.ListSelectionListener;
|
||||
import org.apache.commons.lang3.CharUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import com.google.common.primitives.Ints;
|
||||
|
||||
import forge.Command;
|
||||
import forge.Singletons;
|
||||
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.views.ItemListView;
|
||||
import forge.item.InventoryItem;
|
||||
import forge.util.ItemPool;
|
||||
|
||||
/**
|
||||
* Constructs instance of deck editor UI controller, used as a single point of
|
||||
@@ -131,75 +131,76 @@ public enum CDeckEditorUI implements ICDoc, IMenuProvider {
|
||||
setCurrentEditorController(childController0);
|
||||
}
|
||||
}
|
||||
|
||||
private interface _MoveAction {
|
||||
void move(InventoryItem item, int qty);
|
||||
}
|
||||
|
||||
@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 (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; }
|
||||
childController.addCard(item, false, qty);
|
||||
((ACEditorBase<T, ?>)childController).addItem(item, qty, false);
|
||||
}
|
||||
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; }
|
||||
childController.removeCard(item, false, qty);
|
||||
((ACEditorBase<T, ?>)childController).removeItem(item, qty, false);
|
||||
}
|
||||
|
||||
CStatistics.SINGLETON_INSTANCE.update();
|
||||
CProbabilities.SINGLETON_INSTANCE.update();
|
||||
}
|
||||
|
||||
private void moveSelectedCards(ItemManager<InventoryItem> itemManager, _MoveAction moveAction, int maxQty) {
|
||||
List<? extends InventoryItem> items = itemManager.getSelectedItems();
|
||||
if (items.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (InventoryItem item : items) {
|
||||
int toMove = Math.min(maxQty, itemManager.getItemCount(item));
|
||||
moveAction.move(item, toMove);
|
||||
private interface _MoveAction {
|
||||
public <T extends InventoryItem> void move(Iterable<Entry<T, Integer>> items);
|
||||
}
|
||||
|
||||
private <T extends InventoryItem> void moveSelectedItems(ItemManager<T> itemManager, _MoveAction moveAction, int maxQty) {
|
||||
if (maxQty == 0) { return; }
|
||||
|
||||
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();
|
||||
CProbabilities.SINGLETON_INSTANCE.update();
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public void addSelectedCards(final boolean toAlternate, int number) {
|
||||
moveSelectedCards((ItemManager<InventoryItem>)childController.getCatalogManager(),
|
||||
new _MoveAction() {
|
||||
moveSelectedItems(childController.getCatalogManager(), new _MoveAction() {
|
||||
@Override
|
||||
public void move(InventoryItem item, int qty) {
|
||||
childController.addCard(item, toAlternate, qty);
|
||||
public <T extends InventoryItem> void move(Iterable<Entry<T, Integer>> items) {
|
||||
((ACEditorBase<T, ?>)childController).addItems(items, toAlternate);
|
||||
}
|
||||
}, number);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public void removeSelectedCards(final boolean toAlternate, int number) {
|
||||
moveSelectedCards((ItemManager<InventoryItem>)childController.getDeckManager(),
|
||||
new _MoveAction() {
|
||||
moveSelectedItems(childController.getDeckManager(), new _MoveAction() {
|
||||
@Override
|
||||
public void move(InventoryItem item, int qty) {
|
||||
childController.removeCard(item, toAlternate, qty);
|
||||
public <T extends InventoryItem> void move(Iterable<Entry<T, Integer>> items) {
|
||||
((ACEditorBase<T, ?>)childController).removeItems(items, toAlternate);
|
||||
}
|
||||
}, number);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public void removeAllCards(final boolean toAlternate) {
|
||||
ItemManager<InventoryItem> v = (ItemManager<InventoryItem>)childController.getDeckManager();
|
||||
ItemManager<?> v = childController.getDeckManager();
|
||||
v.getTable().selectAll();
|
||||
moveSelectedCards(v, new _MoveAction() {
|
||||
moveSelectedItems(v, new _MoveAction() {
|
||||
@Override
|
||||
public void move(InventoryItem item, int qty) {
|
||||
childController.removeCard(item, toAlternate, qty);
|
||||
public <T extends InventoryItem> void move(Iterable<Entry<T, Integer>> items) {
|
||||
((ACEditorBase<T, ?>)childController).removeItems(items, toAlternate);
|
||||
}
|
||||
}, Integer.MAX_VALUE);
|
||||
}
|
||||
@@ -210,32 +211,33 @@ public enum CDeckEditorUI implements ICDoc, IMenuProvider {
|
||||
}
|
||||
|
||||
private class _ContextMenuBuilder implements ACEditorBase.ContextMenuBuilder {
|
||||
private final MouseEvent _e;
|
||||
private final ItemListView<?> _nextTable;
|
||||
private final _MoveCard _onMove;
|
||||
private final int _numSelected;
|
||||
private final JPopupMenu _menu = new JPopupMenu("TableContextMenu");
|
||||
private boolean _showTextFilterItem = false;
|
||||
private final MouseEvent _e;
|
||||
private final ItemManager<?> _itemManager;
|
||||
private final ItemManager<?> _nextItemManager;
|
||||
private final _MoveCard _onMove;
|
||||
private final JPopupMenu _menu = new JPopupMenu("ItemViewContextMenu");
|
||||
|
||||
public _ContextMenuBuilder(MouseEvent e, ItemListView<?> table, ItemListView<?> nextTable, _MoveCard onMove) {
|
||||
public _ContextMenuBuilder(MouseEvent e, ItemManager<?> itemManager, ItemManager<?> nextItemManager, _MoveCard onMove) {
|
||||
_e = e;
|
||||
_nextTable = nextTable;
|
||||
_itemManager = itemManager;
|
||||
_nextItemManager = nextItemManager;
|
||||
_onMove = onMove;
|
||||
|
||||
// ensure the table has focus
|
||||
if (!table.hasFocus()) {
|
||||
table.focus();
|
||||
|
||||
//ensure the item manager has focus
|
||||
itemManager.focus();
|
||||
|
||||
//if item under the cursor is not selected, select it
|
||||
int index = itemManager.getTable().getIndexAtPoint(e.getPoint());
|
||||
boolean needSelection = true;
|
||||
for (Integer selectedIndex : itemManager.getSelectedIndices()) {
|
||||
if (selectedIndex == index) {
|
||||
needSelection = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// if item under the cursor is not selected, select it
|
||||
int index = table.getIndexAtPoint(e.getPoint());
|
||||
int[] selectedIndices = table.getSelectedIndices();
|
||||
if (!Ints.contains(selectedIndices, index)) {
|
||||
table.setSelectedIndex(index);
|
||||
if (needSelection) {
|
||||
itemManager.setSelectedIndex(index);
|
||||
}
|
||||
|
||||
// record selection count
|
||||
_numSelected = selectedIndices.length;
|
||||
}
|
||||
|
||||
private void show() {
|
||||
@@ -243,31 +245,29 @@ public enum CDeckEditorUI implements ICDoc, IMenuProvider {
|
||||
|
||||
GuiUtils.addMenuItem(_menu, "Jump to previous table",
|
||||
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",
|
||||
KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), new Runnable() {
|
||||
@Override public void run() { _nextTable.focus(); }
|
||||
@Override public void run() { _nextItemManager.focus(); }
|
||||
});
|
||||
GuiUtils.addMenuItem(_menu, "Jump to text filter",
|
||||
KeyStroke.getKeyStroke(KeyEvent.VK_F, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()),
|
||||
new Runnable() {
|
||||
@Override public void run() {
|
||||
_itemManager.focusSearch();
|
||||
}
|
||||
});
|
||||
|
||||
if (_showTextFilterItem) {
|
||||
GuiUtils.addMenuItem(_menu, "Jump to text filter",
|
||||
KeyStroke.getKeyStroke(KeyEvent.VK_F, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()),
|
||||
new Runnable() {
|
||||
@Override public void run() {
|
||||
VCardCatalog.SINGLETON_INSTANCE.getItemManager().focusSearch();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
_menu.show(_e.getComponent(), _e.getX(), _e.getY());
|
||||
}
|
||||
|
||||
private String _doNoun(String nounSingular, String nounPlural) {
|
||||
if (1 == _numSelected) {
|
||||
int numSelected = _itemManager.getSelectionCount();
|
||||
if (1 == numSelected) {
|
||||
return nounSingular;
|
||||
}
|
||||
return String.format("%d %s", _numSelected, nounPlural);
|
||||
return String.format("%d %s", numSelected, nounPlural);
|
||||
}
|
||||
|
||||
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 addTextFilterItem() {
|
||||
_showTextFilterItem = true;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -343,12 +338,15 @@ public enum CDeckEditorUI implements ICDoc, IMenuProvider {
|
||||
public void keyPressed(KeyEvent e) {
|
||||
if (!isFindingAsYouType && KeyEvent.VK_SPACE == e.getKeyCode()) {
|
||||
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();
|
||||
} 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
|
||||
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) {
|
||||
if (!isFindingAsYouType && KeyEvent.VK_SPACE == e.getKeyCode()) {
|
||||
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();
|
||||
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
|
||||
public void onRightClick(MouseEvent e) {
|
||||
_ContextMenuBuilder cmb = new _ContextMenuBuilder(e, catTable, deckTable, onAdd);
|
||||
_ContextMenuBuilder cmb = new _ContextMenuBuilder(e, catView, deckView, onAdd);
|
||||
childController.buildAddContextMenu(cmb);
|
||||
cmb.show();
|
||||
}
|
||||
@@ -402,7 +408,7 @@ public enum CDeckEditorUI implements ICDoc, IMenuProvider {
|
||||
|
||||
@Override
|
||||
public void onRightClick(MouseEvent e) {
|
||||
_ContextMenuBuilder cmb = new _ContextMenuBuilder(e, deckTable, catTable, onRemove);
|
||||
_ContextMenuBuilder cmb = new _ContextMenuBuilder(e, deckView, catView, onRemove);
|
||||
childController.buildRemoveContextMenu(cmb);
|
||||
cmb.show();
|
||||
}
|
||||
|
||||
@@ -17,6 +17,8 @@
|
||||
*/
|
||||
package forge.gui.deckeditor.controllers;
|
||||
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import javax.swing.SwingUtilities;
|
||||
|
||||
import forge.Command;
|
||||
@@ -31,6 +33,7 @@ import forge.gui.toolbox.FLabel;
|
||||
import forge.gui.toolbox.FSkin;
|
||||
import forge.gui.toolbox.itemmanager.ItemManager;
|
||||
import forge.item.InventoryItem;
|
||||
import forge.util.ItemPool;
|
||||
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 addMoveAlternateItems (String verb, String nounSingular, String nounPlural, String destination);
|
||||
public void addTextFilterItem ();
|
||||
}
|
||||
|
||||
public boolean listenersHooked;
|
||||
@@ -110,16 +112,55 @@ public abstract class ACEditorBase<TItem extends InventoryItem, TModel extends D
|
||||
public FScreen getScreen() {
|
||||
return this.screen;
|
||||
}
|
||||
|
||||
|
||||
public final void addItem(TItem item) {
|
||||
onAddItems(createPoolForItem(item, 1), false);
|
||||
}
|
||||
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 add one of selected card to current deck.
|
||||
* Operation to add selected items to current deck.
|
||||
*/
|
||||
public abstract void addCard(InventoryItem item, boolean toAlternate, int qty);
|
||||
protected abstract void onAddItems(Iterable<Entry<TItem, Integer>> items, boolean toAlternate);
|
||||
|
||||
/**
|
||||
* Operation to remove one of selected card from current deck.
|
||||
* Operation to remove selected item from current deck.
|
||||
*/
|
||||
public abstract void removeCard(InventoryItem item, boolean toAlternate, int qty);
|
||||
protected abstract void onRemoveItems(Iterable<Entry<TItem, Integer>> items, boolean toAlternate);
|
||||
|
||||
public abstract void buildAddContextMenu(ContextMenuBuilder cmb);
|
||||
public abstract void buildRemoveContextMenu(ContextMenuBuilder cmb);
|
||||
|
||||
@@ -20,7 +20,7 @@ package forge.gui.deckeditor.controllers;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import com.google.common.base.Predicates;
|
||||
import com.google.common.base.Supplier;
|
||||
@@ -101,51 +101,53 @@ public final class CEditorCommander extends ACEditorBase<PaperCard, Deck> {
|
||||
//=========== Overridden from ACEditorBase
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.deckeditor.ACEditorBase#addCard()
|
||||
* @see forge.gui.deckeditor.ACEditorBase#onAddItems()
|
||||
*/
|
||||
@Override
|
||||
public void addCard(InventoryItem item, boolean toAlternate, int qty) {
|
||||
if ((item == null) || !(item instanceof PaperCard) || toAlternate) {
|
||||
return;
|
||||
}
|
||||
protected void onAddItems(Iterable<Entry<PaperCard, Integer>> items, boolean toAlternate) {
|
||||
if (toAlternate) { return; }
|
||||
|
||||
List<String> limitExceptions = Arrays.asList(new String[]{"Relentless Rats", "Shadowborn Apostle"});
|
||||
|
||||
if((controller.getModel().getMain().contains((PaperCard)item)
|
||||
|| controller.getModel().getOrCreate(DeckSection.Sideboard).contains((PaperCard)item)
|
||||
|| controller.getModel().getOrCreate(DeckSection.Commander).contains((PaperCard)item))
|
||||
&& !(((PaperCard)item).getRules().getType().isBasic() || limitExceptions.contains(item.getName()))) {
|
||||
return;
|
||||
List<Entry<PaperCard, Integer>> itemList = new ArrayList<Entry<PaperCard, Integer>>();
|
||||
|
||||
for (Entry<PaperCard, Integer> item : items) {
|
||||
PaperCard card = item.getKey();
|
||||
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) {
|
||||
for(Map.Entry<PaperCard, Integer> cp : getDeckManager().getPool()) {
|
||||
getDeckManager().removeItem(cp.getKey(), cp.getValue());
|
||||
}
|
||||
this.getDeckManager().removeItems(getDeckManager().getPool());
|
||||
}
|
||||
|
||||
final PaperCard card = (PaperCard) item;
|
||||
this.getDeckManager().addItem(card, qty);
|
||||
this.getDeckManager().addItems(itemList);
|
||||
this.getCatalogManager().selectItemEntrys(itemList); //just select all removed cards in Catalog
|
||||
this.controller.notifyModelChanged();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.deckeditor.ACEditorBase#removeCard()
|
||||
* @see forge.gui.deckeditor.ACEditorBase#onRemoveItems()
|
||||
*/
|
||||
@Override
|
||||
public void removeCard(InventoryItem item, boolean toAlternate, int qty) {
|
||||
if ((item == null) || !(item instanceof PaperCard) || toAlternate) {
|
||||
return;
|
||||
}
|
||||
protected void onRemoveItems(Iterable<Entry<PaperCard, Integer>> items, boolean toAlternate) {
|
||||
if (toAlternate) { return; }
|
||||
|
||||
final PaperCard card = (PaperCard) item;
|
||||
this.getDeckManager().removeItem(card, qty);
|
||||
this.getDeckManager().removeItems(items);
|
||||
this.getCatalogManager().selectItemEntrys(items); //just select all removed cards in Catalog
|
||||
this.controller.notifyModelChanged();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void buildAddContextMenu(ContextMenuBuilder cmb) {
|
||||
cmb.addMoveItems("Move", "card", "cards", "to deck");
|
||||
cmb.addTextFilterItem();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -19,7 +19,7 @@ package forge.gui.deckeditor.controllers;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import com.google.common.base.Predicates;
|
||||
import com.google.common.base.Supplier;
|
||||
@@ -104,54 +104,55 @@ public final class CEditorConstructed extends ACEditorBase<PaperCard, Deck> {
|
||||
//=========== Overridden from ACEditorBase
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.deckeditor.ACEditorBase#addCard()
|
||||
* @see forge.gui.deckeditor.ACEditorBase#onAddItems()
|
||||
*/
|
||||
@Override
|
||||
public void addCard(InventoryItem item, boolean toAlternate, int qty) {
|
||||
if ((item == null) || !(item instanceof PaperCard)) {
|
||||
return;
|
||||
}
|
||||
|
||||
protected void onAddItems(Iterable<Entry<PaperCard, Integer>> items, boolean toAlternate) {
|
||||
if (sectionMode == DeckSection.Avatar) {
|
||||
for(Map.Entry<PaperCard, Integer> cp : getDeckManager().getPool()) {
|
||||
getDeckManager().removeItem(cp.getKey(), cp.getValue());
|
||||
}
|
||||
getDeckManager().removeItems(getDeckManager().getPool());
|
||||
}
|
||||
|
||||
final PaperCard card = (PaperCard) item;
|
||||
if (toAlternate) {
|
||||
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
|
||||
this.getCatalogManager().removeItem(card, sectionMode == DeckSection.Sideboard ? qty : 0);
|
||||
|
||||
else {
|
||||
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();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.deckeditor.ACEditorBase#removeCard()
|
||||
* @see forge.gui.deckeditor.ACEditorBase#onRemoveItems()
|
||||
*/
|
||||
@Override
|
||||
public void removeCard(InventoryItem item, boolean toAlternate, int qty) {
|
||||
if ((item == null) || !(item instanceof PaperCard)) {
|
||||
return;
|
||||
}
|
||||
|
||||
final PaperCard card = (PaperCard) item;
|
||||
protected void onRemoveItems(Iterable<Entry<PaperCard, Integer>> items, boolean toAlternate) {
|
||||
if (toAlternate) {
|
||||
if (sectionMode != DeckSection.Sideboard) {
|
||||
controller.getModel().getOrCreate(DeckSection.Sideboard).add(card, qty);
|
||||
} else {
|
||||
controller.getModel().getOrCreate(DeckSection.Sideboard).addAll(items);
|
||||
}
|
||||
else {
|
||||
// "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();
|
||||
}
|
||||
|
||||
@@ -159,7 +160,6 @@ public final class CEditorConstructed extends ACEditorBase<PaperCard, Deck> {
|
||||
public void buildAddContextMenu(ContextMenuBuilder cmb) {
|
||||
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.addTextFilterItem();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -17,6 +17,8 @@
|
||||
*/
|
||||
package forge.gui.deckeditor.controllers;
|
||||
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import javax.swing.JOptionPane;
|
||||
|
||||
import forge.Singletons;
|
||||
@@ -37,7 +39,6 @@ import forge.gui.home.sanctioned.CSubmenuDraft;
|
||||
import forge.gui.toolbox.itemmanager.CardManager;
|
||||
import forge.gui.toolbox.itemmanager.views.SColumnUtil;
|
||||
import forge.item.PaperCard;
|
||||
import forge.item.InventoryItem;
|
||||
import forge.limited.BoosterDraft;
|
||||
import forge.limited.IBoosterDraft;
|
||||
import forge.util.ItemPoolView;
|
||||
@@ -86,17 +87,14 @@ public class CEditorDraftingProcess extends ACEditorBase<PaperCard, DeckGroup> {
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.deckeditor.ACEditorBase#addCard()
|
||||
* @see forge.gui.deckeditor.ACEditorBase#onAddItems()
|
||||
*/
|
||||
@Override
|
||||
public void addCard(InventoryItem item, boolean toAlternate, int qty) {
|
||||
if ((item == null) || !(item instanceof PaperCard) || toAlternate) {
|
||||
return;
|
||||
}
|
||||
|
||||
final PaperCard card = (PaperCard) item;
|
||||
protected void onAddItems(Iterable<Entry<PaperCard, Integer>> items, boolean toAlternate) {
|
||||
if (toAlternate) { return; }
|
||||
|
||||
// can only draft one at a time, regardless of the requested quantity
|
||||
PaperCard card = items.iterator().next().getKey();
|
||||
this.getDeckManager().addItem(card, 1);
|
||||
|
||||
// get next booster pack
|
||||
@@ -104,23 +102,23 @@ public class CEditorDraftingProcess extends ACEditorBase<PaperCard, DeckGroup> {
|
||||
|
||||
if (this.boosterDraft.hasNextChoice()) {
|
||||
this.showChoices(this.boosterDraft.nextChoice());
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
this.boosterDraft.finishedDrafting();
|
||||
this.saveDraft();
|
||||
}
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.deckeditor.ACEditorBase#removeCard()
|
||||
* @see forge.gui.deckeditor.ACEditorBase#onRemoveItems()
|
||||
*/
|
||||
@Override
|
||||
public void removeCard(InventoryItem item, boolean toAlternate, int qty) {
|
||||
protected void onRemoveItems(Iterable<Entry<PaperCard, Integer>> items, boolean toAlternate) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void buildAddContextMenu(ContextMenuBuilder cmb) {
|
||||
cmb.addMoveItems("Draft", "card", "cards", null);
|
||||
cmb.addTextFilterItem();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -141,7 +139,7 @@ public class CEditorDraftingProcess extends ACEditorBase<PaperCard, DeckGroup> {
|
||||
VCardCatalog.SINGLETON_INSTANCE.getLblTitle().setText("Select a card from pack number "
|
||||
+ (((BoosterDraft) boosterDraft).getCurrentBoosterIndex() + 1) + ".");
|
||||
this.getCatalogManager().setPool(list);
|
||||
this.getCatalogManager().getTable().fixSelection(0);
|
||||
this.getCatalogManager().getTable().setSelectedIndex(0);
|
||||
} // showChoices()
|
||||
|
||||
/**
|
||||
|
||||
@@ -17,6 +17,8 @@
|
||||
*/
|
||||
package forge.gui.deckeditor.controllers;
|
||||
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import com.google.common.base.Supplier;
|
||||
|
||||
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.views.SColumnUtil;
|
||||
import forge.item.PaperCard;
|
||||
import forge.item.InventoryItem;
|
||||
import forge.util.storage.IStorage;
|
||||
|
||||
/**
|
||||
@@ -91,41 +92,34 @@ public final class CEditorLimited extends ACEditorBase<PaperCard, DeckGroup> {
|
||||
//========== Overridden from ACEditorBase
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.deckeditor.ACEditorBase#addCard()
|
||||
* @see forge.gui.deckeditor.ACEditorBase#onAddItems()
|
||||
*/
|
||||
@Override
|
||||
public void addCard(InventoryItem item, boolean toAlternate, int qty) {
|
||||
if ((item == null) || !(item instanceof PaperCard) || toAlternate) {
|
||||
return;
|
||||
}
|
||||
protected void onAddItems(Iterable<Entry<PaperCard, Integer>> items, boolean toAlternate) {
|
||||
if (toAlternate) { return; }
|
||||
|
||||
// update view
|
||||
final PaperCard card = (PaperCard) item;
|
||||
this.getDeckManager().addItem(card, qty);
|
||||
this.getCatalogManager().removeItem(card, qty);
|
||||
this.getDeckManager().addItems(items);
|
||||
this.getCatalogManager().removeItems(items);
|
||||
this.getDeckController().notifyModelChanged();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.deckeditor.ACEditorBase#removeCard()
|
||||
* @see forge.gui.deckeditor.ACEditorBase#onRemoveItems()
|
||||
*/
|
||||
@Override
|
||||
public void removeCard(InventoryItem item, boolean toAlternate, int qty) {
|
||||
if ((item == null) || !(item instanceof PaperCard) || toAlternate) {
|
||||
return;
|
||||
}
|
||||
protected void onRemoveItems(Iterable<Entry<PaperCard, Integer>> items, boolean toAlternate) {
|
||||
if (toAlternate) { return; }
|
||||
|
||||
// update view
|
||||
final PaperCard card = (PaperCard) item;
|
||||
this.getCatalogManager().addItem(card, qty);
|
||||
this.getDeckManager().removeItem(card, qty);
|
||||
this.getCatalogManager().addItems(items);
|
||||
this.getDeckManager().removeItems(items);
|
||||
this.getDeckController().notifyModelChanged();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void buildAddContextMenu(ContextMenuBuilder cmb) {
|
||||
cmb.addMoveItems("Move", "card", "cards", "to deck");
|
||||
cmb.addTextFilterItem();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -143,46 +143,38 @@ public final class CEditorQuest extends ACEditorBase<PaperCard, Deck> {
|
||||
//=========== Overridden from ACEditorBase
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.deckeditor.ACEditorBase#addCard()
|
||||
* @see forge.gui.deckeditor.ACEditorBase#onAddItems()
|
||||
*/
|
||||
@Override
|
||||
public void addCard(InventoryItem item, boolean toAlternate, int qty) {
|
||||
if ((item == null) || !(item instanceof PaperCard)) {
|
||||
return;
|
||||
}
|
||||
|
||||
final PaperCard card = (PaperCard) item;
|
||||
protected void onAddItems(Iterable<Entry<PaperCard, Integer>> items, boolean toAlternate) {
|
||||
if (toAlternate) {
|
||||
// if we're in sideboard mode, the library will get adjusted properly when we call resetTables()
|
||||
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();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.deckeditor.ACEditorBase#removeCard()
|
||||
* @see forge.gui.deckeditor.ACEditorBase#onRemoveItems()
|
||||
*/
|
||||
@Override
|
||||
public void removeCard(InventoryItem item, boolean toAlternate, int qty) {
|
||||
if ((item == null) || !(item instanceof PaperCard)) {
|
||||
return;
|
||||
}
|
||||
|
||||
final PaperCard card = (PaperCard) item;
|
||||
protected void onRemoveItems(Iterable<Entry<PaperCard, Integer>> items, boolean toAlternate) {
|
||||
if (toAlternate) {
|
||||
// if we're in sideboard mode, the library will get adjusted properly when we call resetTables()
|
||||
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();
|
||||
}
|
||||
|
||||
@@ -190,7 +182,6 @@ public final class CEditorQuest extends ACEditorBase<PaperCard, Deck> {
|
||||
public void buildAddContextMenu(ContextMenuBuilder cmb) {
|
||||
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.addTextFilterItem();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -19,6 +19,7 @@ package forge.gui.deckeditor.controllers;
|
||||
|
||||
import java.text.DecimalFormat;
|
||||
import java.text.NumberFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
@@ -289,83 +290,103 @@ public final class CEditorQuestCardShop extends ACEditorBase<InventoryItem, Deck
|
||||
//=========== Overridden from ACEditorBase
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.deckeditor.ACEditorBase#addCard()
|
||||
* @see forge.gui.deckeditor.ACEditorBase#onAddItems()
|
||||
*/
|
||||
@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
|
||||
if (item == null || showingFullCatalog || toAlternate) {
|
||||
if (showingFullCatalog || toAlternate) {
|
||||
return;
|
||||
}
|
||||
|
||||
final int value = this.getCardValue(item);
|
||||
ItemPool<InventoryItem> itemsToAdd = new ItemPool<InventoryItem>(InventoryItem.class);
|
||||
List<Entry<InventoryItem, Integer>> itemsToRemove = new ArrayList<Entry<InventoryItem, Integer>>();
|
||||
|
||||
if (value > this.questData.getAssets().getCredits()) {
|
||||
JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), "Not enough credits!");
|
||||
return;
|
||||
}
|
||||
|
||||
if (item instanceof PaperCard) {
|
||||
final PaperCard card = (PaperCard) item;
|
||||
this.getDeckManager().addItem(card, qty);
|
||||
this.questData.getCards().buyCard(card, qty, value);
|
||||
for (Entry<InventoryItem, Integer> itemEntry : items) {
|
||||
final InventoryItem item = itemEntry.getKey();
|
||||
final int qty = itemEntry.getValue();
|
||||
final int value = this.getCardValue(item);
|
||||
|
||||
} else if (item instanceof SealedProduct) {
|
||||
for (int i = 0; qty > i; ++i) {
|
||||
SealedProduct booster = null;
|
||||
if (item instanceof BoosterPack) {
|
||||
booster = (BoosterPack) ((BoosterPack) item).clone();
|
||||
} else if (item instanceof TournamentPack) {
|
||||
booster = (TournamentPack) ((TournamentPack) item).clone();
|
||||
} else if (item instanceof FatPack) {
|
||||
booster = (FatPack) ((FatPack) item).clone();
|
||||
if (value > this.questData.getAssets().getCredits()) {
|
||||
JOptionPane.showMessageDialog(JOptionPane.getRootFrame(),
|
||||
"Not enough credits to purchase " + (qty == 1 ? "" : qty + " copies of ") + item.getName() + ".");
|
||||
continue;
|
||||
}
|
||||
|
||||
if (item instanceof PaperCard) {
|
||||
this.questData.getCards().buyCard((PaperCard) item, qty, value);
|
||||
itemsToAdd.add(item, qty);
|
||||
}
|
||||
else if (item instanceof SealedProduct) {
|
||||
for (int i = 0; i < qty; i++) {
|
||||
SealedProduct booster = null;
|
||||
if (item instanceof BoosterPack) {
|
||||
booster = (BoosterPack) ((BoosterPack) item).clone();
|
||||
}
|
||||
else if (item instanceof TournamentPack) {
|
||||
booster = (TournamentPack) ((TournamentPack) item).clone();
|
||||
}
|
||||
else if (item instanceof FatPack) {
|
||||
booster = (FatPack) ((FatPack) item).clone();
|
||||
}
|
||||
this.questData.getCards().buyPack(booster, value);
|
||||
final List<PaperCard> newCards = booster.getCards();
|
||||
|
||||
itemsToAdd.addAllFlat(newCards);
|
||||
|
||||
final CardListViewer c = new CardListViewer(booster.getName(), "You have found the following cards inside:", newCards);
|
||||
c.show();
|
||||
}
|
||||
}
|
||||
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());
|
||||
}
|
||||
this.questData.getCards().buyPack(booster, value);
|
||||
final List<PaperCard> newCards = booster.getCards();
|
||||
|
||||
ItemPool<InventoryItem> newInventory = new ItemPool<InventoryItem>(InventoryItem.class);
|
||||
newInventory.addAllFlat(newCards);
|
||||
getDeckManager().addItems(newInventory);
|
||||
final CardListViewer c = new CardListViewer(booster.getName(), "You have found the following cards inside:", newCards);
|
||||
c.show();
|
||||
boolean one = (qty == 1);
|
||||
JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), String.format(
|
||||
"%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),
|
||||
deck.getName(), one ? "was" : "were", one ? "Its" : "Their"),
|
||||
"Thanks for purchasing!", JOptionPane.INFORMATION_MESSAGE);
|
||||
}
|
||||
} 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);
|
||||
else {
|
||||
continue; //don't remove item from Catalog if any other type
|
||||
}
|
||||
boolean one = 1 == qty;
|
||||
JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), String.format(
|
||||
"%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),
|
||||
deck.getName(), one ? "was" : "were", one ? "Its" : "Their"),
|
||||
"Thanks for purchasing!", JOptionPane.INFORMATION_MESSAGE);
|
||||
} else return;
|
||||
this.getCatalogManager().removeItem(item, qty);
|
||||
itemsToRemove.add(itemEntry);
|
||||
}
|
||||
|
||||
if (itemsToRemove.isEmpty()) { return; }
|
||||
|
||||
this.getDeckManager().addItems(itemsToAdd);
|
||||
this.getCatalogManager().removeItems(itemsToRemove);
|
||||
|
||||
this.creditsLabel.setText("Credits: " + this.questData.getAssets().getCredits());
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.deckeditor.ACEditorBase#removeCard()
|
||||
* @see forge.gui.deckeditor.ACEditorBase#onRemoveItems()
|
||||
*/
|
||||
@Override
|
||||
public void removeCard(InventoryItem item, boolean toAlternate, int qty) {
|
||||
if ((item == null) || !(item instanceof PaperCard) || showingFullCatalog || toAlternate) {
|
||||
return;
|
||||
protected void onRemoveItems(Iterable<Entry<InventoryItem, Integer>> items, boolean toAlternate) {
|
||||
if (showingFullCatalog || toAlternate) { 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 int qty = itemEntry.getValue();
|
||||
final int price = Math.min((int) (this.multiplier * this.getCardValue(card)), this.questData.getCards().getSellPriceLimit());
|
||||
this.questData.getCards().sellCard(card, qty, price);
|
||||
}
|
||||
}
|
||||
|
||||
final PaperCard card = (PaperCard) item;
|
||||
this.getCatalogManager().addItem(card, qty);
|
||||
this.getDeckManager().removeItem(card, qty);
|
||||
|
||||
final int price = Math.min((int) (this.multiplier * this.getCardValue(card)), this.questData.getCards()
|
||||
.getSellPriceLimit());
|
||||
this.questData.getCards().sellCard(card, qty, price);
|
||||
|
||||
this.creditsLabel.setText("Credits: " + this.questData.getAssets().getCredits());
|
||||
}
|
||||
|
||||
@@ -374,7 +395,6 @@ public final class CEditorQuestCardShop extends ACEditorBase<InventoryItem, Deck
|
||||
if (!showingFullCatalog) {
|
||||
cmb.addMoveItems("Buy", "item", "items", null);
|
||||
}
|
||||
cmb.addTextFilterItem();
|
||||
}
|
||||
|
||||
@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) {
|
||||
return;
|
||||
}
|
||||
@@ -392,7 +412,7 @@ public final class CEditorQuestCardShop extends ACEditorBase<InventoryItem, Deck
|
||||
this.getCatalogManager().addItems(cardsToRemove);
|
||||
this.getDeckManager().removeItems(cardsToRemove);
|
||||
|
||||
for (Map.Entry<InventoryItem, Integer> item : cardsToRemove) {
|
||||
for (Entry<InventoryItem, Integer> item : cardsToRemove) {
|
||||
if (!(item.getKey() instanceof PaperCard)) {
|
||||
continue;
|
||||
}
|
||||
@@ -499,8 +519,8 @@ public final class CEditorQuestCardShop extends ACEditorBase<InventoryItem, Deck
|
||||
this.getBtnRemove4().setCommand(new Command() {
|
||||
@Override
|
||||
public void run() {
|
||||
List<Map.Entry<InventoryItem, Integer>> cardsToRemove = new LinkedList<Map.Entry<InventoryItem,Integer>>();
|
||||
for (Map.Entry<InventoryItem, Integer> item : getDeckManager().getPool()) {
|
||||
List<Entry<InventoryItem, Integer>> cardsToRemove = new LinkedList<Map.Entry<InventoryItem,Integer>>();
|
||||
for (Entry<InventoryItem, Integer> item : getDeckManager().getPool()) {
|
||||
PaperCard card = (PaperCard)item.getKey();
|
||||
int numToKeep = card.getRules().getType().isBasic() ? 50 : 4;
|
||||
if ("Relentless Rats".equals(card.getName())) {
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
package forge.gui.deckeditor.controllers;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import com.google.common.base.Predicate;
|
||||
import com.google.common.base.Supplier;
|
||||
@@ -83,37 +84,32 @@ public final class CEditorVariant extends ACEditorBase<PaperCard, Deck> {
|
||||
//=========== Overridden from ACEditorBase
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.deckeditor.ACEditorBase#addCard()
|
||||
* @see forge.gui.deckeditor.ACEditorBase#onAddItems()
|
||||
*/
|
||||
@Override
|
||||
public void addCard(InventoryItem item, boolean toAlternate, int qty) {
|
||||
if ((item == null) || !(item instanceof PaperCard) || toAlternate) {
|
||||
return;
|
||||
}
|
||||
protected void onAddItems(Iterable<Entry<PaperCard, Integer>> items, boolean toAlternate) {
|
||||
if (toAlternate) { return; }
|
||||
|
||||
final PaperCard card = (PaperCard) item;
|
||||
this.getDeckManager().addItem(card, qty);
|
||||
this.getDeckManager().addItems(items);
|
||||
this.getCatalogManager().selectItemEntrys(items); //just select all added cards in Catalog
|
||||
this.controller.notifyModelChanged();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.deckeditor.ACEditorBase#removeCard()
|
||||
* @see forge.gui.deckeditor.ACEditorBase#onRemoveItems()
|
||||
*/
|
||||
@Override
|
||||
public void removeCard(InventoryItem item, boolean toAlternate, int qty) {
|
||||
if ((item == null) || !(item instanceof PaperCard) || toAlternate) {
|
||||
return;
|
||||
}
|
||||
protected void onRemoveItems(Iterable<Entry<PaperCard, Integer>> items, boolean toAlternate) {
|
||||
if (toAlternate) { return; }
|
||||
|
||||
final PaperCard card = (PaperCard) item;
|
||||
this.getDeckManager().removeItem(card, qty);
|
||||
this.getDeckManager().removeItems(items);
|
||||
this.getCatalogManager().selectItemEntrys(items); //just select all removed cards in Catalog
|
||||
this.controller.notifyModelChanged();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void buildAddContextMenu(ContextMenuBuilder cmb) {
|
||||
cmb.addMoveItems("Move", "card", "cards", "to deck");
|
||||
cmb.addTextFilterItem();
|
||||
}
|
||||
|
||||
@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.ItemView;
|
||||
import forge.item.InventoryItem;
|
||||
import forge.item.PaperCard;
|
||||
import forge.util.Aggregates;
|
||||
import forge.util.ItemPool;
|
||||
import forge.util.ItemPoolView;
|
||||
@@ -253,6 +254,16 @@ public abstract class ItemManager<T extends InventoryItem> extends JPanel {
|
||||
helper.fill(this.viewScroller);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* getGenericType.
|
||||
*
|
||||
* @return generic type of items
|
||||
*/
|
||||
public Class<T> getGenericType() {
|
||||
return this.genericType;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* getCaption.
|
||||
@@ -344,6 +355,26 @@ public abstract class ItemManager<T extends InventoryItem> extends JPanel {
|
||||
return this.table;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* getItemCount.
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public int getItemCount() {
|
||||
return this.table.getCount();
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* getSelectionCount.
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public int getSelectionCount() {
|
||||
return this.table.getSelectionCount();
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* getSelectedItem.
|
||||
@@ -358,9 +389,9 @@ public abstract class ItemManager<T extends InventoryItem> extends JPanel {
|
||||
*
|
||||
* getSelectedItems.
|
||||
*
|
||||
* @return List<T>
|
||||
* @return Iterable<T>
|
||||
*/
|
||||
public List<T> getSelectedItems() {
|
||||
public Iterable<T> getSelectedItems() {
|
||||
return this.table.getSelectedItems();
|
||||
}
|
||||
|
||||
@@ -374,6 +405,30 @@ public abstract class ItemManager<T extends InventoryItem> extends JPanel {
|
||||
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.
|
||||
@@ -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) {
|
||||
this.table.setSelectedIndex(index);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* setSelectedIndices.
|
||||
*
|
||||
* @param indices - Indices to select
|
||||
*/
|
||||
public void setSelectedIndices(Iterable<Integer> indices) {
|
||||
this.table.setSelectedIndices(indices);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* addItem.
|
||||
@@ -402,13 +477,12 @@ public abstract class ItemManager<T extends InventoryItem> extends JPanel {
|
||||
* @param qty
|
||||
*/
|
||||
public void addItem(final T item, int qty) {
|
||||
final int n = this.table.getSelectedIndex();
|
||||
this.pool.add(item, qty);
|
||||
if (this.isUnfiltered()) {
|
||||
this.model.addItem(item, qty);
|
||||
}
|
||||
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
|
||||
*/
|
||||
public void addItems(Iterable<Map.Entry<T, Integer>> itemsToAdd) {
|
||||
final int n = this.table.getSelectedIndex();
|
||||
public void addItems(Iterable<Entry<T, Integer>> itemsToAdd) {
|
||||
this.pool.addAll(itemsToAdd);
|
||||
if (this.isUnfiltered()) {
|
||||
this.model.addItems(itemsToAdd);
|
||||
}
|
||||
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
|
||||
*/
|
||||
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);
|
||||
if (this.isUnfiltered()) {
|
||||
this.model.removeItem(item, qty);
|
||||
}
|
||||
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
|
||||
*/
|
||||
public void removeItems(List<Map.Entry<T, Integer>> itemsToRemove) {
|
||||
final int n = this.table.getSelectedIndex();
|
||||
public void removeItems(Iterable<Map.Entry<T, Integer>> itemsToRemove) {
|
||||
final int selectedIndexBefore = this.getSelectedIndex();
|
||||
final Iterable<T> selectedItemsBefore = this.getSelectedItems();
|
||||
|
||||
for (Map.Entry<T, Integer> item : itemsToRemove) {
|
||||
this.pool.remove(item.getKey(), item.getValue());
|
||||
if (this.isUnfiltered()) {
|
||||
@@ -459,7 +541,29 @@ public abstract class ItemManager<T extends InventoryItem> extends JPanel {
|
||||
}
|
||||
}
|
||||
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() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (table.getCount() > 0 && table.getSelectedIndices().length == 0) {
|
||||
if (table.getCount() > 0 && table.getSelectionCount() == 0) {
|
||||
table.setSelectedIndex(0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -162,33 +162,6 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
|
||||
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;
|
||||
}
|
||||
@@ -214,34 +187,44 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
|
||||
}
|
||||
|
||||
@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());
|
||||
public Iterable<Integer> getSelectedIndices() {
|
||||
List<Integer> indices = new ArrayList<Integer>();
|
||||
int[] selectedRows = this.table.getSelectedRows();
|
||||
for (int i = 0; i < selectedRows.length; i++) {
|
||||
indices.add(selectedRows[i]);
|
||||
}
|
||||
return items;
|
||||
return indices;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setSelectedIndex(int index) {
|
||||
if (!(this.table.getParent() instanceof JViewport)) {
|
||||
return;
|
||||
}
|
||||
JViewport viewport = (JViewport)this.table.getParent();
|
||||
protected void onSetSelectedIndex(int index) {
|
||||
int count = getCount();
|
||||
if (count == 0) { return; }
|
||||
|
||||
if (index >= count) {
|
||||
index = count - 1;
|
||||
}
|
||||
this.table.setRowSelectionInterval(index, index);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onSetSelectedIndices(Iterable<Integer> indices) {
|
||||
int count = getCount();
|
||||
if (count == 0) { return; }
|
||||
|
||||
this.table.clearSelection();
|
||||
for (Integer index : indices) {
|
||||
if (index >= count) {
|
||||
index = count - 1;
|
||||
}
|
||||
this.table.addRowSelectionInterval(index, index);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onScrollSelectionIntoView(JViewport viewport) {
|
||||
// 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();
|
||||
|
||||
// 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.setRowSelectionInterval(index, index);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -279,6 +261,11 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
|
||||
return this.table.getRowCount();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getSelectionCount() {
|
||||
return this.table.getSelectedRowCount();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getIndexAtPoint(Point p) {
|
||||
return this.table.rowAtPoint(p);
|
||||
|
||||
@@ -1,9 +1,12 @@
|
||||
package forge.gui.toolbox.itemmanager.views;
|
||||
|
||||
import java.awt.Container;
|
||||
import java.awt.Point;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import javax.swing.JComponent;
|
||||
import javax.swing.JViewport;
|
||||
|
||||
import forge.gui.toolbox.itemmanager.ItemManager;
|
||||
import forge.item.InventoryItem;
|
||||
@@ -19,10 +22,75 @@ public abstract class ItemView<T extends InventoryItem> {
|
||||
return this.itemManager;
|
||||
}
|
||||
|
||||
public void setSelectedItem(T item) {
|
||||
int index = this.getIndexOfItem(item);
|
||||
public final T getSelectedItem() {
|
||||
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) {
|
||||
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 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 Iterable<Integer> getSelectedIndices();
|
||||
public abstract void selectAll();
|
||||
public abstract int getCount();
|
||||
public abstract int getSelectionCount();
|
||||
public abstract int getIndexAtPoint(Point p);
|
||||
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