package forge; import forge.properties.NewConstants; import java.util.ArrayList; import java.util.Comparator; /** * <p>TableSorter class.</p> * * @author Forge * @version $Id: $ */ @SuppressWarnings("unchecked") // Comparable needs <type> public class TableSorter implements Comparator<Card>, NewConstants { private final int column; private boolean ascending; private boolean col7mod; private CardList all; //used by compare() @SuppressWarnings("rawtypes") private Comparable aCom = null; @SuppressWarnings("rawtypes") private Comparable bCom = null; //used if in_column is 7, new cards first - the order is based on cards.txt //static because this should only be read once //static to try to reduce file io operations //private static HashMap<String, Integer> cardsTxt = null; // 0 1 2 3 4 5 6 7 //private String column[] = {"Qty", "Name", "Cost", "Color", "Type", "Stats", "Rarity"}; New cards first - the order is based on cards.txt /** * <p>Constructor for TableSorter.</p> * * @param in_all a {@link forge.CardList} object. * @param in_column a int. * @param in_ascending a boolean. */ public TableSorter(CardList in_all, int in_column, boolean in_ascending) { all = new CardList(in_all.toArray()); column = in_column; ascending = in_ascending; } /** * <p>Constructor for TableSorter.</p> * * @param in_all a {@link forge.CardList} object. * @param in_column a int. * @param in_ascending a boolean. * @param in_col7mod a boolean. */ public TableSorter(CardList in_all, int in_column, boolean in_ascending, boolean in_col7mod) { all = new CardList(in_all.toArray()); column = in_column; ascending = in_ascending; col7mod = in_col7mod; } /** * <p>compare.</p> * * @param a a {@link forge.Card} object. * @param b a {@link forge.Card} object. * @return a int. */ final public int compare(Card a, Card b) { if (column == 0)//Qty { aCom = Integer.valueOf(countCardName(a.getName(), all)); bCom = Integer.valueOf(countCardName(b.getName(), all)); } else if (column == 1)//Name { aCom = a.getName(); bCom = b.getName(); } else if (column == 2)//Cost { aCom = Double.valueOf(CardUtil.getWeightedManaCost(a.getManaCost())); bCom = Double.valueOf(CardUtil.getWeightedManaCost(b.getManaCost())); if (a.isLand()) aCom = Double.valueOf(-1); if (b.isLand()) bCom = Double.valueOf(-1); } else if (column == 3)//Color { aCom = getColor(a); bCom = getColor(b); } else if (column == 4)//Type { aCom = getType(a); bCom = getType(b); } else if (column == 5)//Stats, attack and defense { if (a.isCreature()) { aCom = a.getBaseAttackString() + "." + a.getBaseDefenseString(); } else { aCom = ""; } if (b.isCreature()) { bCom = b.getBaseAttackString() + "." + b.getBaseDefenseString(); } else { bCom = ""; } } else if (column == 6)//Rarity { aCom = getRarity(a); bCom = getRarity(b); } else if (column == 7 && col7mod == false)//Value { aCom = getValue(a); bCom = getValue(b); } else if (column == 7 && col7mod == true)//Set { aCom = SetInfoUtil.getSetIndex(a.getCurSetCode()); bCom = SetInfoUtil.getSetIndex(b.getCurSetCode()); } else if (column == 8)//AI { aCom = getAI(a); bCom = getAI(b); } /*else if (column == 99)//New First { aCom = sortNewFirst(a); bCom = sortNewFirst(b); }*/ if (ascending) return aCom.compareTo(bCom); else return bCom.compareTo(aCom); }//compare() /** * <p>countCardName.</p> * * @param name a {@link java.lang.String} object. * @param c a {@link forge.CardList} object. * @return a int. */ final private int countCardName(String name, CardList c) { int count = 0; for (int i = 0; i < c.size(); i++) if (name.equals(c.get(i).getName())) count++; return count; } /** * <p>getRarity.</p> * * @param c a {@link forge.Card} object. * @return a {@link java.lang.Integer} object. */ final private Integer getRarity(Card c) { String rarity = c.getRarity(); if (rarity.equals("new")) return 1; if (!c.getCurSetCode().equals("")) { SetInfo si = SetInfoUtil.getSetInfo_Code(c.getSets(), c.getCurSetCode()); if (si != null) rarity = si.Rarity; } if (rarity.equals("Common")) return 2; else if (rarity.equals("Uncommon")) return 3; else if (rarity.equals("Rare")) return 4; else if (rarity.equals("Mythic")) return 5; else if (rarity.equals("Special")) return 6; else if (rarity.equals("Land")) return 7; else return 8; // This older form of the method no longer works as it is not compatible with set info. /* if(c.getRarity().equals("Common")) return Integer.valueOf(1); else if(c.getRarity().equals("Uncommon")) return Integer.valueOf(2); else if(c.getRarity().equals("Rare")) return Integer.valueOf(3); else if(c.getRarity().equals("Land")) return Integer.valueOf(4); else return Integer.valueOf(5); */ } /** * <p>getValue.</p> * * @param c a {@link forge.Card} object. * @return a {@link java.lang.Long} object. */ final private Long getValue(Card c) { return c.getValue(); } /** * <p>getColor.</p> * * @param c a {@link forge.Card} object. * @return a {@link java.lang.String} object. */ final public static String getColor(Card c) { ArrayList<String> list = CardUtil.getColors(c); if (list.size() == 1) return list.get(0).toString(); return "multi"; } /** * <p>getAI.</p> * * @param c a {@link forge.Card} object. * @return a {@link java.lang.Integer} object. */ final private Integer getAI(Card c) { if (c.getSVar("RemAIDeck").equals("True") && c.getSVar("RemRandomDeck").equals("True")) return Integer.valueOf(3); else if (c.getSVar("RemAIDeck").equals("True")) return Integer.valueOf(4); else if (c.getSVar("RemRandomDeck").equals("True")) return Integer.valueOf(2); else return Integer.valueOf(1); } /** * <p>getType.</p> * * @param c a {@link forge.Card} object. * @return a {@link java.lang.Comparable} object. */ final private Comparable<String> getType(Card c) { return c.getType().toString(); } }