diff --git a/Mage.Client/src/main/java/mage/client/cards/DragCardGrid.java b/Mage.Client/src/main/java/mage/client/cards/DragCardGrid.java index c2f57c3b0c3..2701c2fd506 100644 --- a/Mage.Client/src/main/java/mage/client/cards/DragCardGrid.java +++ b/Mage.Client/src/main/java/mage/client/cards/DragCardGrid.java @@ -568,6 +568,8 @@ public class DragCardGrid extends JPanel implements DragCardSource, DragCardTarg void duplicateCards(Collection cards); + void markCardsAsFavorite(Collection cards); + void invertCardSelection(Collection cards); void showAll(); @@ -1181,6 +1183,13 @@ public class DragCardGrid extends JPanel implements DragCardSource, DragCardTarg } } + private void markAsFavorite() { + Collection toFave = dragCardList(); + for (DragCardGridListener l : listeners) { + l.markCardsAsFavorite(toFave); + } + } + private void invertSelection() { Collection toInvert = allCards; for (DragCardGridListener l : listeners) { @@ -1980,6 +1989,10 @@ public class DragCardGrid extends JPanel implements DragCardSource, DragCardTarg JMenuItem duplicateSelection = new JMenuItem("Duplicate selected cards"); duplicateSelection.addActionListener(e2 -> duplicateSelection()); menu.add(duplicateSelection); + + JMenuItem markAsFavorite = new JMenuItem("Mark selected card editions as favorite"); + markAsFavorite.addActionListener(e2 -> markAsFavorite()); + menu.add(markAsFavorite); } menu.show(e.getComponent(), e.getX(), e.getY()); } diff --git a/Mage.Client/src/main/java/mage/client/deckeditor/DeckArea.java b/Mage.Client/src/main/java/mage/client/deckeditor/DeckArea.java index 7ce8d8c987d..2032e4fa068 100644 --- a/Mage.Client/src/main/java/mage/client/deckeditor/DeckArea.java +++ b/Mage.Client/src/main/java/mage/client/deckeditor/DeckArea.java @@ -11,6 +11,7 @@ import mage.client.util.ClientEventType; import mage.client.util.Event; import mage.client.util.GUISizeHelper; import mage.client.util.Listener; +import mage.client.preference.MagePreferences; import mage.view.CardView; import mage.view.CardsView; @@ -113,6 +114,17 @@ public class DeckArea extends javax.swing.JPanel { deckList.addCardView(newCard, card); } } + + @Override + public void markCardsAsFavorite(Collection cards) { + deckList.deselectAll(); + for (CardView card : cards) { + String name = card.getName(); + String setCode = card.getExpansionSetCode(); + String cardNumber = card.getCardNumber(); + MagePreferences.setFavoriteCard(name, cardNumber, setCode); + } + } @Override public void invertCardSelection(Collection cards) { @@ -154,6 +166,17 @@ public class DeckArea extends javax.swing.JPanel { } } + @Override + public void markCardsAsFavorite(Collection cards) { + deckList.deselectAll(); + for (CardView card : cards) { + String name = card.getName(); + String setCode = card.getExpansionSetCode(); + String cardNumber = card.getCardNumber(); + MagePreferences.setFavoriteCard(name, cardNumber, setCode); + } + } + @Override public void invertCardSelection(Collection cards) { // Invert Selection diff --git a/Mage.Client/src/main/java/mage/client/deckeditor/DeckEditorPanel.java b/Mage.Client/src/main/java/mage/client/deckeditor/DeckEditorPanel.java index af9528f5e77..6711f9b085e 100644 --- a/Mage.Client/src/main/java/mage/client/deckeditor/DeckEditorPanel.java +++ b/Mage.Client/src/main/java/mage/client/deckeditor/DeckEditorPanel.java @@ -759,6 +759,7 @@ public class DeckEditorPanel extends javax.swing.JPanel { MageFrame.getDesktop().setCursor(new Cursor(Cursor.WAIT_CURSOR)); try { DeckImporter importer = DeckImporter.getDeckImporter(file.getPath()); + importer.setPreferences(MageFrame.getPreferences()); if (importer != null) { StringBuilder errorMessages = new StringBuilder(); @@ -822,7 +823,13 @@ public class DeckEditorPanel extends javax.swing.JPanel { StringBuilder errorMessages = new StringBuilder(); MageFrame.getDesktop().setCursor(new Cursor(Cursor.WAIT_CURSOR)); try { - Deck deckToAppend = Deck.load(DeckImporter.importDeckFromFile(tempDeckPath, errorMessages, false), true, true); + DeckImporter deckImporter = DeckImporter.getDeckImporter(tempDeckPath); + DeckCardLists deckCardLists = new DeckCardLists(); + if (deckImporter != null) { + deckImporter.setPreferences(MageFrame.getPreferences()); + deckCardLists = deckImporter.importDeck(tempDeckPath, errorMessages, false); + } + Deck deckToAppend = Deck.load(deckCardLists, true, true); processAndShowImportErrors(errorMessages); this.deck = Deck.append(deckToAppend, this.deck); refreshDeck(false, true); @@ -924,7 +931,14 @@ public class DeckEditorPanel extends javax.swing.JPanel { MageFrame.getDesktop().setCursor(new Cursor(Cursor.WAIT_CURSOR)); try { StringBuilder errorMessages = new StringBuilder(); - Deck newDeck = Deck.load(DeckImporter.importDeckFromFile(file, errorMessages, saveAutoFixedFile), true, true); + DeckImporter deckImporter = DeckImporter.getDeckImporter(file); + DeckCardLists deckCardLists = new DeckCardLists(); + if (deckImporter != null) { + deckImporter.setPreferences(MageFrame.getPreferences()); + deckCardLists = deckImporter.importDeck(file, errorMessages, saveAutoFixedFile); + } + + Deck newDeck = Deck.load(deckCardLists, true, true); processAndShowImportErrors(errorMessages); if (newDeck != null) { diff --git a/Mage.Client/src/main/java/mage/client/preference/MagePreferences.java b/Mage.Client/src/main/java/mage/client/preference/MagePreferences.java index e3a3c5ed4f3..ff90769e245 100644 --- a/Mage.Client/src/main/java/mage/client/preference/MagePreferences.java +++ b/Mage.Client/src/main/java/mage/client/preference/MagePreferences.java @@ -18,6 +18,7 @@ public final class MagePreferences { private static final String KEY_PASSWORD = "password"; private static final String KEY_EMAIL = "email"; private static final String KEY_AUTO_CONNECT = "autoConnect"; + private static final String KEY_FAVORITE_CARD_PREFIX = "favoriteCard"; private static final String NODE_KEY_IGNORE_LIST = "ignoreListString"; private static final String NODE_KEY_RESTORE_SESSIONS_LIST = "restoreSessionsListString"; @@ -115,6 +116,26 @@ public final class MagePreferences { prefs().putBoolean(KEY_AUTO_CONNECT, autoConnect); } + public static String getFavoriteCardNumber(String cardName) { + String setAndNumber = prefs().get(prefixedKey(KEY_FAVORITE_CARD_PREFIX, cardName), ""); + if (setAndNumber != null && !setAndNumber.equals("")) { + return setAndNumber.split("##")[1]; + } + return ""; + } + + public static String getFavoriteCardSet(String cardName) { + String setAndNumber = prefs().get(prefixedKey(KEY_FAVORITE_CARD_PREFIX, cardName), ""); + if (setAndNumber != null && !setAndNumber.equals("")) { + return setAndNumber.split("##")[0]; + } + return ""; + } + + public static void setFavoriteCard(String cardName, String cardNumber, String setCode) { + prefs().put(prefixedKey(KEY_FAVORITE_CARD_PREFIX, cardName), setCode + "##" + cardNumber); + } + public static void addIgnoredUser(String serverAddress, String username) { ignoreListNode(serverAddress).putBoolean(username, true); } diff --git a/Mage/src/main/java/mage/cards/decks/importer/DeckImporter.java b/Mage/src/main/java/mage/cards/decks/importer/DeckImporter.java index 33bace18b4f..a436161640a 100644 --- a/Mage/src/main/java/mage/cards/decks/importer/DeckImporter.java +++ b/Mage/src/main/java/mage/cards/decks/importer/DeckImporter.java @@ -5,6 +5,7 @@ import org.apache.log4j.Logger; import java.io.File; import java.util.Locale; +import java.util.prefs.Preferences; import java.util.Scanner; /** @@ -47,6 +48,12 @@ public abstract class DeckImporter { private static final String[] SIDEBOARD_MARKS = new String[]{"//sideboard", "sb: "}; + protected Preferences prefs = null; + + public void setPreferences(Preferences prefs) { + this.prefs = prefs; + } + public static DeckImporter getDeckImporter(String file) { if (file == null) { return null; diff --git a/Mage/src/main/java/mage/cards/decks/importer/TxtDeckImporter.java b/Mage/src/main/java/mage/cards/decks/importer/TxtDeckImporter.java index ccf4b7dcb13..60a9effccae 100644 --- a/Mage/src/main/java/mage/cards/decks/importer/TxtDeckImporter.java +++ b/Mage/src/main/java/mage/cards/decks/importer/TxtDeckImporter.java @@ -10,6 +10,7 @@ import java.util.Arrays; import java.util.HashSet; import java.util.Locale; import java.util.Set; +import java.util.prefs.Preferences; /** * Deck import: text deck, compatible with MTGO and many other apps/services @@ -21,6 +22,7 @@ public class TxtDeckImporter extends PlainTextDeckImporter { private static final String[] SET_VALUES = new String[]{"lands", "creatures", "planeswalkers", "other spells", "sideboard cards", "Instant", "Land", "Enchantment", "Artifact", "Sorcery", "Planeswalker", "Creature"}; private static final Set IGNORE_NAMES = new HashSet<>(Arrays.asList(SET_VALUES)); + private static final String KEY_FAVORITE_CARD_PREFIX = "favoriteCard"; private boolean sideboard = false; private boolean switchSideboardByEmptyLine = true; // all cards after first empty line will be sideboard (like mtgo format) @@ -129,6 +131,16 @@ public class TxtDeckImporter extends PlainTextDeckImporter { wasCardLines = true; CardInfo cardInfo = CardRepository.instance.findPreferredCoreExpansionCard(lineName); + + if (prefs != null) { + String favSetAndNumber = prefs.get(KEY_FAVORITE_CARD_PREFIX + '/' + lineName, ""); + if (favSetAndNumber != null && !favSetAndNumber.equals("")) { + String favoriteSet = favSetAndNumber.split("##")[0]; + String favoriteNumber = favSetAndNumber.split("##")[1]; + cardInfo = CardRepository.instance.findCard(favoriteSet, favoriteNumber); + } + } + if (cardInfo == null) { sbMessage.append("Could not find card: '").append(lineName).append("' at line ").append(lineCount).append('\n'); } else {