/* * #%L * org.gitools.ui.app * %% * Copyright (C) 2013 - 2014 Universitat Pompeu Fabra - Biomedical Genomics group * %% * 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% */ package org.gitools.ui.app.analysis.groupcomparison.wizard; import com.google.common.base.Predicate; import com.google.common.collect.Sets; import org.gitools.heatmap.HeatmapDimension; import org.gitools.matrix.filter.FilterByLabelPredicate; import org.gitools.matrix.filter.PatternFunction; import org.gitools.ui.core.Application; import org.gitools.ui.core.pages.common.PatternSourcePage; import org.gitools.ui.core.utils.DocumentChangeListener; import org.gitools.ui.core.utils.FileChooserUtils; import org.gitools.ui.platform.dialog.ExceptionGlassPane; import org.gitools.ui.platform.settings.Settings; import org.gitools.ui.platform.wizard.AbstractWizardPage; import org.gitools.ui.platform.wizard.PageDialog; import javax.swing.*; import javax.swing.event.DocumentEvent; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.*; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import static com.google.common.base.Predicates.in; import static com.google.common.base.Predicates.not; import static com.google.common.collect.Iterables.filter; import static com.google.common.collect.Iterables.transform; import static com.google.common.collect.Lists.newArrayList; public class DimensionGroupSelectPage extends AbstractWizardPage { private JTextField colsPattFld; private JPanel panel1; private JButton changeButton; private JTextArea textArea; private JButton pasteUnselectedButton; private JButton loadButton; private JButton saveButton; private JButton pasteSelectedButton; private JScrollPane scrollPane; private JPanel buttonPanel; private JTextField groupName; private final HeatmapDimension dimension; private String pattern; public DimensionGroupSelectPage(HeatmapDimension dimension, String groupName) { this.dimension = dimension; this.groupName.setText(groupName); setComplete(false); textArea.getDocument().addDocumentListener(new DocumentChangeListener() { @Override protected void update(DocumentEvent e) { saveButton.setEnabled(textArea.getDocument().getLength() > 0); setComplete(textArea.getDocument().getLength() > 0); } }); pattern = "${id}"; colsPattFld.setText("id"); setTitle("Group Comparison Analysis"); setMessage("Choose the two column groups to compare"); changeButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { selectColsPattern(); } }); loadButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { loadFromFile(); } }); saveButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { saveToFile(); } }); pasteSelectedButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { ArrayList<String> ids = getSelected(); setValues(ids, textArea); } }); pasteUnselectedButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { ArrayList<String> ids = getUnselected(); setValues(ids, textArea); } }); } public String getGroupName() { return (groupName.getText()); } private void saveToFile() { try { File file = FileChooserUtils.selectFile("Select file name ...", Settings.get().getLastFilterPath(), FileChooserUtils.MODE_SAVE).getFile(); if (file == null) { return; } Settings.get().setLastFilterPath(file.getParent()); BufferedWriter bw = new BufferedWriter(new FileWriter(file)); bw.append(textArea.getText()).append('\n'); bw.close(); } catch (Exception ex) { ExceptionGlassPane edlg = new ExceptionGlassPane(Application.get(), ex); edlg.setVisible(true); } } private void loadFromFile() { try { File file = FileChooserUtils.selectFile("Select the file containing values", Settings.get().getLastFilterPath(), FileChooserUtils.MODE_OPEN).getFile(); if (file == null) { return; } Settings.get().setLastFilterPath(file.getParent()); textArea.setText(readNamesFromFile(file)); } catch (IOException ex) { ExceptionGlassPane edlg = new ExceptionGlassPane(Application.get(), ex); edlg.setVisible(true); } } private void selectColsPattern() { PatternSourcePage page = new PatternSourcePage(dimension, true); PageDialog dlg = new PageDialog(Application.get(), page); dlg.setVisible(true); if (dlg.isCancelled()) { return; } pattern = page.getPattern(); colsPattFld.setText(page.getPatternTitle()); } public String getPattern() { return pattern; } private String readNamesFromFile(File file) throws IOException { BufferedReader br = new BufferedReader(new FileReader(file)); StringBuilder sb = new StringBuilder(); String line; while ((line = br.readLine()) != null) { line = line.trim(); if (!line.isEmpty()) { sb.append(line).append('\n'); } } return sb.toString(); } public Set<String> getGroup() { return getGroupIndices(textArea); } private Set<String> getGroupIndices(JTextArea patterns) { // Read pattern values Set<String> values = new HashSet<>(); StringReader sr = new StringReader(patterns.getText()); BufferedReader br = new BufferedReader(sr); String line; try { while ((line = br.readLine()) != null) { line = line.trim(); if (!line.isEmpty()) { values.add(line); } } } catch (IOException ex) { ExceptionGlassPane dlg = new ExceptionGlassPane(Application.get(), ex); dlg.setVisible(true); } // Filter identifiers Predicate<String> filter = new FilterByLabelPredicate( new PatternFunction(pattern, dimension.getAnnotations()), values, false); return Sets.newHashSet(filter(dimension, filter)); } private ArrayList<String> getSelected() { return newArrayList( transform( dimension.getSelected(), new PatternFunction(pattern, dimension.getAnnotations()) ) ); } private ArrayList<String> getUnselected() { return newArrayList( transform( filter(dimension, not(in(dimension.getSelected()))), new PatternFunction(pattern, dimension.getAnnotations()) ) ); } private void setValues(List<String> values, JTextArea patterns) { for (String value : values) { patterns.append(value + "\n"); } } @Override public JComponent createControls() { return panel1; } }