* GUI: new reworked GUI and card render engine, card icons and dozens of other fixes (see full list in related PR);

This commit is contained in:
Oleg Agafonov 2021-01-30 16:38:55 +04:00
parent df98cc3e62
commit a1da5ef437
304 changed files with 7266 additions and 5093 deletions

View file

@ -1,8 +1,3 @@
/*
* CardSelector.java
*
* Created on Feb 18, 2010, 2:49:03 PM
*/
package mage.client.deckeditor;
import mage.MageObject;
@ -1272,7 +1267,8 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
java.util.List<Integer> indexes = asList(n);
Collections.reverse(indexes);
for (Integer index : indexes) {
mainModel.doubleClick(index);
// normal double click emulation
mainModel.doubleClick(index, null, false);
}
//if (!mode.equals(Constants.DeckEditorMode.Constructed))
if (limited) {
@ -1287,7 +1283,8 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
java.util.List<Integer> indexes = asList(n);
Collections.reverse(indexes);
for (Integer index : indexes) {
mainModel.altDoubleClick(index);
// ALT double click emulation
mainModel.doubleClick(index, null, true);
}
//if (!mode.equals(Constants.DeckEditorMode.Constructed))
if (limited) {
@ -1537,7 +1534,7 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
private javax.swing.JToggleButton tbWhite;
// End of variables declaration//GEN-END:variables
private final mage.client.cards.CardGrid cardGrid;
private final mage.client.cards.CardGrid cardGrid; // grid for piles view mode (example: selected cards in drafting)
@Override
public void componentResized(ComponentEvent e) {

View file

@ -92,8 +92,8 @@ public class DeckArea extends javax.swing.JPanel {
// Add to hidden and move to sideboard
for (CardView card : cards) {
hiddenCards.add(card.getId());
maindeckVirtualEvent.fireEvent(card, ClientEventType.REMOVE_SPECIFIC_CARD);
sideboardVirtualEvent.fireEvent(card, ClientEventType.ADD_SPECIFIC_CARD);
maindeckVirtualEvent.fireEvent(card, ClientEventType.DECK_REMOVE_SPECIFIC_CARD);
sideboardVirtualEvent.fireEvent(card, ClientEventType.DECK_ADD_SPECIFIC_CARD);
}
loadDeck(lastDeck, lastBigCard);
}

View file

@ -304,77 +304,92 @@ public class DeckEditorPanel extends javax.swing.JPanel {
private void init() {
//this.cardSelector.setVisible(true);
this.panelLeft.setVisible(true);
// TOP AREA: ENABLE ADDING/REMOVING BY DOUBLE CLICKS
for (ICardGrid component : this.cardSelector.getCardGridComponents()) {
component.clearCardEventListeners();
//component.clearCardEventListeners();
component.addCardEventListener((Listener<Event>) event -> {
switch (event.getEventType()) {
case DOUBLE_CLICK:
moveSelectorCardToDeck(event);
break;
case ALT_DOUBLE_CLICK:
if (mode == DeckEditorMode.FREE_BUILDING) {
moveSelectorCardToSideboard(event);
} else {
// because in match mode selector is used as sideboard the card goes to deck also for shift click
case CARD_DOUBLE_CLICK: {
boolean gameMode = mode != DeckEditorMode.FREE_BUILDING;
if (gameMode) {
// in game mode selector is used as sideboard, so the card must goes to deck all the time
moveSelectorCardToDeck(event);
} else {
// edit mode
if (event.isMouseAltDown()) {
moveSelectorCardToSideboard(event);
} else {
moveSelectorCardToDeck(event);
}
}
break;
case REMOVE_MAIN:
}
case DECK_REMOVE_SELECTION_MAIN: {
DeckEditorPanel.this.deckArea.getDeckList().removeSelection();
break;
case REMOVE_SIDEBOARD:
}
case DECK_REMOVE_SELECTION_SIDEBOARD: {
DeckEditorPanel.this.deckArea.getSideboardList().removeSelection();
break;
}
}
refreshDeck();
});
}
this.deckArea.clearDeckEventListeners();
// BOTTOM AREA: ENABLE ADDING/REMOVING CARDS in MAINBOARD
// do not clear event listener - DragCardGrid already have own listeners for cards
//this.deckArea.clearDeckEventListeners();
this.deckArea.addDeckEventListener(
// card manipulation events
// warning, do not use drag or single click events here, it's already processing by DragCardGrid
(Listener<Event>) event -> {
if (mode == DeckEditorMode.FREE_BUILDING) {
switch (event.getEventType()) {
case DOUBLE_CLICK: {
case CARD_DOUBLE_CLICK: {
SimpleCardView cardView = (SimpleCardView) event.getSource();
for (Card card : deck.getCards()) {
if (card.getId().equals(cardView.getId())) {
deck.getCards().remove(card);
break;
}
}
hidePopup();
refreshDeck();
break;
}
case ALT_DOUBLE_CLICK: {
SimpleCardView cardView = (SimpleCardView) event.getSource();
for (Card card : deck.getCards()) {
if (card.getId().equals(cardView.getId())) {
deck.getCards().remove(card);
deck.getSideboard().add(card);
break;
}
Card card = deck.findCard(cardView.getId());
if (card == null) {
return;
}
if (event.isMouseAltDown()) {
// ALT + double click: MOVE card from one deck to another
deck.getCards().remove(card);
deck.getSideboard().add(card);
} else {
// double click: DELETE card from deck
deck.getCards().remove(card);
}
hidePopup();
refreshDeck();
break;
}
case SET_NUMBER: {
setCardNumberToCardsList(event, deck.getCards());
break;
}
case REMOVE_SPECIFIC_CARD: {
case DECK_REMOVE_SPECIFIC_CARD: {
SimpleCardView cardView = (SimpleCardView) event.getSource();
for (Card card : deck.getCards()) {
if (card.getId().equals(cardView.getId())) {
deck.getCards().remove(card);
storeTemporaryCard(card);
break;
}
Card card = deck.findCard(cardView.getId());
if (card == null) {
return;
}
deck.getCards().remove(card);
storeTemporaryCard(card);
break;
}
case ADD_SPECIFIC_CARD: {
case DECK_ADD_SPECIFIC_CARD: {
SimpleCardView cardView = (CardView) event.getSource();
deck.getCards().add(retrieveTemporaryCard(cardView));
break;
@ -383,33 +398,36 @@ public class DeckEditorPanel extends javax.swing.JPanel {
} else {
// constructing phase or sideboarding during match -> card goes always to sideboard
switch (event.getEventType()) {
case DOUBLE_CLICK:
case ALT_DOUBLE_CLICK: {
case CARD_DOUBLE_CLICK: {
SimpleCardView cardView = (SimpleCardView) event.getSource();
for (Card card : deck.getCards()) {
if (card.getId().equals(cardView.getId())) {
deck.getCards().remove(card);
deck.getSideboard().add(card);
cardSelector.loadSideboard(new ArrayList<>(deck.getSideboard()), this.bigCard);
break;
}
Card card = deck.findCard(cardView.getId());
if (card == null) {
return;
}
deck.getCards().remove(card);
deck.getSideboard().add(card);
cardSelector.loadSideboard(new ArrayList<>(deck.getSideboard()), this.bigCard);
hidePopup();
refreshDeck();
break;
}
case REMOVE_SPECIFIC_CARD: {
case DECK_REMOVE_SPECIFIC_CARD: {
SimpleCardView cardView = (SimpleCardView) event.getSource();
for (Card card : deck.getCards()) {
if (card.getId().equals(cardView.getId())) {
deck.getCards().remove(card);
storeTemporaryCard(card);
break;
}
Card card = deck.findCard(cardView.getId());
if (card == null) {
return;
}
deck.getCards().remove(card);
storeTemporaryCard(card);
break;
}
case ADD_SPECIFIC_CARD: {
case DECK_ADD_SPECIFIC_CARD: {
SimpleCardView cardView = (CardView) event.getSource();
deck.getCards().add(retrieveTemporaryCard(cardView));
break;
@ -417,95 +435,104 @@ public class DeckEditorPanel extends javax.swing.JPanel {
}
}
});
this.deckArea.clearSideboardEventListeners();
// BOTTOM AREA: ENABLE ADDING/REMOVING CARDS in SIDEBOARD
// do not clear event listener - DragCardGrid already have own listeners for cards
//this.deckArea.clearSideboardEventListeners();
this.deckArea.addSideboardEventListener(
// card manipulation events
(Listener<Event>) event -> {
if (mode == DeckEditorMode.FREE_BUILDING) {
// normal edit mode
// DECK EDITOR MODE
switch (event.getEventType()) {
case DOUBLE_CLICK:
// remove card from sideboard (don't add it to deck)
case CARD_DOUBLE_CLICK: {
SimpleCardView cardView = (SimpleCardView) event.getSource();
for (Card card : deck.getSideboard()) {
if (card.getId().equals(cardView.getId())) {
deck.getSideboard().remove(card);
break;
}
}
hidePopup();
refreshDeck();
break;
case ALT_DOUBLE_CLICK:
// remove card from sideboard
cardView = (SimpleCardView) event.getSource();
for (Card card : deck.getSideboard()) {
if (card.getId().equals(cardView.getId())) {
deck.getSideboard().remove(card);
deck.getCards().add(card);
break;
}
Card card = deck.findSideboardCard(cardView.getId());
if (card == null) {
return;
}
if (event.isMouseAltDown()) {
// ALT + double click: MOVE card from one deck to another
deck.getSideboard().remove(card);
deck.getCards().add(card);
} else {
// double click: DELETE card from deck
deck.getSideboard().remove(card);
}
hidePopup();
refreshDeck();
break;
}
case SET_NUMBER: {
setCardNumberToCardsList(event, deck.getSideboard());
break;
}
case REMOVE_SPECIFIC_CARD: {
cardView = (SimpleCardView) event.getSource();
for (Card card : deck.getSideboard()) {
if (card.getId().equals(cardView.getId())) {
deck.getSideboard().remove(card);
storeTemporaryCard(card);
break;
}
case DECK_REMOVE_SPECIFIC_CARD: {
SimpleCardView cardView = (SimpleCardView) event.getSource();
Card card = deck.findSideboardCard(cardView.getId());
if (card == null) {
return;
}
deck.getSideboard().remove(card);
storeTemporaryCard(card);
break;
}
case ADD_SPECIFIC_CARD: {
cardView = (CardView) event.getSource();
case DECK_ADD_SPECIFIC_CARD: {
SimpleCardView cardView = (CardView) event.getSource();
deck.getSideboard().add(retrieveTemporaryCard(cardView));
break;
}
}
} else {
// construct phase or sideboarding during match
// GAME MODE
// constructing phase or sideboarding during match -> card goes always to main board
switch (event.getEventType()) {
case REMOVE_SPECIFIC_CARD: {
case DECK_REMOVE_SPECIFIC_CARD: {
SimpleCardView cardView = (SimpleCardView) event.getSource();
for (Card card : deck.getSideboard()) {
if (card.getId().equals(cardView.getId())) {
deck.getSideboard().remove(card);
storeTemporaryCard(card);
break;
}
Card card = deck.findSideboardCard(cardView.getId());
if (card == null) {
return;
}
deck.getSideboard().remove(card);
storeTemporaryCard(card);
break;
}
case ADD_SPECIFIC_CARD: {
case DECK_ADD_SPECIFIC_CARD: {
SimpleCardView cardView = (CardView) event.getSource();
deck.getSideboard().add(retrieveTemporaryCard(cardView));
break;
}
case DOUBLE_CLICK:
case ALT_DOUBLE_CLICK:
case CARD_DOUBLE_CLICK: {
// in games you can't delete cards, only moves from one deck to another
SimpleCardView cardView = (SimpleCardView) event.getSource();
for (Card card : deck.getSideboard()) {
if (card.getId().equals(cardView.getId())) {
deck.getSideboard().remove(card);
deck.getCards().add(card);
break;
}
Card card = deck.findSideboardCard(cardView.getId());
if (card == null) {
return;
}
deck.getSideboard().remove(card);
deck.getCards().add(card);
hidePopup();
refreshDeck();
break;
}
}
}
});
refreshDeck(true);
// auto-import dropped files from OS
if (mode == DeckEditorMode.FREE_BUILDING) {
setDropTarget(new DropTarget(this, new DnDDeckTargetListener() {
@ -562,26 +589,32 @@ public class DeckEditorPanel extends javax.swing.JPanel {
private void moveSelectorCardToDeck(Event event) {
SimpleCardView cardView = (SimpleCardView) event.getSource();
CardInfo cardInfo = CardRepository.instance.findCard(cardView.getExpansionSetCode(), cardView.getCardNumber());
Card card = null;
if (mode == DeckEditorMode.SIDEBOARDING || mode == DeckEditorMode.LIMITED_BUILDING) {
for (Object o : deck.getSideboard()) {
card = (Card) o;
if (card.getId().equals(cardView.getId())) {
boolean gameMode = mode != DeckEditorMode.FREE_BUILDING;
if (gameMode) {
// game: use existing real cards
for (Card sideCard : deck.getSideboard()) {
if (sideCard.getId().equals(cardView.getId())) {
card = sideCard;
break;
}
}
} else {
// editor: create mock card
CardInfo cardInfo = CardRepository.instance.findCard(cardView.getExpansionSetCode(), cardView.getCardNumber());
card = cardInfo != null ? cardInfo.getMockCard() : null;
}
if (card != null) {
deck.getCards().add(card);
if (mode == DeckEditorMode.SIDEBOARDING || mode == DeckEditorMode.LIMITED_BUILDING) {
if (gameMode) {
// game: move card from another board
deck.getSideboard().remove(card);
cardSelector.removeCard(card.getId());
cardSelector.setCardCount(deck.getSideboard().size());
cardSelector.refresh();
}
// card hint update
if (cardInfoPane instanceof CardInfoPane) {
((CardInfoPane) cardInfoPane).setCard(new CardView(card), null);
}
@ -590,12 +623,19 @@ public class DeckEditorPanel extends javax.swing.JPanel {
}
private void moveSelectorCardToSideboard(Event event) {
boolean gameMode = mode != DeckEditorMode.FREE_BUILDING;
if (gameMode) {
throw new IllegalArgumentException("ERROR, you can move card to sideboard from selector in game mode.");
}
SimpleCardView cardView = (SimpleCardView) event.getSource();
CardInfo cardInfo = CardRepository.instance.findCard(cardView.getExpansionSetCode(), cardView.getCardNumber());
Card card = cardInfo != null ? cardInfo.getMockCard() : null;
if (card != null) {
deck.getSideboard().add(card);
}
// card hint update
if (cardInfoPane instanceof CardInfoPane) {
((CardInfoPane) cardInfoPane).setCard(new CardView(card), null);
}

View file

@ -14,6 +14,8 @@ import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
/**
* App GUI: deck export window, uses in deck editor
*
* @author JayDi85
*/
public class DeckExportClipboardDialog extends MageDialog {

View file

@ -13,6 +13,8 @@ import java.io.IOException;
import java.util.Optional;
/**
* App GUI: deck import window, uses in deck editor
*
* @author JayDi85
*/
public class DeckImportClipboardDialog extends MageDialog {

View file

@ -1,5 +1,6 @@
package mage.client.deckeditor.collection.viewer;
import mage.abilities.icon.CardIconRenderSettings;
import mage.cards.*;
import mage.cards.repository.CardCriteria;
import mage.cards.repository.CardInfo;
@ -45,17 +46,17 @@ import static java.lang.Math.min;
import static org.mage.plugins.card.images.DownloadPicturesService.getTokenCardUrls;
/**
* Mage book with cards and page flipping.
* Card viewer (mage book) with cards and page flipping
*
* @author nantuko
* @author nantuko, JayDi85
*/
public class MageBook extends JComponent {
private static final long serialVersionUID = 1L;
public static final String LAYOUT_3X3 = "small";
public static final String LAYOUT_4X4 = "big";
private static final int CARD_CAPTION_OFFSET_Y = 8; // apply offset to see card names with mana icons at the same time
public MageBook(BigCard bigCard) {
super();
@ -71,7 +72,6 @@ public class MageBook extends JComponent {
setSize(conf.WIDTH, conf.HEIGHT);
setPreferredSize(new Dimension(conf.WIDTH, conf.HEIGHT));
setMinimumSize(new Dimension(conf.WIDTH, conf.HEIGHT));
//setBorder(BorderFactory.createLineBorder(Color.green));
jPanelLeft = getImagePanel(LEFT_PANEL_IMAGE_PATH, ImagePanelStyle.TILED);
jPanelLeft.setPreferredSize(new Dimension(LEFT_RIGHT_PAGES_WIDTH, 0));
@ -87,7 +87,6 @@ public class MageBook extends JComponent {
Image image = ImageHelper.loadImage(LEFT_PAGE_BUTTON_IMAGE_PATH);
pageLeft = new HoverButton(null, image, image, image, new Rectangle(64, 64));
//pageLeft.setBorder(BorderFactory.createLineBorder(new Color(180, 50, 0), 3, true)); //debug
pageLeft.setBounds(0, 0, 64, 64);
pageLeft.setVisible(false);
pageLeft.setObserver(() -> {
@ -124,7 +123,6 @@ public class MageBook extends JComponent {
// Top Panel (left page + (caption / stats) + right page
jPanelTop = new JPanel();
jPanelTop.setLayout(new BorderLayout());
// jPanelTop.setBorder(BorderFactory.createLineBorder(new Color(180, 50, 150), 3, true)); // debug
jPanelTop.setPreferredSize(new Dimension(captionHeight, captionHeight));
jPanelCenter.add(jPanelTop, BorderLayout.NORTH);
@ -144,7 +142,6 @@ public class MageBook extends JComponent {
// set's caption
setCaption = new JLabel();
setCaption.setHorizontalAlignment(SwingConstants.CENTER);
//setCaption.setBorder(BorderFactory.createLineBorder(new Color(180, 50, 150), 3, true)); // debug
setCaption.setFont(jLayeredPane.getFont().deriveFont(25f));
setCaption.setText("EMPTY CAPTION");
jPanelCaption.add(setCaption, BorderLayout.NORTH);
@ -152,7 +149,6 @@ public class MageBook extends JComponent {
// set's info
setInfo = new JLabel();
setInfo.setHorizontalAlignment(SwingConstants.CENTER);
//setCaption.setBorder(BorderFactory.createLineBorder(new Color(180, 50, 150), 3, true)); // debug
setInfo.setFont(jLayeredPane.getFont().deriveFont(17f));
setInfo.setText("EMPTY STATS");
jPanelCaption.add(setInfo, BorderLayout.SOUTH);
@ -245,7 +241,6 @@ public class MageBook extends JComponent {
for (int i = 0; i < min(conf.CARDS_PER_PAGE / 2, size); i++) {
Card card = cards.get(i).getMockCard();
addCard(new CardView(card), bigCard, null, rectangle);
rectangle = CardPosition.translatePosition(i, rectangle, conf);
}
@ -407,30 +402,29 @@ public class MageBook extends JComponent {
if (cardDimension == null) {
cardDimension = new Dimension(ClientDefaultSettings.dimensions.getFrameWidth(), ClientDefaultSettings.dimensions.getFrameHeight());
}
final MageCard cardImg = Plugins.instance.getMageCard(card, bigCard, cardDimension, gameId, true, true, PreferencesDialog.getRenderMode(), true);
cardImg.setBounds(rectangle);
jLayeredPane.add(cardImg, JLayeredPane.DEFAULT_LAYER, 10);
final MageCard cardImg = Plugins.instance.getMageCard(card, bigCard, new CardIconRenderSettings(), cardDimension, gameId, true, true, PreferencesDialog.getRenderMode(), true);
cardImg.setCardContainerRef(jLayeredPane);
cardImg.update(card);
cardImg.setCardBounds(rectangle.x, rectangle.y, cardDimensions.getFrameWidth(), cardDimensions.getFrameHeight());
jLayeredPane.add(cardImg, JLayeredPane.DEFAULT_LAYER, 10);
cardImg.setCardCaptionTopOffset(8); // card caption below real card caption to see full name even with mana icons
// card caption must be below real card caption to see full name even with mana icons
cardImg.setCardCaptionTopOffset(CARD_CAPTION_OFFSET_Y);
// card number label
JLabel cardNumber = new JLabel();
int dy = -5; // image panel have empty space in bottom (bug?), need to move label up
cardNumber.setBounds(rectangle.x, rectangle.y + cardImg.getHeight() + dy, cardDimensions.getFrameWidth(), 20);
cardNumber.setBounds(rectangle.x, rectangle.y + cardImg.getCardLocation().getCardHeight() + dy, cardDimensions.getFrameWidth(), 20);
cardNumber.setHorizontalAlignment(SwingConstants.CENTER);
//cardNumber.setBorder(BorderFactory.createLineBorder(new Color(180, 50, 150), 3, true));
cardNumber.setFont(jLayeredPane.getFont().deriveFont(jLayeredPane.getFont().getStyle() | Font.BOLD));
cardNumber.setText(card.getCardNumber());
jLayeredPane.add(cardNumber);
// draft rating label (
// draft rating label
JLabel draftRating = new JLabel();
dy = -5 * 2 + cardNumber.getHeight(); // under card number
draftRating.setBounds(rectangle.x, rectangle.y + cardImg.getHeight() + dy, cardDimensions.getFrameWidth(), 20);
draftRating.setBounds(rectangle.x, rectangle.y + cardImg.getCardLocation().getCardHeight() + dy, cardDimensions.getFrameWidth(), 20);
draftRating.setHorizontalAlignment(SwingConstants.CENTER);
//draftRating.setBorder(BorderFactory.createLineBorder(new Color(0, 0, 150), 3, true));
draftRating.setFont(jLayeredPane.getFont().deriveFont(jLayeredPane.getFont().getStyle() | Font.BOLD));
if (card.getOriginalCard() != null) {
draftRating.setText("draft rating: " + RateCard.rateCard(card.getOriginalCard(), null));
@ -448,8 +442,8 @@ public class MageBook extends JComponent {
newToken.removeSummoningSickness();
PermanentView theToken = new PermanentView(newToken, null, null, null);
theToken.setInViewerOnly(true);
final MageCard cardImg = Plugins.instance.getMagePermanent(theToken, bigCard, cardDimension, gameId, true, PreferencesDialog.getRenderMode(), true);
cardImg.setBounds(rectangle);
final MageCard cardImg = Plugins.instance.getMagePermanent(theToken, bigCard, new CardIconRenderSettings(), cardDimension, gameId, true, PreferencesDialog.getRenderMode(), true);
cardImg.setCardContainerRef(jLayeredPane);
jLayeredPane.add(cardImg, JLayeredPane.DEFAULT_LAYER, 10);
cardImg.update(theToken);
cardImg.setCardBounds(rectangle.x, rectangle.y, cardDimensions.getFrameWidth(), cardDimensions.getFrameHeight());

View file

@ -1,10 +1,11 @@
package mage.client.deckeditor.collection.viewer;
import javax.swing.*;
import mage.cards.repository.CardScanner;
import mage.client.plugins.impl.Plugins;
import org.mage.card.arcane.ManaSymbols;
import org.mage.card.arcane.SvgUtils;
import javax.swing.*;
/**
* @author nantuko
@ -12,6 +13,7 @@ import org.mage.card.arcane.ManaSymbols;
public class TestMageBook extends JFrame {
public static void main(String[] args) {
Plugins.instance.loadPlugins();
SvgUtils.checkSvgSupport();
ManaSymbols.loadImages();
CardScanner.scan();
JFrame frame = new TestMageBook();

View file

@ -1,45 +1,18 @@
/* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
* permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* The views and conclusions contained in the software and documentation are those of the
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
package mage.client.deckeditor.table;
import mage.cards.MageCard;
import mage.client.util.comparators.CardViewComparator;
import mage.game.draft.RateCard;
import mage.view.CardView;
import org.apache.log4j.Logger;
import java.util.Comparator;
/**
* {@link MageCard} comparator. Used to sort cards in Deck Editor Table View
* pane.
*
* @author nantuko
*/
public class MageCardComparator implements Comparator<CardView> {
public class MageCardComparator implements CardViewComparator {
private static final Logger logger = Logger.getLogger(MageCardComparator.class);
@ -122,5 +95,10 @@ public class MageCardComparator implements Comparator<CardView> {
} else {
return bCom.compareTo(aCom);
}
}// compare()
}
@Override
public String getCategoryName(CardView sample) {
return "";
}
}

View file

@ -293,22 +293,17 @@ public class TableModel extends AbstractTableModel implements ICardGrid {
cardEventSource.fireEvent(card, ClientEventType.SET_NUMBER, number);
}
public void doubleClick(int index) {
public void doubleClick(int index, MouseEvent e, boolean forceFakeAltDown) {
CardView card = view.get(index);
cardEventSource.fireEvent(card, ClientEventType.DOUBLE_CLICK);
}
public void altDoubleClick(int index) {
CardView card = view.get(index);
cardEventSource.fireEvent(card, ClientEventType.ALT_DOUBLE_CLICK);
cardEventSource.fireEvent(card, ClientEventType.CARD_DOUBLE_CLICK, e, forceFakeAltDown);
}
public void removeFromMainEvent(int index) {
cardEventSource.fireEvent(ClientEventType.REMOVE_MAIN);
cardEventSource.fireEvent(ClientEventType.DECK_REMOVE_SELECTION_MAIN);
}
public void removeFromSideEvent(int index) {
cardEventSource.fireEvent(ClientEventType.REMOVE_SIDEBOARD);
cardEventSource.fireEvent(ClientEventType.DECK_REMOVE_SELECTION_SIDEBOARD);
}
public void addListeners(final JTable table) {