package mage.client.components; import mage.cards.decks.Deck; import mage.client.util.GUISizeHelper; import mage.deck.Commander; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Inject power level info inside validation panel * * @author JayDi85 */ public class EdhPowerLevelLegalityLabel extends LegalityLabel { private final Commander commanderDeckType = new Commander(); private final List foundPowerCards = new ArrayList<>(); public EdhPowerLevelLegalityLabel() { super("EDH Power Level: ?", null); setPreferredSize(DIM_PREFERRED_3_OF_3); } @Override public List selectCards() { // choose cards with power level return this.foundPowerCards; } @Override public void validateDeck(Deck deck) { // find and save power level and card hints List foundInfo = new ArrayList<>(); int level = this.commanderDeckType.getEdhPowerLevel(deck, foundPowerCards, foundInfo); this.setText(String.format("EDH Power Level: %d", level)); // sort by score "+5 from xxx" Pattern pattern = Pattern.compile("\\+(\\d+)"); foundInfo.sort((o1, o2) -> { Matcher matcher = pattern.matcher(o1); int score1 = matcher.find() ? Integer.parseInt(matcher.group(1)) : 0; matcher = pattern.matcher(o2); int score2 = matcher.find() ? Integer.parseInt(matcher.group(1)) : 0; if (score1 != score2) { return Integer.compare(score2, score1); } return o1.compareTo(o2); }); showStateInfo(formatCardsInfoTooltip(level, foundInfo)); } private String formatCardsInfoTooltip(int level, List foundInfo) { // use 60% font for better and compatible list int infoFontSize = Math.round(GUISizeHelper.cardTooltipFont.getSize() * 0.6f); int maxLimit = 25; String extraInfo = this.foundPowerCards.size() <= maxLimit ? "" : String.format("
  • and %d more cards
  • ", this.foundPowerCards.size() - maxLimit); return foundInfo.stream() .limit(maxLimit) .reduce("" + "

    EDH Power Level: " + level + "

    " + "
    " + "Found " + this.foundPowerCards.size() + " cards with power levels (click to select it)" + "
    " + "
      ", (str, info) -> str + String.format("
    • %s
    • ", info), String::concat) + extraInfo + "
    " + ""; } }