/* ChooseFilesForMonitorRecordingPanel.java created 2010-11-03 * */ package org.signalml.app.view.document.monitor; import static org.signalml.app.util.i18n.SvarogI18n._; import java.awt.BorderLayout; import java.awt.Component; import java.awt.GridLayout; import java.awt.Panel; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.io.File; import javax.swing.JCheckBox; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.border.CompoundBorder; import javax.swing.border.EmptyBorder; import javax.swing.border.TitledBorder; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import org.signalml.app.model.components.validation.ValidationErrors; import org.signalml.app.model.document.opensignal.ExperimentDescriptor; import org.signalml.app.model.monitor.MonitorRecordingDescriptor; import org.signalml.app.view.common.components.filechooser.FileSelectPanel; /** * Represents a panel for selecting files used to record monitor. * * @author Piotr Szachewicz */ public class ChooseFilesForMonitorRecordingPanel extends JPanel implements DocumentListener { /** * A {@link FileSelectPanel} for selecting a signal recording target file * for a monitor recording. */ private FileSelectPanel selectSignalRecordingFilePanel; /** * A {@link FileSelectPanel} for selecting a tag recording target file * for a monitor recording. */ private FileSelectPanel selectTagsRecordingFilePanel; /** * A panel containing a {@link JCheckBox} allowing to enable/disable * the recording of tags (only signal is recorded then). */ private EnableTagRecordingPanel enableTagRecordingPanel; /** * Constructor. * * localized message codes */ public ChooseFilesForMonitorRecordingPanel() { super(); initialize(); } /** * Initializes this panel. */ private void initialize() { setLayout(new GridLayout(2, 1, 2, 2)); CompoundBorder border = new CompoundBorder( new TitledBorder(_("Choose files to which signal and tags will be recorded")), new EmptyBorder(3, 3, 3, 3)); setBorder(border); add(getSelectSignalRecordingFilePanel()); JPanel tagsRecordingPanel = new JPanel(new BorderLayout()); tagsRecordingPanel.add(getEnableTagRecordingPanel(), BorderLayout.WEST); tagsRecordingPanel.add(getSelectTagsRecordingFilePanel(), BorderLayout.CENTER); add(tagsRecordingPanel); } /** * Returns a {@link FileSelectPanel} allowing to select a signal recording * target file. * @return a {@link FileSelectPanel} for selecting signal recording target * file using this panel */ protected FileSelectPanel getSelectSignalRecordingFilePanel() { if (selectSignalRecordingFilePanel == null) { selectSignalRecordingFilePanel = new FileSelectPanel(_("Record signal to file")); selectSignalRecordingFilePanel.getFileNameField().getDocument().addDocumentListener(this); } return selectSignalRecordingFilePanel; } /** * Returns a {@link FileSelectPanel} allowing to select a tags recording * target file. * @return a {@link FileSelectPanel} for selecting tags recording target * file using this panel */ protected FileSelectPanel getSelectTagsRecordingFilePanel() { if (selectTagsRecordingFilePanel == null) { selectTagsRecordingFilePanel = new FileSelectPanel(_("Record tags to file")); selectTagsRecordingFilePanel.setEnabled(false); } return selectTagsRecordingFilePanel; } /** * Returns a {@link Panel} containing a {@link JCheckBox} allowing to * enable/disable tag recording (if tag recording is disabled, then only * signal is recorded). * @return a {@link Panel} for enabling/disabling tag recording */ protected EnableTagRecordingPanel getEnableTagRecordingPanel() { if (enableTagRecordingPanel == null) { enableTagRecordingPanel = new EnableTagRecordingPanel(); } return enableTagRecordingPanel; } /** * Fills the model with the data from this panel (user input). * @param model the model to be filled. */ public void fillModelFromPanel(Object model) { MonitorRecordingDescriptor monitorRecordingDescriptor = ((ExperimentDescriptor) model).getMonitorRecordingDescriptor(); monitorRecordingDescriptor.setSignalRecordingFilePath(getSelectSignalRecordingFilePanel().getFileName()); monitorRecordingDescriptor.setTagsRecordingFilePath(getSelectTagsRecordingFilePanel().getFileName()); monitorRecordingDescriptor.setTagsRecordingEnabled(getEnableTagRecordingPanel().isTagRecordingEnabled()); } public void fillPanelFromModel(Object model) { MonitorRecordingDescriptor monitorRecordingDescriptor = ((ExperimentDescriptor) model).getMonitorRecordingDescriptor(); getEnableTagRecordingPanel().setTagRecordingEnabled(monitorRecordingDescriptor.isTagsRecordingEnabled()); getSelectSignalRecordingFilePanel().setFileName(monitorRecordingDescriptor.getSignalRecordingFilePath()); getSelectTagsRecordingFilePanel().setFileName(monitorRecordingDescriptor.getTagsRecordingFilePath()); } /** * Sets this panel to be enabled or disabled. * @param enabled false to disable this panel, true otherwise */ @Override public void setEnabled(boolean enabled) { super.setEnabled(enabled); getSelectSignalRecordingFilePanel().setEnabled(enabled); if (!enabled) { getSelectTagsRecordingFilePanel().setEnabled(false); getEnableTagRecordingPanel().setEnabled(false); } else { getEnableTagRecordingPanel().setEnabled(true); getSelectTagsRecordingFilePanel().setEnabled(getEnableTagRecordingPanel().isTagRecordingEnabled()); } } /** * Resets the signal and tag recording filenames to empty strings. */ public void resetFileNames() { getSelectSignalRecordingFilePanel().setFileName(""); getSelectTagsRecordingFilePanel().setFileName(""); } /** * Checks if this panel is properly filled. * @param model the model for this panel * @param errors the object in which errors are stored */ public void validatePanel(Object model, ValidationErrors errors) { String recordingFileName = getSelectSignalRecordingFilePanel().getFileName(); String tagRecordingFileName = getSelectTagsRecordingFilePanel().getFileName(); if (recordingFileName.isEmpty()) { errors.addError(_("Please input a correct signal filename")); } else if ((new File(recordingFileName)).exists()) { int anwser = JOptionPane.showConfirmDialog(null, _("Signal recording target file already exists! Do you want to overwrite?")); if (anwser == JOptionPane.CANCEL_OPTION || anwser == JOptionPane.NO_OPTION) errors.addError(""); } if (getEnableTagRecordingPanel().isTagRecordingEnabled() && tagRecordingFileName.isEmpty()) { errors.addError(_("Please input a correct tag filename")); } else if (getEnableTagRecordingPanel().isTagRecordingEnabled() && (new File(tagRecordingFileName)).exists()) { int anwser = JOptionPane.showConfirmDialog(null, _("Tag recording target file already exists! Do you want to overwrite?")); if (anwser == JOptionPane.CANCEL_OPTION || anwser == JOptionPane.NO_OPTION) errors.addError(""); } } /** * Represents a panel that contains a checkbox to enable/disable tag recording. */ protected class EnableTagRecordingPanel extends JPanel { private JCheckBox enableTagRecordingCheckBox = null; /** * Constructor. Creates a new {@link DisableTagRecordingPanel}. */ public EnableTagRecordingPanel() { enableTagRecordingCheckBox = new JCheckBox(); enableTagRecordingCheckBox.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) { getSelectTagsRecordingFilePanel().setEnabled(true); } else if (e.getStateChange() == ItemEvent.DESELECTED) { getSelectTagsRecordingFilePanel().setEnabled(false); } } }); add(enableTagRecordingCheckBox); //add(new JLabel(_("Do not record tags"))); } /** * Sets this panel to be enabled or disabled. * @param enabled false to disable this panel, true otherwise */ @Override public void setEnabled(boolean enabled) { super.setEnabled(enabled); for (Component component : this.getComponents()) { component.setEnabled(enabled); } } /** * Returns whether tag recording was disabled using this panel. * @return true if tag recording was disabled, false otherwise */ public boolean isTagRecordingDisabled() { return !isTagRecordingEnabled(); } /** * Returns whether tag recording was enabled using this panel. * @return true if tag recording was enabled, false otherwise */ public boolean isTagRecordingEnabled() { return enableTagRecordingCheckBox.isSelected(); } /** * Sets the status of the tag recording checkbox. * @param enable true to disable tag recording, false otherwise */ public void setTagRecordingEnabled(boolean enable) { enableTagRecordingCheckBox.setSelected(enable); } } @Override public void insertUpdate(DocumentEvent e) { updateTagNameToFitSignalName(); } @Override public void removeUpdate(DocumentEvent e) { updateTagNameToFitSignalName(); } @Override public void changedUpdate(DocumentEvent e) { updateTagNameToFitSignalName(); } public void updateTagNameToFitSignalName() { String fileName = getSelectSignalRecordingFilePanel().getFileName(); getSelectTagsRecordingFilePanel().setFileName(fileName); } }