View Javadoc

1   /**********************************************
2    * Copyright (C) 2011 Lukas Laag
3    * This file is part of svgreal.
4    * 
5    * svgreal is free software: you can redistribute it and/or modify
6    * it under the terms of the GNU General Public License as published by
7    * the Free Software Foundation, either version 3 of the License, or
8    * (at your option) any later version.
9    * 
10   * svgreal is distributed in the hope that it will be useful,
11   * but WITHOUT ANY WARRANTY; without even the implied warranty of
12   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13   * GNU General Public License for more details.
14   * 
15   * You should have received a copy of the GNU General Public License
16   * along with svgreal.  If not, see http://www.gnu.org/licenses/
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   * Line model class.
46   * @author laaglu
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 }