package magic.ui.widget.duel.viewer; import java.awt.BorderLayout; import java.awt.CardLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.InputEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.ScrollPaneConstants; import javax.swing.SwingUtilities; import magic.data.MagicIcon; import magic.ui.MagicImages; import magic.ui.helpers.ImageHelper; import magic.ui.screen.duel.game.SwingGameController; import magic.ui.widget.message.TextLabel; import magic.ui.widget.throbber.AbstractThrobber; import magic.ui.widget.throbber.ImageThrobber; @SuppressWarnings("serial") public class UserActionPanel extends JPanel implements ActionListener { private static final BufferedImage BUSY_IMAGE = ImageHelper.getBufferedImage( (ImageIcon) ImageHelper.getRecoloredIcon( MagicIcon.AI_THINKING, Color.BLACK, Color.GRAY) ); public static final int TEXT_WIDTH=230; private final SwingGameController controller; private final JButton actionButton; private final JButton undoButton; private final JPanel actionPanel; private final CardLayout actionCardLayout; private final JPanel contentPanel; private boolean actionEnabled; private final AbstractThrobber busyItem; public UserActionPanel(final SwingGameController controller) { this.controller=controller; setLayout(new BorderLayout()); setMinimumSize(new Dimension(0, 114)); setOpaque(false); actionPanel=new JPanel(); actionPanel.setOpaque(false); actionCardLayout=new CardLayout(); actionPanel.setLayout(actionCardLayout); final JLabel emptyLabel=new JLabel(""); actionPanel.add(emptyLabel,"0"); busyItem = new ImageThrobber.Builder(BUSY_IMAGE) .antiAlias(true) .spinPeriod(3000) .build(); actionPanel.add(busyItem,"1"); actionButton=new JButton(); actionButton.setIcon(MagicImages.getIcon(MagicIcon.FORWARD)); actionButton.setFocusable(false); actionButton.addActionListener(this); actionButton.addMouseListener(new MouseAdapter() { @Override public void mouseReleased(MouseEvent e) { if (SwingUtilities.isRightMouseButton(e)) { controller.passKeyPressed(); } } }); actionPanel.add(actionButton,"2"); undoButton=new JButton(MagicImages.getIcon(MagicIcon.UNDO)); undoButton.setMargin(new Insets(1,1,1,1)); undoButton.setIconTextGap(2); undoButton.setEnabled(false); undoButton.setFocusable(false); undoButton.addActionListener(this); final JPanel rightPanel=new JPanel(new GridLayout(2,1,0,2)); rightPanel.setOpaque(false); rightPanel.setPreferredSize(new Dimension(60,0)); rightPanel.add(actionPanel); rightPanel.add(undoButton); add(rightPanel,BorderLayout.EAST); contentPanel=new JPanel(); contentPanel.setOpaque(false); contentPanel.setLayout(new BorderLayout()); contentPanel.addMouseListener(new MouseAdapter() { @Override public void mouseEntered(MouseEvent e) { controller.showChoiceCardPopup(); } }); final JScrollPane scroller = new JScrollPane(); scroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED); scroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); scroller.getViewport().setOpaque(false); scroller.getViewport().add(contentPanel); add(scroller, BorderLayout.CENTER); disableButton(false); // Suppress mouse events reaching parent container. // This will apply to any child components which have not // registered their own mouse listener. // Effectively prevents the card popup from being closed // (by DuelPanel) while mouse cursor is inside UserActionPanel. addMouseListener(new MouseAdapter(){}); } public void clearContentPanel() { contentPanel.removeAll(); } public void setContentPanel(final JComponent newContent) { clearContentPanel(); contentPanel.add(newContent,BorderLayout.CENTER); revalidate(); repaint(); } public void showMessage(final String message) { final TextLabel messageLabel=new TextLabel(message,TEXT_WIDTH,true); setContentPanel(messageLabel); } public boolean isActionEnabled() { return actionEnabled; } public boolean isUndoEnabled() { return undoButton.isEnabled(); } public void enableUndoButton(final boolean thinking) { final int undoPoints=controller.getViewerInfo().getUndoPoints(); final boolean allowUndo=undoPoints>0&&!thinking; undoButton.setEnabled(allowUndo); } public void enableButton() { actionEnabled=true; enableUndoButton(false); actionCardLayout.show(actionPanel,"2"); repaint(); } public void disableButton(final boolean thinking) { actionEnabled=false; enableUndoButton(thinking); actionCardLayout.show(actionPanel,thinking?"1":"0"); repaint(); } @Override public void actionPerformed(final ActionEvent event) { final Object source=event.getSource(); if (source==actionButton) { final boolean isShiftClick = (event.getModifiers() & InputEvent.SHIFT_MASK) != 0; if (isShiftClick) { controller.passKeyPressed(); } else { controller.actionClicked(); } } else if (source==undoButton) { controller.undoClicked(); } } /** * Gets the avatar portrait of the current player sized specifically * for use with the GameStatusPanel component. */ public ImageIcon getTurnSizedPlayerAvatar() { return controller.getViewerInfo().getPriorityPlayer().getAvatar(); } }