* 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.

This commit is contained in:
LevelX2 2014-05-09 16:00:37 +02:00
parent 7d714947aa
commit 0561499d5b
13 changed files with 351 additions and 55 deletions

View file

@ -879,7 +879,7 @@ public class MageFrame extends javax.swing.JFrame implements MageClient {
}// </editor-fold>//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) {

View file

@ -49,6 +49,10 @@ public class CardEventSource implements EventSource<Event>, 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));
}

View file

@ -15,8 +15,9 @@
<Dimension value="[30, 30]"/>
</Property>
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
<Connection code="(!Beans.isDesignTime())?(new Dimension(Config.dimensions.frameWidth, Config.dimensions.frameHeight)):(new Dimension(100, 100))" type="code"/>
<Connection code="(!Beans.isDesignTime())?&#xd;&#xa;(new Dimension(Config.dimensions.frameWidth, Config.dimensions.frameHeight))&#xd;&#xa;:(new Dimension(600, 600))" type="code"/>
</Property>
<Property name="requestFocusEnabled" type="boolean" value="false"/>
</Properties>
<AuxValues>
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
@ -34,7 +35,7 @@
<DimensionLayout dim="0">
<Group type="103" groupAlignment="0" attributes="0">
<Component id="panelCardArea" alignment="0" max="32767" attributes="0"/>
<Component id="panelControl" pref="719" max="32767" attributes="0"/>
<Component id="panelControl" pref="818" max="32767" attributes="0"/>
</Group>
</DimensionLayout>
<DimensionLayout dim="1">
@ -42,7 +43,7 @@
<Group type="102" alignment="0" attributes="0">
<Component id="panelControl" min="-2" max="-2" attributes="0"/>
<EmptySpace min="-2" pref="0" max="-2" attributes="0"/>
<Component id="panelCardArea" pref="120" max="32767" attributes="0"/>
<Component id="panelCardArea" pref="69" max="32767" attributes="0"/>
</Group>
</Group>
</DimensionLayout>
@ -81,7 +82,7 @@
<Component id="jToggleListView" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="jToggleCardView" min="-2" max="-2" attributes="0"/>
<EmptySpace min="-2" pref="195" max="-2" attributes="0"/>
<EmptySpace min="-2" pref="287" max="-2" attributes="0"/>
</Group>
</Group>
</DimensionLayout>

View file

@ -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<Integer> 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))
);
}// </editor-fold>//GEN-END:initComponents

View file

@ -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;
}
}

View file

@ -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()) {

View file

@ -56,7 +56,7 @@ public class DeckEditorPane extends MagePane {
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
boolean initialized = false;
if (Plugins.getInstance().isThemePluginLoaded()) {
Map<String, JComponent> uiMap = new HashMap<String, JComponent>();
Map<String, JComponent> 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 {

View file

@ -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<Event>() {
@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<Event>() {
@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<Card> cards) {
CardView cardView = (CardView) event.getSource();
int numberToSet = event.getNumber();
int cardsFound = 0;
List<Card> 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);
}

View file

@ -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.
}
}

View file

@ -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;

View file

@ -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) {

View file

@ -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;
}
}

View file

@ -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();
}
}