/* * #%L * gitools-core * %% * 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.heatmap.header; import com.google.common.base.Function; import org.gitools.api.matrix.IAnnotations; import org.gitools.heatmap.HeatmapDimension; import org.gitools.heatmap.decorator.DetailsDecoration; import org.gitools.matrix.filter.AnnotationFunction; import org.gitools.matrix.filter.NoTransformFunction; import org.gitools.matrix.filter.PatternFunction; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import java.awt.*; import java.util.List; @XmlAccessorType(XmlAccessType.NONE) @XmlRootElement public class HeatmapTextLabelsHeader extends HeatmapHeader { private static final String LABEL_PATTERN_CHANGED = "labelPatternChanged"; public enum LabelSource { ID, ANNOTATION, PATTERN } @XmlElement(name = "label-source") private LabelSource labelSource; @XmlElement(name = "label-annotation") private String labelAnnotation; @XmlElement(name = "label-pattern") private String labelPattern; public HeatmapTextLabelsHeader() { this(null); } public HeatmapTextLabelsHeader(HeatmapDimension hdim) { super(hdim); size = 80; labelColor = Color.darkGray; backgroundColor = Color.WHITE; font = new Font(Font.SANS_SERIF, Font.PLAIN, 11); IAnnotations am = hdim != null ? hdim.getAnnotations() : null; if (am != null && am.getLabels().size() > 0) { labelSource = LabelSource.ANNOTATION; labelAnnotation = am.getLabels().iterator().next(); } else { labelSource = LabelSource.ID; labelAnnotation = ""; } labelPattern = "${id}"; } @Override public String getTitle() { StringBuilder sb = new StringBuilder(); switch (labelSource) { case ID: sb.append("ID"); break; case ANNOTATION: sb.append(labelAnnotation); break; case PATTERN: sb.append(labelPattern.replaceAll("[\\$\\{\\}]", "")); break; } return sb.toString(); } public Font getFont() { return font; } public void setFont(Font font) { Font old = this.font; this.font = font; firePropertyChange(PROPERTY_FONT, old, font); } public LabelSource getLabelSource() { return labelSource; } public void setLabelSource(LabelSource labelSource) { this.labelSource = labelSource; } public String getLabelAnnotation() { return labelAnnotation; } public void setLabelAnnotation(String labelAnnotation) { this.labelAnnotation = labelAnnotation; } public String getLabelPattern() { return labelPattern; } public void setLabelPattern(String pattern) { String old = this.labelPattern; this.labelPattern = pattern; firePropertyChange(LABEL_PATTERN_CHANGED, old, pattern); } @Override public String getAnnotationPattern() { if (labelSource == LabelSource.ID) { return getLabelPattern(); } return "${" + getLabelAnnotation() + "}"; } @Override public void populateDetails(List<DetailsDecoration> details, String identifier, boolean selected) { String value = (identifier == null ? "None" : getIdentifierTransform().apply(identifier)); DetailsDecoration decoration = new DetailsDecoration( getTitle(), getDescription(), getDescriptionUrl(), value, getValueUrl() ); decoration.setSelected(selected); decoration.setVisible(isVisible()); decoration.setReference(this); details.add(decoration); } private transient Function<String, String> transformFunction; public Function<String, String> getIdentifierTransform() { if (transformFunction == null) { switch (getLabelSource()) { case ANNOTATION: transformFunction = new AnnotationFunction(getLabelAnnotation(), getHeatmapDimension().getAnnotations()); break; case PATTERN: transformFunction = new PatternFunction(getLabelPattern(), getHeatmapDimension().getAnnotations()); break; default: transformFunction = new NoTransformFunction<>(); } } return transformFunction; } }