/*
* #%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;
import com.google.common.collect.Lists;
import org.gitools.api.matrix.IAnnotations;
import org.gitools.api.matrix.IMatrixDimension;
import org.gitools.api.matrix.MatrixDimensionKey;
import org.gitools.api.resource.ResourceReference;
import org.gitools.api.resource.adapter.ResourceReferenceXmlAdapter;
import org.gitools.heatmap.decorator.DetailsDecoration;
import org.gitools.heatmap.header.HeatmapHeader;
import org.gitools.matrix.model.matrix.AnnotationMatrix;
import org.gitools.utils.xml.adapter.ColorXmlAdapter;
import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import java.awt.*;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
@XmlAccessorType(XmlAccessType.FIELD)
public class HeatmapDimension extends AbstractMatrixViewDimension {
public static final String PROPERTY_GRID_COLOR = "gridColor";
public static final String PROPERTY_GRID_SIZE = "gridSize";
public static final String PROPERTY_CELL_SIZE = "cellSize";
public static final String PROPERTY_HEADERS = "headers";
public static final String PROPERTY_HIGHLIGHTED = "highlighted";
public static final String PROPERTY_SELECTED_HEADER = "selectedHeader";
@XmlJavaTypeAdapter(ResourceReferenceXmlAdapter.class)
private ResourceReference<AnnotationMatrix> annotations;
@XmlElementWrapper(name = "headers")
@XmlElement(name = "header")
private LinkedList<HeatmapHeader> headers;
@XmlElement(name = "grid-size")
private int gridSize;
@XmlJavaTypeAdapter(ColorXmlAdapter.class)
@XmlElement(name = "grid-color")
private Color gridColor;
@XmlElement(name = "cell-size")
private int cellSize;
@XmlTransient
private Set<String> highlightedLabels;
@XmlTransient
private Set<String> highlightedHeaders;
@XmlTransient
private HeatmapHeader selectedHeader;
@XmlTransient
private static Color highlightingColor;
public HeatmapDimension() {
this(null);
}
public HeatmapDimension(IMatrixDimension matrixDimension) {
super();
this.headers = new LinkedList<>();
this.gridSize = 1;
this.gridColor = Color.WHITE;
this.cellSize = 14;
this.highlightedLabels = new HashSet<>();
this.highlightedHeaders = new HashSet<>();
this.selectedHeader = null;
init(matrixDimension);
}
public void init(IMatrixDimension matrixDimension) {
super.init(matrixDimension);
if (matrixDimension == null) {
return;
}
if (this.annotations == null) {
this.annotations = new ResourceReference<>(matrixDimension.getId() + "-annotations", new AnnotationMatrix());
}
for (HeatmapHeader header : headers) {
header.init(this);
}
}
public int getCellSize() {
return cellSize;
}
public void setCellSize(int newValue) {
int oldValue = this.cellSize;
this.cellSize = newValue;
firePropertyChange(PROPERTY_CELL_SIZE, oldValue, newValue);
}
public List<HeatmapHeader> getHeaders() {
return headers;
}
public void updateHeaders() {
firePropertyChange(PROPERTY_HEADERS, null, null);
}
public void addHeader(HeatmapHeader header) {
if (header.getHeatmapDimension() == null) {
header.setHeatmapDimension(this);
}
headers.addFirst(header);
firePropertyChange(PROPERTY_HEADERS, null, headers);
}
public int getHeaderSize() {
int size = 0;
for (HeatmapHeader h : headers)
size += h.getSize();
return size;
}
public int getGridSize() {
return gridSize;
}
public void setGridSize(int gridSize) {
int old = this.gridSize;
this.gridSize = gridSize;
firePropertyChange(PROPERTY_GRID_SIZE, old, gridSize);
}
public Color getGridColor() {
return gridColor;
}
public boolean showGrid() {
return getCellSize() > 4;
}
public int getFullCellSize() {
if (showGrid()) {
return getCellSize() + getGridSize();
}
return getCellSize();
}
public void setGridColor(Color gridColor) {
Color old = this.gridColor;
this.gridColor = gridColor;
firePropertyChange(PROPERTY_GRID_COLOR, old, gridColor);
}
public ResourceReference<AnnotationMatrix> getAnnotationsReference() {
return annotations;
}
public void setAnnotationsReference(ResourceReference<AnnotationMatrix> annotationsReference) {
this.annotations = annotationsReference;
}
public AnnotationMatrix getAnnotations() {
if (annotations == null) {
return null;
}
return annotations.get();
}
public void addAnnotations(IAnnotations annotations) {
this.annotations.get().addAnnotations(annotations);
}
public boolean isHighlighted(String label) {
return highlightedLabels.contains(label);
}
public void setHighlightedLabels(Set<String> highlightedLabels) {
this.highlightedLabels = highlightedLabels;
firePropertyChange(PROPERTY_HIGHLIGHTED, null, highlightedLabels);
}
public void clearHighlightedLabels() {
highlightedLabels.clear();
firePropertyChange(PROPERTY_HIGHLIGHTED, null, highlightedLabels);
}
public Set<String> getHighlightedHeaders() {
return highlightedHeaders;
}
public void setHighlightedHeaders(Set<String> highlightedHeaders) {
this.highlightedHeaders = highlightedHeaders;
firePropertyChange(PROPERTY_HIGHLIGHTED, null, highlightedLabels);
}
public void clearHighlightedHeaders() {
this.highlightedHeaders.clear();
firePropertyChange(PROPERTY_HIGHLIGHTED, null, highlightedLabels);
}
public void populateDetails(List<DetailsDecoration> details) {
Iterable<HeatmapHeader> itHeaders = headers;
if (getId() == MatrixDimensionKey.COLUMNS) {
itHeaders = Lists.reverse(headers);
}
for (HeatmapHeader header : itHeaders) {
header.populateDetails(details, getFocus(), getSelectedHeader() == header);
}
}
public void setHighlightingColor(Color highlightingColor) {
this.highlightingColor = highlightingColor;
firePropertyChange(PROPERTY_HIGHLIGHTED, null, highlightedLabels);
updateHeaders();
}
public Color getHighlightingColor() {
if (highlightingColor == null) {
return getDefaultHighlightColor();
}
return highlightingColor;
}
private static Color getDefaultHighlightColor() {
return new Color(254, 254, 0, 127);
}
public HeatmapHeader getSelectedHeader() {
if (selectedHeader == null) {
selectedHeader = headers.getFirst();
}
return selectedHeader;
}
public void setSelectedHeader(HeatmapHeader header) {
HeatmapHeader old = getSelectedHeader();
this.selectedHeader = header;
firePropertyChange(PROPERTY_SELECTED_HEADER, old, header);
}
public void resetHighlightColor() {
setHighlightingColor(getDefaultHighlightColor());
}
}