1 /****************************************************************************/
2 // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.org/sumo
3 // Copyright (C) 2001-2019 German Aerospace Center (DLR) and others.
4 // This program and the accompanying materials
5 // are made available under the terms of the Eclipse Public License v2.0
6 // which accompanies this distribution, and is available at
7 // http://www.eclipse.org/legal/epl-v20.html
8 // SPDX-License-Identifier: EPL-2.0
9 /****************************************************************************/
10 /// @file GNEChange_Additional.cpp
11 /// @author Pablo Alvarez Lopez
12 /// @date Nov 2015
13 /// @version $Id$
14 ///
15 // A network change in which a busStop is created or deleted
16 /****************************************************************************/
17
18 // ===========================================================================
19 // included modules
20 // ===========================================================================
21 #include <config.h>
22
23 #include <netedit/GNENet.h>
24 #include <netedit/netelements/GNELane.h>
25 #include <netedit/netelements/GNEEdge.h>
26 #include <netedit/additionals/GNEShape.h>
27 #include <netedit/additionals/GNEAdditional.h>
28 #include <netedit/demandelements/GNEDemandElement.h>
29 #include <netedit/frames/GNEFrame.h>
30 #include <netedit/GNEViewParent.h>
31 #include <netedit/GNEViewNet.h>
32
33 #include "GNEChange_Additional.h"
34
35 // ===========================================================================
36 // FOX-declarations
37 // ===========================================================================
38 FXIMPLEMENT_ABSTRACT(GNEChange_Additional, GNEChange, nullptr, 0)
39
40 // ===========================================================================
41 // member method definitions
42 // ===========================================================================
43
GNEChange_Additional(GNEAdditional * additional,bool forward)44 GNEChange_Additional::GNEChange_Additional(GNEAdditional* additional, bool forward) :
45 GNEChange(additional->getViewNet()->getNet(), forward),
46 myAdditional(additional),
47 myEdgeParents(myAdditional->getEdgeParents()),
48 myLaneParents(myAdditional->getLaneParents()),
49 myShapeParents(myAdditional->getShapeParents()),
50 myAdditionalParents(myAdditional->getAdditionalParents()),
51 myDemandElementParents(myAdditional->getDemandElementParents()),
52 myEdgeChilds(myAdditional->getEdgeChilds()),
53 myLaneChilds(myAdditional->getLaneChilds()),
54 myShapeChilds(myAdditional->getShapeChilds()),
55 myAdditionalChilds(myAdditional->getAdditionalChilds()),
56 myDemandElementChilds(myAdditional->getDemandElementChilds()) {
57 myAdditional->incRef("GNEChange_Additional");
58 }
59
60
~GNEChange_Additional()61 GNEChange_Additional::~GNEChange_Additional() {
62 assert(myAdditional);
63 myAdditional->decRef("GNEChange_Additional");
64 if (myAdditional->unreferenced()) {
65 // show extra information for tests
66 WRITE_DEBUG("Deleting unreferenced " + myAdditional->getTagStr() + " '" + myAdditional->getID() + "'");
67 // make sure that additional isn't in net before removing
68 if (myNet->additionalExist(myAdditional)) {
69 myNet->deleteAdditional(myAdditional, false);
70 }
71 delete myAdditional;
72 }
73 }
74
75
76 void
undo()77 GNEChange_Additional::undo() {
78 if (myForward) {
79 // show extra information for tests
80 WRITE_DEBUG("Removing " + myAdditional->getTagStr() + " '" + myAdditional->getID() + "' in GNEChange_Additional");
81 // delete additional from net
82 myNet->deleteAdditional(myAdditional, false);
83 // Remove additional from parent elements
84 for (const auto& i : myEdgeParents) {
85 i->removeAdditionalChild(myAdditional);
86 }
87 for (const auto& i : myLaneParents) {
88 i->removeAdditionalChild(myAdditional);
89 }
90 for (const auto& i : myShapeParents) {
91 i->removeAdditionalChild(myAdditional);
92 }
93 for (const auto& i : myAdditionalParents) {
94 i->removeAdditionalChild(myAdditional);
95 }
96 for (const auto& i : myDemandElementParents) {
97 i->removeAdditionalChild(myAdditional);
98 }
99 // Remove additional from child elements
100 for (const auto& i : myEdgeChilds) {
101 i->removeAdditionalParent(myAdditional);
102 }
103 for (const auto& i : myLaneChilds) {
104 i->removeAdditionalParent(myAdditional);
105 }
106 for (const auto& i : myShapeChilds) {
107 i->removeAdditionalChild(myAdditional);
108 }
109 for (const auto& i : myAdditionalChilds) {
110 i->removeAdditionalParent(myAdditional);
111 }
112 for (const auto& i : myDemandElementChilds) {
113 i->removeAdditionalParent(myAdditional);
114 }
115 } else {
116 // show extra information for tests
117 WRITE_DEBUG("Adding " + myAdditional->getTagStr() + " '" + myAdditional->getID() + "' in GNEChange_Additional");
118 // insert additional into net
119 myNet->insertAdditional(myAdditional);
120 // add additional in parent elements
121 for (const auto& i : myEdgeParents) {
122 i->addAdditionalChild(myAdditional);
123 }
124 for (const auto& i : myLaneParents) {
125 i->addAdditionalChild(myAdditional);
126 }
127 for (const auto& i : myShapeParents) {
128 i->addAdditionalChild(myAdditional);
129 }
130 for (const auto& i : myAdditionalParents) {
131 i->addAdditionalChild(myAdditional);
132 }
133 for (const auto& i : myDemandElementParents) {
134 i->addAdditionalChild(myAdditional);
135 }
136 // add additional in child elements
137 for (const auto& i : myEdgeChilds) {
138 i->addAdditionalParent(myAdditional);
139 }
140 for (const auto& i : myLaneChilds) {
141 i->addAdditionalParent(myAdditional);
142 }
143 for (const auto& i : myShapeChilds) {
144 i->addAdditionalChild(myAdditional);
145 }
146 for (const auto& i : myAdditionalChilds) {
147 i->addAdditionalParent(myAdditional);
148 }
149 for (const auto& i : myDemandElementChilds) {
150 i->addAdditionalParent(myAdditional);
151 }
152 }
153 // Requiere always save additionals
154 myNet->requiereSaveAdditionals(true);
155 }
156
157
158 void
redo()159 GNEChange_Additional::redo() {
160 if (myForward) {
161 // show extra information for tests
162 WRITE_DEBUG("Adding " + myAdditional->getTagStr() + " '" + myAdditional->getID() + "' in GNEChange_Additional");
163 // insert additional into net
164 myNet->insertAdditional(myAdditional);
165 // add additional in parent elements
166 for (const auto& i : myEdgeParents) {
167 i->addAdditionalChild(myAdditional);
168 }
169 for (const auto& i : myLaneParents) {
170 i->addAdditionalChild(myAdditional);
171 }
172 for (const auto& i : myShapeParents) {
173 i->addAdditionalChild(myAdditional);
174 }
175 for (const auto& i : myAdditionalParents) {
176 i->addAdditionalChild(myAdditional);
177 }
178 for (const auto& i : myDemandElementParents) {
179 i->addAdditionalChild(myAdditional);
180 }
181 // add additional in child elements
182 for (const auto& i : myEdgeChilds) {
183 i->addAdditionalParent(myAdditional);
184 }
185 for (const auto& i : myLaneChilds) {
186 i->addAdditionalParent(myAdditional);
187 }
188 for (const auto& i : myShapeChilds) {
189 i->addAdditionalChild(myAdditional);
190 }
191 for (const auto& i : myAdditionalChilds) {
192 i->addAdditionalParent(myAdditional);
193 }
194 for (const auto& i : myDemandElementChilds) {
195 i->addAdditionalParent(myAdditional);
196 }
197 } else {
198 // show extra information for tests
199 WRITE_DEBUG("Removing " + myAdditional->getTagStr() + " '" + myAdditional->getID() + "' in GNEChange_Additional");
200 // delete additional from net
201 myNet->deleteAdditional(myAdditional, false);
202 // Remove additional from parent elements
203 for (const auto& i : myEdgeParents) {
204 i->removeAdditionalChild(myAdditional);
205 }
206 for (const auto& i : myLaneParents) {
207 i->removeAdditionalChild(myAdditional);
208 }
209 for (const auto& i : myShapeParents) {
210 i->removeAdditionalChild(myAdditional);
211 }
212 for (const auto& i : myAdditionalParents) {
213 i->removeAdditionalChild(myAdditional);
214 }
215 for (const auto& i : myDemandElementParents) {
216 i->removeAdditionalChild(myAdditional);
217 }
218 // Remove additional from child elements
219 for (const auto& i : myEdgeChilds) {
220 i->removeAdditionalParent(myAdditional);
221 }
222 for (const auto& i : myLaneChilds) {
223 i->removeAdditionalParent(myAdditional);
224 }
225 for (const auto& i : myShapeChilds) {
226 i->removeAdditionalChild(myAdditional);
227 }
228 for (const auto& i : myAdditionalChilds) {
229 i->removeAdditionalParent(myAdditional);
230 }
231 for (const auto& i : myDemandElementChilds) {
232 i->removeAdditionalParent(myAdditional);
233 }
234 }
235 // Requiere always save additionals
236 myNet->requiereSaveAdditionals(true);
237 }
238
239
240 FXString
undoName() const241 GNEChange_Additional::undoName() const {
242 if (myForward) {
243 return ("Undo create " + myAdditional->getTagStr()).c_str();
244 } else {
245 return ("Undo delete " + myAdditional->getTagStr()).c_str();
246 }
247 }
248
249
250 FXString
redoName() const251 GNEChange_Additional::redoName() const {
252 if (myForward) {
253 return ("Redo create " + myAdditional->getTagStr()).c_str();
254 } else {
255 return ("Redo delete " + myAdditional->getTagStr()).c_str();
256 }
257 }
258