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    GNEViewNetHelper.h
11 /// @author  Pablo Alvarez Lopez
12 /// @date    Feb 2019
13 /// @version $Id$
14 ///
15 // A file used to reduce the size of GNEViewNet.h grouping structs and classes
16 /****************************************************************************/
17 #ifndef GNEViewNetHelper_h
18 #define GNEViewNetHelper_h
19 
20 
21 // ===========================================================================
22 // included modules
23 // ===========================================================================
24 #include <config.h>
25 
26 #include <utils/common/SUMOVehicleClass.h>
27 #include <utils/foxtools/MFXCheckableButton.h>
28 #include <utils/geom/Position.h>
29 #include <utils/geom/PositionVector.h>
30 #include <utils/gui/globjects/GUIGlObject.h>
31 #include <utils/gui/globjects/GUIGlObjectTypes.h>
32 #include <utils/gui/settings/GUIPropertyScheme.h>
33 #include <utils/gui/settings/GUIVisualizationSettings.h>
34 #include <utils/gui/windows/GUISUMOAbstractView.h>
35 #include <utils/gui/windows/GUISUMOAbstractView.h>
36 
37 
38 // ===========================================================================
39 // enum
40 // ===========================================================================
41 
42 /// @brie enum for supermodes
43 enum Supermode {
44     /// @brief empty super mode
45     GNE_SUPERMODE_NONE,
46     /// @brief Network mode (Edges, junctions, etc..)
47     GNE_SUPERMODE_NETWORK,
48     ///@brief Demanding mode (Routes, Vehicles etc..)
49     GNE_SUPERMODE_DEMAND
50 };
51 
52 /// @brie enum for network edit modes
53 enum NetworkEditMode {
54     /// @brief empty Network mode
55     GNE_NMODE_NONE,
56     ///@brief mode for inspecting network elements
57     GNE_NMODE_INSPECT,
58     ///@brief mode for deleting network elements
59     GNE_NMODE_DELETE,
60     ///@brief mode for selecting network elements
61     GNE_NMODE_SELECT,
62     ///@brief mode for moving network elements
63     GNE_NMODE_MOVE,
64     ///@brief mode for creating new edges
65     GNE_NMODE_CREATE_EDGE,
66     ///@brief mode for connecting lanes
67     GNE_NMODE_CONNECT,
68     ///@brief mode for editing tls
69     GNE_NMODE_TLS,
70     ///@brief Mode for editing additionals
71     GNE_NMODE_ADDITIONAL,
72     ///@brief Mode for editing crossing
73     GNE_NMODE_CROSSING,
74     ///@brief Mode for editing TAZ
75     GNE_NMODE_TAZ,
76     ///@brief Mode for editing Polygons
77     GNE_NMODE_POLYGON,
78     ///@brief Mode for editing connection prohibitions
79     GNE_NMODE_PROHIBITION
80 };
81 
82 /// @brie enum for demand edit modes
83 enum DemandEditMode {
84     /// @brief empty Demand mode
85     GNE_DMODE_NONE,
86     ///@brief mode for inspecting demand elements
87     GNE_DMODE_INSPECT,
88     ///@brief mode for deleting demand elements
89     GNE_DMODE_DELETE,
90     ///@brief mode for selecting demand elements
91     GNE_DMODE_SELECT,
92     ///@brief mode for moving demand elements
93     GNE_DMODE_MOVE,
94     ///@brief Mode for editing routes
95     GNE_DMODE_ROUTES,
96     ///@brief Mode for editing vehicles
97     GNE_DMODE_VEHICLES,
98     ///@brief Mode for editing vehicle types
99     GNE_DMODE_VEHICLETYPES,
100     ///@brief Mode for editing stops
101     GNE_DMODE_STOP
102 };
103 
104 // ===========================================================================
105 // class declarations
106 // ===========================================================================
107 
108 // main elements
109 class GNEViewParent;
110 class GNEViewNet;
111 class GNEUndoList;
112 class GNEFrame;
113 class GNEAttributeCarrier;
114 // net elements
115 class GNENet;
116 class GNENetElement;
117 class GNEJunction;
118 class GNEEdge;
119 class GNELane;
120 class GNEConnection;
121 class GNECrossing;
122 class GNEInternalLane;
123 // additional elements
124 class GNEAdditional;
125 class GNEShape;
126 class GNEPoly;
127 class GNEPOI;
128 class GNETAZ;
129 // demand elements
130 class GNEDemandElement;
131 class GNEVehicleType;
132 class GNEFlow;
133 class GNEVehicle;
134 class GNEtrip;
135 
136 // ===========================================================================
137 // classes and structs definitions
138 // ===========================================================================
139 
140 struct GNEViewNetHelper {
141 
142     /// @brief class used to group all variables related with objects under cursor after a click over view
143     class ObjectsUnderCursor {
144     public:
145         /// @brief constructor
146         ObjectsUnderCursor();
147 
148         /// @brief update objects under cursor (Called only in onLeftBtnPress(...) function)
149         void updateObjectUnderCursor(const std::vector<GUIGlObject*>& GUIGlObjects, GNEPoly* editedPolyShape);
150 
151         /// @brief swap lane to edge
152         void swapLane2Edge();
153 
154         /// @brief set created junction
155         void setCreatedJunction(GNEJunction* junction);
156 
157         /// @brief get front GUI GL ID (or a pointer to nullptr if there isn't)
158         GUIGlID getGlIDFront() const;
159 
160         /// @brief get front GUI GL object type (or a pointer to nullptr if there isn't)
161         GUIGlObjectType getGlTypeFront() const;
162 
163         /// @brief get front attribute carrier (or a pointer to nullptr if there isn't)
164         GNEAttributeCarrier* getAttributeCarrierFront() const;
165 
166         /// @brief get front net element (or a pointer to nullptr if there isn't)
167         GNENetElement* getNetElementFront() const;
168 
169         /// @brief get front additional element (or a pointer to nullptr if there isn't)
170         GNEAdditional* getAdditionalFront() const;
171 
172         /// @brief get front shape element (or a pointer to nullptr if there isn't)
173         GNEShape* getShapeFront() const;
174 
175         /// @brief get front net element element (or a pointer to nullptr if there isn't)
176         GNEDemandElement* getDemandElementFront() const;
177 
178         /// @brief get front junction (or a pointer to nullptr if there isn't)
179         GNEJunction* getJunctionFront() const;
180 
181         /// @brief get front edge (or a pointer to nullptr if there isn't)
182         GNEEdge* getEdgeFront() const;
183 
184         /// @brief get front lane (or a pointer to nullptr if there isn't)
185         GNELane* getLaneFront() const;
186 
187         /// @brief get front crossing (or a pointer to nullptr if there isn't)
188         GNECrossing* getCrossingFront() const;
189 
190         /// @brief get front connection (or a pointer to nullptr if there isn't)
191         GNEConnection* getConnectionFront() const;
192 
193         /// @brief get front TAZ (or a pointer to nullptr if there isn't)
194         GNETAZ* getTAZFront() const;
195 
196         /// @brief get front POI (or a pointer to nullptr if there isn't)
197         GNEPOI* getPOIFront() const;
198 
199         /// @brief get front Poly (or a pointer to nullptr if there isn't)
200         GNEPoly* getPolyFront() const;
201 
202         /// @brief get vector with clicked ACs
203         const std::vector<GNEAttributeCarrier*>& getClickedAttributeCarriers() const;
204 
205     private:
206         /// @brief vector with the clicked GUIGlObjects
207         std::vector<GUIGlObject*> myGUIGlObjects;
208 
209         /// @brief vector with the clicked attribute carriers
210         std::vector<GNEAttributeCarrier*> myAttributeCarriers;
211 
212         /// @brief vector with the clicked net elements
213         std::vector<GNENetElement*> myNetElements;
214 
215         /// @brief vector with the clicked additional elements
216         std::vector<GNEAdditional*> myAdditionals;
217 
218         /// @brief vector with the clicked shape elements (Poly and POIs)
219         std::vector<GNEShape*> myShapes;
220 
221         /// @brief vector with the clicked demand elements
222         std::vector<GNEDemandElement*> myDemandElements;
223 
224         /// @brief vector with the clicked junctions
225         std::vector<GNEJunction*> myJunctions;
226 
227         /// @brief vector with the clicked edges
228         std::vector<GNEEdge*> myEdges;
229 
230         /// @brief vector with the clicked lanes
231         std::vector<GNELane*> myLanes;
232 
233         /// @brief vector with the clicked crossings
234         std::vector<GNECrossing*> myCrossings;
235 
236         /// @brief vector with the clicked connections
237         std::vector<GNEConnection*> myConnections;
238 
239         /// @brief vector with the clicked TAZ elements (needed because uses a shape instead a position)
240         std::vector<GNETAZ*> myTAZs;
241 
242         /// @brief vector with the clicked POIs
243         std::vector<GNEPOI*> myPOIs;
244 
245         /// @brief vector with the clicked Polys
246         std::vector<GNEPoly*> myPolys;
247 
248         /// @brief invert GUIGlObjects
249         void sortGUIGlObjectsByAltitude(const std::vector<GUIGlObject*>& GUIGlObjects);
250 
251         /// @brief Invalidated copy constructor.
252         ObjectsUnderCursor(const ObjectsUnderCursor&) = delete;
253 
254         /// @brief Invalidated assignment operator.
255         ObjectsUnderCursor& operator=(const ObjectsUnderCursor&) = delete;
256     };
257 
258     /// @brief class used to group all variables related with key pressed after certain events
259     struct KeyPressed {
260 
261         /// @brief constructor
262         KeyPressed();
263 
264         /// @brief update status of KeyPressed
265         void update(void* eventData);
266 
267         /// @brief check if SHIFT key was pressed during click
268         bool shiftKeyPressed() const;
269 
270         /// @brief check if CONTROL key was pressed during click
271         bool controlKeyPressed() const;
272 
273     private:
274         /// @brief information of event
275         FXEvent* myEventInfo;
276 
277         /// @brief Invalidated copy constructor.
278         KeyPressed(const KeyPressed&) = delete;
279 
280         /// @brief Invalidated assignment operator.
281         KeyPressed& operator=(const KeyPressed&) = delete;
282     };
283 
284     /// @brief struct used to group all variables related with Supermodes
285     struct EditModes {
286 
287         /// @brief default constructor
288         EditModes(GNEViewNet* viewNet);
289 
290         /// @brief build checkable buttons
291         void buildSuperModeButtons();
292 
293         /// @brief set Network edit mode
294         void setSupermode(Supermode supermode);
295 
296         /// @brief set Network edit mode
297         void setNetworkEditMode(NetworkEditMode networkMode, bool force = false);
298 
299         /// @brief set Demand edit mode
300         void setDemandEditMode(DemandEditMode demandMode, bool force = false);
301 
302         /// @brief the current supermode
303         Supermode currentSupermode;
304 
305         /// @brief the current Network edit mode
306         NetworkEditMode networkEditMode;
307 
308         /// @brief the current Demand edit mode
309         DemandEditMode demandEditMode;
310 
311         /// @brief chekable button for supermode Network
312         MFXCheckableButton* networkButton;
313 
314         /// @brief chekable button for supermode Demand
315         MFXCheckableButton* demandButton;
316 
317     private:
318         /// @brief pointer to viewNet
319         GNEViewNet* myViewNet;
320 
321         /// @brief Invalidated copy constructor.
322         EditModes(const EditModes&) = delete;
323 
324         /// @brief Invalidated assignment operator.
325         EditModes& operator=(const EditModes&) = delete;
326     };
327 
328     /// @brief struct used to group all variables related to view options
329     struct ViewOptions {
330 
331         /// @brief default constructor
332         ViewOptions(GNEViewNet* viewNet);
333 
334         /// @brief build menu checks
335         void buildViewOptionsMenuChecks();
336 
337         /// @brief hide all options menu checks
338         void hideViewOptionsMenuChecks();
339 
340         /// @brief check if show demand elements checkbox is enabled
341         bool showDemandElements() const;
342 
343         /// @brief check if select edges checkbox is enabled
344         bool selectEdges() const;
345 
346         /// @brief check if select show connections checkbox is enabled
347         bool showConnections() const;
348 
349         /// @brief menu check to show Demand Elements
350         FXMenuCheck* menuCheckShowDemandElements;
351 
352         /// @brief menu check to select only edges
353         FXMenuCheck* menuCheckSelectEdges;
354 
355         /// @brief menu check to show connections
356         FXMenuCheck* menuCheckShowConnections;
357 
358         /// @brief menu check to hide connections in connect mode
359         FXMenuCheck* menuCheckHideConnections;
360 
361         /// @brief menu check to extend to edge nodes
362         FXMenuCheck* menuCheckExtendSelection;
363 
364         /// @brief menu check to set change all phases
365         FXMenuCheck* menuCheckChangeAllPhases;
366 
367         /// @brief show grid button
368         FXMenuCheck* menuCheckShowGrid;
369 
370     private:
371         /// @brief pointer to viewNet
372         GNEViewNet* myViewNet;
373 
374         /// @brief Invalidated copy constructor.
375         ViewOptions(const ViewOptions&) = delete;
376 
377         /// @brief Invalidated assignment operator.
378         ViewOptions& operator=(const ViewOptions&) = delete;
379     };
380 
381     /// @brief struct used to group all variables related to create edges
382     struct MoveOptions {
383 
384         /// @brief default constructor
385         MoveOptions(GNEViewNet* viewNet);
386 
387         /// @brief build menu checks
388         void buildMoveOptionMenuChecks();
389 
390         /// @brief hide all MenuChecks
391         void hideMoveOptionMenuChecks();
392 
393         /// @brief check if we're editing elevation
394         bool editingElevation() const;
395 
396         /// @brief whether we should warn about merging junctions
397         FXMenuCheck* warnAboutMerge;
398 
399         /// @brief show connection as buuble in "Move" mode.
400         FXMenuCheck* showJunctionBubble;
401 
402         /// @brief apply movement to elevation
403         FXMenuCheck* moveElevation;
404 
405     private:
406         /// @brief pointer to viewNet
407         GNEViewNet* myViewNet;
408 
409         /// @brief Invalidated copy constructor.
410         MoveOptions(const MoveOptions&) = delete;
411 
412         /// @brief Invalidated assignment operator.
413         MoveOptions& operator=(const MoveOptions&) = delete;
414     };
415 
416     /// @brief struct used to group all variables related with movement of single elements
417     struct MoveSingleElementValues {
418 
419         /// @brief constructor
420         MoveSingleElementValues(GNEViewNet* viewNet);
421 
422         /// @brief begin move single element in Network mode
423         bool beginMoveSingleElementNetworkMode();
424 
425         /// @brief begin move single element in Demand mode
426         bool beginMoveSingleElementDemandMode();
427 
428         /// @brief move single element in Network AND Demand mode
429         void moveSingleElement();
430 
431         /// @brief finish moving single elements in Network AND Demand mode
432         void finishMoveSingleElement();
433 
434         /// @brief original shape of element before start moving (used by polygons, edges, etc., needed for commmit position changes)
435         PositionVector originalShapeBeforeMoving;
436 
437         /// @brief index moved
438         int movingIndexShape;
439 
440         /// @brief original position of geometry position (needed for commmit position changes)
441         Position originalPositionInView;
442 
443     private:
444         /// calculate Poly movement values (Position, Index, etc.)
445         bool calculatePolyValues();
446 
447         /// calculate Edge movement values (Position, Index, etc.)
448         bool calculateEdgeValues();
449 
450         /// calculate TAZ movement values (Position, Index, etc.)
451         bool calculateTAZValues();
452 
453         /// @brief pointer to viewNet
454         GNEViewNet* myViewNet;
455 
456         /// @brief relative position of Clicked Position regarding to originalGeometryPointPosition (Used when user doesn't click exactly over the center of element)
457         Position myRelativeClickedPosition;
458 
459         /// @brief bool to indicate that startPos of an edge is being moved
460         bool myMovingStartPos;
461 
462         /// @brief bool to indicate that end pos of an edge is being moved
463         bool myMovingEndPos;
464 
465         /// @brief the Junction to be moved.
466         GNEJunction* myJunctionToMove;
467 
468         /// @brief the edge of which geometry is being moved
469         GNEEdge* myEdgeToMove;
470 
471         /// @brief the poly of which geometry is being moved
472         GNEPoly* myPolyToMove;
473 
474         /// @brief the poi which position is being moved
475         GNEPOI* myPOIToMove;
476 
477         /// @brief the additional element which position is being moved
478         GNEAdditional* myAdditionalToMove;
479 
480         /// @brief the demand element which position is being moved
481         GNEDemandElement* myDemandElementToMove;
482 
483         /// @brief the TAZ element which their Shape is being moved (it's the only additional with a shape instead a position)
484         GNETAZ* myTAZToMove;
485     };
486 
487     /// @brief struct used to group all variables related with movement of groups of elements
488     struct MoveMultipleElementValues {
489 
490         /// @brief constructor
491         MoveMultipleElementValues(GNEViewNet* viewNet);
492 
493         /// @brief begin move selection
494         void beginMoveSelection(GNEAttributeCarrier* originAC);
495 
496         /// @brief move selection
497         void moveSelection();
498 
499         /// @brief finish moving selection
500         void finishMoveSelection();
501 
502         /// @brief check if currently there is element being moved
503         bool isMovingSelection() const;
504 
505     private:
506         /// @brief pointer to viewNet
507         GNEViewNet* myViewNet;
508 
509         /// @brief original clicked position when moveSelection is called (used for calculate offset during moveSelection())
510         Position myClickedPosition;
511 
512         /// @brief flag to check if a selection is being moved
513         bool myMovingSelection;
514 
515         /// @brief container used for move junctions
516         std::map<GNEJunction*, Position> myMovedJunctionOriginPositions;
517 
518         /// @brief container used for move entire edges
519         std::map<GNEEdge*, PositionVector> myMovedEdgesOriginShape;
520 
521         /// @brief container used for move GeometryPoints of edges
522         std::map<GNEEdge*, MoveSingleElementValues*> myMovedEgdesGeometryPoints;
523     };
524 
525     /// @brief struct used to group all variables related with movement of groups of elements
526     struct VehicleOptions {
527 
528         /// @brief constructor
529         VehicleOptions(GNEViewNet* viewNet);
530 
531         /// @brief build menu checks
532         void buildVehicleOptionsMenuChecks();
533 
534         /// @brief hide all options menu checks
535         void hideVehicleOptionsMenuChecks();
536 
537     private:
538         /// @brief pointer to viewNet
539         GNEViewNet* myViewNet;
540     };
541 
542     /// @brief struct used to group all variables related with movement of groups of elements
543     struct VehicleTypeOptions {
544 
545         /// @brief constructor
546         VehicleTypeOptions(GNEViewNet* viewNet);
547 
548         /// @brief build menu checks
549         void buildVehicleTypeOptionsMenuChecks();
550 
551         /// @brief hide all options menu checks
552         void hideVehicleTypeOptionsMenuChecks();
553 
554     private:
555         /// @brief pointer to viewNet
556         GNEViewNet* myViewNet;
557     };
558 
559     /// @brief struct used to group all variables related with selecting using a square or polygon
560     /// @note in the future the variables used for selecting throught a polygon will be placed here
561     struct SelectingArea {
562 
563         /// @brief default constructor
564         SelectingArea(GNEViewNet* viewNet);
565 
566         /// @brief begin rectangle selection
567         void beginRectangleSelection();
568 
569         /// @brief move rectangle selection
570         void moveRectangleSelection();
571 
572         /// @brief finish rectangle selection
573         void finishRectangleSelection();
574 
575         /// @brief process rectangle Selection
576         void processRectangleSelection();
577 
578         /// @brief process rectangle Selection (only limited to Edges)
579         std::vector<GNEEdge*> processEdgeRectangleSelection();
580 
581         /// @brief process shape selection
582         void processShapeSelection(const PositionVector& shape);
583 
584         /// @brief draw rectangle selection
585         void drawRectangleSelection(const RGBColor& color) const;
586 
587         /// @brief whether we have started rectangle-selection
588         bool selectingUsingRectangle;
589 
590         /// @brief whether we have started rectangle-selection
591         bool startDrawing;
592 
593     private:
594         /// @brief Process boundary Selection
595         void processBoundarySelection(const Boundary& boundary);
596 
597         /// @brief firstcorner of the rectangle-selection
598         Position selectionCorner1;
599 
600         /// @brief second corner of the rectangle-selection
601         Position selectionCorner2;
602 
603         /// @brief pointer to viewNet
604         GNEViewNet* myViewNet;
605     };
606 
607     /// @brief struct used to group all variables related with testing
608     struct TestingMode {
609 
610         /// @brief default constructor
611         TestingMode(GNEViewNet* viewNet);
612 
613         /// @brief init testing mode
614         void initTestingMode();
615 
616         /// @brief draw testing element
617         void drawTestingElements(GUIMainWindow* mainWindow);
618 
619     private:
620         /// @brief pointer to viewNet
621         GNEViewNet* myViewNet;
622 
623         /// @brief flag to enable or disable testing mode
624         bool myTestingEnabled;
625 
626         /// @brief Width of viewNet in testing mode
627         int myTestingWidth;
628 
629         /// @brief Height of viewNet in testing mode
630         int myTestingHeight;
631     };
632 
633     /// @brief struct used to group all variables related to create edges
634     struct CreateEdgeOptions {
635 
636         /// @brief default constructor
637         CreateEdgeOptions(GNEViewNet* viewNet);
638 
639         /// @brief build menu checks
640         void buildCreateEdgeOptionMenuChecks();
641 
642         /// @brief hide all MenuChecks
643         void hideCreateEdgeOptionMenuChecks();
644 
645         /// @brief whether the endpoint for a created edge should be set as the new source
646         FXMenuCheck* chainEdges;
647 
648         /// @brief create auto create opposite edge
649         FXMenuCheck* autoOppositeEdge;
650 
651     private:
652         /// @brief pointer to viewNet
653         GNEViewNet* myViewNet;
654     };
655 
656     /// @brief struct used to group all variables related with common chekable Buttons
657     struct CommonCheckableButtons {
658 
659         /// @brief default constructor
660         CommonCheckableButtons(GNEViewNet* viewNet);
661 
662         /// @brief build checkable buttons
663         void buildCommonCheckableButtons();
664 
665         /// @brief show all Common Checkable Buttons
666         void showCommonCheckableButtons();
667 
668         /// @brief hide all Common Checkable Buttons
669         void hideCommonCheckableButtons();
670 
671         /// @brief hide all options menu checks
672         void disableCommonCheckableButtons();
673 
674         /// @brief update Common checkable buttons
675         void updateCommonCheckableButtons();
676 
677         /// @brief chekable button for edit mode inspect
678         MFXCheckableButton* inspectButton;
679 
680         /// @brief chekable button for edit mode delete
681         MFXCheckableButton* deleteButton;
682 
683         /// @brief chekable button for edit mode select
684         MFXCheckableButton* selectButton;
685 
686         /// @brief chekable button for edit mode move
687         MFXCheckableButton* moveButton;
688 
689     private:
690         /// @brief pointer to viewNet
691         GNEViewNet* myViewNet;
692     };
693 
694     /// @brief struct used to group all variables related with Network chekable Buttons
695     struct NetworkCheckableButtons {
696 
697         /// @brief default constructor
698         NetworkCheckableButtons(GNEViewNet* viewNet);
699 
700         /// @brief build checkable buttons
701         void buildNetworkCheckableButtons();
702 
703         /// @brief show all Network Checkable Buttons
704         void showNetworkCheckableButtons();
705 
706         /// @brief hide all Network Checkable Buttons
707         void hideNetworkCheckableButtons();
708 
709         /// @brief hide all options menu checks
710         void disableNetworkCheckableButtons();
711 
712         /// @brief update network checkable buttons
713         void updateNetworkCheckableButtons();
714 
715         /// @brief chekable button for edit mode create edge
716         MFXCheckableButton* createEdgeButton;
717 
718         /// @brief chekable button for edit mode connection
719         MFXCheckableButton* connectionButton;
720 
721         /// @brief chekable button for edit mode traffic light
722         MFXCheckableButton* trafficLightButton;
723 
724         /// @brief chekable button for edit mode additional
725         MFXCheckableButton* additionalButton;
726 
727         /// @brief chekable button for edit mode crossing
728         MFXCheckableButton* crossingButton;
729 
730         /// @brief chekable button for edit mode TAZ
731         MFXCheckableButton* TAZButton;
732 
733         /// @brief chekable button for edit mode shape
734         MFXCheckableButton* shapeButton;
735 
736         /// @brief checkable button for edit mode polygon
737         MFXCheckableButton* prohibitionButton;
738 
739     private:
740         /// @brief pointer to viewNet
741         GNEViewNet* myViewNet;
742     };
743 
744     /// @brief struct used to group all variables related with Demand checkable Buttons
745     struct DemandCheckableButtons {
746 
747         /// @brief default constructor
748         DemandCheckableButtons(GNEViewNet* viewNet);
749 
750         /// @brief build checkable buttons
751         void buildDemandCheckableButtons();
752 
753         /// @brief show all Demand Checkable Buttons
754         void showDemandCheckableButtons();
755 
756         /// @brief hide all Demand Checkable Buttons
757         void hideDemandCheckableButtons();
758 
759         /// @brief hide all options menu checks
760         void disableDemandCheckableButtons();
761 
762         /// @brief update Demand checkable buttons
763         void updateDemandCheckableButtons();
764 
765         /// @brief chekable button for edit mode create routes
766         MFXCheckableButton* routeButton;
767 
768         /// @brief chekable button for edit mode create vehicles
769         MFXCheckableButton* vehicleButton;
770 
771         /// @brief chekable button for edit mode create vehicle type
772         MFXCheckableButton* vehicleTypeButton;
773 
774         /// @brief chekable button for edit mode create stops
775         MFXCheckableButton* stopButton;
776 
777     private:
778         /// @brief pointer to viewNet
779         GNEViewNet* myViewNet;
780     };
781 };
782 
783 #endif
784 
785 /****************************************************************************/
786