package name.abuchen.portfolio.ui.views.taxonomy;
import java.util.List;
import name.abuchen.portfolio.ui.util.Colors;
import org.eclipse.jface.resource.LocalResourceManager;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.graphics.Rectangle;
/* package */class TaxonomyNodeRenderer
{
private final class Segment
{
private Color primary;
private Color brighter;
private Color darker;
public Segment(String color)
{
RGB rgb = Colors.toRGB(color);
createColors(rgb, rgb.getHSB());
}
private void createColors(RGB rgb, float[] hsb)
{
primary = resources.createColor(rgb);
brighter = resources.createColor(new RGB(hsb[0], hsb[1], Math.min(1.0f, hsb[2] + 0.05f)));
darker = resources.createColor(new RGB(hsb[0], hsb[1], Math.max(0f, hsb[2] - 0.05f)));
}
}
private LocalResourceManager resources;
public TaxonomyNodeRenderer(LocalResourceManager resources)
{
this.resources = resources;
}
public void drawRectangle(TaxonomyNode rootItem, TaxonomyNode item, GC gc, Rectangle r)
{
Segment segment = getSegment(rootItem, item);
gc.setBackground(segment.primary);
gc.fillRectangle(r.x, r.y, r.width, r.height);
gc.setForeground(segment.darker);
gc.drawLine(r.x, r.y + r.height - 1, r.x + r.width - 1, r.y + r.height - 1);
gc.drawLine(r.x + r.width - 1, r.y, r.x + r.width - 1, r.y + r.height - 1);
gc.setForeground(segment.brighter);
gc.drawLine(r.x, r.y, r.x + r.width, r.y);
gc.drawLine(r.x, r.y, r.x, r.y + r.height);
}
public Color getColorFor(TaxonomyNode node)
{
return getSegment(null, node).primary;
}
private Segment getSegment(TaxonomyNode rootItem, TaxonomyNode item)
{
if (rootItem == null || item.isRoot() || rootItem.equals(item))
return new Segment(item.getColor());
List<TaxonomyNode> path = item.getPath();
int index = path.indexOf(rootItem);
if (index < 0) // root not found!
return new Segment(item.getColor());
if (path.size() <= index + 1)
return new Segment(item.getColor());
TaxonomyNode reference = path.get(index + 1);
return new Segment(reference.getColor());
}
}