/* ExportSignalWorker.java created 2008-01-27 * */ package org.signalml.app.worker.document; import static org.signalml.app.util.i18n.SvarogI18n._; import java.io.File; import java.io.IOException; import java.util.List; import javax.swing.SwingWorker; import org.apache.log4j.Logger; import org.signalml.app.document.signal.SignalDocument; import org.signalml.app.model.signal.SignalExportDescriptor; import org.signalml.app.view.common.dialogs.PleaseWaitDialog; import org.signalml.domain.signal.ExportFormatType; import org.signalml.domain.signal.MultichannelSampleProcessor; import org.signalml.domain.signal.SignalProcessingChain; import org.signalml.domain.signal.SignalWriterMonitor; import org.signalml.domain.signal.export.ISignalWriter; import org.signalml.domain.signal.export.eeglab.EEGLabSignalWriter; import org.signalml.domain.signal.filter.export.MultichannelSampleFilterForExport; import org.signalml.domain.signal.samplesource.MultichannelSampleSource; import org.signalml.math.iirdesigner.BadFilterParametersException; /** ExportSignalWorker * * * @author Michal Dobaczewski © 2007-2008 CC Otwarte Systemy Komputerowe Sp. z o.o. */ public class ExportSignalWorker extends SwingWorker<Void,Integer> implements SignalWriterMonitor { protected static final Logger logger = Logger.getLogger(ExportSignalWorker.class); private MultichannelSampleSource sampleSource; private File signalFile; private SignalExportDescriptor descriptor; private SignalDocument signalDocument; private PleaseWaitDialog pleaseWaitDialog; private volatile boolean requestingAbort; private volatile int processedSampleCount; public ExportSignalWorker(MultichannelSampleSource sampleSource, File signalFile, SignalExportDescriptor descriptor, PleaseWaitDialog pleaseWaitDialog) { this.sampleSource = sampleSource; this.signalFile = signalFile; this.descriptor = descriptor; this.pleaseWaitDialog = pleaseWaitDialog; } public ExportSignalWorker(MultichannelSampleSource sampleSource, File signalFile, SignalExportDescriptor descriptor, PleaseWaitDialog pleaseWaitDialog, SignalDocument signalDocument) { this.sampleSource = sampleSource; this.signalFile = signalFile; this.descriptor = descriptor; this.pleaseWaitDialog = pleaseWaitDialog; this.signalDocument = signalDocument; } @Override protected Void doInBackground() throws Exception { ExportFormatType formatType = descriptor.getFormatType(); ISignalWriter signalWriter = formatType.getSignalWriter(); if (formatType == ExportFormatType.EEGLab) { ((EEGLabSignalWriter) signalWriter).setSignalDocument(signalDocument); } prepareFilteredData(); pleaseWaitDialog.setActivity(_("exporting signal")); signalWriter.writeSignal(signalFile, sampleSource, descriptor, this); return null; } /** * Filters the data before exporting it. * @throws BadFilterParametersException * @throws IOException */ protected void prepareFilteredData() throws BadFilterParametersException, IOException { MultichannelSampleProcessor channelSubsetSampleSource = ((MultichannelSampleProcessor)sampleSource); SignalProcessingChain signalProcessingChain = ((SignalProcessingChain)channelSubsetSampleSource.getSource()); if (signalProcessingChain.getOutput() instanceof MultichannelSampleFilterForExport) { MultichannelSampleFilterForExport multichannelSampleFilterForExport = (MultichannelSampleFilterForExport) signalProcessingChain.getOutput(); multichannelSampleFilterForExport.setSignalWriterMonitor(this); pleaseWaitDialog.setActivity(_("filtering data")); int maximumSampleCount = signalProcessingChain.getSampleCount(0); pleaseWaitDialog.configureForDeterminate(0, maximumSampleCount, 0); multichannelSampleFilterForExport.prepareFilteredData(); } } public int getProcessedSampleCount() { return processedSampleCount; } @Override public void setProcessedSampleCount(int processedSampleCount) { if (this.processedSampleCount != processedSampleCount) { this.processedSampleCount = processedSampleCount; publish(processedSampleCount); } } public PleaseWaitDialog getPleaseWaitDialog() { synchronized (pleaseWaitDialog) { return pleaseWaitDialog; } } @Override protected void done() { if (pleaseWaitDialog != null) { pleaseWaitDialog.releaseIfOwnedBy(this); } } @Override protected void process(List<Integer> chunks) { if (pleaseWaitDialog != null && !chunks.isEmpty()) { synchronized (pleaseWaitDialog) { pleaseWaitDialog.setProgress((int) chunks.get(0)); } } } @Override public void abort() { synchronized (this) { requestingAbort = true; } } @Override public boolean isRequestingAbort() { return requestingAbort; } }