forked from External/mage
add taggers
This commit is contained in:
parent
c52b976da0
commit
1473f83b15
9 changed files with 546 additions and 261 deletions
|
|
@ -7,6 +7,7 @@ import mage.cards.decks.Deck;
|
||||||
import mage.cards.repository.CardRepository;
|
import mage.cards.repository.CardRepository;
|
||||||
import mage.cards.repository.CardScanner;
|
import mage.cards.repository.CardScanner;
|
||||||
import mage.cards.repository.RepositoryUtil;
|
import mage.cards.repository.RepositoryUtil;
|
||||||
|
import mage.cards.repository.TagRepository;
|
||||||
import mage.client.cards.BigCard;
|
import mage.client.cards.BigCard;
|
||||||
import mage.client.chat.ChatPanelBasic;
|
import mage.client.chat.ChatPanelBasic;
|
||||||
import mage.client.components.*;
|
import mage.client.components.*;
|
||||||
|
|
@ -58,11 +59,14 @@ import org.apache.log4j.Logger;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.mage.card.arcane.ManaSymbols;
|
import org.mage.card.arcane.ManaSymbols;
|
||||||
import org.mage.card.arcane.SvgUtils;
|
import org.mage.card.arcane.SvgUtils;
|
||||||
|
import org.mage.plugins.card.dl.sources.TagSource;
|
||||||
import org.mage.plugins.card.images.DownloadPicturesService;
|
import org.mage.plugins.card.images.DownloadPicturesService;
|
||||||
import org.mage.plugins.card.info.CardInfoPaneImpl;
|
import org.mage.plugins.card.info.CardInfoPaneImpl;
|
||||||
import org.mage.plugins.card.utils.CardImageUtils;
|
import org.mage.plugins.card.utils.CardImageUtils;
|
||||||
import org.mage.plugins.card.utils.impl.ImageManagerImpl;
|
import org.mage.plugins.card.utils.impl.ImageManagerImpl;
|
||||||
|
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
|
||||||
import javax.imageio.ImageIO;
|
import javax.imageio.ImageIO;
|
||||||
import javax.swing.*;
|
import javax.swing.*;
|
||||||
import javax.swing.event.PopupMenuEvent;
|
import javax.swing.event.PopupMenuEvent;
|
||||||
|
|
@ -985,6 +989,8 @@ public class MageFrame extends javax.swing.JFrame implements MageClient {
|
||||||
popupDownload = new javax.swing.JPopupMenu();
|
popupDownload = new javax.swing.JPopupMenu();
|
||||||
menuDownloadSymbols = new javax.swing.JMenuItem();
|
menuDownloadSymbols = new javax.swing.JMenuItem();
|
||||||
menuDownloadImages = new javax.swing.JMenuItem();
|
menuDownloadImages = new javax.swing.JMenuItem();
|
||||||
|
menuDownloadTags = new javax.swing.JMenuItem();
|
||||||
|
|
||||||
desktopPane = new MageJDesktop();
|
desktopPane = new MageJDesktop();
|
||||||
mageToolbar = new javax.swing.JToolBar();
|
mageToolbar = new javax.swing.JToolBar();
|
||||||
btnPreferences = new javax.swing.JButton();
|
btnPreferences = new javax.swing.JButton();
|
||||||
|
|
@ -1046,6 +1052,14 @@ public class MageFrame extends javax.swing.JFrame implements MageClient {
|
||||||
});
|
});
|
||||||
popupDownload.add(menuDownloadImages);
|
popupDownload.add(menuDownloadImages);
|
||||||
|
|
||||||
|
menuDownloadTags.setText("Download Scryfall Tagger tags (this will freeze for a bit)");
|
||||||
|
menuDownloadTags.addActionListener(new java.awt.event.ActionListener() {
|
||||||
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
|
TagSource.instance.syncTagRepositiory();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
popupDownload.add(menuDownloadTags);
|
||||||
|
|
||||||
setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
|
setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
|
||||||
setMinimumSize(new java.awt.Dimension(1000, 500));
|
setMinimumSize(new java.awt.Dimension(1000, 500));
|
||||||
|
|
||||||
|
|
@ -1186,7 +1200,9 @@ public class MageFrame extends javax.swing.JFrame implements MageClient {
|
||||||
pack();
|
pack();
|
||||||
}// </editor-fold>//GEN-END:initComponents
|
}// </editor-fold>//GEN-END:initComponents
|
||||||
|
|
||||||
private void btnDeckEditorActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnDeckEditorActionPerformed
|
|
||||||
|
|
||||||
|
private void btnDeckEditorActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnDeckEditorActionPerformed
|
||||||
showDeckEditor(DeckEditorMode.FREE_BUILDING, null, null, null, 0);
|
showDeckEditor(DeckEditorMode.FREE_BUILDING, null, null, null, 0);
|
||||||
}//GEN-LAST:event_btnDeckEditorActionPerformed
|
}//GEN-LAST:event_btnDeckEditorActionPerformed
|
||||||
|
|
||||||
|
|
@ -1635,6 +1651,7 @@ public class MageFrame extends javax.swing.JFrame implements MageClient {
|
||||||
private javax.swing.JMenuItem menuDebugTestModalDialog;
|
private javax.swing.JMenuItem menuDebugTestModalDialog;
|
||||||
private javax.swing.JMenuItem menuDownloadImages;
|
private javax.swing.JMenuItem menuDownloadImages;
|
||||||
private javax.swing.JMenuItem menuDownloadSymbols;
|
private javax.swing.JMenuItem menuDownloadSymbols;
|
||||||
|
private javax.swing.JMenuItem menuDownloadTags;
|
||||||
private javax.swing.JPopupMenu popupDebug;
|
private javax.swing.JPopupMenu popupDebug;
|
||||||
private javax.swing.JPopupMenu popupDownload;
|
private javax.swing.JPopupMenu popupDownload;
|
||||||
private javax.swing.JToolBar.Separator separatorDebug;
|
private javax.swing.JToolBar.Separator separatorDebug;
|
||||||
|
|
@ -1947,6 +1964,7 @@ public class MageFrame extends javax.swing.JFrame implements MageClient {
|
||||||
|
|
||||||
menuDownloadSymbols.setFont(font);
|
menuDownloadSymbols.setFont(font);
|
||||||
menuDownloadImages.setFont(font);
|
menuDownloadImages.setFont(font);
|
||||||
|
menuDownloadTags.setFont(font);
|
||||||
menuDebugTestModalDialog.setFont(font);
|
menuDebugTestModalDialog.setFont(font);
|
||||||
menuDebugTestCardRenderModesDialog.setFont(font);
|
menuDebugTestCardRenderModesDialog.setFont(font);
|
||||||
menuDebugTestCustomCode.setFont(font);
|
menuDebugTestCustomCode.setFont(font);
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@ import mage.client.constants.Constants;
|
||||||
import mage.client.constants.Constants.SortBy;
|
import mage.client.constants.Constants.SortBy;
|
||||||
import mage.client.dialog.PreferencesDialog;
|
import mage.client.dialog.PreferencesDialog;
|
||||||
import mage.client.deckeditor.table.TableModel;
|
import mage.client.deckeditor.table.TableModel;
|
||||||
|
import mage.client.deckeditor.table.TaggerModel;
|
||||||
import mage.client.dialog.CheckBoxList;
|
import mage.client.dialog.CheckBoxList;
|
||||||
import mage.client.util.GUISizeHelper;
|
import mage.client.util.GUISizeHelper;
|
||||||
import mage.client.util.gui.FastSearchUtil;
|
import mage.client.util.gui.FastSearchUtil;
|
||||||
|
|
@ -35,7 +36,11 @@ import org.mage.card.arcane.ManaSymbolsCellRenderer;
|
||||||
import javafx.util.Pair;
|
import javafx.util.Pair;
|
||||||
|
|
||||||
import javax.swing.*;
|
import javax.swing.*;
|
||||||
|
import javax.swing.event.DocumentEvent;
|
||||||
|
import javax.swing.event.DocumentListener;
|
||||||
import javax.swing.table.DefaultTableCellRenderer;
|
import javax.swing.table.DefaultTableCellRenderer;
|
||||||
|
import javax.swing.table.TableColumnModel;
|
||||||
|
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
import java.awt.event.*;
|
import java.awt.event.*;
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
|
|
@ -118,15 +123,28 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
|
||||||
|
|
||||||
private void initListViewComponents() {
|
private void initListViewComponents() {
|
||||||
taggerTable = new JTable();
|
taggerTable = new JTable();
|
||||||
|
|
||||||
mainTable = new JTable();
|
mainTable = new JTable();
|
||||||
|
|
||||||
mainModel = new TableModel();
|
mainModel = new TableModel();
|
||||||
|
tagsModel = new TaggerModel(() -> filterCards());
|
||||||
|
|
||||||
|
tagsModel.addListeners(taggerTable);
|
||||||
|
taggerTable.setModel(tagsModel);
|
||||||
|
TableColumnModel taggerTableModel = taggerTable.getColumnModel();
|
||||||
|
taggerTableModel.getColumn(0).setMaxWidth(30);
|
||||||
|
taggerTableModel.getColumn(0).setPreferredWidth(30);
|
||||||
|
taggerTableModel.getColumn(1).setMaxWidth(30);
|
||||||
|
taggerTableModel.getColumn(1).setPreferredWidth(30);
|
||||||
|
taggerTableModel.getColumn(2).setMaxWidth(160);
|
||||||
|
taggerTableModel.getColumn(2).setPreferredWidth(160);
|
||||||
|
taggerTableModel.getColumn(4).setMaxWidth(60);
|
||||||
|
DefaultTableCellRenderer myRenderer = (DefaultTableCellRenderer) mainTable.getDefaultRenderer(String.class);
|
||||||
|
|
||||||
|
|
||||||
mainModel.addListeners(mainTable);
|
mainModel.addListeners(mainTable);
|
||||||
|
|
||||||
mainTable.setModel(mainModel);
|
mainTable.setModel(mainModel);
|
||||||
mainTable.setForeground(Color.white);
|
mainTable.setForeground(Color.white);
|
||||||
DefaultTableCellRenderer myRenderer = (DefaultTableCellRenderer) mainTable.getDefaultRenderer(String.class);
|
|
||||||
myRenderer.setBackground(new Color(0, 0, 0, 100));
|
myRenderer.setBackground(new Color(0, 0, 0, 100));
|
||||||
mainTable.getColumnModel().getColumn(0).setMaxWidth(0);
|
mainTable.getColumnModel().getColumn(0).setMaxWidth(0);
|
||||||
mainTable.getColumnModel().getColumn(0).setPreferredWidth(10);
|
mainTable.getColumnModel().getColumn(0).setPreferredWidth(10);
|
||||||
|
|
@ -201,6 +219,9 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
|
||||||
mainTable.setFont(GUISizeHelper.tableFont);
|
mainTable.setFont(GUISizeHelper.tableFont);
|
||||||
mainTable.setRowHeight(GUISizeHelper.tableRowHeight);
|
mainTable.setRowHeight(GUISizeHelper.tableRowHeight);
|
||||||
|
|
||||||
|
taggerTable.getTableHeader().setFont(GUISizeHelper.tableFont);
|
||||||
|
taggerTable.setFont(GUISizeHelper.tableFont);
|
||||||
|
taggerTable.setRowHeight(GUISizeHelper.tableRowHeight);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void switchToGrid() {
|
public void switchToGrid() {
|
||||||
|
|
@ -499,7 +520,7 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
|
||||||
|
|
||||||
if (limited) {
|
if (limited) {
|
||||||
for (Card card : cards) {
|
for (Card card : cards) {
|
||||||
if (filter.match(card, null)) {
|
if (filter.match(card, null) && tagsModel.testCard(card)) {
|
||||||
filteredCards.add(card);
|
filteredCards.add(card);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -518,6 +539,10 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
|
||||||
if (!filter.match(card, null)) {
|
if (!filter.match(card, null)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!tagsModel.testCard(card)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
// found
|
// found
|
||||||
filteredCards.add(card);
|
filteredCards.add(card);
|
||||||
}
|
}
|
||||||
|
|
@ -644,8 +669,70 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
|
||||||
cardCountLabel = new javax.swing.JLabel();
|
cardCountLabel = new javax.swing.JLabel();
|
||||||
cardCount = new javax.swing.JLabel();
|
cardCount = new javax.swing.JLabel();
|
||||||
|
|
||||||
|
// Brings me back to the Tk days
|
||||||
|
|
||||||
taggerScrollPane = new javax.swing.JScrollPane();
|
taggerScrollPane = new javax.swing.JScrollPane();
|
||||||
tablePanel = new javax.swing.JSplitPane(JSplitPane.HORIZONTAL_SPLIT, cardSelectorScrollPane, taggerScrollPane);
|
taggerContainer = new javax.swing.JPanel();
|
||||||
|
taggerContainer.setPreferredSize(new Dimension(200, 400));
|
||||||
|
taggerContainer.setLayout(new GridBagLayout());
|
||||||
|
GridBagConstraints gbc = new GridBagConstraints();
|
||||||
|
gbc.fill = GridBagConstraints.BOTH;
|
||||||
|
gbc.weighty = 1;
|
||||||
|
gbc.weightx = 1;
|
||||||
|
gbc.gridx = 0;
|
||||||
|
gbc.gridy = 0;
|
||||||
|
|
||||||
|
taggerControlBar = new javax.swing.JPanel();
|
||||||
|
taggerControlBar.setLayout(new GridBagLayout());
|
||||||
|
|
||||||
|
taggerReset = new javax.swing.JButton("Reset");
|
||||||
|
taggerReset.addActionListener(new java.awt.event.ActionListener() {
|
||||||
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
|
tagsModel.clear();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
taggerContainer.add(taggerScrollPane, gbc);
|
||||||
|
gbc.fill = GridBagConstraints.HORIZONTAL;
|
||||||
|
gbc.weighty = 0;
|
||||||
|
gbc.weightx = 1;
|
||||||
|
gbc.gridx = 0;
|
||||||
|
gbc.gridy = 1;
|
||||||
|
taggerContainer.add(taggerControlBar, gbc);
|
||||||
|
|
||||||
|
gbc.fill = GridBagConstraints.NONE;
|
||||||
|
gbc.weighty = 0;
|
||||||
|
gbc.weightx = 0;
|
||||||
|
gbc.gridx = 0;
|
||||||
|
gbc.gridy = 0;
|
||||||
|
|
||||||
|
taggerControlBar.add(taggerReset, gbc);
|
||||||
|
|
||||||
|
taggerSearch = new javax.swing.JTextField();
|
||||||
|
taggerSearch.getDocument().addDocumentListener(new DocumentListener() {
|
||||||
|
public void removeUpdate(DocumentEvent e) {
|
||||||
|
changedUpdate(e);
|
||||||
|
}
|
||||||
|
public void insertUpdate(DocumentEvent e) {
|
||||||
|
changedUpdate(e);
|
||||||
|
}
|
||||||
|
public void changedUpdate(DocumentEvent e) {
|
||||||
|
tagsModel.search(taggerSearch.getText());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
gbc.fill = GridBagConstraints.HORIZONTAL;
|
||||||
|
gbc.weighty = 1;
|
||||||
|
gbc.weightx = 1;
|
||||||
|
gbc.gridx = 1;
|
||||||
|
gbc.gridy = 0;
|
||||||
|
taggerControlBar.add(taggerSearch, gbc);
|
||||||
|
|
||||||
|
// End hell
|
||||||
|
|
||||||
|
tablePanel = new javax.swing.JSplitPane(JSplitPane.HORIZONTAL_SPLIT, cardSelectorScrollPane, taggerContainer);
|
||||||
|
tablePanel.setOneTouchExpandable(true);
|
||||||
|
tablePanel.setResizeWeight(1.0);
|
||||||
|
tablePanel.setDividerLocation(1.0);
|
||||||
|
|
||||||
tbColor.setFloatable(false);
|
tbColor.setFloatable(false);
|
||||||
tbColor.setRollover(true);
|
tbColor.setRollover(true);
|
||||||
|
|
@ -1353,6 +1440,9 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
|
||||||
.addGap(0, 0, 0)
|
.addGap(0, 0, 0)
|
||||||
.addComponent(cardSelectorBottomPanel, javax.swing.GroupLayout.PREFERRED_SIZE, 31, javax.swing.GroupLayout.PREFERRED_SIZE))
|
.addComponent(cardSelectorBottomPanel, javax.swing.GroupLayout.PREFERRED_SIZE, 31, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}// </editor-fold>//GEN-END:initComponents
|
}// </editor-fold>//GEN-END:initComponents
|
||||||
|
|
||||||
private void cbExpansionSetActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbExpansionSetActionPerformed
|
private void cbExpansionSetActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbExpansionSetActionPerformed
|
||||||
|
|
@ -1709,6 +1799,7 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
|
||||||
}
|
}
|
||||||
|
|
||||||
private TableModel mainModel;
|
private TableModel mainModel;
|
||||||
|
private TaggerModel tagsModel;
|
||||||
private JTable mainTable;
|
private JTable mainTable;
|
||||||
private JTable taggerTable;
|
private JTable taggerTable;
|
||||||
private ICardGrid currentView;
|
private ICardGrid currentView;
|
||||||
|
|
@ -1774,6 +1865,13 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
|
||||||
private javax.swing.JToggleButton tbWhite;
|
private javax.swing.JToggleButton tbWhite;
|
||||||
|
|
||||||
private javax.swing.JScrollPane taggerScrollPane;
|
private javax.swing.JScrollPane taggerScrollPane;
|
||||||
|
private javax.swing.JPanel taggerControlBar;
|
||||||
|
private javax.swing.JTextField taggerSearch;
|
||||||
|
private javax.swing.JButton taggerReset;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private javax.swing.JPanel taggerContainer;
|
||||||
private javax.swing.JSplitPane tablePanel;
|
private javax.swing.JSplitPane tablePanel;
|
||||||
|
|
||||||
// End of variables declaration//GEN-END:variables
|
// End of variables declaration//GEN-END:variables
|
||||||
|
|
|
||||||
|
|
@ -1,83 +1,68 @@
|
||||||
package mage.client.deckeditor.table;
|
package mage.client.deckeditor.table;
|
||||||
|
|
||||||
import mage.client.MageFrame;
|
|
||||||
import mage.client.cards.BigCard;
|
import mage.client.cards.BigCard;
|
||||||
import mage.client.cards.CardEventSource;
|
import mage.cards.Card;
|
||||||
import mage.client.cards.ICardGrid;
|
import mage.cards.repository.CardInfo;
|
||||||
import mage.client.deckeditor.SortSetting;
|
import mage.cards.repository.Tag;
|
||||||
import mage.client.plugins.impl.Plugins;
|
import mage.cards.repository.TagRepository;
|
||||||
import mage.client.util.ClientDefaultSettings;
|
|
||||||
import mage.client.util.ClientEventType;
|
|
||||||
import mage.client.util.Event;
|
|
||||||
import mage.client.util.Listener;
|
|
||||||
import mage.client.util.gui.GuiDisplayUtil;
|
|
||||||
import mage.constants.EnlargeMode;
|
|
||||||
import mage.cards.RateCard;
|
|
||||||
import mage.view.CardView;
|
|
||||||
import mage.view.CardsView;
|
|
||||||
import org.apache.log4j.Logger;
|
|
||||||
import org.jdesktop.swingx.JXPanel;
|
|
||||||
import org.mage.card.arcane.ManaSymbols;
|
|
||||||
|
|
||||||
|
import org.apache.commons.lang3.ObjectUtils;
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
import javax.swing.*;
|
import javax.swing.*;
|
||||||
import javax.swing.table.AbstractTableModel;
|
import javax.swing.table.AbstractTableModel;
|
||||||
import javax.swing.table.TableColumnModel;
|
import javax.swing.table.TableColumnModel;
|
||||||
import java.awt.*;
|
|
||||||
import java.awt.event.*;
|
import java.awt.event.*;
|
||||||
import java.awt.image.BufferedImage;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.Map.Entry;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Table Model for card list.
|
|
||||||
*
|
|
||||||
* @author nantuko
|
|
||||||
*/
|
|
||||||
public class TaggerModel extends AbstractTableModel {
|
public class TaggerModel extends AbstractTableModel {
|
||||||
|
|
||||||
private static final long serialVersionUID = -528008802935423048L;
|
private static final long serialVersionUID = -528008802935423048L;
|
||||||
|
|
||||||
private static final Logger log = Logger.getLogger(TableModel.class);
|
private static final Logger log = Logger.getLogger(TableModel.class);
|
||||||
|
|
||||||
protected final CardEventSource cardEventSource = new CardEventSource();
|
|
||||||
protected BigCard bigCard;
|
protected BigCard bigCard;
|
||||||
protected UUID gameId;
|
protected UUID gameId;
|
||||||
private final Map<UUID, CardView> cards = new LinkedHashMap<>();
|
private List<Tag> view = new ArrayList<Tag>();
|
||||||
private final Map<String, Integer> cardsNoCopies = new LinkedHashMap<>();
|
public Map<String, Boolean> filtered = new HashMap<String, Boolean>();
|
||||||
private final List<CardView> view = new ArrayList<>();
|
public Set<String> whitelist = new HashSet<String>();
|
||||||
private Dimension cardDimension;
|
public Set<String> blacklist = new HashSet<String>();
|
||||||
|
|
||||||
private boolean displayNoCopies = false;
|
private final String[] column = {"Inc", "Exc", "Name", "Description", "# Cards"};
|
||||||
private UpdateCountsCallback updateCountsCallback;
|
|
||||||
|
|
||||||
private final String[] column = {"Qty", "Name", "Cost", "Color", "Type", "Stats", "Rarity", "Set", "Card number", "Draft Rating", "Color Identity"};
|
private boolean descending = false;
|
||||||
public final int COLUMN_INDEX_COST = 2;
|
private int columnSortedBy = 0;
|
||||||
public final int COLUMN_INDEX_RATING = 9;
|
|
||||||
public final int COLUMN_INDEX_COLOR_IDENTITY = 10;
|
|
||||||
|
|
||||||
private SortSetting sortSetting;
|
|
||||||
private int recentSortedColumn;
|
private int recentSortedColumn;
|
||||||
private boolean recentAscending;
|
private boolean recentAscending;
|
||||||
|
private Runnable doSort;
|
||||||
|
|
||||||
private boolean numberEditable;
|
|
||||||
|
|
||||||
public TaggerModel() {
|
public TaggerModel(Runnable sortFn) {
|
||||||
this.numberEditable = false;
|
doSort = sortFn;
|
||||||
|
view = TagRepository.instance.getAllTags();
|
||||||
|
if (view.size() == 0) {
|
||||||
|
Tag placeholder = new Tag();
|
||||||
|
placeholder.id = "";
|
||||||
|
placeholder.description = "Please download Scryfall tags from the 'download' tab & reopen";
|
||||||
|
placeholder.label = "Data missing!";
|
||||||
|
view.add(placeholder);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void clear() {
|
public void clear() {
|
||||||
this.clearCardEventListeners();
|
view = TagRepository.instance.getAllTags();
|
||||||
this.clearCards();
|
this.whitelist.clear();
|
||||||
this.view.clear();
|
this.blacklist.clear();
|
||||||
|
doSort.run();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void search(String query) {
|
||||||
public void clearCards() {
|
view = TagRepository.instance.searchTags(query);
|
||||||
view.clear();
|
fireTableDataChanged();
|
||||||
cards.clear();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getRowCount() {
|
public int getRowCount() {
|
||||||
return view.size();
|
return view.size();
|
||||||
|
|
@ -95,136 +80,63 @@ public class TaggerModel extends AbstractTableModel {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object getValueAt(int row, int column) {
|
public Object getValueAt(int row, int column) {
|
||||||
return getColumn(view.get(row), column);
|
Tag tag = view.get(row);
|
||||||
|
switch (column) {
|
||||||
|
case 0:
|
||||||
|
return filtered.getOrDefault(tag.id, false) == true ? "X" : "";
|
||||||
|
case 1:
|
||||||
|
return filtered.getOrDefault(tag.id, true) == false ? "X" : "";
|
||||||
|
case 2:
|
||||||
|
return view.get(row).label;
|
||||||
|
case 3:
|
||||||
|
return view.get(row).description;
|
||||||
|
case 4:
|
||||||
|
return Long.toString(TagRepository.instance.getTagCardCount(view.get(row)));
|
||||||
|
}
|
||||||
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
private Object getColumn(Object obj, int column) {
|
|
||||||
CardView c = (CardView) obj;
|
|
||||||
switch (column) {
|
|
||||||
case 0:
|
|
||||||
if (displayNoCopies) {
|
|
||||||
String key = c.getName() + c.getExpansionSetCode() + c.getCardNumber();
|
|
||||||
Integer count = cardsNoCopies.get(key);
|
|
||||||
return count != null ? count : "";
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
case 1:
|
|
||||||
return c.getDisplayFullName(); // show full name in deck editor table, e.g. adventure with spell name
|
|
||||||
case 2:
|
|
||||||
// new svg images version
|
|
||||||
return ManaSymbols.getClearManaCost(c.getManaCostStr());
|
|
||||||
/*
|
|
||||||
// old html images version
|
|
||||||
String manaCost = "";
|
|
||||||
for (String m : c.getManaCost()) {
|
|
||||||
manaCost += m;
|
|
||||||
}
|
|
||||||
String castingCost = UI.getDisplayManaCost(manaCost);
|
|
||||||
castingCost = ManaSymbols.replaceSymbolsWithHTML(castingCost, ManaSymbols.Type.TABLE);
|
|
||||||
return "<html>" + castingCost + "</html>";
|
|
||||||
return castingCost;
|
|
||||||
*/
|
|
||||||
case 3:
|
|
||||||
return c.getColorText();
|
|
||||||
case 4:
|
|
||||||
return c.getTypeText();
|
|
||||||
case 5:
|
|
||||||
return c.isCreature() ? c.getPower() + '/'
|
|
||||||
+ c.getToughness() : "-";
|
|
||||||
case 6:
|
|
||||||
return c.getRarity() == null ? "" : c.getRarity().toString();
|
|
||||||
case 7:
|
|
||||||
return c.getExpansionSetCode();
|
|
||||||
case 8:
|
|
||||||
return c.getCardNumber();
|
|
||||||
case 9:
|
|
||||||
return RateCard.rateCard(c, Collections.emptyList());
|
|
||||||
case 10:
|
|
||||||
return ManaSymbols.getClearManaCost(c.getOriginalColorIdentity());
|
|
||||||
default:
|
|
||||||
return "error";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void addCard(CardView card, BigCard bigCard, UUID gameId) {
|
public void doubleClick(int index) {
|
||||||
if (cardDimension == null) {
|
Tag tag = view.get(index);
|
||||||
cardDimension = new Dimension(ClientDefaultSettings.dimensions.getFrameWidth(),
|
if (!filtered.containsKey(tag.id)) {
|
||||||
ClientDefaultSettings.dimensions.getFrameHeight());
|
filtered.put(tag.id, true);
|
||||||
}
|
} else if (filtered.get(tag.id)) {
|
||||||
cards.put(card.getId(), card);
|
filtered.put(tag.id, false);
|
||||||
|
|
||||||
if (displayNoCopies) {
|
|
||||||
String key = card.getName() + card.getExpansionSetCode() + card.getCardNumber();
|
|
||||||
Integer count = 1;
|
|
||||||
if (cardsNoCopies.containsKey(key)) {
|
|
||||||
count = cardsNoCopies.get(key) + 1;
|
|
||||||
} else {
|
|
||||||
view.add(card);
|
|
||||||
}
|
|
||||||
cardsNoCopies.put(key, count);
|
|
||||||
} else {
|
} else {
|
||||||
view.add(card);
|
filtered.remove(tag.id);
|
||||||
}
|
}
|
||||||
}
|
fireTableCellUpdated(index, 0);
|
||||||
|
fireTableCellUpdated(index, 1);
|
||||||
@Override
|
buildBlacklist();
|
||||||
public void drawCards(SortSetting sortSetting) {
|
buildWhitelist();
|
||||||
fireTableDataChanged();
|
doSort.run();
|
||||||
}
|
|
||||||
|
|
||||||
public void removeCard(UUID cardId) {
|
|
||||||
cards.remove(cardId);
|
|
||||||
view.removeIf(cardView -> cardView.getId().equals(cardId));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void addCardEventListener(Listener<Event> listener) {
|
|
||||||
cardEventSource.addListener(listener);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void clearCardEventListeners() {
|
|
||||||
cardEventSource.clearListeners();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setNumber(int index, int number) {
|
|
||||||
CardView card = view.get(index);
|
|
||||||
cardEventSource.fireEvent(card, ClientEventType.SET_NUMBER, number);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void doubleClick(int index, MouseEvent e, boolean forceFakeAltDown) {
|
|
||||||
CardView card = view.get(index);
|
|
||||||
cardEventSource.fireEvent(card, ClientEventType.CARD_DOUBLE_CLICK, e, forceFakeAltDown);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void removeFromMainEvent(int index) {
|
|
||||||
cardEventSource.fireEvent(ClientEventType.DECK_REMOVE_SELECTION_MAIN);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void removeFromSideEvent(int index) {
|
|
||||||
cardEventSource.fireEvent(ClientEventType.DECK_REMOVE_SELECTION_SIDEBOARD);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addListeners(final JTable table) {
|
public void addListeners(final JTable table) {
|
||||||
// updates card detail, listens to any key strokes
|
// sorts
|
||||||
|
MouseListener mouse = new MouseAdapter() {
|
||||||
table.addKeyListener(new KeyListener() {
|
|
||||||
@Override
|
@Override
|
||||||
public void keyPressed(KeyEvent ev) {
|
public void mousePressed(MouseEvent e) {
|
||||||
}
|
if (!SwingUtilities.isLeftMouseButton(e)) {
|
||||||
|
return;
|
||||||
@Override
|
|
||||||
public void keyTyped(KeyEvent ev) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void keyReleased(KeyEvent ev) {
|
|
||||||
int row = table.getSelectedRow();
|
|
||||||
if (row != -1) {
|
|
||||||
showImage(row);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TableColumnModel columnModel = table.getColumnModel();
|
||||||
|
|
||||||
|
int viewColumn = columnModel.getColumnIndexAtX(e.getX());
|
||||||
|
int column = table.convertColumnIndexToModel(viewColumn);
|
||||||
|
|
||||||
|
if (column != -1) {
|
||||||
|
descending = !descending;
|
||||||
|
columnSortedBy = column;
|
||||||
|
sort();
|
||||||
|
fireTableDataChanged();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
});
|
};
|
||||||
|
table.getTableHeader().addMouseListener(mouse);
|
||||||
|
|
||||||
// updates card detail, listens to any mouse clicks
|
// updates card detail, listens to any mouse clicks
|
||||||
table.addMouseListener(new MouseAdapter() {
|
table.addMouseListener(new MouseAdapter() {
|
||||||
|
|
@ -233,81 +145,79 @@ public class TaggerModel extends AbstractTableModel {
|
||||||
if (!SwingUtilities.isLeftMouseButton(e)) {
|
if (!SwingUtilities.isLeftMouseButton(e)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
int row = table.getSelectedRow();
|
if (e.getClickCount() % 2 == 0) {
|
||||||
if (row != -1) {
|
doubleClick(table.getSelectedRow());
|
||||||
showImage(row);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// sorts
|
|
||||||
MouseListener mouse = new MouseAdapter() {
|
|
||||||
@Override
|
|
||||||
public void mousePressed(MouseEvent e) {
|
|
||||||
if (!SwingUtilities.isLeftMouseButton(e)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
TableColumnModel columnModel = table.getColumnModel();
|
|
||||||
int viewColumn = columnModel.getColumnIndexAtX(e.getX());
|
|
||||||
int column = table.convertColumnIndexToModel(viewColumn);
|
|
||||||
|
|
||||||
if (column != -1) {
|
|
||||||
// sort ascending
|
|
||||||
boolean asc = true;
|
|
||||||
if (recentSortedColumn == column) {
|
|
||||||
asc = !recentAscending;
|
|
||||||
}
|
|
||||||
sortSetting.setSortIndex(column);
|
|
||||||
sortSetting.setAscending(asc);
|
|
||||||
sort(column, asc);
|
|
||||||
fireTableDataChanged();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
table.getTableHeader().addMouseListener(mouse);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void showImage(int row) {
|
public boolean sort() {
|
||||||
CardView card = view.get(row);
|
switch (columnSortedBy) {
|
||||||
if (!card.getId().equals(bigCard.getCardId())) {
|
// I do not care.
|
||||||
if (!MageFrame.isLite()) {
|
case 0:
|
||||||
Image image = Plugins.instance.getOriginalImage(card);
|
view.sort((t1, t2) -> (filtered.getOrDefault(t1.id, false) == true ? "X" : "").compareTo((filtered.getOrDefault(t2.id, false) == true ? "X" : "")));
|
||||||
if (image instanceof BufferedImage) {
|
break;
|
||||||
// XXX: scaled to fit width
|
case 1:
|
||||||
bigCard.setCard(card.getId(), EnlargeMode.NORMAL, image, new ArrayList<>(), false);
|
view.sort((t1, t2) -> (filtered.getOrDefault(t1.id, true) == false ? "X" : "").compareTo((filtered.getOrDefault(t2.id, true) == false ? "X" : "")));
|
||||||
} else {
|
break;
|
||||||
drawCardText(card);
|
case 2:
|
||||||
}
|
view.sort((t1, t2) -> ObjectUtils.compare(t1.label, t2.label));
|
||||||
} else {
|
break;
|
||||||
drawCardText(card);
|
case 3:
|
||||||
}
|
view.sort((t1, t2) -> ObjectUtils.compare(t1.description, t2.description));
|
||||||
}
|
break;
|
||||||
}
|
case 4:
|
||||||
|
view.sort((t1, t2) -> TagRepository.instance.getTagCardCount(t2) - TagRepository.instance.getTagCardCount(t1));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
private void drawCardText(CardView card) {
|
if (descending) {
|
||||||
JXPanel panel = GuiDisplayUtil.getDescription(card, bigCard.getWidth(), bigCard.getHeight());
|
Collections.reverse(view);
|
||||||
panel.setVisible(true);
|
}
|
||||||
bigCard.hideTextComponent();
|
|
||||||
bigCard.addJXPanel(card.getId(), panel);
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<CardView> getCardsView() {
|
|
||||||
return view;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean sort(int column, boolean ascending) {
|
|
||||||
// used by addCard() to resort the cards
|
|
||||||
recentSortedColumn = column;
|
|
||||||
recentAscending = ascending;
|
|
||||||
|
|
||||||
MageCardComparator sorter = new MageCardComparator(column, ascending);
|
|
||||||
view.sort(sorter);
|
|
||||||
|
|
||||||
fireTableDataChanged();
|
fireTableDataChanged();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Set<String> buildWhitelist() {
|
||||||
|
whitelist.clear();
|
||||||
|
for (String key : filtered.keySet()) {
|
||||||
|
if (filtered.get(key)) {
|
||||||
|
for (CardInfo card : TagRepository.instance.getCardsByTagId(key)) {
|
||||||
|
whitelist.add(card.getName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return whitelist;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<String> buildBlacklist() {
|
||||||
|
blacklist.clear();
|
||||||
|
for (String key : filtered.keySet()) {
|
||||||
|
if (!filtered.get(key)) {
|
||||||
|
for (CardInfo card : TagRepository.instance.getCardsByTagId(key)) {
|
||||||
|
blacklist.remove(card.getName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return blacklist;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean testCard(Card card) {
|
||||||
|
if (!hasAnySelected()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return !blacklist.contains(card.getName()) && (whitelist.size() == 0 || whitelist.contains(card.getName()));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public boolean hasAnySelected() {
|
||||||
|
return filtered.size() > 0;
|
||||||
|
}
|
||||||
|
|
||||||
public int getRecentSortedColumn() {
|
public int getRecentSortedColumn() {
|
||||||
return recentSortedColumn;
|
return recentSortedColumn;
|
||||||
}
|
}
|
||||||
|
|
@ -316,29 +226,5 @@ public class TaggerModel extends AbstractTableModel {
|
||||||
return recentAscending;
|
return recentAscending;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setDisplayNoCopies(boolean value) {
|
|
||||||
this.displayNoCopies = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setUpdateCountsCallback(UpdateCountsCallback callback) {
|
|
||||||
this.updateCountsCallback = callback;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setNumberEditable(boolean numberEditable) {
|
|
||||||
this.numberEditable = numberEditable;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int cardsSize() {
|
|
||||||
return cards.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isCellEditable(int row, int col) {
|
|
||||||
if (numberEditable && col == 0) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return super.isCellEditable(row, col);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -18,5 +18,7 @@ public enum ClientEventType {
|
||||||
DRAFT_PICK_CARD,
|
DRAFT_PICK_CARD,
|
||||||
DRAFT_MARK_CARD,
|
DRAFT_MARK_CARD,
|
||||||
//
|
//
|
||||||
PLAYER_TYPE_CHANGED
|
PLAYER_TYPE_CHANGED,
|
||||||
|
//
|
||||||
|
TAG_DOUBLE_CLICK
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,49 @@
|
||||||
|
package org.mage.plugins.card.dl.sources;
|
||||||
|
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
|
||||||
|
import mage.cards.repository.Tag;
|
||||||
|
import mage.cards.repository.TagRepository;
|
||||||
|
import mage.client.remote.XmageURLConnection;
|
||||||
|
|
||||||
|
class RawTag {
|
||||||
|
public String object;
|
||||||
|
public String id;
|
||||||
|
public String label;
|
||||||
|
public String type;
|
||||||
|
public String description;
|
||||||
|
public List<String> oracle_ids;
|
||||||
|
}
|
||||||
|
|
||||||
|
class OracleResponse {
|
||||||
|
public String object;
|
||||||
|
public boolean has_more;
|
||||||
|
public List<RawTag> data;
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum TagSource {
|
||||||
|
instance;
|
||||||
|
private static final Logger LOGGER = Logger.getLogger(TagSource.class);
|
||||||
|
|
||||||
|
public void syncTagRepositiory() {
|
||||||
|
String oracle = XmageURLConnection.downloadText("https://api.scryfall.com/private/tags/oracle");
|
||||||
|
OracleResponse response = new Gson().fromJson(oracle, OracleResponse.class);
|
||||||
|
String tagCount = Integer.toString(response.data.size());
|
||||||
|
int i = 0;
|
||||||
|
for (RawTag rawTag : response.data) {
|
||||||
|
LOGGER.debug("Syncing tag: " + rawTag.label + " (" + Integer.toString(i) + "/" + tagCount + ")");
|
||||||
|
Tag tag = new Tag();
|
||||||
|
tag.id = rawTag.id;
|
||||||
|
tag.description = rawTag.description;
|
||||||
|
tag.label = rawTag.label;
|
||||||
|
TagRepository.instance.syncTag(tag, rawTag.oracle_ids);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -579,6 +579,16 @@ public enum CardRepository {
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<CardInfo> findCardsWithTagRelations(List<TagRelation> tagRelations) {
|
||||||
|
try {
|
||||||
|
List<CardInfo> result = cardsDao.queryBuilder().where().in("oracleId", tagRelations.stream().map(id -> id.oracle_id).toArray()).query();
|
||||||
|
return result;
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return new ArrayList<CardInfo>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public List<CardInfo> findCards(String name, long limitByMaxAmount) {
|
public List<CardInfo> findCards(String name, long limitByMaxAmount) {
|
||||||
return findCards(name, limitByMaxAmount, false, true);
|
return findCards(name, limitByMaxAmount, false, true);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
20
Mage/src/main/java/mage/cards/repository/Tag.java
Normal file
20
Mage/src/main/java/mage/cards/repository/Tag.java
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
package mage.cards.repository;
|
||||||
|
|
||||||
|
import com.j256.ormlite.field.DatabaseField;
|
||||||
|
import com.j256.ormlite.table.DatabaseTable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author JayDi85
|
||||||
|
*/
|
||||||
|
@DatabaseTable(tableName = "tag")
|
||||||
|
public class Tag {
|
||||||
|
|
||||||
|
@DatabaseField(id = true)
|
||||||
|
public String id;
|
||||||
|
|
||||||
|
@DatabaseField()
|
||||||
|
public String label;
|
||||||
|
|
||||||
|
@DatabaseField(canBeNull = true)
|
||||||
|
public String description;
|
||||||
|
}
|
||||||
18
Mage/src/main/java/mage/cards/repository/TagRelation.java
Normal file
18
Mage/src/main/java/mage/cards/repository/TagRelation.java
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
package mage.cards.repository;
|
||||||
|
|
||||||
|
import com.j256.ormlite.field.DatabaseField;
|
||||||
|
import com.j256.ormlite.table.DatabaseTable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author JayDi85
|
||||||
|
*/
|
||||||
|
@DatabaseTable(tableName = "tag_relation")
|
||||||
|
public class TagRelation {
|
||||||
|
|
||||||
|
@DatabaseField(indexName = "tags_oracle_id_index", uniqueCombo = true)
|
||||||
|
protected String oracle_id;
|
||||||
|
|
||||||
|
@DatabaseField(indexName = "tags_tag_id_index", foreign = true, columnName = "tag_id")
|
||||||
|
protected Tag tag;
|
||||||
|
|
||||||
|
}
|
||||||
184
Mage/src/main/java/mage/cards/repository/TagRepository.java
Normal file
184
Mage/src/main/java/mage/cards/repository/TagRepository.java
Normal file
|
|
@ -0,0 +1,184 @@
|
||||||
|
package mage.cards.repository;
|
||||||
|
|
||||||
|
import com.j256.ormlite.dao.Dao;
|
||||||
|
import com.j256.ormlite.dao.DaoManager;
|
||||||
|
import com.j256.ormlite.jdbc.JdbcConnectionSource;
|
||||||
|
import com.j256.ormlite.stmt.DeleteBuilder;
|
||||||
|
import com.j256.ormlite.stmt.QueryBuilder;
|
||||||
|
import com.j256.ormlite.support.ConnectionSource;
|
||||||
|
import com.j256.ormlite.support.DatabaseConnection;
|
||||||
|
import com.j256.ormlite.table.TableUtils;
|
||||||
|
|
||||||
|
import mage.constants.SetType;
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author North, JayDi85
|
||||||
|
*/
|
||||||
|
public enum TagRepository {
|
||||||
|
|
||||||
|
instance;
|
||||||
|
|
||||||
|
private static final Logger logger = Logger.getLogger(TagRepository.class);
|
||||||
|
|
||||||
|
// fixes limit for out of memory problems
|
||||||
|
private static final AtomicInteger databaseFixes = new AtomicInteger();
|
||||||
|
|
||||||
|
private static final int MAX_DATABASE_FIXES = 10;
|
||||||
|
|
||||||
|
private static final String VERSION_ENTITY_NAME = "tags";
|
||||||
|
private static final long TAG_VERSION = 2; // raise this if db structure was changed
|
||||||
|
private static final long TAG_RELATION_VERSION = 2; // raise this if new cards were added to the server
|
||||||
|
|
||||||
|
private Dao<Tag, Object> tagsDao;
|
||||||
|
private Dao<TagRelation, Object> tagRelationDao;
|
||||||
|
|
||||||
|
|
||||||
|
TagRepository() {
|
||||||
|
File file = new File("db");
|
||||||
|
if (!file.exists()) {
|
||||||
|
file.mkdirs();
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
ConnectionSource connectionSource = new JdbcConnectionSource(DatabaseUtils.prepareH2Connection(DatabaseUtils.DB_NAME_CARDS, true));
|
||||||
|
|
||||||
|
boolean isObsolete = RepositoryUtil.isDatabaseObsolete(connectionSource, VERSION_ENTITY_NAME, TAG_VERSION);
|
||||||
|
boolean isNewBuild = RepositoryUtil.isNewBuildRun(connectionSource, VERSION_ENTITY_NAME, TagRepository.class); // recreate db on new build
|
||||||
|
if (isObsolete || isNewBuild) {
|
||||||
|
//System.out.println("Local cards db is outdated, cleaning...");
|
||||||
|
TableUtils.dropTable(connectionSource, TagRelation.class, true);
|
||||||
|
TableUtils.dropTable(connectionSource, Tag.class, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
TableUtils.createTableIfNotExists(connectionSource, Tag.class);
|
||||||
|
TableUtils.createTableIfNotExists(connectionSource, TagRelation.class);
|
||||||
|
|
||||||
|
tagsDao = DaoManager.createDao(connectionSource, Tag.class);
|
||||||
|
tagRelationDao = DaoManager.createDao(connectionSource, TagRelation.class);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
Logger.getLogger(TagRepository.class).error("Error creating tags repository - " + e, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Tag> getTagsFromCard(CardInfo card) {
|
||||||
|
try {
|
||||||
|
List<TagRelation> relations = tagRelationDao.queryForEq("oracle_id", card.oracleId);
|
||||||
|
return tagsDao.queryBuilder().where().in("id", relations.stream().map((TagRelation rel) -> rel.tag)).query();
|
||||||
|
} catch (SQLException e) {
|
||||||
|
return new ArrayList<Tag>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<CardInfo> getCardsByTag(Tag tag) {
|
||||||
|
try {
|
||||||
|
List<TagRelation> relations = tagRelationDao.queryForEq("tag_id", tag.id);
|
||||||
|
return CardRepository.instance.findCardsWithTagRelations(relations);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return new ArrayList<CardInfo>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<CardInfo> getCardsByTagId(String id) {
|
||||||
|
try {
|
||||||
|
return getCardsByTag(tagsDao.queryForId(id));
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return new ArrayList<CardInfo>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void syncTag(final Tag tag, List<String> oracleIds ) {
|
||||||
|
if (tag == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
tagsDao.createOrUpdate(tag);
|
||||||
|
tagRelationDao.callBatchTasks(() -> {
|
||||||
|
// only add new cards (no updates)
|
||||||
|
logger.info("DB: refreshing tag " + tag.label);
|
||||||
|
// clear out old ones
|
||||||
|
DeleteBuilder<TagRelation, Object> cleanser = tagRelationDao.deleteBuilder();
|
||||||
|
cleanser.where().eq("tag_id", tag.id);
|
||||||
|
cleanser.delete();
|
||||||
|
try {
|
||||||
|
for (String oracleId : oracleIds) {
|
||||||
|
TagRelation relation = new TagRelation();
|
||||||
|
relation.oracle_id = oracleId;
|
||||||
|
relation.tag = tag;
|
||||||
|
tagRelationDao.create(relation);
|
||||||
|
}
|
||||||
|
} catch (SQLException e) {
|
||||||
|
Logger.getLogger(TagRepository.class).error("Error adding tags to DB - " + e, e);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
});
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
} catch (Exception ex) {
|
||||||
|
//
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public void closeDB(boolean writeCompact) {
|
||||||
|
try {
|
||||||
|
if (tagsDao != null && tagsDao.getConnectionSource() != null) {
|
||||||
|
DatabaseConnection conn = tagsDao.getConnectionSource().getReadWriteConnection(tagsDao.getTableName());
|
||||||
|
if (writeCompact) {
|
||||||
|
conn.executeStatement("SHUTDOWN COMPACT", DatabaseConnection.DEFAULT_RESULT_FLAGS); // compact data and rewrite whole db
|
||||||
|
} else {
|
||||||
|
conn.executeStatement("SHUTDOWN IMMEDIATELY", DatabaseConnection.DEFAULT_RESULT_FLAGS); // close without any writes
|
||||||
|
}
|
||||||
|
tagsDao.getConnectionSource().releaseConnection(conn);
|
||||||
|
}
|
||||||
|
} catch (SQLException ignore) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void openDB() {
|
||||||
|
try {
|
||||||
|
ConnectionSource connectionSource = new JdbcConnectionSource(DatabaseUtils.prepareH2Connection(DatabaseUtils.DB_NAME_CARDS, true));
|
||||||
|
tagsDao = DaoManager.createDao(connectionSource, Tag.class);
|
||||||
|
tagRelationDao = DaoManager.createDao(connectionSource, TagRelation.class);
|
||||||
|
|
||||||
|
} catch (SQLException e) {
|
||||||
|
Logger.getLogger(TagRepository.class).error("Error opening tag repository - " + e, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Tag> getAllTags() {
|
||||||
|
try {
|
||||||
|
return tagsDao.queryForAll();
|
||||||
|
} catch (SQLException e) {
|
||||||
|
return new ArrayList<Tag>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Tag> searchTags(String query) {
|
||||||
|
try {
|
||||||
|
return tagsDao.queryBuilder().where().like("label", "%"+query.replace(' ', '-')+"%").query();
|
||||||
|
} catch (SQLException e) {
|
||||||
|
return new ArrayList<Tag>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getTagCardCount(Tag tag) {
|
||||||
|
try {
|
||||||
|
return (int) tagRelationDao.queryBuilder().where().eq("tag_id", tag.id).countOf();
|
||||||
|
} catch (SQLException e) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue