/*
* #%L
* gitools-utils
* %%
* 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.utils.colorscale;
import org.gitools.utils.color.Colors;
import org.gitools.utils.xml.adapter.ColorXmlAdapter;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import java.awt.*;
import java.util.ArrayList;
@XmlAccessorType(XmlAccessType.FIELD)
public abstract class NumericColorScale implements INumericColorScale, IColorScaleHtml {
@XmlJavaTypeAdapter(ColorXmlAdapter.class)
private Color notANumberColor;
@XmlJavaTypeAdapter(ColorXmlAdapter.class)
private Color posInfinityColor;
@XmlJavaTypeAdapter(ColorXmlAdapter.class)
private Color negInfinityColor;
@XmlJavaTypeAdapter(ColorXmlAdapter.class)
private Color emptyColor;
private ArrayList<ColorScaleRange> rangesList;
protected NumericColorScale() {
super();
rangesList = new ArrayList<>();
}
@Override
public Color valueColor(double value) {
Color color = limitsColor(value);
if (color != null) {
return color;
}
return colorOf(value);
}
protected abstract Color colorOf(double value);
protected abstract double[] getPoints();
public double getMinValue() {
return getPoints()[0];
}
public double getMaxValue() {
return getPoints()[getPoints().length - 1];
}
@Override
public String valueRGBHtmlColor(double value) {
Color color = valueColor(value);
return Colors.colorToRGBHtml(color);
}
@Override
public String valueHexHtmlColor(double value) {
Color color = valueColor(value);
return Colors.colorToHexHtml(color);
}
Color limitsColor(double value) {
if (Double.isNaN(value)) {
return getNotANumberColor();
}
return null;
}
Color getNotANumberColor() {
if (notANumberColor == null) {
return ColorConstants.notANumberColor;
}
return notANumberColor;
}
public Color getEmptyColor() {
if (emptyColor == null) {
return ColorConstants.emptyColor;
}
return emptyColor;
}
public void setEmptyColor(Color emptyColor) {
this.emptyColor = emptyColor;
}
public final ArrayList<ColorScaleRange> getScaleRanges() {
updateRangesList();
return rangesList;
}
protected ArrayList<ColorScaleRange> getInternalScaleRanges() {
if (rangesList == null) {
rangesList = new ArrayList<>();
}
return rangesList;
}
protected void updateRangesList() {
rangesList.clear();
double[] points = getPoints();
double min;
double max = Double.NaN;
for (int i = 0; i < points.length; i++) {
min = max;
max = points[i];
if (Double.isNaN(min)) {
continue;
}
Object leftLabel = (i == 1) ? min : "";
Object rightLabel = max;
ColorScaleRange range = new ColorScaleRange(min, max, (max - min));
range.setLeftLabel(leftLabel);
range.setRightLabel(rightLabel);
rangesList.add(range);
}
}
@Override
public boolean isOutsideRange(double value) {
return value < getMinValue() || value > getMaxValue();
}
}