SUMO - Simulation of Urban MObility
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
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.sourceforge.net/
12 // Copyright (C) 2001-2012 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>
44 #include "GUIDialog_GLObjChooser.h"
45 
46 #ifdef _WIN32
47 #include <windows.h>
48 #endif
49 
50 #include <GL/gl.h>
51 
52 #ifdef CHECK_MEMORY_LEAKS
53 #include <foreign/nvwa/debug_new.h>
54 #endif // CHECK_MEMORY_LEAKS
55 
56 
57 // ===========================================================================
58 // FOX callback mapping
59 // ===========================================================================
60 FXDEFMAP(GUIDialog_GLObjChooser) GUIDialog_GLObjChooserMap[] = {
62  FXMAPFUNC(SEL_COMMAND, MID_CANCEL, GUIDialog_GLObjChooser::onCmdClose),
63  FXMAPFUNC(SEL_CHANGED, MID_CHOOSER_TEXT, GUIDialog_GLObjChooser::onChgText),
64  FXMAPFUNC(SEL_COMMAND, MID_CHOOSER_TEXT, GUIDialog_GLObjChooser::onCmdText),
67 };
68 
69 FXIMPLEMENT(GUIDialog_GLObjChooser, FXMainWindow, GUIDialog_GLObjChooserMap, ARRAYNUMBER(GUIDialog_GLObjChooserMap))
70 
71 
72 // ===========================================================================
73 // method definitions
74 // ===========================================================================
76  GUIGlChildWindow* parent,
77  FXIcon* icon,
78  const FXString& title,
79  GUIGlObjectType type,
80  const std::vector<GUIGlID> &ids,
81  GUIGlObjectStorage& glStorage):
82  FXMainWindow(parent->getApp(), title, icon, NULL, DECOR_ALL, 20, 20, 300, 300),
83  myObjectType(type),
84  myParent(parent) {
85  FXHorizontalFrame* hbox = new FXHorizontalFrame(this, LAYOUT_FILL_X | LAYOUT_FILL_Y, 0, 0, 0, 0, 0, 0, 0, 0);
86  // build the list
87  FXVerticalFrame* layout1 = new FXVerticalFrame(hbox, LAYOUT_FILL_X | LAYOUT_FILL_Y | LAYOUT_TOP, 0, 0, 0, 0, 4, 4, 4, 4);
88  myTextEntry = new FXTextField(layout1, 0, this, MID_CHOOSER_TEXT, LAYOUT_FILL_X | FRAME_THICK | FRAME_SUNKEN);
89  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);
90  myList = new FXList(style1, this, MID_CHOOSER_LIST, LAYOUT_FILL_X | LAYOUT_FILL_Y | LIST_SINGLESELECT | FRAME_SUNKEN | FRAME_THICK);
91  for (std::vector<GUIGlID>::const_iterator i = ids.begin(); i != ids.end(); ++i) {
92  GUIGlObject* o = glStorage.getObjectBlocking(*i);
93  if (o == 0) {
94  continue;
95  }
96  const std::string& name = o->getMicrosimID();
97  bool selected = myParent->isSelected(o);
98  FXIcon* icon = selected ? GUIIconSubSys::getIcon(ICON_FLAG) : 0;
99  myIDs.insert(o->getGlID());
100  myList->appendItem(name.c_str(), icon, (void*) & (*myIDs.find(o->getGlID())));
101  glStorage.unblockObject(*i);
102  }
103  // build the buttons
104  FXVerticalFrame* layout = new FXVerticalFrame(hbox, LAYOUT_TOP, 0, 0, 0, 0, 4, 4, 4, 4);
105  new FXButton(layout, "Center\t\t", GUIIconSubSys::getIcon(ICON_RECENTERVIEW),
106  this, MID_CHOOSER_CENTER, ICON_BEFORE_TEXT | LAYOUT_FILL_X | FRAME_THICK | FRAME_RAISED,
107  0, 0, 0, 0, 4, 4, 4, 4);
108  new FXHorizontalSeparator(layout, SEPARATOR_GROOVE | LAYOUT_FILL_X);
109  new FXButton(layout, "Hide Unselected\t\t", GUIIconSubSys::getIcon(ICON_FLAG),
110  this, MID_CHOOSER_FILTER, ICON_BEFORE_TEXT | LAYOUT_FILL_X | FRAME_THICK | FRAME_RAISED,
111  0, 0, 0, 0, 4, 4, 4, 4);
112  new FXHorizontalSeparator(layout, SEPARATOR_GROOVE | LAYOUT_FILL_X);
113  new FXButton(layout, "Close\t\t", GUIIconSubSys::getIcon(ICON_NO),
114  this, MID_CANCEL, ICON_BEFORE_TEXT | LAYOUT_FILL_X | FRAME_THICK | FRAME_RAISED,
115  0, 0, 0, 0, 4, 4, 4, 4);
116 
117  myParent->getParent()->addChild(this);
118  myTextEntry->setFocus();
119 }
120 
121 
123  myParent->getParent()->removeChild(this);
124 }
125 
126 
127 long
129  int selected = myList->getCurrentItem();
130  if (selected >= 0) {
131  myParent->setView(*static_cast<GUIGlID*>(myList->getItemData(selected)));
132  }
133  return 1;
134 }
135 
136 
137 long
139  close(true);
140  return 1;
141 }
142 
143 
144 long
146  int id = myList->findItem(myTextEntry->getText(), -1, SEARCH_PREFIX);
147  if (id < 0) {
148  return 1;
149  }
150  myList->deselectItem(myList->getCurrentItem());
151  myList->makeItemVisible(id);
152  myList->selectItem(id);
153  myList->setCurrentItem(id, true);
154  return 1;
155 }
156 
157 
158 long
160  int current = myList->getCurrentItem();
161  if (current >= 0 && myList->isItemSelected(current)) {
162  myParent->setView(*static_cast<GUIGlID*>(myList->getItemData(current)));
163  }
164  return 1;
165 }
166 
167 
168 
169 long
171  FXEvent* event = (FXEvent*)ptr;
172  switch (event->code) {
173  case KEY_Return:
174  onCmdText(0, 0, 0);
175  break;
176  default:
177  break;
178  }
179  return 1;
180 }
181 
182 
183 long
186  std::vector<GUIGlID> selectedGlIDs;
187  std::vector<FXString> selectedMicrosimIDs;
188  const int numItems = myList->getNumItems();
189  for (int i = 0; i < numItems; i++) {
190  const GUIGlID glID = *static_cast<GUIGlID*>(myList->getItemData(i));
191  if (myList->getItemIcon(i) == flag) {
192  selectedGlIDs.push_back(glID);
193  selectedMicrosimIDs.push_back(myList->getItemText(i));
194  }
195  }
196  myList->clearItems();
197  const int numSelected = selectedGlIDs.size();
198  for (int i = 0; i < numSelected; i++) {
199  myList->appendItem(selectedMicrosimIDs[i], flag, (void*) & (*myIDs.find(selectedGlIDs[i])));
200  }
201  myList->update();
202  return 1;
203 }
204 
205 
206 /****************************************************************************/
207