package net.sourceforge.pmd.eclipse.util;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import net.sourceforge.pmd.util.StringUtil;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.widgets.Display;
/**
* A singleton that manages colour resources.
*
* @author Brian Remedios
*/
public class ColourManager {
private final Display display;
private final Map<RGB, Color> coloursByRGB = new HashMap<RGB, Color>();
private static ColourManager instance;
private ColourManager(Display theDisplay) {
display = theDisplay;
}
public static ColourManager managerFor(Display display) {
if (instance == null) instance = new ColourManager(display);
return instance;
}
public Color colourFor(RGB colourFractions) {
Color colour = coloursByRGB.get(colourFractions);
if (colour != null) return colour;
colour = new Color(display, colourFractions.red, colourFractions.green, colourFractions.blue);
coloursByRGB.put(colourFractions, colour);
return colour;
}
/**
* Derive a colour from the input text after slicing it into three
* sections and taking the log of their hashes and smushing them
* into RGB values
*
* @param text
* @return Color
*/
public Color colourFor(String text) {
if (StringUtil.isEmpty(text)) return display.getSystemColor(SWT.COLOR_WHITE);
text = text.trim();
int length = text.length();
if (length < 3) return display.getSystemColor(SWT.COLOR_WHITE);
int posA = length / 3;
int posB = posA * 2;
int rHash = text.subSequence(0, posA).hashCode();
int gHash = text.subSequence(posA, posB).hashCode();
int bHash = text.subSequence(posB, length).hashCode();
RGB colourFractions = new RGB(
(int)(Math.log10(rHash) % 1 * 255),
(int)(Math.log10(gHash) % 1 * 255),
(int)(Math.log10(bHash) % 1 * 255)
);
return colourFor(colourFractions);
}
public void dispose() {
Iterator<Color> iter = coloursByRGB.values().iterator();
while (iter.hasNext()) iter.next().dispose();
}
}