/*
* #%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.*;
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 HeatmapHeaderDrawer extends AbstractHeatmapDrawer {
private HeatmapDimension heatmapDimension;
private List<AbstractHeatmapHeaderDrawer> drawers;
public HeatmapHeaderDrawer(Heatmap heatmap, HeatmapDimension heatmapDimension) {
super(heatmap);
this.heatmapDimension = heatmapDimension;
update();
}
public final void update() {
List<HeatmapHeader> headers = heatmapDimension.getHeaders();
drawers = new ArrayList<>(headers.size());
for (int i = 0; i < headers.size(); i++) {
HeatmapHeader h = headers.get(i);
if (!h.isVisible()) {
continue;
}
AbstractHeatmapHeaderDrawer d = null;
if (h instanceof HeatmapTextLabelsHeader) {
d = new HeatmapTextLabelsDrawer(getHeatmap(), heatmapDimension, (HeatmapTextLabelsHeader) h);
} else if (h instanceof HeatmapColoredLabelsHeader) {
d = new HeatmapColoredLabelsDrawer(getHeatmap(), heatmapDimension, (HeatmapColoredLabelsHeader) h);
} else if (h instanceof HeatmapDecoratorHeader) {
d = new HeatmapDecoratorHeaderDrawer(getHeatmap(), heatmapDimension, (HeatmapDecoratorHeader) h);
} else if (h instanceof HierarchicalClusterHeatmapHeader) {
d = new HierarchicalClusterHeaderDrawer(getHeatmap(), heatmapDimension, (HierarchicalClusterHeatmapHeader) h);
}
if (d != null) {
d.setPictureMode(isPictureMode());
drawers.add(d);
}
}
}
@Deprecated
private boolean isHorizontal() {
return getHeatmap().getColumns() == heatmapDimension;
}
@Override
public Dimension getSize() {
int w = 0;
int h = 0;
if (isHorizontal()) {
for (AbstractHeatmapDrawer d : drawers) {
Dimension sz = d.getSize();
if (sz.width > w) {
w = sz.width;
}
h += sz.height;
}
} else {
for (AbstractHeatmapDrawer d : drawers) {
Dimension sz = d.getSize();
if (sz.height > h) {
h = sz.height;
}
w += sz.width;
}
}
return new Dimension(w, h);
}
private static final double radianAngle90 = (-90.0 / 180.0) * Math.PI;
@Override
public void draw(Graphics2D g, Rectangle box, Rectangle clip) {
// Clear background
if (!isPictureMode()) {
g.setColor(Color.WHITE);
g.fillRect(clip.x, clip.y, clip.width, clip.height);
}
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);
if (isHorizontal()) {
int x = box.y;
int y = box.x;
int totalSize = box.height;
Rectangle clip2 = new Rectangle(clip.y, clip.x, clip.height, clip.width);
g.rotate(radianAngle90);
g.translate(-totalSize, 0);
g.fillRect(box.x, box.y, box.width, box.height);
for (AbstractHeatmapHeaderDrawer d : drawers) {
Dimension sz = d.getSize();
Rectangle box2 = new Rectangle(x, y, sz.height, sz.width);
d.draw(g, box2, clip2.intersection(box2));
if (!isPictureMode()) {
int mode = heatmapDimension.getHighlightedHeaders().contains(d.getHeader().getTitle()) ?
HIGHLIGHT_POLICY_FORCE : HIGHLIGHT_POLICY_NORMAL;
drawSelectedHighlightedAndFocus(g, box2, heatmapDimension, true, mode);
}
x += box2.width;
}
} else {
int x = box.x;
int y = box.y;
Dimension sz;
for (AbstractHeatmapHeaderDrawer d : drawers) {
sz = d.getSize();
Rectangle box2 = new Rectangle(x, y, clip.width - x, sz.height);
d.draw(g, box2, clip.intersection(box2));
if (!isPictureMode()) {
int mode = heatmapDimension.getHighlightedHeaders().contains(d.getHeader().getTitle()) ?
HIGHLIGHT_POLICY_FORCE : HIGHLIGHT_POLICY_NORMAL;
drawSelectedHighlightedAndFocus(g, box2, heatmapDimension, true, mode);
}
x += sz.width;
}
}
}
@Override
public HeatmapPosition getPosition(Point p) {
int x = 0;
int y = 0;
if (isHorizontal()) {
for (AbstractHeatmapDrawer d : Lists.reverse(drawers)) {
Dimension sz = d.getSize();
Rectangle box2 = new Rectangle(x, y, sz.width, sz.height);
if (box2.contains(p)) {
p.translate(-x, -y);
return d.getPosition(p);
}
y += sz.height;
}
} else {
for (AbstractHeatmapDrawer d : drawers) {
Dimension sz = d.getSize();
Rectangle box2 = new Rectangle(x, y, sz.width, sz.height);
if (box2.contains(p)) {
p.translate(-x, -y);
return d.getPosition(p);
}
x += sz.width;
}
}
return new HeatmapPosition(getHeatmap(), -1, -1);
}
public HeatmapHeader getHeader(Point p) {
int x = 0;
int y = 0;
if (isHorizontal()) {
for (AbstractHeatmapHeaderDrawer d : Lists.reverse(drawers)) {
Dimension sz = d.getSize();
Rectangle box2 = new Rectangle(x, y, sz.width, sz.height);
if (box2.contains(p)) {
d.configure(p, x, y);
return d.getHeader();
}
y += sz.height;
}
} else {
for (AbstractHeatmapHeaderDrawer d : drawers) {
Dimension sz = d.getSize();
Rectangle box2 = new Rectangle(x, y, sz.width, sz.height);
if (box2.contains(p)) {
d.configure(p, x, y);
return d.getHeader();
}
x += sz.width;
}
}
return null;
}
@Override
public Point getPoint(HeatmapPosition p) {
return new Point(0, 0);
}
@Override
public void setPictureMode(boolean pictureMode) {
super.setPictureMode(pictureMode);
for (AbstractHeatmapDrawer d : drawers)
d.setPictureMode(pictureMode);
}
public List<AbstractHeatmapHeaderDrawer> getDrawers() {
return drawers;
}
}