diff --git a/Mage.Client/src/main/java/mage/client/MageFrame.java b/Mage.Client/src/main/java/mage/client/MageFrame.java index fa0de32d5c0..5d7e989fd30 100644 --- a/Mage.Client/src/main/java/mage/client/MageFrame.java +++ b/Mage.Client/src/main/java/mage/client/MageFrame.java @@ -245,7 +245,7 @@ public class MageFrame extends javax.swing.JFrame implements MageClient { setAppIcon(); MageTray.getInstance().install(); - desktopPane.add(ArrowBuilder.getArrowsPanel(), JLayeredPane.DRAG_LAYER); + desktopPane.add(ArrowBuilder.getBuilder().getArrowsManagerPanel(), JLayeredPane.DRAG_LAYER); desktopPane.addComponentListener(new ComponentAdapter() { @Override @@ -256,10 +256,9 @@ public class MageFrame extends javax.swing.JFrame implements MageClient { if (!liteMode && !grayMode) { backgroundPane.setSize(width, height); } - JPanel arrowsPanel = ArrowBuilder.getArrowsPanelRef(); - if (arrowsPanel != null) { - arrowsPanel.setSize(width, height); - } + + ArrowBuilder.getBuilder().setSize(width, height); + if (title != null) { title.setBounds((int) (width - titleRectangle.getWidth()) / 2, (int) (height - titleRectangle.getHeight()) / 2, titleRectangle.width, titleRectangle.height); } @@ -534,6 +533,10 @@ public class MageFrame extends javax.swing.JFrame implements MageClient { logger.error("Error setting " + frame.getTitle() + " active"); } activeFrame.activated(); + ArrowBuilder.getBuilder().hideAllPanels(); + if (frame instanceof GamePane) { + ArrowBuilder.getBuilder().showPanel(((GamePane) frame).getGameId()); + } } public static void deactivate(MagePane frame) { diff --git a/Mage.Client/src/main/java/mage/client/cards/Card.java b/Mage.Client/src/main/java/mage/client/cards/Card.java index 7028e4845d0..3b72f30173f 100644 --- a/Mage.Client/src/main/java/mage/client/cards/Card.java +++ b/Mage.Client/src/main/java/mage/client/cards/Card.java @@ -361,14 +361,14 @@ public class Card extends MagePermanent implements MouseMotionListener, MouseLis if (p != null) { Point target = p.getLocationOnScreen(); Point me = this.getLocationOnScreen(); - ArrowBuilder.addArrow((int)me.getX() + 35, (int)me.getY(), (int)target.getX() + 40, (int)target.getY() - 40, Color.red, ArrowBuilder.Type.TARGET); + ArrowBuilder.getBuilder().addArrow(gameId, (int)me.getX() + 35, (int)me.getY(), (int)target.getX() + 40, (int)target.getY() - 40, Color.red, ArrowBuilder.Type.TARGET); } else { for (PlayAreaPanel pa : MageFrame.getGame(gameId).getPlayers().values()) { MagePermanent permanent = pa.getBattlefieldPanel().getPermanents().get(uuid); if (permanent != null) { Point target = permanent.getLocationOnScreen(); Point me = this.getLocationOnScreen(); - ArrowBuilder.addArrow((int)me.getX() + 35, (int)me.getY(), (int)target.getX() + 40, (int)target.getY() + 10, Color.red, ArrowBuilder.Type.TARGET); + ArrowBuilder.getBuilder().addArrow(gameId, (int)me.getX() + 35, (int)me.getY(), (int)target.getX() + 40, (int)target.getY() + 10, Color.red, ArrowBuilder.Type.TARGET); } } } @@ -383,10 +383,9 @@ public class Card extends MagePermanent implements MouseMotionListener, MouseLis if (popup != null) { popup.hide(); popupShowing = false; - //ArrowBuilder.removeAllArrows(); - ArrowBuilder.removeArrowsByType(ArrowBuilder.Type.TARGET); - ArrowBuilder.removeArrowsByType(ArrowBuilder.Type.PAIRED); - ArrowBuilder.removeArrowsByType(ArrowBuilder.Type.SOURCE); + ArrowBuilder.getBuilder().removeArrowsByType(gameId, ArrowBuilder.Type.TARGET); + ArrowBuilder.getBuilder().removeArrowsByType(gameId, ArrowBuilder.Type.PAIRED); + ArrowBuilder.getBuilder().removeArrowsByType(gameId, ArrowBuilder.Type.SOURCE); } } diff --git a/Mage.Client/src/main/java/mage/client/combat/CombatManager.java b/Mage.Client/src/main/java/mage/client/combat/CombatManager.java index 7fd226c9d72..9b39f203edb 100644 --- a/Mage.Client/src/main/java/mage/client/combat/CombatManager.java +++ b/Mage.Client/src/main/java/mage/client/combat/CombatManager.java @@ -37,12 +37,12 @@ public class CombatManager { private Point parentPoint; public void showCombat(List combatView, UUID gameId) { - ArrowBuilder.removeArrowsByType(ArrowBuilder.Type.COMBAT); + ArrowBuilder.getBuilder().removeArrowsByType(gameId, ArrowBuilder.Type.COMBAT); displayArrows(combatView, gameId); } public void hideCombat(UUID gameId) { - ArrowBuilder.removeArrowsByType(ArrowBuilder.Type.COMBAT); + ArrowBuilder.getBuilder().removeArrowsByType(gameId, ArrowBuilder.Type.COMBAT); combatAttackers.remove(gameId); combatBlockers.remove(gameId); } @@ -92,7 +92,7 @@ public class CombatManager { target.translate(-parentPoint.x, -parentPoint.y); Point attackerPoint = attackerCard.getLocationOnScreen(); attackerPoint.translate(-parentPoint.x, -parentPoint.y); - ArrowBuilder.addArrow((int) attackerPoint.getX() + 45, (int) attackerPoint.getY() + 25, (int) target.getX() + 40, (int) target.getY() - 20, Color.red, ArrowBuilder.Type.COMBAT); + ArrowBuilder.getBuilder().addArrow(gameId, (int) attackerPoint.getX() + 45, (int) attackerPoint.getY() + 25, (int) target.getX() + 40, (int) target.getY() - 20, Color.red, ArrowBuilder.Type.COMBAT); } else { for (PlayAreaPanel pa : MageFrame.getGame(gameId).getPlayers().values()) { MagePermanent permanent = pa.getBattlefieldPanel().getPermanents().get(defenderId); @@ -101,7 +101,7 @@ public class CombatManager { target.translate(-parentPoint.x, -parentPoint.y); Point attackerPoint = attackerCard.getLocationOnScreen(); attackerPoint.translate(-parentPoint.x, -parentPoint.y); - ArrowBuilder.addArrow((int) attackerPoint.getX() + 45, (int) attackerPoint.getY() + 25, (int) target.getX() + 40, (int) target.getY() + 10, Color.red, ArrowBuilder.Type.COMBAT); + ArrowBuilder.getBuilder().addArrow(gameId, (int) attackerPoint.getX() + 45, (int) attackerPoint.getY() + 25, (int) target.getX() + 40, (int) target.getY() + 10, Color.red, ArrowBuilder.Type.COMBAT); } } } @@ -122,7 +122,7 @@ public class CombatManager { double xRateA = (attackerCard.getSize().width / SettingsManager.getInstance().getCardSize().width); double yRateB = (blockerCard.getSize().height / SettingsManager.getInstance().getCardSize().height); double xRateB = (blockerCard.getSize().width / SettingsManager.getInstance().getCardSize().width); - ArrowBuilder.addArrow((int) blockerPoint.getX() + (int)(55*xRateB), (int) blockerPoint.getY() + (int)(25*xRateB), + ArrowBuilder.getBuilder().addArrow(gameId, (int) blockerPoint.getX() + (int)(55*xRateB), (int) blockerPoint.getY() + (int)(25*xRateB), (int) attackerPoint.getX() + (int)(70*xRateA), (int) attackerPoint.getY() + (int)(25*yRateA), Color.blue, ArrowBuilder.Type.COMBAT); globalBlockersCount++; } diff --git a/Mage.Client/src/main/java/mage/client/game/FeedbackPanel.java b/Mage.Client/src/main/java/mage/client/game/FeedbackPanel.java index 6ee28709acf..51ffe2cbf50 100644 --- a/Mage.Client/src/main/java/mage/client/game/FeedbackPanel.java +++ b/Mage.Client/src/main/java/mage/client/game/FeedbackPanel.java @@ -128,7 +128,7 @@ public class FeedbackPanel extends javax.swing.JPanel { this.btnRight.setVisible(true); this.btnRight.setText("OK"); this.helper.setState("", false, "OK", true); - ArrowBuilder.removeAllArrows(); + ArrowBuilder.getBuilder().removeAllArrows(gameId); endWithTimeout(); break; } diff --git a/Mage.Client/src/main/java/mage/client/game/GamePane.java b/Mage.Client/src/main/java/mage/client/game/GamePane.java index fc6f0479439..96d7e6b14c6 100644 --- a/Mage.Client/src/main/java/mage/client/game/GamePane.java +++ b/Mage.Client/src/main/java/mage/client/game/GamePane.java @@ -60,6 +60,7 @@ public class GamePane extends MagePane { public void showGame(UUID gameId, UUID playerId) { this.setTitle("Game " + gameId); + this.gameId = gameId; gamePanel.showGame(gameId, playerId); } @@ -69,11 +70,13 @@ public class GamePane extends MagePane { public void watchGame(UUID gameId) { this.setTitle("Watching " + gameId); + this.gameId = gameId; gamePanel.watchGame(gameId); } public void replayGame(UUID gameId) { this.setTitle("Replaying " + gameId); + this.gameId = gameId; gamePanel.replayGame(gameId); } @@ -101,8 +104,12 @@ public class GamePane extends MagePane { pack(); } + public UUID getGameId() { + return gameId; + } private mage.client.game.GamePanel gamePanel; private javax.swing.JScrollPane jScrollPane1; + private UUID gameId; } 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 3bd01a15a14..4cc1b5033fa 100644 --- a/Mage.Client/src/main/java/mage/client/game/GamePanel.java +++ b/Mage.Client/src/main/java/mage/client/game/GamePanel.java @@ -50,6 +50,7 @@ import mage.client.plugins.impl.Plugins; import mage.client.util.Config; import mage.client.util.GameManager; import mage.client.util.PhaseManager; +import mage.client.util.gui.ArrowBuilder; import mage.remote.Session; import mage.view.*; import org.apache.log4j.Logger; @@ -265,6 +266,8 @@ public class GamePanel extends javax.swing.JPanel { //int height = pnlBattlefield.getHeight(); //phasesContainer.setPreferredSize(new Dimension(X_PHASE_WIDTH, X_PHASE_HEIGHT)); + ArrowBuilder.getBuilder().setSize(rect.width, rect.height); + DialogManager.getManager(gameId).setScreenWidth(rect.width); DialogManager.getManager(gameId).setScreenHeight(rect.height); DialogManager.getManager(gameId).setBounds(0, 0, rect.width, rect.height); @@ -441,7 +444,7 @@ public class GamePanel extends javax.swing.JPanel { handContainer.loadCards(handCards.get(chosenHandKey), bigCard, gameId); ActionCallback callback = Plugins.getInstance().getActionCallback(); - ((MageActionCallback)callback).hideAll(); + ((MageActionCallback)callback).hideAll(gameId); // set visible only if we have any other hand visible than ours boolean previous = btnSwitchHands.isVisible(); @@ -623,16 +626,13 @@ public class GamePanel extends javax.swing.JPanel { public void endMessage(String message) { this.feedbackPanel.getFeedback(FeedbackMode.END, message, false, null); + ArrowBuilder.getBuilder().removeAllArrows(gameId); } public int modalQuestion(String message, String title) { return JOptionPane.showConfirmDialog(this, message, title, JOptionPane.YES_NO_OPTION); } - /*public JPanel getHand() { - return hand; - }*/ - public void select(String message, GameView gameView) { updateGame(gameView); String messageToDisplay = message; @@ -1074,23 +1074,23 @@ public class GamePanel extends javax.swing.JPanel { gl_jPanel3.setHorizontalGroup( gl_jPanel3.createParallelGroup(Alignment.LEADING) .addGroup(gl_jPanel3.createSequentialGroup() - //.addComponent(pnlGameInfo, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) - //.addGap(0) - .addGroup(gl_jPanel3.createParallelGroup(Alignment.LEADING) - .addGroup(gl_jPanel3.createSequentialGroup() - .addGroup(gl_jPanel3.createParallelGroup(Alignment.LEADING) - .addComponent(helper, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(handContainer, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - ) - .addComponent(stack, 400, 400, 400) + //.addComponent(pnlGameInfo, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) + //.addGap(0) + .addGroup(gl_jPanel3.createParallelGroup(Alignment.LEADING) + .addGroup(gl_jPanel3.createSequentialGroup() + .addGroup(gl_jPanel3.createParallelGroup(Alignment.LEADING) + .addComponent(helper, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(handContainer, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + ) + .addComponent(stack, 400, 400, 400) - ) - .addGap(0) - //.addComponent(jPhases, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addGroup(gl_jPanel3.createSequentialGroup() - .addComponent(pnlBattlefield, GroupLayout.DEFAULT_SIZE, 200, Short.MAX_VALUE) - .addComponent(phasesContainer, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) - ))) + ) + .addGap(0) + //.addComponent(jPhases, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(gl_jPanel3.createSequentialGroup() + .addComponent(pnlBattlefield, GroupLayout.DEFAULT_SIZE, 200, Short.MAX_VALUE) + .addComponent(phasesContainer, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) + ))) ); gl_jPanel3.setVerticalGroup( gl_jPanel3.createParallelGroup(Alignment.TRAILING) @@ -1099,7 +1099,7 @@ public class GamePanel extends javax.swing.JPanel { .addComponent(pnlBattlefield, GroupLayout.DEFAULT_SIZE, 200, Short.MAX_VALUE) .addComponent(phasesContainer, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) ) - //.addPreferredGap(ComponentPlacement.RELATED) + //.addPreferredGap(ComponentPlacement.RELATED) .addGroup(gl_jPanel3.createParallelGroup(Alignment.LEADING) .addGroup(gl_jPanel3.createSequentialGroup() .addGap(85) @@ -1320,9 +1320,9 @@ class ReplayTask extends SwingWorker> { try { get(); } catch (InterruptedException ex) { - logger.fatal("Update Matches Task error", ex); + logger.fatal("Replay Match Task error", ex); } catch (ExecutionException ex) { - logger.fatal("Update Matches Task error", ex); + logger.fatal("Replay Match Task error", ex); } catch (CancellationException ex) {} } } 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 ad3fbb98922..8d842ca9499 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 @@ -103,7 +103,7 @@ public class MageActionCallback implements ActionCallback { if (permanent != null) { Point target = permanent.getLocationOnScreen(); target.translate(-parentPoint.x, -parentPoint.y); - ArrowBuilder.addArrow((int) me.getX() + 35, (int) me.getY(), (int) target.getX() + 40, (int) target.getY() + 10, Color.green, ArrowBuilder.Type.PAIRED); + ArrowBuilder.getBuilder().addArrow(data.gameId, (int) me.getX() + 35, (int) me.getY(), (int) target.getX() + 40, (int) target.getY() + 10, Color.green, ArrowBuilder.Type.PAIRED); } } } @@ -119,7 +119,7 @@ public class MageActionCallback implements ActionCallback { if (permanent != null) { Point source = permanent.getLocationOnScreen(); source.translate(-parentPoint.x, -parentPoint.y); - ArrowBuilder.addArrow((int) source.getX() + 40, (int) source.getY() + 10, (int) me.getX() + 35, (int) me.getY() + 20, Color.blue, ArrowBuilder.Type.SOURCE); + ArrowBuilder.getBuilder().addArrow(data.gameId, (int) source.getX() + 40, (int) source.getY() + 10, (int) me.getX() + 35, (int) me.getY() + 20, Color.blue, ArrowBuilder.Type.SOURCE); } } } @@ -136,14 +136,14 @@ public class MageActionCallback implements ActionCallback { if (p != null) { Point target = p.getLocationOnScreen(); target.translate(-parentPoint.x, -parentPoint.y); - ArrowBuilder.addArrow((int) me.getX() + 35, (int) me.getY(), (int) target.getX() + 40, (int) target.getY() - 40, Color.red, ArrowBuilder.Type.TARGET); + ArrowBuilder.getBuilder().addArrow(data.gameId,(int) me.getX() + 35, (int) me.getY(), (int) target.getX() + 40, (int) target.getY() - 40, Color.red, ArrowBuilder.Type.TARGET); } else { for (PlayAreaPanel pa : MageFrame.getGame(data.gameId).getPlayers().values()) { MagePermanent permanent = pa.getBattlefieldPanel().getPermanents().get(uuid); if (permanent != null) { Point target = permanent.getLocationOnScreen(); target.translate(-parentPoint.x, -parentPoint.y); - ArrowBuilder.addArrow((int) me.getX() + 35, (int) me.getY(), (int) target.getX() + 40, (int) target.getY() + 10, Color.red, ArrowBuilder.Type.TARGET); + ArrowBuilder.getBuilder().addArrow(data.gameId, (int) me.getX() + 35, (int) me.getY(), (int) target.getX() + 40, (int) target.getY() + 10, Color.red, ArrowBuilder.Type.TARGET); } } } @@ -276,17 +276,16 @@ public class MageActionCallback implements ActionCallback { @Override public void mouseExited(MouseEvent e, final TransferData data) { - hideAll(); + hideAll(data.gameId); } - public void hideAll() { + public void hideAll(UUID gameId) { hidePopup(); startHideTimeout(); this.state = false; - //ArrowBuilder.removeAllArrows(); - ArrowBuilder.removeArrowsByType(ArrowBuilder.Type.TARGET); - ArrowBuilder.removeArrowsByType(ArrowBuilder.Type.PAIRED); - ArrowBuilder.removeArrowsByType(ArrowBuilder.Type.SOURCE); + ArrowBuilder.getBuilder().removeArrowsByType(gameId, ArrowBuilder.Type.TARGET); + ArrowBuilder.getBuilder().removeArrowsByType(gameId, ArrowBuilder.Type.PAIRED); + ArrowBuilder.getBuilder().removeArrowsByType(gameId, ArrowBuilder.Type.SOURCE); } public void enlargeCard() { diff --git a/Mage.Client/src/main/java/mage/client/util/gui/ArrowBuilder.java b/Mage.Client/src/main/java/mage/client/util/gui/ArrowBuilder.java index 96b3f6a02ce..75f75971f90 100644 --- a/Mage.Client/src/main/java/mage/client/util/gui/ArrowBuilder.java +++ b/Mage.Client/src/main/java/mage/client/util/gui/ArrowBuilder.java @@ -2,20 +2,40 @@ package mage.client.util.gui; import javax.swing.*; import java.awt.*; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; +import java.util.*; +import java.util.List; /** * Class for dealing with arrows in the game. * - * @author nantuko + * @author nantuko, noxx */ public class ArrowBuilder { - private static JPanel arrowsPanel; + private static ArrowBuilder instance; - private final static Map> map = new HashMap>(); + static { + instance = new ArrowBuilder(); + } + + public static ArrowBuilder getBuilder() { + return instance; + } + + /** + * The top panel where arrow panels are added to. + */ + private JPanel arrowsManagerPanel; + + /** + * Stores arrow panels per game + */ + private final Map arrowPanels = new HashMap(); + + private final Map>> map = new HashMap>>(); + + private int currentWidth; + private int currentHeight; public enum Type { PAIRED, SOURCE, TARGET, COMBAT; @@ -25,20 +45,33 @@ public class ArrowBuilder { * Get the panel where all arrows are being drawn. * @return */ - public static JPanel getArrowsPanel() { - if (arrowsPanel == null) { + public JPanel getArrowsManagerPanel() { + if (arrowsManagerPanel == null) { synchronized (ArrowBuilder.class) { - if (arrowsPanel == null) { - arrowsPanel = new JPanel(); - arrowsPanel.setVisible(true); - arrowsPanel.setOpaque(false); - //arrowsPanel.setLayout(new BorderLayout()); - arrowsPanel.setLayout(null); - //arrowsPanel.setBorder(BorderFactory.createLineBorder(Color.red)); + if (arrowsManagerPanel == null) { + arrowsManagerPanel = new JPanel(); + arrowsManagerPanel.setVisible(true); + arrowsManagerPanel.setOpaque(false); + arrowsManagerPanel.setLayout(null); } } } - return arrowsPanel; + return arrowsManagerPanel; + } + + private JPanel getArrowsPanel(UUID gameId) { + if (!arrowPanels.containsKey(gameId)) { + JPanel arrowPanel = new JPanel(); + arrowPanel.setVisible(true); + arrowPanel.setOpaque(false); + arrowPanel.setLayout(null); + arrowPanel.setBorder(BorderFactory.createLineBorder(Color.blue)); + arrowPanel.setSize(currentWidth, currentHeight); + arrowPanels.put(gameId, arrowPanel); + getArrowsManagerPanel().add(arrowPanel); + return arrowPanel; + } + return arrowPanels.get(gameId); } /** @@ -48,9 +81,9 @@ public class ArrowBuilder { * * @return */ - public static JPanel getArrowsPanelRef() { - return arrowsPanel; - } + /*public JPanel getPanelRef() { + return arrowsManagerPanel; + }*/ /** * Adds new arrow. @@ -61,21 +94,29 @@ public class ArrowBuilder { * @param endY * @param color */ - public static void addArrow(int startX, int startY, int endX, int endY, Color color, Type type) { - JPanel p = getArrowsPanel(); + public void addArrow(UUID gameId, int startX, int startY, int endX, int endY, Color color, Type type) { + JPanel p = getArrowsPanel(gameId); + Arrow arrow = new Arrow(); arrow.setColor(color); arrow.setArrowLocation(startX, startY, endX, endY); arrow.setBounds(0, 0, Math.max(startX, endX) + 40, Math.max(startY, endY) + 30); // 30 is offset for arrow heads (being cut otherwise) + synchronized (map) { p.add(arrow); - java.util.List arrows = map.get(type); + Map> innerMap = map.get(gameId); + if (innerMap == null) { + innerMap = new HashMap>(); + map.put(gameId, innerMap); + } + java.util.List arrows = innerMap.get(type); if (arrows == null) { arrows = new ArrayList(); - map.put(type, arrows); + innerMap.put(type, arrows); } arrows.add(arrow); } + p.revalidate(); p.repaint(); } @@ -83,33 +124,61 @@ public class ArrowBuilder { /** * Removes all arrows from the screen. */ - public static void removeAllArrows() { - JPanel p = getArrowsPanel(); - synchronized (map) { - if (p.getComponentCount() > 0) { - p.removeAll(); - p.revalidate(); - p.repaint(); + public void removeAllArrows(UUID gameId) { + if (map.containsKey(gameId)) { + Map> innerMap = map.get(gameId); + JPanel p = getArrowsPanel(gameId); + synchronized (map) { + if (p != null && p.getComponentCount() > 0) { + p.removeAll(); + p.revalidate(); + p.repaint(); + } + innerMap.clear(); + map.remove(gameId); } - map.clear(); } } - public static void removeArrowsByType(Type type) { - java.util.List arrows = map.get(type); - if (arrows != null) { - JPanel p = getArrowsPanel(); - if (arrows.size() > 0) { + public void removeArrowsByType(UUID gameId, Type type) { + if (map.containsKey(gameId)) { + Map> innerMap = map.get(gameId); + java.util.List arrows = innerMap.get(type); + if (arrows != null && arrows.size() > 0) { + JPanel p = getArrowsPanel(gameId); synchronized (map) { for (Arrow arrow : arrows) { p.remove(arrow); } - map.put(type, new ArrayList()); + innerMap.put(type, new ArrayList()); } p.revalidate(); p.repaint(); } } } + + public void setSize(int width, int height) { + this.currentWidth = width; + this.currentHeight = height; + if (arrowsManagerPanel != null) { + arrowsManagerPanel.setSize(width, height); + } + for (JPanel arrowPanel : arrowPanels.values()) { + arrowPanel.setSize(width, height); + arrowPanel.repaint(); + } + } + public void hideAllPanels() { + for (JPanel arrowPanel : arrowPanels.values()) { + arrowPanel.setVisible(false); + } + } + + public void showPanel(UUID gameId) { + if (arrowPanels.containsKey(gameId)) { + arrowPanels.get(gameId).setVisible(true); + } + } }