]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.utils.ui/src/org/simantics/utils/ui/color/ColorPool.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.utils.ui / src / org / simantics / utils / ui / color / ColorPool.java
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 (file)
index 0000000..5068fa4
--- /dev/null
@@ -0,0 +1,97 @@
+package org.simantics.utils.ui.color;\r
+\r
+import java.util.ArrayList;\r
+import java.util.Collections;\r
+import java.util.List;\r
+\r
+/**\r
+ * Tool for creating random and distinct colors.\r
+ * \r
+ * \r
+ * @author Marko Luukkainen <marko.luukkainen@vtt.fi>\r
+ *\r
+ */\r
+public class ColorPool {\r
+       \r
+       private List<Color> colors;\r
+       \r
+       public ColorPool() {\r
+               colors = new ArrayList<Color>();\r
+       }\r
+       \r
+       public void addDefaultColors() {\r
+               colors.add(new Color(0, 0, 255)); // blue\r
+               colors.add(new Color(255, 0, 0)); // red\r
+               colors.add(new Color(0, 200, 0)); // green\r
+               colors.add(new Color(0, 0, 0)); // black\r
+       }\r
+       \r
+       public List<Color> getColors() {\r
+               return colors;\r
+       }\r
+       \r
+       public Color getColor(int index) {\r
+               if (colors.size() == 0)\r
+                       addDefaultColors();\r
+               while (colors.size() <= index) {\r
+                       newRandomColor();\r
+               }\r
+               return colors.get(index);\r
+       }\r
+       \r
+       public int getSize() {\r
+               return colors.size();\r
+       }\r
+       \r
+       public void add(Color color) {\r
+               colors.add(color);\r
+       }\r
+       \r
+       public void setColor(int index, Color color) {\r
+               colors.set(index, color);\r
+       }\r
+       \r
+       public void clear() {\r
+               colors.clear();\r
+       }\r
+       \r
+       private Color newRandomColor() {\r
+               \r
+               ArrayList<Color> sortColors = new ArrayList<Color>();\r
+               for (Color c : colors) {\r
+                       if (!Float.isNaN(c.getH()))\r
+                               sortColors.add(c);\r
+               }\r
+               if (sortColors.size() > 0) {\r
+                       Collections.sort(sortColors);\r
+                       Color duplicate = new Color(sortColors.get(0));\r
+                       duplicate.setH(sortColors.get(0).getH()+360.f);\r
+                       sortColors.add(duplicate);\r
+                       \r
+               float maxDelta = 0;\r
+               int maxDeltaIndex = 0;\r
+               for (int i = 0; i < sortColors.size()-1; i++) {\r
+                   float delta = sortColors.get(i + 1).getH() - sortColors.get(i).getH();\r
+                   if (delta > maxDelta) {\r
+                       maxDelta = delta;\r
+                       maxDeltaIndex = i;\r
+                   }\r
+               }\r
+               float newHue = sortColors.get(maxDeltaIndex).getH() + 0.5f * maxDelta;\r
+               if (newHue > 360.f)\r
+                   newHue -= 360.f;\r
+               \r
+               Color randomColor = Color.getRandomHSV(0.5f, 0.5f);\r
+               randomColor.setH(newHue);\r
+               colors.add(randomColor);\r
+               return randomColor;\r
+               } else {\r
+                       Color randomColor = Color.getRandomHSV(0.5f, 0.5f);\r
+                       colors.add(randomColor);\r
+                       return randomColor;\r
+               }\r
+        \r
+       }\r
+       \r
+       \r
+}\r