/* WorkspaceSignal.java created 2007-12-15
*
*/
package org.signalml.app.config.workspace;
import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import javax.swing.SwingUtilities;
import multiplexer.jmx.client.ConnectException;
import org.apache.log4j.Logger;
import org.signalml.app.document.DocumentFlowIntegrator;
import org.signalml.app.document.FileBackedDocument;
import org.signalml.app.document.ManagedDocumentType;
import org.signalml.app.document.TagDocument;
import org.signalml.app.document.mrud.MRUDEntry;
import org.signalml.app.document.signal.RawSignalDocument;
import org.signalml.app.document.signal.RawSignalMRUDEntry;
import org.signalml.app.document.signal.SignalDocument;
import org.signalml.app.document.signal.SignalMLDocument;
import org.signalml.app.document.signal.SignalMLMRUDEntry;
import org.signalml.app.model.document.opensignal.SignalMLDescriptor;
import org.signalml.app.util.SnapToPageRunnable;
import org.signalml.app.view.common.components.LockableJSplitPane;
import org.signalml.app.view.signal.SignalPlot;
import org.signalml.app.view.signal.SignalView;
import org.signalml.codec.SignalMLCodec;
import org.signalml.domain.montage.Montage;
import org.signalml.plugin.export.SignalMLException;
import org.signalml.plugin.export.signal.Document;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import org.signalml.app.config.ZoomSignalSettings;
import org.signalml.app.config.preset.managers.EegSystemsPresetManager;
import org.signalml.domain.montage.system.EegSystem;
/** WorkspaceSignal
*
*
* @author Michal Dobaczewski © 2007-2008 CC Otwarte Systemy Komputerowe Sp. z o.o.
*/
@XStreamAlias("workspacesignal")
public class WorkspaceSignal extends WorkspaceDocument {
protected static final Logger logger = Logger.getLogger(WorkspaceSignal.class);
private double timeZoomFactor;
private double voltageZoomFactor;
private int pixelPerChannel;
private Montage montage;
private LinkedList<WorkspaceTag> tags = new LinkedList<WorkspaceTag>();
private WorkspaceTag activeTag;
private WorkspaceTag[] comparedTags;
private WorkspaceSignalPlot masterPlot;
private LinkedList<WorkspaceSignalPlot> clones = new LinkedList<WorkspaceSignalPlot>();
private WorkspaceSignalPlot activePlot;
private int splitPaneLocation;
private boolean snapToPageMode;
private ZoomSignalSettings zoomSignalSettings = new ZoomSignalSettings();
protected WorkspaceSignal() {
super();
}
public WorkspaceSignal(SignalDocument document) {
if (document instanceof SignalMLDocument) {
SignalMLDocument signalMLDocument = (SignalMLDocument) document;
SignalMLDescriptor descriptor = new SignalMLDescriptor(signalMLDocument);
SignalMLMRUDEntry mrud = new SignalMLMRUDEntry(ManagedDocumentType.SIGNAL, signalMLDocument.getClass(), ((FileBackedDocument) document).getBackingFile().getAbsolutePath(), descriptor);
mrud.setLastTimeOpened(new Date());
mrudEntry = mrud;
}
else if (document instanceof RawSignalDocument) {
RawSignalDocument rawSignalDocument = (RawSignalDocument) document;
RawSignalMRUDEntry mrud = new RawSignalMRUDEntry(ManagedDocumentType.SIGNAL, rawSignalDocument.getClass(), ((FileBackedDocument) document).getBackingFile().getAbsolutePath(), rawSignalDocument.getDescriptor());
mrud.setLastTimeOpened(new Date());
mrudEntry = mrud;
} else {
File backingFile = ((FileBackedDocument) document).getBackingFile();
if (backingFile != null)
mrudEntry = new MRUDEntry(ManagedDocumentType.SIGNAL, document.getClass(), backingFile.getAbsolutePath());
}
SignalView view = (SignalView) document.getDocumentView();
SignalPlot masterSignalPlot = view.getMasterPlot();
zoomSignalSettings = view.getZoomSignalTool().getSettings();
montage = document.getMontage();
timeZoomFactor = masterSignalPlot.getTimeZoomFactor();
voltageZoomFactor = masterSignalPlot.getVoltageZoomFactor();
pixelPerChannel = masterSignalPlot.getPixelPerChannel();
List<TagDocument> tagDocuments = document.getTagDocuments();
TagDocument[] comparedSignalTags = null;
if (view.isComparingTags()) {
comparedSignalTags = view.getComparedTags();
comparedTags = new WorkspaceTag[2];
}
for (TagDocument tagDocument : tagDocuments) {
File file = tagDocument.getBackingFile();
if (file == null) {
// no file, cannot save with workspace
continue;
}
WorkspaceTag tag = new WorkspaceTag(tagDocument);
tags.add(tag);
if (tagDocument == document.getActiveTag()) {
activeTag = tag;
}
if (comparedSignalTags != null) {
if (tagDocument == comparedSignalTags[0]) {
comparedTags[0] = tag;
}
else if (tagDocument == comparedSignalTags[1]) {
comparedTags[1] = tag;
}
}
}
masterPlot = new WorkspaceSignalPlot(masterSignalPlot);
SignalPlot activeSignalPlot = view.getActiveSignalPlot();
if (activeSignalPlot == masterSignalPlot) {
activePlot = masterPlot;
}
LinkedList<SignalPlot> plots = view.getPlots();
if (plots.size() > 1) {
Iterator<SignalPlot> it = plots.iterator();
SignalPlot slaveSignalPlot;
WorkspaceSignalPlot slavePlot;
it.next(); // skip the master
while (it.hasNext()) {
slaveSignalPlot = it.next();
slavePlot = new WorkspaceSignalPlot(slaveSignalPlot);
clones.add(slavePlot);
if (activeSignalPlot == slaveSignalPlot) {
activePlot = slavePlot;
}
}
}
LockableJSplitPane plotSplitPane = view.getPlotSplitPane();
splitPaneLocation = plotSplitPane.getDividerLocation();
snapToPageMode = view.isSnapToPageMode();
}
public void configureSignal(SignalDocument document, DocumentFlowIntegrator integrator, EegSystemsPresetManager eegSystemsPresetManager) throws IOException, SignalMLException, ConnectException {
SignalView view = (SignalView) document.getDocumentView();
SignalPlot masterSignalPlot = view.getMasterPlot();
if (zoomSignalSettings != null) {
view.getZoomSignalTool().setSettings(zoomSignalSettings);
}
if (eegSystemsPresetManager != null) {
String eegSystemName = montage.getEegSystemFullName();
EegSystem eegSystem = (EegSystem) eegSystemsPresetManager.getPresetByName(eegSystemName);
montage.setEegSystem(eegSystem);
}
if (montage != null) {
document.setMontage(montage);
}
masterSignalPlot.setTimeZoomFactor(timeZoomFactor);
masterSignalPlot.setVoltageZoomFactor(voltageZoomFactor);
masterSignalPlot.setPixelPerChannel(pixelPerChannel);
SignalPlot activeSignalPlot = null;
if (masterPlot != null) {
if (activePlot == masterPlot) {
activeSignalPlot = masterSignalPlot;
}
masterPlot.configurePlot(masterSignalPlot);
}
if (!clones.isEmpty()) {
boolean splitPaneConfigured = false;
SignalPlot slaveSignalPlot;
for (WorkspaceSignalPlot slavePlot : clones) {
slaveSignalPlot = view.addSlavePlot(masterSignalPlot);
if (!splitPaneConfigured) {
view.getPlotSplitPane().setDividerLocation(splitPaneLocation);
}
if (activePlot == slavePlot) {
activeSignalPlot = slaveSignalPlot;
}
slavePlot.configurePlot(slaveSignalPlot);
}
}
if (activeSignalPlot != null) {
view.setActivePlot(activeSignalPlot);
}
if (!tags.isEmpty()) {
integrator.getActionFocusManager().setActiveDocument(document);
TagDocument activeTagDocument = null;
TagDocument[] comparedTagDocuments = null;
for (WorkspaceTag tag : tags) {
Document tagDocument = integrator.openMRUDEntry(tag.getMrudEntry());
if (tagDocument == null || !(tagDocument instanceof TagDocument)) {
logger.warn("WARNING: not a tag");
return;
}
tag.configureTag((TagDocument) tagDocument);
if (tag == activeTag) {
activeTagDocument = (TagDocument) tagDocument;
}
if (comparedTags != null) {
if (comparedTagDocuments == null) {
comparedTagDocuments = new TagDocument[2];
}
if (tag == comparedTags[0]) {
comparedTagDocuments[0] = (TagDocument) tagDocument;
}
else if (tag == comparedTags[1]) {
comparedTagDocuments[1] = (TagDocument) tagDocument;
}
}
}
if (activeTagDocument != null) {
document.setActiveTag(activeTagDocument);
}
if (comparedTagDocuments != null) {
view.setComparedTags(comparedTagDocuments[0], comparedTagDocuments[1]);
}
}
// XXX this must be re-queued onto the event thread so that Swing has a chance to
// compose itself after the new view was created
// otherwise viewports will have no extent size and snap will fail
// change if you know a better solution
SwingUtilities.invokeLater(new SnapToPageRunnable(view, snapToPageMode));
}
}