package org.newdawn.slick.tools.peditor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.BorderFactory;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JSpinner;
import javax.swing.SpinnerNumberModel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
/**
* A panel allowing the definition of a range of values
*
* @author kevin
*/
public class MinMaxPanel extends DefaultPanel {
/** The spinner for the lower bound */
private JSpinner minSpinner;
/** The spinner for the upper bound */
private JSpinner maxSpinner;
/** The listeners to be notified of changes */
private ArrayList listeners = new ArrayList();
/** Indicates if we should ignore updates */
private boolean updateDisable = false;
/** Checkbox for enablement type fields */
private JCheckBox enabled = new JCheckBox("Enabled");
/** The value to report when the panel is disabled */
private int offValue;
/** True if this panel support enabledment */
private boolean enablement;
/**
* Create a new panel for a range definition
*
* @param name The name to display for this panel
* @param min The minimum lower bound
* @param max The maximum upper bound
* @param defMin The default lower bound
* @param defMax The default upper bound
* @param toolTip The tooltip describing this function
*/
public MinMaxPanel(String name, int min, int max, int defMin, int defMax, String toolTip) {
this(name, min, max, defMin, defMax, false, 0, toolTip);
}
/**
* Create a new panel for a range definition
*
* @param name The name to display for this panel
* @param min The minimum lower bound
* @param max The maximum upper bound
* @param defMin The default lower bound
* @param defMax The default upper bound
* @param enablement Indicates if this panel supports being enabled
* @param offValue The value to report when disabled
* @param toolTip The tooltip describing this function
*/
public MinMaxPanel(String name, int min, int max, int defMin, int defMax, boolean enablement, int offValue, String toolTip) {
setLayout(null);
this.setToolTipText(toolTip);
this.offValue = offValue;
this.enablement = enablement;
int offset = 0;
if (enablement) {
enabled.setBounds(10,20,200,20);
add(enabled);
offset += 20;
enabled.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
minSpinner.setEnabled(enabled.isSelected());
maxSpinner.setEnabled(enabled.isSelected());
fireUpdated(null);
}
});
}
minSpinner = new JSpinner(new SpinnerNumberModel(defMin,min,max,1));
maxSpinner = new JSpinner(new SpinnerNumberModel(defMax,min,max,1));
minSpinner.setBounds(50,20+offset,80,20);
maxSpinner.setBounds(190,20+offset,80,20);
minSpinner.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
fireUpdated(e.getSource());
}
});
maxSpinner.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
fireUpdated(e.getSource());
}
});
JLabel minLabel = new JLabel("Min");
minLabel.setBounds(10,20+offset,40,20);
add(minLabel);
JLabel maxLabel = new JLabel("Max");
maxLabel.setBounds(150,20+offset,40,20);
add(maxLabel);
add(minSpinner);
add(maxSpinner);
setBorder(BorderFactory.createTitledBorder(name));
if (enablement) {
minSpinner.setEnabled(false);
maxSpinner.setEnabled(false);
}
}
/**
* @see org.newdawn.slick.tools.peditor.DefaultPanel#setEnabled(boolean)
*/
public void setEnabled(boolean e) {
enabled.setEnabled(e);
minSpinner.setEnabled(enabled.isSelected() || !enablement);
maxSpinner.setEnabled(enabled.isSelected() || !enablement);
}
/**
* Force the state of this component
*
* @param e True if we want this component to be enabled
*/
public void setEnabledForced(boolean e)
{
enabled.setEnabled(e);
minSpinner.setEnabled(e);
maxSpinner.setEnabled(e);
}
/**
* Set the minimum value
*
* @param value The value to use as the lower bound
*/
public void setMin(int value) {
updateDisable = true;
minSpinner.setValue(new Integer(value));
updateDisable = false;
}
/**
* Set the maximum value
*
* @param value The value to use as the upper bound
*/
public void setMax(int value) {
updateDisable = true;
maxSpinner.setValue(new Integer(value));
updateDisable = false;
}
/**
* Add a listener to be notified of changes
*
* @param listener The listener to be notified of changes
*/
public void addListener(InputPanelListener listener) {
listeners.add(listener);
}
/**
* Get the offset on the y axis for layout
*
* @return The offset on the y axis for layout
*/
public int getOffset() {
return enablement ? 65 : 45;
}
/**
* Notify listeners a change has occured on this panel
*
* @param source The source of this event
*/
void fireUpdated(Object source) {
if (updateDisable) {
return;
}
if (source == maxSpinner) {
if (getMax() < getMin()) {
setMin(getMax());
}
}
if (source == minSpinner) {
if (getMax() < getMin()) {
setMax(getMin());
}
}
for (int i=0;i<listeners.size();i++) {
((InputPanelListener) listeners.get(i)).minMaxUpdated(this);
}
}
/**
* Check if this panel is enabled
*
* @return True if this panel is enabeld
*/
public boolean getEnabled() {
return !enablement || enabled.isSelected();
}
/**
* Indicate if this panel should be enabled
*
* @param e True if this panel option should be enabled
*/
public void setEnabledValue(boolean e) {
if (enablement) {
enabled.setSelected(e);
}
minSpinner.setEnabled(enabled.isSelected() || !enablement);
maxSpinner.setEnabled(enabled.isSelected() || !enablement);
}
/**
* Get the defined upper bound
*
* @return The defined upper bound
*/
public int getMax() {
if ((enablement) && (!enabled.isSelected())) {
return offValue;
}
return ((Integer) maxSpinner.getValue()).intValue();
}
/**
* Get the defined lower bound
*
* @return The defined lower bound
*/
public int getMin() {
if ((enablement) && (!enabled.isSelected())) {
return offValue;
}
return ((Integer) minSpinner.getValue()).intValue();
}
}