diff --git a/.gitattributes b/.gitattributes index c2e05e843ae..fd2ac2f2e9b 100644 --- a/.gitattributes +++ b/.gitattributes @@ -15481,8 +15481,8 @@ forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/TextSearchFilter.j forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/ToggleButtonsFilter.java -text forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/ValueRangeFilter.java -text forge-gui/src/main/java/forge/gui/toolbox/itemmanager/package-info.java -text -forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/AlwaysShowToolTip.java -text forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/IntegerRenderer.java -text +forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ItemCellRenderer.java -text forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ItemListView.java -text forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ItemView.java -text forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ManaCostRenderer.java -text diff --git a/forge-core/src/main/java/forge/card/CardPreferences.java b/forge-core/src/main/java/forge/card/CardPreferences.java index 16084d8d2ba..415a0b9c893 100644 --- a/forge-core/src/main/java/forge/card/CardPreferences.java +++ b/forge-core/src/main/java/forge/card/CardPreferences.java @@ -1,24 +1,119 @@ package forge.card; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.util.Iterator; import java.util.Map; import java.util.HashMap; +import javax.xml.stream.XMLEventFactory; +import javax.xml.stream.XMLEventReader; +import javax.xml.stream.XMLEventWriter; +import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLOutputFactory; +import javax.xml.stream.events.Attribute; +import javax.xml.stream.events.StartElement; +import javax.xml.stream.events.XMLEvent; + /** * Preferences associated with individual cards * */ public class CardPreferences { + private static final XMLEventFactory EVENT_FACTORY = XMLEventFactory.newInstance(); + private static final XMLEvent NEWLINE = EVENT_FACTORY.createDTD("\n"); + private static final XMLEvent TAB = EVENT_FACTORY.createDTD("\t"); private static Map allPrefs = new HashMap(); - public static CardPreferences getPrefs(String key) { - CardPreferences prefs = allPrefs.get(key); + public static CardPreferences getPrefs(String name) { + CardPreferences prefs = allPrefs.get(name); if (prefs == null) { prefs = new CardPreferences(); - allPrefs.put(key, prefs); + allPrefs.put(name, prefs); } return prefs; } + public static void load(String filename) { + allPrefs.clear(); + + try { + final XMLInputFactory in = XMLInputFactory.newInstance(); + final XMLEventReader reader = in.createXMLEventReader(new FileInputStream(filename)); + + XMLEvent event; + StartElement element; + Iterator attributes; + Attribute attribute; + String tagname; + CardPreferences prefs; + + while (reader.hasNext()) { + event = reader.nextEvent(); + + if (event.isStartElement()) { + element = event.asStartElement(); + tagname = element.getName().getLocalPart(); + + if (tagname.equals("card")) { + prefs = new CardPreferences(); + attributes = element.getAttributes(); + + while (attributes.hasNext()) { + attribute = (Attribute) attributes.next(); + switch (attribute.getName().toString()) { + case "name": + allPrefs.put(attribute.getValue(), prefs); + break; + case "stars": + prefs.starCount = Integer.parseInt(attribute.getValue()); + break; + } + } + } + } + } + } + catch (final FileNotFoundException e) { + /* ignore; it's ok if this file doesn't exist */ + } + catch (final Exception e) { + e.printStackTrace(); + } + } + + public static void save(String filename) { + try { + final XMLOutputFactory out = XMLOutputFactory.newInstance(); + final XMLEventWriter writer = out.createXMLEventWriter(new FileOutputStream(filename)); + + writer.add(EVENT_FACTORY.createStartDocument()); + writer.add(NEWLINE); + writer.add(EVENT_FACTORY.createStartElement("", "", "preferences")); + writer.add(EVENT_FACTORY.createAttribute("type", "cards")); + writer.add(NEWLINE); + + for (Map.Entry entry : allPrefs.entrySet()) { + if (entry.getValue().starCount > 0) { + writer.add(TAB); + writer.add(EVENT_FACTORY.createStartElement("", "", "card")); + writer.add(EVENT_FACTORY.createAttribute("name", entry.getKey())); + writer.add(EVENT_FACTORY.createAttribute("stars", String.valueOf(entry.getValue().starCount))); + writer.add(EVENT_FACTORY.createEndElement("", "", "card")); + writer.add(NEWLINE); + } + } + + writer.add(EVENT_FACTORY.createEndDocument()); + writer.flush(); + writer.close(); + } + catch (final Exception e) { + e.printStackTrace(); + } + } + private int starCount; private CardPreferences() { diff --git a/forge-gui/res/defaults/editor.preferences b/forge-gui/res/defaults/editor.preferences index 140ad0d5716..35e8a09357a 100644 --- a/forge-gui/res/defaults/editor.preferences +++ b/forge-gui/res/defaults/editor.preferences @@ -3,9 +3,9 @@ - + - + @@ -18,7 +18,7 @@ - + diff --git a/forge-gui/res/skins/default/sprite_icons.png b/forge-gui/res/skins/default/sprite_icons.png index 52e26affb37..ce889871183 100644 Binary files a/forge-gui/res/skins/default/sprite_icons.png and b/forge-gui/res/skins/default/sprite_icons.png differ diff --git a/forge-gui/src/main/java/forge/Singletons.java b/forge-gui/src/main/java/forge/Singletons.java index 29846aea506..32273dd9a20 100644 --- a/forge-gui/src/main/java/forge/Singletons.java +++ b/forge-gui/src/main/java/forge/Singletons.java @@ -17,6 +17,7 @@ */ package forge; +import forge.card.CardPreferences; import forge.control.FControl; import forge.gui.toolbox.FProgressBar; import forge.gui.workshop.CardScriptInfo; @@ -52,8 +53,9 @@ public final class Singletons { initialized = true; } - if(withUi) + if (withUi) { view = FView.SINGLETON_INSTANCE; + } CardStorageReader.ProgressObserver progressBarBridge = view == null ? CardStorageReader.ProgressObserver.emptyObserver : new CardStorageReader.ProgressObserver() { @@ -79,9 +81,11 @@ public final class Singletons { magicDb = new StaticData(reader, "res/editions", "res/blockdata"); model = FModel.getInstance(withUi); - if(withUi) + if (withUi) { control = FControl.instance; - + + CardPreferences.load(NewConstants.CARD_PREFS_FILE); + } } // disallow instantiation diff --git a/forge-gui/src/main/java/forge/gui/deckeditor/CDeckEditorUI.java b/forge-gui/src/main/java/forge/gui/deckeditor/CDeckEditorUI.java index e3d9e00544a..d329dffa120 100644 --- a/forge-gui/src/main/java/forge/gui/deckeditor/CDeckEditorUI.java +++ b/forge-gui/src/main/java/forge/gui/deckeditor/CDeckEditorUI.java @@ -362,6 +362,7 @@ public enum CDeckEditorUI implements ICDoc, IMenuProvider { catTable.getComponent().addMouseListener(new FMouseAdapter() { @Override public void onLeftDoubleClick(MouseEvent e) { + if (e.isConsumed()) { return; } //don't add cards if inline button double clicked addSelectedCards(false, 1); } @@ -376,6 +377,7 @@ public enum CDeckEditorUI implements ICDoc, IMenuProvider { deckTable.getComponent().addMouseListener(new FMouseAdapter() { @Override public void onLeftDoubleClick(MouseEvent e) { + if (e.isConsumed()) { return; } //don't remove cards if inline button double clicked removeSelectedCards(false, 1); } diff --git a/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CEditorQuest.java b/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CEditorQuest.java index acc3eab95f2..0e463366d20 100644 --- a/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CEditorQuest.java +++ b/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CEditorQuest.java @@ -40,6 +40,7 @@ import forge.gui.framework.FScreen; import forge.gui.home.quest.CSubmenuQuestDecks; import forge.gui.toolbox.itemmanager.CardManager; import forge.gui.toolbox.itemmanager.SItemManagerUtil; +import forge.gui.toolbox.itemmanager.views.ItemCellRenderer; import forge.gui.toolbox.itemmanager.views.SColumnUtil; import forge.gui.toolbox.itemmanager.views.TableColumnInfo; import forge.gui.toolbox.itemmanager.views.SColumnUtil.ColumnName; @@ -266,16 +267,18 @@ public final class CEditorQuest extends ACEditorBase { columnsCatalog.add(SColumnUtil.getColumn(ColumnName.CAT_NEW)); columnsCatalog.get(columnsCatalog.size() - 1).setSortAndDisplayFunctions( this.questData.getCards().getFnNewCompare(), - this.questData.getCards().getFnNewGet()); + this.questData.getCards().getFnNewGet(), + new ItemCellRenderer()); columnsDeck.add(SColumnUtil.getColumn(ColumnName.DECK_NEW)); columnsDeck.get(columnsDeck.size() - 1).setSortAndDisplayFunctions( this.questData.getCards().getFnNewCompare(), - this.questData.getCards().getFnNewGet()); + this.questData.getCards().getFnNewGet(), + new ItemCellRenderer()); columnsDeck.add(SColumnUtil.getColumn(ColumnName.DECK_DECKS)); columnsDeck.get(columnsDeck.size() - 1).setSortAndDisplayFunctions( - this.fnDeckCompare, this.fnDeckGet); + this.fnDeckCompare, this.fnDeckGet, new ItemCellRenderer()); this.getCatalogManager().getTable().setup(columnsCatalog); this.getDeckManager().getTable().setup(columnsDeck); diff --git a/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CEditorQuestCardShop.java b/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CEditorQuestCardShop.java index 1a13626d9ad..b2ded9b80be 100644 --- a/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CEditorQuestCardShop.java +++ b/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CEditorQuestCardShop.java @@ -50,6 +50,7 @@ import forge.gui.toolbox.FLabel; import forge.gui.toolbox.FSkin; import forge.gui.toolbox.itemmanager.SpellShopManager; import forge.gui.toolbox.itemmanager.SItemManagerUtil; +import forge.gui.toolbox.itemmanager.views.ItemCellRenderer; import forge.gui.toolbox.itemmanager.views.SColumnUtil; import forge.gui.toolbox.itemmanager.views.TableColumnInfo; import forge.gui.toolbox.itemmanager.views.SColumnUtil.ColumnName; @@ -435,23 +436,23 @@ public final class CEditorQuestCardShop extends ACEditorBase extends ItemView { this.table.getTableHeader().setBackground(new Color(200, 200, 200)); } - private String getCellTooltip(TableCellRenderer renderer, int row, int col, Object val) { - Component cell = renderer.getTableCellRendererComponent( - this.table, val, false, false, row, col); - - // if we're conditionally showing the tooltip, check to see - // if we shouldn't show it - if (!(cell instanceof AlwaysShowToolTip)) - { - // if there's enough room (or there's no value), no tooltip - // we use '>' here instead of '>=' since that seems to be the - // threshold for where the ellipses appear for the default - // JTable renderer - int requiredWidth = cell.getPreferredSize().width; - TableColumn tableColumn = this.table.getColumnModel().getColumn(col); - if (null == val || tableColumn.getWidth() > requiredWidth) { - return null; - } - } - - // use a pre-set tooltip if it exists - if (cell instanceof JComponent) - { - JComponent jcell = (JComponent)cell; - String tip = jcell.getToolTipText(); - if (null != tip) - { - return tip; - } - } - - // otherwise, show the full text in the tooltip - return String.valueOf(val); - } - public void setAvailableColumns(final List> cols) { final DefaultTableColumnModel colModel = new DefaultTableColumnModel(); @@ -331,15 +297,65 @@ public final class ItemListView extends ItemView { if (col < 0) { return null; } TableColumn tableColumn = columnModel.getColumn(col); TableCellRenderer headerRenderer = tableColumn.getHeaderRenderer(); - if (null == headerRenderer) { + if (headerRenderer == null) { headerRenderer = getDefaultRenderer(); } - return getCellTooltip( - headerRenderer, -1, col, tableColumn.getHeaderValue()); + return getCellTooltip(headerRenderer, -1, col, tableColumn.getHeaderValue()); } }; } + + public void processMouseEvent(MouseEvent e) { + Point p = e.getPoint(); + int row = rowAtPoint(p); + int col = columnAtPoint(p); + + if (col < 0 || col >= getColumnCount() || row < 0 || row >= getRowCount()) { + return; + } + + Object val = getValueAt(row, col); + if (val == null) { + return; + } + + ItemCellRenderer renderer = (ItemCellRenderer)getCellRenderer(row, col); + if (renderer != null) { + renderer.processMouseEvent(e, this, val, row, col); //give renderer a chance to process the mouse event + } + super.processMouseEvent(e); + } + + private String getCellTooltip(TableCellRenderer renderer, int row, int col, Object val) { + Component cell = renderer.getTableCellRendererComponent(this, val, false, false, row, col); + + // if we're conditionally showing the tooltip, check to see + // if we shouldn't show it + if (!(cell instanceof ItemCellRenderer)) { + // if there's enough room (or there's no value), no tooltip + // we use '>' here instead of '>=' since that seems to be the + // threshold for where the ellipses appear for the default + // JTable renderer + int requiredWidth = cell.getPreferredSize().width; + TableColumn tableColumn = this.getColumnModel().getColumn(col); + if (null == val || tableColumn.getWidth() > requiredWidth) { + return null; + } + } + + // use a pre-set tooltip if it exists + if (cell instanceof JComponent) { + JComponent jcell = (JComponent)cell; + String tip = jcell.getToolTipText(); + if (tip != null) { + return tip; + } + } + + // otherwise, show the full text in the tooltip + return String.valueOf(val); + } @Override public String getToolTipText(MouseEvent e) { @@ -352,7 +368,7 @@ public final class ItemListView extends ItemView { } Object val = getValueAt(row, col); - if (null == val) { + if (val == null) { return null; } @@ -370,7 +386,8 @@ public final class ItemListView extends ItemView { final int col = columnAtPoint(p); if (row == lastTooltipRow && col == lastTooltipCol) { p = lastTooltipPt; - } else { + } + else { lastTooltipRow = row; lastTooltipCol = col; lastTooltipPt = p; diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ManaCostRenderer.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ManaCostRenderer.java index fc04da3389e..40218ae997c 100644 --- a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ManaCostRenderer.java +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ManaCostRenderer.java @@ -20,8 +20,6 @@ package forge.gui.toolbox.itemmanager.views; import java.awt.Component; import java.awt.Graphics; import javax.swing.JTable; -import javax.swing.table.DefaultTableCellRenderer; - import forge.card.CardRules; import forge.card.CardSplitType; import forge.card.mana.ManaCost; @@ -33,7 +31,7 @@ import forge.gui.toolbox.FSkin.JLabelSkin; /** * Displays mana cost as symbols. */ -public class ManaCostRenderer extends DefaultTableCellRenderer { +public class ManaCostRenderer extends ItemCellRenderer { private static final long serialVersionUID = 1770527102334163549L; private static final int elemtWidth = 13; diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/SColumnUtil.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/SColumnUtil.java index 6bffaa8a976..0b18c022fd6 100644 --- a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/SColumnUtil.java +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/SColumnUtil.java @@ -144,69 +144,59 @@ public final class SColumnUtil { /** Should be called after column preferences has run, which has created a new column list. */ public static void attachSortAndDisplayFunctions() { SColumnUtil.getColumn(ColumnName.CAT_FAVORITE).setSortAndDisplayFunctions( - SColumnUtil.FN_FAV_COMPARE, SColumnUtil.FN_FAV_GET); + SColumnUtil.FN_FAV_COMPARE, SColumnUtil.FN_FAV_GET, new StarRenderer()); SColumnUtil.getColumn(ColumnName.CAT_QUANTITY).setSortAndDisplayFunctions( - SColumnUtil.FN_QTY_COMPARE, SColumnUtil.FN_QTY_GET); + SColumnUtil.FN_QTY_COMPARE, SColumnUtil.FN_QTY_GET, new ItemCellRenderer()); SColumnUtil.getColumn(ColumnName.CAT_NAME).setSortAndDisplayFunctions( - SColumnUtil.FN_NAME_COMPARE, SColumnUtil.FN_NAME_GET); + SColumnUtil.FN_NAME_COMPARE, SColumnUtil.FN_NAME_GET, new ItemCellRenderer()); SColumnUtil.getColumn(ColumnName.CAT_COST).setSortAndDisplayFunctions( - SColumnUtil.FN_COST_COMPARE, SColumnUtil.FN_COST_GET); + SColumnUtil.FN_COST_COMPARE, SColumnUtil.FN_COST_GET, new ManaCostRenderer()); SColumnUtil.getColumn(ColumnName.CAT_COLOR).setSortAndDisplayFunctions( - SColumnUtil.FN_COLOR_COMPARE, SColumnUtil.FN_COLOR_GET); + SColumnUtil.FN_COLOR_COMPARE, SColumnUtil.FN_COLOR_GET, new ItemCellRenderer()); SColumnUtil.getColumn(ColumnName.CAT_TYPE).setSortAndDisplayFunctions( - SColumnUtil.FN_TYPE_COMPARE, SColumnUtil.FN_TYPE_GET); + SColumnUtil.FN_TYPE_COMPARE, SColumnUtil.FN_TYPE_GET, new ItemCellRenderer()); SColumnUtil.getColumn(ColumnName.CAT_POWER).setSortAndDisplayFunctions( - SColumnUtil.FN_POWER_COMPARE, SColumnUtil.FN_POWER_GET); + SColumnUtil.FN_POWER_COMPARE, SColumnUtil.FN_POWER_GET, new IntegerRenderer()); SColumnUtil.getColumn(ColumnName.CAT_TOUGHNESS).setSortAndDisplayFunctions( - SColumnUtil.FN_TOUGHNESS_COMPARE, SColumnUtil.FN_TOUGHNESS_GET); + SColumnUtil.FN_TOUGHNESS_COMPARE, SColumnUtil.FN_TOUGHNESS_GET, new IntegerRenderer()); SColumnUtil.getColumn(ColumnName.CAT_CMC).setSortAndDisplayFunctions( - SColumnUtil.FN_CMC_COMPARE, SColumnUtil.FN_CMC_GET); + SColumnUtil.FN_CMC_COMPARE, SColumnUtil.FN_CMC_GET, new IntegerRenderer()); SColumnUtil.getColumn(ColumnName.CAT_RARITY).setSortAndDisplayFunctions( - SColumnUtil.FN_RARITY_COMPARE, SColumnUtil.FN_RARITY_GET); + SColumnUtil.FN_RARITY_COMPARE, SColumnUtil.FN_RARITY_GET, new ItemCellRenderer()); SColumnUtil.getColumn(ColumnName.CAT_SET).setSortAndDisplayFunctions( - SColumnUtil.FN_SET_COMPARE, SColumnUtil.FN_SET_GET); + SColumnUtil.FN_SET_COMPARE, SColumnUtil.FN_SET_GET, new SetCodeRenderer()); SColumnUtil.getColumn(ColumnName.CAT_AI).setSortAndDisplayFunctions( - SColumnUtil.FN_AI_STATUS_COMPARE, SColumnUtil.FN_AI_STATUS_GET); + SColumnUtil.FN_AI_STATUS_COMPARE, SColumnUtil.FN_AI_STATUS_GET, new ItemCellRenderer()); SColumnUtil.getColumn(ColumnName.CAT_RANKING).setSortAndDisplayFunctions( - SColumnUtil.FN_RANKING_COMPARE, SColumnUtil.FN_RANKING_GET); + SColumnUtil.FN_RANKING_COMPARE, SColumnUtil.FN_RANKING_GET, new ItemCellRenderer()); SColumnUtil.getColumn(ColumnName.DECK_QUANTITY).setSortAndDisplayFunctions( - SColumnUtil.FN_QTY_COMPARE, SColumnUtil.FN_QTY_GET); + SColumnUtil.FN_QTY_COMPARE, SColumnUtil.FN_QTY_GET, new ItemCellRenderer()); SColumnUtil.getColumn(ColumnName.DECK_NAME).setSortAndDisplayFunctions( - SColumnUtil.FN_NAME_COMPARE, SColumnUtil.FN_NAME_GET); + SColumnUtil.FN_NAME_COMPARE, SColumnUtil.FN_NAME_GET, new ItemCellRenderer()); SColumnUtil.getColumn(ColumnName.DECK_COST).setSortAndDisplayFunctions( - SColumnUtil.FN_COST_COMPARE, SColumnUtil.FN_COST_GET); + SColumnUtil.FN_COST_COMPARE, SColumnUtil.FN_COST_GET, new ManaCostRenderer()); SColumnUtil.getColumn(ColumnName.DECK_COLOR).setSortAndDisplayFunctions( - SColumnUtil.FN_COLOR_COMPARE, SColumnUtil.FN_COLOR_GET); + SColumnUtil.FN_COLOR_COMPARE, SColumnUtil.FN_COLOR_GET, new ItemCellRenderer()); SColumnUtil.getColumn(ColumnName.DECK_TYPE).setSortAndDisplayFunctions( - SColumnUtil.FN_TYPE_COMPARE, SColumnUtil.FN_TYPE_GET); + SColumnUtil.FN_TYPE_COMPARE, SColumnUtil.FN_TYPE_GET, new ItemCellRenderer()); SColumnUtil.getColumn(ColumnName.DECK_POWER).setSortAndDisplayFunctions( - SColumnUtil.FN_POWER_COMPARE, SColumnUtil.FN_POWER_GET); + SColumnUtil.FN_POWER_COMPARE, SColumnUtil.FN_POWER_GET, new IntegerRenderer()); SColumnUtil.getColumn(ColumnName.DECK_TOUGHNESS).setSortAndDisplayFunctions( - SColumnUtil.FN_TOUGHNESS_COMPARE, SColumnUtil.FN_TOUGHNESS_GET); + SColumnUtil.FN_TOUGHNESS_COMPARE, SColumnUtil.FN_TOUGHNESS_GET, new IntegerRenderer()); SColumnUtil.getColumn(ColumnName.DECK_CMC).setSortAndDisplayFunctions( - SColumnUtil.FN_CMC_COMPARE, SColumnUtil.FN_CMC_GET); + SColumnUtil.FN_CMC_COMPARE, SColumnUtil.FN_CMC_GET, new IntegerRenderer()); SColumnUtil.getColumn(ColumnName.DECK_RARITY).setSortAndDisplayFunctions( - SColumnUtil.FN_RARITY_COMPARE, SColumnUtil.FN_RARITY_GET); + SColumnUtil.FN_RARITY_COMPARE, SColumnUtil.FN_RARITY_GET, new ItemCellRenderer()); SColumnUtil.getColumn(ColumnName.DECK_SET).setSortAndDisplayFunctions( - SColumnUtil.FN_SET_COMPARE, SColumnUtil.FN_SET_GET); + SColumnUtil.FN_SET_COMPARE, SColumnUtil.FN_SET_GET, new SetCodeRenderer()); SColumnUtil.getColumn(ColumnName.DECK_AI).setSortAndDisplayFunctions( - SColumnUtil.FN_AI_STATUS_COMPARE, SColumnUtil.FN_AI_STATUS_GET); + SColumnUtil.FN_AI_STATUS_COMPARE, SColumnUtil.FN_AI_STATUS_GET, new ItemCellRenderer()); SColumnUtil.getColumn(ColumnName.DECK_RANKING).setSortAndDisplayFunctions( - SColumnUtil.FN_RANKING_COMPARE, SColumnUtil.FN_RANKING_GET); + SColumnUtil.FN_RANKING_COMPARE, SColumnUtil.FN_RANKING_GET, new ItemCellRenderer()); - SColumnUtil.getColumn(ColumnName.CAT_FAVORITE).setCellRenderer(new StarRenderer()); - SColumnUtil.getColumn(ColumnName.CAT_COST).setCellRenderer(new ManaCostRenderer()); - SColumnUtil.getColumn(ColumnName.CAT_POWER).setCellRenderer(new IntegerRenderer()); - SColumnUtil.getColumn(ColumnName.CAT_TOUGHNESS).setCellRenderer(new IntegerRenderer()); - SColumnUtil.getColumn(ColumnName.CAT_CMC).setCellRenderer(new IntegerRenderer()); - SColumnUtil.getColumn(ColumnName.CAT_SET).setCellRenderer(new SetCodeRenderer()); - - SColumnUtil.getColumn(ColumnName.DECK_COST).setCellRenderer(new ManaCostRenderer()); - SColumnUtil.getColumn(ColumnName.DECK_POWER).setCellRenderer(new IntegerRenderer()); - SColumnUtil.getColumn(ColumnName.DECK_TOUGHNESS).setCellRenderer(new IntegerRenderer()); - SColumnUtil.getColumn(ColumnName.DECK_CMC).setCellRenderer(new IntegerRenderer()); - SColumnUtil.getColumn(ColumnName.DECK_SET).setCellRenderer(new SetCodeRenderer()); + SColumnUtil.getColumn(ColumnName.CAT_FAVORITE).setMinWidth(18); //prevent resizing favorite column + SColumnUtil.getColumn(ColumnName.CAT_FAVORITE).setMaxWidth(18); } /** @@ -365,7 +355,11 @@ public final class SColumnUtil { private static final Function, Comparable> FN_FAV_COMPARE = new Function, Comparable>() { @Override public Comparable apply(final Entry from) { - return from.getValue(); + IPaperCard card = SColumnUtil.toCard(from.getKey()); + if (card == null) { + return -1; + } + return card.getPrefs().getStarCount(); } }; diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/SetCodeRenderer.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/SetCodeRenderer.java index 71c60ab04d1..57d3ef3fdbb 100644 --- a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/SetCodeRenderer.java +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/SetCodeRenderer.java @@ -17,8 +17,6 @@ */ package forge.gui.toolbox.itemmanager.views; -import javax.swing.table.DefaultTableCellRenderer; - import forge.Singletons; import forge.card.CardEdition; @@ -26,7 +24,12 @@ import forge.card.CardEdition; * A wrapper to show explanatory tooltips for edition set abbreviations. */ @SuppressWarnings("serial") -public class SetCodeRenderer extends DefaultTableCellRenderer implements AlwaysShowToolTip { +public class SetCodeRenderer extends ItemCellRenderer { + @Override + public boolean alwaysShowTooltip() { + return true; + } + @Override public String getToolTipText() { String setAbbrev = getText(); diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/StarRenderer.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/StarRenderer.java index 6de29a5eed9..a7ae0a952c7 100644 --- a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/StarRenderer.java +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/StarRenderer.java @@ -19,22 +19,29 @@ package forge.gui.toolbox.itemmanager.views; import java.awt.Component; import java.awt.Graphics; +import java.awt.event.MouseEvent; import javax.swing.JTable; -import javax.swing.table.DefaultTableCellRenderer; +import forge.card.CardPreferences; import forge.gui.toolbox.FSkin; import forge.gui.toolbox.FSkin.SkinImage; import forge.item.IPaperCard; +import forge.properties.NewConstants; /** * Displays favorite icons */ @SuppressWarnings("serial") -public class StarRenderer extends DefaultTableCellRenderer { +public class StarRenderer extends ItemCellRenderer { private IPaperCard card; private SkinImage skinImage; + @Override + public boolean alwaysShowTooltip() { + return true; + } + /* * (non-Javadoc) * @@ -54,6 +61,20 @@ public class StarRenderer extends DefaultTableCellRenderer { update(); return super.getTableCellRendererComponent(table, "", isSelected, hasFocus, row, column); } + + @Override + public void processMouseEvent(final MouseEvent e, final JTable table, final Object value, final int row, final int column) { + if (e.getID() == MouseEvent.MOUSE_PRESSED && e.getButton() == 1 && value instanceof IPaperCard) { + card = (IPaperCard) value; + CardPreferences prefs = card.getPrefs(); + prefs.setStarCount((prefs.getStarCount() + 1) % 2); //TODO: consider supporting more than 1 star + CardPreferences.save(NewConstants.CARD_PREFS_FILE); + update(); + table.setRowSelectionInterval(row, row); + table.repaint(); + e.consume(); + } + } private void update() { if (card == null) { @@ -61,12 +82,12 @@ public class StarRenderer extends DefaultTableCellRenderer { skinImage = null; } else if (card.getPrefs().getStarCount() == 0) { - this.setToolTipText("Click to add " + card.getName() + " to favorites"); - skinImage = null; + this.setToolTipText("Click to add " + card.getName() + " to your favorites"); + skinImage = FSkin.getImage(FSkin.EditorImages.IMG_STAR_OUTINE); } else { //TODO: consider supporting more than 1 star - this.setToolTipText("Click to remove " + card.getName() + " from favorites"); - skinImage = null; + this.setToolTipText("Click to remove " + card.getName() + " from your favorites"); + skinImage = FSkin.getImage(FSkin.EditorImages.IMG_STAR_FILLED); } } @@ -81,7 +102,7 @@ public class StarRenderer extends DefaultTableCellRenderer { if (skinImage == null) { return; } - int size = 13; + int size = 15; int width = this.getWidth(); int height = this.getHeight(); if (size > width) { diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/TableColumnInfo.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/TableColumnInfo.java index 67a975a286c..e27fab859f1 100644 --- a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/TableColumnInfo.java +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/TableColumnInfo.java @@ -155,8 +155,9 @@ public class TableColumnInfo extends TableColumn { * @param lambda0 the fnSort * @param lambda1 the fnDisplay */ - public void setSortAndDisplayFunctions(final Function, Comparable> lambda0, final Function, Object> lambda1) { + public void setSortAndDisplayFunctions(final Function, Comparable> lambda0, final Function, Object> lambda1, ItemCellRenderer cellRenderer) { this.fnSort = lambda0; this.fnDisplay = lambda1; + this.setCellRenderer(cellRenderer); } } diff --git a/forge-gui/src/main/java/forge/properties/NewConstants.java b/forge-gui/src/main/java/forge/properties/NewConstants.java index 5782cb043fc..2752d87b177 100644 --- a/forge-gui/src/main/java/forge/properties/NewConstants.java +++ b/forge-gui/src/main/java/forge/properties/NewConstants.java @@ -37,7 +37,7 @@ public final class NewConstants { public static final String IMAGE_LIST_QUEST_FATPACKS_FILE = _LIST_DIR + "fatpack-images.txt"; public static final String IMAGE_LIST_QUEST_PRECONS_FILE = _LIST_DIR + "precon-images.txt"; public static final String IMAGE_LIST_QUEST_TOURNAMENTPACKS_FILE = _LIST_DIR + "tournamentpack-images.txt"; - + private static final String _QUEST_DIR = _RES_ROOT + "quest/"; public static final String TEXT_HOWTO_FILE = _RES_ROOT + "howto.txt"; public static final String DRAFT_RANKINGS_FILE = _RES_ROOT + "draft/rankings.txt"; @@ -47,11 +47,11 @@ public final class NewConstants { public static final String DECK_CUBE_DIR = _RES_ROOT + "cube"; public static final String QUEST_WORLD_DIR = _QUEST_DIR + "worlds/"; public static final String QUEST_PRECON_DIR = _QUEST_DIR + "precons/"; - + public static final String CARD_DATA_PETS_DIR = _QUEST_DIR + "bazaar/"; public static final String DEFAULT_DUELS_DIR = _QUEST_DIR + "duels"; public static final String DEFAULT_CHALLENGES_DIR = _QUEST_DIR + "challenges"; - + // data tree roots public static final String USER_DIR; public static final String CACHE_DIR; @@ -80,8 +80,8 @@ public final class NewConstants { public static final String DECK_COMMANDER_DIR = DECK_BASE_DIR + "commander/"; public static final String QUEST_SAVE_DIR = USER_QUEST_DIR + "saves/"; public static final String MAIN_PREFS_FILE = USER_PREFS_DIR + "forge.preferences"; + public static final String CARD_PREFS_FILE = USER_PREFS_DIR + "card.preferences"; public static final String QUEST_PREFS_FILE = USER_PREFS_DIR + "quest.preferences"; - // data that has defaults in the program dir but overrides/additions in the user dir private static final String _DEFAULTS_DIR = _RES_ROOT + "defaults/"; @@ -91,7 +91,7 @@ public final class NewConstants { public static final FileLocation WORKSHOP_LAYOUT_FILE = new FileLocation(_DEFAULTS_DIR, USER_PREFS_DIR, "workshop.xml"); public static final FileLocation EDITOR_LAYOUT_FILE = new FileLocation(_DEFAULTS_DIR, USER_PREFS_DIR, "editor.xml"); public static final FileLocation GAUNTLET_DIR = new FileLocation(_DEFAULTS_DIR, USER_DIR, "gauntlet/"); - + // data that is only in the cached dir private static final String _PICS_DIR = CACHE_DIR + "pics/"; public static final String DB_DIR = CACHE_DIR + "db/"; @@ -104,7 +104,7 @@ public final class NewConstants { public static final String CACHE_TOURNAMENTPACK_PICS_DIR = _PICS_DIR + "tournamentpacks/"; public static final String QUEST_CARD_PRICE_FILE = DB_DIR + "all-prices.txt"; public static final String CACHE_MORPH_IMAGE_FILE = "morph"; - + public static final String[] PROFILE_DIRS = { USER_DIR, CACHE_DIR, @@ -124,7 +124,7 @@ public final class NewConstants { CACHE_FATPACK_PICS_DIR, CACHE_PRECON_PICS_DIR, CACHE_TOURNAMENTPACK_PICS_DIR }; - + // URLs private static final String _URL_CARDFORGE = "http://cardforge.org"; public static final String URL_DRAFT_UPLOAD = _URL_CARDFORGE + "/draftAI/submitDraftData.php";