/* * #%L * 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.heatmap.panel.settings.headers; import org.gitools.heatmap.header.HeatmapHeader; import org.gitools.matrix.filter.PatternFunction; import org.gitools.matrix.model.matrix.AnnotationMatrix; import org.gitools.ui.core.utils.DocumentChangeListener; import org.gitools.ui.platform.settings.AbstractSettingsSection; import org.gitools.utils.textpattern.TextPattern; import javax.swing.*; import javax.swing.event.DocumentEvent; import javax.swing.table.AbstractTableModel; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.TableCellRenderer; import java.awt.*; import java.util.HashMap; import java.util.List; import java.util.Map; public class ChangeAnnotationValueSection extends AbstractSettingsSection { private final HeatmapHeader heatmapHeader; private final List<String> selected; private final AnnotationMatrix annotations; private final PatternFunction patternFunction; private JPanel root; private JTable currentValuesTable; private JPanel changePanel; private Map<String, JTextField> inputMap; private boolean dirty; public ChangeAnnotationValueSection(final HeatmapHeader heatmapHeader, final List<String> selected) { super(); this.heatmapHeader = heatmapHeader; this.annotations = heatmapHeader.getHeatmapDimension().getAnnotations(); this.patternFunction = new PatternFunction(heatmapHeader.getAnnotationPattern(), annotations); this.selected = selected; this.dirty = false; inputMap = new HashMap<>(); changePanel.removeAll(); changePanel.setLayout(new GridLayout(0,2)); for (TextPattern.VariableToken variableToken : patternFunction.getPattern().getVariableTokens()) { addChangeInput(variableToken.getVariableName()); } heatmapHeader.getHeatmapDimension(); currentValuesTable.setRowSelectionAllowed(false); currentValuesTable.setModel(new AbstractTableModel() { String[] columns = {"Id", "Current annotation", "Changed"}; @Override public String getColumnName(int column) { return columns[column]; } @Override public int getRowCount() { return selected.size(); } @Override public int getColumnCount() { return 3; } @Override public Object getValueAt(int rowIndex, int columnIndex) { if (columnIndex == -1 || rowIndex == -1) { return null; } else if (columnIndex == 0) { return selected.get(rowIndex); } else if (columnIndex == 1) { try { return patternFunction.apply(selected.get(rowIndex)); } catch (NullPointerException e) { return ""; } } else if (columnIndex == 2){ return getNewValue(selected.get(rowIndex)); } return null; } }); DefaultTableCellRenderer renderer = new DefaultTableCellRenderer() { @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); if (column == 2 && !value.equals("")) { Object changedValue = currentValuesTable.getValueAt(row, column); Object oldValue = currentValuesTable.getValueAt(row, column - 1); if (!changedValue.equals(oldValue)) { c.setBackground(Color.YELLOW); } else { c.setBackground(Color.WHITE); } } return c; } }; currentValuesTable.getColumnModel().getColumn(2).setCellRenderer(renderer); } private String getNewValue(String id) { StringBuilder sb = new StringBuilder(); for (TextPattern.Token token : patternFunction.getPattern().getTokens()) { if (inputMap.containsKey(token.toString())) { sb.append(inputMap.get(token.toString()).getText()); } else { sb.append(token.toString()); } } return sb.toString(); } private void addChangeInput(String name) { changePanel.add(new JLabel("<html><body>Change <b>" + name + "</b> annotation to:</body></html>")); final JTextField input = new JTextField(""); input.getDocument().addDocumentListener(new DocumentChangeListener() { @Override protected void update(DocumentEvent e) { SwingUtilities.invokeLater(new Runnable() { public void run() { currentValuesTable.updateUI(); setDirty(input.getText().length() > 0); } }); } }); changePanel.add(input); inputMap.put(name, input); changePanel.revalidate(); changePanel.repaint(); } @Override public String getName() { return "Edit \"" + this.heatmapHeader.getTitle() + "\" annotation" ; } @Override public JPanel getPanel() { return root; } private void createUIComponents() { currentValuesTable = new JTable() { @Override public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { Component c = super.prepareRenderer(renderer, row, column); return c; } }; } public List<TextPattern.VariableToken> getAnnotationKeys() { return patternFunction.getPattern().getVariableTokens(); } public List<String> getSelected() { return selected; } public AnnotationMatrix getAnnotations() { return annotations; } public HeatmapHeader getHeatmapHeader() { return heatmapHeader; } public Map<String, String> getInputMap() { Map<String, String> m = new HashMap<>(); for (String key : inputMap.keySet()) { m.put(key, inputMap.get(key).getText()); } return m; } }