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.dnd;
19
20 import java.util.ArrayList;
21 import java.util.List;
22
23 import org.vectomatic.dom.svg.OMSVGMatrix;
24 import org.vectomatic.dom.svg.itf.ISVGTransformable;
25 import org.vectomatic.dom.svg.utils.SVGConstants;
26 import org.vectomatic.svg.edit.client.command.CommandFactories;
27 import org.vectomatic.svg.edit.client.command.DndCommandFactory.DropGesture;
28 import org.vectomatic.svg.edit.client.engine.SVGModel;
29 import org.vectomatic.svg.edit.client.model.svg.SVGElementModel;
30
31 import com.extjs.gxt.ui.client.data.BeanModel;
32 import com.extjs.gxt.ui.client.data.BeanModelLookup;
33
34
35
36
37
38 public class CopyCommand extends DndCommandBase {
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65 protected List<SVGElementModel> models;
66
67
68
69 protected List<SVGElementModel> clones;
70
71
72
73 protected SVGElementModel target;
74
75
76
77 protected DropGesture dropGesture;
78
79
80
81
82
83
84
85 protected String description;
86
87 public CopyCommand(List<SVGElementModel> models, SVGElementModel target, DropGesture dropGesture, String description) {
88 super(CommandFactories.getDndCommandFactory());
89 this.models = models;
90 this.target = target;
91 this.dropGesture = dropGesture;
92 this.description = description;
93
94 }
95
96 @Override
97 public String getDescription() {
98 return description;
99 }
100
101 @Override
102 public void commit() {
103 SVGModel owner = target.getOwner();
104 SVGElementModel parentModel = null;
105 SVGElementModel refModel = null;
106
107 if (dropGesture == DropGesture.OnNode) {
108
109 parentModel = target;
110 } else {
111
112 parentModel = (SVGElementModel) target.getParent();
113 if (dropGesture == DropGesture.BeforeNode) {
114 refModel = target;
115 } else if (dropGesture == DropGesture.AfterNode) {
116 refModel = target.getNextSibling();
117 }
118 }
119
120 if (clones == null) {
121 ISVGTransformable parentElement = (ISVGTransformable)parentModel.getElementWrapper();
122 OMSVGMatrix parentCTM = parentElement.getCTM();
123 clones = new ArrayList<SVGElementModel>();
124 for (SVGElementModel model : models) {
125 SVGElementModel clone = owner.clone(model, model.<String>get(SVGConstants.SVG_TITLE_TAG));
126
127
128
129
130
131
132 ISVGTransformable element = (ISVGTransformable)model.getElementWrapper();
133 OMSVGMatrix elementCTM = element.getCTM();
134 clone.updateTransform(parentCTM.inverse().multiply(elementCTM));
135 clones.add(clone);
136 }
137 }
138
139 for (SVGElementModel clone : clones) {
140 owner.insertBefore(parentModel, clone, refModel);
141 }
142
143 }
144
145 @Override
146 public void rollback() {
147 SVGModel owner = target.getOwner();
148 for (SVGElementModel clone : clones) {
149 owner.remove(clone);
150 }
151 }
152
153 @Override
154 public BeanModel asModel() {
155 return BeanModelLookup.get().getFactory(CopyCommand.class).createModel(this);
156 }
157
158 }