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.Collections;
22 import java.util.HashSet;
23 import java.util.List;
24 import java.util.Set;
25
26 import org.vectomatic.dom.svg.OMSVGElement;
27 import org.vectomatic.dom.svg.itf.ISVGTransformable;
28 import org.vectomatic.dom.svg.utils.SVGConstants;
29 import org.vectomatic.svg.edit.client.command.CommandFactories;
30 import org.vectomatic.svg.edit.client.command.DndCommandFactory.DropGesture;
31 import org.vectomatic.svg.edit.client.engine.SVGModel;
32 import org.vectomatic.svg.edit.client.model.ModelConstants;
33 import org.vectomatic.svg.edit.client.model.svg.SVGElementModel;
34 import org.vectomatic.svg.edit.client.model.svg.SVGNamedElementModel;
35
36 import com.extjs.gxt.ui.client.data.BeanModel;
37 import com.extjs.gxt.ui.client.data.BeanModelLookup;
38 import com.extjs.gxt.ui.client.util.Format;
39
40
41
42
43
44 public class ReorderCommand extends DndCommandBase {
45
46
47
48 protected List<SVGElementModel> models;
49
50
51
52 protected List<SVGElementModel> sortedModels;
53
54
55
56 protected List<SVGElementModel> parentModels;
57
58
59
60 protected List<SVGElementModel> refModels;
61
62
63
64 protected List<String> xforms;
65
66
67
68 protected SVGElementModel target;
69
70
71
72 protected DropGesture dropGesture;
73
74
75
76 protected SVGModel owner;
77
78 public ReorderCommand(List<SVGElementModel> models, SVGElementModel target, DropGesture dropGesture) {
79 super(CommandFactories.getDndCommandFactory());
80 this.target = target;
81 this.dropGesture = dropGesture;
82 this.models = new ArrayList<SVGElementModel>(models);
83
84 Collections.<SVGElementModel>sort(models, SVGElementModel.getAscendingCompataror());
85 this.sortedModels = models;
86 Set<SVGElementModel> modelSet = new HashSet<SVGElementModel>(models);
87 parentModels = new ArrayList<SVGElementModel>();
88 refModels = new ArrayList<SVGElementModel>();
89 xforms = new ArrayList<String>();
90 for (SVGElementModel model : sortedModels) {
91 SVGModel owner = model.getOwner();
92 if (this.owner == null) {
93 this.owner = owner;
94 } else {
95 assert this.owner == owner : "Attempt to move models from heterogeneous owners: " + this.owner + ", " + owner;
96 }
97 SVGElementModel parentModel = (SVGElementModel) model.getParent();
98 parentModels.add(parentModel);
99
100 SVGElementModel siblingModel = model;
101 while (((siblingModel = siblingModel.getNextSibling()) != null) && modelSet.contains(siblingModel)) {
102 }
103 refModels.add(siblingModel);
104 xforms.add(model.<String>get(SVGConstants.SVG_TRANSFORM_ATTRIBUTE));
105 }
106 }
107
108 @Override
109 public String getDescription() {
110 String message = null;
111 switch(dropGesture) {
112 case OnNode:
113 message = ModelConstants.INSTANCE.dndReorderCmdIn();
114 break;
115 case BeforeNode:
116 message = ModelConstants.INSTANCE.dndReorderCmdBefore();
117 break;
118 case AfterNode:
119 message = ModelConstants.INSTANCE.dndReorderCmdAfter();
120 break;
121 }
122 return Format.substitute(message, SVGNamedElementModel.getNames(models), target.toString());
123 }
124
125 @Override
126 public void commit() {
127 SVGElementModel parentModel = null;
128 SVGElementModel refModel = null;
129 if (dropGesture == DropGesture.OnNode) {
130
131 parentModel = target;
132 } else {
133
134 parentModel = (SVGElementModel) target.getParent();
135 if (dropGesture == DropGesture.BeforeNode) {
136 refModel = target;
137 } else if (dropGesture == DropGesture.AfterNode) {
138 refModel = target.getNextSibling();
139 }
140 }
141
142 for (SVGElementModel model : models) {
143
144
145
146
147
148
149 OMSVGElement element = model.getElementWrapper();
150 OMSVGElement parentElement = parentModel.getElementWrapper();
151 model.updateTransform(((ISVGTransformable)element).getTransformToElement(parentElement));
152
153 owner.insertBefore(parentModel, model, refModel);
154 }
155 }
156
157 @Override
158 public void rollback() {
159 for (int i = 0, size = sortedModels.size(); i < size; i++) {
160 SVGElementModel model = sortedModels.get(i);
161 SVGElementModel parentModel = parentModels.get(i);
162 SVGElementModel refModel = refModels.get(i);
163 owner.insertBefore(parentModel, model, refModel);
164 String matrix = xforms.get(i);
165 if (matrix == null || matrix.length() == 0) {
166 model.remove(SVGConstants.SVG_TRANSFORM_ATTRIBUTE);
167 } else {
168 model.set(SVGConstants.SVG_TRANSFORM_ATTRIBUTE, matrix);
169 }
170 }
171 }
172
173 @Override
174 public BeanModel asModel() {
175 return BeanModelLookup.get().getFactory(ReorderCommand.class).createModel(this);
176 }
177
178 }