Support marking cards as favorites in catalog

This commit is contained in:
drdev
2013-12-22 08:39:20 +00:00
parent 471e5b5399
commit a062d61c8d
18 changed files with 271 additions and 121 deletions

2
.gitattributes vendored
View File

@@ -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/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/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/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/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/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/ItemView.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ManaCostRenderer.java -text forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ManaCostRenderer.java -text

View File

@@ -1,24 +1,119 @@
package forge.card; 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.Map;
import java.util.HashMap; 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 * Preferences associated with individual cards
* *
*/ */
public class CardPreferences { 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<String, CardPreferences> allPrefs = new HashMap<String, CardPreferences>(); private static Map<String, CardPreferences> allPrefs = new HashMap<String, CardPreferences>();
public static CardPreferences getPrefs(String key) { public static CardPreferences getPrefs(String name) {
CardPreferences prefs = allPrefs.get(key); CardPreferences prefs = allPrefs.get(name);
if (prefs == null) { if (prefs == null) {
prefs = new CardPreferences(); prefs = new CardPreferences();
allPrefs.put(key, prefs); allPrefs.put(name, prefs);
} }
return 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<String, CardPreferences> 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 int starCount;
private CardPreferences() { private CardPreferences() {

View File

@@ -3,9 +3,9 @@
<pref name="display_unique_only" value="true"></pref> <pref name="display_unique_only" value="true"></pref>
<pref name="elastic_columns" value="false"></pref> <pref name="elastic_columns" value="false"></pref>
<pref name="stats_deck" value="true"></pref> <pref name="stats_deck" value="true"></pref>
<col enumval="CAT_FAVORITE" identifier="" show="true" sortpriority="1" sortstate="DESC" width="17"></col> <col enumval="CAT_FAVORITE" identifier="" show="true" sortpriority="1" sortstate="DESC" width="18"></col>
<col enumval="CAT_QUANTITY" identifier="Quantity" show="true" sortpriority="0" sortstate="NONE" width="30"></col> <col enumval="CAT_QUANTITY" identifier="Quantity" show="true" sortpriority="0" sortstate="NONE" width="30"></col>
<col enumval="CAT_NAME" identifier="Name" show="true" sortpriority="2" sortstate="ASC" width="115"></col> <col enumval="CAT_NAME" identifier="Name" show="true" sortpriority="3" sortstate="ASC" width="115"></col>
<col enumval="CAT_COST" identifier="Cost" show="true" sortpriority="0" sortstate="NONE" width="40"></col> <col enumval="CAT_COST" identifier="Cost" show="true" sortpriority="0" sortstate="NONE" width="40"></col>
<col enumval="CAT_COLOR" identifier="Color" show="true" sortpriority="0" sortstate="NONE" width="40"></col> <col enumval="CAT_COLOR" identifier="Color" show="true" sortpriority="0" sortstate="NONE" width="40"></col>
<col enumval="CAT_TYPE" identifier="Type" show="true" sortpriority="0" sortstate="NONE" width="80"></col> <col enumval="CAT_TYPE" identifier="Type" show="true" sortpriority="0" sortstate="NONE" width="80"></col>
@@ -18,7 +18,7 @@
<col enumval="CAT_RANKING" identifier="Ranking" show="false" sortpriority="0" sortstate="NONE" width="30"></col> <col enumval="CAT_RANKING" identifier="Ranking" show="false" sortpriority="0" sortstate="NONE" width="30"></col>
<col enumval="CAT_NEW" identifier="New" show="true" sortpriority="0" sortstate="NONE" width="30"></col> <col enumval="CAT_NEW" identifier="New" show="true" sortpriority="0" sortstate="NONE" width="30"></col>
<col enumval="CAT_PURCHASE_PRICE" identifier="Purchase Price" show="true" sortpriority="3" sortstate="DESC" width="30"></col> <col enumval="CAT_PURCHASE_PRICE" identifier="Purchase Price" show="true" sortpriority="3" sortstate="DESC" width="30"></col>
<col enumval="CAT_OWNED" identifier="Owned" show="true" sortpriority="1" sortstate="ASC" width="40"></col> <col enumval="CAT_OWNED" identifier="Owned" show="true" sortpriority="2" sortstate="ASC" width="40"></col>
<col enumval="DECK_QUANTITY" identifier="Quantity" show="true" sortpriority="0" sortstate="NONE" width="30"></col> <col enumval="DECK_QUANTITY" identifier="Quantity" show="true" sortpriority="0" sortstate="NONE" width="30"></col>
<col enumval="DECK_NAME" identifier="Name" show="true" sortpriority="3" sortstate="ASC" width="115"></col> <col enumval="DECK_NAME" identifier="Name" show="true" sortpriority="3" sortstate="ASC" width="115"></col>
<col enumval="DECK_COST" identifier="Cost" show="true" sortpriority="0" sortstate="NONE" width="40"></col> <col enumval="DECK_COST" identifier="Cost" show="true" sortpriority="0" sortstate="NONE" width="40"></col>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 638 KiB

After

Width:  |  Height:  |  Size: 638 KiB

View File

@@ -17,6 +17,7 @@
*/ */
package forge; package forge;
import forge.card.CardPreferences;
import forge.control.FControl; import forge.control.FControl;
import forge.gui.toolbox.FProgressBar; import forge.gui.toolbox.FProgressBar;
import forge.gui.workshop.CardScriptInfo; import forge.gui.workshop.CardScriptInfo;
@@ -52,8 +53,9 @@ public final class Singletons {
initialized = true; initialized = true;
} }
if(withUi) if (withUi) {
view = FView.SINGLETON_INSTANCE; view = FView.SINGLETON_INSTANCE;
}
CardStorageReader.ProgressObserver progressBarBridge = view == null CardStorageReader.ProgressObserver progressBarBridge = view == null
? CardStorageReader.ProgressObserver.emptyObserver : new CardStorageReader.ProgressObserver() { ? CardStorageReader.ProgressObserver.emptyObserver : new CardStorageReader.ProgressObserver() {
@@ -79,9 +81,11 @@ public final class Singletons {
magicDb = new StaticData(reader, "res/editions", "res/blockdata"); magicDb = new StaticData(reader, "res/editions", "res/blockdata");
model = FModel.getInstance(withUi); model = FModel.getInstance(withUi);
if(withUi) if (withUi) {
control = FControl.instance; control = FControl.instance;
CardPreferences.load(NewConstants.CARD_PREFS_FILE);
}
} }
// disallow instantiation // disallow instantiation

View File

@@ -362,6 +362,7 @@ public enum CDeckEditorUI implements ICDoc, IMenuProvider {
catTable.getComponent().addMouseListener(new FMouseAdapter() { catTable.getComponent().addMouseListener(new FMouseAdapter() {
@Override @Override
public void onLeftDoubleClick(MouseEvent e) { public void onLeftDoubleClick(MouseEvent e) {
if (e.isConsumed()) { return; } //don't add cards if inline button double clicked
addSelectedCards(false, 1); addSelectedCards(false, 1);
} }
@@ -376,6 +377,7 @@ public enum CDeckEditorUI implements ICDoc, IMenuProvider {
deckTable.getComponent().addMouseListener(new FMouseAdapter() { deckTable.getComponent().addMouseListener(new FMouseAdapter() {
@Override @Override
public void onLeftDoubleClick(MouseEvent e) { public void onLeftDoubleClick(MouseEvent e) {
if (e.isConsumed()) { return; } //don't remove cards if inline button double clicked
removeSelectedCards(false, 1); removeSelectedCards(false, 1);
} }

View File

@@ -40,6 +40,7 @@ import forge.gui.framework.FScreen;
import forge.gui.home.quest.CSubmenuQuestDecks; import forge.gui.home.quest.CSubmenuQuestDecks;
import forge.gui.toolbox.itemmanager.CardManager; import forge.gui.toolbox.itemmanager.CardManager;
import forge.gui.toolbox.itemmanager.SItemManagerUtil; 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.SColumnUtil;
import forge.gui.toolbox.itemmanager.views.TableColumnInfo; import forge.gui.toolbox.itemmanager.views.TableColumnInfo;
import forge.gui.toolbox.itemmanager.views.SColumnUtil.ColumnName; import forge.gui.toolbox.itemmanager.views.SColumnUtil.ColumnName;
@@ -266,16 +267,18 @@ public final class CEditorQuest extends ACEditorBase<PaperCard, Deck> {
columnsCatalog.add(SColumnUtil.getColumn(ColumnName.CAT_NEW)); columnsCatalog.add(SColumnUtil.getColumn(ColumnName.CAT_NEW));
columnsCatalog.get(columnsCatalog.size() - 1).setSortAndDisplayFunctions( columnsCatalog.get(columnsCatalog.size() - 1).setSortAndDisplayFunctions(
this.questData.getCards().getFnNewCompare(), this.questData.getCards().getFnNewCompare(),
this.questData.getCards().getFnNewGet()); this.questData.getCards().getFnNewGet(),
new ItemCellRenderer());
columnsDeck.add(SColumnUtil.getColumn(ColumnName.DECK_NEW)); columnsDeck.add(SColumnUtil.getColumn(ColumnName.DECK_NEW));
columnsDeck.get(columnsDeck.size() - 1).setSortAndDisplayFunctions( columnsDeck.get(columnsDeck.size() - 1).setSortAndDisplayFunctions(
this.questData.getCards().getFnNewCompare(), this.questData.getCards().getFnNewCompare(),
this.questData.getCards().getFnNewGet()); this.questData.getCards().getFnNewGet(),
new ItemCellRenderer());
columnsDeck.add(SColumnUtil.getColumn(ColumnName.DECK_DECKS)); columnsDeck.add(SColumnUtil.getColumn(ColumnName.DECK_DECKS));
columnsDeck.get(columnsDeck.size() - 1).setSortAndDisplayFunctions( columnsDeck.get(columnsDeck.size() - 1).setSortAndDisplayFunctions(
this.fnDeckCompare, this.fnDeckGet); this.fnDeckCompare, this.fnDeckGet, new ItemCellRenderer());
this.getCatalogManager().getTable().setup(columnsCatalog); this.getCatalogManager().getTable().setup(columnsCatalog);
this.getDeckManager().getTable().setup(columnsDeck); this.getDeckManager().getTable().setup(columnsDeck);

View File

@@ -50,6 +50,7 @@ import forge.gui.toolbox.FLabel;
import forge.gui.toolbox.FSkin; import forge.gui.toolbox.FSkin;
import forge.gui.toolbox.itemmanager.SpellShopManager; import forge.gui.toolbox.itemmanager.SpellShopManager;
import forge.gui.toolbox.itemmanager.SItemManagerUtil; 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.SColumnUtil;
import forge.gui.toolbox.itemmanager.views.TableColumnInfo; import forge.gui.toolbox.itemmanager.views.TableColumnInfo;
import forge.gui.toolbox.itemmanager.views.SColumnUtil.ColumnName; import forge.gui.toolbox.itemmanager.views.SColumnUtil.ColumnName;
@@ -435,23 +436,23 @@ public final class CEditorQuestCardShop extends ACEditorBase<InventoryItem, Deck
// Add spell shop-specific columns // Add spell shop-specific columns
columnsCatalog.add(SColumnUtil.getColumn(ColumnName.CAT_PURCHASE_PRICE)); columnsCatalog.add(SColumnUtil.getColumn(ColumnName.CAT_PURCHASE_PRICE));
columnsCatalog.get(columnsCatalog.size() - 1).setSortAndDisplayFunctions( columnsCatalog.get(columnsCatalog.size() - 1).setSortAndDisplayFunctions(
this.fnPriceCompare, this.fnPriceGet); this.fnPriceCompare, this.fnPriceGet, new ItemCellRenderer());
columnsCatalog.add(1, SColumnUtil.getColumn(ColumnName.CAT_OWNED)); columnsCatalog.add(1, SColumnUtil.getColumn(ColumnName.CAT_OWNED));
columnsCatalog.get(1).setSortAndDisplayFunctions( columnsCatalog.get(1).setSortAndDisplayFunctions(
questData.getCards().getFnOwnedCompare(), questData.getCards().getFnOwnedGet()); questData.getCards().getFnOwnedCompare(), questData.getCards().getFnOwnedGet(), new ItemCellRenderer());
columnsDeck.add(SColumnUtil.getColumn(ColumnName.DECK_SALE_PRICE)); columnsDeck.add(SColumnUtil.getColumn(ColumnName.DECK_SALE_PRICE));
columnsDeck.get(columnsDeck.size() - 1).setSortAndDisplayFunctions( columnsDeck.get(columnsDeck.size() - 1).setSortAndDisplayFunctions(
this.fnPriceCompare, this.fnPriceSellGet); this.fnPriceCompare, this.fnPriceSellGet, new ItemCellRenderer());
columnsDeck.add(SColumnUtil.getColumn(ColumnName.DECK_NEW)); columnsDeck.add(SColumnUtil.getColumn(ColumnName.DECK_NEW));
columnsDeck.get(columnsDeck.size() - 1).setSortAndDisplayFunctions( columnsDeck.get(columnsDeck.size() - 1).setSortAndDisplayFunctions(
this.questData.getCards().getFnNewCompare(), this.questData.getCards().getFnNewGet()); this.questData.getCards().getFnNewCompare(), this.questData.getCards().getFnNewGet(), new ItemCellRenderer());
columnsDeck.add(SColumnUtil.getColumn(ColumnName.DECK_DECKS)); columnsDeck.add(SColumnUtil.getColumn(ColumnName.DECK_DECKS));
columnsDeck.get(columnsDeck.size() - 1).setSortAndDisplayFunctions( columnsDeck.get(columnsDeck.size() - 1).setSortAndDisplayFunctions(
this.fnDeckCompare, this.fnDeckGet); this.fnDeckCompare, this.fnDeckGet, new ItemCellRenderer());
// don't need AI column for either table // don't need AI column for either table
columnsCatalog.remove(SColumnUtil.getColumn(ColumnName.CAT_AI)); columnsCatalog.remove(SColumnUtil.getColumn(ColumnName.CAT_AI));

View File

@@ -1483,6 +1483,8 @@ public enum FSkin {
} }
public enum EditorImages implements SkinProp { public enum EditorImages implements SkinProp {
IMG_STAR_OUTINE (new int[] {640, 460, 20, 20}),
IMG_STAR_FILLED (new int[] {660, 460, 20, 20}),
IMG_ARTIFACT (new int[] {280, 720, 40, 40}), IMG_ARTIFACT (new int[] {280, 720, 40, 40}),
IMG_CREATURE (new int[] {240, 720, 40, 40}), IMG_CREATURE (new int[] {240, 720, 40, 40}),
IMG_ENCHANTMENT (new int[] {320, 720, 40, 40}), IMG_ENCHANTMENT (new int[] {320, 720, 40, 40}),

View File

@@ -20,13 +20,12 @@ package forge.gui.toolbox.itemmanager.views;
import java.awt.Component; import java.awt.Component;
import javax.swing.JTable; import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
/** /**
* A quick converter to avoid -1 being displayed for unapplicable values. * A quick converter to avoid -1 being displayed for unapplicable values.
*/ */
@SuppressWarnings("serial") @SuppressWarnings("serial")
public class IntegerRenderer extends DefaultTableCellRenderer { public class IntegerRenderer extends ItemCellRenderer {
/* /*
* (non-Javadoc) * (non-Javadoc)
* *

View File

@@ -17,9 +17,19 @@
*/ */
package forge.gui.toolbox.itemmanager.views; package forge.gui.toolbox.itemmanager.views;
import java.awt.event.MouseEvent;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
/** /**
* A marker interface for indicating that tooltips should always be shown for * Base cell renderer class for item tables
* cells rendered with the marked renderer.
*/ */
interface AlwaysShowToolTip { @SuppressWarnings("serial")
public class ItemCellRenderer extends DefaultTableCellRenderer {
public boolean alwaysShowTooltip() {
return false;
}
public void processMouseEvent(final MouseEvent e, final JTable table, final Object value, final int row, final int column) {
}
} }

View File

@@ -151,40 +151,6 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
this.table.getTableHeader().setBackground(new Color(200, 200, 200)); 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<TableColumnInfo<InventoryItem>> cols) { public void setAvailableColumns(final List<TableColumnInfo<InventoryItem>> cols) {
final DefaultTableColumnModel colModel = new DefaultTableColumnModel(); final DefaultTableColumnModel colModel = new DefaultTableColumnModel();
@@ -331,16 +297,66 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
if (col < 0) { return null; } if (col < 0) { return null; }
TableColumn tableColumn = columnModel.getColumn(col); TableColumn tableColumn = columnModel.getColumn(col);
TableCellRenderer headerRenderer = tableColumn.getHeaderRenderer(); TableCellRenderer headerRenderer = tableColumn.getHeaderRenderer();
if (null == headerRenderer) { if (headerRenderer == null) {
headerRenderer = getDefaultRenderer(); headerRenderer = getDefaultRenderer();
} }
return getCellTooltip( return getCellTooltip(headerRenderer, -1, col, tableColumn.getHeaderValue());
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 @Override
public String getToolTipText(MouseEvent e) { public String getToolTipText(MouseEvent e) {
Point p = e.getPoint(); Point p = e.getPoint();
@@ -352,7 +368,7 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
} }
Object val = getValueAt(row, col); Object val = getValueAt(row, col);
if (null == val) { if (val == null) {
return null; return null;
} }
@@ -370,7 +386,8 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
final int col = columnAtPoint(p); final int col = columnAtPoint(p);
if (row == lastTooltipRow && col == lastTooltipCol) { if (row == lastTooltipRow && col == lastTooltipCol) {
p = lastTooltipPt; p = lastTooltipPt;
} else { }
else {
lastTooltipRow = row; lastTooltipRow = row;
lastTooltipCol = col; lastTooltipCol = col;
lastTooltipPt = p; lastTooltipPt = p;

View File

@@ -20,8 +20,6 @@ package forge.gui.toolbox.itemmanager.views;
import java.awt.Component; import java.awt.Component;
import java.awt.Graphics; import java.awt.Graphics;
import javax.swing.JTable; import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import forge.card.CardRules; import forge.card.CardRules;
import forge.card.CardSplitType; import forge.card.CardSplitType;
import forge.card.mana.ManaCost; import forge.card.mana.ManaCost;
@@ -33,7 +31,7 @@ import forge.gui.toolbox.FSkin.JLabelSkin;
/** /**
* Displays mana cost as symbols. * Displays mana cost as symbols.
*/ */
public class ManaCostRenderer extends DefaultTableCellRenderer { public class ManaCostRenderer extends ItemCellRenderer {
private static final long serialVersionUID = 1770527102334163549L; private static final long serialVersionUID = 1770527102334163549L;
private static final int elemtWidth = 13; private static final int elemtWidth = 13;

View File

@@ -144,69 +144,59 @@ public final class SColumnUtil {
/** Should be called after column preferences has run, which has created a new column list. */ /** Should be called after column preferences has run, which has created a new column list. */
public static void attachSortAndDisplayFunctions() { public static void attachSortAndDisplayFunctions() {
SColumnUtil.getColumn(ColumnName.CAT_FAVORITE).setSortAndDisplayFunctions( 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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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_FAVORITE).setMinWidth(18); //prevent resizing favorite column
SColumnUtil.getColumn(ColumnName.CAT_COST).setCellRenderer(new ManaCostRenderer()); SColumnUtil.getColumn(ColumnName.CAT_FAVORITE).setMaxWidth(18);
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());
} }
/** /**
@@ -365,7 +355,11 @@ public final class SColumnUtil {
private static final Function<Entry<InventoryItem, Integer>, Comparable<?>> FN_FAV_COMPARE = new Function<Entry<InventoryItem, Integer>, Comparable<?>>() { private static final Function<Entry<InventoryItem, Integer>, Comparable<?>> FN_FAV_COMPARE = new Function<Entry<InventoryItem, Integer>, Comparable<?>>() {
@Override @Override
public Comparable<?> apply(final Entry<InventoryItem, Integer> from) { public Comparable<?> apply(final Entry<InventoryItem, Integer> from) {
return from.getValue(); IPaperCard card = SColumnUtil.toCard(from.getKey());
if (card == null) {
return -1;
}
return card.getPrefs().getStarCount();
} }
}; };

View File

@@ -17,8 +17,6 @@
*/ */
package forge.gui.toolbox.itemmanager.views; package forge.gui.toolbox.itemmanager.views;
import javax.swing.table.DefaultTableCellRenderer;
import forge.Singletons; import forge.Singletons;
import forge.card.CardEdition; import forge.card.CardEdition;
@@ -26,7 +24,12 @@ import forge.card.CardEdition;
* A wrapper to show explanatory tooltips for edition set abbreviations. * A wrapper to show explanatory tooltips for edition set abbreviations.
*/ */
@SuppressWarnings("serial") @SuppressWarnings("serial")
public class SetCodeRenderer extends DefaultTableCellRenderer implements AlwaysShowToolTip { public class SetCodeRenderer extends ItemCellRenderer {
@Override
public boolean alwaysShowTooltip() {
return true;
}
@Override @Override
public String getToolTipText() { public String getToolTipText() {
String setAbbrev = getText(); String setAbbrev = getText();

View File

@@ -19,22 +19,29 @@ package forge.gui.toolbox.itemmanager.views;
import java.awt.Component; import java.awt.Component;
import java.awt.Graphics; import java.awt.Graphics;
import java.awt.event.MouseEvent;
import javax.swing.JTable; import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import forge.card.CardPreferences;
import forge.gui.toolbox.FSkin; import forge.gui.toolbox.FSkin;
import forge.gui.toolbox.FSkin.SkinImage; import forge.gui.toolbox.FSkin.SkinImage;
import forge.item.IPaperCard; import forge.item.IPaperCard;
import forge.properties.NewConstants;
/** /**
* Displays favorite icons * Displays favorite icons
*/ */
@SuppressWarnings("serial") @SuppressWarnings("serial")
public class StarRenderer extends DefaultTableCellRenderer { public class StarRenderer extends ItemCellRenderer {
private IPaperCard card; private IPaperCard card;
private SkinImage skinImage; private SkinImage skinImage;
@Override
public boolean alwaysShowTooltip() {
return true;
}
/* /*
* (non-Javadoc) * (non-Javadoc)
* *
@@ -55,18 +62,32 @@ public class StarRenderer extends DefaultTableCellRenderer {
return super.getTableCellRendererComponent(table, "", isSelected, hasFocus, row, column); 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() { private void update() {
if (card == null) { if (card == null) {
this.setToolTipText(""); this.setToolTipText("");
skinImage = null; skinImage = null;
} }
else if (card.getPrefs().getStarCount() == 0) { else if (card.getPrefs().getStarCount() == 0) {
this.setToolTipText("Click to add " + card.getName() + " to favorites"); this.setToolTipText("Click to add " + card.getName() + " to your favorites");
skinImage = null; skinImage = FSkin.getImage(FSkin.EditorImages.IMG_STAR_OUTINE);
} }
else { //TODO: consider supporting more than 1 star else { //TODO: consider supporting more than 1 star
this.setToolTipText("Click to remove " + card.getName() + " from favorites"); this.setToolTipText("Click to remove " + card.getName() + " from your favorites");
skinImage = null; skinImage = FSkin.getImage(FSkin.EditorImages.IMG_STAR_FILLED);
} }
} }
@@ -81,7 +102,7 @@ public class StarRenderer extends DefaultTableCellRenderer {
if (skinImage == null) { return; } if (skinImage == null) { return; }
int size = 13; int size = 15;
int width = this.getWidth(); int width = this.getWidth();
int height = this.getHeight(); int height = this.getHeight();
if (size > width) { if (size > width) {

View File

@@ -155,8 +155,9 @@ public class TableColumnInfo<T> extends TableColumn {
* @param lambda0 the fnSort * @param lambda0 the fnSort
* @param lambda1 the fnDisplay * @param lambda1 the fnDisplay
*/ */
public void setSortAndDisplayFunctions(final Function<Entry<T, Integer>, Comparable<?>> lambda0, final Function<Entry<T, Integer>, Object> lambda1) { public void setSortAndDisplayFunctions(final Function<Entry<T, Integer>, Comparable<?>> lambda0, final Function<Entry<T, Integer>, Object> lambda1, ItemCellRenderer cellRenderer) {
this.fnSort = lambda0; this.fnSort = lambda0;
this.fnDisplay = lambda1; this.fnDisplay = lambda1;
this.setCellRenderer(cellRenderer);
} }
} }

View File

@@ -80,9 +80,9 @@ public final class NewConstants {
public static final String DECK_COMMANDER_DIR = DECK_BASE_DIR + "commander/"; 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 QUEST_SAVE_DIR = USER_QUEST_DIR + "saves/";
public static final String MAIN_PREFS_FILE = USER_PREFS_DIR + "forge.preferences"; 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"; 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 // data that has defaults in the program dir but overrides/additions in the user dir
private static final String _DEFAULTS_DIR = _RES_ROOT + "defaults/"; private static final String _DEFAULTS_DIR = _RES_ROOT + "defaults/";
public static final FileLocation EDITOR_PREFERENCES_FILE = new FileLocation(_DEFAULTS_DIR, USER_PREFS_DIR, "editor.preferences"); public static final FileLocation EDITOR_PREFERENCES_FILE = new FileLocation(_DEFAULTS_DIR, USER_PREFS_DIR, "editor.preferences");