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