diff --git a/.hgignore b/.hgignore index 424f8253f2..090c3a2d6f 100644 --- a/.hgignore +++ b/.hgignore @@ -24,3 +24,4 @@ release/lib/* .project release/Magarena/mods/ release/Magarena/crash.png +*.jpage diff --git a/src/magic/ui/CardExplorerScreen.java b/src/magic/ui/CardExplorerScreen.java index cc26e0a0a9..e7d73dda4a 100644 --- a/src/magic/ui/CardExplorerScreen.java +++ b/src/magic/ui/CardExplorerScreen.java @@ -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() */ diff --git a/src/magic/ui/DeckEditorScreen.java b/src/magic/ui/DeckEditorScreen.java index f9a2632fe4..0e69ff5ef3 100644 --- a/src/magic/ui/DeckEditorScreen.java +++ b/src/magic/ui/DeckEditorScreen.java @@ -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); - } - } diff --git a/src/magic/ui/DuelDecksScreen.java b/src/magic/ui/DuelDecksScreen.java index ad6f12f11d..76fa3fa42f 100644 --- a/src/magic/ui/DuelDecksScreen.java +++ b/src/magic/ui/DuelDecksScreen.java @@ -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() { diff --git a/src/magic/ui/EditDeckCard.java b/src/magic/ui/EditDeckCard.java deleted file mode 100644 index f478907bb1..0000000000 --- a/src/magic/ui/EditDeckCard.java +++ /dev/null @@ -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; - } -} diff --git a/src/magic/ui/ExplorerFilterPanel.java b/src/magic/ui/ExplorerFilterPanel.java index d500b02b70..9c1083458a 100644 --- a/src/magic/ui/ExplorerFilterPanel.java +++ b/src/magic/ui/ExplorerFilterPanel.java @@ -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; diff --git a/src/magic/ui/ExplorerPanel.java b/src/magic/ui/ExplorerPanel.java index 2b7c08d6d6..18df942b77 100644 --- a/src/magic/ui/ExplorerPanel.java +++ b/src/magic/ui/ExplorerPanel.java @@ -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 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; + } + } diff --git a/src/magic/ui/MagicFrame.java b/src/magic/ui/MagicFrame.java index 00d3794e05..5a434610cc 100644 --- a/src/magic/ui/MagicFrame.java +++ b/src/magic/ui/MagicFrame.java @@ -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; } /** diff --git a/src/magic/ui/viewer/DeckViewer.java b/src/magic/ui/viewer/DeckViewer.java deleted file mode 100644 index 1f0a61495e..0000000000 --- a/src/magic/ui/viewer/DeckViewer.java +++ /dev/null @@ -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 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(); - - 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 entriesMap=new HashMap(); - 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 0)) { - colorLabels[cindex].setIcon(color.getManaType().getIcon(true)); - } - cindex++; - } - } - } - - private class DeckEntry extends JPanel implements Comparable,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); - } - } -} diff --git a/src/magic/ui/viewer/DeckViewers.java b/src/magic/ui/viewer/DeckViewers.java deleted file mode 100644 index bdceab1854..0000000000 --- a/src/magic/ui/viewer/DeckViewers.java +++ /dev/null @@ -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(); - } -} diff --git a/src/magic/ui/widget/ButtonControlledPopup.java b/src/magic/ui/widget/ButtonControlledPopup.java index 6a8fabb7f6..a24d244c82 100644 --- a/src/magic/ui/widget/ButtonControlledPopup.java +++ b/src/magic/ui/widget/ButtonControlledPopup.java @@ -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);