001    /*
002     * Created by IntelliJ IDEA.
003     * User: Wei Wang
004     * Date: 2002-10-22
005     * Time: 20:12:14
006     * To change this template use Options | File Templates.
007     */
008    
009    package EVolve.util;
010    
011    import java.awt.Color;
012    import java.util.HashMap;
013    import java.util.Iterator;
014    import java.util.Random;
015    
016    public class ColorCache implements Cloneable{
017        private HashMap colorMap;
018        private Random random;
019        private final long seed = 2003213813;
020        private Color[] defaultColors = {
021            new Color(51,153,204), new Color(187,156,26), new Color(153,204,51),new Color(153,51,204),
022            new Color(204,51,153), new Color(204,153,51), new Color(51,204,0),new Color(51,0,204),
023            new Color(204,0,51), new Color(204,51,0), new Color(0,51,204),new Color(0,204,51),
024            new Color(204,0,204), new Color(204,204,0), new Color(0,204,204),new Color(51,153,0),
025            new Color(51,0,153), new Color(153,0,51), new Color(153,51,0),new Color(0,51,153),
026            new Color(0,153,51), new Color(153,204,0), new Color(153,0,204),new Color(0,204,153),
027            new Color(0,153,204), new Color(204,0,153), new Color(204,153,0),new Color(151,255,151),
028            new Color(255,151,151), new Color(151,151,255), new Color(204,204,255),new Color(255,204,204),
029            new Color(204,255,204), new Color(251,151,180), new Color(251,180,151),new Color(151,180,251),
030            new Color(151,251,180), new Color(180,251,151), new Color(180,151,251),new Color(145,244,45),
031            new Color(145,45,244), new Color(45,244,145), new Color(45,145,244),new Color(244,100,45),
032            new Color(244,45,145), new Color(244,145,195), new Color(0,0,255),new Color(51,204,153),
033            new Color(0,255,0), new Color(130,28,247), new Color(179,247,98),new Color(247,28,130),
034            new Color(200,160,88), new Color(28,247,130), new Color(198,130,247),new Color(0,128,255),
035            new Color(0,255,128), new Color(255,128,177), new Color(255,180,128),new Color(128,200,255),
036            new Color(255,128,0), new Color(128,255,0), new Color(255,0,0),new Color(102,102,255)
037        };
038        private int leftColor;
039    
040        public ColorCache() {
041            colorMap = new HashMap();
042            leftColor = defaultColors.length -1;
043            random = new Random();
044            random.setSeed(seed);
045        }
046    
047        private Color getRandomColor() {
048            int sum = 0;
049            int rand[] = new int[3];
050    
051            if (leftColor>=0) {
052                return defaultColors[leftColor--];
053            }
054    
055            do {
056                while (sum<70) {
057                    for (int i=0; i<rand.length;i++) {
058                        rand[i] = 500;
059                        while (rand[i]>255) {
060                            rand[i] = (int)(random.nextDouble()*10000);
061                        }
062                    }
063                    sum = rand[0] + rand[1] + rand[2];
064                }
065                sum = 0;
066            } while (colorMap.containsValue(new Color(rand[0],rand[1],rand[2])));
067    
068            return new Color(rand[0],rand[1],rand[2]);
069        }
070    
071        public Color getNextColor(long methodId) {
072            Color color;
073            if (!colorMap.containsKey(new Long(methodId))) {
074                color = getRandomColor();
075                colorMap.put(new Long(methodId),color);
076                return color;
077            }
078            return (Color)colorMap.get(new Long(methodId));
079        }
080    
081        public long getKeyFromColor(Color color) {
082            Iterator it = colorMap.keySet().iterator();
083            long methodId = -1;
084    
085            while (it.hasNext()) {
086                Long key = (Long)it.next();
087                if (color != ((Color)colorMap.get(key))) continue;
088    
089                methodId = key.longValue();
090                return methodId;
091            }
092            return methodId;
093        }
094    
095        public Object clone() {
096            ColorCache o = null;
097            try {
098                o = (ColorCache)super.clone();
099            } catch (CloneNotSupportedException e) {
100                e.printStackTrace();
101                return null;
102            }
103            o.colorMap = (HashMap)colorMap.clone();
104            o.defaultColors = new Color[defaultColors.length];
105            for (int i=0; i<defaultColors.length; i++)
106                o.defaultColors[i] = defaultColors[i];
107            return o;
108        }
109    }