/* * #%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 com.google.common.collect.Lists; import org.gitools.heatmap.Heatmap; import org.gitools.heatmap.HeatmapDimension; import org.gitools.heatmap.header.HeatmapColoredLabelsHeader; import org.gitools.heatmap.header.HierarchicalClusterHeatmapHeader; import org.gitools.ui.app.heatmap.drawer.AbstractHeatmapDrawer; import org.gitools.ui.app.heatmap.drawer.AbstractHeatmapHeaderDrawer; import org.gitools.ui.core.HeatmapPosition; import java.awt.*; import java.util.ArrayList; import java.util.List; public class HierarchicalClusterHeaderDrawer extends AbstractHeatmapHeaderDrawer<HierarchicalClusterHeatmapHeader> { private static final double radianAngle90 = (90.0 / 180.0) * Math.PI; List<HeatmapColoredLabelsDrawer> drawers; public HierarchicalClusterHeaderDrawer(Heatmap heatmap, HeatmapDimension heatmapDimension, HierarchicalClusterHeatmapHeader header) { super(heatmap, heatmapDimension, header); updateDrawers(); } public void draw(Graphics2D g, Rectangle box, Rectangle clip) { HeatmapColoredLabelsDrawer drawer; if (drawers.size() != getHeader().getClusterLevels().size()) { updateDrawers(); } int x = clip.x; int y = clip.y; for (HeatmapColoredLabelsHeader level : Lists.reverse(getHeader().getClusterLevels())) { if (!level.isVisible()) { continue; } int width = level.getSize(); drawer = drawers.get(getHeader().getClusterLevels().indexOf(level)); Rectangle subclip = new Rectangle(x, y, width, clip.height); Rectangle subbox = new Rectangle(x, box.y, width, box.height); drawer.draw(g, subbox, subclip); x += width; } } private void updateDrawers() { drawers = new ArrayList<>(); for (HeatmapColoredLabelsHeader levelHeader : getHeader().getClusterLevels()) { drawers.add(new HeatmapColoredLabelsDrawer(heatmap, getHeatmapDimension(), levelHeader)); } } @Override public HeatmapPosition getPosition(Point p) { int point = (isHorizontal() ? p.x : p.y); int drawerindex = getDrawerIndexFromPoint(p, 0, 0); int index = getHeaderPosition(point); String identifier = getHeatmapDimension().getLabel(index); String label = getHeader().getClusterLevels().get(drawerindex).getColoredLabel(identifier).getValue(); return (isHorizontal() ? new HeatmapPosition(getHeatmap(), -1, index, label) : new HeatmapPosition(getHeatmap(), index, -1, label)); } @Override public Dimension getSize() { Dimension oneDrawerSize = drawers.get(0).getSize(); int total = isHorizontal() ? (int) oneDrawerSize.getWidth() : (int) oneDrawerSize.getHeight(); Dimension d; if (isHorizontal()) { d = new Dimension(total, getHeader().getSize()); } else { d = new Dimension(getHeader().getSize(), total); } return d; } public int getDrawerIndexFromPoint(Point p, int x, int y) { if (isHorizontal()) { for (AbstractHeatmapDrawer d : drawers) { Dimension sz = d.getSize(); Rectangle box2 = new Rectangle(x, y, sz.width, sz.height); if (box2.contains(p)) { return drawers.indexOf(d); } y += sz.height; } } else { for (AbstractHeatmapDrawer d : Lists.reverse(drawers)) { Dimension sz = d.getSize(); Rectangle box2 = new Rectangle(x, y, sz.width, sz.height); if (box2.contains(p)) { return drawers.indexOf(d); } x += sz.width; } } return 0; } @Override public void configure(Point p, int x, int y) { int index = getDrawerIndexFromPoint(p, x, y); getHeader().setInteractionLevel(index); } }