SUMO - Simulation of Urban MObility
GNEDeleteFrame.cpp
Go to the documentation of this file.
1 /****************************************************************************/
7 // The Widget for remove network-elements
8 /****************************************************************************/
9 // SUMO, Simulation of Urban MObility; see http://sumo.dlr.de/
10 // Copyright (C) 2001-2017 DLR (http://www.dlr.de/) and contributors
11 /****************************************************************************/
12 //
13 // This file is part of SUMO.
14 // SUMO is free software: you can redistribute it and/or modify
15 // it under the terms of the GNU General Public License as published by
16 // the Free Software Foundation, either version 3 of the License, or
17 // (at your option) any later version.
18 //
19 /****************************************************************************/
20 
21 
22 // ===========================================================================
23 // included modules
24 // ===========================================================================
25 #ifdef _MSC_VER
26 #include <windows_config.h>
27 #else
28 #include <config.h>
29 #endif
30 
31 #include <iostream>
44 
45 #include "GNEAdditionalFrame.h"
46 #include "GNEAttributeCarrier.h"
47 #include "GNEChange_Selection.h"
48 #include "GNEConnection.h"
49 #include "GNECrossing.h"
50 #include "GNEDeleteFrame.h"
51 #include "GNEEdge.h"
52 #include "GNEInspectorFrame.h"
53 #include "GNEJunction.h"
54 #include "GNELane.h"
55 #include "GNENet.h"
56 #include "GNEPOI.h"
57 #include "GNEPoly.h"
58 #include "GNEUndoList.h"
59 #include "GNEViewNet.h"
60 #include "GNEViewParent.h"
61 #include "GNERerouter.h"
62 #include "GNEChange_POI.h"
63 #include "GNEChange_Poly.h"
64 
65 
66 // ===========================================================================
67 // FOX callback mapping
68 // ===========================================================================
69 
70 FXDEFMAP(GNEDeleteFrame) GNEDeleteFrameMap[] = {
71  FXMAPFUNC(SEL_RIGHTBUTTONRELEASE, MID_GNE_CHILDS, GNEDeleteFrame::onCmdShowChildMenu),
75 };
76 
77 // Object implementation
78 FXIMPLEMENT(GNEDeleteFrame, FXVerticalFrame, GNEDeleteFrameMap, ARRAYNUMBER(GNEDeleteFrameMap))
79 
80 // ===========================================================================
81 // method definitions
82 // ===========================================================================
83 GNEDeleteFrame::GNEDeleteFrame(FXHorizontalFrame* horizontalFrameParent, GNEViewNet* viewNet) :
84  GNEFrame(horizontalFrameParent, viewNet, "Delete"),
85  myMarkedAC(NULL) {
86  // Create Groupbox for current element
87  myGroupBoxCurrentElement = new FXGroupBox(myContentFrame, "Current element", GUIDesignGroupBoxFrame);
88  myCurrentElementLabel = new FXLabel(myGroupBoxCurrentElement, "No item under cursor", 0, GUIDesignLabelLeft);
89 
90  // Create Groupbox for current element
91  myGroupBoxOptions = new FXGroupBox(myContentFrame, "Options", GUIDesignGroupBoxFrame);
92 
93  // Create checkbox for enabling/disabling automatic deletion of additionals childs (by default, enabled)
94  myAutomaticallyDeleteAdditionalsCheckButton = new FXCheckButton(myGroupBoxOptions, "Force deletion of additionals", this, MID_GNE_AUTOMATICALLYDELETEADDITIONALS, GUIDesignCheckButtonAttribute);
95  myAutomaticallyDeleteAdditionalsCheckButton->setCheck(true);
96 
97  // Create groupbox for tree list
98  myGroupBoxTreeList = new FXGroupBox(myContentFrame, "Childs", GUIDesignGroupBoxFrame);
99  myMarkedElementLabel = new FXLabel(myGroupBoxTreeList, "No item marked", 0, GUIDesignLabelLeft);
100  myTreelist = new FXTreeList(myGroupBoxTreeList, this, MID_GNE_CHILDS, GUIDesignTreeListFrame);
101 
102  // Create groupbox for help
103  myGroupBoxInformation = new FXGroupBox(myContentFrame, "Information", GUIDesignGroupBoxFrame);
104  myInformationLabel = new FXLabel(myGroupBoxInformation, " - Left click to delete element.\n - Hold <CTRL> and left click\n to mark element.\n - Left click in another element\n dismark marked element.", 0, GUIDesignLabelLeft);
105 }
106 
107 
109 
110 
111 void
113  // clear items
114  myTreelist->clearItems();
115  myTreeItemToACMap.clear();
116  myTreeItemsWithoutAC.clear();
117  // Switch gl type of ac
118  if (myMarkedAC) {
119  switch (dynamic_cast<GUIGlObject*>(myMarkedAC)->getType()) {
120  case GLO_JUNCTION: {
121  // insert junction root
122  GNEJunction* junction = dynamic_cast<GNEJunction*>(myMarkedAC);
123  FXTreeItem* junctionItem = myTreelist->insertItem(0, 0, toString(junction->getTag()).c_str(), junction->getIcon(), junction->getIcon());
124  myTreeItemToACMap[junctionItem] = junction;
125  junctionItem->setExpanded(true);
126  // insert edges
127  for (int i = 0; i < (int)junction->getGNEEdges().size(); i++) {
128  GNEEdge* edge = junction->getGNEEdges().at(i);
129  FXTreeItem* edgeItem = myTreelist->insertItem(0, junctionItem, (toString(edge->getTag()) + " " + toString(i)).c_str(), edge->getIcon(), edge->getIcon());
130  myTreeItemToACMap[edgeItem] = edge;
131  edgeItem->setExpanded(true);
132  // insert lanes
133  for (int j = 0; j < (int)edge->getLanes().size(); j++) {
134  GNELane* lane = edge->getLanes().at(j);
135  FXTreeItem* laneItem = myTreelist->insertItem(0, edgeItem, (toString(lane->getTag()) + " " + toString(j)).c_str(), lane->getIcon(), lane->getIcon());
136  myTreeItemToACMap[laneItem] = lane;
137  laneItem->setExpanded(true);
138  // insert additionals of lanes
139  for (int k = 0; k < (int)lane->getAdditionalChilds().size(); k++) {
140  GNEAdditional* additional = lane->getAdditionalChilds().at(k);
141  FXTreeItem* additionalItem = myTreelist->insertItem(0, laneItem, (toString(additional->getTag()) + " " + toString(k)).c_str(), additional->getIcon(), additional->getIcon());
142  myTreeItemToACMap[additionalItem] = additional;
143  additionalItem->setExpanded(true);
144  }
145  // insert incoming connections of lanes (by default isn't expanded)
146  if (lane->getGNEIncomingConnections().size() > 0) {
147  FXTreeItem* incomingConnections = myTreelist->insertItem(0, laneItem, "Incomings", lane->getGNEIncomingConnections().front()->getIcon(), lane->getGNEIncomingConnections().front()->getIcon());
148  myTreeItemsWithoutAC.insert(incomingConnections);
149  incomingConnections->setExpanded(false);
150  for (int k = 0; k < (int)lane->getGNEIncomingConnections().size(); k++) {
151  GNEConnection* connection = lane->getGNEIncomingConnections().at(k);
152  FXTreeItem* connectionItem = myTreelist->insertItem(0, incomingConnections, (toString(connection->getTag()) + " " + toString(k)).c_str(), connection->getIcon(), connection->getIcon());
153  myTreeItemToACMap[connectionItem] = connection;
154  connectionItem->setExpanded(true);
155  }
156  }
157  // insert outcoming connections of lanes (by default isn't expanded)
158  if (lane->getGNEOutcomingConnections().size() > 0) {
159  FXTreeItem* outgoingConnections = myTreelist->insertItem(0, laneItem, "Outcomings", lane->getGNEOutcomingConnections().front()->getIcon(), lane->getGNEOutcomingConnections().front()->getIcon());
160  myTreeItemsWithoutAC.insert(outgoingConnections);
161  outgoingConnections->setExpanded(false);
162  for (int k = 0; k < (int)lane->getGNEOutcomingConnections().size(); k++) {
163  GNEConnection* connection = lane->getGNEOutcomingConnections().at(k);
164  FXTreeItem* connectionItem = myTreelist->insertItem(0, outgoingConnections, (toString(connection->getTag()) + " " + toString(k)).c_str(), connection->getIcon(), connection->getIcon());
165  myTreeItemToACMap[connectionItem] = connection;
166  connectionItem->setExpanded(true);
167  }
168  }
169  }
170  // insert additionals of edge
171  for (int j = 0; j < (int)edge->getAdditionalChilds().size(); j++) {
172  GNEAdditional* additional = edge->getAdditionalChilds().at(j);
173  FXTreeItem* additionalItem = myTreelist->insertItem(0, edgeItem, (toString(additional->getTag()) + " " + toString(j)).c_str(), additional->getIcon(), additional->getIcon());
174  myTreeItemToACMap[additionalItem] = additional;
175  additionalItem->setExpanded(true);
176  }
177 
178  }
179  // insert crossings
180  for (int i = 0; i < (int)junction->getGNECrossings().size(); i++) {
181  GNECrossing* crossing = junction->getGNECrossings().at(i);
182  FXTreeItem* crossingItem = myTreelist->insertItem(0, junctionItem, (toString(crossing->getTag()) + " " + toString(i)).c_str(), crossing->getIcon(), crossing->getIcon());
183  myTreeItemToACMap[crossingItem] = crossing;
184  crossingItem->setExpanded(true);
185  }
186  break;
187  }
188  case GLO_EDGE: {
189  // insert edge root
190  GNEEdge* edge = dynamic_cast<GNEEdge*>(myMarkedAC);
191  FXTreeItem* edgeItem = myTreelist->insertItem(0, 0, toString(edge->getTag()).c_str(), edge->getIcon(), edge->getIcon());
192  myTreeItemToACMap[edgeItem] = edge;
193  edgeItem->setExpanded(true);
194  // insert lanes
195  for (int i = 0; i < (int)edge->getLanes().size(); i++) {
196  GNELane* lane = edge->getLanes().at(i);
197  FXTreeItem* laneItem = myTreelist->insertItem(0, edgeItem, (toString(lane->getTag()) + " " + toString(i)).c_str(), lane->getIcon(), lane->getIcon());
198  myTreeItemToACMap[laneItem] = lane;
199  laneItem->setExpanded(true);
200  // insert additionals of lanes
201  for (int j = 0; j < (int)lane->getAdditionalChilds().size(); j++) {
202  GNEAdditional* additional = lane->getAdditionalChilds().at(j);
203  FXTreeItem* additionalItem = myTreelist->insertItem(0, laneItem, (toString(additional->getTag()) + " " + toString(j)).c_str(), additional->getIcon(), additional->getIcon());
204  myTreeItemToACMap[additionalItem] = additional;
205  additionalItem->setExpanded(true);
206  }
207  // insert incoming connections of lanes (by default isn't expanded)
208  if (lane->getGNEIncomingConnections().size() > 0) {
209  FXTreeItem* incomingConnections = myTreelist->insertItem(0, laneItem, "Incomings", lane->getGNEIncomingConnections().front()->getIcon(), lane->getGNEIncomingConnections().front()->getIcon());
210  myTreeItemsWithoutAC.insert(incomingConnections);
211  incomingConnections->setExpanded(false);
212  for (int j = 0; j < (int)lane->getGNEIncomingConnections().size(); j++) {
213  GNEConnection* connection = lane->getGNEIncomingConnections().at(j);
214  FXTreeItem* connectionItem = myTreelist->insertItem(0, incomingConnections, (toString(connection->getTag()) + " " + toString(j)).c_str(), connection->getIcon(), connection->getIcon());
215  myTreeItemToACMap[connectionItem] = connection;
216  connectionItem->setExpanded(true);
217  }
218  }
219  // insert outcoming connections of lanes (by default isn't expanded)
220  if (lane->getGNEOutcomingConnections().size() > 0) {
221  FXTreeItem* outgoingConnections = myTreelist->insertItem(0, laneItem, "Outcomings", lane->getGNEOutcomingConnections().front()->getIcon(), lane->getGNEOutcomingConnections().front()->getIcon());
222  myTreeItemsWithoutAC.insert(outgoingConnections);
223  outgoingConnections->setExpanded(false);
224  for (int j = 0; j < (int)lane->getGNEOutcomingConnections().size(); j++) {
225  GNEConnection* connection = lane->getGNEOutcomingConnections().at(j);
226  FXTreeItem* connectionItem = myTreelist->insertItem(0, outgoingConnections, (toString(connection->getTag()) + " " + toString(j)).c_str(), connection->getIcon(), connection->getIcon());
227  myTreeItemToACMap[connectionItem] = connection;
228  connectionItem->setExpanded(true);
229  }
230  }
231  }
232  // insert additionals of edge
233  for (int i = 0; i < (int)edge->getAdditionalChilds().size(); i++) {
234  GNEAdditional* additional = edge->getAdditionalChilds().at(i);
235  FXTreeItem* additionalItem = myTreelist->insertItem(0, edgeItem, (toString(additional->getTag()) + " " + toString(i)).c_str(), additional->getIcon(), additional->getIcon());
236  myTreeItemToACMap[additionalItem] = additional;
237  additionalItem->setExpanded(true);
238  }
239  // add a extra section for rerouter in which this edge is part
240  if (edge->getNumberOfGNERerouters() > 0) {
241  FXTreeItem* rerouters = myTreelist->insertItem(0, edgeItem, (toString(SUMO_TAG_REROUTER) + "s").c_str(), edge->getGNERerouters().front()->getIcon(), edge->getGNERerouters().front()->getIcon());
242  myTreeItemsWithoutAC.insert(rerouters);
243  rerouters->setExpanded(true);
244  // insert reroutes of edge
245  for (int i = 0; i < (int)edge->getNumberOfGNERerouters(); i++) {
246  GNERerouter* rerouter = edge->getGNERerouters().at(i);
247  FXTreeItem* rerouterItem = myTreelist->insertItem(0, rerouters, (toString(rerouter->getTag()) + " " + toString(i)).c_str(), rerouter->getIcon(), rerouter->getIcon());
248  myTreeItemToACMap[rerouterItem] = rerouter;
249  rerouterItem->setExpanded(true);
250  }
251  }
252  break;
253  }
254  case GLO_LANE: {
255  // insert lane root
256  GNELane* lane = dynamic_cast<GNELane*>(myMarkedAC);
257  FXTreeItem* laneItem = myTreelist->insertItem(0, 0, toString(lane->getTag()).c_str(), lane->getIcon(), lane->getIcon());
258  myTreeItemToACMap[laneItem] = lane;
259  laneItem->setExpanded(true);
260  // insert additionals of lanes
261  for (int i = 0; i < (int)lane->getAdditionalChilds().size(); i++) {
262  GNEAdditional* additional = lane->getAdditionalChilds().at(i);
263  FXTreeItem* additionalItem = myTreelist->insertItem(0, laneItem, (toString(additional->getTag()) + " " + toString(i)).c_str(), additional->getIcon(), additional->getIcon());
264  myTreeItemToACMap[additionalItem] = additional;
265  additionalItem->setExpanded(true);
266  }
267  // insert incoming connections of lanes (by default isn't expanded)
268  if (lane->getGNEIncomingConnections().size() > 0) {
269  FXTreeItem* incomingConnections = myTreelist->insertItem(0, laneItem, "Incomings", lane->getGNEIncomingConnections().front()->getIcon(), lane->getGNEIncomingConnections().front()->getIcon());
270  myTreeItemsWithoutAC.insert(incomingConnections);
271  incomingConnections->setExpanded(false);
272  for (int i = 0; i < (int)lane->getGNEIncomingConnections().size(); i++) {
273  GNEConnection* connection = lane->getGNEIncomingConnections().at(i);
274  FXTreeItem* connectionItem = myTreelist->insertItem(0, incomingConnections, (toString(connection->getTag()) + " " + toString(i)).c_str(), connection->getIcon(), connection->getIcon());
275  myTreeItemToACMap[connectionItem] = connection;
276  connectionItem->setExpanded(true);
277  }
278  }
279  // insert outcoming connections of lanes (by default isn't expanded)
280  if (lane->getGNEOutcomingConnections().size() > 0) {
281  FXTreeItem* outgoingConnections = myTreelist->insertItem(0, laneItem, "Outcomings", lane->getGNEOutcomingConnections().front()->getIcon(), lane->getGNEOutcomingConnections().front()->getIcon());
282  myTreeItemsWithoutAC.insert(outgoingConnections);
283  outgoingConnections->setExpanded(false);
284  for (int i = 0; i < (int)lane->getGNEOutcomingConnections().size(); i++) {
285  GNEConnection* connection = lane->getGNEOutcomingConnections().at(i);
286  FXTreeItem* connectionItem = myTreelist->insertItem(0, outgoingConnections, (toString(connection->getTag()) + " " + toString(i)).c_str(), connection->getIcon(), connection->getIcon());
287  myTreeItemToACMap[connectionItem] = connection;
288  connectionItem->setExpanded(true);
289  }
290  }
291  break;
292  }
293  case GLO_POI: {
294  // insert POI root
295  GNEPOI* POI = dynamic_cast<GNEPOI*>(myMarkedAC);
296  FXTreeItem* POIItem = myTreelist->insertItem(0, 0, toString(POI->getTag()).c_str(), POI->getIcon(), POI->getIcon());
297  myTreeItemToACMap[POIItem] = POI;
298  POIItem->setExpanded(true);
299  break;
300  }
301  case GLO_POLYGON: {
302  // insert polygon root
303  GNEPoly* polygon = dynamic_cast<GNEPoly*>(myMarkedAC);
304  FXTreeItem* polygonItem = myTreelist->insertItem(0, 0, toString(polygon->getTag()).c_str(), polygon->getIcon(), polygon->getIcon());
305  myTreeItemToACMap[polygonItem] = polygon;
306  polygonItem->setExpanded(true);
307  break;
308  }
309  case GLO_CROSSING: {
310  // insert crossing root
311  GNECrossing* crossing = dynamic_cast<GNECrossing*>(myMarkedAC);
312  FXTreeItem* crossingItem = myTreelist->insertItem(0, 0, toString(crossing->getTag()).c_str(), crossing->getIcon(), crossing->getIcon());
313  myTreeItemToACMap[crossingItem] = crossing;
314  crossingItem->setExpanded(true);
315  break;
316  }
317  case GLO_ADDITIONAL: {
318  // insert additional root
319  GNEAdditional* additional = dynamic_cast<GNEAdditional*>(myMarkedAC);
320  FXTreeItem* additionalItem = myTreelist->insertItem(0, 0, toString(additional->getTag()).c_str(), additional->getIcon(), additional->getIcon());
321  myTreeItemToACMap[additionalItem] = additional;
322  additionalItem->setExpanded(true);
323  break;
324  }
325  case GLO_CONNECTION: {
326  // insert connection root
327  GNEConnection* connection = dynamic_cast<GNEConnection*>(myMarkedAC);
328  FXTreeItem* connectionItem = myTreelist->insertItem(0, 0, toString(connection->getTag()).c_str(), connection->getIcon(), connection->getIcon());
329  myTreeItemToACMap[connectionItem] = connection;
330  connectionItem->setExpanded(true);
331  break;
332  }
333  default: {
334  break;
335  }
336  }
337  }
338 }
339 
340 
341 void
343  // To remove an attribute carrier deleteFrame must be visible
344  if (shown() == false) {
345  // Hide inspector frame and show delete frame
347  show();
348  } else {
349  // check type of of GL object
350  switch (dynamic_cast<GUIGlObject*>(ac)->getType()) {
351  case GLO_JUNCTION: {
352  GNEJunction* junction = dynamic_cast<GNEJunction*>(ac);
353  // obtain number of additionals of junction's childs
354  int numberOfAdditionals = 0;
355  for (auto i : junction->getGNEEdges()) {
356  numberOfAdditionals += (int)i->getAdditionalChilds().size();
357  for (auto j : i->getLanes()) {
358  UNUSED_PARAMETER(j);
359  numberOfAdditionals += (int)i->getAdditionalChilds().size();
360  }
361  }
362  // Check if junction can be deleted
365  } else {
366  if (numberOfAdditionals > 0) {
367  // write warning if netedit is running in testing mode
368  if (OptionsCont::getOptions().getBool("gui-testing-debug")) {
369  WRITE_WARNING("Opening FXMessageBox 'Force deletion needed'");
370  }
371  std::string plural = numberOfAdditionals > 1 ? "s" : "";
372  // Open warning DialogBox
373  FXMessageBox::warning(getViewNet()->getApp(), MBOX_OK, ("Problem deleting " + toString(junction->getTag())).c_str(), "%s",
374  (toString(junction->getTag()) + " '" + junction->getID() + "' cannot be deleted because owns " +
375  toString(numberOfAdditionals) + " additional child" + plural + ".\n Check 'Force deletion of additionals' to force deletion.").c_str());
376  // write warning if netedit is running in testing mode
377  if (OptionsCont::getOptions().getBool("gui-testing-debug")) {
378  WRITE_WARNING("Closed FXMessageBox 'Force deletion needed' with 'OK'");
379  }
380  } else {
382  }
383  }
384  break;
385  }
386  case GLO_EDGE: {
387  GNEEdge* edge = dynamic_cast<GNEEdge*>(ac);
388  int numberOfAdditionals = (int)edge->getAdditionalChilds().size();
389  int numberOfRerouters = (int)edge->getGNERerouters().size();
390  // Iterate over lanes and obtain total number of additional childs
391  for (auto i : edge->getLanes()) {
392  numberOfAdditionals += (int)i->getAdditionalChilds().size();
393  }
394  // Check if edge can be deleted
397  } else {
398  if (numberOfAdditionals > 0) {
399  // write warning if netedit is running in testing mode
400  if (OptionsCont::getOptions().getBool("gui-testing-debug")) {
401  WRITE_WARNING("Opening FXMessageBox 'Force deletion needed'");
402  }
403  std::string plural = numberOfAdditionals > 1 ? "s" : "";
404  // Open warning DialogBox
405  FXMessageBox::warning(getViewNet()->getApp(), MBOX_OK, ("Problem deleting " + toString(edge->getTag())).c_str(), "%s",
406  (toString(edge->getTag()) + " '" + edge->getID() + "' cannot be deleted because owns " +
407  toString(numberOfAdditionals) + " additional child" + plural + ".\n Check 'Force deletion of additionals' to force deletion.").c_str());
408  // write warning if netedit is running in testing mode
409  if (OptionsCont::getOptions().getBool("gui-testing-debug")) {
410  WRITE_WARNING("Closed FXMessageBox 'Force deletion needed' with 'OK'");
411  }
412  } else if (numberOfRerouters > 0) {
413  // write warning if netedit is running in testing mode
414  if (OptionsCont::getOptions().getBool("gui-testing-debug")) {
415  WRITE_WARNING("Opening FXMessageBox 'Force deletion needed'");
416  }
417  std::string plural = numberOfRerouters > 1 ? "s" : "";
418  // Open warning DialogBox
419  FXMessageBox::warning(getViewNet()->getApp(), MBOX_OK, ("Problem deleting " + toString(edge->getTag())).c_str(), "%s",
420  (toString(edge->getTag()) + " '" + edge->getID() + "' cannot be deleted because is part of " +
421  toString(numberOfRerouters) + " " + toString(SUMO_TAG_REROUTER) + plural + ".\n Check 'Force deletion of additionals' to force deletion.").c_str());
422  // write warning if netedit is running in testing mode
423  if (OptionsCont::getOptions().getBool("gui-testing-debug")) {
424  WRITE_WARNING("Closed FXMessageBox 'Force deletion needed' with 'OK'");
425  }
426  } else {
428  }
429  }
430  break;
431  }
432  case GLO_LANE: {
433  GNELane* lane = dynamic_cast<GNELane*>(ac);
434  // Check if lane can be deleted
437  } else {
438  if (lane->getAdditionalChilds().size() == 0) {
440  } else {
441  // write warning if netedit is running in testing mode
442  if (OptionsCont::getOptions().getBool("gui-testing-debug")) {
443  WRITE_WARNING("Opening FXMessageBox 'Force deletion needed'");
444  }
445  // open warning box
446  FXMessageBox::warning(getViewNet()->getApp(), MBOX_OK, ("Problem deleting " + toString(lane->getTag())).c_str(), "%s",
447  (toString(lane->getTag()) + " '" + lane->getID() + "' cannot be deleted because it has " +
448  toString(lane->getAdditionalChilds().size()) + " additional childs.\n Check 'Force deletion of Additionals' to force deletion.").c_str());
449  // write warning if netedit is running in testing mode
450  if (OptionsCont::getOptions().getBool("gui-testing-debug")) {
451  WRITE_WARNING("Closed FXMessageBox 'Force deletion needed' with 'OK'");
452  }
453  }
454  }
455  break;
456  }
457  case GLO_POI: {
458  myViewNet->getNet()->deletePOI(dynamic_cast<GNEPOI*>(ac), myViewNet->getUndoList());
459  break;
460  }
461  case GLO_POLYGON: {
462  myViewNet->getNet()->deletePolygon(dynamic_cast<GNEPoly*>(ac), myViewNet->getUndoList());
463  break;
464  }
465  case GLO_CROSSING: {
466  myViewNet->getNet()->deleteCrossing(dynamic_cast<GNECrossing*>(ac), myViewNet->getUndoList());
467  break;
468  }
469  case GLO_ADDITIONAL: {
470  myViewNet->getViewParent()->getAdditionalFrame()->removeAdditional(dynamic_cast<GNEAdditional*>(ac));
471  break;
472  }
473  case GLO_CONNECTION: {
474  myViewNet->getNet()->deleteConnection(dynamic_cast<GNEConnection*>(ac), myViewNet->getUndoList());
475  break;
476  }
477  default: {
478  break;
479  }
480  }
481  }
482  // update view to show changes
483  myViewNet->update();
484 }
485 
486 
487 void
489  // Check if under cursor there are an Attribute Carrier
490  if (ac != NULL) {
491  myMarkedElementLabel->setText((" " + toString(ac->getTag()) + " '" + ac->getID() + "'").c_str());
492  myMarkedElementLabel->setIcon(ac->getIcon());
493  } else {
494  myMarkedElementLabel->setText("No item marked");
496  }
497  // mark ac
498  myMarkedAC = ac;
499 }
500 
501 
502 void
504  // change label
505  if (ac != NULL) {
506  myCurrentElementLabel->setText((toString(ac->getTag()) + " '" + ac->getID() + "'").c_str());
507  myCurrentElementLabel->setIcon(ac->getIcon());
508  } else {
509  myCurrentElementLabel->setText("No item under cursor");
511  }
512 }
513 
514 
517  return myMarkedAC;
518 }
519 
520 
521 long
522 GNEDeleteFrame::onCmdShowChildMenu(FXObject*, FXSelector, void* eventData) {
523  // Obtain event
524  FXEvent* e = (FXEvent*) eventData;
525  FXTreeItem* item = myTreelist->getItemAt(e->win_x, e->win_y);
526  // Check if there are an item in the position and create pop-up menu
527  if (item && (myTreeItemsWithoutAC.find(item) == myTreeItemsWithoutAC.end())) {
528  createPopUpMenu(e->root_x, e->root_y, myTreeItemToACMap[myTreelist->getItemAt(e->win_x, e->win_y)]);
529  }
530  return 1;
531 }
532 
533 
534 long
535 GNEDeleteFrame::onCmdCenterChildItem(FXObject*, FXSelector, void*) {
536  if (dynamic_cast<GNENetElement*>(myClickedAC)) {
537  myViewNet->centerTo(dynamic_cast<GNENetElement*>(myClickedAC)->getGlID(), false);
538  } else if (dynamic_cast<GNEAdditional*>(myClickedAC)) {
539  myViewNet->centerTo(dynamic_cast<GNEAdditional*>(myClickedAC)->getGlID(), false);
540  } else if (dynamic_cast<GNEPOI*>(myClickedAC)) {
541  myViewNet->centerTo(dynamic_cast<GNEPOI*>(myClickedAC)->getGlID(), false);
542  } else if (dynamic_cast<GNEPoly*>(myClickedAC)) {
543  myViewNet->centerTo(dynamic_cast<GNEPoly*>(myClickedAC)->getGlID(), false);
544  }
545  myViewNet->update();
546  return 1;
547 }
548 
549 
550 long
551 GNEDeleteFrame::onCmdInspectChildItem(FXObject*, FXSelector, void*) {
552  if (myMarkedAC != NULL) {
555  // Hide delete frame and show inspector frame
556  hide();
557  }
558  return 1;
559 }
560 
561 
562 long
563 GNEDeleteFrame::onCmdDeleteChildItem(FXObject*, FXSelector, void*) {
565  return 1;
566 }
567 
568 
569 void
571  // create FXMenuPane
572  FXMenuPane* pane = new FXMenuPane(myTreelist);
573  // set current clicked AC
574  myClickedAC = ac;
575  // set name
577  new FXMenuSeparator(pane);
578  // Fill FXMenuCommand
579  new FXMenuCommand(pane, "Center", GUIIconSubSys::getIcon(ICON_RECENTERVIEW), this, MID_GNE_DELETEFRAME_CENTER);
580  new FXMenuCommand(pane, "Inspect", GUIIconSubSys::getIcon(ICON_MODEINSPECT), this, MID_GNE_DELETEFRAME_INSPECT);
581  new FXMenuCommand(pane, "Delete", GUIIconSubSys::getIcon(ICON_MODEDELETE), this, MID_GNE_DELETEFRAME_DELETE);
582  // Center in the mouse position and create pane
583  pane->setX(X);
584  pane->setY(Y);
585  pane->create();
586  pane->show();
587 }
588 
589 
590 /****************************************************************************/
a tl-logic
#define GUIDesignCheckButtonAttribute
checkButton without thick extended over the frame used for attributes
Definition: GUIDesigns.h:117
long onCmdCenterChildItem(FXObject *, FXSelector, void *)
called when user select option "center item" of child Menu
a polygon
std::set< FXTreeItem * > myTreeItemsWithoutAC
set used to save tree items without AC assigned (for example, Incoming/Outcoming connections) ...
void deletePOI(GNEPOI *POI, GNEUndoList *undoList)
remove POI
Definition: GNENet.cpp:514
FXDEFMAP(GNEDeleteFrame) GNEDeleteFrameMap[]
void removeAttributeCarrier(GNEAttributeCarrier *ac)
remove attribute carrier (element)
FXTreeList * myTreelist
tree list to show the childs of the element to erase
void inspectFromDeleteFrame(GNEAttributeCarrier *AC, GNEAttributeCarrier *previousElement, bool previousElementWasMarked)
inspect called from DeleteFrame
Definition: GNEPOI.h:52
void updateCurrentLabel(GNEAttributeCarrier *ac)
update current label
a connection
const std::vector< GNEAdditional * > & getAdditionalChilds() const
get additional childs of lane
Definition: GNELane.cpp:758
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool)
GNEAdditionalFrame * getAdditionalFrame() const
get frame for GNE_MODE_ADDITIONAL
void deleteConnection(GNEConnection *connection, GNEUndoList *undoList)
remove connection
Definition: GNENet.cpp:478
This lane is powered by an underlying GNEEdge and basically knows how to draw itself.
Definition: GNELane.h:54
void showChildsOfMarkedAttributeCarrier()
show childs of marked attribute carrier
FXLabel * myCurrentElementLabel
label for current element
#define GUIDesignTreeListFrame
Tree list used in frames to represent childs of elements.
Definition: GUIDesigns.h:416
const std::vector< GNEAdditional * > & getAdditionalChilds() const
return list of additionals associated with this edge
Definition: GNEEdge.cpp:1212
const std::vector< GNEEdge * > & getGNEEdges() const
Returns all GNEEdges vinculated with this Junction.
GNEViewParent * getViewParent() const
get the net object
long onCmdShowChildMenu(FXObject *, FXSelector, void *eventData)
#define UNUSED_PARAMETER(x)
Definition: StdDefs.h:40
#define WRITE_WARNING(msg)
Definition: MsgHandler.h:200
static OptionsCont & getOptions()
Retrieves the options.
Definition: OptionsCont.cpp:65
GNEUndoList * getUndoList() const
get the undoList object
GNEViewNet * myViewNet
the window to inform when the tls is modfied
Definition: GNEFrame.h:95
const std::vector< GNERerouter * > & getGNERerouters() const
get rerouters vinculated with this edge
Definition: GNEEdge.cpp:1239
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition: ToString.h:56
int getNumberOfGNERerouters() const
get number of rerouters that has this edge as parameters
Definition: GNEEdge.cpp:1245
This object is responsible for drawing a shape and for supplying a a popup menu. Messages are routete...
Definition: GNECrossing.h:52
const std::vector< GNECrossing * > & getGNECrossings() const
Returns GNECrossings.
~GNEDeleteFrame()
Destructor.
In GNEDeleteFrame, delete element.
Definition: GUIAppEnum.h:370
void deleteLane(GNELane *lane, GNEUndoList *undoList)
removes lane
Definition: GNENet.cpp:436
void deleteGeometryOrEdge(GNEEdge *edge, const Position &pos, GNEUndoList *undoList)
removes geometry when pos is close to a geometry node, deletes the whole edge otherwise ...
Definition: GNENet.cpp:629
FXCheckButton * myAutomaticallyDeleteAdditionalsCheckButton
checkbox for enable/disble automatically delete additionals childs
virtual void centerTo(GUIGlID id, bool applyZoom, double zoomDist=20)
centers to the chosen artifact
std::vector< GNEConnection * > getGNEIncomingConnections()
returns a vector with the incoming GNEConnections of this lane
Definition: GNELane.cpp:1091
void removeAdditional(GNEAdditional *additional)
remove an additional element previously added
FXFont * getBoldFont()
void markAttributeCarrier(GNEAttributeCarrier *ac)
mark attribute carrier (element)
GNEAttributeCarrier * myClickedAC
current attribute carrier selected in three
GNEInspectorFrame * getInspectorFrame() const
get frame for GNE_MODE_INSPECT
void deleteCrossing(GNECrossing *crossing, GNEUndoList *undoList)
remove crossing
Definition: GNENet.cpp:498
In GNEDeleteFrame, inspect element.
Definition: GUIAppEnum.h:368
const std::string getID() const
function to support debugging
GNEAttributeCarrier * myMarkedAC
pointer to marked attributeCarrier (element)
std::vector< GNEConnection * > getGNEOutcomingConnections()
returns a vector with the outgoing GNEConnections of this lane
Definition: GNELane.cpp:1112
GNEViewNet * getViewNet() const
get view net
Definition: GNEFrame.cpp:123
A road/street connecting two junctions (netedit-version)
Definition: GNEEdge.h:58
compound additional
long onCmdDeleteChildItem(FXObject *, FXSelector, void *)
called when user select option "delte item" of child menu
void deletePolygon(GNEPoly *polygon, GNEUndoList *undoList)
remove Polygon
Definition: GNENet.cpp:529
long onCmdInspectChildItem(FXObject *, FXSelector, void *)
called when user select option "inspect item" of child menu
FXIcon * getIcon() const
get FXIcon assigned to this object
const std::vector< GNELane * > & getLanes()
returns a reference to the lane vector
Definition: GNEEdge.cpp:599
virtual void show()
show Frame
Definition: GNEFrame.cpp:98
An Element which don&#39;t belongs to GNENet but has influency in the simulation.
Definition: GNEAdditional.h:62
#define GUIDesignGroupBoxFrame
Group box design extended over frame.
Definition: GUIDesigns.h:219
GUIMainWindow * getApp() const
get App (GUIMainWindow)
an edge
GNEAttributeCarrier * getMarkedAttributeCarrier() const
returns marked atrribute carrier
GNENet * getNet() const
get the net object
virtual void hide()
hide Frame
Definition: GNEFrame.cpp:107
void deleteJunction(GNEJunction *junction, GNEUndoList *undoList)
removes junction and all incident edges
Definition: GNENet.cpp:280
void show()
show inspector frame
SumoXMLTag getTag() const
get XML Tag assigned to this object
tree list with the childs
Definition: GUIAppEnum.h:364
#define GUIDesignLabelLeft
Definition: GUIDesigns.h:144
Position getPositionInformation() const
Returns the cursor&#39;s x/y position within the network.
In GNEDeleteFrame, center element.
Definition: GUIAppEnum.h:366
std::map< FXTreeItem *, GNEAttributeCarrier * > myTreeItemToACMap
map used to save the Tree items with their AC
static FXIcon * getIcon(GUIIcon which)
returns a icon previously defined in the enum GUIIcon
FXLabel * myMarkedElementLabel
label for marked element
automatically delete additional childs
Definition: GUIAppEnum.h:378
void createPopUpMenu(int X, int Y, GNEAttributeCarrier *ac)
a junction