package jrummikub.view.impl; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.Point; import java.awt.Polygon; import java.awt.RenderingHints; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.AdjustmentEvent; import java.awt.event.AdjustmentListener; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import java.awt.image.BufferedImage; import javax.swing.ImageIcon; import javax.swing.JCheckBox; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollBar; import javax.swing.JViewport; import javax.swing.border.LineBorder; import javax.swing.border.MatteBorder; @SuppressWarnings("serial") class SidePanel extends JPanel { RuleInfoPanel ruleInfoPanel; PlayerListPanel playerListPanel; BottomScrollPane playerListScrollPane; public SidePanel() { setLayout(new GridBagLayout()); GridBagConstraints c = new GridBagConstraints(); ruleInfoPanel = new RuleInfoPanel(); c.gridx = 0; c.gridy = 0; c.weightx = 1; c.fill = GridBagConstraints.BOTH; ruleInfoPanel.setBorder(new MatteBorder(0, 0, 1, 1, Color.BLACK)); add(ruleInfoPanel, c); playerListPanel = new PlayerListPanel(); c.gridx = 0; c.gridy = 1; c.weighty = 1; c.weightx = 1; c.fill = GridBagConstraints.BOTH; playerListScrollPane = new BottomScrollPane(playerListPanel); playerListScrollPane .setBorder(new MatteBorder(0, 0, 0, 1, Color.BLACK)); add(playerListScrollPane, c); } @SuppressWarnings("serial") class BottomScrollPane extends JPanel { JComponent content; JViewport viewport; JScrollBar scrollBar; boolean scrollToBottom; public BottomScrollPane(JComponent content) { setLayout(new GridBagLayout()); GridBagConstraints c = new GridBagConstraints(); c.weightx = 1; c.weighty = 1; c.fill = GridBagConstraints.BOTH; viewport = new JViewport(); add(viewport, c); this.content = content; viewport.setView(content); scrollBar = new JScrollBar(JScrollBar.VERTICAL); scrollBar.setBorder(new LineBorder(Color.BLACK, 0)); c.weightx = 0; add(scrollBar, c); ComponentAdapter resizeListener = new ComponentAdapter() { @Override public void componentResized(ComponentEvent e) { onResize(); } }; addComponentListener(resizeListener); content.addComponentListener(resizeListener); scrollBar.addAdjustmentListener(new AdjustmentListener() { @Override public void adjustmentValueChanged(AdjustmentEvent arg0) { scrollViewport(); } }); scrollToBottom(); } public void scrollToBottom() { scrollToBottom = true; } private void onResize() { int oldValue = 0; if (!scrollToBottom) { oldValue = scrollBar.getMaximum() - scrollBar.getVisibleAmount() - scrollBar.getValue(); } scrollToBottom = false; int max = content.getHeight(); int extent = viewport.getHeight(); int value = Math.max(0, max - extent - oldValue); scrollBar.setVisible(extent != max); scrollBar.setValues(value, extent, 0, max); scrollViewport(); } private void scrollViewport() { viewport.setViewPosition(new Point(0, scrollBar.getValue())); } } class RuleInfoPanel extends JPanel { JLabel ruleInfo; JCheckBox showRules; public RuleInfoPanel() { setLayout(new GridBagLayout()); GridBagConstraints c = new GridBagConstraints(); showRules = new JCheckBox("Regeln"); showRules.setSelected(true); c.gridx = 0; c.weightx = 1; c.fill = GridBagConstraints.HORIZONTAL; c.anchor = GridBagConstraints.WEST; setupTriangleIcons(showRules); c.insets = new Insets(0, 4, 0, 4); add(showRules, c); showRules.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg) { boolean selected = showRules.isSelected(); ruleInfo.setVisible(selected); showRules.setPressedIcon(selected ? showRules.getIcon() : showRules.getSelectedIcon()); } }); ruleInfo = new JLabel( "