package jrummikub.view.impl; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import java.awt.event.ComponentListener; import java.text.DecimalFormat; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JProgressBar; import javax.swing.border.EmptyBorder; import jrummikub.util.Event; import jrummikub.util.IEvent; import jrummikub.view.IPlayerPanel; /** * Implementation of the player panel */ @SuppressWarnings("serial") class PlayerPanel extends JPanel implements IPlayerPanel { private final static int SIDE_PANEL_INSET = 15; private final static int SIDE_PANEL_SEPARATOR = 10; private final static float SIDE_PANEL_FIRST_LINE_HEIGHT = 0.375f; private final static int SIDE_PANEL_MAX_WIDTH = 180; private final static float MAX_BUTTON_FONT_SIZE = 12; private final static DecimalFormat secondFormat = new DecimalFormat("00"); private HandPanel hand; private JPanel leftPanel, rightPanel; private JLabel currentPlayerNameLabel; private JButton sortByNumberButton; private JButton sortByColorButton; private JProgressBar timeBar; private JButton endTurnButton; private Event sortByNumberEvent = new Event(); private Event sortByColorEvent = new Event(); private Event endTurnEvent = new Event(); @Override public HandPanel getHandPanel() { return hand; } @Override public void setCurrentPlayerName(String playerName) { currentPlayerNameLabel.setText(playerName); } @Override public void setTimeLeft(int time) { timeBar.setValue(time); timeBar.setString(Integer.toString(time / 60) + ":" + secondFormat.format(time % 60)); } @Override public IEvent getSortByNumberEvent() { return sortByNumberEvent; } @Override public IEvent getSortByColorEvent() { return sortByColorEvent; } @Override public IEvent getEndTurnEvent() { return endTurnEvent; } private void createLeftPanel() { leftPanel = new JPanel(); leftPanel.setLayout(null); leftPanel.setBorder(new EmptyBorder(SIDE_PANEL_INSET, SIDE_PANEL_INSET, SIDE_PANEL_INSET, SIDE_PANEL_INSET)); currentPlayerNameLabel = new JLabel(); currentPlayerNameLabel.setHorizontalAlignment(JLabel.CENTER); currentPlayerNameLabel.setHorizontalTextPosition(JLabel.CENTER); currentPlayerNameLabel.setVerticalAlignment(JLabel.CENTER); currentPlayerNameLabel.setVerticalTextPosition(JLabel.CENTER); leftPanel.add(currentPlayerNameLabel); sortByNumberButton = new JButton("
Sort by number"); sortByNumberButton.setFont(sortByNumberButton.getFont().deriveFont(0)); sortByNumberButton.setMargin(new Insets(0, 0, 0, 0)); sortByNumberButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { sortByNumberEvent.fire(); } }); leftPanel.add(sortByNumberButton); sortByColorButton = new JButton("
Sort by color"); sortByColorButton.setFont(sortByColorButton.getFont().deriveFont(0)); sortByNumberButton.setMargin(new Insets(0, 0, 0, 0)); sortByColorButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { sortByColorEvent.fire(); } }); leftPanel.add(sortByColorButton); leftPanel.addComponentListener(new LeftPanelResizeListener()); } private void createRightPanel() { rightPanel = new JPanel(); rightPanel.setLayout(null); rightPanel.setBorder(new EmptyBorder(SIDE_PANEL_INSET, SIDE_PANEL_INSET, SIDE_PANEL_INSET, SIDE_PANEL_INSET)); timeBar = new JProgressBar(0, 60); timeBar.setStringPainted(true); rightPanel.add(timeBar); endTurnButton = new JButton("End turn"); endTurnButton.setFont(endTurnButton.getFont().deriveFont(0)); endTurnButton.setMargin(new Insets(0, 0, 0, 0)); endTurnButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { endTurnEvent.fire(); } }); rightPanel.add(endTurnButton); rightPanel.addComponentListener(new RightPanelResizeListener()); } private void rescale() { Insets insets = getInsets(); int x = insets.left, y = insets.top, width = getWidth() - insets.left - insets.right, height = getHeight() - insets.top - insets.bottom; int boardWidth = hand.getWidth(); int panelWidth = (width - boardWidth) / 2; leftPanel.setBounds(x, y, panelWidth, height); hand.setBounds(x + panelWidth, y, boardWidth, height); rightPanel.setBounds(x + panelWidth + boardWidth, y, panelWidth, height); leftPanel.validate(); rightPanel.validate(); } /** * Creates a new PlayerPanel instance */ PlayerPanel() { setLayout(null); createLeftPanel(); add(leftPanel); hand = new HandPanel(); add(hand); createRightPanel(); add(rightPanel); ComponentListener rescaleListener = new ComponentAdapter() { @Override public void componentResized(ComponentEvent e) { rescale(); } }; addComponentListener(rescaleListener); hand.addComponentListener(rescaleListener); } private class LeftPanelResizeListener extends ComponentAdapter { @Override public void componentResized(ComponentEvent e) { Insets insets = leftPanel.getInsets(); int x = insets.left, y = insets.top, width = leftPanel.getWidth() - insets.left - insets.right, height = leftPanel.getHeight() - insets.top - insets.bottom; if (width > SIDE_PANEL_MAX_WIDTH) { x += (width - SIDE_PANEL_MAX_WIDTH) / 4; width = width / 2 + SIDE_PANEL_MAX_WIDTH / 2; } int firstLineHeight = (int) ((height - SIDE_PANEL_SEPARATOR) * SIDE_PANEL_FIRST_LINE_HEIGHT); int buttonWidth = (width - SIDE_PANEL_SEPARATOR) / 2; int buttonHeight = height - SIDE_PANEL_SEPARATOR - firstLineHeight; float fontSize = (float) Math.sqrt(buttonWidth * buttonHeight) / 5; if (fontSize > MAX_BUTTON_FONT_SIZE) fontSize = MAX_BUTTON_FONT_SIZE; currentPlayerNameLabel.setBounds(x, y, width, firstLineHeight); sortByNumberButton.setBounds(x, y + firstLineHeight + SIDE_PANEL_SEPARATOR, buttonWidth, buttonHeight); sortByColorButton.setBounds(x + buttonWidth + SIDE_PANEL_SEPARATOR, y + firstLineHeight + SIDE_PANEL_SEPARATOR, buttonWidth, buttonHeight); sortByNumberButton.setFont(sortByNumberButton.getFont().deriveFont( fontSize)); sortByColorButton.setFont(sortByColorButton.getFont() .deriveFont(fontSize)); } } private class RightPanelResizeListener extends ComponentAdapter { @Override public void componentResized(ComponentEvent e) { Insets insets = rightPanel.getInsets(); int x = insets.left, y = insets.top, width = rightPanel.getWidth() - insets.left - insets.right, height = rightPanel.getHeight() - insets.top - insets.bottom; if (width > SIDE_PANEL_MAX_WIDTH) { x += (width - SIDE_PANEL_MAX_WIDTH) / 4; width = width / 2 + SIDE_PANEL_MAX_WIDTH / 2; } int firstLineHeight = (int) ((height - SIDE_PANEL_SEPARATOR) * SIDE_PANEL_FIRST_LINE_HEIGHT); int buttonWidth = width; int buttonHeight = height - SIDE_PANEL_SEPARATOR - firstLineHeight; float fontSize = (float) Math.sqrt(buttonWidth * buttonHeight) / 5; if (fontSize > MAX_BUTTON_FONT_SIZE) fontSize = MAX_BUTTON_FONT_SIZE; timeBar.setBounds(x, y, width, firstLineHeight); endTurnButton.setBounds(x, y + firstLineHeight + SIDE_PANEL_SEPARATOR, buttonWidth, buttonHeight); endTurnButton.setFont(endTurnButton.getFont().deriveFont(fontSize)); } } }