01: package org.zilonis.tool.ext.aerith.g2d;
02:
03: import java.awt.Color;
04: import java.awt.LinearGradientPaint;
05: import java.util.Map;
06:
07: import org.jdesktop.fuse.TypeLoader;
08: import org.jdesktop.fuse.TypeLoaderFactory;
09: import org.jdesktop.fuse.TypeLoadingException;
10:
11: public class LinearGradientTypeLoader extends
12: TypeLoader<LinearGradientPaint> {
13: public LinearGradientTypeLoader() {
14: super (LinearGradientPaint.class);
15: }
16:
17: @Override
18: public LinearGradientPaint loadType(String name, String value,
19: Class<?> resolver, Map<String, Object> map) {
20: String[] parts = value.split("\\s?\\|\\s?");
21: if (parts.length < 4) {
22: throw new TypeLoadingException("Theme resource " + name
23: + " is not a valid gradient.");
24: }
25:
26: String[] startPoint = parts[0].split(",");
27: if (startPoint.length != 2) {
28: throw new TypeLoadingException("Start point " + parts[0]
29: + " is not valid in " + name);
30: }
31: float startX;
32: try {
33: startX = Float.parseFloat(startPoint[0]);
34: } catch (NumberFormatException e) {
35: throw new TypeLoadingException(
36: "Gradient start point is invalid in " + name + ".",
37: e);
38: }
39: float startY;
40: try {
41: startY = Float.parseFloat(startPoint[1]);
42: } catch (NumberFormatException e) {
43: throw new TypeLoadingException(
44: "Gradient start point is invalid in " + name + ".",
45: e);
46: }
47:
48: String[] endPoint = parts[1].split(",");
49: if (endPoint.length != 2) {
50: throw new TypeLoadingException("Start point " + parts[1]
51: + " is not valid in " + name);
52: }
53:
54: float endX;
55: try {
56: endX = Float.parseFloat(endPoint[0]);
57: } catch (NumberFormatException e) {
58: throw new TypeLoadingException(
59: "Gradient end point is invalid in " + name + ".", e);
60: }
61: float endY;
62: try {
63: endY = Float.parseFloat(endPoint[1]);
64: } catch (NumberFormatException e) {
65: throw new TypeLoadingException(
66: "Gradient end point is invalid in " + name + ".", e);
67: }
68:
69: float[] fractions = new float[parts.length - 2];
70: Color[] colors = new Color[parts.length - 2];
71: for (int i = 2; i < parts.length; i++) {
72: String[] stop = parts[i].split(",");
73: if (stop.length != 2) {
74: throw new TypeLoadingException("Gradient stop "
75: + parts[i] + " is not valid in " + name);
76: }
77: try {
78: fractions[i - 2] = Float.parseFloat(stop[0]);
79: } catch (NumberFormatException e) {
80: throw new TypeLoadingException(
81: "Gradient stop is invalid in " + name + ".", e);
82: }
83: TypeLoader<?> loader = TypeLoaderFactory
84: .getLoaderForType(Color.class);
85: colors[i - 2] = (Color) loader.loadType("gradient stop",
86: stop[1], resolver, null);
87: }
88:
89: return new LinearGradientPaint(startX, startY, endX, endY,
90: fractions, colors);
91: }
92: }
|