/*
* #%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 com.jgoodies.binding.beans.Model;
import org.gitools.heatmap.HeatmapDimension;
import org.gitools.heatmap.decorator.DetailsDecoration;
import org.gitools.utils.xml.adapter.ColorXmlAdapter;
import org.gitools.utils.xml.adapter.FontXmlAdapter;
import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import java.awt.*;
import java.util.List;
@XmlAccessorType(XmlAccessType.NONE)
@XmlSeeAlso({HeatmapColoredLabelsHeader.class, HeatmapDecoratorHeader.class, HeatmapTextLabelsHeader.class,
HierarchicalClusterHeatmapHeader.class})
public abstract class HeatmapHeader extends Model {
public static final String PROPERTY_TITLE = "title";
public static final String PROPERTY_SIZE = "size";
public static final String PROPERTY_VISIBLE = "visible";
public static final String PROPERTY_BACKGROUND_COLOR = "backgroundColor";
public static final String PROPERTY_MARGIN = "margin";
public static final String PROPERTY_LABEL_VISIBLE = "labelVisible";
public static final String PROPERTY_FONT = "labelFont";
public static final String PROPERTY_LABEL_ROTATED = "labelRotated";
public static final String PROPERTY_LABEL_COLOR = "labelColor";
public static final String PROPERTY_DESCRIPTION = "description";
public static final String PROPERTY_DESCRIPTION_URL = "descriptionUrl";
public static final String PROPERTY_VALUE_URL = "valueUrl";
public static final String PROPERTY_DECORATOR = "decorator";
@XmlElement
private String title;
@XmlElement
private String description;
@XmlElement(name = "description-link")
private String descriptionUrl;
@XmlElement(name = "value-link")
private String valueUrl;
@XmlElement
protected int size;
@XmlElement
private boolean visible;
@XmlJavaTypeAdapter(ColorXmlAdapter.class)
@XmlElement(name = "background-color")
protected Color backgroundColor;
@XmlElement
int margin;
@XmlElement(name = "label-visible")
protected boolean labelVisible;
@XmlJavaTypeAdapter(FontXmlAdapter.class)
protected Font font;
@XmlElement(name = "label-rotated")
protected boolean labelRotated;
@XmlElement(name = "annotation-pattern")
private String annotationPattern;
@XmlJavaTypeAdapter(ColorXmlAdapter.class)
@XmlElement(name = "label-color")
protected Color labelColor;
@XmlTransient
private boolean sortAscending = true;
public HeatmapHeader() {
}
public HeatmapHeader(HeatmapDimension heatmapDimension) {
this.heatmapDimension = heatmapDimension;
this.title = "";
this.size = 100;
this.visible = true;
this.backgroundColor = Color.WHITE;
font = new Font(Font.MONOSPACED, Font.PLAIN, 9);
margin = 5;
labelRotated = false;
labelVisible = false;
labelColor = Color.GRAY;
annotationPattern = null;
}
@XmlTransient
private HeatmapDimension heatmapDimension;
public HeatmapDimension getHeatmapDimension() {
return heatmapDimension;
}
public void setHeatmapDimension(HeatmapDimension dim) {
this.heatmapDimension = dim;
}
/**
* The title
*/
public String getTitle() {
return (title == null) ? "" : title;
}
/**
* The title
*/
public void setTitle(String title) {
String old = this.title;
this.title = title;
firePropertyChange(PROPERTY_TITLE, old, title);
}
/**
* The height/width
*/
public int getSize() {
return size;
}
/**
* The height/width
*/
public void setSize(int size) {
int old = this.size;
this.size = size;
firePropertyChange(PROPERTY_SIZE, old, size);
}
/**
* Wether the header is visible
*/
public boolean isVisible() {
return visible;
}
public void setVisible(boolean visible) {
boolean old = this.visible;
this.visible = visible;
firePropertyChange(PROPERTY_VISIBLE, old, visible);
}
public Color getBackgroundColor() {
return backgroundColor;
}
public void setBackgroundColor(Color color) {
Color old = this.backgroundColor;
this.backgroundColor = color;
firePropertyChange(PROPERTY_BACKGROUND_COLOR, old, color);
}
/* Color band margin */
public int getMargin() {
return margin;
}
/* Color band margin */
public void setMargin(int margin) {
int old = this.margin;
this.margin = margin;
firePropertyChange(PROPERTY_MARGIN, old, margin);
}
/**
* Whether to show labels of each value
*/
public void setLabelVisible(boolean labelVisible) {
boolean old = this.labelVisible;
this.labelVisible = labelVisible;
firePropertyChange(PROPERTY_LABEL_VISIBLE, old, labelVisible);
}
public boolean isLabelVisible() {
return this.labelVisible;
}
public Font getFont() {
return font;
}
public void setFont(Font font) {
this.font = font;
}
/**
* The font to use for labels
*/
public Font getLabelFont() {
return font;
}
/**
* The font to use for labels
*/
public void setLabelFont(Font font) {
Font old = this.font;
this.font = font;
firePropertyChange(PROPERTY_FONT, old, font);
}
/**
* If false the label is painted along the color band,
* otherwise the label is perpendicular to the color band
*/
public boolean isLabelRotated() {
return labelRotated;
}
/**
* If false the label is painted along the color band,
* otherwise the label is perpendicular to the color band
*/
public void setLabelRotated(boolean labelRotated) {
boolean old = this.labelRotated;
this.labelRotated = labelRotated;
firePropertyChange(PROPERTY_LABEL_ROTATED, old, labelRotated);
}
/**
* Label foreground color
*/
public Color getLabelColor() {
return labelColor;
}
/**
* Label foreground color
*/
public void setLabelColor(Color labelColor) {
Color old = this.labelColor;
this.labelColor = labelColor;
firePropertyChange(PROPERTY_LABEL_COLOR, old, labelColor);
}
public String getAnnotationPattern() {
return annotationPattern;
}
public String getSortAnnotationPattern() {
return getAnnotationPattern();
}
public void setAnnotationPattern(String annotationPattern) {
this.annotationPattern = annotationPattern;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
String old = this.description;
this.description = description;
firePropertyChange(PROPERTY_DESCRIPTION, old, description);
}
public String getDescriptionUrl() {
return descriptionUrl;
}
public void setDescriptionUrl(String descriptionUrl) {
String old = this.descriptionUrl;
this.descriptionUrl = descriptionUrl;
firePropertyChange(PROPERTY_DESCRIPTION_URL, old, descriptionUrl);
}
public String getValueUrl() {
return valueUrl;
}
public void setValueUrl(String valueUrl) {
String old = this.valueUrl;
this.valueUrl = valueUrl;
firePropertyChange(PROPERTY_VALUE_URL, old, valueUrl);
}
public void init(HeatmapDimension heatmapDimension) {
this.setHeatmapDimension(heatmapDimension);
}
public void populateDetails(List<DetailsDecoration> details, String identifier, boolean selected) {
}
public abstract Function<String, String> getIdentifierTransform();
/**
* Override this method if you want that the sort by label related to this header
* uses numeric sort.
*
* @return If the header contains numbers.
*/
public boolean isNumeric() {
return false;
}
public boolean isSortAscending() {
return sortAscending;
}
public void setSortAscending(boolean ascending) {
this.sortAscending = ascending;
}
public String deriveTitleFromPattern() {
String title = "";
title = annotationPattern.replaceAll("[{}$]", "");
return title;
}
public int getZoomStepSize() {
return 1;
}
}