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 
63 
64 // ===========================================================================
65 // FOX callback mapping
66 // ===========================================================================
67 
68 FXDEFMAP(GNEDeleteFrame) GNEDeleteFrameMap[] = {
69  FXMAPFUNC(SEL_RIGHTBUTTONRELEASE, MID_GNE_CHILDS, GNEDeleteFrame::onCmdShowChildMenu),
73 };
74 
75 // Object implementation
76 FXIMPLEMENT(GNEDeleteFrame, FXVerticalFrame, GNEDeleteFrameMap, ARRAYNUMBER(GNEDeleteFrameMap))
77 
78 // ===========================================================================
79 // method definitions
80 // ===========================================================================
81 GNEDeleteFrame::GNEDeleteFrame(FXHorizontalFrame* horizontalFrameParent, GNEViewNet* viewNet) :
82  GNEFrame(horizontalFrameParent, viewNet, "Delete"),
83  myCurrentAC(NULL),
84  myMarkedAC(NULL) {
85  // Create Groupbox for current element
86  myGroupBoxCurrentElement = new FXGroupBox(myContentFrame, "Current element", GUIDesignGroupBoxFrame);
87  myCurrentElementLabel = new FXLabel(myGroupBoxCurrentElement, "No item under cursor", 0, GUIDesignLabelLeft);
88 
89  // Create Groupbox for current element
90  myGroupBoxOptions = new FXGroupBox(myContentFrame, "Options", GUIDesignGroupBoxFrame);
91 
92  // Create checkbox for enabling/disabling automatic deletion of additionals childs (by default, enabled)
93  myAutomaticallyDeleteAdditionalsCheckButton = new FXCheckButton(myGroupBoxOptions, "Force deletion of additionals", this, MID_GNE_AUTOMATICALLYDELETEADDITIONALS, GUIDesignCheckButtonAttribute);
94  myAutomaticallyDeleteAdditionalsCheckButton->setCheck(true);
95 
96  // Create groupbox for tree list
97  myGroupBoxTreeList = new FXGroupBox(myContentFrame, "Childs", GUIDesignGroupBoxFrame);
98  myMarkedElementLabel = new FXLabel(myGroupBoxTreeList, "No item marked", 0, GUIDesignLabelLeft);
99  myTreelist = new FXTreeList(myGroupBoxTreeList, this, MID_GNE_CHILDS, GUIDesignTreeListFrame);
100 
101  // Create groupbox for help
102  myGroupBoxInformation = new FXGroupBox(myContentFrame, "Information", GUIDesignGroupBoxFrame);
103  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);
104 }
105 
106 
108 
109 
110 void
112  myCurrentAC = ac;
113  // clear items
114  myTreelist->clearItems();
115  myTreeItemToACMap.clear();
116  myTreeItemsWithoutAC.clear();
117  // Switch gl type of ac
118  if (ac) {
119  switch (dynamic_cast<GUIGlObject*>(ac)->getType()) {
120  case GLO_JUNCTION: {
121  // insert junction root
122  GNEJunction* junction = dynamic_cast<GNEJunction*>(ac);
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*>(ac);
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*>(ac);
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*>(ac);
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*>(ac);
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*>(ac);
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*>(ac);
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*>(ac);
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  myViewNet->getNet()->deleteJunction(dynamic_cast<GNEJunction*>(ac), myViewNet->getUndoList());
353  break;
354  }
355  case GLO_EDGE: {
356  GNEEdge* edge = dynamic_cast<GNEEdge*>(ac);
357  int numberOfAdditionals = (int)edge->getAdditionalChilds().size();
358  int numberOfRerouters = (int)edge->getGNERerouters().size();
359  // Iterate over lanes and obtain total number of additional childs
360  for (std::vector<GNELane*>::const_iterator i = edge->getLanes().begin(); i != edge->getLanes().end(); i++) {
361  numberOfAdditionals += (int)(*i)->getAdditionalChilds().size();
362  }
363  // Check if edge can be deleted
366  } else {
367  if (numberOfAdditionals > 0) {
368  // write warning if netedit is running in testing mode
369  if (myViewNet->isTestingModeEnabled() == true) {
370  WRITE_WARNING("Opening FXMessageBox of type 'warning'");
371  }
372  std::string plural = numberOfAdditionals > 1 ? "s" : "";
373  // Open warning DialogBox
374  FXMessageBox::warning(getViewNet()->getApp(), MBOX_OK, ("Problem deleting " + toString(edge->getTag())).c_str(), "%s",
375  (toString(edge->getTag()) + " '" + edge->getID() + "' cannot be deleted because owns " +
376  toString(numberOfAdditionals) + " additional child" + plural + ".\n Check 'Force deletion of additionals' to force deletion.").c_str());
377  // write warning if netedit is running in testing mode
378  if (myViewNet->isTestingModeEnabled() == true) {
379  WRITE_WARNING("Closed FXMessageBox of type 'warning' with 'OK'");
380  }
381  } else if (numberOfRerouters > 0) {
382  // write warning if netedit is running in testing mode
383  if (myViewNet->isTestingModeEnabled() == true) {
384  WRITE_WARNING("Opening FXMessageBox of type 'warning'");
385  }
386  std::string plural = numberOfRerouters > 1 ? "s" : "";
387  // Open warning DialogBox
388  FXMessageBox::warning(getViewNet()->getApp(), MBOX_OK, ("Problem deleting " + toString(edge->getTag())).c_str(), "%s",
389  (toString(edge->getTag()) + " '" + edge->getID() + "' cannot be deleted because is part of " +
390  toString(numberOfRerouters) + " " + toString(SUMO_TAG_REROUTER) + plural + ".\n Check 'Force deletion of additionals' to force deletion.").c_str());
391  // write warning if netedit is running in testing mode
392  if (myViewNet->isTestingModeEnabled() == true) {
393  WRITE_WARNING("Closed FXMessageBox of type 'warning' with 'OK'");
394  }
395  } else {
397  }
398  }
399  break;
400  }
401  case GLO_LANE: {
402  GNELane* lane = dynamic_cast<GNELane*>(ac);
403  // Check if lane can be deleted
406  } else {
407  if (lane->getAdditionalChilds().size() == 0) {
409  } else {
410  // write warning if netedit is running in testing mode
411  if (myViewNet->isTestingModeEnabled() == true) {
412  WRITE_WARNING("Opening FXMessageBox of type 'warning'");
413  }
414  // open warning box
415  FXMessageBox::warning(getViewNet()->getApp(), MBOX_OK, ("Problem deleting " + toString(lane->getTag())).c_str(), "%s",
416  (toString(lane->getTag()) + " '" + lane->getID() + "' cannot be deleted because it has " +
417  toString(lane->getAdditionalChilds().size()) + " additional childs.\n Check 'Force deletion of Additionals' to force deletion.").c_str());
418  // write warning if netedit is running in testing mode
419  if (myViewNet->isTestingModeEnabled() == true) {
420  WRITE_WARNING("Closed FXMessageBox of type 'warning' with 'OK'");
421  }
422  }
423  }
424  break;
425  }
426  case GLO_POI: {
427  // XXX this is a dirty dirty hack! implemente GNEChange_POI
428  myViewNet->getNet()->getShapeContainer().removePOI(dynamic_cast<GNEPOI*>(ac)->getMicrosimID());
429  break;
430  }
431  case GLO_POLYGON: {
432  //
433  break;
434  }
435  case GLO_CROSSING: {
436  myViewNet->getNet()->deleteCrossing(dynamic_cast<GNECrossing*>(ac), myViewNet->getUndoList());
437  break;
438  }
439  case GLO_ADDITIONAL: {
440  myViewNet->getViewParent()->getAdditionalFrame()->removeAdditional(dynamic_cast<GNEAdditional*>(ac));
441  break;
442  }
443  case GLO_CONNECTION: {
444  myViewNet->getNet()->deleteConnection(dynamic_cast<GNEConnection*>(ac), myViewNet->getUndoList());
445  break;
446  }
447  default: {
448  break;
449  }
450  }
451  }
452  // update view to show changes
453  myViewNet->update();
454 }
455 
456 
457 void
459  // Check if under cursor there are an Attribute Carrier
460  if (ac != NULL) {
461  myMarkedElementLabel->setText((" " + toString(ac->getTag()) + " '" + ac->getID() + "'").c_str());
462  myMarkedElementLabel->setIcon(ac->getIcon());
463  } else {
464  myMarkedElementLabel->setText("No item marked");
466  }
467  // mark ac
468  myMarkedAC = ac;
469 }
470 
471 
472 void
474  // change label
475  if (ac != NULL) {
476  myCurrentElementLabel->setText((toString(ac->getTag()) + " '" + ac->getID() + "'").c_str());
477  myCurrentElementLabel->setIcon(ac->getIcon());
478  } else {
479  myCurrentElementLabel->setText("No item under cursor");
481  }
482 }
483 
484 
487  return myMarkedAC;
488 }
489 
490 
491 long
492 GNEDeleteFrame::onCmdShowChildMenu(FXObject*, FXSelector, void* data) {
493  // Obtain event
494  FXEvent* e = (FXEvent*) data;
495  FXTreeItem* item = myTreelist->getItemAt(e->win_x, e->win_y);
496  // Check if there are an item in the position and create pop-up menu
497  if (item && (myTreeItemsWithoutAC.find(item) == myTreeItemsWithoutAC.end())) {
498  createPopUpMenu(e->root_x, e->root_y, myTreeItemToACMap[myTreelist->getItemAt(e->win_x, e->win_y)]);
499  }
500  return 1;
501 }
502 
503 
504 long
505 GNEDeleteFrame::onCmdCenterItem(FXObject*, FXSelector, void*) {
506  if (dynamic_cast<GNENetElement*>(myClickedAC)) {
507  myViewNet->centerTo(dynamic_cast<GNENetElement*>(myClickedAC)->getGlID(), false);
508  } else if (dynamic_cast<GNEAdditional*>(myClickedAC)) {
509  myViewNet->centerTo(dynamic_cast<GNEAdditional*>(myClickedAC)->getGlID(), false);
510  } else if (dynamic_cast<GNEPOI*>(myClickedAC)) {
511  myViewNet->centerTo(dynamic_cast<GNEPOI*>(myClickedAC)->getGlID(), false);
512  } else if (dynamic_cast<GNEPoly*>(myClickedAC)) {
513  myViewNet->centerTo(dynamic_cast<GNEPoly*>(myClickedAC)->getGlID(), false);
514  }
515  myViewNet->update();
516  return 1;
517 }
518 
519 
520 long
521 GNEDeleteFrame::onCmdInspectItem(FXObject*, FXSelector, void*) {
522  if (myMarkedAC != NULL) {
525  // Hide delete frame and show inspector frame
526  hide();
527  } else if (myCurrentAC != NULL) {
530  // Hide delete frame and show inspector frame
531  hide();
532  }
533  return 1;
534 }
535 
536 
537 long
538 GNEDeleteFrame::onCmdDeleteItem(FXObject*, FXSelector, void*) {
541  return 1;
542 }
543 
544 
545 void
547  // create FXMenuPane
548  FXMenuPane* pane = new FXMenuPane(myTreelist);
549  // set current clicked AC
550  myClickedAC = ac;
551  // set name
553  new FXMenuSeparator(pane);
554  // Fill FXMenuCommand
555  new FXMenuCommand(pane, "Center", GUIIconSubSys::getIcon(ICON_RECENTERVIEW), this, MID_GNE_DELETEFRAME_CENTER);
556  new FXMenuCommand(pane, "Inspect", GUIIconSubSys::getIcon(ICON_MODEINSPECT), this, MID_GNE_DELETEFRAME_INSPECT);
557  new FXMenuCommand(pane, "Delete", GUIIconSubSys::getIcon(ICON_MODEDELETE), this, MID_GNE_DELETEFRAME_DELETE);
558  // Center in the mouse position and create pane
559  pane->setX(X);
560  pane->setY(Y);
561  pane->create();
562  pane->show();
563 }
564 
565 
566 /****************************************************************************/
const std::vector< GNEAdditional * > & getAdditionalChilds() const
return list of additionals associated with this edge
Definition: GNEEdge.cpp:1062
a tl-logic
ShapeContainer & getShapeContainer()
get shape container
Definition: GNENet.cpp:1252
GNEInspectorFrame * getInspectorFrame() const
get frame for GNE_MODE_INSPECT
#define GUIDesignCheckButtonAttribute
checkButton without thick extended over the frame used for attributes
Definition: GUIDesigns.h:117
a polygon
std::set< FXTreeItem * > myTreeItemsWithoutAC
set used to save tree items without AC assigned (for example, Incoming/Outcoming connections) ...
tree list with the childs
Definition: GUIAppEnum.h:364
FXDEFMAP(GNEDeleteFrame) GNEDeleteFrameMap[]
In GNEDeleteFrame, center element.
Definition: GUIAppEnum.h:366
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:51
void updateCurrentLabel(GNEAttributeCarrier *ac)
update current label
a connection
GNEViewParent * getViewParent() const
get the net object
int getNumberOfGNERerouters() const
get number of rerouters that has this edge as parameters
Definition: GNEEdge.cpp:1095
FXIcon * getIcon() const
get FXIcon assigned to this object
void deleteConnection(GNEConnection *connection, GNEUndoList *undoList)
remove connection
Definition: GNENet.cpp:415
This lane is powered by an underlying GNEEdge and basically knows how to draw itself.
Definition: GNELane.h:54
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< GNEEdge * > & getGNEEdges() const
Returns all GNEEdges vinculated with this Junction.
GNEViewNet * getViewNet() const
get view net
Definition: GNEFrame.cpp:123
In GNEDeleteFrame, delete element.
Definition: GUIAppEnum.h:370
#define WRITE_WARNING(msg)
Definition: MsgHandler.h:200
bool isTestingModeEnabled() const
check if netedit is running in testing mode
Definition: GNEViewNet.cpp:405
GNEViewNet * myViewNet
the window to inform when the tls is modfied
Definition: GNEFrame.h:95
GNEAdditionalFrame * getAdditionalFrame() const
get frame for GNE_MODE_ADDITIONAL
const std::vector< GNECrossing * > & getGNECrossings() const
Returns GNECrossings.
GNEUndoList * getUndoList() const
get the undoList object
long onCmdCenterItem(FXObject *, FXSelector, void *)
called when user select option "center item" of child Menu
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition: ToString.h:56
This object is responsible for drawing a shape and for supplying a a popup menu. Messages are routete...
Definition: GNECrossing.h:51
~GNEDeleteFrame()
Destructor.
virtual bool removePOI(const std::string &id)
Removes a PoI from the container.
In GNEDeleteFrame, inspect element.
Definition: GUIAppEnum.h:368
void deleteLane(GNELane *lane, GNEUndoList *undoList)
removes lane
Definition: GNENet.cpp:382
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:532
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:1084
void removeAdditional(GNEAdditional *additional)
remove an additional element previously added
FXFont * getBoldFont()
long onCmdInspectItem(FXObject *, FXSelector, void *)
called when user select option "inspect item" of child menu
const std::vector< GNERerouter * > & getGNERerouters() const
get rerouters vinculated with this edge
Definition: GNEEdge.cpp:1089
void markAttributeCarrier(GNEAttributeCarrier *ac)
mark attribute carrier (element)
automatically delete additional childs
Definition: GUIAppEnum.h:378
GNEAttributeCarrier * myClickedAC
current attribute carrier selected in three
void deleteCrossing(GNECrossing *crossing, GNEUndoList *undoList)
remove crossing
Definition: GNENet.cpp:433
const std::string getID() const
function to support debugging
GNEAttributeCarrier * myCurrentAC
pointer to current AC
long onCmdDeleteItem(FXObject *, FXSelector, void *)
called when user select option "delte item" of child menu
GNEAttributeCarrier * myMarkedAC
pointer to marked attributeCarrier (element)
std::vector< GNEConnection * > getGNEOutcomingConnections()
returns a vector with the outgoing GNEConnections of this lane
Definition: GNELane.cpp:1105
A road/street connecting two junctions (netedit-version)
Definition: GNEEdge.h:57
compound additional
const std::vector< GNELane * > & getLanes()
returns a reference to the lane vector
Definition: GNEEdge.cpp:543
virtual void show()
show Frame
Definition: GNEFrame.cpp:98
long onCmdShowChildMenu(FXObject *, FXSelector, void *data)
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
void showAttributeCarrierChilds(GNEAttributeCarrier *ac)
show child of attributeCarrier in frame if previously there isn&#39;t a marked element ...
virtual void hide()
hide Frame
Definition: GNEFrame.cpp:107
void deleteJunction(GNEJunction *junction, GNEUndoList *undoList)
removes junction and all incident edges
Definition: GNENet.cpp:306
void show()
show inspector frame
GNENet * getNet() const
get the net object
Position getPositionInformation() const
Returns the cursor&#39;s x/y position within the network.
GNEAttributeCarrier * getMarkedAttributeCarrier() const
returns marked atrribute carrier
#define GUIDesignLabelLeft
Definition: GUIDesigns.h:144
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
void createPopUpMenu(int X, int Y, GNEAttributeCarrier *ac)
const std::vector< GNEAdditional * > & getAdditionalChilds() const
get additional childs of lane
Definition: GNELane.cpp:768
a junction
SumoXMLTag getTag() const
get XML Tag assigned to this object