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:
drdev
2013-12-23 03:03:33 +00:00
parent 77de4abfd1
commit 689ef0cf8a
13 changed files with 550 additions and 340 deletions

View File

@@ -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();
}

View File

@@ -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);

View File

@@ -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

View File

@@ -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

View File

@@ -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()
/**

View File

@@ -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

View File

@@ -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

View File

@@ -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())) {

View File

@@ -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

View File

@@ -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);
}
}

View File

@@ -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);

View File

@@ -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);
}