- Fix[#431]: Unable to close Deck Editor if deck is invalid.
- added .jpage (eclipse scrapbook page) to .hgignore. - refactor: removed unused UI classes. - Remove Parameter refactor: MagicFrame in ExplorerPanel constructor not used any more.master
parent
cb54127af2
commit
f48c963931
|
@ -24,3 +24,4 @@ release/lib/*
|
|||
.project
|
||||
release/Magarena/mods/
|
||||
release/Magarena/crash.png
|
||||
*.jpage
|
||||
|
|
|
@ -4,8 +4,6 @@ import java.awt.event.ActionEvent;
|
|||
import java.util.List;
|
||||
|
||||
import javax.swing.AbstractAction;
|
||||
import javax.swing.JPanel;
|
||||
|
||||
import magic.ui.widget.MenuButton;
|
||||
|
||||
@SuppressWarnings("serial")
|
||||
|
@ -16,15 +14,10 @@ public class CardExplorerScreen
|
|||
private final MagicFrame frame;
|
||||
|
||||
public CardExplorerScreen(final MagicFrame frame0) {
|
||||
super(getScreenContent(frame0), frame0);
|
||||
super(new ExplorerPanel(), frame0);
|
||||
frame = frame0;
|
||||
}
|
||||
|
||||
private static JPanel getScreenContent(MagicFrame frame) {
|
||||
final ExplorerPanel content = new ExplorerPanel(frame);
|
||||
return content;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see magic.ui.IMagStatusBar#getScreenCaption()
|
||||
*/
|
||||
|
|
|
@ -12,8 +12,6 @@ import javax.swing.JPanel;
|
|||
import magic.MagicMain;
|
||||
import magic.data.DeckUtils;
|
||||
import magic.model.MagicDeck;
|
||||
import magic.model.MagicDeckConstructionRule;
|
||||
import magic.model.MagicPlayerDefinition;
|
||||
import magic.ui.viewer.DeckDescriptionPreview;
|
||||
import magic.ui.widget.MenuButton;
|
||||
|
||||
|
@ -25,23 +23,23 @@ public class DeckEditorScreen
|
|||
private static ExplorerPanel content;
|
||||
private final MagicFrame frame;
|
||||
|
||||
// CTR
|
||||
public DeckEditorScreen(final MagicFrame frame0, final int mode) {
|
||||
super(getScreenContent(frame0, mode), frame0);
|
||||
// CTR : opens Deck Editor ready to update passed in deck.
|
||||
public DeckEditorScreen(final MagicFrame frame0, final MagicDeck deck) {
|
||||
super(getScreenContent(deck), frame0);
|
||||
this.frame = frame0;
|
||||
}
|
||||
public DeckEditorScreen(final MagicFrame frame0, final int mode, final MagicPlayerDefinition player) {
|
||||
super(getScreenContent(frame0, mode, player), frame0);
|
||||
// CTR : open Deck Editor in standalone mode starting with an empty deck.
|
||||
public DeckEditorScreen(final MagicFrame frame0) {
|
||||
super(getScreenContent(), frame0);
|
||||
this.frame = frame0;
|
||||
}
|
||||
|
||||
private static JPanel getScreenContent(MagicFrame frame, final int mode, final MagicPlayerDefinition player) {
|
||||
content = new ExplorerPanel(frame, mode, player);
|
||||
private static JPanel getScreenContent(final MagicDeck deck) {
|
||||
content = new ExplorerPanel(deck);
|
||||
return content;
|
||||
}
|
||||
private static JPanel getScreenContent(MagicFrame frame, final int mode) {
|
||||
content = new ExplorerPanel(frame, mode, true);
|
||||
return content;
|
||||
private static JPanel getScreenContent() {
|
||||
return getScreenContent(null);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
|
@ -49,12 +47,21 @@ public class DeckEditorScreen
|
|||
*/
|
||||
@Override
|
||||
public MenuButton getLeftAction() {
|
||||
return new MenuButton("Close", new AbstractAction() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
frame.closeActiveScreen(false);
|
||||
}
|
||||
});
|
||||
if (!content.isStandaloneDeckEditor()) {
|
||||
return new MenuButton("Cancel", new AbstractAction() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
frame.closeActiveScreen(false);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
return new MenuButton("Close", new AbstractAction() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
frame.closeActiveScreen(false);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
|
@ -62,7 +69,18 @@ public class DeckEditorScreen
|
|||
*/
|
||||
@Override
|
||||
public MenuButton getRightAction() {
|
||||
return null;
|
||||
if (!content.isStandaloneDeckEditor()) {
|
||||
return new MenuButton("Update duel deck", new AbstractAction() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
if (content.validateDeck(true) && content.applyDeckUpdates()) {
|
||||
frame.closeActiveScreen(false);
|
||||
}
|
||||
}
|
||||
});
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
|
@ -77,7 +95,7 @@ public class DeckEditorScreen
|
|||
loadDeck();
|
||||
}
|
||||
}, "Load deck from file"));
|
||||
if (content.getPlayer() == null) {
|
||||
if (content.isStandaloneDeckEditor()) {
|
||||
buttons.add(new MenuButton("Save", new AbstractAction() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
|
@ -103,11 +121,7 @@ public class DeckEditorScreen
|
|||
*/
|
||||
@Override
|
||||
public String getScreenCaption() {
|
||||
if (content.getPlayer() != null) {
|
||||
return "Deck Editor : " + content.getPlayer().getName();
|
||||
} else {
|
||||
return "Deck Editor";
|
||||
}
|
||||
return "Deck Editor";
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
|
@ -119,13 +133,7 @@ public class DeckEditorScreen
|
|||
}
|
||||
|
||||
public void createNewEmptyDeck() {
|
||||
final MagicPlayerDefinition player = content.getPlayer();
|
||||
if (player != null) {
|
||||
player.getDeck().clear();
|
||||
content.setDeck(player.getDeck());
|
||||
} else {
|
||||
content.setDeck(new MagicDeck());
|
||||
}
|
||||
content.setDeck(new MagicDeck());
|
||||
}
|
||||
|
||||
public void loadDeck() {
|
||||
|
@ -138,13 +146,7 @@ public class DeckEditorScreen
|
|||
final int action=fileChooser.showOpenDialog(this);
|
||||
if (action==JFileChooser.APPROVE_OPTION) {
|
||||
final String filename=fileChooser.getSelectedFile().getAbsolutePath();
|
||||
final MagicPlayerDefinition player = content.getPlayer();
|
||||
if (player != null) {
|
||||
DeckUtils.loadDeck(filename, player);
|
||||
content.setDeck(player.getDeck());
|
||||
} else {
|
||||
content.setDeck(DeckUtils.loadDeckFromFile(filename));
|
||||
}
|
||||
content.setDeck(DeckUtils.loadDeckFromFile(filename));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -177,39 +179,10 @@ public class DeckEditorScreen
|
|||
*/
|
||||
@Override
|
||||
public boolean isScreenReadyToClose(final MagScreen nextScreen) {
|
||||
if (content.getPlayer() != null) {
|
||||
return validateDeck(content.getPlayer().getDeck(), nextScreen);
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// FIXME: Should be able to discard changes if rules are broken and close screen anyway.
|
||||
// Currently cannot close screen if rules are broken. The problem is that any
|
||||
// changes made in the Deck Editor are reflected in the player duel deck screen.
|
||||
//
|
||||
private boolean validateDeck(final MagicDeck deck, final MagScreen nextScreen) {
|
||||
final String brokenRules = getBrokenRules(deck);
|
||||
if (brokenRules.length() > 0) {
|
||||
notifyUser(brokenRules);
|
||||
return false;
|
||||
} else if (nextScreen instanceof DuelDecksScreen) {
|
||||
if (content.isDeckEditor() && !content.isStandaloneDeckEditor() && nextScreen instanceof DuelDecksScreen) {
|
||||
((DuelDecksScreen)nextScreen).updateDecksAfterEdit();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private String getBrokenRules(final MagicDeck deck) {
|
||||
return MagicDeckConstructionRule.getRulesText(MagicDeckConstructionRule.checkDeck(deck));
|
||||
}
|
||||
|
||||
private void notifyUser(final String brokenRules) {
|
||||
JOptionPane.showMessageDialog(
|
||||
this,
|
||||
"This deck is illegal.\n\n" + brokenRules,
|
||||
"Illegal Deck",
|
||||
JOptionPane.WARNING_MESSAGE);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -110,7 +110,7 @@ public class DuelDecksScreen
|
|||
buttons.add(new MenuButton("Deck Editor", new AbstractAction() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
frame.showDeckEditor(screenContent.getSelectedPlayer());
|
||||
frame.showDeckEditor(screenContent.getSelectedPlayer().getDeck());
|
||||
}
|
||||
}));
|
||||
buttons.add(new MenuButton("Swap Decks", new AbstractAction() {
|
||||
|
|
|
@ -1,41 +0,0 @@
|
|||
package magic.ui;
|
||||
|
||||
import magic.model.MagicCardDefinition;
|
||||
import magic.model.MagicCubeDefinition;
|
||||
import magic.model.MagicPlayerDefinition;
|
||||
import magic.ui.viewer.DeckViewer;
|
||||
|
||||
public class EditDeckCard {
|
||||
|
||||
private final DeckViewer deckViewer;
|
||||
private final MagicPlayerDefinition player;
|
||||
private final MagicCubeDefinition cube;
|
||||
private final MagicCardDefinition card;
|
||||
|
||||
public EditDeckCard(
|
||||
final DeckViewer deckViewer,
|
||||
final MagicPlayerDefinition player,
|
||||
final MagicCubeDefinition cube,
|
||||
final MagicCardDefinition card) {
|
||||
this.deckViewer=deckViewer;
|
||||
this.player=player;
|
||||
this.cube=cube;
|
||||
this.card=card;
|
||||
}
|
||||
|
||||
public DeckViewer getDeckViewer() {
|
||||
return deckViewer;
|
||||
}
|
||||
|
||||
public MagicPlayerDefinition getPlayer() {
|
||||
return player;
|
||||
}
|
||||
|
||||
public MagicCubeDefinition getCube() {
|
||||
return cube;
|
||||
}
|
||||
|
||||
public MagicCardDefinition getCard() {
|
||||
return card;
|
||||
}
|
||||
}
|
|
@ -16,7 +16,6 @@ import javax.swing.BoxLayout;
|
|||
import javax.swing.ButtonGroup;
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JCheckBox;
|
||||
import javax.swing.JFrame;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JRadioButton;
|
||||
|
@ -52,7 +51,6 @@ public class ExplorerFilterPanel extends TexturedPanel implements ActionListener
|
|||
private static final Dimension BUTTON_HOLDER_PANEL_SIZE = new Dimension(100, 72);
|
||||
private static final Dimension SEARCH_HOLDER_PANEL_SIZE = new Dimension(150, 72);
|
||||
|
||||
private final JFrame frame;
|
||||
private final ExplorerPanel explorerPanel;
|
||||
private final ButtonControlledPopup typePopup;
|
||||
private final JCheckBox[] typeCheckBoxes;
|
||||
|
@ -73,11 +71,8 @@ public class ExplorerFilterPanel extends TexturedPanel implements ActionListener
|
|||
private final JButton resetButton;
|
||||
private boolean disableUpdate; // so when we change several filters, it doesn't update until the end
|
||||
|
||||
public ExplorerFilterPanel(
|
||||
final JFrame frame,
|
||||
final ExplorerPanel explorerPanel,
|
||||
final int mode) {
|
||||
this.frame = frame;
|
||||
public ExplorerFilterPanel(final ExplorerPanel explorerPanel) {
|
||||
|
||||
this.explorerPanel=explorerPanel;
|
||||
|
||||
disableUpdate = false;
|
||||
|
@ -192,7 +187,7 @@ public class ExplorerFilterPanel extends TexturedPanel implements ActionListener
|
|||
selectButton.setPreferredSize(BUTTON_SIZE);
|
||||
filterPanel.add(selectButton, BorderLayout.CENTER);
|
||||
|
||||
final ButtonControlledPopup pop = new ButtonControlledPopup(frame, selectButton, HIDE_BUTTON_TEXT, FILTER_BUTTON_TEXT);
|
||||
final ButtonControlledPopup pop = new ButtonControlledPopup(selectButton, HIDE_BUTTON_TEXT, FILTER_BUTTON_TEXT);
|
||||
pop.setLayout(new BoxLayout(pop, BoxLayout.Y_AXIS));
|
||||
selectButton.addActionListener(new PopupCloser(pop));
|
||||
return pop;
|
||||
|
|
|
@ -1,9 +1,10 @@
|
|||
package magic.ui;
|
||||
|
||||
import magic.MagicMain;
|
||||
import magic.data.CardImagesProvider;
|
||||
import magic.model.MagicCardDefinition;
|
||||
import magic.model.MagicDeck;
|
||||
import magic.model.MagicPlayerDefinition;
|
||||
import magic.model.MagicDeckConstructionRule;
|
||||
import magic.model.MagicRandom;
|
||||
import magic.ui.viewer.CardViewer;
|
||||
import magic.ui.viewer.DeckStatisticsViewer;
|
||||
|
@ -33,57 +34,42 @@ public class ExplorerPanel extends TexturedPanel implements ActionListener {
|
|||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
public static final int ALL = 0;
|
||||
public static final int LAND = 1;
|
||||
public static final int SPELL = 2;
|
||||
|
||||
private static final String ADD_BUTTON_TEXT = "Add";
|
||||
private static final String REMOVE_BUTTON_TEXT = "Remove";
|
||||
private static final String CARD_POOL_TITLE = "Card Pool";
|
||||
private static final int SPACING=10;
|
||||
|
||||
protected final MagicFrame frame;
|
||||
private final MagicPlayerDefinition player;
|
||||
private final CardTable cardPoolTable;
|
||||
private CardTable cardPoolTable;
|
||||
private CardTable deckTable;
|
||||
private final CardViewer cardViewer;
|
||||
private final DeckStatisticsViewer statsViewer;
|
||||
private final ExplorerFilterPanel filterPanel;
|
||||
private final JButton addButton;
|
||||
private final JButton removeButton;
|
||||
private CardViewer cardViewer;
|
||||
private DeckStatisticsViewer statsViewer;
|
||||
private ExplorerFilterPanel filterPanel;
|
||||
private JButton addButton;
|
||||
private JButton removeButton;
|
||||
private List<MagicCardDefinition> cardPoolDefs;
|
||||
private MagicDeck deckDefs;
|
||||
private final boolean isDeckEditor;
|
||||
private MagicDeck deck;
|
||||
private MagicDeck originalDeck;
|
||||
|
||||
public ExplorerPanel(final MagicFrame frame) {
|
||||
this(frame, ExplorerPanel.ALL, null, false);
|
||||
// CTR - Card Explorer
|
||||
public ExplorerPanel() {
|
||||
this.isDeckEditor = false;
|
||||
setupExplorerPanel(null);
|
||||
}
|
||||
public ExplorerPanel(final MagicFrame frame, final int mode, final boolean isDeckEditor) {
|
||||
this(frame, mode, null, isDeckEditor);
|
||||
}
|
||||
public ExplorerPanel(final MagicFrame frame, final int mode, final MagicPlayerDefinition player) {
|
||||
this(frame, mode, player, (player != null));
|
||||
// CTR - Deck Editor
|
||||
public ExplorerPanel(final MagicDeck deck) {
|
||||
this.isDeckEditor = true;
|
||||
setupExplorerPanel(deck);
|
||||
}
|
||||
|
||||
private ExplorerPanel(
|
||||
final MagicFrame frame,
|
||||
final int mode,
|
||||
final MagicPlayerDefinition player,
|
||||
final boolean isDeckEditor0) {
|
||||
private void setupExplorerPanel(final MagicDeck deck0) {
|
||||
|
||||
this.frame=frame;
|
||||
this.player=player;
|
||||
this.isDeckEditor = isDeckEditor0;
|
||||
|
||||
if (isDeckEditor0) {
|
||||
if (player != null) {
|
||||
this.deck = player.getDeck();
|
||||
} else {
|
||||
this.deck = new MagicDeck();
|
||||
}
|
||||
} else {
|
||||
this.deck = null;
|
||||
this.deck = new MagicDeck();
|
||||
this.originalDeck = deck0;
|
||||
if (deck0 != null) {
|
||||
// work with a copy of the original deck so it is easy to cancel updates.
|
||||
this.deck.setContent(deck0);
|
||||
}
|
||||
|
||||
setBackground(FontsAndBorders.MAGSCREEN_FADE_COLOR);
|
||||
|
@ -97,7 +83,7 @@ public class ExplorerPanel extends TexturedPanel implements ActionListener {
|
|||
buttonsPanel.setOpaque(false);
|
||||
|
||||
// create buttons for deck editing
|
||||
if (isEditingDeck()) {
|
||||
if (isDeckEditor()) {
|
||||
addButton = new JButton(ADD_BUTTON_TEXT);
|
||||
addButton.setFont(FontsAndBorders.FONT1);
|
||||
addButton.setFocusable(false);
|
||||
|
@ -132,7 +118,7 @@ public class ExplorerPanel extends TexturedPanel implements ActionListener {
|
|||
leftPanel.add(cardViewer);
|
||||
|
||||
// deck statistics
|
||||
if (isEditingDeck()) {
|
||||
if (isDeckEditor()) {
|
||||
leftPanel.add(Box.createVerticalStrut(SPACING));
|
||||
statsViewer = new DeckStatisticsViewer();
|
||||
statsViewer.setMaximumSize(DeckStatisticsViewer.PREFERRED_SIZE);
|
||||
|
@ -153,7 +139,7 @@ public class ExplorerPanel extends TexturedPanel implements ActionListener {
|
|||
leftScrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
|
||||
add(leftScrollPane);
|
||||
|
||||
filterPanel = new ExplorerFilterPanel(frame, this, mode);
|
||||
filterPanel = new ExplorerFilterPanel(this);
|
||||
|
||||
final JScrollPane filterScrollPane = new JScrollPane(filterPanel);
|
||||
filterScrollPane.setBorder(FontsAndBorders.NO_BORDER);
|
||||
|
@ -168,7 +154,7 @@ public class ExplorerPanel extends TexturedPanel implements ActionListener {
|
|||
// deck
|
||||
final Container cardsPanel; // reference panel holding both card pool and deck
|
||||
|
||||
if (isEditingDeck()) {
|
||||
if (isDeckEditor()) {
|
||||
cardPoolTable = new CardTable(cardPoolDefs, cardViewer, generatePoolTitle(), false);
|
||||
cardPoolTable.addMouseListener(new CardPoolMouseListener());
|
||||
|
||||
|
@ -251,28 +237,24 @@ public class ExplorerPanel extends TexturedPanel implements ActionListener {
|
|||
return CARD_POOL_TITLE + " - " + cardPoolDefs.size() + " cards";
|
||||
}
|
||||
|
||||
private boolean isEditingDeck() {
|
||||
return (player != null) || this.isDeckEditor;
|
||||
public boolean isDeckEditor() {
|
||||
return this.isDeckEditor;
|
||||
}
|
||||
|
||||
public MagicPlayerDefinition getPlayer() {
|
||||
return player;
|
||||
}
|
||||
|
||||
String generateDeckTitle(final MagicDeck deck) {
|
||||
private String generateDeckTitle(final MagicDeck deck) {
|
||||
return "Deck (" + deck.getName() + ") - " + deck.size() + " cards";
|
||||
}
|
||||
|
||||
public void updateCardPool() {
|
||||
cardPoolDefs = filterPanel.getCardDefinitions();
|
||||
cardPoolTable.setCards(cardPoolDefs);
|
||||
if(isEditingDeck()) {
|
||||
if(isDeckEditor()) {
|
||||
cardPoolTable.setTitle(generatePoolTitle());
|
||||
}
|
||||
}
|
||||
|
||||
public void updateDeck() {
|
||||
if(isEditingDeck()) {
|
||||
if(isDeckEditor()) {
|
||||
deckDefs = this.deck;
|
||||
deckTable.setTitle(generateDeckTitle(deckDefs));
|
||||
deckTable.setCards(deckDefs);
|
||||
|
@ -292,7 +274,7 @@ public class ExplorerPanel extends TexturedPanel implements ActionListener {
|
|||
|
||||
} else {
|
||||
// display error
|
||||
JOptionPane.showMessageDialog(frame, "Select a valid card in the deck to remove it.", "Error", JOptionPane.ERROR_MESSAGE);
|
||||
JOptionPane.showMessageDialog(MagicMain.rootFrame, "Select a valid card in the deck to remove it.", "Error", JOptionPane.ERROR_MESSAGE);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -308,7 +290,7 @@ public class ExplorerPanel extends TexturedPanel implements ActionListener {
|
|||
|
||||
} else {
|
||||
// display error
|
||||
JOptionPane.showMessageDialog(frame, "Select a valid card in the card pool to add it to the deck.", "Error", JOptionPane.ERROR_MESSAGE);
|
||||
JOptionPane.showMessageDialog(MagicMain.rootFrame, "Select a valid card in the card pool to add it to the deck.", "Error", JOptionPane.ERROR_MESSAGE);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -316,7 +298,7 @@ public class ExplorerPanel extends TexturedPanel implements ActionListener {
|
|||
public void actionPerformed(final ActionEvent event) {
|
||||
final Object source=event.getSource();
|
||||
|
||||
if (isEditingDeck()) {
|
||||
if (isDeckEditor()) {
|
||||
if(source == addButton) {
|
||||
addSelectedToDeck();
|
||||
} else if(source == removeButton) {
|
||||
|
@ -334,7 +316,7 @@ public class ExplorerPanel extends TexturedPanel implements ActionListener {
|
|||
private class CardPoolMouseListener extends MouseAdapter {
|
||||
@Override
|
||||
public void mouseClicked(final MouseEvent e) {
|
||||
if(isEditingDeck() && e.getClickCount() > 1) {
|
||||
if(isDeckEditor() && e.getClickCount() > 1) {
|
||||
addSelectedToDeck();
|
||||
}
|
||||
}
|
||||
|
@ -343,7 +325,7 @@ public class ExplorerPanel extends TexturedPanel implements ActionListener {
|
|||
private class DeckMouseListener extends MouseAdapter {
|
||||
@Override
|
||||
public void mouseClicked(final MouseEvent e) {
|
||||
if(isEditingDeck()) {
|
||||
if(isDeckEditor()) {
|
||||
if (e.getClickCount() > 1) {
|
||||
if (e.getButton() == MouseEvent.BUTTON1) {
|
||||
removeSelectedFromDeck();
|
||||
|
@ -372,7 +354,7 @@ public class ExplorerPanel extends TexturedPanel implements ActionListener {
|
|||
public void setDeck(final MagicDeck deck0) {
|
||||
if (deck0 != null) {
|
||||
this.deck = deck0;
|
||||
if(isEditingDeck()) {
|
||||
if(isDeckEditor()) {
|
||||
deckDefs = this.deck;
|
||||
deckTable.setTitle(generateDeckTitle(deckDefs));
|
||||
deckTable.setCards(deckDefs);
|
||||
|
@ -385,4 +367,47 @@ public class ExplorerPanel extends TexturedPanel implements ActionListener {
|
|||
return this.deck;
|
||||
}
|
||||
|
||||
public boolean applyDeckUpdates() {
|
||||
boolean updatesApplied = true;
|
||||
if (isUpdatingExistingDeck()) {
|
||||
if (validateDeck(false)) {
|
||||
this.originalDeck.setContent(this.deck);
|
||||
} else {
|
||||
updatesApplied = false;
|
||||
}
|
||||
}
|
||||
return updatesApplied;
|
||||
}
|
||||
|
||||
private String getBrokenRules(final MagicDeck deck) {
|
||||
return MagicDeckConstructionRule.getRulesText(MagicDeckConstructionRule.checkDeck(deck));
|
||||
}
|
||||
|
||||
private void notifyUser(final String brokenRules) {
|
||||
JOptionPane.showMessageDialog(
|
||||
this,
|
||||
"This deck is illegal.\n\n" + brokenRules,
|
||||
"Illegal Deck",
|
||||
JOptionPane.WARNING_MESSAGE);
|
||||
}
|
||||
|
||||
public boolean validateDeck(final boolean notifyUser) {
|
||||
final String brokenRules = getBrokenRules(deck);
|
||||
if (brokenRules.length() > 0) {
|
||||
if (notifyUser) {
|
||||
notifyUser(brokenRules);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean isStandaloneDeckEditor() {
|
||||
return isDeckEditor() && !isUpdatingExistingDeck();
|
||||
}
|
||||
|
||||
private boolean isUpdatingExistingDeck() {
|
||||
return this.originalDeck != null;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -40,7 +40,7 @@ public class MagicFrame extends JFrame {
|
|||
private static final String testGame = System.getProperty("testGame");
|
||||
|
||||
// Check if we are on Mac OS X. This is crucial to loading and using the OSXAdapter class.
|
||||
public static final boolean MAC_OS_X = (System.getProperty("os.name").toLowerCase().startsWith("mac os x"));
|
||||
public static final boolean MAC_OS_X = System.getProperty("os.name").toLowerCase().startsWith("mac os x");
|
||||
|
||||
private final GeneralConfig config;
|
||||
private final JPanel contentPanel;
|
||||
|
@ -91,10 +91,10 @@ public class MagicFrame extends JFrame {
|
|||
// The various (Mag)screens that can currently be displayed.
|
||||
//
|
||||
public void showDeckEditor() {
|
||||
activateMagScreen(new DeckEditorScreen(this, ExplorerPanel.ALL));
|
||||
activateMagScreen(new DeckEditorScreen(this));
|
||||
}
|
||||
public void showDeckEditor(final MagicPlayerDefinition player) {
|
||||
activateMagScreen(new DeckEditorScreen(this, ExplorerPanel.ALL, player));
|
||||
public void showDeckEditor(final MagicDeck deck) {
|
||||
activateMagScreen(new DeckEditorScreen(this, deck));
|
||||
}
|
||||
public void showCardExplorerScreen() {
|
||||
activateMagScreen(new CardExplorerScreen(this));
|
||||
|
@ -380,7 +380,11 @@ public class MagicFrame extends JFrame {
|
|||
}
|
||||
|
||||
private boolean isFullScreen() {
|
||||
return (this.getExtendedState() == JFrame.MAXIMIZED_BOTH) && this.isUndecorated();
|
||||
return isMaximized() && this.isUndecorated();
|
||||
}
|
||||
|
||||
private boolean isMaximized() {
|
||||
return this.getExtendedState() == JFrame.MAXIMIZED_BOTH;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -1,271 +0,0 @@
|
|||
package magic.ui.viewer;
|
||||
|
||||
import magic.data.IconImages;
|
||||
import magic.model.MagicCardDefinition;
|
||||
import magic.model.MagicColor;
|
||||
import magic.model.MagicCubeDefinition;
|
||||
import magic.model.MagicPlayerDefinition;
|
||||
import magic.model.MagicPlayerProfile;
|
||||
import magic.ui.MagicFrame;
|
||||
import magic.ui.widget.CostPanel;
|
||||
import magic.ui.widget.FontsAndBorders;
|
||||
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JScrollPane;
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.Font;
|
||||
import java.awt.GridLayout;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class DeckViewer extends JPanel {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private static final int LINE_HEIGHT=28;
|
||||
|
||||
private final List<DeckEntry> entries;
|
||||
private final JScrollPane scrollPane;
|
||||
private final JPanel viewPanel;
|
||||
private final MagicFrame frame;
|
||||
private final DeckStatisticsViewer statisticsViewer;
|
||||
private final CardViewer cardViewer;
|
||||
private final boolean lands;
|
||||
private final boolean edit;
|
||||
private final MagicCubeDefinition cubeDefinition;
|
||||
private MagicPlayerDefinition player;
|
||||
private Font nameFont=FontsAndBorders.FONT1;
|
||||
|
||||
public DeckViewer(final MagicFrame frame,final DeckStatisticsViewer statisticsViewer,final CardViewer cardViewer,
|
||||
final boolean lands,final boolean edit,final MagicCubeDefinition cubeDefinition) {
|
||||
|
||||
this.frame=frame;
|
||||
this.statisticsViewer=statisticsViewer;
|
||||
this.cardViewer=cardViewer;
|
||||
this.lands=lands;
|
||||
this.edit=edit;
|
||||
this.cubeDefinition=cubeDefinition;
|
||||
entries=new ArrayList<DeckEntry>();
|
||||
|
||||
setOpaque(false);
|
||||
setLayout(new BorderLayout());
|
||||
|
||||
scrollPane=new JScrollPane();
|
||||
scrollPane.setBorder(FontsAndBorders.NO_BORDER);
|
||||
scrollPane.setOpaque(false);
|
||||
scrollPane.getViewport().setOpaque(false);
|
||||
scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
|
||||
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
|
||||
scrollPane.getVerticalScrollBar().setBlockIncrement(LINE_HEIGHT*2);
|
||||
scrollPane.getVerticalScrollBar().setUnitIncrement(LINE_HEIGHT*2);
|
||||
add(scrollPane,BorderLayout.CENTER);
|
||||
|
||||
viewPanel=new JPanel();
|
||||
viewPanel.setOpaque(false);
|
||||
viewPanel.setLayout(new BorderLayout());
|
||||
scrollPane.getViewport().add(viewPanel);
|
||||
}
|
||||
|
||||
private void setCardImage(final DeckEntry entry) {
|
||||
cardViewer.setCard(entry.card,0);
|
||||
}
|
||||
|
||||
public void setNameFont(final Font nameFont) {
|
||||
this.nameFont=nameFont;
|
||||
}
|
||||
|
||||
public void changePlayer(final MagicPlayerDefinition aPlayer) {
|
||||
this.player=aPlayer;
|
||||
update();
|
||||
}
|
||||
|
||||
public MagicPlayerDefinition getPlayer() {
|
||||
return player;
|
||||
}
|
||||
|
||||
public String getDeckName() {
|
||||
return player==null?"Deck":player.getDeck().getName();
|
||||
}
|
||||
|
||||
public void update() {
|
||||
|
||||
final Map<MagicCardDefinition,DeckEntry> entriesMap=new HashMap<MagicCardDefinition,DeckEntry>();
|
||||
for (final MagicCardDefinition card : player.getDeck()) {
|
||||
|
||||
if (card.isLand()==lands) {
|
||||
DeckEntry entry=entriesMap.get(card);
|
||||
if (entry==null) {
|
||||
entry=new DeckEntry(card);
|
||||
entriesMap.put(card,entry);
|
||||
} else {
|
||||
entry.count++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
entries.clear();
|
||||
entries.addAll(entriesMap.values());
|
||||
Collections.sort(entries);
|
||||
|
||||
final JPanel cardPanel=new JPanel();
|
||||
cardPanel.setBorder(FontsAndBorders.BLACK_BORDER);
|
||||
cardPanel.setLayout(new GridLayout(entries.size(),1));
|
||||
boolean light=true;
|
||||
for (final DeckEntry entry : entries) {
|
||||
|
||||
entry.build(light,edit);
|
||||
cardPanel.add(entry,light);
|
||||
light=!light;
|
||||
}
|
||||
|
||||
viewPanel.removeAll();
|
||||
viewPanel.add(cardPanel,BorderLayout.NORTH);
|
||||
|
||||
if (entries.size()>0) {
|
||||
setCardImage(entries.get(0));
|
||||
}
|
||||
|
||||
revalidate();
|
||||
repaint();
|
||||
}
|
||||
|
||||
public void updateAfterEdit() {
|
||||
statisticsViewer.setDeck(player.getDeck());
|
||||
update();
|
||||
}
|
||||
|
||||
private static class ColorPanel extends JPanel {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
public ColorPanel(final MagicPlayerDefinition player,final MagicCardDefinition card) {
|
||||
|
||||
setOpaque(false);
|
||||
setLayout(new GridLayout(1,3));
|
||||
final JLabel[] colorLabels=new JLabel[3];
|
||||
for (int i=0;i<colorLabels.length;i++) {
|
||||
|
||||
colorLabels[i]=new JLabel();
|
||||
colorLabels[i].setPreferredSize(new Dimension(19,0));
|
||||
colorLabels[i].setHorizontalAlignment(JLabel.CENTER);
|
||||
add(colorLabels[i]);
|
||||
}
|
||||
final MagicPlayerProfile profile=player.getProfile();
|
||||
int cindex=0;
|
||||
for (final MagicColor color : profile.getColors()) {
|
||||
if (color.hasColor(card.getColorFlags()) ||
|
||||
(card.isLand() && card.getManaSource(color) > 0)) {
|
||||
colorLabels[cindex].setIcon(color.getManaType().getIcon(true));
|
||||
}
|
||||
cindex++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private class DeckEntry extends JPanel implements Comparable<DeckEntry>,ActionListener {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private final MagicCardDefinition card;
|
||||
int count;
|
||||
|
||||
public DeckEntry(final MagicCardDefinition card) {
|
||||
|
||||
this.card=card;
|
||||
count=1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int compareTo(final DeckEntry entry) {
|
||||
|
||||
final boolean basic1=card.isBasic();
|
||||
final boolean basic2=entry.card.isBasic();
|
||||
if (basic1!=basic2) {
|
||||
return basic1?-1:1;
|
||||
}
|
||||
|
||||
final int dif=card.getConvertedCost()-entry.card.getConvertedCost();
|
||||
if (dif!=0) {
|
||||
return dif;
|
||||
}
|
||||
return card.getName().compareTo(entry.card.getName());
|
||||
}
|
||||
|
||||
public void build(final boolean light,final boolean edit) {
|
||||
|
||||
setPreferredSize(new Dimension(0,LINE_HEIGHT));
|
||||
setLayout(new BorderLayout(3,0));
|
||||
if (light) {
|
||||
this.setBackground(FontsAndBorders.GRAY1);
|
||||
}
|
||||
|
||||
this.addMouseListener(new MouseAdapter() {
|
||||
|
||||
@Override
|
||||
public void mouseEntered(final MouseEvent event) {
|
||||
|
||||
setCardImage(DeckEntry.this);
|
||||
}
|
||||
});
|
||||
|
||||
// Color or cost
|
||||
final JPanel leftPanel;
|
||||
if (card.isLand()) {
|
||||
leftPanel=new ColorPanel(player,card);
|
||||
} else {
|
||||
leftPanel=new CostPanel(card.getCost());
|
||||
}
|
||||
|
||||
// Name
|
||||
final JLabel nameLabel=new JLabel(card.getName());
|
||||
nameLabel.setFont(nameFont);
|
||||
nameLabel.setForeground(card.getRarityColor());
|
||||
|
||||
// Type
|
||||
final JLabel typeLabel=new JLabel(card.getIcon());
|
||||
|
||||
// Center
|
||||
final JPanel centerPanel=new JPanel();
|
||||
centerPanel.setOpaque(false);
|
||||
centerPanel.setLayout(new BorderLayout(3,0));
|
||||
centerPanel.add(leftPanel,BorderLayout.WEST);
|
||||
centerPanel.add(nameLabel,BorderLayout.CENTER);
|
||||
centerPanel.add(typeLabel,BorderLayout.EAST);
|
||||
add(centerPanel,BorderLayout.CENTER);
|
||||
|
||||
// Count
|
||||
final JPanel rightPanel=new JPanel();
|
||||
rightPanel.setOpaque(false);
|
||||
rightPanel.setLayout(new BorderLayout(1,0));
|
||||
final JLabel countLabel=new JLabel(count>1?Integer.toString(count):"");
|
||||
countLabel.setPreferredSize(new Dimension(16,0));
|
||||
countLabel.setHorizontalAlignment(JLabel.CENTER);
|
||||
rightPanel.add(countLabel,BorderLayout.WEST);
|
||||
|
||||
// Edit
|
||||
if (edit) {
|
||||
final JButton editButton=new JButton(IconImages.EDIT);
|
||||
editButton.setPreferredSize(new Dimension(32,0));
|
||||
rightPanel.add(editButton,BorderLayout.EAST);
|
||||
editButton.addActionListener(this);
|
||||
editButton.setFocusable(false);
|
||||
}
|
||||
add(rightPanel,BorderLayout.EAST);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void actionPerformed(final ActionEvent event) {
|
||||
frame.showDeckEditor(player);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,96 +0,0 @@
|
|||
package magic.ui.viewer;
|
||||
|
||||
import magic.data.IconImages;
|
||||
import magic.model.MagicCubeDefinition;
|
||||
import magic.model.MagicPlayerDefinition;
|
||||
import magic.ui.MagicFrame;
|
||||
import magic.ui.widget.TabSelector;
|
||||
import magic.ui.widget.TitleBar;
|
||||
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.event.ChangeEvent;
|
||||
import javax.swing.event.ChangeListener;
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.CardLayout;
|
||||
|
||||
public class DeckViewers extends JPanel implements ChangeListener {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private final DeckViewer spellViewer;
|
||||
private final DeckViewer landViewer;
|
||||
private final TitleBar titleBar;
|
||||
private final JPanel cardPanel;
|
||||
private final CardLayout cardLayout;
|
||||
private final TabSelector tabSelector;
|
||||
|
||||
public DeckViewers(final MagicFrame frame,final DeckStatisticsViewer statisticsViewer,
|
||||
final CardViewer cardViewer,final boolean edit,final MagicCubeDefinition cubeDefinition) {
|
||||
|
||||
setLayout(new BorderLayout());
|
||||
setOpaque(false);
|
||||
|
||||
titleBar=new TitleBar("");
|
||||
add(titleBar,BorderLayout.NORTH);
|
||||
|
||||
spellViewer=new DeckViewer(frame,statisticsViewer,cardViewer,false,edit,cubeDefinition);
|
||||
landViewer=new DeckViewer(frame,statisticsViewer,cardViewer,true,edit,cubeDefinition);
|
||||
|
||||
cardLayout=new CardLayout();
|
||||
cardPanel=new JPanel(cardLayout);
|
||||
cardPanel.setOpaque(false);
|
||||
cardPanel.add(spellViewer,"0");
|
||||
cardPanel.add(landViewer,"1");
|
||||
add(cardPanel,BorderLayout.CENTER);
|
||||
|
||||
tabSelector=new TabSelector(this,false);
|
||||
tabSelector.addTab(IconImages.SPELL,"Spells");
|
||||
tabSelector.addTab(IconImages.LAND,"Lands");
|
||||
titleBar.add(tabSelector,BorderLayout.EAST);
|
||||
}
|
||||
|
||||
public DeckViewer getSpellViewer() {
|
||||
|
||||
return spellViewer;
|
||||
}
|
||||
|
||||
public DeckViewer getLandViewer() {
|
||||
|
||||
return landViewer;
|
||||
}
|
||||
|
||||
private void updateTitle() {
|
||||
|
||||
final String deckName=spellViewer.getDeckName();
|
||||
titleBar.setText(tabSelector.getSelectedTab()==0?deckName+" : Spells":deckName+" : Lands");
|
||||
}
|
||||
|
||||
public void update() {
|
||||
|
||||
spellViewer.update();
|
||||
landViewer.update();
|
||||
updateTitle();
|
||||
}
|
||||
|
||||
public void updateAfterEdit() {
|
||||
|
||||
spellViewer.updateAfterEdit();
|
||||
landViewer.update();
|
||||
updateTitle();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void stateChanged(final ChangeEvent event) {
|
||||
|
||||
final Object source=event.getSource();
|
||||
if (source instanceof MagicPlayerDefinition) {
|
||||
final MagicPlayerDefinition player=(MagicPlayerDefinition)source;
|
||||
spellViewer.changePlayer(player);
|
||||
landViewer.changePlayer(player);
|
||||
} else {
|
||||
final int selectedTab=tabSelector.getSelectedTab();
|
||||
cardLayout.show(cardPanel,Integer.toString(selectedTab));
|
||||
}
|
||||
updateTitle();
|
||||
}
|
||||
}
|
|
@ -2,8 +2,10 @@ package magic.ui.widget;
|
|||
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JDialog;
|
||||
import javax.swing.JFrame;
|
||||
import javax.swing.SwingUtilities;
|
||||
|
||||
import magic.MagicMain;
|
||||
|
||||
import java.awt.Point;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
|
@ -27,11 +29,11 @@ public class ButtonControlledPopup extends TexturedPanel implements ActionListen
|
|||
|
||||
private boolean popupJustToggled;
|
||||
|
||||
public ButtonControlledPopup(final JFrame frame, final JButton toggleButton, final String hidePopupButtonText, final String showPopupButtonText) {
|
||||
public ButtonControlledPopup(JButton toggleButton, final String hidePopupButtonText, final String showPopupButtonText) {
|
||||
this.invokePopupButton = toggleButton;
|
||||
this.hidePopupButtonText = hidePopupButtonText;
|
||||
this.showPopupButtonText = showPopupButtonText;
|
||||
this.dialog = new JDialog(frame);
|
||||
this.dialog = new JDialog(MagicMain.rootFrame);
|
||||
this.timer = new Timer();
|
||||
|
||||
setBorder(FontsAndBorders.UP_BORDER);
|
||||
|
|
Loading…
Reference in New Issue