source: main/trunk/greenstone3/web/interfaces/default/js/map-scripts-editor-history.js@ 32769

Last change on this file since 32769 was 32769, checked in by ak19, 5 years ago

Map editor history changed into an object prototype (class).

File size: 10.2 KB
Line 
1//var prevOverlays = [];
2//var presentOverlays = [];
3//var undoneOverlays = [];
4//var cycleComplete = true;
5
6function MapEditorHistory()
7{
8 this.prevOverlays = [];
9 this.presentOverlays = [];
10 this.undoneOverlays = [];
11 this.cycleComplete = true;
12}
13
14MapEditorHistory.prototype.undo = function() {
15 for (let i = 0; i < overlays.length; i++) {
16 overlays[i].setMap(null);
17 }
18 if (this.prevOverlays.length != 0) {
19 selectedShapes = [];
20 overlays = [];
21 this.undoneOverlaysPush();
22 let prev_overlay = this.prevOverlays.pop();
23
24 if (prev_overlay.length > 0) {
25 for (var i = 0; i < prev_overlay.length; i++) {
26 overlays[i] = prev_overlay[i];
27 overlays[i].setMap(map);
28 overlays[i].draggable = draggableState;
29 }
30 }
31 }
32};
33
34
35
36
37
38MapEditorHistory.prototype.redo = function() {
39
40 if (this.undoneOverlays.length != 0) {
41 selectedShapes = [];
42 for (let i = 0; i < overlays.length; i++) {
43 overlays[i].setMap(null);
44 }
45
46 overlays = [];
47 var lastEntry = this.undoneOverlays[this.undoneOverlays.length - 1];
48 for (let i = 0; i < lastEntry.length; i++) {
49 overlays[i] = lastEntry[i];
50 overlays[i].setMap(map);
51 overlays[i].draggable = draggableState;
52 }
53
54 var conditionPrevious = this.presentOverlays[0];
55 if (conditionPrevious !== undefined) {
56 if (conditionPrevious.length == 0) {
57 this.prevOverlays.push(this.presentOverlays[0]);
58 } else {
59 var overlays_copy = [];
60 for (let i = 0; i < this.presentOverlays[0].length; i++) {
61 var clone_shape = this.cloneShape(this.presentOverlays[0][i]);
62 if (this.overlayItemIsShape(clone_shape)) {
63 addShapeListeners(clone_shape, null);
64 } else {
65 addMarkerListeners(clone_shape, null);
66 }
67 overlays_copy[i] = clone_shape;
68 }
69 this.prevOverlays.push(overlays_copy);
70 }
71 }
72 this.presentOverlays = [];
73 this.presentOverlays.push(this.undoneOverlays[this.undoneOverlays.length - 1]);
74 this.undoneOverlays.pop();
75 }
76}
77
78
79
80
81MapEditorHistory.prototype.clonePath = function(path){
82 var clone_path = [];
83
84 for (var i = 0; i < path.length; i++) {
85 var lati = path.getAt(i).lat();
86 var lngi = path.getAt(i).lng();
87 clone_lat_lng = {
88 lat: lati,
89 lng: lngi
90 };
91 clone_path.push(clone_lat_lng);
92 }
93
94 return clone_path;
95}
96
97
98MapEditorHistory.prototype.clonePolyline = function(polyline){
99 var path = polyline.getPath();
100 var geodesic = polyline.geodesic;
101 var strokeColor = polyline.strokeColor;
102 var strokeOpacity = polyline.strokeOpacity;
103 var strokeWeight = polyline.strokeWeight;
104 var clone_path = clonePath(path);
105 //var editable = rect.editable;
106
107 var clone_polyline = new google.maps.Polyline({
108 geodesic: geodesic,
109 strokeColor: strokeColor,
110 strokeOpacity: strokeOpacity,
111 strokeWeight: strokeWeight,
112 path: clone_path,
113 draggable: draggableState,
114 editable: false
115 });
116
117 clone_polyline.type = google.maps.drawing.OverlayType.POLYLINE;
118
119 return clone_polyline;
120}
121
122
123MapEditorHistory.prototype.clonePolygon = function(polygon){
124 var path = polygon.getPath();
125 var geodesic = polygon.geodesic;
126 var strokeColor = polygon.strokeColor;
127 var strokeOpacity = polygon.strokeOpacity;
128 var strokeWeight = polygon.strokeWeight;
129 var fillColor = polygon.fillColor;
130 var fillOpacity = polygon.fillOpacity;
131 var clone_path = clonePath(path);
132 //var editable = rect.editable;
133
134 var clone_polygon = new google.maps.Polygon({
135 geodesic: geodesic,
136 strokeColor: strokeColor,
137 strokeOpacity: strokeOpacity,
138 strokeWeight: strokeWeight,
139 fillColor: fillColor,
140 fillOpacity: fillOpacity,
141 path: clone_path,
142 draggable: draggableState,
143 editable: false
144 });
145
146 clone_polygon.type = google.maps.drawing.OverlayType.POLYGON;
147
148 return clone_polygon;
149}
150
151MapEditorHistory.prototype.cloneRectangle = function(rect){
152 var strokeColor = rect.strokeColor;
153 var strokeOpacity = rect.strokeOpacity;
154 var strokeWeight = rect.strokeWeight;
155 var fillColor = rect.fillColor;
156 var fillOpacity = rect.fillOpacity;
157 var bounds = rect.getBounds();
158 var type = rect.type;
159 //var editable = rect.editable;
160
161 var clone_rect = new google.maps.Rectangle({
162 strokeColor: strokeColor,
163 strokeOpacity: strokeOpacity,
164 strokeWeight: strokeWeight,
165 fillColor: fillColor,
166 fillOpacity: fillOpacity,
167 bounds: bounds,
168 draggable: draggableState,
169 editable: false,
170 type: type
171 });
172
173 clone_rect.type = google.maps.drawing.OverlayType.RECTANGLE;
174
175 return clone_rect;
176}
177
178MapEditorHistory.prototype.cloneCircle = function(circ){
179 var strokeColor = circ.strokeColor;
180 var strokeOpacity = circ.strokeOpacity;
181 var strokeWeight = circ.strokeWeight;
182 var fillColor = circ.fillColor;
183 var fillOpacity = circ.fillOpacity;
184 var center = circ.center;
185 var radius = circ.radius;
186 //var editable = rect.editable;
187
188 var clone_circ = new google.maps.Circle({
189 strokeColor: strokeColor,
190 strokeOpacity: strokeOpacity,
191 strokeWeight: strokeWeight,
192 fillColor: fillColor,
193 fillOpacity: fillOpacity,
194 center: center,
195 radius: radius,
196 draggable: draggableState,
197 editable: false
198 });
199
200 clone_circ.type = google.maps.drawing.OverlayType.CIRCLE;
201
202 return clone_circ;
203}
204
205MapEditorHistory.prototype.cloneMarker = function(marker){
206 var position = marker.getPosition();
207 var anchorPoint = marker.anchorPoint;
208 var clone_marker = new google.maps.Marker({
209 anchorPoint: anchorPoint,
210 position: position,
211 clickable: true,
212 draggable: draggableState,
213 editable: false
214 })
215 clone_marker.type = google.maps.drawing.OverlayType.MARKER;
216
217 return clone_marker;
218}
219
220MapEditorHistory.prototype.cloneShape = function(shape){
221 if (shape.type === google.maps.drawing.OverlayType.POLYLINE) {
222 let clone_polyline = this.clonePolyline(shape);
223 return clone_polyline;
224 } else if (shape.type === google.maps.drawing.OverlayType.POLYGON) {
225 let clone_polygon = this.clonePolygon(shape);
226 return clone_polygon;
227 } else if (shape.type === google.maps.drawing.OverlayType.RECTANGLE) {
228 let clone_rect = this.cloneRectangle(shape);
229 return clone_rect;
230
231 } else if (shape.type === google.maps.drawing.OverlayType.CIRCLE) {
232 let clone_circ = this.cloneCircle(shape);
233 return clone_circ;
234
235 } else {
236 let clone_marker = this.cloneMarker(shape);
237 return clone_marker;
238 }
239}
240
241MapEditorHistory.prototype.overlayItemIsShape = function(overlay_item){
242 var type = overlay_item.type;
243
244 is_shape = (type === google.maps.drawing.OverlayType.POLYLINE)
245 || (type === google.maps.drawing.OverlayType.POLYGON)
246 || (type === google.maps.drawing.OverlayType.RECTANGLE)
247 || (type === google.maps.drawing.OverlayType.CIRCLE);
248
249 return is_shape;
250}
251MapEditorHistory.prototype.historyOverlayPush = function(){
252 if (this.cycleComplete) {
253 var overlays_copy = [];
254 for (var i = 0; i < overlays.length; i++) {
255 let clone_shape = this.cloneShape(overlays[i]);
256
257 if (this.overlayItemIsShape(clone_shape)) {
258 addShapeListeners(clone_shape, null); // don't have an overlay event!
259 } else {
260 addMarkerListeners(clone_shape, null); // don't have an overlay event!
261 }
262 overlays_copy[i] = clone_shape;
263 }
264 undoneOverlays = [];
265 this.prevOverlays.push(overlays_copy);
266 }
267
268 cycleComplete = false;
269}
270
271MapEditorHistory.prototype.presentOverlayPush = function(){
272 this.presentOverlays = [];
273 var overlays_copy = [];
274 for (var i = 0; i < overlays.length; i++) {
275 let clone_shape = this.cloneShape(overlays[i]);
276 if (this.overlayItemIsShape(clone_shape)) {
277 addShapeListeners(clone_shape, null); // don't have an overlay event!
278 } else {
279 this.addMarkerListeners(clone_shape, null); // don't have an overlay event!
280 }
281 overlays_copy[i] = clone_shape;
282 }
283 this.presentOverlays.push(overlays_copy);
284 cycleComplete = true;
285
286}
287
288MapEditorHistory.prototype.undoneOverlaysPush = function(){
289presentOverlayPush
290 var conditionUndone = presentOverlays[presentOverlays.length - 1] !== undefined;
291
292 if (conditionUndone) {
293 let overlays_copy = [];
294 for (var i = 0; i < presentOverlays[0].length; i++) {
295 var clone_shape = cloneShape(presentOverlays[0][i]);
296 if (overlayItemIsShape(clone_shape)) {
297 addShapeListeners(clone_shape, null); // don't have an overlay event!
298 } else {
299 addMarkerListeners(clone_shape, null); // don't have an overlay event!
300 }
301 overlays_copy[i] = clone_shape;
302 }
303 undoneOverlays.push(overlays_copy);
304 }
305
306 var conditionPresent = prevOverlays[prevOverlays.length - 1] !== undefined;
307
308 if (conditionPresent) {
309 presentOverlays = [];
310 var overlays_copy = [];
311 for (var i = 0; i < prevOverlays[prevOverlays.length - 1].length; i++) {
312 let clone_shape = cloneShape(prevOverlays[prevOverlays.length - 1][i]);
313 if (overlayItemIsShape(clone_shape)) {
314 addShapeListeners(clone_shape, null); // don't have an overlay event!
315 } else {
316 addMarkerListeners(clone_shape, null); // don't have an overlay event!
317 }
318 overlays_copy[i] = clone_shape;
319 }
320 presentOverlays.push(overlays_copy);
321 }
322}
323
324
325MapEditorHistory.prototype.undoneOverlaysPush = function() {
326
327 let conditionUndone = this.presentOverlays[this.presentOverlays.length - 1] !== undefined;
328
329 if (conditionUndone) {
330 var overlays_copy = [];
331 for (var i = 0; i < this.presentOverlays[0].length; i++) {
332 let clone_shape = this.cloneShape(this.presentOverlays[0][i]);
333 if (this.overlayItemIsShape(clone_shape)) {
334 addShapeListeners(clone_shape, null); // don't have an overlay event!
335 } else {
336 addMarkerListeners(clone_shape, null); // don't have an overlay event!
337 }
338 overlays_copy[i] = clone_shape;
339 }
340 this.undoneOverlays.push(overlays_copy);
341 }
342
343 let conditionPresent = this.prevOverlays[this.prevOverlays.length - 1] !== undefined;
344
345 if (conditionPresent) {
346 this.presentOverlays = [];
347 var overlays_copy = [];
348 for (let i = 0; i < this.prevOverlays[this.prevOverlays.length - 1].length; i++) {
349 var clone_shape = this.cloneShape(this.prevOverlays[this.prevOverlays.length - 1][i]);
350 if (this.overlayItemIsShape(clone_shape)) {
351 addShapeListeners(clone_shape, null); // don't have an overlay event!
352 } else {
353 addMarkerListeners(clone_shape, null); // don't have an overlay event!
354 }
355 overlays_copy[i] = clone_shape;
356 }
357 this.presentOverlays.push(overlays_copy);
358 }
359}
360
Note: See TracBrowser for help on using the repository browser.