/*
* #%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;
import org.gitools.heatmap.Heatmap;
import org.gitools.heatmap.HeatmapDimension;
import org.gitools.heatmap.decorator.Decoration;
import org.gitools.heatmap.header.HeatmapHeader;
import org.gitools.ui.core.HeatmapPosition;
import java.awt.*;
public abstract class AbstractHeatmapHeaderDrawer<HT extends HeatmapHeader> extends AbstractHeatmapDrawer {
private final HT header;
private HeatmapDimension heatmapDimension;
protected AbstractHeatmapHeaderDrawer(Heatmap heatmap, HeatmapDimension heatmapDimension, HT header) {
super(heatmap);
this.header = header;
this.heatmapDimension = heatmapDimension;
}
public HT getHeader() {
return header;
}
@Override
public Point getPoint(HeatmapPosition p) {
int index = (isHorizontal() ? p.row : p.column);
int point = getHeaderPoint(index);
return (isHorizontal() ? new Point(point, 0) : new Point(0, point));
}
protected int getHeaderPoint(int index) {
HeatmapDimension hdim = getHeatmapDimension();
int cellSize = hdim.getFullCellSize();
int totalSize = cellSize * hdim.size();
int point = index >= 0 ? index * cellSize : 0;
if (point > totalSize) {
point = totalSize;
}
return point;
}
protected String getLabel(int index) {
return getHeader().getIdentifierTransform().apply(getHeatmapDimension().getLabel(index));
}
protected boolean isHighlightedIndex(int i) {
return getHeatmapDimension().isHighlighted(getHeatmapDimension().getLabel(i));
}
@Override
public HeatmapPosition getPosition(Point p) {
int point = (isHorizontal() ? p.x : p.y);
int index = getHeaderPosition(point);
return (isHorizontal() ? new HeatmapPosition(getHeatmap(), -1, index) : new HeatmapPosition(getHeatmap(), index, -1));
}
protected int getHeaderPosition(int point) {
HeatmapDimension hdim = getHeatmapDimension();
int index = -1;
int cellSize = hdim.getFullCellSize();
int totalSize = cellSize * hdim.size();
if (point >= 0 && point < totalSize) {
index = point / cellSize;
}
return index;
}
@Override
public Dimension getSize() {
HeatmapDimension hdim = getHeatmapDimension();
int total = (hdim.getFullCellSize()) * hdim.size();
return (isHorizontal() ? new Dimension(total, getHeader().getSize()) : new Dimension(getHeader().getSize(), total));
}
@Deprecated
public boolean isHorizontal() {
return getHeatmap().getColumns() == heatmapDimension;
}
public void drawHeaderLegend(Graphics2D g, Rectangle headerIntersection, HeatmapHeader heatmapHeader) {
}
public HeatmapDimension getHeatmapDimension() {
return heatmapDimension;
}
protected int fullCellSize() {
return heatmapDimension.getFullCellSize();
}
protected void prepareDraw(Graphics2D g, Rectangle box) {
paintBackground(header.getBackgroundColor(), g, box);
calculateFontSize(g, header.getHeatmapDimension().getCellSize(), 8);
}
protected void paintCell(Decoration decoration, int index, int offset, int width, Graphics2D g, Rectangle box) {
int gridSize = (heatmapDimension.showGrid() ? heatmapDimension.getGridSize() : 0);
paintCell(
decoration,
header.getBackgroundColor(),
gridSize,
offset, index * (heatmapDimension.getFullCellSize()),
width,
heatmapDimension.getCellSize(),
g,
box
);
}
protected int firstVisibleIndex(Rectangle box, Rectangle clip) {
int size = fullCellSize();
int clipStart = clip.y - box.y;
int index = ((clipStart - size) / size);
index = (index < 0 ? 0 : index);
return index;
}
protected int lastVisibleIndex(Rectangle box, Rectangle clip) {
int size = fullCellSize();
int clipStart = clip.y - box.y;
int clipEnd = clipStart + clip.height;
int index = ((clipEnd + size - 1) / size);
index = ((index + 1) > heatmapDimension.size() ? heatmapDimension.size() - 1 : index);
return index;
}
/**
* Configure the header and drawer if necessary according to where
* the user has clicked in the heatmap header
* @param p
* @param x
* @param y
*/
public void configure(Point p, int x, int y) {
// override if neccessary
}
}