package org.gitools.ui.app.fileimport.wizard.text; /* * #%L * gitools-ui-app * %% * Copyright (C) 2013 Biomedical Genomics Lab * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. * #L% */ import org.gitools.ui.app.fileimport.wizard.text.reader.FlatTextImporter; import org.gitools.ui.platform.dialog.MessageStatus; import org.gitools.ui.platform.icons.IconNames; import org.gitools.ui.platform.wizard.AbstractWizardPage; import org.gitools.utils.progressmonitor.NullProgressMonitor; import org.gitools.utils.readers.FileField; import org.gitools.utils.readers.FileHeader; import org.gitools.utils.readers.MatrixReaderProfile; import org.gitools.utils.readers.profile.Separator; import org.gitools.utils.readers.profile.TableReaderProfile; import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.List; import static org.gitools.utils.readers.profile.ReaderProfile.MATRIX; import static org.gitools.utils.readers.profile.ReaderProfile.TABLE; public class SelectDataLayoutPage extends AbstractWizardPage { private FlatTextImporter reader; private JPanel mainPanel; private JComboBox separatorCombo; private JRadioButton tableRadioButton; private JRadioButton matrixRadioButton; private JTextPane dataFormatTextPane; private JTextPane preview; private JScrollPane previewScrollPane; private DefaultComboBoxModel separatorsModel; public SelectDataLayoutPage(FlatTextImporter flatTextImporter) { this.reader = flatTextImporter; separatorsModel = new DefaultComboBoxModel(Separator.values()); separatorCombo.setModel(separatorsModel); separatorCombo.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { reader.getReaderProfile().setSeparator((Separator) separatorsModel.getSelectedItem()); updateParsing(true); } }); matrixRadioButton.setSelected(reader.getReaderProfile().getLayout().equals(MATRIX)); tableRadioButton.setSelected(reader.getReaderProfile().getLayout().equals(TABLE)); ActionListener layoutListener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (tableRadioButton.isSelected()) { reader.setReaderProfile(TableReaderProfile.fromProfile(reader.getReaderProfile())); } else if (matrixRadioButton.isSelected()) { reader.setReaderProfile(MatrixReaderProfile.fromProfile(reader.getReaderProfile())); } updateControls(false); } }; tableRadioButton.addActionListener(layoutListener); matrixRadioButton.addActionListener(layoutListener); dataFormatTextPane.setContentType("text/html"); setComplete(true); separatorsModel.setSelectedItem(reader.getReaderProfile().getSeparator()); } @Override public JComponent createControls() { return mainPanel; } @Override public void updateControls() { updateControls(true); } public void updateControls(boolean reloadPreview) { try { updateParsing(reloadPreview); if (tableRadioButton.isSelected()) { dataFormatTextPane.setText("<html><body>" + "<table><tr>" + "<td>" + "<img max-width=\"320px\" src=\"" + IconNames.DATA_FORMAT_TABLE.toString() + "\">" + "</td><td>" + "<b>Table layout:</b>Each line is a heatmap cell: Two fields describing Column and Row id." + "The other fields are data points</b>." + "</td>" + "</tr></table>" + "</body></html>"); } else if (matrixRadioButton.isSelected()) { dataFormatTextPane.setText("<html><body>" + "<table><tr>" + "<td>" + "<img max-width=\"300px\" src=\"" + IconNames.DATA_FORMAT_MATRIX.toString() + "\">" + "</td><td>" + "<b>Matrix layout</b>:The first row and column of the file are the Column and Row ids" + "</td>" + "</tr></table>" + "</body></html>"); } } catch (Exception e) { throw new RuntimeException(e); } } private void updateParsing(boolean reloadPreview) { if (!reloadPreview) { reader.loadHead(NullProgressMonitor.get()); } List<FileHeader> allHeaders = reader.getFileHeaders(); StringBuilder htmlTable = getHTMLTable(); preview.setText(htmlTable.toString()); preview.setCaretPosition(0); boolean matrix = matrixRadioButton.isSelected(); if (allHeaders.size() > 2 && !matrix || allHeaders.size() > 1 && matrix) { setComplete(true); setMessage(MessageStatus.INFO, "Select Data Layout."); } else { String message = "Only " + allHeaders.size() + " columns detected."; if (matrix) { message += " At least an id and a data columns needed"; } else { message += " At least a column id, row id and value column expected."; } setMessage(MessageStatus.ERROR, message); setComplete(false); } separatorsModel.setSelectedItem(reader.getReaderProfile().getSeparator()); } private StringBuilder getHTMLTable() { StringBuilder htmlTable = new StringBuilder(""); //header htmlTable.append("<html><head>"); htmlTable.append(PreviewHTMLs.CSS); htmlTable.append("</head><body><table><tr>"); int limit = 20; for (FileHeader header : reader.getFileHeaders()) { if (header.getPos() > limit) { break; } htmlTable.append("<th>" + header.getLabel() + "</th>"); } htmlTable.append("</tr>"); // preview boolean matrix = reader.getReaderProfile().getLayout().equals(MATRIX); for (List<FileField> line : reader.getPreview()) { htmlTable.append("<tr>"); for (FileField field : line) { if (field.getPos() > limit) { break; } String celltype = (matrix && field.getPos() == 0) ? "th" : "td"; htmlTable.append("<" + celltype + ">"); htmlTable.append(field.getLabel()); htmlTable.append("</" + celltype + ">"); } htmlTable.append("</tr>"); } //end htmlTable.append("</html></body></table"); return htmlTable; } public FlatTextImporter getReader() { return reader; } public void setReader(FlatTextImporter reader) { this.reader = reader; } }