diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/CardManager.java b/forge-gui-desktop/src/main/java/forge/itemmanager/CardManager.java index 9b40e9856b4..86c4f82c562 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/CardManager.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/CardManager.java @@ -1,5 +1,7 @@ package forge.itemmanager; +import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map.Entry; @@ -11,21 +13,8 @@ import forge.gamemodes.quest.QuestWorld; import forge.gamemodes.quest.data.QuestPreferences; import forge.gui.GuiUtils; import forge.item.PaperCard; -import forge.itemmanager.filters.AdvancedSearchFilter; -import forge.itemmanager.filters.CardCMCFilter; -import forge.itemmanager.filters.CardCMCRangeFilter; -import forge.itemmanager.filters.CardColorFilter; -import forge.itemmanager.filters.CardFoilFilter; -import forge.itemmanager.filters.CardFormatFilter; -import forge.itemmanager.filters.CardPowerFilter; -import forge.itemmanager.filters.CardQuestWorldFilter; -import forge.itemmanager.filters.CardRatingFilter; -import forge.itemmanager.filters.CardSearchFilter; -import forge.itemmanager.filters.CardSetFilter; -import forge.itemmanager.filters.CardToughnessFilter; -import forge.itemmanager.filters.CardTypeFilter; -import forge.itemmanager.filters.FormatFilter; -import forge.itemmanager.filters.ItemFilter; +import forge.itemmanager.filters.*; +import forge.localinstance.properties.ForgePreferences; import forge.model.FModel; import forge.screens.home.quest.DialogChooseFormats; import forge.screens.home.quest.DialogChooseSets; @@ -156,12 +145,34 @@ public class CardManager extends ItemManager { GuiUtils.addMenuItem(world, w.getName(), null, new Runnable() { @Override public void run() { - itemManager.addFilter(new CardQuestWorldFilter(itemManager, w, false)); + itemManager.addFilter(new CardQuestWorldFilter(itemManager, w)); } }, CardQuestWorldFilter.canAddQuestWorld(w, itemManager.getFilter(CardQuestWorldFilter.class))); } menu.add(world); + if (FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.LOAD_HISTORIC_FORMATS)) { + JMenu blocks = GuiUtils.createMenu(localizer.getMessage("lblBlock")); + List blockFormats = new ArrayList<>(); + for (GameFormat format : FModel.getFormats().getHistoricList()){ + if (format.getFormatSubType() != GameFormat.FormatSubType.BLOCK) + continue; + if (!format.getName().endsWith("Block")) + continue; + blockFormats.add(format); + } + Collections.sort(blockFormats); // GameFormat will be sorted by Index! + for (final GameFormat f : blockFormats) { + GuiUtils.addMenuItem(blocks, f.getName(), null, new Runnable() { + @Override + public void run() { + itemManager.addFilter(new CardBlockFilter(itemManager, f)); + } + }, CardBlockFilter.canAddCardBlockWorld(f, itemManager.getFilter(CardBlockFilter.class))); + } + menu.add(blocks); + } + GuiUtils.addSeparator(menu); GuiUtils.addMenuItem(menu, localizer.getMessage("lblColors"), null, new Runnable() { diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardBlockFilter.java b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardBlockFilter.java new file mode 100644 index 00000000000..174bb79fb1f --- /dev/null +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardBlockFilter.java @@ -0,0 +1,79 @@ +package forge.itemmanager.filters; + +import forge.game.GameFormat; +import forge.item.PaperCard; +import forge.itemmanager.ItemManager; +import forge.model.FModel; + +import java.util.*; + + +public class CardBlockFilter extends CardSetFilter { + + private final Set selectedBlocks = new HashSet<>(); + private GameFormat cardBlock = null; + + public CardBlockFilter(final ItemManager itemManager0, final GameFormat cardBlock) { + super(itemManager0, cardBlock.getAllowedSetCodes(), false); + this.formats.add(cardBlock); + this.selectedBlocks.add(cardBlock); + } + + private CardBlockFilter(final ItemManager itemManager0, GameFormat cardBlock, + Set selectedBlocks){ + this(itemManager0, cardBlock); + this.selectedBlocks.addAll(selectedBlocks); + } + + @Override + public ItemFilter createCopy() { + return new CardBlockFilter(itemManager, this.cardBlock, this.selectedBlocks); + } + + public static boolean canAddCardBlockWorld(final GameFormat cardBlock, final ItemFilter existingFilter) { + if (cardBlock == null || FModel.getBlocks() == null) { + return false; //must have format + } + return existingFilter == null || !((CardBlockFilter)existingFilter).selectedBlocks.contains(cardBlock); + } + + /** + * Merge the given filter with this filter if possible + * @param filter + * @return true if filter merged in or to suppress adding a new filter, false to allow adding new filter + */ + @Override + public boolean merge(final ItemFilter filter) { + final CardBlockFilter cardBlockFilter = (CardBlockFilter)filter; + this.selectedBlocks.addAll(cardBlockFilter.selectedBlocks); + this.sets.addAll(cardBlockFilter.sets); + List allBannedCards = new ArrayList<>(); + for (GameFormat f : this.formats){ + List bannedCards = f.getBannedCardNames(); + if (bannedCards != null && bannedCards.size() > 0) + allBannedCards.addAll(bannedCards); + } + this.formats.clear(); + this.formats.add(new GameFormat(null, this.sets, allBannedCards)); + return true; + } + + @Override + protected String getCaption() { + return "Block"; + } + + @Override + protected int getCount() { + return this.selectedBlocks.size(); + } + + @Override + protected Iterable getList() { + final Set strings = new HashSet<>(); + for (final GameFormat f : this.selectedBlocks) { + strings.add(f.getName()); + } + return strings; + } +} diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties index b9d6a0820bb..328506ca862 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -904,6 +904,7 @@ lblCard=Card lblFormat=Format lblFormats=Formats lblQuestWorld=Quest World +lblBlock=Block lblSets=Sets lblTypes=Types lblConvertedManaCosts=Converted mana