package org.signalml.app.action.tag; import static org.signalml.app.util.i18n.SvarogI18n._; import static org.signalml.app.util.i18n.SvarogI18n._R; import java.awt.event.ActionEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.InvalidClassException; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutionException; import javax.swing.SwingWorker.StateValue; import org.apache.log4j.Logger; import org.signalml.app.action.selector.TagDocumentFocusSelector; import org.signalml.app.document.signal.SignalDocument; import org.signalml.app.model.tag.SynchronizeTagsWithTriggerParameters; import org.signalml.app.view.common.dialogs.errors.Dialogs; import org.signalml.app.view.signal.SignalPlot; import org.signalml.app.view.tag.synchronize.SynchronizeTagsWithTriggerDialog; import org.signalml.app.worker.signal.FindSignalSlopesWorker; import org.signalml.app.worker.signal.SynchronizeTagsWithTriggerWorker; import org.signalml.domain.signal.samplesource.MultichannelSampleSource; /** * An action for synchronizing tags with a trigger channel. * * @author Piotr Szachewicz */ public class SynchronizeTagsWithTriggerAction extends TagDocumentModificationAction implements PropertyChangeListener { protected static final Logger logger = Logger.getLogger(SynchronizeTagsWithTriggerAction.class); private SynchronizeTagsWithTriggerParameters parameters; private SynchronizeTagsWithTriggerDialog synchronizeDialog; private FindSignalSlopesWorker findSlopesWorker; private SynchronizeTagsWithTriggerWorker synchronizeTagsWorker; public SynchronizeTagsWithTriggerAction(TagDocumentFocusSelector tagDocumentFocusSelector) { super(tagDocumentFocusSelector); setText(_("Synchronize tags with trigger")); } public SynchronizeTagsWithTriggerDialog getSynchronizeDialog() { if (synchronizeDialog == null) { synchronizeDialog = new SynchronizeTagsWithTriggerDialog(); } return synchronizeDialog; } @Override public void actionPerformed(ActionEvent e) { parameters = new SynchronizeTagsWithTriggerParameters(); SignalDocument signalDocument = getActionFocusSelector().getActiveSignalDocument(); try { SignalPlot masterPlot = signalDocument.getSignalView().getMasterPlot(); parameters.setSampleSource(masterPlot.getSignalOutput()); parameters.setTagSet(signalDocument.getActiveTag().getTagSet()); parameters.setChannelLabels(getChannelLabels(masterPlot.getSignalOutput())); } catch (InvalidClassException e1) { logger.error("", e1); Dialogs.showExceptionDialog(e1); return; } boolean showDialog = getSynchronizeDialog().showDialog(parameters, true); if (!showDialog) { return; } findSlopesWorker = new FindSignalSlopesWorker(parameters); findSlopesWorker.addPropertyChangeListener(this); findSlopesWorker.execute(); } @Override public void propertyChange(PropertyChangeEvent evt) { if (evt.getSource() == findSlopesWorker && evt.getNewValue() == StateValue.DONE) { Integer[] slopes; try { slopes = findSlopesWorker.get(); int tagCount = parameters.getTagSet().getTagCount(); synchronizeTagsWorker = new SynchronizeTagsWithTriggerWorker(parameters, slopes); synchronizeTagsWorker.execute(); synchronizeTagsWorker.get(); if (slopes.length < tagCount) { Dialogs.showWarningMessage(_R("There were more tags ({0}) than activating trigger slopes ({1}). Excessive tags have been removed!", tagCount, slopes.length)); } else if (slopes.length > tagCount) { Dialogs.showWarningMessage(_R("There were less tags ({0}) then activating trigger slopes ({1}).", tagCount, slopes.length)); } else { Dialogs.showMessage(_("Tags Synchronized"), _("Tags were successfully synchronized with the trigger channel.")); } } catch (InterruptedException e) { logger.error("", e); } catch (ExecutionException e) { logger.error("", e); } } } protected List<String> getChannelLabels(MultichannelSampleSource sampleSource) { List<String> channelLabels = new ArrayList<String>(); for (int i = 0; i < sampleSource.getChannelCount(); i++) { channelLabels.add(sampleSource.getLabel(i)); } return channelLabels; } }