/*
* Copyright 2010-2015 Institut Pasteur.
*
* This file is part of Icy.
*
* Icy is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Icy is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Icy. If not, see <http://www.gnu.org/licenses/>.
*/
package icy.gui.sequence;
import icy.gui.component.IcyTextField;
import icy.gui.component.IcyTextField.TextChangeListener;
import icy.gui.component.NumberTextField;
import icy.gui.util.ComponentUtil;
import icy.math.UnitUtil;
import icy.math.UnitUtil.UnitPrefix;
import icy.sequence.Sequence;
import icy.util.StringUtil;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.concurrent.TimeUnit;
import javax.swing.BoxLayout;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.border.TitledBorder;
public class SequencePropertiesPanel extends JPanel
{
/**
*
*/
private static final long serialVersionUID = -1568878218022361239L;
private IcyTextField nameField;
NumberTextField tfPxSizeX;
NumberTextField tfPxSizeY;
private NumberTextField tfPxSizeZ;
private JComboBox cbPxSizeX;
JComboBox cbPxSizeY;
private JComboBox cbPxSizeZ;
private NumberTextField tfTimeInterval;
private JPanel panelChannels;
private IcyTextField[] tfsChannels;
private JLabel lblX;
private JLabel lblY;
private JLabel lblZ;
JCheckBox checkLinked;
private JComboBox cbTimeUnit;
private JLabel lblValue;
private JPanel panelPosition;
private NumberTextField positionXField;
private NumberTextField positionYField;
private NumberTextField positionZField;
private JComboBox posXUnitComboBox;
private JComboBox posYUnitComboBox;
private JComboBox posZUnitComboBox;
private JPanel panelPixelSize;
private JPanel panelTimeInterval;
/**
* Create the panel.
*/
public SequencePropertiesPanel()
{
super();
// set ComboBox model
final UnitPrefix[] upValues = UnitPrefix.values();
final String[] cbModel = new String[upValues.length];
for (int i = 0; i < upValues.length; ++i)
cbModel[i] = upValues[i].toString() + "m";
initialize(cbModel);
}
private void initialize(String[] cbModel)
{
setLayout(new BorderLayout(0, 0));
JPanel panelMain = new JPanel();
panelMain.setBorder(new EmptyBorder(4, 4, 0, 4));
add(panelMain, BorderLayout.NORTH);
panelMain.setLayout(new BoxLayout(panelMain, BoxLayout.Y_AXIS));
JPanel panelName = new JPanel();
panelName.setBorder(new TitledBorder(null, "Name", TitledBorder.LEADING, TitledBorder.TOP, null, null));
panelMain.add(panelName);
panelName.setLayout(new BoxLayout(panelName, BoxLayout.LINE_AXIS));
nameField = new IcyTextField();
nameField.setPreferredSize(new Dimension(200, 20));
nameField.setMinimumSize(new Dimension(80, 20));
panelName.add(nameField);
panelPixelSize = new JPanel();
panelPixelSize.setBorder(new TitledBorder(null, "Pixel Size", TitledBorder.LEADING, TitledBorder.TOP, null,
null));
panelMain.add(panelPixelSize);
GridBagLayout gbl_panelPixelSize = new GridBagLayout();
gbl_panelPixelSize.columnWidths = new int[] {60, 80, 40, 60, 0};
gbl_panelPixelSize.rowHeights = new int[] {0, 0, 0, 0};
gbl_panelPixelSize.columnWeights = new double[] {0.0, 1.0, 1.0, 1.0, Double.MIN_VALUE};
gbl_panelPixelSize.rowWeights = new double[] {0.0, 0.0, 0.0, Double.MIN_VALUE};
panelPixelSize.setLayout(gbl_panelPixelSize);
lblX = new JLabel("X");
GridBagConstraints gbc_lblX = new GridBagConstraints();
gbc_lblX.anchor = GridBagConstraints.WEST;
gbc_lblX.fill = GridBagConstraints.VERTICAL;
gbc_lblX.insets = new Insets(0, 0, 5, 5);
gbc_lblX.gridx = 0;
gbc_lblX.gridy = 0;
panelPixelSize.add(lblX, gbc_lblX);
tfPxSizeX = new NumberTextField();
tfPxSizeX.setColumns(4);
GridBagConstraints gbc_tfPxSizeX = new GridBagConstraints();
gbc_tfPxSizeX.fill = GridBagConstraints.BOTH;
gbc_tfPxSizeX.insets = new Insets(0, 0, 5, 5);
gbc_tfPxSizeX.gridx = 1;
gbc_tfPxSizeX.gridy = 0;
panelPixelSize.add(tfPxSizeX, gbc_tfPxSizeX);
tfPxSizeX.addTextChangeListener(new TextChangeListener()
{
@Override
public void textChanged(IcyTextField source, boolean validate)
{
if (checkLinked.isSelected())
tfPxSizeY.setText(tfPxSizeX.getText());
}
});
tfPxSizeX.setToolTipText("X pixel size");
cbPxSizeX = new JComboBox(cbModel);
GridBagConstraints gbc_cbPxSizeX = new GridBagConstraints();
gbc_cbPxSizeX.fill = GridBagConstraints.BOTH;
gbc_cbPxSizeX.insets = new Insets(0, 0, 5, 5);
gbc_cbPxSizeX.gridx = 2;
gbc_cbPxSizeX.gridy = 0;
panelPixelSize.add(cbPxSizeX, gbc_cbPxSizeX);
lblY = new JLabel("Y");
GridBagConstraints gbc_lblY = new GridBagConstraints();
gbc_lblY.anchor = GridBagConstraints.WEST;
gbc_lblY.fill = GridBagConstraints.VERTICAL;
gbc_lblY.insets = new Insets(0, 0, 5, 5);
gbc_lblY.gridx = 0;
gbc_lblY.gridy = 1;
panelPixelSize.add(lblY, gbc_lblY);
tfPxSizeY = new NumberTextField();
tfPxSizeY.setColumns(4);
GridBagConstraints gbc_tfPxSizeY = new GridBagConstraints();
gbc_tfPxSizeY.fill = GridBagConstraints.BOTH;
gbc_tfPxSizeY.insets = new Insets(0, 0, 5, 5);
gbc_tfPxSizeY.gridx = 1;
gbc_tfPxSizeY.gridy = 1;
panelPixelSize.add(tfPxSizeY, gbc_tfPxSizeY);
tfPxSizeY.setToolTipText("Y pixel size");
cbPxSizeY = new JComboBox(cbModel);
GridBagConstraints gbc_cbPxSizeY = new GridBagConstraints();
gbc_cbPxSizeY.fill = GridBagConstraints.BOTH;
gbc_cbPxSizeY.insets = new Insets(0, 0, 5, 5);
gbc_cbPxSizeY.gridx = 2;
gbc_cbPxSizeY.gridy = 1;
panelPixelSize.add(cbPxSizeY, gbc_cbPxSizeY);
checkLinked = new JCheckBox("link X/Y");
GridBagConstraints gbc_checkLinked = new GridBagConstraints();
gbc_checkLinked.anchor = GridBagConstraints.WEST;
gbc_checkLinked.fill = GridBagConstraints.VERTICAL;
gbc_checkLinked.insets = new Insets(0, 0, 5, 0);
gbc_checkLinked.gridx = 3;
gbc_checkLinked.gridy = 1;
panelPixelSize.add(checkLinked, gbc_checkLinked);
lblZ = new JLabel("Z");
GridBagConstraints gbc_lblZ = new GridBagConstraints();
gbc_lblZ.anchor = GridBagConstraints.WEST;
gbc_lblZ.fill = GridBagConstraints.VERTICAL;
gbc_lblZ.insets = new Insets(0, 0, 0, 5);
gbc_lblZ.gridx = 0;
gbc_lblZ.gridy = 2;
panelPixelSize.add(lblZ, gbc_lblZ);
tfPxSizeZ = new NumberTextField();
tfPxSizeZ.setColumns(4);
GridBagConstraints gbc_tfPxSizeZ = new GridBagConstraints();
gbc_tfPxSizeZ.fill = GridBagConstraints.BOTH;
gbc_tfPxSizeZ.insets = new Insets(0, 0, 0, 5);
gbc_tfPxSizeZ.gridx = 1;
gbc_tfPxSizeZ.gridy = 2;
panelPixelSize.add(tfPxSizeZ, gbc_tfPxSizeZ);
tfPxSizeZ.setToolTipText("Z pixel size");
cbPxSizeZ = new JComboBox(cbModel);
GridBagConstraints gbc_cbPxSizeZ = new GridBagConstraints();
gbc_cbPxSizeZ.fill = GridBagConstraints.BOTH;
gbc_cbPxSizeZ.insets = new Insets(0, 0, 0, 5);
gbc_cbPxSizeZ.gridx = 2;
gbc_cbPxSizeZ.gridy = 2;
panelPixelSize.add(cbPxSizeZ, gbc_cbPxSizeZ);
checkLinked.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent arg0)
{
if (checkLinked.isSelected())
{
tfPxSizeY.setEnabled(false);
tfPxSizeY.setText(tfPxSizeX.getText());
cbPxSizeY.setEnabled(false);
}
else
{
tfPxSizeY.setEnabled(true);
cbPxSizeY.setEnabled(true);
}
}
});
panelTimeInterval = new JPanel();
panelTimeInterval.setBorder(new TitledBorder(null, "Time Interval", TitledBorder.LEADING, TitledBorder.TOP,
null, null));
panelMain.add(panelTimeInterval);
GridBagLayout gbl_panelTimeInterval = new GridBagLayout();
gbl_panelTimeInterval.columnWidths = new int[] {60, 80, 40, 60, 0};
gbl_panelTimeInterval.rowHeights = new int[] {0, 0};
gbl_panelTimeInterval.columnWeights = new double[] {0.0, 1.0, 1.0, 1.0, Double.MIN_VALUE};
gbl_panelTimeInterval.rowWeights = new double[] {0.0, Double.MIN_VALUE};
panelTimeInterval.setLayout(gbl_panelTimeInterval);
lblValue = new JLabel("Value");
GridBagConstraints gbc_lblValue = new GridBagConstraints();
gbc_lblValue.anchor = GridBagConstraints.WEST;
gbc_lblValue.fill = GridBagConstraints.VERTICAL;
gbc_lblValue.insets = new Insets(0, 0, 0, 5);
gbc_lblValue.gridx = 0;
gbc_lblValue.gridy = 0;
panelTimeInterval.add(lblValue, gbc_lblValue);
tfTimeInterval = new NumberTextField();
tfTimeInterval.setColumns(4);
GridBagConstraints gbc_tfTimeInterval = new GridBagConstraints();
gbc_tfTimeInterval.fill = GridBagConstraints.BOTH;
gbc_tfTimeInterval.insets = new Insets(0, 0, 0, 5);
gbc_tfTimeInterval.gridx = 1;
gbc_tfTimeInterval.gridy = 0;
panelTimeInterval.add(tfTimeInterval, gbc_tfTimeInterval);
tfTimeInterval.setToolTipText("T time resolution");
cbTimeUnit = new JComboBox(new String[] {"h", "min", "s", "ms"});
GridBagConstraints gbc_cbTimeUnit = new GridBagConstraints();
gbc_cbTimeUnit.insets = new Insets(0, 0, 0, 5);
gbc_cbTimeUnit.fill = GridBagConstraints.BOTH;
gbc_cbTimeUnit.gridx = 2;
gbc_cbTimeUnit.gridy = 0;
panelTimeInterval.add(cbTimeUnit, gbc_cbTimeUnit);
cbTimeUnit.setSelectedIndex(2);
panelPosition = new JPanel();
panelPosition.setBorder(new TitledBorder(null, "Position", TitledBorder.LEADING, TitledBorder.TOP, null, null));
panelMain.add(panelPosition);
GridBagLayout gbl_panelPosition = new GridBagLayout();
gbl_panelPosition.columnWidths = new int[] {60, 80, 40, 60, 0};
gbl_panelPosition.rowHeights = new int[] {0, 0, 0, 0};
gbl_panelPosition.columnWeights = new double[] {0.0, 1.0, 1.0, 1.0, Double.MIN_VALUE};
gbl_panelPosition.rowWeights = new double[] {0.0, 0.0, 0.0, Double.MIN_VALUE};
panelPosition.setLayout(gbl_panelPosition);
JLabel lblX_1 = new JLabel("X");
GridBagConstraints gbc_lblX_1 = new GridBagConstraints();
gbc_lblX_1.fill = GridBagConstraints.VERTICAL;
gbc_lblX_1.insets = new Insets(0, 0, 5, 5);
gbc_lblX_1.anchor = GridBagConstraints.WEST;
gbc_lblX_1.gridx = 0;
gbc_lblX_1.gridy = 0;
panelPosition.add(lblX_1, gbc_lblX_1);
positionXField = new NumberTextField();
positionXField.setColumns(4);
positionXField.setToolTipText("Image position / offset X");
GridBagConstraints gbc_positionXfield = new GridBagConstraints();
gbc_positionXfield.insets = new Insets(0, 0, 5, 5);
gbc_positionXfield.fill = GridBagConstraints.BOTH;
gbc_positionXfield.gridx = 1;
gbc_positionXfield.gridy = 0;
panelPosition.add(positionXField, gbc_positionXfield);
posXUnitComboBox = new JComboBox(cbModel);
GridBagConstraints gbc_posXUnitComboBox = new GridBagConstraints();
gbc_posXUnitComboBox.insets = new Insets(0, 0, 5, 5);
gbc_posXUnitComboBox.fill = GridBagConstraints.BOTH;
gbc_posXUnitComboBox.gridx = 2;
gbc_posXUnitComboBox.gridy = 0;
panelPosition.add(posXUnitComboBox, gbc_posXUnitComboBox);
JLabel lblY_1 = new JLabel("Y");
GridBagConstraints gbc_lblY_1 = new GridBagConstraints();
gbc_lblY_1.fill = GridBagConstraints.VERTICAL;
gbc_lblY_1.anchor = GridBagConstraints.WEST;
gbc_lblY_1.insets = new Insets(0, 0, 5, 5);
gbc_lblY_1.gridx = 0;
gbc_lblY_1.gridy = 1;
panelPosition.add(lblY_1, gbc_lblY_1);
positionYField = new NumberTextField();
positionYField.setColumns(4);
positionYField.setToolTipText("Image position / offset Y");
GridBagConstraints gbc_positionYField = new GridBagConstraints();
gbc_positionYField.insets = new Insets(0, 0, 5, 5);
gbc_positionYField.fill = GridBagConstraints.BOTH;
gbc_positionYField.gridx = 1;
gbc_positionYField.gridy = 1;
panelPosition.add(positionYField, gbc_positionYField);
posYUnitComboBox = new JComboBox(cbModel);
GridBagConstraints gbc_posYUnitComboBox = new GridBagConstraints();
gbc_posYUnitComboBox.insets = new Insets(0, 0, 5, 5);
gbc_posYUnitComboBox.fill = GridBagConstraints.BOTH;
gbc_posYUnitComboBox.gridx = 2;
gbc_posYUnitComboBox.gridy = 1;
panelPosition.add(posYUnitComboBox, gbc_posYUnitComboBox);
JLabel lblZ_1 = new JLabel("Z");
GridBagConstraints gbc_lblZ_1 = new GridBagConstraints();
gbc_lblZ_1.fill = GridBagConstraints.VERTICAL;
gbc_lblZ_1.anchor = GridBagConstraints.WEST;
gbc_lblZ_1.insets = new Insets(0, 0, 0, 5);
gbc_lblZ_1.gridx = 0;
gbc_lblZ_1.gridy = 2;
panelPosition.add(lblZ_1, gbc_lblZ_1);
positionZField = new NumberTextField();
positionZField.setColumns(4);
positionZField.setToolTipText("Image position / offset Z");
GridBagConstraints gbc_positionZField = new GridBagConstraints();
gbc_positionZField.insets = new Insets(0, 0, 0, 5);
gbc_positionZField.fill = GridBagConstraints.BOTH;
gbc_positionZField.gridx = 1;
gbc_positionZField.gridy = 2;
panelPosition.add(positionZField, gbc_positionZField);
posZUnitComboBox = new JComboBox(cbModel);
GridBagConstraints gbc_posZUnitComboBox = new GridBagConstraints();
gbc_posZUnitComboBox.insets = new Insets(0, 0, 0, 5);
gbc_posZUnitComboBox.fill = GridBagConstraints.BOTH;
gbc_posZUnitComboBox.gridx = 2;
gbc_posZUnitComboBox.gridy = 2;
panelPosition.add(posZUnitComboBox, gbc_posZUnitComboBox);
panelChannels = new JPanel();
panelChannels.setBorder(new TitledBorder(null, "Channels", TitledBorder.LEADING, TitledBorder.TOP, null, null));
panelMain.add(panelChannels);
panelChannels.setLayout(new BoxLayout(panelChannels, BoxLayout.Y_AXIS));
}
public void setSequence(Sequence sequence)
{
// name
nameField.setText(sequence.getName());
// pixel size
final double pxSizeX = sequence.getPixelSizeX();
final double pxSizeY = sequence.getPixelSizeY();
final double pxSizeZ = sequence.getPixelSizeZ();
final UnitPrefix pxSizeXUnit = UnitUtil.getBestUnit(pxSizeX, UnitPrefix.MICRO);
final UnitPrefix pxSizeYUnit = UnitUtil.getBestUnit(pxSizeX, UnitPrefix.MICRO);
final UnitPrefix pxSizeZUnit = UnitUtil.getBestUnit(pxSizeX, UnitPrefix.MICRO);
cbPxSizeX.setSelectedItem(pxSizeXUnit.toString() + "m");
cbPxSizeY.setSelectedItem(pxSizeYUnit.toString() + "m");
cbPxSizeZ.setSelectedItem(pxSizeZUnit.toString() + "m");
tfPxSizeX.setText(StringUtil.toString(UnitUtil.getValueInUnit(pxSizeX, UnitPrefix.MICRO, pxSizeXUnit)));
tfPxSizeY.setText(StringUtil.toString(UnitUtil.getValueInUnit(pxSizeY, UnitPrefix.MICRO, pxSizeYUnit)));
tfPxSizeZ.setText(StringUtil.toString(UnitUtil.getValueInUnit(pxSizeZ, UnitPrefix.MICRO, pxSizeZUnit)));
if (tfPxSizeX.getText().equals(tfPxSizeY.getText())
&& cbPxSizeX.getSelectedIndex() == cbPxSizeY.getSelectedIndex())
{
checkLinked.doClick();
}
// get timeInterval in ms
double timeInterval = sequence.getTimeInterval() * 1000d;
TimeUnit unit = UnitUtil.getBestTimeUnit(timeInterval);
switch (unit)
{
case MILLISECONDS:
tfTimeInterval.setText(StringUtil.toString(timeInterval));
cbTimeUnit.setSelectedIndex(3);
break;
case SECONDS:
tfTimeInterval.setText(StringUtil.toString(timeInterval / 1000));
cbTimeUnit.setSelectedIndex(2);
break;
case MINUTES:
tfTimeInterval.setText(StringUtil.toString(timeInterval / 60000));
cbTimeUnit.setSelectedIndex(1);
break;
case HOURS:
tfTimeInterval.setText(StringUtil.toString(timeInterval / 3600000));
cbTimeUnit.setSelectedIndex(0);
break;
}
// position
final double posX = sequence.getPositionX();
final double posY = sequence.getPositionY();
final double posZ = sequence.getPositionZ();
final UnitPrefix posXUnit = UnitUtil.getBestUnit(posX, UnitPrefix.MICRO);
final UnitPrefix posYUnit = UnitUtil.getBestUnit(posY, UnitPrefix.MICRO);
final UnitPrefix posZUnit = UnitUtil.getBestUnit(posZ, UnitPrefix.MICRO);
posXUnitComboBox.setSelectedItem(posXUnit.toString() + "m");
posYUnitComboBox.setSelectedItem(posYUnit.toString() + "m");
posZUnitComboBox.setSelectedItem(posZUnit.toString() + "m");
positionXField.setText(StringUtil.toString(UnitUtil.getValueInUnit(posX, UnitPrefix.MICRO, posXUnit)));
positionYField.setText(StringUtil.toString(UnitUtil.getValueInUnit(posY, UnitPrefix.MICRO, posYUnit)));
positionZField.setText(StringUtil.toString(UnitUtil.getValueInUnit(posZ, UnitPrefix.MICRO, posZUnit)));
// channel name
final int sizeC = sequence.getSizeC();
panelChannels.removeAll();
tfsChannels = new IcyTextField[sizeC];
for (int c = 0; c < sizeC; c++)
{
final JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.LINE_AXIS));
final JLabel label = new JLabel("Channel " + c + " name");
label.setToolTipText("Channel " + c + " name");
ComponentUtil.setFixedWidth(label, 100);
final IcyTextField field = new IcyTextField();
field.setText(sequence.getChannelName(c));
panel.add(label);
panel.add(field);
tfsChannels[c] = field;
panelChannels.add(panel);
}
panelChannels.revalidate();
}
public String getNameFieldValue()
{
return nameField.getText();
}
public double getPixelSizeXFieldValue()
{
return tfPxSizeX.getNumericValue();
}
public UnitPrefix getPixelSizeXUnit()
{
return UnitPrefix.values()[cbPxSizeX.getSelectedIndex()];
}
public double getPixelSizeYFieldValue()
{
if (checkLinked.isSelected())
return tfPxSizeX.getNumericValue();
return tfPxSizeY.getNumericValue();
}
public UnitPrefix getPixelSizeYUnit()
{
if (checkLinked.isSelected())
return UnitPrefix.values()[cbPxSizeX.getSelectedIndex()];
return UnitPrefix.values()[cbPxSizeY.getSelectedIndex()];
}
public double getPixelSizeZFieldValue()
{
return tfPxSizeZ.getNumericValue();
}
public UnitPrefix getPixelSizeZUnit()
{
return UnitPrefix.values()[cbPxSizeZ.getSelectedIndex()];
}
public double getTimeIntervalFieldValue()
{
return tfTimeInterval.getNumericValue();
}
public int getTimeIntervalUnit()
{
return cbTimeUnit.getSelectedIndex();
}
public double getPositionXValue()
{
return positionXField.getNumericValue();
}
public UnitPrefix getPositionXUnit()
{
return UnitPrefix.values()[posXUnitComboBox.getSelectedIndex()];
}
public double getPositionYValue()
{
return positionYField.getNumericValue();
}
public UnitPrefix getPositionYUnit()
{
return UnitPrefix.values()[posYUnitComboBox.getSelectedIndex()];
}
public double getPositionZValue()
{
return positionZField.getNumericValue();
}
public UnitPrefix getPositionZUnit()
{
return UnitPrefix.values()[posZUnitComboBox.getSelectedIndex()];
}
public String getChannelNameFieldValue(int index)
{
return tfsChannels[index].getText();
}
}