Statistics
| Revision:

gvsig-tools / org.gvsig.tools / library / trunk / org.gvsig.tools / org.gvsig.tools.swing / org.gvsig.tools.swing.impl / src / main / java / org / gvsig / tools / swing / impl / coerce / CoerceToColor.java @ 2080

History | View | Annotate | Download (14 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2013 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 3
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.tools.swing.impl.coerce;
25

    
26
import java.awt.Color;
27
import java.util.HashMap;
28
import java.util.Map;
29
import org.apache.commons.lang3.StringUtils;
30
import org.apache.commons.lang3.math.NumberUtils;
31
import org.gvsig.tools.ToolsLocator;
32
import org.gvsig.tools.dataTypes.AbstractCoercion;
33
import org.gvsig.tools.dataTypes.CoercionContext;
34
import org.gvsig.tools.dataTypes.CoercionException;
35
import org.gvsig.tools.dataTypes.DataTypesManager;
36
import org.gvsig.tools.swing.api.DataTypes;
37

    
38
public class CoerceToColor extends AbstractCoercion {
39

    
40
  private static Map<String, Color> colorTable = null;
41

    
42
  @Override
43
  public Object coerce(Object value, CoercionContext context) throws CoercionException {
44
    if (value == null || value instanceof Color) {
45
      return value;
46
    }
47
    try {
48
      if (value instanceof Number) {
49
        int rgb = ((Number) value).intValue();
50
        Color color = new Color(rgb); // Alpha??
51
        return color;
52
      }
53
      String s = value.toString().trim();
54
      if (s.startsWith("rgb(")) {
55
        s = s.replace(")", "");
56
        String[] x = StringUtils.split(s, ",");
57
        if (x.length < 3 || x.length > 4) {
58
          throw new CoercionException("Can't convert '" + value.toString() + "' to color.");
59
        }
60
        try {
61
          Color color;
62
          int r = NumberUtils.createInteger(x[0]);
63
          int g = NumberUtils.createInteger(x[1]);
64
          int b = NumberUtils.createInteger(x[2]);
65
          if (x.length == 3) {
66
            color = new Color(r, g, b);
67
          } else {
68
            int a = NumberUtils.createInteger(x[3]);
69
            color = new Color(r, g, b, a);
70
          }
71
          return color;
72
        } catch (NumberFormatException ex) {
73
          throw new CoercionException("Can't convert '" + value.toString() + "' to color.");
74
        }
75

    
76
      }
77
      if (s.startsWith("#")) {
78
        s = "0x" + s.substring(1);
79
      }
80
      try {
81
        int rgb = NumberUtils.createInteger(s);
82
        Color color = new Color(rgb);
83
        return color;
84
      } catch (NumberFormatException ex) {
85
        // Pass, do nothing
86
      }
87
      Color color = this.getColor(s);
88
      if (color == null) {
89
        throw new CoercionException("Can't convert '" + value.toString() + "' to color.");
90
      }
91
      return color;
92
    } catch (Exception e) {
93
      throw new CoercionException(e);
94
    }
95

    
96
  }
97

    
98
  private Color getColor(String name) {
99
    if (colorTable == null) {
100
      //
101
      // HTML Color Names
102
      // from https://www.w3schools.com/colors/colors_names.asp
103
      //
104
      colorTable = new HashMap<>();
105
      colorTable.put("aliceblue", new Color(0xF0, 0xF8, 0xFF));
106
      colorTable.put("antiquewhite", new Color(0xFA, 0xEB, 0xD7));
107
      colorTable.put("aqua", new Color(0x00, 0xFF, 0xFF));
108
      colorTable.put("aquamarine", new Color(0x7F, 0xFF, 0xD4));
109
      colorTable.put("azure", new Color(0xF0, 0xFF, 0xFF));
110
      colorTable.put("beige", new Color(0xF5, 0xF5, 0xDC));
111
      colorTable.put("bisque", new Color(0xFF, 0xE4, 0xC4));
112
      colorTable.put("black", new Color(0x00, 0x00, 0x00));
113
      colorTable.put("blanchedalmond", new Color(0xFF, 0xEB, 0xCD));
114
      colorTable.put("blue", new Color(0x00, 0x00, 0xFF));
115
      colorTable.put("blueviolet", new Color(0x8A, 0x2B, 0xE2));
116
      colorTable.put("brown", new Color(0xA5, 0x2A, 0x2A));
117
      colorTable.put("burlywood", new Color(0xDE, 0xB8, 0x87));
118
      colorTable.put("cadetblue", new Color(0x5F, 0x9E, 0xA0));
119
      colorTable.put("chartreuse", new Color(0x7F, 0xFF, 0x00));
120
      colorTable.put("chocolate", new Color(0xD2, 0x69, 0x1E));
121
      colorTable.put("coral", new Color(0xFF, 0x7F, 0x50));
122
      colorTable.put("cornflowerblue", new Color(0x64, 0x95, 0xED));
123
      colorTable.put("cornsilk", new Color(0xFF, 0xF8, 0xDC));
124
      colorTable.put("crimson", new Color(0xDC, 0x14, 0x3C));
125
      colorTable.put("cyan", new Color(0x00, 0xFF, 0xFF));
126
      colorTable.put("darkblue", new Color(0x00, 0x00, 0x8B));
127
      colorTable.put("darkcyan", new Color(0x00, 0x8B, 0x8B));
128
      colorTable.put("darkgoldenRod", new Color(0xB8, 0x86, 0x0B));
129
      colorTable.put("darkgray", new Color(0xA9, 0xA9, 0xA9));
130
      colorTable.put("darkgrey", new Color(0xA9, 0xA9, 0xA9));
131
      colorTable.put("darkgreen", new Color(0x00, 0x64, 0x00));
132
      colorTable.put("darkkhaki", new Color(0xBD, 0xB7, 0x6B));
133
      colorTable.put("darkmagenta", new Color(0x8B, 0x00, 0x8B));
134
      colorTable.put("darkolivegreen", new Color(0x55, 0x6B, 0x2F));
135
      colorTable.put("darkorange", new Color(0xFF, 0x8C, 0x00));
136
      colorTable.put("darkorchid", new Color(0x99, 0x32, 0xCC));
137
      colorTable.put("darkred", new Color(0x8B, 0x00, 0x00));
138
      colorTable.put("darksalmon", new Color(0xE9, 0x96, 0x7A));
139
      colorTable.put("darkseagreen", new Color(0x8F, 0xBC, 0x8F));
140
      colorTable.put("darkslateblue", new Color(0x48, 0x3D, 0x8B));
141
      colorTable.put("darkslategray", new Color(0x2F, 0x4F, 0x4F));
142
      colorTable.put("darkslategrey", new Color(0x2F, 0x4F, 0x4F));
143
      colorTable.put("darkturquoise", new Color(0x00, 0xCE, 0xD1));
144
      colorTable.put("darkviolet", new Color(0x94, 0x00, 0xD3));
145
      colorTable.put("deeppink", new Color(0xFF, 0x14, 0x93));
146
      colorTable.put("deepskyblue", new Color(0x00, 0xBF, 0xFF));
147
      colorTable.put("dimgray", new Color(0x69, 0x69, 0x69));
148
      colorTable.put("dimgrey", new Color(0x69, 0x69, 0x69));
149
      colorTable.put("dodgerblue", new Color(0x1E, 0x90, 0xFF));
150
      colorTable.put("firebrick", new Color(0xB2, 0x22, 0x22));
151
      colorTable.put("floralwhite", new Color(0xFF, 0xFA, 0xF0));
152
      colorTable.put("forestgreen", new Color(0x22, 0x8B, 0x22));
153
      colorTable.put("fuchsia", new Color(0xFF, 0x00, 0xFF));
154
      colorTable.put("gainsboro", new Color(0xDC, 0xDC, 0xDC));
155
      colorTable.put("ghostwhite", new Color(0xF8, 0xF8, 0xFF));
156
      colorTable.put("gold", new Color(0xFF, 0xD7, 0x00));
157
      colorTable.put("goldenrod", new Color(0xDA, 0xA5, 0x20));
158
      colorTable.put("gray", new Color(0x80, 0x80, 0x80));
159
      colorTable.put("grey", new Color(0x80, 0x80, 0x80));
160
      colorTable.put("green", new Color(0x00, 0x80, 0x00));
161
      colorTable.put("greenyellow", new Color(0xAD, 0xFF, 0x2F));
162
      colorTable.put("honeydew", new Color(0xF0, 0xFF, 0xF0));
163
      colorTable.put("hotpink", new Color(0xFF, 0x69, 0xB4));
164
      colorTable.put("indianred", new Color(0xCD, 0x5C, 0x5C));
165
      colorTable.put("indigo", new Color(0x4B, 0x00, 0x82));
166
      colorTable.put("ivory", new Color(0xFF, 0xFF, 0xF0));
167
      colorTable.put("khaki", new Color(0xF0, 0xE6, 0x8C));
168
      colorTable.put("lavender", new Color(0xE6, 0xE6, 0xFA));
169
      colorTable.put("lavenderblush", new Color(0xFF, 0xF0, 0xF5));
170
      colorTable.put("lawnGreen", new Color(0x7C, 0xFC, 0x00));
171
      colorTable.put("lemonchiffon", new Color(0xFF, 0xFA, 0xCD));
172
      colorTable.put("lightblue", new Color(0xAD, 0xD8, 0xE6));
173
      colorTable.put("lightcoral", new Color(0xF0, 0x80, 0x80));
174
      colorTable.put("lightcyan", new Color(0xE0, 0xFF, 0xFF));
175
      colorTable.put("lightgoldenRodYellow", new Color(0xFA, 0xFA, 0xD2));
176
      colorTable.put("lightgray", new Color(0xD3, 0xD3, 0xD3));
177
      colorTable.put("lightgrey", new Color(0xD3, 0xD3, 0xD3));
178
      colorTable.put("lightgreen", new Color(0x90, 0xEE, 0x90));
179
      colorTable.put("lightpink", new Color(0xFF, 0xB6, 0xC1));
180
      colorTable.put("lightsalmon", new Color(0xFF, 0xA0, 0x7A));
181
      colorTable.put("lightseagreen", new Color(0x20, 0xB2, 0xAA));
182
      colorTable.put("lightskyblue", new Color(0x87, 0xCE, 0xFA));
183
      colorTable.put("lightslategray", new Color(0x77, 0x88, 0x99));
184
      colorTable.put("lightslategrey", new Color(0x77, 0x88, 0x99));
185
      colorTable.put("lightsteelblue", new Color(0xB0, 0xC4, 0xDE));
186
      colorTable.put("lightyellow", new Color(0xFF, 0xFF, 0xE0));
187
      colorTable.put("lime", new Color(0x00, 0xFF, 0x00));
188
      colorTable.put("limegreen", new Color(0x32, 0xCD, 0x32));
189
      colorTable.put("linen", new Color(0xFA, 0xF0, 0xE6));
190
      colorTable.put("magenta", new Color(0xFF, 0x00, 0xFF));
191
      colorTable.put("maroon", new Color(0x80, 0x00, 0x00));
192
      colorTable.put("mediumaquamarine", new Color(0x66, 0xCD, 0xAA));
193
      colorTable.put("mediumblue", new Color(0x00, 0x00, 0xCD));
194
      colorTable.put("mediumorchid", new Color(0xBA, 0x55, 0xD3));
195
      colorTable.put("mediumpurple", new Color(0x93, 0x70, 0xDB));
196
      colorTable.put("mediumseagreen", new Color(0x3C, 0xB3, 0x71));
197
      colorTable.put("mediumslateblue", new Color(0x7B, 0x68, 0xEE));
198
      colorTable.put("mediumspringgreen", new Color(0x00, 0xFA, 0x9A));
199
      colorTable.put("mediumturquoise", new Color(0x48, 0xD1, 0xCC));
200
      colorTable.put("mediumvioletred", new Color(0xC7, 0x15, 0x85));
201
      colorTable.put("midnightblue", new Color(0x19, 0x19, 0x70));
202
      colorTable.put("mintcream", new Color(0xF5, 0xFF, 0xFA));
203
      colorTable.put("mistyrose", new Color(0xFF, 0xE4, 0xE1));
204
      colorTable.put("moccasin", new Color(0xFF, 0xE4, 0xB5));
205
      colorTable.put("navajowhite", new Color(0xFF, 0xDE, 0xAD));
206
      colorTable.put("navy", new Color(0x00, 0x00, 0x80));
207
      colorTable.put("oldlace", new Color(0xFD, 0xF5, 0xE6));
208
      colorTable.put("olive", new Color(0x80, 0x80, 0x00));
209
      colorTable.put("olivedrab", new Color(0x6B, 0x8E, 0x23));
210
      colorTable.put("orange", new Color(0xFF, 0xA5, 0x00));
211
      colorTable.put("orangered", new Color(0xFF, 0x45, 0x00));
212
      colorTable.put("orchid", new Color(0xDA, 0x70, 0xD6));
213
      colorTable.put("palegoldenrod", new Color(0xEE, 0xE8, 0xAA));
214
      colorTable.put("palegreen", new Color(0x98, 0xFB, 0x98));
215
      colorTable.put("paleturquoise", new Color(0xAF, 0xEE, 0xEE));
216
      colorTable.put("palevioletred", new Color(0xDB, 0x70, 0x93));
217
      colorTable.put("papayawhip", new Color(0xFF, 0xEF, 0xD5));
218
      colorTable.put("peachpuff", new Color(0xFF, 0xDA, 0xB9));
219
      colorTable.put("peru", new Color(0xCD, 0x85, 0x3F));
220
      colorTable.put("pink", new Color(0xFF, 0xC0, 0xCB));
221
      colorTable.put("plum", new Color(0xDD, 0xA0, 0xDD));
222
      colorTable.put("powderblue", new Color(0xB0, 0xE0, 0xE6));
223
      colorTable.put("purple", new Color(0x80, 0x00, 0x80));
224
      colorTable.put("rebeccapurple", new Color(0x66, 0x33, 0x99));
225
      colorTable.put("red", new Color(0xFF, 0x00, 0x00));
226
      colorTable.put("rosybrown", new Color(0xBC, 0x8F, 0x8F));
227
      colorTable.put("royalblue", new Color(0x41, 0x69, 0xE1));
228
      colorTable.put("saddlebrown", new Color(0x8B, 0x45, 0x13));
229
      colorTable.put("salmon", new Color(0xFA, 0x80, 0x72));
230
      colorTable.put("sandybrown", new Color(0xF4, 0xA4, 0x60));
231
      colorTable.put("seagreen", new Color(0x2E, 0x8B, 0x57));
232
      colorTable.put("seashell", new Color(0xFF, 0xF5, 0xEE));
233
      colorTable.put("sienna", new Color(0xA0, 0x52, 0x2D));
234
      colorTable.put("silver", new Color(0xC0, 0xC0, 0xC0));
235
      colorTable.put("skyblue", new Color(0x87, 0xCE, 0xEB));
236
      colorTable.put("slateblue", new Color(0x6A, 0x5A, 0xCD));
237
      colorTable.put("Slategray", new Color(0x70, 0x80, 0x90));
238
      colorTable.put("slategrey", new Color(0x70, 0x80, 0x90));
239
      colorTable.put("snow", new Color(0xFF, 0xFA, 0xFA));
240
      colorTable.put("springgreen", new Color(0x00, 0xFF, 0x7F));
241
      colorTable.put("steelblue", new Color(0x46, 0x82, 0xB4));
242
      colorTable.put("tan", new Color(0xD2, 0xB4, 0x8C));
243
      colorTable.put("teal", new Color(0x00, 0x80, 0x80));
244
      colorTable.put("thistle", new Color(0xD8, 0xBF, 0xD8));
245
      colorTable.put("tomato", new Color(0xFF, 0x63, 0x47));
246
      colorTable.put("turquoise", new Color(0x40, 0xE0, 0xD0));
247
      colorTable.put("violet", new Color(0xEE, 0x82, 0xEE));
248
      colorTable.put("wheat", new Color(0xF5, 0xDE, 0xB3));
249
      colorTable.put("white", new Color(0xFF, 0xFF, 0xFF));
250
      colorTable.put("whitesmoke", new Color(0xF5, 0xF5, 0xF5));
251
      colorTable.put("yellow", new Color(0xFF, 0xFF, 0x00));
252
      colorTable.put("yellowgreen", new Color(0x9A, 0xCD, 0x32));
253
    }
254
    return colorTable.get(name.toLowerCase());
255
  }
256

    
257
  public static class CoerceColorToString extends AbstractCoercion {
258

    
259
    @Override
260
    public Object coerce(Object value, CoercionContext context) throws CoercionException {
261
      if (value == null || value instanceof String) {
262
        return value;
263
      }
264
      if (value instanceof Color) {
265
        int rgb = ((Color) value).getRGB();
266
        int r = ((Color) value).getRed();
267
        int g = ((Color) value).getGreen();
268
        int b = ((Color) value).getBlue();
269
        int a = ((Color) value).getAlpha();
270
        for (Map.Entry<String, Color> entry : colorTable.entrySet()) {
271
          String name = entry.getKey();
272
          Color color = entry.getValue();
273
          if (rgb == color.getRGB() && color.getAlpha() == a) {
274
            return name;
275
          }
276
        }
277
        return String.format("rgb(0x%02x,0x%02x,0x%02x,0x%02x)", r, g, b, a);
278
      }
279
      throw new CoercionException("Can't convert '" + value.getClass().getName() + "' to string");
280
    }
281

    
282
  }
283

    
284
  public static void selfRegister() {
285
    DataTypesManager dataTypesManager = ToolsLocator.getDataTypesManager();
286
    dataTypesManager.addtype(DataTypes.COLOR, null, "Color", Color.class, new CoerceToColor());
287
    dataTypesManager.addCoercion(DataTypes.STRING, new CoerceColorToString());
288
  }
289
}