1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.vectomatic.svg.edit.client.model.svg;
19
20 import java.util.ArrayList;
21 import java.util.List;
22
23 import org.vectomatic.dom.svg.OMSVGLength;
24 import org.vectomatic.dom.svg.impl.SVGElement;
25 import org.vectomatic.dom.svg.impl.SVGLineElement;
26 import org.vectomatic.dom.svg.utils.SVGConstants;
27 import org.vectomatic.svg.edit.client.AppBundle;
28 import org.vectomatic.svg.edit.client.command.EditGeometryCommandFactory;
29 import org.vectomatic.svg.edit.client.command.EditTransformCommandFactory;
30 import org.vectomatic.svg.edit.client.command.IFactoryInstantiator;
31 import org.vectomatic.svg.edit.client.engine.SVGModel;
32 import org.vectomatic.svg.edit.client.gxt.binding.FormPanelUtils;
33 import org.vectomatic.svg.edit.client.inspector.GenericSectionFactory;
34 import org.vectomatic.svg.edit.client.model.IValidator;
35 import org.vectomatic.svg.edit.client.model.JSMetadata;
36 import org.vectomatic.svg.edit.client.model.MetaModel;
37 import org.vectomatic.svg.edit.client.model.MetadataBase;
38 import org.vectomatic.svg.edit.client.model.ModelCategory;
39 import org.vectomatic.svg.edit.client.model.ModelConstants;
40 import org.vectomatic.svg.edit.client.model.ValidationConstants;
41 import org.vectomatic.svg.edit.client.model.ValidationError;
42 import org.vectomatic.svg.edit.client.model.ValidationError.Severity;
43
44
45
46
47
48 public class SVGLineElementModel extends SVGStyledElementModel {
49 private static MetaModel<SVGElement> metaModel;
50
51 public SVGLineElementModel(SVGModel owner, SVGLineElement element, SVGLineElement twin) {
52 super(owner, element, twin);
53 }
54
55 @Override
56 public MetaModel<SVGElement> getMetaModel() {
57 return getLineElementMetaModel();
58 }
59
60 public static MetaModel<SVGElement> getLineElementMetaModel() {
61 if (metaModel == null) {
62 metaModel = new MetaModel<SVGElement>();
63 ModelConstants constants = ModelConstants.INSTANCE;
64
65 ModelCategory<SVGElement> geometricCategory = new ModelCategory<SVGElement>(
66 ModelCategory.GEOMETRY,
67 constants.geometry(),
68 GenericSectionFactory.INSTANCE);
69
70 IValidator<SVGLength, SVGElement> lengthValidator = new IValidator<SVGLength, SVGElement>() {
71 final ValidationError zeroLength = new ValidationError(Severity.WARNING, ValidationConstants.INSTANCE.zeroLength());
72 @Override
73 public ValidationError validate(SVGElement model, SVGLength value) {
74 float x1 = model.<SVGLineElement>cast().getX1().getBaseVal().getValue();
75 float x2 = model.<SVGLineElement>cast().getX2().getBaseVal().getValue();
76 if (x1 != x2) {
77 return null;
78 }
79 float y1 = model.<SVGLineElement>cast().getY1().getBaseVal().getValue();
80 float y2 = model.<SVGLineElement>cast().getY2().getBaseVal().getValue();
81 if (y1 != y2) {
82 return null;
83 }
84 return zeroLength;
85 }
86 };
87
88 MetadataBase<SVGLength, SVGElement> x1 = new JSMetadata<SVGLength, SVGElement>(
89 SVGConstants.SVG_X1_ATTRIBUTE,
90 constants.lineX1(),
91 FormPanelUtils.SVGLENGTH_FIELD_FACTORY,
92 new SVGLengthAccessor() {
93 @Override
94 public OMSVGLength getLength(SVGElement element) {
95 return element.<SVGLineElement>cast().getX1().getBaseVal();
96 }
97 },
98 EditGeometryCommandFactory.INSTANTIATOR,
99 lengthValidator);
100 MetadataBase<SVGLength, SVGElement> y1 = new JSMetadata<SVGLength, SVGElement>(
101 SVGConstants.SVG_Y1_ATTRIBUTE,
102 constants.lineY1(),
103 FormPanelUtils.SVGLENGTH_FIELD_FACTORY,
104 new SVGLengthAccessor() {
105 @Override
106 public OMSVGLength getLength(SVGElement element) {
107 return element.<SVGLineElement>cast().getY1().getBaseVal();
108 }
109 },
110 EditGeometryCommandFactory.INSTANTIATOR,
111 lengthValidator);
112 MetadataBase<SVGLength, SVGElement> x2 = new JSMetadata<SVGLength, SVGElement>(
113 SVGConstants.SVG_X2_ATTRIBUTE,
114 constants.lineX2(),
115 FormPanelUtils.SVGLENGTH_FIELD_FACTORY,
116 new SVGLengthAccessor() {
117 @Override
118 public OMSVGLength getLength(SVGElement element) {
119 return element.<SVGLineElement>cast().getX2().getBaseVal();
120 }
121 },
122 EditGeometryCommandFactory.INSTANTIATOR,
123 lengthValidator);
124 MetadataBase<SVGLength, SVGElement> y2 = new JSMetadata<SVGLength, SVGElement>(
125 SVGConstants.SVG_Y2_ATTRIBUTE,
126 constants.lineY2(),
127 FormPanelUtils.SVGLENGTH_FIELD_FACTORY,
128 new SVGLengthAccessor() {
129 @Override
130 public OMSVGLength getLength(SVGElement element) {
131 return element.<SVGLineElement>cast().getY2().getBaseVal();
132 }
133 },
134 EditGeometryCommandFactory.INSTANTIATOR,
135 lengthValidator);
136 geometricCategory.addMetadata(x1);
137 geometricCategory.addMetadata(y1);
138 geometricCategory.addMetadata(x2);
139 geometricCategory.addMetadata(y2);
140 IFactoryInstantiator<?>[][] contextMenuFactories = new IFactoryInstantiator<?>[][] {
141 {
142 EditGeometryCommandFactory.INSTANTIATOR,
143 EditTransformCommandFactory.INSTANTIATOR
144 }
145 };
146 List<ModelCategory<SVGElement>> categories = new ArrayList<ModelCategory<SVGElement>>();
147 categories.add(SVGNamedElementModel.getGlobalCategory());
148 categories.add(SVGElementModel.getDisplayCategory());
149 categories.add(geometricCategory);
150 categories.add(SVGStyledElementModel.createStrokeFillCategory(
151 new String[] {
152 SVGConstants.CSS_STROKE_PROPERTY,
153 SVGConstants.CSS_STROKE_OPACITY_PROPERTY,
154 SVGConstants.CSS_STROKE_WIDTH_PROPERTY,
155 SVGConstants.CSS_STROKE_LINECAP_PROPERTY,
156 SVGConstants.CSS_STROKE_DASHARRAY_PROPERTY,
157 SVGConstants.CSS_STROKE_DASHOFFSET_PROPERTY
158 }));
159 categories.add(SVGElementModel.getTransformCategory());
160 metaModel.init(
161 constants.line(),
162 AppBundle.INSTANCE.line(),
163 categories,
164 contextMenuFactories);
165
166 }
167 return metaModel;
168 }
169 }