From 03cb41f2aa8447c8cdf0a4694d9cc4be124ff917 Mon Sep 17 00:00:00 2001 From: magenoxx Date: Sat, 27 Nov 2010 15:29:48 +0000 Subject: [PATCH] Now StackAbilityView has sourceCard. Added displaying source card for abilities. Fixed arrows offsets. Added "source" blue arrows (target arrows are red). Fixed NullPointerException happen for AbilityPicker. Fixed random order of spells in stack. Code clean up. --- .../main/java/mage/client/cards/BigCard.java | 21 +++++--- .../main/java/mage/client/cards/Cards.java | 32 ++++++----- .../java/mage/client/game/AbilityPicker.java | 1 + .../main/java/mage/client/game/GamePanel.java | 2 - .../plugins/adapters/MageActionCallback.java | 33 ++++++++++-- .../plugins/adapters/MageMouseAdapter.java | 47 ---------------- .../adapters/MageMouseMotionAdapter.java | 53 ------------------- Mage.Common/src/mage/view/CardView.java | 40 ++++++++++---- Mage.Common/src/mage/view/GameView.java | 9 ++-- .../src/mage/view/StackAbilityView.java | 11 +++- 10 files changed, 110 insertions(+), 139 deletions(-) delete mode 100644 Mage.Client/src/main/java/mage/client/plugins/adapters/MageMouseAdapter.java delete mode 100644 Mage.Client/src/main/java/mage/client/plugins/adapters/MageMouseMotionAdapter.java diff --git a/Mage.Client/src/main/java/mage/client/cards/BigCard.java b/Mage.Client/src/main/java/mage/client/cards/BigCard.java index 04a361bc3d1..6d13f4a0b16 100644 --- a/Mage.Client/src/main/java/mage/client/cards/BigCard.java +++ b/Mage.Client/src/main/java/mage/client/cards/BigCard.java @@ -51,6 +51,8 @@ import java.util.UUID; import javax.swing.text.BadLocationException; import javax.swing.text.StyledDocument; +import mage.client.plugins.impl.Plugins; + import org.jdesktop.swingx.JXPanel; /** @@ -62,10 +64,20 @@ public class BigCard extends javax.swing.JPanel { protected Image bigImage; protected UUID cardId; protected JXPanel panel; + protected boolean initState; public BigCard() { initComponents(); + if (!Plugins.getInstance().isCardPluginLoaded()) { + initBounds(); + } } + + protected void initBounds() { + initState = true; + scrollPane.setBounds(20, 230, 210, 120); + scrollPane.setBounds(new Rectangle(CONTENT_MAX_XOFFSET, TEXT_MAX_YOFFSET, TEXT_MAX_WIDTH, TEXT_MAX_HEIGHT)); + } public void setCard(UUID cardId, Image image, List strings) { if (this.cardId == null || !this.cardId.equals(cardId)) { @@ -99,16 +111,13 @@ public class BigCard extends javax.swing.JPanel { graphics.drawImage(bigImage, 0, 0, this); super.paintComponent(graphics); } - - public void removeTextComponent() { - remove(this.scrollPane); - } - + public void hideTextComponent() { this.scrollPane.setVisible(false); } public void showTextComponent() { + if (!initState) {initBounds();} this.scrollPane.setVisible(true); } @@ -151,8 +160,6 @@ public class BigCard extends javax.swing.JPanel { scrollPane.setViewportView(text); add(scrollPane); - //scrollPane.setBounds(20, 230, 210, 120); - //scrollPane.setBounds(new Rectangle(CONTENT_MAX_XOFFSET, TEXT_MAX_YOFFSET, TEXT_MAX_WIDTH, TEXT_MAX_HEIGHT)); }// //GEN-END:initComponents diff --git a/Mage.Client/src/main/java/mage/client/cards/Cards.java b/Mage.Client/src/main/java/mage/client/cards/Cards.java index 7e01156c77f..aea8b213de2 100644 --- a/Mage.Client/src/main/java/mage/client/cards/Cards.java +++ b/Mage.Client/src/main/java/mage/client/cards/Cards.java @@ -36,20 +36,19 @@ package mage.client.cards; import java.awt.Component; import java.awt.Dimension; -import java.util.HashMap; import java.util.Iterator; +import java.util.LinkedHashMap; import java.util.Map; -import java.util.Map.Entry; import java.util.UUID; +import java.util.Map.Entry; import mage.cards.CardDimensions; import mage.cards.MageCard; -import mage.client.plugins.adapters.MageMouseAdapter; -import mage.client.plugins.adapters.MageMouseMotionAdapter; import mage.client.plugins.impl.Plugins; import mage.client.util.Config; import mage.view.CardView; import mage.view.CardsView; +import mage.view.StackAbilityView; /** * @@ -57,7 +56,7 @@ import mage.view.CardsView; */ public class Cards extends javax.swing.JPanel { - private Map cards = new HashMap(); + private Map cards = new LinkedHashMap(); /** Creates new form Cards */ public Cards() { @@ -73,13 +72,7 @@ public class Cards extends javax.swing.JPanel { public boolean loadCards(CardsView cardsView, BigCard bigCard, UUID gameId) { boolean changed = false; - for (CardView card: cardsView.values()) { - if (!cards.containsKey(card.getId())) { - addCard(card, bigCard, gameId); - changed = true; - } - cards.get(card.getId()).update(card); - } + for (Iterator> i = cards.entrySet().iterator(); i.hasNext();) { Entry entry = i.next(); if (!cardsView.containsKey(entry.getKey())) { @@ -89,6 +82,21 @@ public class Cards extends javax.swing.JPanel { } } + for (CardView card: cardsView.values()) { + if (card instanceof StackAbilityView) { + CardView tmp = ((StackAbilityView)card).getSourceCard(); + tmp.overrideRules(card.getRules()); + tmp.setIsAbility(true); + tmp.overrideTargets(card.getTargets()); + card = tmp; + } + if (!cards.containsKey(card.getId())) { + addCard(card, bigCard, gameId); + changed = true; + } + cards.get(card.getId()).update(card); + } + cardArea.setPreferredSize(new Dimension(cards.size() * Config.dimensions.frameWidth, Config.dimensions.frameHeight)); cardArea.revalidate(); cardArea.repaint(); diff --git a/Mage.Client/src/main/java/mage/client/game/AbilityPicker.java b/Mage.Client/src/main/java/mage/client/game/AbilityPicker.java index 552531ba3ba..d0c6ded36fa 100644 --- a/Mage.Client/src/main/java/mage/client/game/AbilityPicker.java +++ b/Mage.Client/src/main/java/mage/client/game/AbilityPicker.java @@ -60,6 +60,7 @@ public class AbilityPicker extends JPopupMenu implements PopupMenuListener { } public void show(AbilityPickerView choices, Point p) { + if (p == null) return; this.removeAll(); for (Entry choice: choices.getChoices().entrySet()) { this.add(new AbilityPickerAction(choice.getKey(), choice.getValue())); diff --git a/Mage.Client/src/main/java/mage/client/game/GamePanel.java b/Mage.Client/src/main/java/mage/client/game/GamePanel.java index 91b0a16c79c..16fc4b544aa 100644 --- a/Mage.Client/src/main/java/mage/client/game/GamePanel.java +++ b/Mage.Client/src/main/java/mage/client/game/GamePanel.java @@ -35,7 +35,6 @@ package mage.client.game; import java.awt.BorderLayout; -import java.awt.Color; import java.awt.GridBagConstraints; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; @@ -45,7 +44,6 @@ import java.util.UUID; import java.util.logging.Logger; import javax.swing.JComponent; -import javax.swing.JLabel; import javax.swing.JLayeredPane; import javax.swing.JOptionPane; import javax.swing.JPanel; diff --git a/Mage.Client/src/main/java/mage/client/plugins/adapters/MageActionCallback.java b/Mage.Client/src/main/java/mage/client/plugins/adapters/MageActionCallback.java index 013544bd225..6218124e183 100644 --- a/Mage.Client/src/main/java/mage/client/plugins/adapters/MageActionCallback.java +++ b/Mage.Client/src/main/java/mage/client/plugins/adapters/MageActionCallback.java @@ -11,6 +11,7 @@ import java.util.UUID; import javax.swing.Popup; import javax.swing.PopupFactory; +import javax.swing.SwingUtilities; import mage.cards.MageCard; import mage.cards.MagePermanent; @@ -70,26 +71,45 @@ public class MageActionCallback implements ActionCallback { // Draw Arrows for targets List targets = data.card.getTargets(); if (targets != null) { + Point parent = SwingUtilities.getRoot(data.component).getLocationOnScreen(); + Point me = new Point(data.locationOnScreen); + me.translate(-parent.x, -parent.y); for (UUID uuid : targets) { //System.out.println("Getting play area panel for uuid: " + uuid); PlayAreaPanel p = session.getGame().getPlayers().get(uuid); if (p != null) { Point target = p.getLocationOnScreen(); - Point me = data.locationOnScreen; + target.translate(-parent.x, -parent.y); ArrowBuilder.addArrow((int)me.getX() + 35, (int)me.getY(), (int)target.getX() + 40, (int)target.getY() - 40, Color.red); } else { for (PlayAreaPanel pa : session.getGame().getPlayers().values()) { MagePermanent permanent = pa.getBattlefieldPanel().getPermanents().get(uuid); if (permanent != null) { Point target = permanent.getLocationOnScreen(); - Point me = data.locationOnScreen; + target.translate(-parent.x, -parent.y); ArrowBuilder.addArrow((int)me.getX() + 35, (int)me.getY(), (int)target.getX() + 40, (int)target.getY() + 10, Color.red); } } } } } + + // Draw Arrows for source + if (data.card.isAbility()) { + Point parent = SwingUtilities.getRoot(data.component).getLocationOnScreen(); + Point me = new Point(data.locationOnScreen); + me.translate(-parent.x, -parent.y); + UUID uuid = data.card.getId(); + for (PlayAreaPanel pa : session.getGame().getPlayers().values()) { + MagePermanent permanent = pa.getBattlefieldPanel().getPermanents().get(uuid); + if (permanent != null) { + Point source = permanent.getLocationOnScreen(); + source.translate(-parent.x, -parent.y); + ArrowBuilder.addArrow((int)source.getX() + 40, (int)source.getY() + 10, (int)me.getX() + 35, (int)me.getY() + 20, Color.blue); + } + } + } } @Override @@ -99,13 +119,18 @@ public class MageActionCallback implements ActionCallback { MageCard card = (MageCard) data.component; if (card.getOriginal().getId() != bigCard.getCardId()) { - synchronized (MageMouseAdapter.class) { + synchronized (MageActionCallback.class) { if (card.getOriginal().getId() != bigCard.getCardId()) { Image image = card.getImage(); if (image != null && image instanceof BufferedImage) { image = ImageHelper.getResizedImage((BufferedImage) image, bigCard.getWidth(), bigCard.getHeight()); bigCard.setCard(card.getOriginal().getId(), image, card.getOriginal().getRules()); - bigCard.hideTextComponent(); + bigCard.showTextComponent(); + if (card.getOriginal().isAbility()) { + bigCard.showTextComponent(); + } else { + bigCard.hideTextComponent(); + }; } else { JXPanel panel = GuiDisplayUtil.getDescription(card.getOriginal(), bigCard.getWidth(), bigCard.getHeight()); panel.setVisible(true); diff --git a/Mage.Client/src/main/java/mage/client/plugins/adapters/MageMouseAdapter.java b/Mage.Client/src/main/java/mage/client/plugins/adapters/MageMouseAdapter.java deleted file mode 100644 index 6efe3aea921..00000000000 --- a/Mage.Client/src/main/java/mage/client/plugins/adapters/MageMouseAdapter.java +++ /dev/null @@ -1,47 +0,0 @@ -package mage.client.plugins.adapters; - -import java.awt.Component; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.util.UUID; - -import mage.cards.MageCard; -import mage.client.MageFrame; -import mage.client.plugins.impl.Plugins; -import mage.client.util.DefaultActionCallback; - -public class MageMouseAdapter extends MouseAdapter { - - private Component parent; - private UUID gameId; - protected static DefaultActionCallback defaultCallback = DefaultActionCallback.getInstance(); - - public MageMouseAdapter(Component parent, UUID gameId) { - this.parent = parent; - this.gameId = gameId; - } - - @Override - public void mousePressed(MouseEvent e) { - if (!Plugins.getInstance().isCardPluginLoaded()) - return; - if (e.getButton() == MouseEvent.BUTTON1) { - int count = e.getClickCount(); - if (count > 0) { - Object o = parent.getComponentAt(e.getPoint()); - if (o instanceof MageCard) { - MageCard selectedCard = (MageCard) o; - // TODO: uncomment when attached cards works in plugin - /* - * int x = e.getX() - selectedCard.getX(); int y = e.getY() - * - selectedCard.getY(); CardView card = - * selectedCard.getCardByPosition(x, y); - */ - defaultCallback.mouseClicked(e, gameId, MageFrame.getSession(), selectedCard.getOriginal()); - } - } - } - } - - -} diff --git a/Mage.Client/src/main/java/mage/client/plugins/adapters/MageMouseMotionAdapter.java b/Mage.Client/src/main/java/mage/client/plugins/adapters/MageMouseMotionAdapter.java deleted file mode 100644 index 12e21da5890..00000000000 --- a/Mage.Client/src/main/java/mage/client/plugins/adapters/MageMouseMotionAdapter.java +++ /dev/null @@ -1,53 +0,0 @@ -package mage.client.plugins.adapters; - -import java.awt.Component; -import java.awt.Image; -import java.awt.event.MouseEvent; -import java.awt.event.MouseMotionAdapter; -import java.awt.image.BufferedImage; - -import mage.cards.MageCard; -import mage.client.cards.BigCard; -import mage.client.plugins.impl.Plugins; -import mage.client.util.ImageHelper; -import mage.client.util.gui.GuiDisplayUtil; - -import org.jdesktop.swingx.JXPanel; - -public class MageMouseMotionAdapter extends MouseMotionAdapter { - - private Component parent; - private BigCard bigCard; - - public MageMouseMotionAdapter(Component parent, BigCard bigCard) { - this.parent = parent; - this.bigCard = bigCard; - } - - @Override - public void mouseMoved(MouseEvent e) { - if (!Plugins.getInstance().isCardPluginLoaded()) {return;} - if (bigCard == null) {return;} - Object o = parent.getComponentAt(e.getPoint()); - if (o instanceof MageCard) { - MageCard card = (MageCard) o; - if (card.getOriginal().getId() != bigCard.getCardId()) { - synchronized (MageMouseAdapter.class) { - if (card.getOriginal().getId() != bigCard.getCardId()) { - Image image = card.getImage(); - if (image != null && image instanceof BufferedImage) { - image = ImageHelper.getResizedImage((BufferedImage) image, bigCard.getWidth(), bigCard.getHeight()); - bigCard.setCard(card.getOriginal().getId(), image, card.getOriginal().getRules()); - bigCard.hideTextComponent(); - } else { - JXPanel panel = GuiDisplayUtil.getDescription(card.getOriginal(), bigCard.getWidth(), bigCard.getHeight()); - panel.setVisible(true); - bigCard.hideTextComponent(); - bigCard.addJXPanel(card.getOriginal().getId(), panel); - } - } - } - } - } - } -} diff --git a/Mage.Common/src/mage/view/CardView.java b/Mage.Common/src/mage/view/CardView.java index f7124983e41..3303db306f9 100644 --- a/Mage.Common/src/mage/view/CardView.java +++ b/Mage.Common/src/mage/view/CardView.java @@ -36,11 +36,13 @@ import java.util.UUID; import mage.ObjectColor; import mage.Constants.CardType; import mage.Constants.Rarity; +import mage.abilities.Ability; import mage.cards.Card; import mage.game.permanent.Permanent; import mage.game.permanent.PermanentToken; import mage.game.permanent.token.Token; import mage.game.stack.Spell; +import mage.game.stack.StackObject; import mage.target.Target; import mage.target.Targets; @@ -65,6 +67,7 @@ public class CardView implements Serializable { protected Rarity rarity; protected String expansionSetCode; protected int cardNumber; + protected boolean isAbility; public List targets; @@ -101,15 +104,7 @@ public class CardView implements Serializable { if (card instanceof Spell) { Spell spell = (Spell)card; if (spell.getSpellAbility().getTargets().size() > 0) { - Targets targets = spell.getSpellAbility().getTargets(); - for (Target target : targets) { - if (target.isChosen()) { - for (UUID targetUUID : target.getTargets()) { - if (this.targets == null) this.targets = new ArrayList(); - this.targets.add(targetUUID); - } - } - } + setTargets(spell.getSpellAbility().getTargets()); } } } @@ -135,6 +130,17 @@ public class CardView implements Serializable { this.expansionSetCode = ""; } + protected void setTargets(Targets targets) { + for (Target target : targets) { + if (target.isChosen()) { + for (UUID targetUUID : target.getTargets()) { + if (this.targets == null) this.targets = new ArrayList(); + this.targets.add(targetUUID); + } + } + } + } + protected List formatRules(List rules) { List newRules = new ArrayList(); for (String rule: rules) { @@ -156,7 +162,19 @@ public class CardView implements Serializable { public List getRules() { return rules; } + + public void overrideRules(List rules) { + this.rules = rules; + } + public void setIsAbility(boolean isAbility) { + this.isAbility = isAbility; + } + + public boolean isAbility() { + return isAbility; + } + public String getPower() { return power; } @@ -218,6 +236,10 @@ public class CardView implements Serializable { return targets; } + public void overrideTargets(List newTargets) { + this.targets = newTargets; + } + @Override public String toString() { return getName() + " [" + getId() + "]"; diff --git a/Mage.Common/src/mage/view/GameView.java b/Mage.Common/src/mage/view/GameView.java index 4672c57848b..91ab585195d 100644 --- a/Mage.Common/src/mage/view/GameView.java +++ b/Mage.Common/src/mage/view/GameView.java @@ -31,9 +31,11 @@ package mage.view; import java.io.Serializable; import java.util.ArrayList; import java.util.List; + +import mage.MageObject; import mage.Constants.PhaseStep; import mage.Constants.TurnPhase; -import mage.MageObject; +import mage.cards.Card; import mage.game.ExileZone; import mage.game.Game; import mage.game.GameState; @@ -68,10 +70,11 @@ public class GameView implements Serializable { for (StackObject stackObject: state.getStack()) { if (stackObject instanceof StackAbility) { MageObject object = game.getObject(stackObject.getSourceId()); + Card card = game.getCard(stackObject.getSourceId()); if (object != null) - stack.put(stackObject.getId(), new StackAbilityView((StackAbility)stackObject, object.getName())); + stack.put(stackObject.getId(), new StackAbilityView((StackAbility)stackObject, object.getName(), new CardView(card))); else - stack.put(stackObject.getId(), new StackAbilityView((StackAbility)stackObject, "")); + stack.put(stackObject.getId(), new StackAbilityView((StackAbility)stackObject, "", new CardView(card))); } else { stack.put(stackObject.getId(), new CardView((Spell)stackObject)); diff --git a/Mage.Common/src/mage/view/StackAbilityView.java b/Mage.Common/src/mage/view/StackAbilityView.java index a824f5fd98f..5beaed5077a 100644 --- a/Mage.Common/src/mage/view/StackAbilityView.java +++ b/Mage.Common/src/mage/view/StackAbilityView.java @@ -29,6 +29,7 @@ package mage.view; import java.util.ArrayList; + import mage.game.stack.StackAbility; /** @@ -38,11 +39,13 @@ import mage.game.stack.StackAbility; public class StackAbilityView extends CardView { private String sourceName; + private CardView sourceCard; - public StackAbilityView(StackAbility ability, String sourceName) { + public StackAbilityView(StackAbility ability, String sourceName, CardView sourceCard) { this.id = ability.getId(); this.name = "Ability"; this.sourceName = sourceName; + this.sourceCard = sourceCard; this.rules = new ArrayList(); rules.add(formatRule(ability.getRule())); this.power = ability.getPower().toString(); @@ -54,6 +57,7 @@ public class StackAbilityView extends CardView { this.color = ability.getColor(); this.manaCost = ability.getManaCost().getSymbols(); this.art = ""; + setTargets(ability.getTargets()); } @Override @@ -62,5 +66,8 @@ public class StackAbilityView extends CardView { newRule.replace("{source}", this.sourceName); return newRule; } - + + public CardView getSourceCard() { + return this.sourceCard; + } }