]> gerrit.simantics Code Review - simantics/platform.git/blob - 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
1 package org.simantics.utils.ui.color;\r
2 \r
3 import java.util.ArrayList;\r
4 import java.util.Collections;\r
5 import java.util.List;\r
6 \r
7 /**\r
8  * Tool for creating random and distinct colors.\r
9  * \r
10  * \r
11  * @author Marko Luukkainen <marko.luukkainen@vtt.fi>\r
12  *\r
13  */\r
14 public class ColorPool {\r
15         \r
16         private List<Color> colors;\r
17         \r
18         public ColorPool() {\r
19                 colors = new ArrayList<Color>();\r
20         }\r
21         \r
22         public void addDefaultColors() {\r
23                 colors.add(new Color(0, 0, 255)); // blue\r
24                 colors.add(new Color(255, 0, 0)); // red\r
25                 colors.add(new Color(0, 200, 0)); // green\r
26                 colors.add(new Color(0, 0, 0)); // black\r
27         }\r
28         \r
29         public List<Color> getColors() {\r
30                 return colors;\r
31         }\r
32         \r
33         public Color getColor(int index) {\r
34                 if (colors.size() == 0)\r
35                         addDefaultColors();\r
36                 while (colors.size() <= index) {\r
37                         newRandomColor();\r
38                 }\r
39                 return colors.get(index);\r
40         }\r
41         \r
42         public int getSize() {\r
43                 return colors.size();\r
44         }\r
45         \r
46         public void add(Color color) {\r
47                 colors.add(color);\r
48         }\r
49         \r
50         public void setColor(int index, Color color) {\r
51                 colors.set(index, color);\r
52         }\r
53         \r
54         public void clear() {\r
55                 colors.clear();\r
56         }\r
57         \r
58         private Color newRandomColor() {\r
59                 \r
60                 ArrayList<Color> sortColors = new ArrayList<Color>();\r
61                 for (Color c : colors) {\r
62                         if (!Float.isNaN(c.getH()))\r
63                                 sortColors.add(c);\r
64                 }\r
65                 if (sortColors.size() > 0) {\r
66                         Collections.sort(sortColors);\r
67                         Color duplicate = new Color(sortColors.get(0));\r
68                         duplicate.setH(sortColors.get(0).getH()+360.f);\r
69                         sortColors.add(duplicate);\r
70                         \r
71                 float maxDelta = 0;\r
72                 int maxDeltaIndex = 0;\r
73                 for (int i = 0; i < sortColors.size()-1; i++) {\r
74                     float delta = sortColors.get(i + 1).getH() - sortColors.get(i).getH();\r
75                     if (delta > maxDelta) {\r
76                         maxDelta = delta;\r
77                         maxDeltaIndex = i;\r
78                     }\r
79                 }\r
80                 float newHue = sortColors.get(maxDeltaIndex).getH() + 0.5f * maxDelta;\r
81                 if (newHue > 360.f)\r
82                     newHue -= 360.f;\r
83                 \r
84                 Color randomColor = Color.getRandomHSV(0.5f, 0.5f);\r
85                 randomColor.setH(newHue);\r
86                 colors.add(randomColor);\r
87                 return randomColor;\r
88                 } else {\r
89                         Color randomColor = Color.getRandomHSV(0.5f, 0.5f);\r
90                         colors.add(randomColor);\r
91                         return randomColor;\r
92                 }\r
93         \r
94         }\r
95         \r
96         \r
97 }\r