X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.utils.ui%2Fsrc%2Forg%2Fsimantics%2Futils%2Fui%2Fcolor%2FColorPool.java;fp=bundles%2Forg.simantics.utils.ui%2Fsrc%2Forg%2Fsimantics%2Futils%2Fui%2Fcolor%2FColorPool.java;h=5068fa4d899f06b2b6494383d275a77fa1f19cd6;hp=0000000000000000000000000000000000000000;hb=969bd23cab98a79ca9101af33334000879fb60c5;hpb=866dba5cd5a3929bbeae85991796acb212338a08 diff --git a/bundles/org.simantics.utils.ui/src/org/simantics/utils/ui/color/ColorPool.java b/bundles/org.simantics.utils.ui/src/org/simantics/utils/ui/color/ColorPool.java new file mode 100644 index 000000000..5068fa4d8 --- /dev/null +++ b/bundles/org.simantics.utils.ui/src/org/simantics/utils/ui/color/ColorPool.java @@ -0,0 +1,97 @@ +package org.simantics.utils.ui.color; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * Tool for creating random and distinct colors. + * + * + * @author Marko Luukkainen + * + */ +public class ColorPool { + + private List colors; + + public ColorPool() { + colors = new ArrayList(); + } + + public void addDefaultColors() { + colors.add(new Color(0, 0, 255)); // blue + colors.add(new Color(255, 0, 0)); // red + colors.add(new Color(0, 200, 0)); // green + colors.add(new Color(0, 0, 0)); // black + } + + public List getColors() { + return colors; + } + + public Color getColor(int index) { + if (colors.size() == 0) + addDefaultColors(); + while (colors.size() <= index) { + newRandomColor(); + } + return colors.get(index); + } + + public int getSize() { + return colors.size(); + } + + public void add(Color color) { + colors.add(color); + } + + public void setColor(int index, Color color) { + colors.set(index, color); + } + + public void clear() { + colors.clear(); + } + + private Color newRandomColor() { + + ArrayList sortColors = new ArrayList(); + for (Color c : colors) { + if (!Float.isNaN(c.getH())) + sortColors.add(c); + } + if (sortColors.size() > 0) { + Collections.sort(sortColors); + Color duplicate = new Color(sortColors.get(0)); + duplicate.setH(sortColors.get(0).getH()+360.f); + sortColors.add(duplicate); + + float maxDelta = 0; + int maxDeltaIndex = 0; + for (int i = 0; i < sortColors.size()-1; i++) { + float delta = sortColors.get(i + 1).getH() - sortColors.get(i).getH(); + if (delta > maxDelta) { + maxDelta = delta; + maxDeltaIndex = i; + } + } + float newHue = sortColors.get(maxDeltaIndex).getH() + 0.5f * maxDelta; + if (newHue > 360.f) + newHue -= 360.f; + + Color randomColor = Color.getRandomHSV(0.5f, 0.5f); + randomColor.setH(newHue); + colors.add(randomColor); + return randomColor; + } else { + Color randomColor = Color.getRandomHSV(0.5f, 0.5f); + colors.add(randomColor); + return randomColor; + } + + } + + +}