/* * #%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.header.HeatmapTextLabelsHeader; import org.gitools.ui.app.heatmap.drawer.AbstractHeatmapHeaderDrawer; import java.awt.*; import java.awt.font.LineMetrics; public class HeatmapTextLabelsDrawer extends AbstractHeatmapHeaderDrawer<HeatmapTextLabelsHeader> { public HeatmapTextLabelsDrawer(Heatmap heatmap, HeatmapDimension dimension, HeatmapTextLabelsHeader header) { super(heatmap, dimension, header); } @Override public void draw(Graphics2D g, Rectangle box, Rectangle clip) { HeatmapTextLabelsHeader header = getHeader(); final HeatmapDimension heatmapDimension = getHeatmapDimension(); g.setFont(header.getFont()); Color gridColor = header.getBackgroundColor(); int gridSize = (heatmapDimension.showGrid() ? heatmapDimension.getGridSize() : 0); int maxWidth = clip.width; int width = header.getSize(); int cellHeight = heatmapDimension.getCellSize(); int height = cellHeight + gridSize; width = width < maxWidth ? maxWidth : width; int clipStart = clip.y - box.y; int clipEnd = clipStart + clip.height; int count = heatmapDimension.size(); int start = (clipStart - height) / height; int end = (clipEnd + height - 1) / height; start = start > 0 ? start : 0; end = end < count ? end : count; LineMetrics lm = header.getFont().getLineMetrics("yÍ;|", g.getFontRenderContext()); float fontHeight = lm.getHeight(); float fontSize = g.getFont().getSize(); while (fontHeight > cellHeight && fontSize > 1) { fontSize--; g.setFont(g.getFont().deriveFont(fontSize)); lm = g.getFont().getLineMetrics("yÍ;|", g.getFontRenderContext()); fontHeight = lm.getHeight(); } float fontDesc = lm.getDescent(); int fontOffset = (int) Math.ceil(((fontHeight + cellHeight) / 2) - fontDesc); int x = box.x; int y = box.y + start * height; int padding = getHeader().getMargin(); for (int index = start; index < end; index++) { String label = getLabel(index); String matrixLabel = heatmapDimension.getLabel(index); Color bgColor = header.getBackgroundColor(); g.setColor(gridColor); g.fillRect(x, y + cellHeight, width, gridSize); g.setColor(bgColor); g.fillRect(x, y, width, cellHeight); g.setColor(header.getLabelColor()); if (label != null) { g.drawString(label, x + padding, y + fontOffset); } y += height; } } }