package games.strategy.ui; import java.awt.FlowLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.BoxLayout; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JPanel; import games.strategy.engine.framework.system.SystemProperties; import games.strategy.util.ListenerList; public class ScrollableTextField extends JPanel { private static final long serialVersionUID = 6940592988573672224L; private static boolean s_imagesLoaded; private static Icon s_up; private static Icon s_down; private static Icon s_max; private static Icon s_min; private final IntTextField m_text; private final JButton m_up; private final JButton m_down; private final JButton m_max; private final JButton m_min; private final ListenerList<ScrollableTextFieldListener> m_listeners = new ListenerList<>(); /** Creates new ScrollableTextField. */ public ScrollableTextField(final int minVal, final int maxVal) { super(); loadImages(); m_text = new IntTextField(minVal, maxVal); setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0)); add(m_text); Insets inset = new Insets(0, 0, 0, 0); if (SystemProperties.isMac()) { inset = new Insets(2, 0, 2, 0); } m_up = new JButton(s_up); final Action m_incrementAction = new AbstractAction("inc") { private static final long serialVersionUID = 2125871167112459475L; @Override public void actionPerformed(final ActionEvent e) { if (m_text.isEnabled()) { m_text.setValue(m_text.getValue() + 1); setWidgetActivation(); } } }; m_up.addActionListener(m_incrementAction); m_up.setMargin(inset); m_down = new JButton(s_down); m_down.setMargin(inset); final Action m_decrementAction = new AbstractAction("dec") { private static final long serialVersionUID = 787758939168986726L; @Override public void actionPerformed(final ActionEvent e) { if (m_text.isEnabled()) { m_text.setValue(m_text.getValue() - 1); setWidgetActivation(); } } }; m_down.addActionListener(m_decrementAction); m_max = new JButton(s_max); m_max.setMargin(inset); final Action m_maxAction = new AbstractAction("max") { private static final long serialVersionUID = -3899827439573519512L; @Override public void actionPerformed(final ActionEvent e) { if (m_text.isEnabled()) { m_text.setValue(m_text.getMax()); setWidgetActivation(); } } }; m_max.addActionListener(m_maxAction); m_min = new JButton(s_min); m_min.setMargin(inset); final Action m_minAction = new AbstractAction("min") { private static final long serialVersionUID = 5785321239855254848L; @Override public void actionPerformed(final ActionEvent e) { if (m_text.isEnabled()) { m_text.setValue(m_text.getMin()); setWidgetActivation(); } } }; m_min.addActionListener(m_minAction); final JPanel upDown = new JPanel(); upDown.setLayout(new BoxLayout(upDown, BoxLayout.Y_AXIS)); upDown.add(m_up); upDown.add(m_down); final JPanel maxMin = new JPanel(); maxMin.setLayout(new BoxLayout(maxMin, BoxLayout.Y_AXIS)); maxMin.add(m_max); maxMin.add(m_min); add(upDown); add(maxMin); final IntTextFieldChangeListener m_textListener = field -> notifyListeners(); m_text.addChangeListener(m_textListener); setWidgetActivation(); } private static synchronized void loadImages() { if (s_imagesLoaded) { return; } s_up = new ImageIcon(ScrollableTextField.class.getResource("images/up.gif")); s_down = new ImageIcon(ScrollableTextField.class.getResource("images/down.gif")); s_max = new ImageIcon(ScrollableTextField.class.getResource("images/max.gif")); s_min = new ImageIcon(ScrollableTextField.class.getResource("images/min.gif")); s_imagesLoaded = true; } public void setMax(final int max) { m_text.setMax(max); setWidgetActivation(); } public void setTerr(final String terr) { m_text.setTerr(terr); } public void setShowMaxAndMin(final boolean aBool) { m_max.setVisible(aBool); m_min.setVisible(aBool); } public int getMax() { return m_text.getMax(); } public String getTerr() { return m_text.getTerr(); } public void setMin(final int min) { m_text.setMin(min); setWidgetActivation(); } private void setWidgetActivation() { if (m_text.isEnabled()) { final int value = m_text.getValue(); final int max = m_text.getMax(); final boolean enableUp = (value != max); m_up.setEnabled(enableUp); m_max.setEnabled(enableUp); final int min = m_text.getMin(); final boolean enableDown = (value != min); m_down.setEnabled(enableDown); m_min.setEnabled(enableDown); } else { m_up.setEnabled(false); m_down.setEnabled(false); m_max.setEnabled(false); m_min.setEnabled(false); } } public int getValue() { return m_text.getValue(); } public void setValue(final int value) { m_text.setValue(value); setWidgetActivation(); } public void addChangeListener(final ScrollableTextFieldListener listener) { m_listeners.add(listener); } public void removeChangeListener(final ScrollableTextFieldListener listener) { m_listeners.remove(listener); } private void notifyListeners() { for (final ScrollableTextFieldListener listener : m_listeners) { listener.changedValue(this); } } @Override public void setEnabled(final boolean enabled) { m_text.setEnabled(enabled); setWidgetActivation(); } }