diff --git a/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CEditorQuestCardShop.java b/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CEditorQuestCardShop.java index 5c71d95cc64..1993a247641 100644 --- a/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CEditorQuestCardShop.java +++ b/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CEditorQuestCardShop.java @@ -19,7 +19,6 @@ 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; @@ -306,26 +305,41 @@ public final class CEditorQuestCardShop extends ACEditorBase itemsToAdd = new ItemPool(InventoryItem.class); - List> itemsToRemove = new ArrayList>(); - + long totalCost = 0; + ItemPool itemsToBuy = new ItemPool(InventoryItem.class); for (Entry itemEntry : items) { final InventoryItem item = itemEntry.getKey(); + if (item instanceof PaperCard || item instanceof SealedProduct || item instanceof PreconDeck) { + final int qty = itemEntry.getValue(); + itemsToBuy.add(item, qty); + totalCost += qty * this.getCardValue(item); + } + } + if (itemsToBuy.isEmpty()) { return; } + + List itemFlatList = itemsToBuy.toFlatList(); + String suffix = SItemManagerUtil.getItemDisplayString(itemFlatList, 1, true); + String displayList = SItemManagerUtil.buildDisplayList(itemsToBuy); + String title = "Buy " + suffix; + + long creditsShort = totalCost - this.questData.getAssets().getCredits(); + if (creditsShort > 0) { + FOptionPane.showMessageDialog("You need " + creditsShort + " more credits to purchase the following " + suffix.toLowerCase() + ".\n" + displayList, title); + return; + } + + if (!FOptionPane.showConfirmDialog("Pay " + totalCost + " credits to purchase the following " + + suffix.toLowerCase() + "?\n" + displayList, title, "Buy", "Cancel")) { + return; + } + + ItemPool itemsToAdd = new ItemPool(InventoryItem.class); + + for (Entry itemEntry : itemsToBuy) { + final InventoryItem item = itemEntry.getKey(); final int qty = itemEntry.getValue(); final int value = this.getCardValue(item); - final int totalCost = qty * value; - final String title = "Buy " + SItemManagerUtil.getItemDisplayString(item, 1, true); - final String promptSuffix = " credits to purchase " + (qty == 1 ? "'" : qty + " copies of '") + item.getName() + "'"; - - if (totalCost > this.questData.getAssets().getCredits()) { - FOptionPane.showMessageDialog("Not enough" + promptSuffix + ".", title); - continue; - } - - if (!FOptionPane.showConfirmDialog("Pay " + totalCost + promptSuffix + "?", title, "Buy", "Cancel")) { - continue; - } if (item instanceof PaperCard) { this.questData.getCards().buyCard((PaperCard) item, qty, value); @@ -368,16 +382,10 @@ public final class CEditorQuestCardShop extends ACEditorBase> items, boolean toAlternate) { if (showingFullCatalog || toAlternate) { return; } - List> itemsToRemove = new ArrayList>(); - + long totalReceived = 0; + ItemPool itemsToSell = new ItemPool(InventoryItem.class); for (Entry 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()); - final int totalReceived = price * qty; - - if (!FOptionPane.showConfirmDialog("Sell " + (qty == 1 ? "'" : qty + " copies of '") + - item.getName() + "' for " + totalReceived + " credit" + (totalReceived != 1 ? "s" : "") + "?", - "Sell Card", "Sell", "Cancel")) { - continue; - } - - this.questData.getCards().sellCard(card, qty, price); - itemsToRemove.add(itemEntry); + itemsToSell.add(item, qty); + totalReceived += qty * Math.min((int) (this.multiplier * this.getCardValue(item)), this.questData.getCards().getSellPriceLimit()); } } + if (itemsToSell.isEmpty()) { return; } - if (itemsToRemove.isEmpty()) { return; } + List itemFlatList = itemsToSell.toFlatList(); + String suffix = SItemManagerUtil.getItemDisplayString(itemFlatList, 1, true); + String displayList = SItemManagerUtil.buildDisplayList(itemsToSell); + String title = "Sell " + suffix; - this.getCatalogManager().addItems(itemsToRemove); - this.getDeckManager().removeItems(itemsToRemove); + if (!FOptionPane.showConfirmDialog("Sell the following " + suffix.toLowerCase() + " for " + totalReceived + + " credit" + (totalReceived != 1 ? "s" : "") + "?\n" + displayList, title, "Sell", "Cancel")) { + return; + } + + for (Entry itemEntry : itemsToSell) { + final PaperCard card = (PaperCard) itemEntry.getKey(); + 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); + } + + this.getCatalogManager().addItems(itemsToSell); + this.getDeckManager().removeItems(itemsToSell); this.creditsLabel.setText("Credits: " + this.questData.getAssets().getCredits()); } diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/SItemManagerUtil.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/SItemManagerUtil.java index ec55af29e1b..b4ed69a777d 100644 --- a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/SItemManagerUtil.java +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/SItemManagerUtil.java @@ -1,6 +1,10 @@ package forge.gui.toolbox.itemmanager; import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.Map.Entry; + import com.google.common.base.Predicate; import forge.card.CardRules; @@ -157,4 +161,22 @@ public final class SItemManagerUtil { } return result; } + + public static String buildDisplayList(Iterable> items) { + ArrayList> sorted = new ArrayList>(); + for (Entry itemEntry : items) { + sorted.add(itemEntry); + } + Collections.sort(sorted, new Comparator>() { + @Override + public int compare(final Entry x, final Entry y) { + return x.getKey().toString().compareTo(y.getKey().toString()); + } + }); + StringBuilder builder = new StringBuilder(); + for (Entry itemEntry : sorted) { + builder.append("\n" + itemEntry.getValue() + " * " + itemEntry.getKey().toString()); + } + return builder.toString(); + } }