package org.signalml.plugin.io; import java.awt.Color; import java.io.File; import java.io.IOException; import java.util.Collection; import java.util.LinkedList; import java.util.List; import java.util.TreeSet; import javax.swing.KeyStroke; import org.signalml.app.document.TagDocument; import org.signalml.domain.tag.StyledTagSet; import org.signalml.domain.tag.TagStyles; import org.signalml.exception.SanityCheckException; import org.signalml.plugin.data.io.PluginTagWriterConfig; import org.signalml.plugin.data.tag.IPluginTagDef; import org.signalml.plugin.data.tag.PluginTagDefRangeComparator; import org.signalml.plugin.data.tag.PluginTagGroup; import org.signalml.plugin.export.SignalMLException; import org.signalml.plugin.export.signal.SignalSelectionType; import org.signalml.plugin.export.signal.Tag; import org.signalml.plugin.export.signal.TagStyle; public class PluginTagWriter implements IPluginTagWriter { private final static Color FILL_COLOR = new Color(0xc0c0c0); private final static Color OUTLINE_COLOR = new Color(0x808080); private final File outputFile; private final PluginTagWriterConfig config; public PluginTagWriter(File outputFile, PluginTagWriterConfig config) { this.outputFile = outputFile; this.config = config; } @Override public void writeTags(Collection<PluginTagGroup> tags) throws IOException, SignalMLException { TagStyles styles = this.createStyles(tags); TreeSet<Tag> documentTags = new TreeSet<Tag>(this.createTags(tags, styles)); float pageSize = this.config.pageSize; float stretchFactor = -1; for (PluginTagGroup tagGroup : tags) { if (stretchFactor == -1) { stretchFactor = tagGroup.stretchFactor; } else { if (stretchFactor != tagGroup.stretchFactor) { throw new SanityCheckException( "Inconsistent stretchFactor " + tagGroup + " (should be: " + stretchFactor + " )"); } } } if (stretchFactor == -1) { stretchFactor = 1; } StyledTagSet tagSet = new StyledTagSet(styles, documentTags, pageSize, (int) (pageSize / stretchFactor)); TagDocument document = new TagDocument(tagSet); document.setBackingFile(this.outputFile); document.saveDocument(); } private TagStyles createStyles(Collection<PluginTagGroup> tags) { TagStyles styles = new TagStyles(); for (PluginTagGroup tagGroup : tags) { TagStyle style = new TagStyle( SignalSelectionType.typeByName(tagGroup.type.getName()), tagGroup.name, tagGroup.description, FILL_COLOR, OUTLINE_COLOR, 1, null, // solid this.createKeyStroke(tagGroup), false); styles.addStyle(style); } return styles; } private KeyStroke createKeyStroke(PluginTagGroup tagGroup) { String name = tagGroup.name; if (name == null) { return null; } else { return name.length() == 1 ? KeyStroke.getKeyStroke(name.charAt(0)) : KeyStroke.getKeyStroke("typed " + name); } } private Collection<Tag> createTags(Collection<PluginTagGroup> tags, TagStyles tagStyles) { List<Tag> l = new LinkedList<Tag>(); for (PluginTagGroup tagGroup : tags) { TagStyle style = tagStyles.getStyle(tagGroup.name); if (style == null) { style = TagStyle.getDefault(); } TreeSet<IPluginTagDef> sortedTags = new TreeSet<IPluginTagDef>( new PluginTagDefRangeComparator()); sortedTags.addAll(tagGroup.tags); for (IPluginTagDef tag : sortedTags) { l.add(new Tag(style, tag.getOffset(), tag.getLength(), tag .getChannel())); } } return l; } }