diff --git a/.gitattributes b/.gitattributes index 47a862454e8..846b282493f 100644 --- a/.gitattributes +++ b/.gitattributes @@ -9803,6 +9803,7 @@ src/main/java/forge/gui/deckeditor/DeckEditorQuestMenu.java svneol=native#text/p src/main/java/forge/gui/deckeditor/DeckEditorShop.java svneol=native#text/plain src/main/java/forge/gui/deckeditor/FilterCheckBoxes.java -text src/main/java/forge/gui/deckeditor/GuiFilterCheckBox.java svneol=native#text/plain +src/main/java/forge/gui/deckeditor/ManaCostRenderer.java -text src/main/java/forge/gui/deckeditor/PresetColumns.java -text src/main/java/forge/gui/deckeditor/TableColumnInfo.java -text src/main/java/forge/gui/deckeditor/TableModel.java svneol=native#text/plain diff --git a/src/main/java/forge/card/CardManaCost.java b/src/main/java/forge/card/CardManaCost.java index 84da68adf57..5691ca1afa7 100644 --- a/src/main/java/forge/card/CardManaCost.java +++ b/src/main/java/forge/card/CardManaCost.java @@ -1,6 +1,7 @@ package forge.card; import java.util.ArrayList; +import java.util.Collections; import java.util.Iterator; import java.util.List; @@ -12,9 +13,9 @@ import java.util.List; */ public final class CardManaCost implements Comparable { - private final List shards = new ArrayList(); + private final List shards; private final int genericCost; - private final boolean isEmpty; // lands cost + private final boolean hasNoCost; // lands cost private final String stringValue; // precalculated for toString; private Float compareWeight = null; @@ -23,9 +24,10 @@ public final class CardManaCost implements Comparable { // pass mana cost parser here private CardManaCost() { - isEmpty = true; + hasNoCost = true; genericCost = 0; stringValue = ""; + shards = Collections.unmodifiableList(new ArrayList()); } // public ctor, should give it a mana parser @@ -33,13 +35,16 @@ public final class CardManaCost implements Comparable { if (!parser.hasNext()) { throw new RuntimeException("Empty manacost passed to parser (this should have been handled before)"); } - isEmpty = false; + List shardsTemp = new ArrayList(); + hasNoCost = false; while (parser.hasNext()) { CardManaCostShard shard = parser.next(); - if (shard != null) { shards.add(shard); } // null is OK - that was generic mana + if (shard != null) { shardsTemp.add(shard); } // null is OK - that was generic mana } genericCost = parser.getTotalColorlessCost(); // collect generic mana here + shards = Collections.unmodifiableList(shardsTemp); stringValue = getSimpleString(); + } private String getSimpleString() { @@ -68,13 +73,18 @@ public final class CardManaCost implements Comparable { return result; } + public List getShards() { return shards; } + public int getGenericCost() { return genericCost; } + public boolean isEmpty() { return hasNoCost; } + public boolean isPureGeneric() { return shards.isEmpty() && !isEmpty(); } + @Override public int compareTo(final CardManaCost o) { return getCompareWeight().compareTo(o.getCompareWeight()); } private Float getCompareWeight() { if (compareWeight == null) { float weight = genericCost; for (CardManaCostShard s : shards) { weight += s.cmpc; } - if (isEmpty) { + if (hasNoCost) { weight = -1; // for those who doesn't even have a 0 sign on card } compareWeight = Float.valueOf(weight); diff --git a/src/main/java/forge/card/CardManaCostShard.java b/src/main/java/forge/card/CardManaCostShard.java index a8950ee78cd..35ae6482185 100644 --- a/src/main/java/forge/card/CardManaCostShard.java +++ b/src/main/java/forge/card/CardManaCostShard.java @@ -6,11 +6,18 @@ public class CardManaCostShard { public final int cmc; public final float cmpc; private final String stringValue; - protected CardManaCostShard(int value, String sValue) { + public final String imageKey; + + protected CardManaCostShard(final int value, final String sValue) { + this(value, sValue, sValue); + } + + protected CardManaCostShard(final int value, final String sValue, final String imgKey) { shard = value; cmc = getCMC(); cmpc = getCmpCost(); stringValue = sValue; + imageKey = imgKey; } public interface Atom { @@ -44,28 +51,28 @@ public class CardManaCostShard { public static final CardManaCostShard RED = new CardManaCostShard(Atom.RED, "R"); public static final CardManaCostShard GREEN = new CardManaCostShard(Atom.GREEN, "G"); - public static final CardManaCostShard PW = new CardManaCostShard(Atom.WHITE | Atom.OR_2_LIFE, "W/P"); - public static final CardManaCostShard PU = new CardManaCostShard(Atom.BLUE | Atom.OR_2_LIFE, "U/P"); - public static final CardManaCostShard PB = new CardManaCostShard(Atom.BLACK | Atom.OR_2_LIFE, "B/P"); - public static final CardManaCostShard PR = new CardManaCostShard(Atom.RED | Atom.OR_2_LIFE, "R/P"); - public static final CardManaCostShard PG = new CardManaCostShard(Atom.GREEN | Atom.OR_2_LIFE, "G/P"); + public static final CardManaCostShard PW = new CardManaCostShard(Atom.WHITE | Atom.OR_2_LIFE, "W/P", "PW"); + public static final CardManaCostShard PU = new CardManaCostShard(Atom.BLUE | Atom.OR_2_LIFE, "U/P", "PU"); + public static final CardManaCostShard PB = new CardManaCostShard(Atom.BLACK | Atom.OR_2_LIFE, "B/P", "PB"); + public static final CardManaCostShard PR = new CardManaCostShard(Atom.RED | Atom.OR_2_LIFE, "R/P", "PR"); + public static final CardManaCostShard PG = new CardManaCostShard(Atom.GREEN | Atom.OR_2_LIFE, "G/P", "PG"); - public static final CardManaCostShard WU = new CardManaCostShard(Atom.WHITE | Atom.BLUE, "W/U"); - public static final CardManaCostShard WB = new CardManaCostShard(Atom.WHITE | Atom.BLACK, "W/B"); - public static final CardManaCostShard WR = new CardManaCostShard(Atom.WHITE | Atom.RED, "W/R"); - public static final CardManaCostShard WG = new CardManaCostShard(Atom.WHITE | Atom.GREEN, "W/G"); - public static final CardManaCostShard UB = new CardManaCostShard(Atom.BLUE | Atom.BLACK, "U/B"); - public static final CardManaCostShard UR = new CardManaCostShard(Atom.BLUE | Atom.RED, "U/R"); - public static final CardManaCostShard UG = new CardManaCostShard(Atom.BLUE | Atom.GREEN, "U/G"); - public static final CardManaCostShard BR = new CardManaCostShard(Atom.BLACK | Atom.RED, "B/R"); - public static final CardManaCostShard BG = new CardManaCostShard(Atom.BLACK | Atom.GREEN, "B/G"); - public static final CardManaCostShard RG = new CardManaCostShard(Atom.RED | Atom.GREEN, "R/G"); + public static final CardManaCostShard WU = new CardManaCostShard(Atom.WHITE | Atom.BLUE, "W/U", "WB"); + public static final CardManaCostShard WB = new CardManaCostShard(Atom.WHITE | Atom.BLACK, "W/B", "WU"); + public static final CardManaCostShard WR = new CardManaCostShard(Atom.WHITE | Atom.RED, "W/R", "RW"); + public static final CardManaCostShard WG = new CardManaCostShard(Atom.WHITE | Atom.GREEN, "W/G", "GW"); + public static final CardManaCostShard UB = new CardManaCostShard(Atom.BLUE | Atom.BLACK, "U/B", "UB"); + public static final CardManaCostShard UR = new CardManaCostShard(Atom.BLUE | Atom.RED, "U/R", "UR"); + public static final CardManaCostShard UG = new CardManaCostShard(Atom.BLUE | Atom.GREEN, "U/G", "GU"); + public static final CardManaCostShard BR = new CardManaCostShard(Atom.BLACK | Atom.RED, "B/R", "BR"); + public static final CardManaCostShard BG = new CardManaCostShard(Atom.BLACK | Atom.GREEN, "B/G", "BG"); + public static final CardManaCostShard RG = new CardManaCostShard(Atom.RED | Atom.GREEN, "R/G", "RG"); - public static final CardManaCostShard W2 = new CardManaCostShard(Atom.WHITE | Atom.OR_2_COLORLESS, "2/W"); - public static final CardManaCostShard U2 = new CardManaCostShard(Atom.BLUE | Atom.OR_2_COLORLESS, "2/U"); - public static final CardManaCostShard B2 = new CardManaCostShard(Atom.BLACK | Atom.OR_2_COLORLESS, "2/B"); - public static final CardManaCostShard R2 = new CardManaCostShard(Atom.RED | Atom.OR_2_COLORLESS, "2/R"); - public static final CardManaCostShard G2 = new CardManaCostShard(Atom.GREEN | Atom.OR_2_COLORLESS, "2/G"); + public static final CardManaCostShard W2 = new CardManaCostShard(Atom.WHITE | Atom.OR_2_COLORLESS, "2/W", "2W"); + public static final CardManaCostShard U2 = new CardManaCostShard(Atom.BLUE | Atom.OR_2_COLORLESS, "2/U", "2U"); + public static final CardManaCostShard B2 = new CardManaCostShard(Atom.BLACK | Atom.OR_2_COLORLESS, "2/B", "2B"); + public static final CardManaCostShard R2 = new CardManaCostShard(Atom.RED | Atom.OR_2_COLORLESS, "2/R", "2R"); + public static final CardManaCostShard G2 = new CardManaCostShard(Atom.GREEN | Atom.OR_2_COLORLESS, "2/G", "2G"); private static final CardManaCostShard[] allPossible = new CardManaCostShard[] { X, WHITE, BLUE, BLACK, RED, GREEN, diff --git a/src/main/java/forge/gui/deckeditor/DeckEditor.java b/src/main/java/forge/gui/deckeditor/DeckEditor.java index 38a64d1ac60..547f298d177 100644 --- a/src/main/java/forge/gui/deckeditor/DeckEditor.java +++ b/src/main/java/forge/gui/deckeditor/DeckEditor.java @@ -115,15 +115,16 @@ public final class DeckEditor extends DeckEditorBase implements NewConstants { private void setup() { List> columns = new ArrayList>(); columns.add(new TableColumnInfo("Qty", 30, PresetColumns.fnQtyCompare, PresetColumns.fnQtyGet)); - columns.add(new TableColumnInfo("Name", 180, PresetColumns.fnNameCompare, PresetColumns.fnNameGet)); - columns.add(new TableColumnInfo("Cost", 70, PresetColumns.fnCostCompare, PresetColumns.fnCostGet)); + columns.add(new TableColumnInfo("Name", 175, PresetColumns.fnNameCompare, PresetColumns.fnNameGet)); + columns.add(new TableColumnInfo("Cost", 75, PresetColumns.fnCostCompare, PresetColumns.fnCostGet)); columns.add(new TableColumnInfo("Color", 50, PresetColumns.fnColorCompare, PresetColumns.fnColorGet)); columns.add(new TableColumnInfo("Type", 100, PresetColumns.fnTypeCompare, PresetColumns.fnTypeGet)); columns.add(new TableColumnInfo("Stats", 40, PresetColumns.fnStatsCompare, PresetColumns.fnStatsGet)); columns.add(new TableColumnInfo("R", 35, PresetColumns.fnRarityCompare, PresetColumns.fnRarityGet)); columns.add(new TableColumnInfo("Set", 40, PresetColumns.fnSetCompare, PresetColumns.fnSetGet)); columns.add(new TableColumnInfo("AI", 30, PresetColumns.fnAiStatusCompare, PresetColumns.fnAiStatusGet)); - + columns.get(2).setCellRenderer(new ManaCostRenderer()); + top.setup(columns, cardView); bottom.setup(columns, cardView); diff --git a/src/main/java/forge/gui/deckeditor/ManaCostRenderer.java b/src/main/java/forge/gui/deckeditor/ManaCostRenderer.java new file mode 100644 index 00000000000..3b5f20535d2 --- /dev/null +++ b/src/main/java/forge/gui/deckeditor/ManaCostRenderer.java @@ -0,0 +1,62 @@ +package forge.gui.deckeditor; + +import java.awt.Component; +import java.awt.Graphics; +import java.util.List; + +import javax.swing.JTable; +import javax.swing.table.DefaultTableCellRenderer; +import arcane.ui.util.ManaSymbols; + +import forge.card.CardManaCostShard; +import forge.card.CardManaCost; + +/** + * Displays mana cost as symbols. + */ +public class ManaCostRenderer extends DefaultTableCellRenderer { + private static final long serialVersionUID = 1770527102334163549L; + + private CardManaCost value; + + @Override + public Component getTableCellRendererComponent(final JTable table, final Object value, + final boolean isSelected, final boolean hasFocus, final int row, final int column) + { + this.value = (CardManaCost) value; + setToolTipText(this.value.toString()); + return super.getTableCellRendererComponent(table, "", isSelected, hasFocus, row, column); + } + + @Override + public void paint(final Graphics g) { + super.paint(g); + + final int elemtWidth = 13; + final int elemtGap = 0; + final int padding = 1; + + float xpos = padding; + + int genericManaCost = value.getGenericCost(); + boolean hasGeneric = genericManaCost > 0 || value.isPureGeneric(); + List shards = value.getShards(); + + int cellWidth = getWidth(); + int cntGlyphs = hasGeneric ? shards.size() + 1 : shards.size(); + float offsetIfNoSpace = cntGlyphs > 1 ? (cellWidth - padding - elemtWidth) / (cntGlyphs - 1f) : elemtWidth + elemtGap; + float offset = Math.min(elemtWidth + elemtGap, offsetIfNoSpace); + + if (hasGeneric) { + String sGeneric = Integer.toString(genericManaCost); + ManaSymbols.drawSymbol(sGeneric, g, (int) xpos, 1); + xpos += offset; + } + + for (CardManaCostShard s : shards) { + ManaSymbols.drawSymbol(s.imageKey, g, (int) xpos, 1); + xpos += offset; + } + } + +} diff --git a/src/main/java/forge/gui/deckeditor/PresetColumns.java b/src/main/java/forge/gui/deckeditor/PresetColumns.java index 559832c6686..b4e69209949 100644 --- a/src/main/java/forge/gui/deckeditor/PresetColumns.java +++ b/src/main/java/forge/gui/deckeditor/PresetColumns.java @@ -34,7 +34,7 @@ public abstract class PresetColumns { public Comparable apply(final Entry from) { return from.getKey().getCard().getManaCost(); } }; public static final Lambda1> fnCostGet = new Lambda1>() { @Override - public Object apply(final Entry from) { return from.getKey().getCard().getManaCost().toString(); } }; + public Object apply(final Entry from) { return from.getKey().getCard().getManaCost(); } }; @SuppressWarnings("rawtypes") public static final Lambda1> fnColorCompare = diff --git a/src/main/java/forge/gui/deckeditor/TableColumnInfo.java b/src/main/java/forge/gui/deckeditor/TableColumnInfo.java index 03809bb3c42..7d911be790a 100644 --- a/src/main/java/forge/gui/deckeditor/TableColumnInfo.java +++ b/src/main/java/forge/gui/deckeditor/TableColumnInfo.java @@ -2,6 +2,8 @@ package forge.gui.deckeditor; import java.util.Map.Entry; +import javax.swing.table.TableCellRenderer; + import net.slightlymagic.braids.util.lambda.Lambda1; /** @@ -23,6 +25,8 @@ import net.slightlymagic.braids.util.lambda.Lambda1; public final Lambda1> fnSort; // this will be used for sorting public final Lambda1> fnDisplay; // this is used to display + private TableCellRenderer cellRenderer = null; + public final String getName() { return name; } public TableColumnInfo(final String colName, @@ -49,5 +53,14 @@ import net.slightlymagic.braids.util.lambda.Lambda1; this.minWidth = wMin; this.nominalWidth = width; } + + + public void setCellRenderer(final TableCellRenderer renderer) { + cellRenderer = renderer; + } + + public final TableCellRenderer getCellRenderer() { + return cellRenderer; + } } diff --git a/src/main/java/forge/gui/deckeditor/TableWithCards.java b/src/main/java/forge/gui/deckeditor/TableWithCards.java index f99057e118d..a2e9055359e 100644 --- a/src/main/java/forge/gui/deckeditor/TableWithCards.java +++ b/src/main/java/forge/gui/deckeditor/TableWithCards.java @@ -11,6 +11,7 @@ import javax.swing.JTable; import javax.swing.border.TitledBorder; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; +import javax.swing.table.TableCellRenderer; import net.slightlymagic.maxmtg.Predicate; @@ -64,6 +65,13 @@ public final class TableWithCards { table.setModel(model); model.resizeCols(table); + for (int idx = columns.size() - 1; idx >= 0; idx--) { + TableCellRenderer renderer = columns.get(idx).getCellRenderer(); + if (null != renderer) { + table.getColumnModel().getColumn(idx).setCellRenderer(renderer); + } + } + if (isTrackingStats) { // get stats from deck model.addTableModelListener(new TableModelListener() {