/* * #%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.ui.app.heatmap.drawer.header; import org.gitools.heatmap.Heatmap; import org.gitools.heatmap.HeatmapDimension; import org.gitools.heatmap.decorator.Decoration; import org.gitools.heatmap.header.ColoredLabel; import org.gitools.heatmap.header.HeatmapColoredLabelsHeader; import org.gitools.heatmap.header.HeatmapDecoratorHeader; import org.gitools.heatmap.header.HeatmapHeader; import org.gitools.ui.app.heatmap.drawer.AbstractHeatmapHeaderDrawer; import org.gitools.ui.core.HeatmapPosition; import java.awt.*; import java.awt.geom.AffineTransform; import java.util.List; public class HeatmapColoredLabelsDrawer extends AbstractHeatmapHeaderDrawer<HeatmapColoredLabelsHeader> { public HeatmapColoredLabelsDrawer(Heatmap heatmap, HeatmapDimension heatmapDimension, HeatmapColoredLabelsHeader header) { super(heatmap, heatmapDimension, header); } public void draw(Graphics2D g, Rectangle box, Rectangle clip) { ColoredLabel precedingLabel = null; prepareDraw(g, box); Font previousFont = changeFont(g); HeatmapColoredLabelsHeader header = getHeader(); header.reset(); int firstIndex = firstVisibleIndex(box, clip); int lastIndex = lastVisibleIndex(box, clip); Decoration decoration = new Decoration(); int cellWidth = header.getSize(); int startGroupIndex = firstIndex; int endGroupIndex = firstIndex; int margin = header.getMargin(); while (startGroupIndex <= lastIndex) { ColoredLabel groupLabel = header.getColoredLabel(startGroupIndex); while (endGroupIndex < lastIndex && groupLabel.equals(header.getColoredLabel(endGroupIndex + 1)) && !isHighlightedIndex(endGroupIndex + 1) && !isHighlightedIndex(endGroupIndex)) { endGroupIndex++; } decoration.reset(); boolean highlighted = isHighlightedIndex(startGroupIndex); header.decorate(decoration, groupLabel, false); decoration.setRotate(true); int fullSize = getHeatmapDimension().getFullCellSize(); //gridSize = 0 (no grid) if same group int gridSize = ((getHeatmapDimension().getCellSize() > 2 && !highlighted && !isHighlightedIndex(endGroupIndex + 1) || getHeatmapDimension().getCellSize() > 2 && !groupLabel.equals(header.getColoredLabel(endGroupIndex + 1))) ? getHeatmapDimension().getGridSize() : 0); paintCell( decoration, header.getBackgroundColor(), gridSize, margin, (startGroupIndex * fullSize), cellWidth - margin, (fullSize * (endGroupIndex - startGroupIndex + 1)) - gridSize, g, box ); precedingLabel = groupLabel; startGroupIndex = endGroupIndex + 1; endGroupIndex = startGroupIndex; } g.setFont(previousFont); } @Override public HeatmapPosition getPosition(Point p) { int point = (isHorizontal() ? p.x : p.y); int index = getHeaderPosition(point); String identifier = getHeatmapDimension().getLabel(index); String label = getHeader().getColoredLabel(identifier).getValue(); return (isHorizontal() ? new HeatmapPosition(getHeatmap(), -1, index, label) : new HeatmapPosition(getHeatmap(), index, -1, label)); } private Font changeFont(Graphics2D g) { Font previousFont = g.getFont(); Font headerFont = getHeader().getLabelFont(); g.setFont(headerFont); AffineTransform fontAT = new AffineTransform(); g.setFont(getHeader().getLabelFont().deriveFont(fontAT)); return previousFont; } @Override public void drawHeaderLegend(Graphics2D g, Rectangle rect, HeatmapHeader oppositeHeatmapHeader) { if (oppositeHeatmapHeader instanceof HeatmapDecoratorHeader) { HeatmapDecoratorHeader decoratorHeader = (HeatmapDecoratorHeader) oppositeHeatmapHeader; int gridSize; int height; int width; int margin; int oppositeMargin; int y = isHorizontal() ? rect.y : rect.y + rect.height; int x = rect.x; List<String> annValues = decoratorHeader.getAnnotationLabels(); List<ColoredLabel> clusters = getHeader().getClusters(); gridSize = 1; oppositeMargin = decoratorHeader.getMargin(); margin = getHeader().getMargin(); height = (oppositeHeatmapHeader.getSize() - oppositeMargin - gridSize * annValues.size()) / annValues.size(); width = getHeader().getSize() - margin; for (String v : annValues) { int equal = v.indexOf("="); if (equal != -1) { v = v.substring(equal + 1).trim(); } for (ColoredLabel cl : clusters) { if (cl.getValue().equals(v)) { // paint g.setColor(cl.getColor()); if (isHorizontal()) { g.fillRect(x + oppositeMargin, y, height, width); x += gridSize + height; } else { y -= height; g.fillRect(x, y - oppositeMargin, width, height); y -= gridSize; } } } } } } }