diff --git a/Mage.Client/src/main/java/mage/client/cards/CardEventSource.java b/Mage.Client/src/main/java/mage/client/cards/CardEventSource.java index 22c5d1cb0b4..5aa243ffc10 100644 --- a/Mage.Client/src/main/java/mage/client/cards/CardEventSource.java +++ b/Mage.Client/src/main/java/mage/client/cards/CardEventSource.java @@ -28,6 +28,7 @@ package mage.client.cards; +import java.awt.Component; import mage.client.util.Event; import mage.client.util.EventDispatcher; import mage.client.util.EventSource; @@ -69,6 +70,11 @@ public class CardEventSource implements EventSource, Serializable { dispatcher.fireEvent(new Event(null, message)); } + public void showPopupMenuEvent(SimpleCardView card, Component component, int x, int y, String message) { + dispatcher.fireEvent(new Event(card, message, x, y, component)); + } + + @Override public void clearListeners() { dispatcher.clearListeners(); diff --git a/Mage.Client/src/main/java/mage/client/cards/CardsList.form b/Mage.Client/src/main/java/mage/client/cards/CardsList.form index eaf7cf9a88d..744db3a1d5b 100644 --- a/Mage.Client/src/main/java/mage/client/cards/CardsList.form +++ b/Mage.Client/src/main/java/mage/client/cards/CardsList.form @@ -48,7 +48,7 @@ - + @@ -92,7 +92,7 @@ - + @@ -127,7 +127,7 @@ - + @@ -145,7 +145,7 @@ - + @@ -163,7 +163,7 @@ - + @@ -181,7 +181,7 @@ - + @@ -199,7 +199,7 @@ - + @@ -217,7 +217,7 @@ - + diff --git a/Mage.Client/src/main/java/mage/client/cards/CardsList.java b/Mage.Client/src/main/java/mage/client/cards/CardsList.java index f983fd866e5..489f18d08ef 100644 --- a/Mage.Client/src/main/java/mage/client/cards/CardsList.java +++ b/Mage.Client/src/main/java/mage/client/cards/CardsList.java @@ -78,6 +78,7 @@ import mage.client.util.gui.TableSpinnerEditor; import mage.constants.CardType; import mage.view.CardView; import mage.view.CardsView; +import mage.view.SimpleCardView; import org.mage.card.arcane.CardPanel; /** @@ -114,6 +115,11 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar mainModel.removeTableModelListener(mainTable); mainModel.clear(); } + if(cardArea != null) { + for(MouseListener ml: cardArea.getMouseListeners()) { + cardArea.removeMouseListener(ml); + } + } if(mainTable != null) { for(MouseListener ml: mainTable.getMouseListeners()) { mainTable.removeMouseListener(ml); @@ -175,6 +181,9 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar cbSortBy.setEnabled(true); chkPiles.setEnabled(true); } + + cardArea.addMouseListener(this); + mainTable.setOpaque(false); mainTable.addMouseListener(new MouseAdapter() { @Override @@ -621,7 +630,7 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar .addComponent(jToggleListView, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jToggleCardView, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(0, 55, Short.MAX_VALUE)) + .addGap(0, 0, Short.MAX_VALUE)) ); panelControlLayout.setVerticalGroup( panelControlLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) @@ -661,7 +670,7 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar .addGroup(layout.createSequentialGroup() .addComponent(panelControl, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(0, 0, 0) - .addComponent(panelCardArea, javax.swing.GroupLayout.DEFAULT_SIZE, 266, Short.MAX_VALUE)) + .addComponent(panelCardArea, javax.swing.GroupLayout.DEFAULT_SIZE, 330, Short.MAX_VALUE)) ); }// //GEN-END:initComponents @@ -716,29 +725,51 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar @Override public void mousePressed(MouseEvent e) { - if (e.getClickCount() == 2 && !e.isConsumed()) { - e.consume(); + if (e.getClickCount() >= 1 && !e.isConsumed()) { Object obj = e.getSource(); - if (obj instanceof Card) { - if (e.isAltDown()) { - cardEventSource.altDoubleClick(((Card)obj).getOriginal(), "alt-double-click"); - } - else { - cardEventSource.doubleClick(((Card)obj).getOriginal(), "double-click"); - } - } else if (obj instanceof MageCard) { - if (e.isAltDown()) { - cardEventSource.altDoubleClick(((MageCard)obj).getOriginal(), "alt-double-click"); - } - else { - cardEventSource.doubleClick(((MageCard)obj).getOriginal(), "double-click"); + if (e.getClickCount() == 2) { + e.consume(); + if (obj instanceof Card) { + if (e.isAltDown()) { + cardEventSource.altDoubleClick(((Card)obj).getOriginal(), "alt-double-click"); + } + else { + cardEventSource.doubleClick(((Card)obj).getOriginal(), "double-click"); + } + } else if (obj instanceof MageCard) { + if (e.isAltDown()) { + cardEventSource.altDoubleClick(((MageCard)obj).getOriginal(), "alt-double-click"); + } + else { + cardEventSource.doubleClick(((MageCard)obj).getOriginal(), "double-click"); + } } } + if (obj instanceof MageCard) { + checkMenu(e, ((MageCard)obj).getOriginal()); + } else { + checkMenu(e, null); + } } } @Override public void mouseReleased(MouseEvent e) { + if (!e.isConsumed()) { + Object obj = e.getSource(); + if (obj instanceof MageCard) { + checkMenu(e, ((MageCard)obj).getOriginal()); + } else { + checkMenu(e, null); + } + } + } + + private void checkMenu(MouseEvent Me, SimpleCardView card){ + if (Me.isPopupTrigger()) { + Me.consume(); + cardEventSource.showPopupMenuEvent(card, Me.getComponent(), Me.getX(), Me.getY(), "show-popup-menu"); + } } @Override diff --git a/Mage.Client/src/main/java/mage/client/draft/DraftPanel.java b/Mage.Client/src/main/java/mage/client/draft/DraftPanel.java index 25e3d2ba0e4..71e8fc7ba97 100644 --- a/Mage.Client/src/main/java/mage/client/draft/DraftPanel.java +++ b/Mage.Client/src/main/java/mage/client/draft/DraftPanel.java @@ -39,10 +39,19 @@ import java.awt.Dimension; import java.awt.Image; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.event.KeyEvent; import java.awt.image.BufferedImage; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; import java.util.UUID; +import javax.swing.AbstractAction; import javax.swing.ImageIcon; +import javax.swing.JComponent; +import javax.swing.JMenuItem; import javax.swing.JOptionPane; +import javax.swing.JPopupMenu; +import javax.swing.KeyStroke; import javax.swing.Timer; import mage.client.MageFrame; import mage.client.components.tray.MageTray; @@ -59,6 +68,7 @@ import mage.view.CardsView; import mage.view.DraftPickView; import mage.view.DraftView; import mage.view.SimpleCardView; +import mage.view.SimpleCardsView; /** * @@ -70,7 +80,19 @@ public class DraftPanel extends javax.swing.JPanel { private Session session; private Timer countdown; private int timeout; - private boolean picked; + + // popup menu area picked cards + private final JPopupMenu popupMenuPickedArea; + // popup menu for a card + private final JPopupMenu popupMenuCardPanel; + // cards hidden in the picked cards area + private final Set cardsHidden = new HashSet<>(); + // all cards picked + protected SimpleCardsView pickedCards; + // all cards picked + protected SimpleCardsView pickedCardsShown = new SimpleCardsView(); + // id of card with popup menu + protected UUID cardIdPopupMenu; private static final CardsView emptyView = new CardsView(); @@ -81,6 +103,15 @@ public class DraftPanel extends javax.swing.JPanel { draftBooster.setOpaque(false); draftPicks.setSortSetting(SortSettingDraft.getInstance()); draftPicks.setOpaque(false); + + popupMenuPickedArea = new JPopupMenu(); + addPopupMenuPickArea(); + this.add(popupMenuPickedArea); + + popupMenuCardPanel = new JPopupMenu(); + addPopupMenuCardPanel(); + this.add(popupMenuCardPanel); + draftLeftPane.setOpaque(false); countdown = new Timer(1000, @@ -209,8 +240,29 @@ public class DraftPanel extends javax.swing.JPanel { } public void loadBooster(DraftPickView draftPickView) { + // upper area that shows the picks + loadCardsToPickedCardsArea(draftPickView.getPicks()); + + this.draftPicks.clearCardEventListeners(); + this.draftPicks.addCardEventListener(new Listener () { + @Override + public void event(Event event) { + if (event.getEventName().equals("show-popup-menu")) { + if (event.getSource() != null) { + // Popup Menu Card + cardIdPopupMenu = ((SimpleCardView)event.getSource()).getId(); + popupMenuCardPanel.show(event.getComponent(), event.getxPos(), event.getyPos()); + } else { + // Popup Menu area + popupMenuPickedArea.show(event.getComponent(), event.getxPos(), event.getyPos()); + } + } + } + } + ); + + // lower area that shows the booster draftBooster.loadBooster(CardsViewUtil.convertSimple(draftPickView.getBooster()), bigCard); - draftPicks.loadCards(CardsViewUtil.convertSimple(draftPickView.getPicks()), bigCard, null); this.draftBooster.clearCardEventListeners(); this.draftBooster.addCardEventListener( new Listener () { @@ -220,8 +272,8 @@ public class DraftPanel extends javax.swing.JPanel { SimpleCardView source = (SimpleCardView) event.getSource(); DraftPickView view = session.sendCardPick(draftId, source.getId()); if (view != null) { - draftBooster.loadBooster(emptyView, bigCard); - draftPicks.loadCards(CardsViewUtil.convertSimple(view.getPicks()), bigCard, null); + loadCardsToPickedCardsArea(view.getPicks()); + draftBooster.loadBooster(emptyView, bigCard); Plugins.getInstance().getActionCallback().hidePopup(); setMessage("Waiting for other players"); } @@ -245,7 +297,17 @@ public class DraftPanel extends javax.swing.JPanel { countdown.start(); } } - + + private void loadCardsToPickedCardsArea(SimpleCardsView pickedCards) { + this.pickedCards = pickedCards; + for (Map.Entry entry: pickedCards.entrySet()) { + if (!cardsHidden.contains(entry.getKey())) { + pickedCardsShown.put(entry.getKey(), entry.getValue()); + } + } + draftPicks.loadCards(CardsViewUtil.convertSimple(pickedCardsShown), bigCard, null); + } + private void setTimeout(int s){ int minute = s/60; int second = s - (minute*60); @@ -280,6 +342,64 @@ public class DraftPanel extends javax.swing.JPanel { this.lblMessage.setText(message); } + private void addPopupMenuPickArea() { + int c = JComponent.WHEN_IN_FOCUSED_WINDOW; + + KeyStroke ks9 = KeyStroke.getKeyStroke(KeyEvent.VK_F9, 0); + this.getInputMap(c).put(ks9, "F9_PRESS"); + this.getActionMap().put("F9_PRESS", new AbstractAction() { + @Override + public void actionPerformed(ActionEvent actionEvent) { + showAgainAllHiddenCards(); + } + }); + + JMenuItem menuItem; + + menuItem = new JMenuItem("F9 - Show all hidden cards"); + popupMenuPickedArea.add(menuItem); + + // Confirm (F9) + menuItem.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + showAgainAllHiddenCards(); + } + }); + + // popupMenuPickedArea.addSeparator(); + + } + + private void addPopupMenuCardPanel() { + + JMenuItem menuItem; + + menuItem = new JMenuItem("Hide this card"); + popupMenuCardPanel.add(menuItem); + + // Hide Card + menuItem.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + // Add the card to the hidden cards + cardsHidden.add(cardIdPopupMenu); + pickedCardsShown.remove(cardIdPopupMenu); + draftPicks.loadCards(CardsViewUtil.convertSimple(pickedCardsShown), bigCard, null); + } + }); + + // popupMenuCardPanel.addSeparator(); + + } + + + private void showAgainAllHiddenCards() { + // show again all hidden cards + cardsHidden.clear(); + draftPicks.loadCards(CardsViewUtil.convertSimple(pickedCards), bigCard, null); + } + /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is diff --git a/Mage.Client/src/main/java/mage/client/util/Event.java b/Mage.Client/src/main/java/mage/client/util/Event.java index 8e39db9be8c..bcf8b64ac8b 100644 --- a/Mage.Client/src/main/java/mage/client/util/Event.java +++ b/Mage.Client/src/main/java/mage/client/util/Event.java @@ -28,6 +28,7 @@ package mage.client.util; +import java.awt.Component; import java.io.Serializable; /** @@ -36,8 +37,11 @@ import java.io.Serializable; */ public class Event implements Serializable { private final Object source; + private final Component component; private final String eventName; private final int number; + private final int xPos; + private final int yPos; public Event(Object source, String eventName) { this(source, eventName, 0); @@ -47,6 +51,18 @@ public class Event implements Serializable { this.source = source; this.eventName = eventName; this.number = number; + this.xPos = 0; + this.yPos = 0; + this.component = null; + } + + public Event(Object source, String eventName, int xPos, int yPos, Component component) { + this.source = source; + this.eventName = eventName; + this.number =0; + this.xPos = xPos; + this.yPos = yPos; + this.component = component; } public Object getSource() { @@ -60,5 +76,17 @@ public class Event implements Serializable { public int getNumber() { return number; } + + public int getxPos() { + return xPos; + } + + public int getyPos() { + return yPos; + } + + public Component getComponent() { + return component; + } } diff --git a/Mage.Client/src/main/java/mage/client/util/EventDispatcher.java b/Mage.Client/src/main/java/mage/client/util/EventDispatcher.java index afdfb8ae00e..0cbf1b7a329 100644 --- a/Mage.Client/src/main/java/mage/client/util/EventDispatcher.java +++ b/Mage.Client/src/main/java/mage/client/util/EventDispatcher.java @@ -35,10 +35,11 @@ import java.util.concurrent.CopyOnWriteArrayList; /** * * @author BetaSteward_at_googlemail.com + * @param */ public abstract class EventDispatcher implements Serializable { - private List> listeners = new CopyOnWriteArrayList>(); + private final List> listeners = new CopyOnWriteArrayList<>(); public void addListener(Listener listener) { if (!listeners.contains(listener)) {