- 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
Lodici 2013-12-08 18:39:09 +00:00
parent cb54127af2
commit f48c963931
11 changed files with 143 additions and 558 deletions

View File

@ -24,3 +24,4 @@ release/lib/*
.project
release/Magarena/mods/
release/Magarena/crash.png
*.jpage

View File

@ -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()
*/

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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