/* ArtifactTypesPanel.java created 2007-11-02 * */ package org.signalml.plugin.newartifact.ui; import static org.signalml.plugin.i18n.PluginI18n._; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.event.AdjustmentEvent; import java.awt.event.AdjustmentListener; import java.awt.event.FocusAdapter; import java.awt.event.FocusEvent; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import javax.swing.GroupLayout; import javax.swing.GroupLayout.Alignment; import javax.swing.GroupLayout.ParallelGroup; import javax.swing.JCheckBox; import javax.swing.JPanel; import javax.swing.JScrollBar; import javax.swing.JTextField; import javax.swing.SwingConstants; import javax.swing.border.CompoundBorder; import javax.swing.border.EmptyBorder; import javax.swing.border.TitledBorder; import org.signalml.plugin.newartifact.data.NewArtifactParameters; import org.signalml.plugin.newartifact.data.NewArtifactType; /** ArtifactTypesPanel * * * @author Michal Dobaczewski © 2007-2008 CC Otwarte Systemy Komputerowe Sp. z o.o. * (dialog design based on work by Hubert Klekowicz) */ public class NewArtifactTypesPanel extends JPanel { private static final long serialVersionUID = 1L; private static final int SCROLLBAR_SCALE = 10; private NewArtifactType[] artifactTypes = NewArtifactType.values(); private JTextField[] sensitivityTextFields; private JScrollBar[] sensitivityScrollBars; private JCheckBox[] artifactTypeCheckBoxes; public NewArtifactTypesPanel() { super(); initialize(); } private void initialize() { setLayout(new BorderLayout()); CompoundBorder border = new CompoundBorder( new TitledBorder(_("Artifact types & sensitivity")), new EmptyBorder(3,3,3,3) ); setBorder(border); JPanel typesPanel = new JPanel(); typesPanel.setBorder(new EmptyBorder(5,0,0,0)); GroupLayout layout = new GroupLayout(typesPanel); typesPanel.setLayout(layout); layout.setAutoCreateContainerGaps(false); layout.setAutoCreateGaps(true); GroupLayout.SequentialGroup hGroup = layout.createSequentialGroup(); GroupLayout.SequentialGroup vGroup = layout.createSequentialGroup(); ParallelGroup checkBoxParallelGroup = layout.createParallelGroup(); ParallelGroup textFieldParallelGroup = layout.createParallelGroup(); ParallelGroup scrollBarParallelGroup = layout.createParallelGroup(Alignment.TRAILING); JCheckBox[] checkBoxes = getArtifactTypeCheckBoxes(); JScrollBar[] scrollBars = getSensitivityScrollBars(); JTextField[] textFields = getSensitivityTextFields(); for (int i=0; i<artifactTypes.length; i++) { vGroup.addGroup( layout.createParallelGroup(Alignment.CENTER) .addComponent(checkBoxes[i]) .addComponent(textFields[i]) .addComponent(scrollBars[i]) ); checkBoxParallelGroup.addComponent(checkBoxes[i]); textFieldParallelGroup.addComponent(textFields[i]); scrollBarParallelGroup.addComponent(scrollBars[i]); checkBoxes[i].addItemListener(new CheckBoxListener(i)); textFields[i].addFocusListener(new TextFieldListener(i)); scrollBars[i].addAdjustmentListener(new ScrollBarListener(i)); } hGroup.addGroup(checkBoxParallelGroup); hGroup.addGroup(textFieldParallelGroup); hGroup.addGroup(scrollBarParallelGroup); layout.setHorizontalGroup(hGroup); layout.setVerticalGroup(vGroup); add(typesPanel, BorderLayout.CENTER); } public void fillPanelFromParameters(NewArtifactParameters parameters) { int[] chosenArtifactTypes = parameters.getChosenArtifactTypes(); float[] sensitivities = parameters.getSensitivities(); JCheckBox[] checkBoxes = getArtifactTypeCheckBoxes(); JScrollBar[] scrollBars = getSensitivityScrollBars(); JTextField[] textFields = getSensitivityTextFields(); for (int i=0; i<artifactTypes.length; i++) { textFields[i].setText(Float.toString(sensitivities[i])); scrollBars[i].setValue(Math.round(sensitivities[i]*SCROLLBAR_SCALE)); checkBoxes[i].setSelected(chosenArtifactTypes[i] != 0); } } // TODO no validation ? // not needed? The form enforces correct values? public void fillParametersFromPanel(NewArtifactParameters parameters) { int[] chosenArtifactTypes = parameters.getChosenArtifactTypes(); float[] sensitivities = parameters.getSensitivities(); JCheckBox[] checkBoxes = getArtifactTypeCheckBoxes(); JTextField[] textFields = getSensitivityTextFields(); for (int i=0; i<artifactTypes.length; i++) { chosenArtifactTypes[i] = (checkBoxes[i].isSelected() ? 1 : 0); sensitivities[i] = Float.parseFloat(textFields[i].getText()); } } public void setLockOnType(NewArtifactType type, boolean locked) { JCheckBox checkBox = getArtifactTypeCheckBoxes()[ type.ordinal()]; if (locked) { checkBox.setSelected(false); checkBox.setEnabled(false); } else { checkBox.setEnabled(true); } } public JTextField[] getSensitivityTextFields() { if (sensitivityTextFields == null) { sensitivityTextFields = new JTextField[artifactTypes.length]; Dimension size = new Dimension(60,25); for (int i=0; i<sensitivityTextFields.length; i++) { sensitivityTextFields[i] = new JTextField(); sensitivityTextFields[i].setPreferredSize(size); sensitivityTextFields[i].setHorizontalAlignment(SwingConstants.CENTER); sensitivityTextFields[i].setToolTipText("0 - 100"); sensitivityTextFields[i].setEnabled(false); } } return sensitivityTextFields; } public JScrollBar[] getSensitivityScrollBars() { if (sensitivityScrollBars == null) { sensitivityScrollBars = new JScrollBar[artifactTypes.length]; Dimension size = null; for (int i=0; i<sensitivityScrollBars.length; i++) { sensitivityScrollBars[i] = new JScrollBar(JScrollBar.HORIZONTAL, 0, 0, 0*SCROLLBAR_SCALE, 100*SCROLLBAR_SCALE); if (i == 0) { size = sensitivityScrollBars[i].getPreferredSize(); size.width = 200; } sensitivityScrollBars[i].setPreferredSize(size); sensitivityScrollBars[i].setBlockIncrement(SCROLLBAR_SCALE); sensitivityScrollBars[i].setUnitIncrement(1); sensitivityScrollBars[i].setEnabled(false); } } return sensitivityScrollBars; } public JCheckBox[] getArtifactTypeCheckBoxes() { if (artifactTypeCheckBoxes == null) { artifactTypeCheckBoxes = new JCheckBox[artifactTypes.length]; for (int i=0; i<artifactTypeCheckBoxes.length; i++) { artifactTypeCheckBoxes[i] = new JCheckBox(NewArtifactTypeCaptionHelper.GetCaption(artifactTypes[i])); } } return artifactTypeCheckBoxes; } private class CheckBoxListener implements ItemListener { private int index; private CheckBoxListener(int index) { this.index = index; } @Override public void itemStateChanged(ItemEvent e) { boolean selected = (e.getStateChange() == ItemEvent.SELECTED); getSensitivityScrollBars()[index].setEnabled(selected); getSensitivityTextFields()[index].setEnabled(selected); } } private class TextFieldListener extends FocusAdapter { private int index; private TextFieldListener(int index) { this.index = index; } @Override public void focusLost(FocusEvent e) { JTextField textField = getSensitivityTextFields()[index]; String text = textField.getText(); float value = -1; try { value = Float.parseFloat(text); } catch (NumberFormatException ex) { // do nothing, will cause value to remain at -1, which is detected later on } if (value > 100) { value = -1; } if (value < 0) { textField.setBackground(Color.RED.brighter()); return; } textField.setBackground(Color.WHITE); getSensitivityScrollBars()[index].setValue(Math.round(value*SCROLLBAR_SCALE)); } } private class ScrollBarListener implements AdjustmentListener { private int index; private ScrollBarListener(int index) { this.index = index; } @Override public void adjustmentValueChanged(AdjustmentEvent e) { float value = ((float) e.getValue()) / SCROLLBAR_SCALE ; JTextField textField = getSensitivityTextFields()[index]; textField.setText(Float.toString(value)); textField.setBackground(Color.WHITE); } } }