diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/DeckImport.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/DeckImport.java index 02ffa64f283..71991bb2bbf 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/DeckImport.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/DeckImport.java @@ -554,7 +554,7 @@ public class DeckImport extends FDialog { } private void activateCardPreview(HyperlinkEvent e) { - // TODO: FOIL and Card Status + // FIXME: Card Status if(e.getEventType() == HyperlinkEvent.EventType.ENTERED || e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { String keyString = e.getDescription(); @@ -675,7 +675,32 @@ public class DeckImport extends FDialog { private void updateSummaries(final List tokens) { this.cStatsView.updateStats(tokens, this.controller.importBannedAndRestrictedCards()); cmdAcceptButton.setEnabled(this.cStatsView.getTotalCardsInDecklist() > 0); - this.resetCardImagePreviewPanel(); + Object displayedCardInPanel = this.cardImagePreview.getDisplayed(); + if (!(displayedCardInPanel instanceof PaperCard)) // also accounts for any null + this.resetCardImagePreviewPanel(); + else { + PaperCard cardDisplayed = (PaperCard) displayedCardInPanel; + // this will return either the same card instance or its [un]foiled version + // null will be returned if not found in card list anymore + cardDisplayed = this.controller.getCardFromDecklist(cardDisplayed); + if (cardDisplayed == null) + this.resetCardImagePreviewPanel(); // current displayed card is not in decklist + else { + if (this.controller.isTokenInListLegal(cardDisplayed)) { + this.cardImagePreview.setItem(cardDisplayed); + this.cardImagePreview.showAsEnabled(); + } else if (this.controller.isTokenInListLimited(cardDisplayed)) { + this.cardImagePreview.setItem(cardDisplayed); + if (this.includeBnRCheck.isSelected()) + this.cardImagePreview.showAsEnabled(); + else + this.cardImagePreview.showAsDisabled(); + } else { // any other card token NOT legal nor limited + this.cardImagePreview.setItem(cardDisplayed); + this.cardImagePreview.showAsDisabled(); + } + } + } } private String toHTML(final DeckRecognizer.Token token) { @@ -721,7 +746,8 @@ public class DeckImport extends FDialog { private String getTokenMessage(DeckRecognizer.Token token){ switch (token.getType()){ case LIMITED_CARD: - return String.format("- %s", Localizer.getInstance().getMessage("lblErrLimitedCard", + return String.format("- %s", WARN_MSG_CLASS, + Localizer.getInstance().getMessage("lblErrLimitedCard", StringUtils.capitalize(token.getLimitedCardType().name()), getGameFormatLabel())); case CARD_FROM_NOT_ALLOWED_SET: return String.format("- %s", Localizer.getInstance().getMessage("lblErrNotAllowedCard", diff --git a/forge-gui/src/main/java/forge/deck/DeckImportController.java b/forge-gui/src/main/java/forge/deck/DeckImportController.java index 7eb12e62563..a4fc491fbf1 100644 --- a/forge-gui/src/main/java/forge/deck/DeckImportController.java +++ b/forge-gui/src/main/java/forge/deck/DeckImportController.java @@ -1,9 +1,7 @@ package forge.deck; import java.text.DateFormatSymbols; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.List; +import java.util.*; import forge.StaticData; import forge.card.CardDb; @@ -34,6 +32,7 @@ public class DeckImportController { private boolean inlcludeBnRInDeck = false; private final List tokens = new ArrayList<>(); + private final Map cardsInTokens = new HashMap<>(); private final boolean currentDeckNotEmpty; private DeckFormat currentDeckFormat; private GameFormat currentGameFormat; @@ -145,6 +144,7 @@ public class DeckImportController { public List parseInput(String input) { tokens.clear(); + cardsInTokens.clear(); DeckRecognizer recognizer = new DeckRecognizer(); // Set Art Preference first thing recognizer.setArtPreference(this.artPreference); @@ -177,11 +177,18 @@ public class DeckImportController { checkAndFixCommanderIn(DeckSection.Commander); } + collectAllCardsInTokens(); return tokens; } - public boolean currentGameFormatAllowsCommander(){ - return this.allowedSections.contains(DeckSection.Commander); + private void collectAllCardsInTokens(){ + cardsInTokens.clear(); + for (Token token : tokens){ + if (!token.isCardToken()) + continue; + PaperCard tokenCard = token.getCard(); + cardsInTokens.put(tokenCard, token); + } } private void checkAndFixCommanderIn(DeckSection targetDeckSection){ @@ -277,6 +284,34 @@ public class DeckImportController { return tokensInSection; } + public boolean currentGameFormatAllowsCommander(){ + return this.allowedSections.contains(DeckSection.Commander); + } + + public PaperCard getCardFromDecklist(final PaperCard card){ + if (cardsInTokens.containsKey(card)) + return card; // found - same instance returned + + // Account for any [un]foiled version + PaperCard cardKey; + if (card.isFoil()) + cardKey = new PaperCard(card.getRules(), card.getEdition(), card.getRarity(), card.getArtIndex(), + false, card.getCollectorNumber(), card.getArtist()); + else + cardKey = card.getFoiled(); + return cardsInTokens.containsKey(cardKey) ? cardsInTokens.get(cardKey).getCard() : null; + } + + public boolean isTokenInListLimited(PaperCard cardKey) { + Token cardToken = this.cardsInTokens.getOrDefault(cardKey, null); + return (cardToken != null) && (cardToken.getType() == TokenType.LIMITED_CARD); + } + + public boolean isTokenInListLegal(PaperCard cardKey) { + Token cardToken = this.cardsInTokens.getOrDefault(cardKey, null); + return (cardToken != null) && (cardToken.getType() == TokenType.LEGAL_CARD); + } + public Deck accept(){ return this.accept(""); } @@ -321,7 +356,7 @@ public class DeckImportController { /* Deck Sections have been already validated for tokens by DeckRecogniser, * plus any other adjustment (like accounting for Commander in Sideboard) has been * already taken care of in previous parseInput. - * Therefore we can safely proceed here by just adding the cards. */ + * Therefore, we can safely proceed here by just adding the cards. */ resultDeck.getOrCreate(deckSection).add(crd, t.getQuantity()); } return resultDeck;