From 0561499d5b07daf075c690b2bed80679ab7251a1 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Fri, 9 May 2014 16:00:37 +0200 Subject: [PATCH] * Deck editor - Added possibility to edit number of cards for deck and sideboard directly if deck editor is in normal mode to build a deck from complete card pool. --- .../src/main/java/mage/client/MageFrame.java | 8 +- .../mage/client/cards/CardEventSource.java | 4 + .../java/mage/client/cards/CardsList.form | 9 +- .../java/mage/client/cards/CardsList.java | 43 ++++- .../java/mage/client/constants/Constants.java | 33 ++-- .../java/mage/client/deckeditor/DeckArea.java | 6 + .../client/deckeditor/DeckEditorPane.java | 4 +- .../client/deckeditor/DeckEditorPanel.java | 67 +++++-- .../client/deckeditor/table/TableModel.java | 36 +++- .../table/UpdateCountsCallback.java | 6 +- .../client/remote/CallbackClientImpl.java | 4 +- .../src/main/java/mage/client/util/Event.java | 15 +- .../client/util/gui/TableSpinnerEditor.java | 171 ++++++++++++++++++ 13 files changed, 351 insertions(+), 55 deletions(-) create mode 100644 Mage.Client/src/main/java/mage/client/util/gui/TableSpinnerEditor.java diff --git a/Mage.Client/src/main/java/mage/client/MageFrame.java b/Mage.Client/src/main/java/mage/client/MageFrame.java index a472880228a..840a4015212 100644 --- a/Mage.Client/src/main/java/mage/client/MageFrame.java +++ b/Mage.Client/src/main/java/mage/client/MageFrame.java @@ -879,7 +879,7 @@ public class MageFrame extends javax.swing.JFrame implements MageClient { }// //GEN-END:initComponents private void btnDeckEditorActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnDeckEditorActionPerformed - showDeckEditor(DeckEditorMode.Constructed, null, null, 0); + showDeckEditor(DeckEditorMode.FREE_BUILDING, null, null, 0); }//GEN-LAST:event_btnDeckEditorActionPerformed private void btnGamesActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnGamesActionPerformed @@ -994,8 +994,8 @@ public class MageFrame extends javax.swing.JFrame implements MageClient { // close & remove sideboarding or construction pane if open if (window instanceof DeckEditorPane) { DeckEditorPane deckEditorPane = (DeckEditorPane) window; - if (deckEditorPane.getDeckEditorMode().equals(DeckEditorMode.Limited) - || deckEditorPane.getDeckEditorMode().equals(DeckEditorMode.Sideboard)){ + if (deckEditorPane.getDeckEditorMode().equals(DeckEditorMode.LIMITED_BUILDING) + || deckEditorPane.getDeckEditorMode().equals(DeckEditorMode.SIDEBOARDING)){ deckEditorPane.removeFrame(); } } @@ -1005,7 +1005,7 @@ public class MageFrame extends javax.swing.JFrame implements MageClient { public void showDeckEditor(DeckEditorMode mode, Deck deck, UUID tableId, int time) { String name; - if (mode == DeckEditorMode.Sideboard || mode == DeckEditorMode.Limited) { + if (mode == DeckEditorMode.SIDEBOARDING || mode == DeckEditorMode.LIMITED_BUILDING) { name = "Deck Editor - " + tableId.toString(); } else { if (deck != null) { diff --git a/Mage.Client/src/main/java/mage/client/cards/CardEventSource.java b/Mage.Client/src/main/java/mage/client/cards/CardEventSource.java index 966c38fdeff..e4ec1eceddf 100644 --- a/Mage.Client/src/main/java/mage/client/cards/CardEventSource.java +++ b/Mage.Client/src/main/java/mage/client/cards/CardEventSource.java @@ -49,6 +49,10 @@ public class CardEventSource implements EventSource, Serializable { dispatcher.addListener(listener); } + public void setNumber(SimpleCardView card, String message, int number) { + dispatcher.fireEvent(new Event(card, message, number)); + } + public void doubleClick(SimpleCardView card, String message) { dispatcher.fireEvent(new Event(card, message)); } diff --git a/Mage.Client/src/main/java/mage/client/cards/CardsList.form b/Mage.Client/src/main/java/mage/client/cards/CardsList.form index d9cc9dbfad2..764a8a2619b 100644 --- a/Mage.Client/src/main/java/mage/client/cards/CardsList.form +++ b/Mage.Client/src/main/java/mage/client/cards/CardsList.form @@ -15,8 +15,9 @@ - + + @@ -34,7 +35,7 @@ - + @@ -42,7 +43,7 @@ - + @@ -81,7 +82,7 @@ - + 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 1137e02e02e..87db55c6a32 100644 --- a/Mage.Client/src/main/java/mage/client/cards/CardsList.java +++ b/Mage.Client/src/main/java/mage/client/cards/CardsList.java @@ -47,8 +47,11 @@ import java.util.List; import java.util.UUID; import javax.swing.*; import javax.swing.table.DefaultTableCellRenderer; +import javax.swing.table.TableColumn; +import javax.swing.table.TableColumnModel; import mage.constants.CardType; import mage.cards.MageCard; +import mage.client.constants.Constants.DeckEditorMode; import mage.client.constants.Constants.SortBy; import mage.client.deckeditor.SortSetting; import mage.client.deckeditor.table.TableModel; @@ -57,6 +60,7 @@ import mage.client.dialog.PreferencesDialog; import mage.client.plugins.impl.Plugins; import mage.client.util.*; import mage.client.util.Event; +import mage.client.util.gui.TableSpinnerEditor; import mage.view.CardView; import mage.view.CardsView; import org.mage.card.arcane.CardPanel; @@ -66,7 +70,7 @@ import org.mage.card.arcane.CardPanel; * @author BetaSteward_at_googlemail.com */ public class CardsList extends javax.swing.JPanel implements MouseListener, ICardGrid { - + protected CardEventSource cardEventSource = new CardEventSource(); private Dimension cardDimension; private CardsView cards; @@ -77,7 +81,7 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar private TableModel mainModel; private JTable mainTable; private ICardGrid currentView; - + /** Creates new form Cards */ public CardsList() { initComponents(); @@ -172,6 +176,30 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar mainModel.setUpdateCountsCallback(new UpdateCountsCallback(lblCount, lblCreatureCount, lblLandCount)); } + // if you use the deck ediot to build a free deck, numbers can be set directly in deck and sideboard + public void setDeckEditorMode(DeckEditorMode mode) { + if (mode.equals(DeckEditorMode.FREE_BUILDING)) { + // activate spinner for card number change + mainModel.setNumberEditable(true); + TableColumnModel tcm = mainTable.getColumnModel(); + TableColumn tc = tcm.getColumn(0); + tc.setMaxWidth(55); + tc.setMinWidth(55); + tc.setPreferredWidth(55); + tc.setCellEditor(new TableSpinnerEditor(this)); + } + } + + public void handleSetNumber(int number) { + if (mainTable.getSelectedRowCount() == 1) { + int[] n = mainTable.getSelectedRows(); + List indexes = asList(n); + for (Integer index : indexes) { + mainModel.setNumber(index, number); + } + } + } + public void handleDoubleClick() { if (mainTable.getSelectedRowCount() > 0) { int[] n = mainTable.getSelectedRows(); @@ -398,7 +426,10 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0))); setMinimumSize(new java.awt.Dimension(30, 30)); - setPreferredSize((!Beans.isDesignTime())?(new Dimension(Config.dimensions.frameWidth, Config.dimensions.frameHeight)):(new Dimension(100, 100))); + setPreferredSize((!Beans.isDesignTime())? + (new Dimension(Config.dimensions.frameWidth, Config.dimensions.frameHeight)) + :(new Dimension(600, 600))); + setRequestFocusEnabled(false); panelControl.setMaximumSize(new java.awt.Dimension(32767, 23)); panelControl.setMinimumSize(new java.awt.Dimension(616, 23)); @@ -474,7 +505,7 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar .addComponent(jToggleListView, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jToggleCardView, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(195, 195, 195)) + .addGap(287, 287, 287)) ); panelControlLayout.setVerticalGroup( panelControlLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) @@ -501,14 +532,14 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(panelCardArea) - .addComponent(panelControl, javax.swing.GroupLayout.DEFAULT_SIZE, 719, Short.MAX_VALUE) + .addComponent(panelControl, javax.swing.GroupLayout.DEFAULT_SIZE, 818, Short.MAX_VALUE) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(panelControl, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(0, 0, 0) - .addComponent(panelCardArea, javax.swing.GroupLayout.DEFAULT_SIZE, 120, Short.MAX_VALUE)) + .addComponent(panelCardArea, javax.swing.GroupLayout.DEFAULT_SIZE, 69, Short.MAX_VALUE)) ); }// //GEN-END:initComponents diff --git a/Mage.Client/src/main/java/mage/client/constants/Constants.java b/Mage.Client/src/main/java/mage/client/constants/Constants.java index cec3fef9076..969a9654c67 100644 --- a/Mage.Client/src/main/java/mage/client/constants/Constants.java +++ b/Mage.Client/src/main/java/mage/client/constants/Constants.java @@ -88,9 +88,9 @@ public final class Constants { } public enum DeckEditorMode { - Constructed, - Limited, - Sideboard + FREE_BUILDING, + LIMITED_BUILDING, + SIDEBOARDING } public enum SortBy { @@ -101,7 +101,7 @@ public final class Constants { NAME ("Name"), UNSORTED ("Unsorted"); - private String text; + private final String text; SortBy(String text) { this.text = text; @@ -113,18 +113,19 @@ public final class Constants { } public static SortBy getByString(String text) { - if (text.equals("Casting Cost")) { - return CASTING_COST; - } else if (text.equals("Rarity")) { - return RARITY; - } else if (text.equals("Color")) { - return COLOR; - }else if (text.equals("Color Detailed")) { - return COLOR_DETAILED; - }else if (text.equals("Name")) { - return NAME; - }else { - return UNSORTED; + switch (text) { + case "Casting Cost": + return CASTING_COST; + case "Rarity": + return RARITY; + case "Color": + return COLOR; + case "Color Detailed": + return COLOR_DETAILED; + case "Name": + return NAME; + default: + return UNSORTED; } } diff --git a/Mage.Client/src/main/java/mage/client/deckeditor/DeckArea.java b/Mage.Client/src/main/java/mage/client/deckeditor/DeckArea.java index eed9258c5ac..e1cca05a935 100644 --- a/Mage.Client/src/main/java/mage/client/deckeditor/DeckArea.java +++ b/Mage.Client/src/main/java/mage/client/deckeditor/DeckArea.java @@ -38,6 +38,7 @@ package mage.client.deckeditor; import mage.cards.decks.Deck; import mage.client.cards.BigCard; import mage.client.cards.CardsList; +import mage.client.constants.Constants.DeckEditorMode; import mage.client.util.Event; import mage.client.util.Listener; import mage.view.CardsView; @@ -69,6 +70,11 @@ public class DeckArea extends javax.swing.JPanel { this.sideboardList.setVisible(show); } + public void setDeckEditorMode(DeckEditorMode mode) { + this.deckList.setDeckEditorMode(mode); + this.sideboardList.setDeckEditorMode(mode); + } + public void loadDeck(Deck deck, BigCard bigCard) { deckList.loadCards(new CardsView(deck.getCards()), bigCard, null); if (sideboardList.isVisible()) { diff --git a/Mage.Client/src/main/java/mage/client/deckeditor/DeckEditorPane.java b/Mage.Client/src/main/java/mage/client/deckeditor/DeckEditorPane.java index f306e7a1d49..37ec154d5e7 100644 --- a/Mage.Client/src/main/java/mage/client/deckeditor/DeckEditorPane.java +++ b/Mage.Client/src/main/java/mage/client/deckeditor/DeckEditorPane.java @@ -56,7 +56,7 @@ public class DeckEditorPane extends MagePane { this.setDefaultCloseOperation(DISPOSE_ON_CLOSE); boolean initialized = false; if (Plugins.getInstance().isThemePluginLoaded()) { - Map uiMap = new HashMap(); + Map uiMap = new HashMap<>(); JComponent container = Plugins.getInstance().updateTablePanel(uiMap); if (container != null) { deckEditorPanel1 = new mage.client.deckeditor.DeckEditorPanel(); @@ -73,7 +73,7 @@ public class DeckEditorPane extends MagePane { } public void show(DeckEditorMode mode, Deck deck, String name, UUID tableId, int time) { - if (mode == DeckEditorMode.Sideboard || mode == DeckEditorMode.Limited) { + if (mode == DeckEditorMode.SIDEBOARDING || mode == DeckEditorMode.LIMITED_BUILDING) { this.setTitle("Deck Editor - " + tableId.toString()); } else { 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 36749e1d16b..9f1d691d242 100644 --- a/Mage.Client/src/main/java/mage/client/deckeditor/DeckEditorPanel.java +++ b/Mage.Client/src/main/java/mage/client/deckeditor/DeckEditorPanel.java @@ -36,6 +36,8 @@ import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; +import java.util.List; +import java.util.Set; import java.util.UUID; import java.util.concurrent.CancellationException; import java.util.concurrent.ExecutionException; @@ -58,9 +60,9 @@ import mage.client.MageFrame; import mage.client.cards.BigCard; import mage.client.cards.ICardGrid; import mage.client.constants.Constants.DeckEditorMode; -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 static mage.client.constants.Constants.DeckEditorMode.FREE_BUILDING; +import static mage.client.constants.Constants.DeckEditorMode.LIMITED_BUILDING; +import static mage.client.constants.Constants.DeckEditorMode.SIDEBOARDING; import mage.client.dialog.AddLandDialog; import mage.client.plugins.impl.Plugins; import mage.client.util.Event; @@ -151,11 +153,12 @@ public class DeckEditorPanel extends javax.swing.JPanel { this.tableId = tableId; this.mode = mode; this.btnAddLand.setVisible(false); + switch (mode) { - case Limited: + case LIMITED_BUILDING: this.btnAddLand.setVisible(true); this.txtTimeRemaining.setVisible(true); - case Sideboard: + case SIDEBOARDING: this.btnSubmit.setVisible(true); if (deck != null) { this.cardSelector.loadSideboard(new ArrayList<>(deck.getSideboard()), this.bigCard); @@ -180,7 +183,7 @@ public class DeckEditorPanel extends javax.swing.JPanel { } } break; - case Constructed: + case FREE_BUILDING: this.btnSubmit.setVisible(false); this.cardSelector.loadCards(this.bigCard); //this.cardTableSelector.loadCards(this.bigCard); @@ -194,6 +197,7 @@ public class DeckEditorPanel extends javax.swing.JPanel { break; } init(); + this.deckArea.setDeckEditorMode(mode); } private void init() { @@ -210,7 +214,7 @@ public class DeckEditorPanel extends javax.swing.JPanel { moveSelectorCardToDeck(event); break; case "shift-double-click": - if (mode == DeckEditorMode.Constructed) { + 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 @@ -233,7 +237,7 @@ public class DeckEditorPanel extends javax.swing.JPanel { new Listener() { @Override public void event(Event event) { - if (mode.equals(DeckEditorMode.Constructed)) { + if (mode.equals(DeckEditorMode.FREE_BUILDING)) { switch (event.getEventName()) { case "double-click": { @@ -262,6 +266,10 @@ public class DeckEditorPanel extends javax.swing.JPanel { refreshDeck(); break; } + case "set-number": + { + setCardNumberToCardsList(event, deck.getCards()); + } } } else { // constructing phase or sideboarding during match -> card goes always to sideboard @@ -290,7 +298,7 @@ public class DeckEditorPanel extends javax.swing.JPanel { new Listener() { @Override public void event(Event event) { - if (mode.equals(DeckEditorMode.Constructed)) { + if (mode.equals(DeckEditorMode.FREE_BUILDING)) { // normal edit mode switch (event.getEventName()) { case "double-click": @@ -318,6 +326,10 @@ public class DeckEditorPanel extends javax.swing.JPanel { hidePopup(); refreshDeck(); break; + case "set-number": + { + setCardNumberToCardsList(event, deck.getSideboard()); + } } } else { // construct phase or sideboarding during match @@ -344,12 +356,43 @@ public class DeckEditorPanel extends javax.swing.JPanel { this.repaint(); } + private void setCardNumberToCardsList(Event event, Set cards) { + CardView cardView = (CardView) event.getSource(); + int numberToSet = event.getNumber(); + int cardsFound = 0; + List toDelete = new ArrayList<>(); + for (Card card : cards) { + if (card.getName().equals(cardView.getName()) + && card.getCardNumber() == cardView.getCardNumber() + && card.getExpansionSetCode().equals(cardView.getExpansionSetCode())) { + cardsFound++; + if (cardsFound > numberToSet) { + toDelete.add(card); + + } + } + } + if (toDelete.isEmpty()) { + // add cards + CardInfo cardInfo = CardRepository.instance.findCard(cardView.getExpansionSetCode(), cardView.getCardNumber()); + for (int i = cardsFound; i < numberToSet; i++) { + cards.add(cardInfo.getMockCard()); + } + } else { + // remove cards + for (Card card: toDelete) { + cards.remove(card); + } + } + hidePopup(); + refreshDeck(); + } 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) { + if (mode == DeckEditorMode.SIDEBOARDING || mode == DeckEditorMode.LIMITED_BUILDING) { Iterator sideboard = deck.getSideboard().iterator(); while (sideboard.hasNext()) { card = (Card) sideboard.next(); @@ -362,7 +405,7 @@ public class DeckEditorPanel extends javax.swing.JPanel { } if (card != null) { deck.getCards().add(card); - if (mode == DeckEditorMode.Sideboard || mode == DeckEditorMode.Limited) { + if (mode == DeckEditorMode.SIDEBOARDING || mode == DeckEditorMode.LIMITED_BUILDING) { deck.getSideboard().remove(card); cardSelector.removeCard(card.getId()); cardSelector.setCardCount(deck.getSideboard().size()); @@ -685,7 +728,7 @@ public class DeckEditorPanel extends javax.swing.JPanel { }//GEN-LAST:event_btnSaveActionPerformed private void btnNewActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnNewActionPerformed - if (mode == DeckEditorMode.Sideboard || mode == DeckEditorMode.Limited) { + if (mode == DeckEditorMode.SIDEBOARDING || mode == DeckEditorMode.LIMITED_BUILDING) { for (Card card : deck.getCards()) { deck.getSideboard().add(card); } 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 01504a50f0d..f59bf2c453b 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 @@ -87,13 +87,18 @@ public class TableModel extends AbstractTableModel implements ICardGrid { private boolean displayNoCopies = false; private UpdateCountsCallback updateCountsCallback; - private final String column[] = { "", "Name", "Cost", "Color", "Type", "Stats", "Rarity", "Set" }; + private final String column[] = { "Qty", "Name", "Cost", "Color", "Type", "Stats", "Rarity", "Set" }; private SortSetting sortSetting; private int recentSortedColumn; private boolean recentAscending; - + private boolean numberEditable; + + public TableModel() { + this.numberEditable = false; + } + public void clear() { this.clearCardEventListeners(); this.clearCards(); @@ -303,6 +308,11 @@ public class TableModel extends AbstractTableModel implements ICardGrid { cardEventSource.clearListeners(); } + public void setNumber(int index, int number) { + CardView card = view.get(index); + cardEventSource.setNumber(card, "set-number", number); + } + public void doubleClick(int index) { CardView card = view.get(index); cardEventSource.doubleClick(card, "double-click"); @@ -326,9 +336,13 @@ public class TableModel extends AbstractTableModel implements ICardGrid { table.addKeyListener(new KeyListener() { @Override - public void keyPressed(KeyEvent ev) {} + public void keyPressed(KeyEvent ev) { + } + @Override - public void keyTyped(KeyEvent ev) {} + public void keyTyped(KeyEvent ev) { + } + @Override public void keyReleased(KeyEvent ev) { int row = table.getSelectedRow(); @@ -431,8 +445,22 @@ public class TableModel extends AbstractTableModel implements ICardGrid { 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); //To change body of generated methods, choose Tools | Templates. + } + + } diff --git a/Mage.Client/src/main/java/mage/client/deckeditor/table/UpdateCountsCallback.java b/Mage.Client/src/main/java/mage/client/deckeditor/table/UpdateCountsCallback.java index f1ef48c97d0..b09d6f1b3e2 100644 --- a/Mage.Client/src/main/java/mage/client/deckeditor/table/UpdateCountsCallback.java +++ b/Mage.Client/src/main/java/mage/client/deckeditor/table/UpdateCountsCallback.java @@ -8,9 +8,9 @@ import javax.swing.*; */ public class UpdateCountsCallback { - private javax.swing.JLabel lblCount; - private javax.swing.JLabel lblCreatureCount; - private javax.swing.JLabel lblLandCount; + private final javax.swing.JLabel lblCount; + private final javax.swing.JLabel lblCreatureCount; + private final javax.swing.JLabel lblLandCount; public UpdateCountsCallback(JLabel count, JLabel creatures, JLabel lands) { this.lblCount = count; diff --git a/Mage.Client/src/main/java/mage/client/remote/CallbackClientImpl.java b/Mage.Client/src/main/java/mage/client/remote/CallbackClientImpl.java index e267d4b702e..f0cd521e305 100644 --- a/Mage.Client/src/main/java/mage/client/remote/CallbackClientImpl.java +++ b/Mage.Client/src/main/java/mage/client/remote/CallbackClientImpl.java @@ -469,11 +469,11 @@ public class CallbackClientImpl implements CallbackClient { } protected void sideboard(Deck deck, UUID tableId, int time) { - frame.showDeckEditor(DeckEditorMode.Sideboard, deck, tableId, time); + frame.showDeckEditor(DeckEditorMode.SIDEBOARDING, deck, tableId, time); } protected void construct(Deck deck, UUID tableId, int time) { - frame.showDeckEditor(DeckEditorMode.Limited, deck, tableId, time); + frame.showDeckEditor(DeckEditorMode.LIMITED_BUILDING, deck, tableId, time); } private void handleException(Exception ex) { diff --git a/Mage.Client/src/main/java/mage/client/util/Event.java b/Mage.Client/src/main/java/mage/client/util/Event.java index 5f4d42f6520..8e39db9be8c 100644 --- a/Mage.Client/src/main/java/mage/client/util/Event.java +++ b/Mage.Client/src/main/java/mage/client/util/Event.java @@ -35,12 +35,18 @@ import java.io.Serializable; * @author BetaSteward_at_googlemail.com */ public class Event implements Serializable { - private Object source; - private String eventName; + private final Object source; + private final String eventName; + private final int number; public Event(Object source, String eventName) { + this(source, eventName, 0); + } + + public Event(Object source, String eventName, int number) { this.source = source; this.eventName = eventName; + this.number = number; } public Object getSource() { @@ -50,4 +56,9 @@ public class Event implements Serializable { public String getEventName() { return eventName; } + + public int getNumber() { + return number; + } + } diff --git a/Mage.Client/src/main/java/mage/client/util/gui/TableSpinnerEditor.java b/Mage.Client/src/main/java/mage/client/util/gui/TableSpinnerEditor.java new file mode 100644 index 00000000000..26d1d520e5e --- /dev/null +++ b/Mage.Client/src/main/java/mage/client/util/gui/TableSpinnerEditor.java @@ -0,0 +1,171 @@ +/* + * 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.util.gui; + +import java.awt.Component; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.FocusEvent; +import java.awt.event.FocusListener; +import java.awt.event.KeyEvent; +import java.util.EventObject; +import javax.swing.BorderFactory; +import javax.swing.DefaultCellEditor; +import javax.swing.JOptionPane; +import javax.swing.JSpinner; +import javax.swing.JTable; +import javax.swing.JTextField; +import javax.swing.SpinnerNumberModel; +import javax.swing.SwingUtilities; +import mage.client.cards.CardsList; + +/** + * + * @author LevelX2 + */ +public class TableSpinnerEditor extends DefaultCellEditor { + + JSpinner spinner; + JSpinner.DefaultEditor editor; + JTextField textField; + boolean valueSet; + private JTable lastTable; + private int lastRow = -1; + private int currentRow = -1; + private int lastOriginalHeigh; + private int currentOriginalHeigh; + private static final int NEEDED_HIGH = 24; + CardsList cardsList; + + // Initializes the spinner. + public TableSpinnerEditor(CardsList cardsList) { + super(new JTextField()); + this.cardsList = cardsList; + spinner = new JSpinner(); + spinner.setBorder(BorderFactory.createEmptyBorder()); + spinner.setModel(new SpinnerNumberModel(0,0,999,1)); + editor = ((JSpinner.DefaultEditor) spinner.getEditor()); + textField = editor.getTextField(); + textField.setHorizontalAlignment(JTextField.LEFT); + textField.addFocusListener(new FocusListener() { + @Override + public void focusGained(FocusEvent fe) { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + if (valueSet) { + textField.setCaretPosition(1); + } + } + }); + } + + @Override + public void focusLost(FocusEvent fe) { + if (currentRow < 0) { + stopCellEditing(); + } + } + }); + textField.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent ae) { + stopCellEditing(); + } + }); + } + + private synchronized void setTableRowHeigh(JTable table, int row) { + if (lastRow >=0 && lastOriginalHeigh < NEEDED_HIGH) { + lastTable.setRowHeight(lastRow, lastOriginalHeigh); + } + if (row >= 0 && currentRow >=0) { + lastRow = currentRow; + lastOriginalHeigh = currentOriginalHeigh; + currentRow = -1; + currentOriginalHeigh = -1; + } + lastRow = -1; + if (table != null) { + lastTable = table; + currentOriginalHeigh = table.getRowHeight(row); + currentRow = row; + if (currentOriginalHeigh < NEEDED_HIGH) { + lastTable.setRowHeight(currentRow, NEEDED_HIGH); + } + } + } + + // Prepares the spinner component and returns it. + @Override + public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { + setTableRowHeigh(table, row); + if (!valueSet) { + spinner.setValue(value); + } + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + textField.requestFocus(); + } + }); + return spinner; + } + + @Override + public boolean isCellEditable(EventObject eo) { + if (eo instanceof KeyEvent) { + KeyEvent ke = (KeyEvent) eo; + textField.setText(String.valueOf(ke.getKeyChar())); + valueSet = true; + } else { + valueSet = false; + } + return true; + } + + // Returns the spinners current value. + @Override + public Object getCellEditorValue() { + return spinner.getValue(); + } + + @Override + public boolean stopCellEditing() { + try { + editor.commitEdit(); + spinner.commitEdit(); + cardsList.handleSetNumber((Integer) spinner.getValue()); + setTableRowHeigh(null, 0); + } catch (java.text.ParseException e) { + JOptionPane.showMessageDialog(null, + "Invalid value, discarding."); + } + return super.stopCellEditing(); + } +}