package icy.gui.component;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.geom.Rectangle2D;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import icy.gui.component.NumberTextField.ValueChangeListener;
/**
* Component letting user to define a range (RangeSlider + 2 inputs fields)
*
* @author Stephane
*/
public class Region2DComponent extends JPanel implements ValueChangeListener
{
protected NumberTextField xStartField;
protected NumberTextField yStartField;
protected NumberTextField widthField;
protected NumberTextField heightField;
public Region2DComponent(double x, double y, double w, double h, boolean integer)
{
super();
initialize();
yStartField.setInteger(integer);
widthField.setInteger(integer);
heightField.setInteger(integer);
xStartField.setNumericValue(x);
yStartField.setNumericValue(y);
widthField.setNumericValue(w);
heightField.setNumericValue(h);
}
public Region2DComponent(double x, double y, double w, double h)
{
this(x, y, w, h, false);
}
public Region2DComponent(boolean integer)
{
this(0d, 0d, 100d, 100d, integer);
}
public Region2DComponent()
{
this(0d, 0d, 100d, 100d, false);
}
protected void initialize()
{
GridBagLayout gridBagLayout = new GridBagLayout();
gridBagLayout.columnWidths = new int[] {40, 40, 0, 40, 40, 0};
gridBagLayout.rowHeights = new int[] {0, 0};
gridBagLayout.columnWeights = new double[] {1.0, 1.0, 0.0, 1.0, 1.0, Double.MIN_VALUE};
gridBagLayout.rowWeights = new double[] {0.0, Double.MIN_VALUE};
setLayout(gridBagLayout);
xStartField = new NumberTextField();
xStartField.setToolTipText("Start X position of the region");
xStartField.addValueListener(this);
GridBagConstraints gbc_xStartField = new GridBagConstraints();
gbc_xStartField.fill = GridBagConstraints.BOTH;
gbc_xStartField.insets = new Insets(0, 0, 0, 5);
gbc_xStartField.gridx = 0;
gbc_xStartField.gridy = 0;
add(xStartField, gbc_xStartField);
yStartField = new NumberTextField();
yStartField.setToolTipText("Start Y position of the region");
yStartField.addValueListener(this);
GridBagConstraints gbc_yStartField = new GridBagConstraints();
gbc_yStartField.fill = GridBagConstraints.BOTH;
gbc_yStartField.insets = new Insets(0, 0, 0, 5);
gbc_yStartField.gridx = 1;
gbc_yStartField.gridy = 0;
add(yStartField, gbc_yStartField);
heightField = new NumberTextField();
heightField.setToolTipText("Height of the region");
heightField.addValueListener(this);
widthField = new NumberTextField();
widthField.setToolTipText("Width of the region");
widthField.addValueListener(this);
JLabel sepLabel = new JLabel("-");
GridBagConstraints gbc_sepLabel = new GridBagConstraints();
gbc_sepLabel.fill = GridBagConstraints.VERTICAL;
gbc_sepLabel.insets = new Insets(0, 0, 0, 5);
gbc_sepLabel.gridx = 2;
gbc_sepLabel.gridy = 0;
add(sepLabel, gbc_sepLabel);
GridBagConstraints gbc_widthField = new GridBagConstraints();
gbc_widthField.fill = GridBagConstraints.BOTH;
gbc_widthField.insets = new Insets(0, 0, 0, 5);
gbc_widthField.gridx = 3;
gbc_widthField.gridy = 0;
add(widthField, gbc_widthField);
GridBagConstraints gbc_heightField = new GridBagConstraints();
gbc_heightField.fill = GridBagConstraints.BOTH;
gbc_heightField.gridx = 4;
gbc_heightField.gridy = 0;
add(heightField, gbc_heightField);
validate();
}
/**
* Set 2D region values.
*/
public void setRegion(double x, double y, double w, double h)
{
xStartField.setNumericValue(x);
yStartField.setNumericValue(y);
widthField.setNumericValue(w);
heightField.setNumericValue(h);
}
/**
* Set 2D region values.
*/
public void setRegion(int x, int y, int w, int h)
{
xStartField.setNumericValue(x);
yStartField.setNumericValue(y);
widthField.setNumericValue(w);
heightField.setNumericValue(h);
}
/**
* Set 2D region values.
*/
public void setRegion(Rectangle region)
{
setRegion(region.x, region.y, region.width, region.height);
}
/**
* Get 2D region values.
*/
public Rectangle2D getRegion()
{
if (isInteger())
return new Rectangle((int) xStartField.getNumericValue(), (int) yStartField.getNumericValue(),
(int) widthField.getNumericValue(), (int) heightField.getNumericValue());
return new Rectangle2D.Double(xStartField.getNumericValue(), yStartField.getNumericValue(),
widthField.getNumericValue(), heightField.getNumericValue());
}
/**
* Return true if the range use integer number
*/
public boolean isInteger()
{
return xStartField.isInteger();
}
/**
* Return true if the range use integer number
*/
public void setInteger(boolean value)
{
xStartField.setInteger(value);
yStartField.setInteger(value);
widthField.setInteger(value);
heightField.setInteger(value);
}
@Override
public void setEnabled(boolean enabled)
{
xStartField.setEnabled(enabled);
yStartField.setEnabled(enabled);
widthField.setEnabled(enabled);
heightField.setEnabled(enabled);
super.setEnabled(enabled);
}
protected void fireChangedEvent()
{
final ChangeEvent event = new ChangeEvent(this);
for (ChangeListener listener : getListeners(ChangeListener.class))
listener.stateChanged(event);
}
public void addChangeListener(ChangeListener listener)
{
listenerList.add(ChangeListener.class, listener);
}
public void removeChangeListener(ChangeListener listener)
{
listenerList.remove(ChangeListener.class, listener);
}
@Override
public void valueChanged(double newValue, boolean validate)
{
if (validate)
fireChangedEvent();
}
}