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