diff --git a/Mage.Client/src/main/java/mage/client/MageFrame.java b/Mage.Client/src/main/java/mage/client/MageFrame.java index 2343989dcad..4f28c5e4b71 100644 --- a/Mage.Client/src/main/java/mage/client/MageFrame.java +++ b/Mage.Client/src/main/java/mage/client/MageFrame.java @@ -42,6 +42,7 @@ import mage.client.components.MageComponents; import mage.client.components.MageJDesktop; import mage.client.components.MageRoundPane; import mage.client.components.MageUI; +import mage.client.components.ext.dlg.DialogManager; import mage.client.constants.Constants.DeckEditorMode; import mage.client.deckeditor.DeckEditorPane; import mage.client.deckeditor.collection.viewer.CollectionViewerPane; @@ -183,6 +184,10 @@ public class MageFrame extends javax.swing.JFrame implements MageClient { initComponents(); setSize(1024, 768); SettingsManager.getInstance().setScreenWidthAndHeight(1024, 768); + DialogManager.getManager().setScreenWidth(1024); + DialogManager.getManager().setScreenHeight(768); + DialogManager.getManager().setBounds(0, 0, 1024, 768); + DialogManager.getManager().setVisible(false); this.setExtendedState(JFrame.MAXIMIZED_BOTH); session = new SessionImpl(this); 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 035951f573a..b63608b8c43 100644 --- a/Mage.Client/src/main/java/mage/client/cards/Cards.java +++ b/Mage.Client/src/main/java/mage/client/cards/Cards.java @@ -42,11 +42,8 @@ import mage.view.*; import javax.swing.border.Border; import java.awt.*; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.Map; +import java.util.*; import java.util.Map.Entry; -import java.util.UUID; /** * @@ -122,8 +119,13 @@ public class Cards extends javax.swing.JPanel { changed = true; } } - - for (CardView card: cardsView.values()) { + + java.util.List orderedList = new ArrayList(); + for (CardView card: cardsView.values()) { + orderedList.add(0, card); + } + + for (CardView card: orderedList) { if (dontDisplayTapped) { if (card instanceof PermanentView) { ((PermanentView)card).overrideTapped(false); diff --git a/Mage.Client/src/main/java/mage/client/components/ext/MageFloatPane.java b/Mage.Client/src/main/java/mage/client/components/ext/MageFloatPane.java new file mode 100644 index 00000000000..b076702f251 --- /dev/null +++ b/Mage.Client/src/main/java/mage/client/components/ext/MageFloatPane.java @@ -0,0 +1,31 @@ +package mage.client.components.ext; + +import org.mage.card.arcane.UI; + +import javax.swing.*; +import java.awt.*; + +/** + * @author noxx + */ +public class MageFloatPane extends JEditorPane { + + public MageFloatPane() { + UI.setHTMLEditorKit(this); + setEditable(false); + setBackground(Color.white); + JButton jb = new JButton("Done"); + jb.setLocation(50, 50); + jb.setSize(100, 50); + add(jb); + } + + public void setCard(final String text) { + SwingUtilities.invokeLater(new Runnable() { + public void run() { + setText(text); + setCaretPosition(0); + } + }); + } +} \ No newline at end of file diff --git a/Mage.Client/src/main/java/mage/client/components/ext/MessageDlg.java b/Mage.Client/src/main/java/mage/client/components/ext/MessageDlg.java new file mode 100644 index 00000000000..a09b8ca7962 --- /dev/null +++ b/Mage.Client/src/main/java/mage/client/components/ext/MessageDlg.java @@ -0,0 +1,13 @@ +package mage.client.components.ext; + +/** + * @author mw, noxx + */ +public class MessageDlg { + + MessageDlg() {} + + public enum Types { + Info, Warning, Error, FlashInfo + } +} \ No newline at end of file diff --git a/Mage.Client/src/main/java/mage/client/components/ext/TestMageFloatPane.java b/Mage.Client/src/main/java/mage/client/components/ext/TestMageFloatPane.java new file mode 100644 index 00000000000..a8a684bc59b --- /dev/null +++ b/Mage.Client/src/main/java/mage/client/components/ext/TestMageFloatPane.java @@ -0,0 +1,36 @@ +package mage.client.components.ext; + +import mage.client.components.MageRoundPane; + +import javax.swing.*; + +/** + * @author ayratn + */ +public class TestMageFloatPane { + + public static void main(String... args) { + JFrame f = new JFrame(); + + f.setSize(600, 400); + f.setVisible(true); + + MageFloatPane fp = new MageFloatPane(); + fp.setCard("Card"); + + MageRoundPane popupContainer = new MageRoundPane(); + popupContainer.setLayout(null); + + popupContainer.add(fp); + //popupContainer.setVisible(false); + popupContainer.setBounds(0, 0, 320 + 80, 201 + 80); + + + JDialog floatOnParent = new JDialog(f, false); + floatOnParent.setUndecorated(true); + floatOnParent.getContentPane().add(popupContainer); + + floatOnParent.setBounds(300, 100, 300, 200); + floatOnParent.setVisible(true); + } +} diff --git a/Mage.Client/src/main/java/mage/client/components/ext/dlg/DialogContainer.java b/Mage.Client/src/main/java/mage/client/components/ext/dlg/DialogContainer.java new file mode 100644 index 00000000000..0dbb7142b03 --- /dev/null +++ b/Mage.Client/src/main/java/mage/client/components/ext/dlg/DialogContainer.java @@ -0,0 +1,217 @@ +package mage.client.components.ext.dlg; + +import mage.client.components.ext.MessageDlg; +import mage.client.components.ext.dlg.impl.StackDialog; + +import javax.swing.*; +import java.awt.*; +import java.awt.geom.RoundRectangle2D; +import java.awt.image.BufferedImage; + +/** + * @author mw, noxx + */ +public class DialogContainer extends JPanel { + + private static int X_OFFSET = 30; + private static int Y_OFFSET = 30; + private BufferedImage shadow = null; + //private DialogManager.MTGDialogs dialogType; + //private DlgParams params; + private Color backgroundColor = new Color(0, 255, 255, 60); + private int alpha = 50; + + private boolean isGradient = false; + private TexturePaint tp = null; + private Image gradient = null; + private BufferedImage b; + + private boolean drawContainer = true; + private DialogManager.MTGDialogs dialogType; + + public DialogContainer(DialogManager.MTGDialogs dialogType, DlgParams params) { + setOpaque(false); + this.dialogType = dialogType; + + setLayout(null); + drawContainer = true; + + if (dialogType == DialogManager.MTGDialogs.MessageDialog) { + //backgroundColor = new Color(0, 255, 255, 60); + if (params.type.equals(MessageDlg.Types.Warning)) { + backgroundColor = new Color(255, 0, 0, 90); + } else { + backgroundColor = new Color(0, 0, 0, 90); + } + alpha = 0; + //MessageDlg dlg = new MessageDlg(params); + //add(dlg); + //dlg.setLocation(X_OFFSET + 10, Y_OFFSET); + //dlg.updateSize(params.rect.width, params.rect.height); + } else if (dialogType == DialogManager.MTGDialogs.StackDialog) { + //backgroundColor = new Color(0, 255, 255, 60); + backgroundColor = new Color(0, 0, 0, 50); + alpha = 0; + StackDialog dlg = new StackDialog(params); + add(dlg); + dlg.setLocation(X_OFFSET + 10, Y_OFFSET + 10); + //int width = Math.min(params.rect.width - 80, 600); + int width = params.rect.width; + int height = params.rect.height - 80; + dlg.updateSize(width, height); + } + /* + else if (dialogType == DialogManager.MTGDialogs.CombatDialog) { + backgroundColor = new Color(0, 0, 0, 60); + alpha = 0; + CombatDialog dlg = new CombatDialog(params); + add(dlg); + dlg.setLocation(X_OFFSET + 10, Y_OFFSET + 10); + dlg.updateSize(params.rect.width - 80, params.rect.height - 80); + + } else if (dialogType == DialogManager.MTGDialogs.ChoiceDialog) { + + //backgroundColor = new Color(200, 200, 172, 120); + //backgroundColor = new Color(180, 150, 200, 120); + //backgroundColor = new Color(0, 255, 0, 60); + + //latest: + backgroundColor = new Color(139, 46, 173, 20); + //backgroundColor = new Color(139, 46, 173, 0); + + alpha = 0; + ChoiceDialog dlg = new ChoiceDialog(params); + add(dlg); + GameManager.getManager().setCurrentChoiceDlg(dlg); + dlg.setLocation(X_OFFSET + 10, Y_OFFSET + 10); + dlg.updateSize(params.rect.width - 80, params.rect.height - 80); + + } else if (dialogType == DialogManager.MTGDialogs.GraveDialog) { + backgroundColor = new Color(20, 20, 20, 120); + alpha = 0; + GraveDialog dlg = new GraveDialog(params); + add(dlg); + dlg.setLocation(X_OFFSET + 10, Y_OFFSET + 10); + dlg.updateSize(params.rect.width - 80, params.rect.height - 80); + + } else if (dialogType == DialogManager.MTGDialogs.RevealDialog) { + backgroundColor = new Color(90, 135, 190, 80); + alpha = 0; + RevealDialog dlg = new RevealDialog(params); + add(dlg); + dlg.setLocation(X_OFFSET + 10, Y_OFFSET + 10); + dlg.updateSize(params.rect.width - 80, params.rect.height - 80); + + } else if (dialogType == DialogManager.MTGDialogs.AssignDamageDialog) { + backgroundColor = new Color(255, 255, 255, 130); + alpha = 0; + AssignDamageDialog dlg = new AssignDamageDialog(params); + add(dlg); + dlg.setLocation(X_OFFSET + 10, Y_OFFSET + 10); + dlg.updateSize(params.rect.width - 80, params.rect.height - 80); + } else if (dialogType == DialogManager.MTGDialogs.ManaChoiceDialog) { + backgroundColor = new Color(0, 255, 255, 60); + alpha = 20; + ManaChoiceDialog dlg = new ManaChoiceDialog(params); + add(dlg); + dlg.setLocation(X_OFFSET + 10, Y_OFFSET + 10); + dlg.updateSize(params.rect.width - 80, params.rect.height - 80); + + //isGradient = true; + gradient = ImageManager.getGradientImage(); + if (gradient != null) { + b = ImageToBufferedImage.toBufferedImage(gradient); + b = Transparency.makeImageTranslucent(b, 0.35); + Rectangle2D tr = new Rectangle2D.Double(0, 0, params.rect.width, params.rect.height); + //gradient = gradient.getScaledInstance(w, h, Image.SCALE_SMOOTH); + tp = new TexturePaint(b, tr); + } + } else if (dialogType == DialogManager.MTGDialogs.ChooseDeckDialog) { + MWDeckPanel deckPanel = new MWDeckPanel(params.getDeckList(), params.isAI); + deckPanel.setVisible(true); + deckPanel.setBounds(0,0,480,320); + add(deckPanel); + drawContainer = false; + } else if (dialogType == DialogManager.MTGDialogs.ChooseCommonDialog) { + MWChoosePanel choosePanel = new MWChoosePanel(params.getObjectList(), params.getTitle()); + choosePanel.setVisible(true); + choosePanel.setBounds(0,0,440,240); + add(choosePanel); + drawContainer = false; + } else if (dialogType == DialogManager.MTGDialogs.AboutDialog) { + backgroundColor = new Color(255, 255, 255, 120); + alpha = 0; + AboutDialog dlg = new AboutDialog(); + add(dlg); + dlg.setLocation(X_OFFSET + 10, Y_OFFSET + 10); + } + */ + } + + @Override + protected void paintComponent(Graphics g) { + + if (!drawContainer) { + return; + } + + int x = X_OFFSET; + int y = Y_OFFSET; + int w = getWidth() - 2 * X_OFFSET; + int h = getHeight() - 2 * Y_OFFSET; + int arc = 30; + + Graphics2D g2 = (Graphics2D) g.create(); + g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + + if (shadow != null) { + int xOffset = (shadow.getWidth() - w) / 2; + int yOffset = (shadow.getHeight() - h) / 2; + g2.drawImage(shadow, x - xOffset, y - yOffset, null); + } + + // //////////////////////////////////////////////////////////////// + // fill content + + /** + * Add white translucent substrate + */ + if (alpha != 0) { + g2.setColor(new Color(255, 255, 255, alpha)); + g2.fillRoundRect(x, y, w, h, arc, arc); + } + + if (!isGradient) { + g2.setColor(backgroundColor); + g2.fillRoundRect(x, y, w, h, arc, arc); + } else { + RoundRectangle2D r = new RoundRectangle2D.Float(x, y, w, h, arc, arc); + g2.setPaint(tp); + g2.fill(r); + } + // //////////////////////////////////////////////////////////////// + + // //////////////////////////////////////////////////////////////// + // draw border + g2.setStroke(new BasicStroke(3f)); + g2.setColor(Color.BLACK); + //g2.setColor(Color.GRAY); + g2.drawRoundRect(x, y, w, h, arc, arc); + // //////////////////////////////////////////////////////////////// + + g2.dispose(); + } + + public void showDialog(boolean bShow) { + setVisible(bShow); + } + + public DialogManager.MTGDialogs getType() { + return this.dialogType; + } + + /** + * Default UID. + */ + private static final long serialVersionUID = 1L; +} diff --git a/Mage.Client/src/main/java/mage/client/components/ext/dlg/DialogManager.java b/Mage.Client/src/main/java/mage/client/components/ext/dlg/DialogManager.java new file mode 100644 index 00000000000..a6ec6855493 --- /dev/null +++ b/Mage.Client/src/main/java/mage/client/components/ext/dlg/DialogManager.java @@ -0,0 +1,230 @@ +package mage.client.components.ext.dlg; + +import mage.client.cards.BigCard; +import mage.client.game.FeedbackPanel; +import mage.view.CardsView; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.awt.event.MouseMotionListener; +import java.awt.event.MouseWheelEvent; +import java.util.UUID; + +/** + * @author mw, noxx + */ +public class DialogManager extends JComponent implements MouseListener, + MouseMotionListener { + + private static DialogManager dialogManager = null; + //private static final Logger log = Logger.getLogger(DialogManager.class); + + public static DialogManager getManager() { + if (dialogManager == null) { + dialogManager = new DialogManager(); + dialogManager.setVisible(true); + } + return dialogManager; + } + + public enum MTGDialogs { + none, AboutDialog, MessageDialog, StackDialog, AssignDamageDialog, ManaChoiceDialog, ChoiceDialog, GraveDialog, DialogContainer, CombatDialog, + ChooseDeckDialog, ChooseCommonDialog, RevealDialog + } + + private MTGDialogs currentDialog = MTGDialogs.none; + + private DialogContainer dialogContainer = null; + + private int screen_width = 0; + private int screen_height = 0; + + // /////////////////////////////// *** for drag and drop *** + // ///////////////////////////////// + private boolean bDragged = false; + private int dx, dy; + private int mx, my; + private Rectangle rec, oldRec; + private JComponent j; + + public DialogManager() { + addMouseListener(this); + addMouseMotionListener(this); + //addMouseWheelListener(this); + } + + public void setScreenWidth(int screen_width) { + this.screen_width = screen_width; + } + + public void setScreenHeight(int screen_height) { + this.screen_height = screen_height; + } + + public void showStackDialog(CardsView cards, BigCard bigCard, FeedbackPanel feedbackPanel, UUID gameId) { + + int w = (int) (screen_width * 0.7); + //int h = (int) (screen_height * 0.5); + int h = 360; + + /*if (h < 200) { + h = 200; + }*/ + + if (w > 800) { + w = 800; + } + + int height = getHeight(); + int width = getWidth(); + + int x = ((width - w) / 2); + int y = ((height - h) / 2); + + DlgParams params = new DlgParams(); + params.rect = new Rectangle(x, y, w, h); + params.bigCard = bigCard; + params.gameId = gameId; + params.feedbackPanel = feedbackPanel; + params.setCards(cards); + dialogContainer = new DialogContainer(MTGDialogs.StackDialog, params); + dialogContainer.setVisible(true); + add(dialogContainer); + + this.currentDialog = MTGDialogs.DialogContainer; + + setDlgBounds(new Rectangle(x, y, w, h)); + + dialogContainer.showDialog(true); + + setVisible(true); + } + + public void setDlgBounds(Rectangle r) { + if (currentDialog == MTGDialogs.DialogContainer) { + dialogContainer.setBounds(r.x, r.y, r.width, r.height); + } + } + + public void fadeOut() { + + if (dialogContainer != null) { + dialogContainer.showDialog(false); + removeAll(); + } + + this.currentDialog = MTGDialogs.none; + + setVisible(false); + + repaint(); + } + + public void fadeOut(DialogContainer dc) { + //log.debug("start:fadeOut:"+dc.toString()); + + dc.showDialog(false); + remove(dc); + + Component[] components = getComponents(); + boolean bFound = false; + for (int i = 0; i < components.length; i++) { + if (components[i] instanceof DialogContainer) { + bFound = true; + } + } + + if (!bFound) { + setVisible(false); + } + + //revalidate(); + validate(); + } + + public void mouseDragged(MouseEvent e) { + if (bDragged == true) { + dx = e.getX() - mx; + dy = e.getY() - my; + + rec.x += dx; + rec.y += dy; + mx = e.getX(); + my = e.getY(); + if (oldRec == null) { + oldRec = new Rectangle(rec); + } + int i = Math.abs(oldRec.x - rec.x) + Math.abs(oldRec.y - rec.y); + if (i > 3) { + oldRec = new Rectangle(rec); + j.setBounds(oldRec); + } + } + } + + public void mouseMoved(MouseEvent e) { + } + + public void mouseClicked(MouseEvent e) { + } + + public void mouseEntered(MouseEvent e) { + } + + public void mouseExited(MouseEvent e) { + } + + public void mousePressed(MouseEvent e) { + if (e.getButton() == MouseEvent.BUTTON1) { + j = (JComponent) getComponentAt(e.getX(), e.getY()); + + if (j != null && j instanceof DialogContainer) { + rec = j.getBounds(); + bDragged = true; + mx = e.getX(); + my = e.getY(); + } + } + } + + public void mouseReleased(MouseEvent e) { + bDragged = false; + if (j instanceof DialogManager) { + return; + } + + if (j != null && rec != null) { + j.setBounds(rec); + } + oldRec = null; + if (rec == null) + return; + if (rec.x < 0) { + rec.x = 0; + if (j != null) + j.setBounds(rec); + } + if (rec.y < 0) { + rec.y = 0; + if (j != null) + j.setBounds(rec); + } + j = null; + } + + public void mouseWheelMoved(MouseWheelEvent e) { + int notches = e.getWheelRotation(); + System.out.println("outx:"+notches); + if (currentDialog != null && currentDialog.equals(MTGDialogs.ChooseCommonDialog)) { + System.out.println("out:"+1); + } + } + + /** + * Default UID. + */ + private static final long serialVersionUID = 1L; + +} diff --git a/Mage.Client/src/main/java/mage/client/components/ext/dlg/DlgParams.java b/Mage.Client/src/main/java/mage/client/components/ext/dlg/DlgParams.java new file mode 100644 index 00000000000..781c2bc3a1d --- /dev/null +++ b/Mage.Client/src/main/java/mage/client/components/ext/dlg/DlgParams.java @@ -0,0 +1,148 @@ +package mage.client.components.ext.dlg; + +import mage.client.cards.BigCard; +import mage.client.components.ext.MessageDlg; +import mage.client.game.FeedbackPanel; +import mage.view.CardsView; + +import java.awt.*; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.UUID; + +/** + * Class is used to save parameters and to send them to dialog. + * + * @author mw, noxx + */ +public class DlgParams { + + public Rectangle rect; + public MessageDlg.Types type; + public BigCard bigCard; + public FeedbackPanel feedbackPanel; + public UUID gameId; + + private int playerID; + + private CardsView cards; + private ArrayList stringList; + //private ArrayList deckList; + private ArrayList objectList; + + private String title; + private int opponentID; + boolean isOptional = false; + boolean isChooseAbility = false; + boolean isCancelStopsPlaying = true; + + boolean isAI = false; + + public HashSet manaChoices = new HashSet(); + + public int getPlayerID() { + return playerID; + } + + public void setPlayerID(int playerID) { + this.playerID = playerID; + } + + public int getOpponentID() { + return opponentID; + } + + public void setOpponentID(int opponentID) { + this.opponentID = opponentID; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + private String message; + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public HashSet getManaChoices() { + return manaChoices; + } + + public void setManaChoices(HashSet manaChoices) { + this.manaChoices = manaChoices; + } + + public boolean isOptional() { + return isOptional; + } + + public void setOptional(boolean isOptional) { + this.isOptional = isOptional; + } + + public boolean isChooseAbility() { + return isChooseAbility; + } + + public void setChooseAbility(boolean isChooseAbility) { + this.isChooseAbility = isChooseAbility; + } + + public ArrayList getStringList() { + return stringList; + } + + public void setStringList(ArrayList stringList) { + this.stringList = stringList; + } + + /*public ArrayList getDeckList() { + return deckList; + } + + public void setDeckList(ArrayList deckList) { + this.deckList = deckList; + }*/ + + public ArrayList getObjectList() { + return objectList; + } + + public void setObjectList(ArrayList objectList) { + this.objectList = objectList; + } + + public boolean isAI() { + return isAI; + } + + public void setAI(boolean isAI) { + this.isAI = isAI; + } + + public boolean isCancelStopsPlaying() { + return isCancelStopsPlaying; + } + + public void setCancelStopsPlaying(boolean isCancelStopsPlaying) { + this.isCancelStopsPlaying = isCancelStopsPlaying; + } + + public CardsView getCards() { + return cards; + } + + public void setCards(CardsView cards) { + this.cards = cards; + } +} \ No newline at end of file diff --git a/Mage.Client/src/main/java/mage/client/components/ext/dlg/IDialogPanel.java b/Mage.Client/src/main/java/mage/client/components/ext/dlg/IDialogPanel.java new file mode 100644 index 00000000000..fd5fa4291f7 --- /dev/null +++ b/Mage.Client/src/main/java/mage/client/components/ext/dlg/IDialogPanel.java @@ -0,0 +1,74 @@ +package mage.client.components.ext.dlg; + +import mage.client.components.ImageButton; +import org.jdesktop.swingx.JXPanel; + +import javax.swing.*; +import java.awt.*; + +/** + * @author mw, noxx + */ +abstract public class IDialogPanel extends JXPanel { + + private DlgParams params; + + public DlgParams getDlgParams() { + return params; + } + + public void setDlgParams(DlgParams params) { + this.params = params; + } + + public IDialogPanel(DlgParams params) { + super(); + this.params = params; + } + + protected void updateSize(int newWidth, int newHeight) { + + Rectangle r0 = getBounds(); + + r0.width = newWidth; + r0.height = newHeight; + + setBounds(r0); + } + + /** + * Make inner component transparent. + */ + protected void makeTransparent() { + + setOpaque(false); + + for (int i = 0; i < getComponentCount(); i++) { + Component c = getComponent(i); + if (c instanceof AbstractButton && !(c instanceof JButton)) { + ((AbstractButton) c).setContentAreaFilled(false); + } else if (c instanceof ImageButton) { + ((AbstractButton) c).setContentAreaFilled(false); + } + } + } + + protected void makeTransparent(JLayeredPane jLayeredPane) { + + setOpaque(false); + + for (int i = 0; i < getComponentCount(); i++) { + Component c = jLayeredPane.getComponent(i); + if (c instanceof AbstractButton && !(c instanceof JButton)) { + ((AbstractButton) c).setContentAreaFilled(false); + } else if (c instanceof ImageButton) { + ((AbstractButton) c).setContentAreaFilled(false); + } + } + } + + /** + * Default UID. + */ + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/Mage.Client/src/main/java/mage/client/components/ext/dlg/impl/StackDialog.java b/Mage.Client/src/main/java/mage/client/components/ext/dlg/impl/StackDialog.java new file mode 100644 index 00000000000..93cbd3be52f --- /dev/null +++ b/Mage.Client/src/main/java/mage/client/components/ext/dlg/impl/StackDialog.java @@ -0,0 +1,188 @@ +package mage.client.components.ext.dlg.impl; + +import mage.cards.MageCard; +import mage.client.cards.BigCard; +import mage.client.components.HoverButton; +import mage.client.components.ext.dlg.DialogContainer; +import mage.client.components.ext.dlg.DialogManager; +import mage.client.components.ext.dlg.DlgParams; +import mage.client.components.ext.dlg.IDialogPanel; +import mage.client.game.FeedbackPanel; +import mage.client.plugins.impl.Plugins; +import mage.client.util.Command; +import mage.client.util.Config; +import mage.client.util.SettingsManager; +import mage.view.CardView; +import mage.view.CardsView; +import mage.view.StackAbilityView; +import org.mage.plugins.card.utils.impl.ImageManagerImpl; + +import javax.swing.*; +import java.awt.*; +import java.util.UUID; + +/** + * @author mw, noxx + */ +public class StackDialog extends IDialogPanel { + + private static final long serialVersionUID = 1L; + private JLabel jTitle = null; + private JLabel jTitle2 = null; + private HoverButton jButtonAccept = null; + private HoverButton jButtonResponse = null; + + private JLayeredPane jLayeredPane; + private FeedbackPanel feedbackPanel; + + private class CustomLabel extends JLabel { + + @Override + public void paintComponent(Graphics g) { + Graphics2D g2D = (Graphics2D)g; + g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, + RenderingHints.VALUE_ANTIALIAS_ON); + + g2D.setColor(Color.black); + g2D.drawString(getText(), 1, 11); + g2D.setColor(Color.white); + g2D.drawString(getText(), 0, 10); + } + + private static final long serialVersionUID = 1L; + }; + + /** + * This is the default constructor + */ + public StackDialog(DlgParams params) { + super(params); + this.feedbackPanel = params.feedbackPanel; + initialize(); + displayStack(params.getCards(), params.gameId, params.bigCard); + } + + /** + * This method initializes this + * + * @return void + */ + private void initialize() { + + int w = getDlgParams().rect.width; + int h = getDlgParams().rect.height; + + jLayeredPane = new JLayeredPane(); + add(jLayeredPane); + jLayeredPane.setSize(w, h); + jLayeredPane.setVisible(true); + jLayeredPane.setOpaque(false); + + jTitle = new CustomLabel(); + jTitle.setBounds(new Rectangle(5, 3, w, 16)); + jTitle.setFont(new Font("Dialog", Font.BOLD, 14)); + jTitle.setText("Current stack: "); + + /*jTitle2 = new CustomLabel(); + jTitle2.setBounds(new Rectangle(5, 5 + SettingsManager.getInstance().getCardSize().height + 30, 129, 20)); + jTitle2.setFont(new Font("Dialog", Font.BOLD, 14)); + jTitle2.setText("Spell targets:");*/ + + this.setLayout(null); + jLayeredPane.setLayout(null); + + jLayeredPane.add(jTitle, null); + //jLayeredPane.add(jTitle2, null); + jLayeredPane.add(getJButtonAccept(), null); + jLayeredPane.add(getJButtonResponse(), null); + + makeTransparent(jLayeredPane); + } + + private void displayStack(CardsView cards, UUID gameId, BigCard bigCard) { + + if (cards == null || cards.size() == 0) { + return; + } + + /** + * Display spells and theis targets above them + */ + int dx = (SettingsManager.getInstance().getCardSize().width + 15) * (cards.size() - 1); + int dy = 30; + + for (CardView card : cards.values()) { + + if (card instanceof StackAbilityView) { + CardView tmp = ((StackAbilityView)card).getSourceCard(); + tmp.overrideRules(card.getRules()); + tmp.setIsAbility(true); + tmp.overrideTargets(card.getTargets()); + tmp.overrideId(card.getId()); + card = tmp; + } + + MageCard cardImg = Plugins.getInstance().getMageCard(card, bigCard, getCardDimension(), gameId, true); + //cardImg.setBorder(BorderFactory.createLineBorder(Color.red)); + cardImg.setLocation(dx, dy); + + jLayeredPane.add(cardImg, JLayeredPane.DEFAULT_LAYER, 1); + + dx -= (SettingsManager.getInstance().getCardSize().width + 15); + } + } + + private Dimension getCardDimension() { + if (cardDimension == null) { + cardDimension = new Dimension(Config.dimensions.frameWidth, Config.dimensions.frameHeight); + } + return cardDimension; + } + + private HoverButton getJButtonAccept() { + if (jButtonAccept == null) { + jButtonAccept = new HoverButton("", ImageManagerImpl.getInstance().getDlgAcceptButtonImage(), + ImageManagerImpl.getInstance().getDlgActiveAcceptButtonImage(), + ImageManagerImpl.getInstance().getDlgAcceptButtonImage(), + new Rectangle(60, 60)); + int w = getDlgParams().rect.width - 90; + int h = getDlgParams().rect.height - 90; + jButtonAccept.setBounds(new Rectangle(w / 2 - 80, h - 50, 60, 60)); + //jButtonAccept.setBorder(BorderFactory.createLineBorder(Color.red)); + + jButtonAccept.setObserver(new Command() { + @Override + public void execute() { + DialogManager.getManager().fadeOut((DialogContainer)getParent()); + //GameManager.getInputControl().getInput().selectButtonOK(); + StackDialog.this.feedbackPanel.doClick(); + } + private static final long serialVersionUID = 1L; + }); + } + return jButtonAccept; + } + + private HoverButton getJButtonResponse() { + if (jButtonResponse == null) { + jButtonResponse = new HoverButton("", ImageManagerImpl.getInstance().getDlgCancelButtonImage(), + ImageManagerImpl.getInstance().getDlgActiveCancelButtonImage(), + ImageManagerImpl.getInstance().getDlgCancelButtonImage(), + new Rectangle(60, 60)); + int w = getDlgParams().rect.width - 90; + int h = getDlgParams().rect.height - 90; + jButtonResponse.setBounds(new Rectangle(w / 2 + 5, h - 48, 60, 60)); + + jButtonResponse.setObserver(new Command() { + @Override + public void execute() { + DialogManager.getManager().fadeOut((DialogContainer)getParent()); + } + private static final long serialVersionUID = 1L; + }); + } + return jButtonResponse; + } + + private Dimension cardDimension; + } \ No newline at end of file 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 a1aee0ba074..6cee4e6a96c 100644 --- a/Mage.Client/src/main/java/mage/client/game/GamePanel.java +++ b/Mage.Client/src/main/java/mage/client/game/GamePanel.java @@ -36,8 +36,10 @@ package mage.client.game; import mage.Constants; import mage.client.MageFrame; +import mage.client.cards.BigCard; import mage.client.chat.ChatPanel; import mage.client.components.MageComponents; +import mage.client.components.ext.dlg.DialogManager; import mage.client.dialog.*; import mage.client.game.FeedbackPanel.FeedbackMode; import mage.client.plugins.impl.Plugins; @@ -85,6 +87,8 @@ public class GamePanel extends javax.swing.JPanel { private JLayeredPane jLayeredPane; private String chosenHandKey = "You"; private boolean smallMode = false; + + private int cachedStackSize; /** Creates new form GamePanel */ public GamePanel() { @@ -204,6 +208,10 @@ public class GamePanel extends javax.swing.JPanel { } } } + + DialogManager.getManager().setScreenWidth(rect.width); + DialogManager.getManager().setScreenHeight(rect.height); + DialogManager.getManager().setBounds(0, 0, rect.width, rect.height); } public synchronized void showGame(UUID gameId, UUID playerId) { @@ -399,6 +407,7 @@ public class GamePanel extends javax.swing.JPanel { this.stack.loadCards(game.getStack(), bigCard, gameId, null); GameManager.getInstance().setStackSize(game.getStack().size()); + displayStack(game, bigCard, feedbackPanel, gameId); for (ExileView exile: game.getExile()) { if (!exiles.containsKey(exile.getId())) { @@ -421,6 +430,30 @@ public class GamePanel extends javax.swing.JPanel { this.repaint(); } + private void displayStack(GameView game, BigCard bigCard, FeedbackPanel feedbackPanel, UUID gameId) { + if (game.getStack().size() > 0) { + if (game.getStack().size() != cachedStackSize) { + boolean allPaid = true; + for (CardView cardView : game.getStack().values()) { + if (!cardView.isPaid()) { + allPaid = false; + break; + } + } + if (allPaid) { + DialogManager.getManager().fadeOut(); + cachedStackSize = game.getStack().size(); + DialogManager.getManager().showStackDialog(game.getStack(), bigCard, feedbackPanel, gameId); + } + } else { + // do nothing + } + } else { + cachedStackSize = game.getStack().size(); + DialogManager.getManager().fadeOut(); + } + } + /** * Update phase buttons\labels. */ @@ -946,6 +979,7 @@ public class GamePanel extends javax.swing.JPanel { public void installComponents() { jLayeredPane.setOpaque(false); jLayeredPane.add(abilityPicker); + jLayeredPane.add(DialogManager.getManager(), JLayeredPane.MODAL_LAYER, 0); abilityPicker.setVisible(false); } diff --git a/Mage.Client/src/main/java/mage/client/util/SettingsManager.java b/Mage.Client/src/main/java/mage/client/util/SettingsManager.java index cb24375b68f..a5b529691ff 100644 --- a/Mage.Client/src/main/java/mage/client/util/SettingsManager.java +++ b/Mage.Client/src/main/java/mage/client/util/SettingsManager.java @@ -1,6 +1,8 @@ package mage.client.util; +import org.mage.card.arcane.CardPanel; + import java.awt.*; /** @@ -36,6 +38,10 @@ public class SettingsManager { this.screenHeight = screenHeight; } + public Rectangle getCardSize() { + return cardSize; + } + /** * Get centered component position. Depends on screen width and height. * @@ -63,4 +69,5 @@ public class SettingsManager { private int screenWidth; private int screenHeight; + private Rectangle cardSize = CardPanel.CARD_SIZE_FULL; } diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/utils/ImageManager.java b/Mage.Client/src/main/java/org/mage/plugins/card/utils/ImageManager.java index 70052493eb1..40ee6e10687 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/utils/ImageManager.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/utils/ImageManager.java @@ -6,4 +6,9 @@ public interface ImageManager { public Image getSicknessImage(); public Image getDayImage(); public Image getNightImage(); + + public Image getDlgAcceptButtonImage(); + public Image getDlgActiveAcceptButtonImage(); + public Image getDlgCancelButtonImage(); + public Image getDlgActiveCancelButtonImage(); } diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/utils/impl/ImageManagerImpl.java b/Mage.Client/src/main/java/org/mage/plugins/card/utils/impl/ImageManagerImpl.java index 61452458d9f..a02a9aadda4 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/utils/impl/ImageManagerImpl.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/utils/impl/ImageManagerImpl.java @@ -1,20 +1,16 @@ package org.mage.plugins.card.utils.impl; -import java.awt.Color; -import java.awt.Image; -import java.awt.Rectangle; -import java.awt.Toolkit; -import java.awt.image.BufferedImage; -import java.awt.image.CropImageFilter; -import java.awt.image.FilteredImageSource; -import java.net.URL; - -import javax.imageio.ImageIO; - import mage.client.util.gui.BufferedImageBuilder; import org.mage.plugins.card.utils.ImageManager; import org.mage.plugins.card.utils.Transparency; +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.awt.image.CropImageFilter; +import java.awt.image.FilteredImageSource; +import java.net.URL; + public class ImageManagerImpl implements ImageManager { private static ImageManagerImpl fInstance = new ImageManagerImpl(); @@ -52,7 +48,39 @@ public class ImageManagerImpl implements ImageManager { return imageNight; } - protected static Image getImageFromResourceTransparent(String path, Color mask, Rectangle rec) { + @Override + public Image getDlgCancelButtonImage() { + if (imageDlgCancelButton == null) { + imageDlgCancelButton = getBufferedImageFromResource("/dlg/dlg.cancel.png"); + } + return imageDlgCancelButton; + } + + @Override + public Image getDlgActiveCancelButtonImage() { + if (imageDlgActiveCancelButton == null) { + imageDlgActiveCancelButton = getBufferedImageFromResource("/dlg/dlg.cancel.hover.png"); + } + return imageDlgActiveCancelButton; + } + + @Override + public Image getDlgAcceptButtonImage() { + if (imageDlgAcceptButton == null) { + imageDlgAcceptButton = getBufferedImageFromResource("/dlg/dlg.ok.png"); + } + return imageDlgAcceptButton; + } + + @Override + public Image getDlgActiveAcceptButtonImage() { + if (imageDlgActiveAcceptButton == null) { + imageDlgActiveAcceptButton = getBufferedImageFromResource("/dlg/dlg.ok.hover.png"); + } + return imageDlgActiveAcceptButton; + } + + protected static Image getImageFromResourceTransparent(String path, Color mask, Rectangle rec) { BufferedImage image = null; Image imageCardTransparent = null; Image resized = null; @@ -71,7 +99,25 @@ public class ImageManagerImpl implements ImageManager { return resized; } - private static BufferedImage imageSickness = null; - private static BufferedImage imageDay = null; - private static BufferedImage imageNight = null; + protected static BufferedImage getBufferedImageFromResource(String path) { + URL imageURL = ImageManager.class.getResource(path); + BufferedImage image = null; + + try { + image = ImageIO.read(imageURL); + } catch (Exception e) { + e.printStackTrace(); + } + + return image; + } + + private static BufferedImage imageSickness; + private static BufferedImage imageDay; + private static BufferedImage imageNight; + + private static BufferedImage imageDlgAcceptButton; + private static BufferedImage imageDlgActiveAcceptButton; + private static BufferedImage imageDlgCancelButton; + private static BufferedImage imageDlgActiveCancelButton; } diff --git a/Mage.Client/src/main/resources/dlg/dlg.cancel.hover.png b/Mage.Client/src/main/resources/dlg/dlg.cancel.hover.png new file mode 100644 index 00000000000..a8d1964f8f7 Binary files /dev/null and b/Mage.Client/src/main/resources/dlg/dlg.cancel.hover.png differ diff --git a/Mage.Client/src/main/resources/dlg/dlg.cancel.png b/Mage.Client/src/main/resources/dlg/dlg.cancel.png new file mode 100644 index 00000000000..1155399fe3a Binary files /dev/null and b/Mage.Client/src/main/resources/dlg/dlg.cancel.png differ diff --git a/Mage.Client/src/main/resources/dlg/dlg.next.hover.png b/Mage.Client/src/main/resources/dlg/dlg.next.hover.png new file mode 100644 index 00000000000..ffae94c3f8d Binary files /dev/null and b/Mage.Client/src/main/resources/dlg/dlg.next.hover.png differ diff --git a/Mage.Client/src/main/resources/dlg/dlg.next.png b/Mage.Client/src/main/resources/dlg/dlg.next.png new file mode 100644 index 00000000000..9747ea4e4cb Binary files /dev/null and b/Mage.Client/src/main/resources/dlg/dlg.next.png differ diff --git a/Mage.Client/src/main/resources/dlg/dlg.ok.hover.png b/Mage.Client/src/main/resources/dlg/dlg.ok.hover.png new file mode 100644 index 00000000000..9f99f5b0643 Binary files /dev/null and b/Mage.Client/src/main/resources/dlg/dlg.ok.hover.png differ diff --git a/Mage.Client/src/main/resources/dlg/dlg.ok.png b/Mage.Client/src/main/resources/dlg/dlg.ok.png new file mode 100644 index 00000000000..17a992a7fce Binary files /dev/null and b/Mage.Client/src/main/resources/dlg/dlg.ok.png differ diff --git a/Mage.Client/src/main/resources/dlg/dlg.prev.hover.png b/Mage.Client/src/main/resources/dlg/dlg.prev.hover.png new file mode 100644 index 00000000000..3247784eed0 Binary files /dev/null and b/Mage.Client/src/main/resources/dlg/dlg.prev.hover.png differ diff --git a/Mage.Client/src/main/resources/dlg/dlg.prev.png b/Mage.Client/src/main/resources/dlg/dlg.prev.png new file mode 100644 index 00000000000..fca4c220956 Binary files /dev/null and b/Mage.Client/src/main/resources/dlg/dlg.prev.png differ diff --git a/Mage.Common/src/mage/view/CardView.java b/Mage.Common/src/mage/view/CardView.java index c17f90a0281..0d186d3804c 100644 --- a/Mage.Common/src/mage/view/CardView.java +++ b/Mage.Common/src/mage/view/CardView.java @@ -77,6 +77,7 @@ public class CardView extends SimpleCardView { protected List targets; protected UUID pairedCard; + protected boolean paid; public CardView(Card card, UUID cardId) { this(card); @@ -389,4 +390,12 @@ public class CardView extends SimpleCardView { public int getType() { return type; } + + public boolean isPaid() { + return paid; + } + + public void setPaid(boolean paid) { + this.paid = paid; + } } diff --git a/Mage.Common/src/mage/view/GameView.java b/Mage.Common/src/mage/view/GameView.java index 7a6023c616a..1770340ccab 100644 --- a/Mage.Common/src/mage/view/GameView.java +++ b/Mage.Common/src/mage/view/GameView.java @@ -32,6 +32,7 @@ import mage.Constants; import mage.Constants.PhaseStep; import mage.Constants.TurnPhase; import mage.MageObject; +import mage.abilities.costs.Cost; import mage.cards.Card; import mage.game.ExileZone; import mage.game.Game; @@ -90,6 +91,7 @@ public class GameView implements Serializable { if (card.canTransform()) { updateLatestCardView(game, card, stackObject.getId()); } + checkPaid(stackObject.getId(), (StackAbility)stackObject); } else if (object != null) { StackAbility stackAbility = ((StackAbility)object); stackAbility.newId(); @@ -103,10 +105,12 @@ public class GameView implements Serializable { } stack.put(stackObject.getId(), new CardView(stackAbility)); + checkPaid(stackObject.getId(), stackAbility); } } else { stack.put(stackObject.getId(), new CardView((Spell)stackObject)); + checkPaid(stackObject.getId(), (Spell)stackObject); } //stackOrder.add(stackObject.getId()); } @@ -134,6 +138,31 @@ public class GameView implements Serializable { this.special = state.getSpecialActions().getControlledBy(state.getPriorityPlayerId()).size() > 0; } + private void checkPaid(UUID uuid, StackAbility stackAbility) { + for (Cost cost : stackAbility.getManaCostsToPay()) { + if (!cost.isPaid()) { + return; + } + } + CardView cardView = stack.get(uuid); + cardView.paid = true; + } + + private void checkPaid(UUID uuid, Spell spell) { + for (Cost cost : spell.getSpellAbility().getManaCostsToPay()) { + if (!cost.isPaid()) { + return; + } + } + CardView cardView = stack.get(uuid); + cardView.paid = true; + } + + private void setPaid(UUID uuid) { + CardView cardView = stack.get(uuid); + cardView.paid = true; + } + private void updateLatestCardView(Game game, Card card, UUID stackId) { if (!card.canTransform()) { return;