SUMO - Simulation of Urban MObility
GUIDialog_GLObjChooser.cpp
Go to the documentation of this file.
1 /****************************************************************************/
9 // Class for the window that allows to choose a street, junction or vehicle
10 /****************************************************************************/
11 // SUMO, Simulation of Urban MObility; see http://sumo.dlr.de/
12 // Copyright (C) 2001-2017 DLR (http://www.dlr.de/) and contributors
13 /****************************************************************************/
14 //
15 // This file is part of SUMO.
16 // SUMO is free software: you can redistribute it and/or modify
17 // it under the terms of the GNU General Public License as published by
18 // the Free Software Foundation, either version 3 of the License, or
19 // (at your option) any later version.
20 //
21 /****************************************************************************/
22 
23 
24 // ===========================================================================
25 // included modules
26 // ===========================================================================
27 #ifdef _MSC_VER
28 #include <windows_config.h>
29 #else
30 #include <config.h>
31 #endif
32 
33 #include <string>
34 #include <vector>
35 #include <fxkeys.h>
45 #include "GUIDialog_GLObjChooser.h"
46 
47 #ifdef CHECK_MEMORY_LEAKS
48 #include <foreign/nvwa/debug_new.h>
49 #endif // CHECK_MEMORY_LEAKS
50 
51 
52 // ===========================================================================
53 // FOX callback mapping
54 // ===========================================================================
55 FXDEFMAP(GUIDialog_GLObjChooser) GUIDialog_GLObjChooserMap[] = {
57  FXMAPFUNC(SEL_COMMAND, MID_CANCEL, GUIDialog_GLObjChooser::onCmdClose),
58  FXMAPFUNC(SEL_CHANGED, MID_CHOOSER_TEXT, GUIDialog_GLObjChooser::onChgText),
59  FXMAPFUNC(SEL_COMMAND, MID_CHOOSER_TEXT, GUIDialog_GLObjChooser::onCmdText),
63 };
64 
65 FXIMPLEMENT(GUIDialog_GLObjChooser, FXMainWindow, GUIDialog_GLObjChooserMap, ARRAYNUMBER(GUIDialog_GLObjChooserMap))
66 
67 
68 // ===========================================================================
69 // method definitions
70 // ===========================================================================
72  GUIGlChildWindow* parent,
73  FXIcon* icon,
74  const FXString& title,
75  const std::vector<GUIGlID>& ids,
76  GUIGlObjectStorage& glStorage):
77  FXMainWindow(parent->getApp(), title, icon, NULL, DECOR_ALL, 20, 20, 300, 300),
78  myParent(parent) {
79  FXHorizontalFrame* hbox = new FXHorizontalFrame(this, LAYOUT_FILL_X | LAYOUT_FILL_Y, 0, 0, 0, 0, 0, 0, 0, 0);
80  // build the list
81  FXVerticalFrame* layout1 = new FXVerticalFrame(hbox, LAYOUT_FILL_X | LAYOUT_FILL_Y | LAYOUT_TOP, 0, 0, 0, 0, 4, 4, 4, 4);
82  myTextEntry = new FXTextField(layout1, 0, this, MID_CHOOSER_TEXT, LAYOUT_FILL_X | FRAME_THICK | FRAME_SUNKEN);
83  FXVerticalFrame* style1 = new FXVerticalFrame(layout1, LAYOUT_FILL_X | LAYOUT_FILL_Y | LAYOUT_TOP | FRAME_THICK | FRAME_SUNKEN, 0, 0, 0, 0, 0, 0, 0, 0);
84  myList = new FXList(style1, this, MID_CHOOSER_LIST, LAYOUT_FILL_X | LAYOUT_FILL_Y | LIST_SINGLESELECT | FRAME_SUNKEN | FRAME_THICK);
85  for (std::vector<GUIGlID>::const_iterator i = ids.begin(); i != ids.end(); ++i) {
86  GUIGlObject* o = glStorage.getObjectBlocking(*i);
87  if (o == 0) {
88  continue;
89  }
90  const std::string& name = o->getMicrosimID();
91  bool selected = myParent->isSelected(o);
92  FXIcon* icon = selected ? GUIIconSubSys::getIcon(ICON_FLAG) : 0;
93  myIDs.insert(o->getGlID());
94  myList->appendItem(name.c_str(), icon, (void*) & (*myIDs.find(o->getGlID())));
95  glStorage.unblockObject(*i);
96  }
97  // build the buttons
98  FXVerticalFrame* layout = new FXVerticalFrame(hbox, LAYOUT_TOP, 0, 0, 0, 0, 4, 4, 4, 4);
99  myCenterButton = new FXButton(layout, "Center\t\t", GUIIconSubSys::getIcon(ICON_RECENTERVIEW),
100  this, MID_CHOOSER_CENTER, ICON_BEFORE_TEXT | LAYOUT_FILL_X | FRAME_THICK | FRAME_RAISED,
101  0, 0, 0, 0, 4, 4, 4, 4);
102  new FXHorizontalSeparator(layout, GUIDesignHorizontalSeparator);
103  new FXButton(layout, "&Hide Unselected\t\t", GUIIconSubSys::getIcon(ICON_FLAG),
104  this, MID_CHOOSER_FILTER, ICON_BEFORE_TEXT | LAYOUT_FILL_X | FRAME_THICK | FRAME_RAISED,
105  0, 0, 0, 0, 4, 4, 4, 4);
106  new FXButton(layout, "&Select/deselect\tSelect/deselect current object\t", GUIIconSubSys::getIcon(ICON_FLAG),
107  this, MID_CHOOSEN_INVERT, ICON_BEFORE_TEXT | LAYOUT_FILL_X | FRAME_THICK | FRAME_RAISED,
108  0, 0, 0, 0, 4, 4, 4, 4);
109  new FXHorizontalSeparator(layout, GUIDesignHorizontalSeparator);
110  new FXButton(layout, "&Close\t\t", GUIIconSubSys::getIcon(ICON_NO),
111  this, MID_CANCEL, ICON_BEFORE_TEXT | LAYOUT_FILL_X | FRAME_THICK | FRAME_RAISED,
112  0, 0, 0, 0, 4, 4, 4, 4);
113 
114  myParent->getParent()->addChild(this);
115 }
116 
117 
119  myParent->getParent()->removeChild(this);
120 }
121 
122 
123 void
125  FXMainWindow::show();
126  myTextEntry->setFocus();
127 }
128 
129 
130 long
131 GUIDialog_GLObjChooser::onCmdCenter(FXObject*, FXSelector, void*) {
132  int selected = myList->getCurrentItem();
133  if (selected >= 0) {
134  myParent->setView(*static_cast<GUIGlID*>(myList->getItemData(selected)));
135  }
136  return 1;
137 }
138 
139 
140 long
141 GUIDialog_GLObjChooser::onCmdClose(FXObject*, FXSelector, void*) {
142  close(true);
143  return 1;
144 }
145 
146 
147 long
148 GUIDialog_GLObjChooser::onChgText(FXObject*, FXSelector, void*) {
149  int id = myList->findItem(myTextEntry->getText(), -1, SEARCH_PREFIX);
150  if (id < 0) {
151  if (myList->getNumItems() > 0) {
152  myList->deselectItem(myList->getCurrentItem());
153  }
154  myCenterButton->disable();
155  return 1;
156  }
157  myList->deselectItem(myList->getCurrentItem());
158  myList->makeItemVisible(id);
159  myList->selectItem(id);
160  myList->setCurrentItem(id, true);
161  myCenterButton->enable();
162  return 1;
163 }
164 
165 
166 long
167 GUIDialog_GLObjChooser::onCmdText(FXObject*, FXSelector, void*) {
168  int current = myList->getCurrentItem();
169  if (current >= 0 && myList->isItemSelected(current)) {
170  myParent->setView(*static_cast<GUIGlID*>(myList->getItemData(current)));
171  }
172  return 1;
173 }
174 
175 
176 
177 long
178 GUIDialog_GLObjChooser::onListKeyPress(FXObject*, FXSelector, void* ptr) {
179  FXEvent* event = (FXEvent*)ptr;
180  switch (event->code) {
181  case KEY_Return:
182  onCmdText(0, 0, 0);
183  break;
184  default:
185  break;
186  }
187  return 1;
188 }
189 
190 
191 long
192 GUIDialog_GLObjChooser::onCmdFilter(FXObject*, FXSelector, void*) {
194  std::vector<GUIGlID> selectedGlIDs;
195  std::vector<FXString> selectedMicrosimIDs;
196  const int numItems = myList->getNumItems();
197  for (int i = 0; i < numItems; i++) {
198  const GUIGlID glID = *static_cast<GUIGlID*>(myList->getItemData(i));
199  if (myList->getItemIcon(i) == flag) {
200  selectedGlIDs.push_back(glID);
201  selectedMicrosimIDs.push_back(myList->getItemText(i));
202  }
203  }
204  myList->clearItems();
205  const int numSelected = (const int)selectedGlIDs.size();
206  for (int i = 0; i < numSelected; i++) {
207  myList->appendItem(selectedMicrosimIDs[i], flag, (void*) & (*myIDs.find(selectedGlIDs[i])));
208  }
209  myList->update();
210  return 1;
211 }
212 
213 long
214 GUIDialog_GLObjChooser::onCmdToggleSelection(FXObject*, FXSelector, void*) {
216  int i = myList->getCurrentItem();
217  if (i >= 0) {
218  GUIGlID* glID = static_cast<GUIGlID*>(myList->getItemData(i));
219  gSelected.toggleSelection(*glID);
220  if (myList->getItemIcon(i) == flag) {
221  myList->setItemIcon(i, 0);
222  } else {
223  myList->setItemIcon(i, flag);
224  }
225  }
226  myList->update();
227  myParent->getView()->update();
228  return 1;
229 }
230 
231 
232 /****************************************************************************/
233 
Filter selected.
Definition: GUIAppEnum.h:335
void show()
sets the focus after the window is created to work-around bug in libfox
GUISUMOAbstractView * getView() const
long onCmdFilter(FXObject *, FXSelector, void *)
Callback: Hides unselected items if pressed.
void toggleSelection(GUIGlID id)
Toggles selection of an object.
long onCmdCenter(FXObject *, FXSelector, void *)
Callback: The selected item shall be centered within the calling view.
FXDEFMAP(GUIDialog_GLObjChooser) GUIDialog_GLObjChooserMap[]
long onCmdText(FXObject *, FXSelector, void *)
Callback: Selects to current item if enter is pressed.
Deselect selected items.
Definition: GUIAppEnum.h:355
GUIGlID getGlID() const
Returns the numerical id of the object.
long onCmdToggleSelection(FXObject *, FXSelector, void *)
Callback: Toggle selection status of current object.
const unsigned char flag[]
Definition: flag.cpp:24
Object list.
Definition: GUIAppEnum.h:333
virtual const std::string & getMicrosimID() const
Returns the id of the object as known to microsim.
Text entry.
Definition: GUIAppEnum.h:331
#define GUIDesignHorizontalSeparator
Definition: GUIDesigns.h:266
GUIMainWindow * getParent()
Returns the main window.
FXList * myList
The list that holds the ids.
GUIGlChildWindow * myParent
The parent window.
void removeChild(FXMDIChild *child)
removes the given child window from the list
A storage for of displayed objects via their numerical id.
long onCmdClose(FXObject *, FXSelector, void *)
Callback: The dialog shall be closed.
Cancel-button pressed.
Definition: GUIAppEnum.h:65
unsigned int GUIGlID
Definition: GUIGlObject.h:50
void setView(GUIGlID id)
Centers the view onto the given artifact.
FXButton * myCenterButton
The button that triggers centering on the select object.
std::set< GUIGlID > myIDs
myList contains (void) pointers to elements of myIDs instead of the more
long onListKeyPress(FXObject *, FXSelector, void *)
Callback: Selects to current item if enter is pressed.
Center object.
Definition: GUIAppEnum.h:329
GUISelectedStorage gSelected
A global holder of selected objects.
static FXIcon * getIcon(GUIIcon which)
returns a icon previously defined in the enum GUIIcon
FXTextField * myTextEntry
The text field.
long onChgText(FXObject *, FXSelector, void *)
Callback: Something has been typed into the the field.