/* Alloy Analyzer 4 -- Copyright (c) 2006-2009, Felix Chang * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files * (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ package edu.mit.csail.sdg.alloy4graph; import java.awt.Color; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.swing.Icon; import edu.mit.csail.sdg.alloy4.OurUtil; /** Immutable; this defines the set of possible colors. * * <p><b>Thread Safety:</b> Can be called only by the AWT event thread. */ public enum DotColor { MAGIC("Magic", "magic"), YELLOW("Yellow", "gold", "yellow", "lightgoldenrod", "yellow"), GREEN("Green", "limegreen", "green2","darkolivegreen2","chartreuse2"), BLUE("Blue", "cornflowerblue", "blue", "cadetblue", "cyan"), RED("Red", "palevioletred", "red", "salmon", "magenta"), GRAY("Gray", "lightgray"), WHITE("White", "white"), BLACK("Black", "black"); /** The text to display. */ private final String displayText; /** The list of colors to use, corresponding to the current palette; * if there are more palette choices than colors.size(), then the extra palettes would all use the first color. */ private final List<String> colors = new ArrayList<String>(); /** The list of icons to show, corresponding to the current palette; * if there are more palette choices than icons.size(), then the extra palettes would all use the first icon. */ private final List<Icon> icons = new ArrayList<Icon>(); /** Construct a new DotColor. */ private DotColor(String text, String... colors) { displayText = text; for(int i=0; i<colors.length; i++) { this.colors.add(colors[i]); this.icons.add(OurUtil.loadIcon("icons/ColorIcons/"+colors[i]+".gif")); } } /** This maps each dot color name into the corresponding Java Color object. */ private static final Map<String,Color> name2color = new HashMap<String,Color>(); /** Returns the list of values that the user is allowed to select from. */ public static Object[] valuesWithout(DotColor exclude) { Object[] ans = new Object[values().length - 1]; int i = 0; for(DotColor d: values()) if (d != exclude) ans[i++] = d; return ans; } /** Returns the Icon that will be displayed in the GUI to represent this value, when used with the given palette. */ public Icon getIcon(DotPalette pal) { int i = 0; for(Object choice: DotPalette.values()) { if (i >= icons.size()) break; if (pal == choice) return icons.get(i); i++; } return icons.get(0); } /** Convert this color into its corresponding Java Color object. */ public Color getColor(DotPalette pal) { String name = getDotText(pal); Color ans = name2color.get(name); if (ans!=null) return ans; else if (name.equals("palevioletred")) ans = new Color(222,113,148); else if (name.equals("red")) ans = new Color(255,0,0); else if (name.equals("salmon")) ans = new Color(255,130,115); else if (name.equals("magenta")) ans = new Color(255,0,255); else if (name.equals("limegreen")) ans = new Color(49,207,49); else if (name.equals("green2")) ans = new Color(0,239,0); else if (name.equals("darkolivegreen2")) ans = new Color(189,239,107); else if (name.equals("chartreuse2")) ans = new Color(115,239,0); else if (name.equals("gold")) ans = new Color(255,215,0); else if (name.equals("yellow")) ans = new Color(255,255,0); else if (name.equals("lightgoldenrod")) ans = new Color(239,223,132); else if (name.equals("cornflowerblue")) ans = new Color(99,150,239); else if (name.equals("blue")) ans = new Color(0,0,255); else if (name.equals("cadetblue")) ans = new Color(90,158,165); else if (name.equals("cyan")) ans = new Color(0,255,255); else if (name.equals("lightgray")) ans = new Color(214,214,214); else if (name.equals("white")) ans = Color.WHITE; else ans = Color.BLACK; name2color.put(name, ans); return ans; } /** Returns the String that should be written into the dot file for this value, when used with the given palette. */ public String getDotText(DotPalette pal) { int i = 0; for(Object choice: DotPalette.values()) { if (i >= colors.size()) break; if (pal == choice) return colors.get(i); i++; } return colors.get(0); } /** Returns the String that will be displayed in the GUI to represent this value. */ public String getDisplayedText() { return displayText; } /** This method is used in parsing the XML value into a valid color; returns null if there is no match. */ public static DotColor parse(String x) { if (x != null) for(DotColor d: values()) if (d.toString().equals(x)) return d; return null; } /** This value is used in writing XML. */ @Override public String toString() { return displayText; } }