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