From cc5a76e62b4310ed9e7067b7a7137e0f0f8ea7a6 Mon Sep 17 00:00:00 2001 From: magenoxx Date: Sat, 16 Jul 2011 12:17:22 +0400 Subject: [PATCH] Finished ability picker. +even dispatching. +fixed bug in horizontal scrool bar. --- .../components/ability/AbilityPicker.java | 165 +++++++++++++----- .../components/ability/BackgroundPainter.java | 2 +- .../components/ability/MageScrollButton.java | 6 +- .../components/ability/MageScrollbarUI.java | 4 +- .../main/java/mage/client/game/GamePane.java | 8 + .../main/java/mage/client/game/GamePanel.java | 64 ++++--- .../java/mage/server/game/GameController.java | 2 +- 7 files changed, 179 insertions(+), 72 deletions(-) diff --git a/Mage.Client/src/main/java/mage/client/components/ability/AbilityPicker.java b/Mage.Client/src/main/java/mage/client/components/ability/AbilityPicker.java index 1fd53b5f92d..694125bbfd2 100644 --- a/Mage.Client/src/main/java/mage/client/components/ability/AbilityPicker.java +++ b/Mage.Client/src/main/java/mage/client/components/ability/AbilityPicker.java @@ -1,10 +1,12 @@ package mage.client.components.ability; +import com.sun.org.apache.bcel.internal.generic.CPInstruction; import mage.client.util.ImageHelper; import mage.client.util.SettingsManager; import mage.client.util.gui.GuiDisplayUtil; import mage.remote.Session; import mage.view.AbilityPickerView; +import org.apache.log4j.Logger; import org.jdesktop.layout.GroupLayout; import org.jdesktop.layout.LayoutStyle; import org.jdesktop.swingx.JXPanel; @@ -24,9 +26,11 @@ import java.util.UUID; */ public class AbilityPicker extends JXPanel implements MouseWheelListener { - private static final String DEFAULT_MESSAGE = "Choose spell or ability to play (double-click)";; - private static final int DIALOG_WIDTH = 320; - private static final int DIALOG_HEIGHT = 240; + private static final String DEFAULT_MESSAGE = "Choose spell or ability to play (double-click)"; + private static final int DIALOG_WIDTH = 440; + private static final int DIALOG_HEIGHT = 260; + + private transient static final Logger log = Logger.getLogger(AbilityPicker.class); private JList rows; private List choices; @@ -48,34 +52,31 @@ public class AbilityPicker extends JXPanel implements MouseWheelListener { private static Color SELECTED_COLOR = new Color(64,147,208); private static Color BORDER_COLOR = new Color(0,0,0,50); - public AbilityPicker() { - initComponents(); - addMouseWheelListener(this); - setSize(320, 240); + private boolean selected = false; - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - jScrollPane2.setOpaque(false); - jScrollPane2.getViewport().setOpaque(false); - //jScrollPane2.getHorizontalScrollBar().setUI(new MageScrollbarUI()); - //jScrollPane2.getVerticalScrollBar().setUI(new MageScrollbarUI()); - } - }); + public AbilityPicker() { + setSize(DIALOG_WIDTH, DIALOG_HEIGHT); + initComponents(); + + jScrollPane2.setOpaque(false); + jScrollPane2.getViewport().setOpaque(false); + UIManager.put( "ScrollBar.width", 17); + jScrollPane2.getHorizontalScrollBar().setUI(new MageScrollbarUI()); + jScrollPane2.getVerticalScrollBar().setUI(new MageScrollbarUI()); } public AbilityPicker(List choices, String message) { this.choices = choices; + setSize(DIALOG_WIDTH, DIALOG_HEIGHT); if (message!= null) { this.message = message + " (double-click)"; } initComponents(); jScrollPane2.setOpaque(false); jScrollPane2.getViewport().setOpaque(false); + UIManager.put( "ScrollBar.width", 17); jScrollPane2.getHorizontalScrollBar().setUI(new MageScrollbarUI()); jScrollPane2.getVerticalScrollBar().setUI(new MageScrollbarUI()); - - addMouseWheelListener(this); } public void init(Session session, UUID gameId) { @@ -84,17 +85,31 @@ public class AbilityPicker extends JXPanel implements MouseWheelListener { } public void show(AbilityPickerView choices, Point p) { - if (p == null) return; this.choices = new ArrayList(); + this.selected = true; // to stop previous modal for (Map.Entry choice: choices.getChoices().entrySet()) { this.choices.add(new AbilityPickerAction(choice.getKey(), choice.getValue())); } this.choices.add(new AbilityPickerAction(null, "Cancel")); - Point centered = SettingsManager.getInstance().getComponentPosition(320, 240); + show(this.choices); + } + + private void show(List choices) { + this.choices = choices; + this.selected = true; // to stop previous modal + + rows.setListData(this.choices.toArray()); + this.rows.setSelectedIndex(0); + this.selected = false; // back to false - waiting for selection + setVisible(true); + + Point centered = SettingsManager.getInstance().getComponentPosition(DIALOG_WIDTH, DIALOG_HEIGHT); this.setLocation(centered.x, centered.y); GuiDisplayUtil.keepComponentInsideScreen(centered.x, centered.y, this); + + //startModal(); } public void initComponents() { @@ -130,20 +145,9 @@ public class AbilityPicker extends JXPanel implements MouseWheelListener { rightImage = ImageHelper.loadImage(IMAGE_RIGHT_PATH); rightImageHovered = ImageHelper.loadImage(IMAGE_RIGHT_HOVERED_PATH); - //BufferedImage[] images = new BufferedImage[choices.size()]; - //rows = new JList(images); + setOpaque(false); + rows = new JList(); - rows.setModel ( - new AbstractListModel() { - public int getSize() { - if (AbilityPicker.this.choices == null) { - return 0; - } - return AbilityPicker.this.choices.size(); - } - public Object getElementAt(int i) { return AbilityPicker.this.choices.get(i); } - } - ); rows.setBackground(textColor); rows.setCellRenderer(new ImageRenderer()); @@ -162,10 +166,11 @@ public class AbilityPicker extends JXPanel implements MouseWheelListener { }); rows.setSelectedIndex(0); rows.setFont(new Font("Times New Roman", 1, 17)); - + rows.setBorder(BorderFactory.createEmptyBorder()); rows.addMouseWheelListener(this); jScrollPane2.setViewportView(rows); + jScrollPane2.setViewportBorder(BorderFactory.createEmptyBorder()); GroupLayout layout = new GroupLayout(this); this.setLayout(layout); @@ -217,7 +222,8 @@ public class AbilityPicker extends JXPanel implements MouseWheelListener { } private void objectMouseClicked(MouseEvent event) { - AbilityPickerAction action = (AbilityPickerAction)choices.get(rows.getSelectedIndex()); + int index = rows.getSelectedIndex(); + AbilityPickerAction action = (AbilityPickerAction)choices.get(index); action.actionPerformed(null); } @@ -239,7 +245,8 @@ public class AbilityPicker extends JXPanel implements MouseWheelListener { if (isSelected) { label.setIcon(new ImageIcon(rightImageHovered)); label.setForeground(SELECTED_COLOR); - label.setBorder(BorderFactory.createLineBorder(BORDER_COLOR)); + //label.setBorder(BorderFactory.createLineBorder(BORDER_COLOR)); + label.setBorder(BorderFactory.createEmptyBorder()); } else { label.setIcon(new ImageIcon(rightImage)); } @@ -250,16 +257,87 @@ public class AbilityPicker extends JXPanel implements MouseWheelListener { private static final long serialVersionUID = 7689696087189956997L; } + private synchronized void startModal() { + try { + if (SwingUtilities.isEventDispatchThread()) { + EventQueue theQueue = getToolkit().getSystemEventQueue(); + while (!selected) { + AWTEvent event = theQueue.getNextEvent(); + Object source = event.getSource(); + boolean dispatch = true; + + /*if (event instanceof MouseEvent) { + MouseEvent e = (MouseEvent) event; + if (e.getID() == MouseEvent.MOUSE_PRESSED || e.getID() == MouseEvent.MOUSE_CLICKED) { + MouseEvent m = SwingUtilities.convertMouseEvent((Component) e.getSource(), e, this); + if (!this.contains(m.getPoint())) { + selected = true; + cancel(); + setVisible(false); + dispatch = false; + } + } + }*/ + + if (event instanceof MouseEvent) { + MouseEvent e = (MouseEvent) event; + MouseEvent m = SwingUtilities.convertMouseEvent((Component) e.getSource(), e, this); + if (!this.contains(m.getPoint()) && e.getID() != MouseEvent.MOUSE_DRAGGED) { + dispatch = false; + } + } + + if (dispatch) { + if (event instanceof ActiveEvent) { + ((ActiveEvent) event).dispatch(); + } else if (source instanceof Component) { + ((Component) source).dispatchEvent(event); + } else if (source instanceof MenuComponent) { + ((MenuComponent) source).dispatchEvent(event); + } + } + } + } else { + while (!selected) { + wait(); + } + } + } catch (InterruptedException ignored) { + } + + } + public static void main(String[] argv) { + try { + UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"); + } catch (Exception ex) { + } + JFrame jframe = new JFrame("Test"); List objectList = new ArrayList(); - objectList.add("T: add {R} to your mana pool"); + objectList.add("T: add {R} to your mana pool. 111111111111111111111111111"); + objectList.add("T: add {B} to your mana pool"); + objectList.add("T: add {B} to your mana pool"); + objectList.add("T: add {B} to your mana pool"); + objectList.add("T: add {B} to your mana pool"); + objectList.add("T: add {B} to your mana pool"); + objectList.add("T: add {B} to your mana pool"); + objectList.add("T: add {B} to your mana pool"); + objectList.add("T: add {B} to your mana pool"); + objectList.add("T: add {B} to your mana pool"); + objectList.add("T: add {B} to your mana pool"); + objectList.add("T: add {B} to your mana pool"); + objectList.add("T: add {B} to your mana pool"); + objectList.add("T: add {B} to your mana pool"); + objectList.add("T: add {B} to your mana pool"); + objectList.add("T: add {B} to your mana pool"); objectList.add("T: add {B} to your mana pool"); objectList.add("Cancel"); AbilityPicker panel = new AbilityPicker(objectList, "Choose ability"); jframe.add(panel); - jframe.setSize(640, 480); + panel.show(objectList); + jframe.setSize(DIALOG_WIDTH, DIALOG_HEIGHT); jframe.setVisible(true); } @@ -276,11 +354,12 @@ public class AbilityPicker extends JXPanel implements MouseWheelListener { public void actionPerformed(ActionEvent e) { // cancel if (id == null) { - session.sendPlayerBoolean(gameId, false); + cancel(); } else { session.sendPlayerUUID(gameId, id); } setVisible(false); + AbilityPicker.this.selected = true; } @Override @@ -289,4 +368,12 @@ public class AbilityPicker extends JXPanel implements MouseWheelListener { } } + + private void cancel() { + try { + session.sendPlayerBoolean(gameId, false); + } catch (Exception e) { + log.error("Couldn't cancel choose dialog: " + e, e); + } + } } diff --git a/Mage.Client/src/main/java/mage/client/components/ability/BackgroundPainter.java b/Mage.Client/src/main/java/mage/client/components/ability/BackgroundPainter.java index c91d5ab87da..4d8b0661406 100644 --- a/Mage.Client/src/main/java/mage/client/components/ability/BackgroundPainter.java +++ b/Mage.Client/src/main/java/mage/client/components/ability/BackgroundPainter.java @@ -18,7 +18,7 @@ public class BackgroundPainter extends AbstractPainter { private Color bgColor = Color.black; - float bgalpha = 0.8f; + float bgalpha = 0.6f; public BackgroundPainter() { super(); diff --git a/Mage.Client/src/main/java/mage/client/components/ability/MageScrollButton.java b/Mage.Client/src/main/java/mage/client/components/ability/MageScrollButton.java index c64c643ab01..0caa243e2d1 100644 --- a/Mage.Client/src/main/java/mage/client/components/ability/MageScrollButton.java +++ b/Mage.Client/src/main/java/mage/client/components/ability/MageScrollButton.java @@ -18,8 +18,8 @@ import javax.swing.plaf.metal.MetalScrollButton; */ public class MageScrollButton extends MetalScrollButton { - private static Icon buttonLeft; - private static Icon buttonRight; + private static ImageIcon buttonLeft; + private static ImageIcon buttonRight; private static ImageIcon buttonUp; private static ImageIcon buttonDown; @@ -38,6 +38,8 @@ public class MageScrollButton extends MetalScrollButton { this.width = width; buttonUp.setImage(buttonUp.getImage().getScaledInstance(width, width, Image.SCALE_SMOOTH)); buttonDown.setImage(buttonDown.getImage().getScaledInstance(width, width, Image.SCALE_SMOOTH)); + buttonLeft.setImage(buttonLeft.getImage().getScaledInstance(width, width, Image.SCALE_SMOOTH)); + buttonRight.setImage(buttonRight.getImage().getScaledInstance(width, width, Image.SCALE_SMOOTH)); } @Override diff --git a/Mage.Client/src/main/java/mage/client/components/ability/MageScrollbarUI.java b/Mage.Client/src/main/java/mage/client/components/ability/MageScrollbarUI.java index 658017a1720..e9702c3180f 100644 --- a/Mage.Client/src/main/java/mage/client/components/ability/MageScrollbarUI.java +++ b/Mage.Client/src/main/java/mage/client/components/ability/MageScrollbarUI.java @@ -84,7 +84,7 @@ public class MageScrollbarUI extends MetalScrollBarUI { g2.translate(-trackBounds.x - 2, -trackBounds.y); } else { int width = trackBounds.width; - int height = trackBounds.height - 4; + int height = trackBounds.height - 4 + ANTI_WIDTH; g2.translate(trackBounds.x, trackBounds.y + 2); @@ -144,7 +144,7 @@ public class MageScrollbarUI extends MetalScrollBarUI { g2.translate(thumbBounds.x + 2, thumbBounds.y + 1); int width = thumbBounds.width - 4; - int height = thumbBounds.height - 3; + int height = thumbBounds.height - 3 + ANTI_WIDTH; RoundRectangle2D casing = new RoundRectangle2D.Double(0, 0, width, height, height, height); g2.setColor(Color.BLACK); 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 a6b8b6d3bd4..79b2a79de88 100644 --- a/Mage.Client/src/main/java/mage/client/game/GamePane.java +++ b/Mage.Client/src/main/java/mage/client/game/GamePane.java @@ -48,6 +48,14 @@ public class GamePane extends MagePane { /** Creates new form GamePane */ public GamePane() { initComponents(); + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + gamePanel.setJLayeredPane(getLayeredPane()); + gamePanel.installComponents(); + } + }); + } public void showGame(UUID gameId, UUID playerId) { 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 d5f9379ee93..2556cd3bea3 100644 --- a/Mage.Client/src/main/java/mage/client/game/GamePanel.java +++ b/Mage.Client/src/main/java/mage/client/game/GamePanel.java @@ -34,21 +34,6 @@ package mage.client.game; -import java.awt.*; -import java.awt.event.ComponentAdapter; -import java.awt.event.ComponentEvent; -import java.io.Serializable; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; -import java.util.UUID; -import java.util.prefs.Preferences; - -import javax.swing.*; -import javax.swing.border.Border; -import javax.swing.border.EmptyBorder; -import javax.swing.border.LineBorder; - import mage.Constants; import mage.client.MageFrame; import mage.client.cards.Cards; @@ -56,13 +41,25 @@ import mage.client.chat.ChatPanel; import mage.client.dialog.*; import mage.client.game.FeedbackPanel.FeedbackMode; import mage.client.plugins.impl.Plugins; -import mage.remote.Session; import mage.client.util.Config; import mage.client.util.GameManager; import mage.client.util.PhaseManager; +import mage.remote.Session; import mage.view.*; import org.apache.log4j.Logger; +import javax.swing.*; +import javax.swing.border.Border; +import javax.swing.border.EmptyBorder; +import javax.swing.border.LineBorder; +import java.awt.*; +import java.awt.event.ComponentAdapter; +import java.awt.event.ComponentEvent; +import java.io.Serializable; +import java.util.*; +import java.util.List; +import java.util.prefs.Preferences; + /** * * @author BetaSteward_at_googlemail.com, nantuko8 @@ -80,6 +77,7 @@ public class GamePanel extends javax.swing.JPanel { private Session session; private CombatDialog combat; private PickNumberDialog pickNumber; + private JLayeredPane jLayeredPane; private static final int HAND_CARD_WIDTH = 75; private static final Dimension handCardDimension = new Dimension(HAND_CARD_WIDTH, (int)(HAND_CARD_WIDTH * 3.5f / 2.5f)); @@ -96,7 +94,7 @@ public class GamePanel extends javax.swing.JPanel { /** Creates new form GamePanel */ public GamePanel() { initComponents(); - + hand.setHScrollSpeed(8); hand.setBackgroundColor(new Color(0, 0, 0, 100)); hand.setVisibleIfEmpty(false); @@ -137,7 +135,7 @@ public class GamePanel extends javax.swing.JPanel { private Map getUIComponents(JLayeredPane jLayeredPane) { Map components = new HashMap(); - + components.put("jSplitPane1", jSplitPane1); components.put("pnlBattlefield", pnlBattlefield); components.put("jPanel3", jPanel3); @@ -146,10 +144,10 @@ public class GamePanel extends javax.swing.JPanel { components.put("userChatPanel", userChatPanel); components.put("jLayeredPane", jLayeredPane); components.put("gamePanel", this); - + return components; } - + public void cleanUp() { this.gameChatPanel.disconnect(); this.players.clear(); @@ -325,10 +323,10 @@ public class GamePanel extends javax.swing.JPanel { } } } - + this.stack.loadCards(game.getStack(), bigCard, gameId); GameManager.getInstance().setStackSize(game.getStack().size()); - + for (ExileView exile: game.getExile()) { if (!exiles.containsKey(exile.getId())) { ExileZoneDialog newExile = new ExileZoneDialog(); @@ -489,11 +487,11 @@ public class GamePanel extends javax.swing.JPanel { pickChoice.showDialog(message, choices); session.sendPlayerString(gameId, pickChoice.getChoice()); } - + public Map getPlayers() { return players; } - + /*public javax.swing.JPanel getBattlefield() { return pnlBattlefield; }*/ @@ -508,7 +506,8 @@ public class GamePanel extends javax.swing.JPanel { // //GEN-END:initComponents private void initComponents() { - abilityPicker = new mage.client.game.AbilityPicker(); + //abilityPicker = new mage.client.game.AbilityPicker(); + abilityPicker = new mage.client.components.ability.AbilityPicker(); jSplitPane1 = new javax.swing.JSplitPane(); jPanel3 = new javax.swing.JPanel(); pnlGameInfo = new javax.swing.JPanel(); @@ -542,7 +541,7 @@ public class GamePanel extends javax.swing.JPanel { gameChatPanel.disableInput(); jTabbedPane1 = new JTabbedPane(); - hand.setCardDimension(getHandCardDimension()); + hand.setCardDimension(getHandCardDimension()); jSplitPane1.setBorder(null); jSplitPane1.setDividerSize(7); @@ -893,8 +892,19 @@ public class GamePanel extends javax.swing.JPanel { private javax.swing.JScrollPane jScrollPane1; } + public void setJLayeredPane(JLayeredPane jLayeredPane) { + this.jLayeredPane = jLayeredPane; + } + + public void installComponents() { + jLayeredPane.setOpaque(false); + jLayeredPane.add(abilityPicker); + abilityPicker.setVisible(false); + } + // Variables declaration - do not modify//GEN-BEGIN:variables - private mage.client.game.AbilityPicker abilityPicker; + //private mage.client.game.AbilityPicker abilityPicker; + private mage.client.components.ability.AbilityPicker abilityPicker; private mage.client.cards.BigCard bigCard; private javax.swing.JButton btnConcede; private javax.swing.JButton btnNextPlay; diff --git a/Mage.Server/src/main/java/mage/server/game/GameController.java b/Mage.Server/src/main/java/mage/server/game/GameController.java index 1d610e11d5a..269075a6cda 100644 --- a/Mage.Server/src/main/java/mage/server/game/GameController.java +++ b/Mage.Server/src/main/java/mage/server/game/GameController.java @@ -279,7 +279,7 @@ public class GameController implements GameCallback { public void kill(UUID sessionId) { if (sessionPlayerMap.containsKey(sessionId)) { GameSession session = gameSessions.get(sessionPlayerMap.get(sessionId)); - session.destroy(); + if (session != null) session.destroy(); gameSessions.remove(sessionPlayerMap.get(sessionId)); leave(sessionId); sessionPlayerMap.remove(sessionId);