diff --git a/Mage.Client/src/main/java/mage/client/cards/CardGrid.java b/Mage.Client/src/main/java/mage/client/cards/CardGrid.java index 2634ebcbd71..4fb751db74c 100644 --- a/Mage.Client/src/main/java/mage/client/cards/CardGrid.java +++ b/Mage.Client/src/main/java/mage/client/cards/CardGrid.java @@ -306,9 +306,17 @@ public class CardGrid extends javax.swing.JLayeredPane implements MouseListener, e.consume(); Object obj = e.getSource(); if (obj instanceof Card) { - cardEventSource.doubleClick(((Card) obj).getOriginal(), "double-click"); + if (e.isShiftDown()) { + cardEventSource.shiftDoubleClick(((Card) obj).getOriginal(), "shift-double-click"); + } else { + cardEventSource.doubleClick(((Card) obj).getOriginal(), "double-click"); + } } else if (obj instanceof MageCard) { - cardEventSource.doubleClick(((MageCard) obj).getOriginal(), "double-click"); + if (e.isShiftDown()) { + cardEventSource.shiftDoubleClick(((MageCard) obj).getOriginal(), "shift-double-click"); + } else { + cardEventSource.doubleClick(((MageCard) obj).getOriginal(), "double-click"); + } } } } diff --git a/Mage.Client/src/main/java/mage/client/cards/CardsList.java b/Mage.Client/src/main/java/mage/client/cards/CardsList.java index b2d7e61103f..0687af43f40 100644 --- a/Mage.Client/src/main/java/mage/client/cards/CardsList.java +++ b/Mage.Client/src/main/java/mage/client/cards/CardsList.java @@ -162,7 +162,11 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar public void mousePressed(MouseEvent e) { if (e.getClickCount() == 2 && !e.isConsumed()) { e.consume(); - handleDoubleClick(); + if (e.isShiftDown()) { + handleShiftDoubleClick(); + } else { + handleDoubleClick(); + } } } }); @@ -180,7 +184,18 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar } } } - + + public void handleShiftDoubleClick() { + if (mainTable.getSelectedRowCount() > 0) { + int[] n = mainTable.getSelectedRows(); + List indexes = asList(n); + Collections.reverse(indexes); + for (Integer index : indexes) { + mainModel.shiftDoubleClick(index); + } + } + } + public ICardGrid getMainModel() { return mainModel; } diff --git a/Mage.Client/src/main/java/mage/client/deckeditor/CardSelector.java b/Mage.Client/src/main/java/mage/client/deckeditor/CardSelector.java index 0512641d877..c38e264f42d 100644 --- a/Mage.Client/src/main/java/mage/client/deckeditor/CardSelector.java +++ b/Mage.Client/src/main/java/mage/client/deckeditor/CardSelector.java @@ -83,10 +83,10 @@ import mage.view.CardsView; */ public class CardSelector extends javax.swing.JPanel implements ComponentListener { - private final List cards = new ArrayList(); + private final List cards = new ArrayList<>(); private BigCard bigCard; private boolean limited = false; - private SortSetting sortSetting; + private final SortSetting sortSetting; private final ActionListener searchAction = new ActionListener() { @Override @@ -154,7 +154,11 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene public void mousePressed(MouseEvent e) { if (e.getClickCount() == 2 && !e.isConsumed()) { e.consume(); - jButtonAddToMainActionPerformed(null); + if (e.isShiftDown()) { + jButtonAddToSideboardActionPerformed(null); + } else { + jButtonAddToMainActionPerformed(null); + } } } }); diff --git a/Mage.Client/src/main/java/mage/client/deckeditor/DeckEditorPanel.java b/Mage.Client/src/main/java/mage/client/deckeditor/DeckEditorPanel.java index bb5f585f1d2..36749e1d16b 100644 --- a/Mage.Client/src/main/java/mage/client/deckeditor/DeckEditorPanel.java +++ b/Mage.Client/src/main/java/mage/client/deckeditor/DeckEditorPanel.java @@ -62,7 +62,6 @@ import static mage.client.constants.Constants.DeckEditorMode.Constructed; import static mage.client.constants.Constants.DeckEditorMode.Limited; import static mage.client.constants.Constants.DeckEditorMode.Sideboard; import mage.client.dialog.AddLandDialog; -import mage.client.plugins.adapters.MageActionCallback; import mage.client.plugins.impl.Plugins; import mage.client.util.Event; import mage.client.util.Listener; @@ -159,7 +158,7 @@ public class DeckEditorPanel extends javax.swing.JPanel { case Sideboard: this.btnSubmit.setVisible(true); if (deck != null) { - this.cardSelector.loadSideboard(new ArrayList(deck.getSideboard()), this.bigCard); + this.cardSelector.loadSideboard(new ArrayList<>(deck.getSideboard()), this.bigCard); } // TODO: take from preferences this.cardSelector.switchToGrid(); @@ -205,51 +204,25 @@ public class DeckEditorPanel extends javax.swing.JPanel { component.addCardEventListener( new Listener() { @Override - public void event(Event event) { - if (event.getEventName().equals("double-click")) { - SimpleCardView cardView = (SimpleCardView) event.getSource(); - CardInfo cardInfo = CardRepository.instance.findCard(cardView.getExpansionSetCode(), cardView.getCardNumber()); - Card card = null; - if (mode == DeckEditorMode.Sideboard || mode == DeckEditorMode.Limited) { - Iterator sideboard = deck.getSideboard().iterator(); - while (sideboard.hasNext()) { - card = (Card) sideboard.next(); - if (card.getId().equals(cardView.getId())) { - break; - } + public void event(Event event) { + switch (event.getEventName()) { + case "double-click": + moveSelectorCardToDeck(event); + break; + case "shift-double-click": + if (mode == DeckEditorMode.Constructed) { + moveSelectorCardToSideboard(event); + } else { + // because in match mode selector is used as sideboard the card goes to deck also for shift click + moveSelectorCardToDeck(event); } - } else { - card = cardInfo != null ? cardInfo.getMockCard() : null; - } - if (card != null) { - deck.getCards().add(card); - if (mode == DeckEditorMode.Sideboard || mode == DeckEditorMode.Limited) { - deck.getSideboard().remove(card); - cardSelector.removeCard(card.getId()); - cardSelector.setCardCount(deck.getSideboard().size()); - cardSelector.refresh(); - } - if (cardInfoPane instanceof CardInfoPane) { - ((CardInfoPane) cardInfoPane).setCard(new CardView(card), null); - } - hidePopup(); - } - - } else if (event.getEventName().equals("shift-double-click") && mode == DeckEditorMode.Constructed) { - 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); - } - if (cardInfoPane instanceof CardInfoPane) { - ((CardInfoPane) cardInfoPane).setCard(new CardView(card), null); - } - hidePopup(); - } else if (event.getEventName().equals("remove-main")) { - DeckEditorPanel.this.deckArea.getDeckList().handleDoubleClick(); - } else if (event.getEventName().equals("remove-sideboard")) { - DeckEditorPanel.this.deckArea.getSideboardList().handleDoubleClick(); + break; + case "remove-main": + DeckEditorPanel.this.deckArea.getDeckList().handleDoubleClick(); + break; + case "remove-sideboard": + DeckEditorPanel.this.deckArea.getSideboardList().handleDoubleClick(); + break; } refreshDeck(); } @@ -260,31 +233,56 @@ public class DeckEditorPanel extends javax.swing.JPanel { new Listener() { @Override public void event(Event event) { - if (event.getEventName().equals("double-click")) { - SimpleCardView cardView = (SimpleCardView) event.getSource(); - for (Card card : deck.getCards()) { - if (card.getId().equals(cardView.getId())) { - deck.getCards().remove(card); - if (mode == DeckEditorMode.Limited || mode == DeckEditorMode.Sideboard) { - deck.getSideboard().add(card); - cardSelector.loadSideboard(new ArrayList(deck.getSideboard()), getBigCard()); + if (mode.equals(DeckEditorMode.Constructed)) { + switch (event.getEventName()) { + case "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 "shift-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; + } + } + hidePopup(); + refreshDeck(); break; } } - hidePopup(); - refreshDeck(); - } else if (event.getEventName().equals("shift-double-click") && mode == DeckEditorMode.Constructed) { - SimpleCardView cardView = (SimpleCardView) event.getSource(); - for (Card card : deck.getCards()) { - if (card.getId().equals(cardView.getId())) { - deck.getCards().remove(card); - deck.getSideboard().add(card); + } else { + // constructing phase or sideboarding during match -> card goes always to sideboard + switch (event.getEventName()) { + case "double-click": + case "shift-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()), getBigCard()); + break; + } + } + hidePopup(); + refreshDeck(); break; } - } - hidePopup(); - refreshDeck(); + } } } }); @@ -292,17 +290,51 @@ public class DeckEditorPanel extends javax.swing.JPanel { new Listener() { @Override public void event(Event event) { - if (event.getEventName().equals("double-click")) { - SimpleCardView cardView = (SimpleCardView) event.getSource(); - for (Card card : deck.getSideboard()) { - if (card.getId().equals(cardView.getId())) { - deck.getSideboard().remove(card); - deck.getCards().add(card); + if (mode.equals(DeckEditorMode.Constructed)) { + // normal edit mode + switch (event.getEventName()) { + case "double-click": + // remove card from sideboard (don't add it to deck) + 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 "shift-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; + } + } + hidePopup(); + refreshDeck(); + break; + } + } else { + // construct phase or sideboarding during match + switch (event.getEventName()) { + case "double-click": + case "shift-double-click": + 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; + } + } hidePopup(); + refreshDeck(); break; - } } - hidePopup(); - refreshDeck(); } } }); @@ -312,6 +344,50 @@ public class DeckEditorPanel extends javax.swing.JPanel { this.repaint(); } + + 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.Sideboard || mode == DeckEditorMode.Limited) { + Iterator sideboard = deck.getSideboard().iterator(); + while (sideboard.hasNext()) { + card = (Card) sideboard.next(); + if (card.getId().equals(cardView.getId())) { + break; + } + } + } else { + card = cardInfo != null ? cardInfo.getMockCard() : null; + } + if (card != null) { + deck.getCards().add(card); + if (mode == DeckEditorMode.Sideboard || mode == DeckEditorMode.Limited) { + deck.getSideboard().remove(card); + cardSelector.removeCard(card.getId()); + cardSelector.setCardCount(deck.getSideboard().size()); + cardSelector.refresh(); + } + if (cardInfoPane instanceof CardInfoPane) { + ((CardInfoPane) cardInfoPane).setCard(new CardView(card), null); + } + hidePopup(); + } + } + + private void moveSelectorCardToSideboard(Event event) { + 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); + } + if (cardInfoPane instanceof CardInfoPane) { + ((CardInfoPane) cardInfoPane).setCard(new CardView(card), null); + } + hidePopup(); + } + private void hidePopup() { Plugins.getInstance().getActionCallback().mouseExited(null, null); } diff --git a/Mage.Client/src/main/java/mage/client/deckeditor/table/TableModel.java b/Mage.Client/src/main/java/mage/client/deckeditor/table/TableModel.java index bab7b7da2cf..01504a50f0d 100644 --- a/Mage.Client/src/main/java/mage/client/deckeditor/table/TableModel.java +++ b/Mage.Client/src/main/java/mage/client/deckeditor/table/TableModel.java @@ -79,9 +79,9 @@ public class TableModel extends AbstractTableModel implements ICardGrid { protected CardEventSource cardEventSource = new CardEventSource(); protected BigCard bigCard; protected UUID gameId; - private final Map cards = new LinkedHashMap(); - private final Map cardsNoCopies = new LinkedHashMap(); - private final List view = new ArrayList(); + private final Map cards = new LinkedHashMap<>(); + private final Map cardsNoCopies = new LinkedHashMap<>(); + private final List view = new ArrayList<>(); private Dimension cardDimension; private boolean displayNoCopies = false;