/* TagComparisonDialog.java created 2007-11-14 * */ package org.signalml.app.view.tag.comparison; import static org.signalml.app.util.i18n.SvarogI18n._; import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.List; import javax.swing.DefaultComboBoxModel; import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.border.TitledBorder; import org.signalml.app.document.TagDocument; import org.signalml.app.document.signal.SignalDocument; import org.signalml.app.model.components.TableToTextExporter; import org.signalml.app.model.tag.TagComparisonDescriptor; import org.signalml.app.util.IconUtils; import org.signalml.app.view.tag.TagIconProducer; import org.signalml.app.view.workspace.ViewerFileChooser; import org.signalml.app.view.common.components.ResolvableComboBox; import org.signalml.app.view.common.dialogs.AbstractDialog; import org.signalml.domain.tag.TagComparisonResults; import org.signalml.domain.tag.TagDifferenceDetector; import org.signalml.exception.SanityCheckException; import org.signalml.plugin.export.SignalMLException; import org.signalml.util.SvarogConstants; /** TagComparisonDialog * * * @author Michal Dobaczewski © 2007-2008 CC Otwarte Systemy Komputerowe Sp. z o.o. */ public class TagComparisonDialog extends AbstractDialog { private static final long serialVersionUID = 1L; private SignalDocument currentSignalDocument; private TagIconProducer tagIconProducer; private TagDocument currentTopDocument; private TagDocument currentBottomDocument; private ResolvableComboBox topDocumentComboBox; private ResolvableComboBox bottomDocumentComboBox; private TagComparisonResultPanel resultPanel; private TagDifferenceDetector detector; private TableToTextExporter tableToTextExporter; private ViewerFileChooser fileChooser; public TagComparisonDialog() { super(); } public TagComparisonDialog(Window w, boolean isModal) { super(w, isModal); } @Override protected void initialize() { setTitle(_("Tag comparison")); setIconImage(IconUtils.loadClassPathImage("org/signalml/app/icon/comparetags.png")); setPreferredSize(SvarogConstants.MIN_ASSUMED_DESKTOP_SIZE); super.initialize(); topDocumentComboBox.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { TagDocument document = (TagDocument) topDocumentComboBox.getSelectedItem(); if (document != null) { currentTopDocument = document; updateResult(); } } }); bottomDocumentComboBox.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { TagDocument document = (TagDocument) bottomDocumentComboBox.getSelectedItem(); if (document != null) { currentBottomDocument = document; updateResult(); } } }); } @Override public JComponent createInterface() { topDocumentComboBox = new ResolvableComboBox(); bottomDocumentComboBox = new ResolvableComboBox(); JPanel topDocumentPanel = new JPanel(new BorderLayout()); topDocumentPanel.setBorder(new TitledBorder(_("First document"))); topDocumentPanel.add(topDocumentComboBox, BorderLayout.CENTER); JPanel bottomDocumentPanel = new JPanel(new BorderLayout()); bottomDocumentPanel.setBorder(new TitledBorder(_("Second document"))); bottomDocumentPanel.add(bottomDocumentComboBox, BorderLayout.CENTER); JPanel topPanel = new JPanel(new GridLayout(1,2,3,3)); topPanel.add(topDocumentPanel); topPanel.add(bottomDocumentPanel); resultPanel = new TagComparisonResultPanel(tableToTextExporter, fileChooser); JPanel interfacePanel = new JPanel(new BorderLayout()); interfacePanel.add(topPanel, BorderLayout.NORTH); interfacePanel.add(resultPanel, BorderLayout.CENTER); return interfacePanel; } @Override public void fillDialogFromModel(Object model) throws SignalMLException { TagComparisonDescriptor descriptor = (TagComparisonDescriptor) model; resultPanel.setTagIconProducer(descriptor.getTagIconProducer()); currentSignalDocument = descriptor.getSignalDocument(); if (currentSignalDocument == null) { throw new NullPointerException("No signal"); } List<TagDocument> tags = currentSignalDocument.getTagDocuments(); if (tags.size() < 2) { throw new SanityCheckException("Not enough tags on the signal"); } TagDocument[] tagArr = new TagDocument[tags.size()]; tags.toArray(tagArr); currentTopDocument = descriptor.getTopTagDocument(); currentBottomDocument = descriptor.getBottomTagDocument(); if (currentTopDocument == null) { currentTopDocument = tagArr[0]; if (currentTopDocument == currentBottomDocument) { currentTopDocument = tagArr[1]; } } else { if (!tags.contains(currentTopDocument)) { throw new SanityCheckException("Top tag not in the document"); } } if (currentBottomDocument == null) { currentBottomDocument = tagArr[1]; if (currentBottomDocument == currentTopDocument) { currentBottomDocument = tagArr[0]; } } else { if (!tags.contains(currentBottomDocument)) { throw new SanityCheckException("Top tag not in the document"); } } topDocumentComboBox.setModel(new DefaultComboBoxModel(tagArr)); topDocumentComboBox.setSelectedItem(currentTopDocument); bottomDocumentComboBox.setModel(new DefaultComboBoxModel(tagArr)); bottomDocumentComboBox.setSelectedItem(currentBottomDocument); updateResult(); } private void updateResult() { if (detector == null) { detector = new TagDifferenceDetector(); } // TODO maybe needs worker - if so the detector needs progress reporting TagComparisonResults results = detector.compare(currentTopDocument, currentBottomDocument); results.getParametersFromSampleSource(currentSignalDocument.getSampleSource(), currentSignalDocument.getMontage()); resultPanel.setResults(results); } @Override public void fillModelFromDialog(Object model) throws SignalMLException { TagComparisonDescriptor descriptor = (TagComparisonDescriptor) model; descriptor.setTopTagDocument(currentTopDocument); descriptor.setBottomTagDocument(currentBottomDocument); } @Override public boolean supportsModelClass(Class<?> clazz) { return TagComparisonDescriptor.class.isAssignableFrom(clazz); } @Override public boolean isCancellable() { return false; } public TagIconProducer getTagIconProducer() { return tagIconProducer; } public void setTagIconProducer(TagIconProducer tagIconProducer) { this.tagIconProducer = tagIconProducer; } public TableToTextExporter getTableToTextExporter() { return tableToTextExporter; } public void setTableToTextExporter(TableToTextExporter tableToTextExporter) { this.tableToTextExporter = tableToTextExporter; } public ViewerFileChooser getFileChooser() { return fileChooser; } public void setFileChooser(ViewerFileChooser fileChooser) { this.fileChooser = fileChooser; } }