1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.vectomatic.svg.edit.client.command.add;
19
20 import org.vectomatic.dom.svg.OMSVGElement;
21 import org.vectomatic.dom.svg.OMSVGPoint;
22 import org.vectomatic.dom.svg.OMSVGRectElement;
23 import org.vectomatic.dom.svg.OMSVGTransform;
24 import org.vectomatic.dom.svg.impl.SVGElement;
25 import org.vectomatic.dom.svg.utils.SVGConstants;
26 import org.vectomatic.svg.edit.client.SvgrealApp;
27 import org.vectomatic.svg.edit.client.command.FactoryInstantiatorBase;
28 import org.vectomatic.svg.edit.client.command.IFactoryInstantiator;
29 import org.vectomatic.svg.edit.client.event.MouseDownProcessor;
30 import org.vectomatic.svg.edit.client.event.MouseMoveProcessor;
31 import org.vectomatic.svg.edit.client.event.MouseUpProcessor;
32 import org.vectomatic.svg.edit.client.model.ModelConstants;
33
34 import com.google.gwt.core.client.GWT;
35 import com.google.gwt.event.dom.client.MouseDownEvent;
36 import com.google.gwt.event.dom.client.MouseMoveEvent;
37 import com.google.gwt.event.dom.client.MouseUpEvent;
38
39
40
41
42
43 public class AddRectCommandFactory extends AddCommandFactoryBase implements MouseDownProcessor, MouseMoveProcessor, MouseUpProcessor {
44 @SuppressWarnings("serial")
45 public static final IFactoryInstantiator<AddRectCommandFactory> INSTANTIATOR = new FactoryInstantiatorBase<AddRectCommandFactory>(ModelConstants.INSTANCE.addRectCmdFactory(), ModelConstants.INSTANCE.addRectCmdFactoryDesc()) {
46 @Override
47 public AddRectCommandFactory create() {
48 return new AddRectCommandFactory();
49 }
50 };
51
52
53
54 protected OMSVGRectElement rect;
55
56
57
58 protected OMSVGPoint p1;
59
60
61
62 protected OMSVGPoint p2;
63
64 @Override
65 public IFactoryInstantiator<?> getInstantiator() {
66 return INSTANTIATOR;
67 }
68
69 @Override
70 public void start(Object requester) {
71 GWT.log("AddRectCommandFactory.start(" + requester + ")");
72 super.start(requester);
73 updateStatus(ModelConstants.INSTANCE.addRectCmdFactory1());
74 }
75
76 @Override
77 public boolean processMouseDown(MouseDownEvent event) {
78 if (owner != null && rect != null) {
79 owner.getTwinGroup().removeChild(rect);
80 }
81 updateStatus(ModelConstants.INSTANCE.addRectCmdFactory2());
82 owner = SvgrealApp.getApp().getActiveModel();
83 OMSVGElement parent = owner.getTwinGroup();
84 p1 = owner.getCoordinates(event, true);
85 p2 = owner.getSvgElement().createSVGPoint(p1);
86 rect = new OMSVGRectElement(p1.getX(), p1.getY(), 0, 0, 0, 0);
87 OMSVGTransform xform = owner.getSvgElement().createSVGTransform();
88 xform.setRotate(-owner.getRotation(), p1.getX(), p1.getY());
89 rect.getTransform().getBaseVal().appendItem(xform);
90 applyCssContextStyle((SVGElement) rect.getElement().cast());
91 rect.getStyle().setSVGProperty(SVGConstants.CSS_VISIBILITY_PROPERTY, SVGConstants.CSS_VISIBLE_VALUE);
92 parent.appendChild(rect);
93 return true;
94 }
95
96 @Override
97 public boolean processMouseUp(MouseUpEvent event) {
98 if (owner != null) {
99 updateStatus(ModelConstants.INSTANCE.addRectCmdFactory1());
100 if (rect.getWidth().getBaseVal().getValue() == 0 || rect.getHeight().getBaseVal().getValue() == 0) {
101 owner.getTwinGroup().removeChild(rect);
102 } else {
103 createCommand(rect);
104 }
105 rect = null;
106 owner = null;
107 }
108 return true;
109 }
110
111 @Override
112 public boolean processMouseMove(MouseMoveEvent event) {
113 if (owner != null) {
114 p2 = owner.getCoordinates(event, true);
115 float xmin = Math.min(p1.getX(), p2.getX());
116 float ymin = Math.min(p1.getY(), p2.getY());
117 float xmax = Math.max(p1.getX(), p2.getX());
118 float ymax = Math.max(p1.getY(), p2.getY());
119 rect.getX().getBaseVal().setValue(xmin);
120 rect.getY().getBaseVal().setValue(ymin);
121 rect.getWidth().getBaseVal().setValue(xmax - xmin);
122 rect.getHeight().getBaseVal().setValue(ymax - ymin);
123 }
124 return true;
125 }
126 }