/* * #%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.impl; import org.gitools.utils.colorscale.ColorConstants; import org.gitools.utils.colorscale.ColorScalePoint; import org.gitools.utils.colorscale.ColorScaleRange; import org.gitools.utils.colorscale.NumericColorScale; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import java.awt.*; import java.util.ArrayList; import java.util.Arrays; @XmlAccessorType(XmlAccessType.FIELD) public class CategoricalColorScale extends NumericColorScale { private ColorScalePoint[] points; private boolean cagetoricalSpans = false; public CategoricalColorScale() { this(new double[]{1.0, 2.0}); } public CategoricalColorScale(double pointValues[]) { setValues(pointValues); } public void setValues(double[] pointValues) { Arrays.sort(pointValues); this.points = new ColorScalePoint[pointValues.length]; Color[] palette = generateColors(pointValues.length); for (int i = 0; i < pointValues.length; i++) { this.points[i] = new ColorScalePoint(pointValues[i], palette[i]); } updateRangesList(); } Color[] generateColors(int n) { Color[] cols = new Color[n]; if (n == 2) { cols[0] = ColorConstants.binaryMinColor; cols[1] = ColorConstants.binaryMaxColor; return cols; } else if (n == 3) { cols[0] = Color.BLUE; cols[1] = Color.green.darker(); cols[2] = Color.RED; return cols; } for (int i = 0; i < n; i++) { cols[i] = Color.getHSBColor((float) i / (float) n, 0.85f, 1.0f); } return cols; } public ColorScalePoint getColorScalePoint(double value) { for (ColorScalePoint p : points) { if (cagetoricalSpans) { if (p.getValue() >= value) { return p; } } else { if (p.getValue() == value) { return p; } } } return null; } @Override protected Color colorOf(double value) { Color c = super.getEmptyColor(); ColorScalePoint firstPoint = getMin(); for (ColorScalePoint p : points) { if (cagetoricalSpans) { if (p.getValue() >= value) { return p.getColor(); } } else { if (p.getValue() == value) { return p.getColor(); } } } return c; } @Override public double[] getPoints() { double[] pointValues = new double[points.length]; for (int i = 0; i < points.length; i++) pointValues[i] = points[i].getValue(); return pointValues; } public ColorScalePoint getMin() { return points[0]; } @Override public double getMinValue() { Double spectrum = points[points.length - 1].getValue() - points[0].getValue(); Double step = spectrum / (points.length - 1); return points[0].getValue() - step; } public ColorScalePoint getMax() { ColorScalePoint last = points[points.length - 1]; return last; } @Override public double getMaxValue() { return points[points.length - 1].getValue(); } public ColorScalePoint[] getPointObjects() { return this.points; } public void setPointObjects(ColorScalePoint[] points) { Arrays.sort(points); this.points = points; updateRangesList(); } @Override protected void updateRangesList() { ArrayList<ColorScaleRange> rangesList = getInternalScaleRanges(); rangesList.clear(); for (ColorScalePoint p : points) { ColorScaleRange r = new ColorScaleRange(p.getValue(), p.getValue(), 10); if (p.getName().equals("")) { r.setCenterLabel(p.getValue()); } else { r.setCenterLabel(p.getName()); } r.setType(ColorScaleRange.CONSTANT_TYPE); rangesList.add(r); if (p != points[points.length - 1]) { ColorScaleRange e = new ColorScaleRange(-1, -1, 1); e.setType(ColorScaleRange.EMPTY_TYPE); e.setBorderEnabled(false); rangesList.add(e); } } } }