/* * #%L * gitools-ui-app * %% * Copyright (C) 2013 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.dialog.filter; import org.gitools.api.matrix.MatrixDimensionKey; import org.gitools.heatmap.Heatmap; 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.event.DocumentEvent; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.*; import java.util.ArrayList; import java.util.List; public class StringAnnotationsFilterPage extends AbstractWizardPage { private final Heatmap hm; private String rowsPatt; private String colsPatt; public StringAnnotationsFilterPage(Heatmap hm, MatrixDimensionKey dimensionKey) { this.hm = hm; initComponents(); ActionListener dimChangedListener = new ActionListener() { @Override public void actionPerformed(ActionEvent ae) { dimChanged(); } }; rowsRb.addActionListener(dimChangedListener); colsRb.addActionListener(dimChangedListener); rowsPattBtn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent ae) { selectRowsPattern(); } }); colsPattBtn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent ae) { selectColsPattern(); } }); patterns.getDocument().addDocumentListener(new DocumentChangeListener() { @Override protected void update(DocumentEvent e) { saveBtn.setEnabled(patterns.getDocument().getLength() > 0); } }); rowsPatt = "${id}"; rowsPattFld.setText("id"); colsPatt = "${id}"; colsPattFld.setText("id"); setTitle("Filter by annotations"); setComplete(true); if (dimensionKey == MatrixDimensionKey.ROWS) { rowsRb.setSelected(true); colsRb.setSelected(false); } else { rowsRb.setSelected(false); colsRb.setSelected(true); } dimChanged(); } private void dimChanged() { boolean rs = rowsRb.isSelected(); rowsPattFld.setEnabled(rs); rowsPattBtn.setEnabled(rs); boolean cs = colsRb.isSelected(); colsPattFld.setEnabled(cs); colsPattBtn.setEnabled(cs); } 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(); } private void selectRowsPattern() { PatternSourcePage page = new PatternSourcePage(hm.getRows(), true); PageDialog dlg = new PageDialog(Application.get(), page); dlg.setVisible(true); if (dlg.isCancelled()) { return; } rowsPatt = page.getPattern(); rowsPattFld.setText(page.getPatternTitle()); } private void selectColsPattern() { PatternSourcePage page = new PatternSourcePage(hm.getColumns(), true); PageDialog dlg = new PageDialog(Application.get(), page); dlg.setVisible(true); if (dlg.isCancelled()) { return; } colsPatt = page.getPattern(); colsPattFld.setText(page.getPatternTitle()); } public MatrixDimensionKey getFilterDimension() { if (rowsRb.isSelected()) { return MatrixDimensionKey.ROWS; } else { return MatrixDimensionKey.COLUMNS; } } public String getPattern() { if (rowsRb.isSelected()) { return rowsPatt; } else { return colsPatt; } } public List<String> getValues() { List<String> values = new ArrayList<>(); 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); } return values; } public boolean isUseRegexChecked() { return useRegexCheck.isSelected(); } /** * This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { applyGroup = new javax.swing.ButtonGroup(); jLabel1 = new javax.swing.JLabel(); useRegexCheck = new javax.swing.JCheckBox(); jScrollPane1 = new javax.swing.JScrollPane(); patterns = new javax.swing.JTextArea(); jLabel3 = new javax.swing.JLabel(); loadBtn = new javax.swing.JButton(); rowsPattFld = new javax.swing.JTextField(); saveBtn = new javax.swing.JButton(); rowsPattBtn = new javax.swing.JButton(); colsPattFld = new javax.swing.JTextField(); colsPattBtn = new javax.swing.JButton(); rowsRb = new javax.swing.JRadioButton(); colsRb = new javax.swing.JRadioButton(); jScrollPane2 = new javax.swing.JScrollPane(); jTextArea1 = new javax.swing.JTextArea(); jLabel1.setText("Labels to include:"); useRegexCheck.setText("Use regular expressions"); patterns.setColumns(20); patterns.setRows(6); jScrollPane1.setViewportView(patterns); jLabel3.setFont(jLabel3.getFont().deriveFont(jLabel3.getFont().getSize() - 2f)); jLabel3.setText("One label or regular expression per line"); loadBtn.setText("Load..."); loadBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { loadBtnActionPerformed(evt); } }); rowsPattFld.setEditable(false); saveBtn.setText("Save..."); saveBtn.setEnabled(false); saveBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { saveBtnActionPerformed(evt); } }); rowsPattBtn.setText("Change..."); colsPattFld.setEditable(false); colsPattBtn.setText("Change..."); applyGroup.add(rowsRb); rowsRb.setSelected(true); rowsRb.setText("Rows"); applyGroup.add(colsRb); colsRb.setText("Columns"); jTextArea1.setEditable(false); jTextArea1.setColumns(20); jTextArea1.setRows(5); jTextArea1.setText("Regular Expression Examples:\nMatch all containg CV: .*CV.*\nMatch all ending with \"Brain\": .*-Brain$\nMatch all starting with \"ZNF\": ^ZNF.*\n"); jTextArea1.setFocusable(false); jTextArea1.setOpaque(false); jTextArea1.setRequestFocusEnabled(false); jScrollPane2.setViewportView(jTextArea1); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jScrollPane2) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(colsRb) .addComponent(rowsRb)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addComponent(rowsPattFld, javax.swing.GroupLayout.DEFAULT_SIZE, 341, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(rowsPattBtn)) .addGroup(layout.createSequentialGroup() .addComponent(colsPattFld, javax.swing.GroupLayout.DEFAULT_SIZE, 341, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(colsPattBtn)))) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jLabel1) .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 436, Short.MAX_VALUE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) .addComponent(saveBtn, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(loadBtn, javax.swing.GroupLayout.PREFERRED_SIZE, 78, javax.swing.GroupLayout.PREFERRED_SIZE))) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jLabel3) .addComponent(useRegexCheck)) .addGap(0, 0, Short.MAX_VALUE))) .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(rowsPattBtn) .addComponent(rowsRb) .addComponent(rowsPattFld, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(colsPattBtn) .addComponent(colsRb) .addComponent(colsPattFld, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(18, 18, 18) .addComponent(jLabel1) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(loadBtn) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(saveBtn)) .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 175, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jLabel3) .addGap(18, 18, 18) .addComponent(useRegexCheck) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); }// </editor-fold>//GEN-END:initComponents private void loadBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_loadBtnActionPerformed 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()); patterns.setText(readNamesFromFile(file)); } catch (IOException ex) { ExceptionGlassPane edlg = new ExceptionGlassPane(Application.get(), ex); edlg.setVisible(true); } }//GEN-LAST:event_loadBtnActionPerformed private void saveBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_saveBtnActionPerformed 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(patterns.getText()).append('\n'); bw.close(); } catch (Exception ex) { ExceptionGlassPane edlg = new ExceptionGlassPane(Application.get(), ex); edlg.setVisible(true); } }//GEN-LAST:event_saveBtnActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.ButtonGroup applyGroup; private javax.swing.JButton colsPattBtn; private javax.swing.JTextField colsPattFld; private javax.swing.JRadioButton colsRb; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel3; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JScrollPane jScrollPane2; private javax.swing.JTextArea jTextArea1; private javax.swing.JButton loadBtn; private javax.swing.JTextArea patterns; private javax.swing.JButton rowsPattBtn; private javax.swing.JTextField rowsPattFld; private javax.swing.JRadioButton rowsRb; private javax.swing.JButton saveBtn; private javax.swing.JCheckBox useRegexCheck; // End of variables declaration//GEN-END:variables }