package org.signalml.app.view.document.opensignal.elements; import static org.signalml.app.util.i18n.SvarogI18n._; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.List; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.JProgressBar; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.SwingWorker.StateValue; import javax.swing.border.TitledBorder; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import org.apache.log4j.Logger; import org.signalml.app.model.document.opensignal.ExperimentDescriptor; import org.signalml.app.model.document.opensignal.elements.ChooseExperimentTableModel; import org.signalml.app.view.common.components.panels.AbstractPanel; import org.signalml.app.worker.monitor.FindEEGExperimentsWorker; import org.signalml.plugin.export.view.AbstractSignalMLAction; public class ChooseExperimentPanel extends AbstractPanel implements ListSelectionListener { public static String EXPERIMENT_SELECTED_PROPERTY = "experimentSelectedProperty"; private static Logger logger = Logger.getLogger(ChooseExperimentPanel.class); private ChooseExperimentTable chooseExperimentTable; private ChooseExperimentTableModel chooseExperimentTableModel; private JButton refreshButton; private JButton cancelButton; private JTextArea logTextArea; private FindEEGExperimentsWorker worker; private JProgressBar progressBar; public ChooseExperimentPanel() { createInterface(); } protected void createInterface() { setTitledBorder(_("Choose experiment")); chooseExperimentTableModel = new ChooseExperimentTableModel(); chooseExperimentTable = new ChooseExperimentTable(chooseExperimentTableModel); chooseExperimentTable.getSelectionModel().addListSelectionListener(this); setLayout(new BorderLayout()); JScrollPane scrollPane = new JScrollPane(chooseExperimentTable); scrollPane.setPreferredSize(new Dimension(300, 200)); add(scrollPane, BorderLayout.CENTER); add(createBottomPanel(), BorderLayout.SOUTH); } protected JPanel createBottomPanel() { JPanel bottomPanel = new JPanel(new BorderLayout()); bottomPanel.add(createLogPanel(), BorderLayout.CENTER); bottomPanel.add(createButtonsPanel(), BorderLayout.NORTH); return bottomPanel; } protected JPanel createLogPanel() { JPanel logPanel = new JPanel(new BorderLayout()); logPanel.setBorder(new TitledBorder(_("Connection log"))); logPanel.add(new JScrollPane(getLogTextField()), BorderLayout.CENTER); return logPanel; } protected JPanel createButtonsPanel() { JPanel buttonsPanel = new JPanel(); buttonsPanel.setBorder(new TitledBorder("")); buttonsPanel.setLayout(new BoxLayout(buttonsPanel, BoxLayout.X_AXIS)); buttonsPanel.add(getProgressBar()); buttonsPanel.add(Box.createRigidArea(new Dimension(10, 0))); buttonsPanel.add(getRefreshButton()); buttonsPanel.add(Box.createRigidArea(new Dimension(5, 0))); buttonsPanel.add(getCancelButton()); return buttonsPanel; } public JButton getRefreshButton() { if (refreshButton == null) refreshButton = new JButton(new RefreshButtonAction()); return refreshButton; } protected JButton getCancelButton() { if (cancelButton == null) { cancelButton = new JButton(new CancelButtonAction()); cancelButton.setEnabled(false); } return cancelButton; } public JTextArea getLogTextField() { if (logTextArea == null) { logTextArea = new JTextArea(5, 10); logTextArea.setEditable(false); } return logTextArea; } public JProgressBar getProgressBar() { if(progressBar == null) { progressBar = new JProgressBar(); } return progressBar; } protected void fireExperimentSelected(ExperimentDescriptor experiment) { this.firePropertyChange(EXPERIMENT_SELECTED_PROPERTY, null, experiment); } @Override public void valueChanged(ListSelectionEvent e) { fireExperimentSelected(getSelectedExperiment()); } public ExperimentDescriptor getSelectedExperiment() { int selectedRow = chooseExperimentTable.getSelectedRow(); ExperimentDescriptor selectedExperiment; if (selectedRow == -1) selectedExperiment = null; else selectedExperiment = chooseExperimentTableModel.getExperiments().get(selectedRow); return selectedExperiment; } public void clearSelection() { chooseExperimentTable.clearSelection(); } /** * Deletes all experiments from this panel. */ public void clearExperiments() { if (chooseExperimentTableModel != null) chooseExperimentTableModel.clearExperiments(); getLogTextField().setText(""); } class RefreshButtonAction extends AbstractSignalMLAction implements PropertyChangeListener { private boolean executing = false; public RefreshButtonAction() { this.setText(_("Refresh")); } @Override public void actionPerformed(ActionEvent e) { synchronized (this) { //only one action should be executed at once. chooseExperimentTableModel.setExperiments(null); if (executing) return; executing = true; setEnabled(false); } worker = new FindEEGExperimentsWorker(); worker.addPropertyChangeListener(this); getProgressBar().setIndeterminate(true); getLogTextField().setText(""); chooseExperimentTableModel.clearExperiments(); getCancelButton().setEnabled(true); worker.execute(); } @Override public void propertyChange(PropertyChangeEvent evt) { if ((evt.getNewValue() instanceof StateValue) && ((StateValue) evt.getNewValue()) == StateValue.DONE) { executing = false; setEnabled(true); getCancelButton().setEnabled(false); getProgressBar().setIndeterminate(false); } else if (evt.getPropertyName().equals(FindEEGExperimentsWorker.WORKER_LOG_APPENDED_PROPERTY)) { logger.debug("Appending" + evt.getNewValue()); getLogTextField().append((String) evt.getNewValue()); } else if (evt.getPropertyName().equals(FindEEGExperimentsWorker.NEW_EXPERIMENTS_RECEIVED)) { List<ExperimentDescriptor> newExperiments = (List<ExperimentDescriptor>) evt.getNewValue(); chooseExperimentTableModel.addExperiments(newExperiments); } } } class CancelButtonAction extends AbstractSignalMLAction { private boolean executing = false; public CancelButtonAction() { this.setText(_("Cancel")); } @Override public void actionPerformed(ActionEvent arg0) { worker.cancel(true); } } }