SUMO - Simulation of Urban MObility
|
00001 /****************************************************************************/ 00009 // The window that holds the table of an object's parameter 00010 /****************************************************************************/ 00011 // SUMO, Simulation of Urban MObility; see http://sumo.sourceforge.net/ 00012 // Copyright (C) 2001-2012 DLR (http://www.dlr.de/) and contributors 00013 /****************************************************************************/ 00014 // 00015 // This file is part of SUMO. 00016 // SUMO is free software: you can redistribute it and/or modify 00017 // it under the terms of the GNU General Public License as published by 00018 // the Free Software Foundation, either version 3 of the License, or 00019 // (at your option) any later version. 00020 // 00021 /****************************************************************************/ 00022 00023 00024 // =========================================================================== 00025 // included modules 00026 // =========================================================================== 00027 #ifdef _MSC_VER 00028 #include <windows_config.h> 00029 #else 00030 #include <config.h> 00031 #endif 00032 00033 #include <string> 00034 #include <fx.h> 00035 #include "GUIParameterTableWindow.h" 00036 #include <utils/gui/globjects/GUIGlObject.h> 00037 #include <utils/common/ToString.h> 00038 #include <utils/gui/div/GUIParam_PopupMenu.h> 00039 #include <utils/gui/windows/GUIAppEnum.h> 00040 #include <utils/gui/windows/GUIMainWindow.h> 00041 #include <utils/gui/images/GUIIconSubSys.h> 00042 #include <utils/gui/div/GUIParameterTableItem.h> 00043 00044 #ifdef CHECK_MEMORY_LEAKS 00045 #include <foreign/nvwa/debug_new.h> 00046 #endif // CHECK_MEMORY_LEAKS 00047 00048 00049 // =========================================================================== 00050 // FOX callback mapping 00051 // =========================================================================== 00052 FXDEFMAP(GUIParameterTableWindow) GUIParameterTableWindowMap[] = { 00053 FXMAPFUNC(SEL_COMMAND, MID_SIMSTEP, GUIParameterTableWindow::onSimStep), 00054 FXMAPFUNC(SEL_SELECTED, MID_TABLE, GUIParameterTableWindow::onTableSelected), 00055 FXMAPFUNC(SEL_DESELECTED, MID_TABLE, GUIParameterTableWindow::onTableDeselected), 00056 FXMAPFUNC(SEL_RIGHTBUTTONPRESS, MID_TABLE, GUIParameterTableWindow::onRightButtonPress), 00057 }; 00058 00059 FXIMPLEMENT(GUIParameterTableWindow, FXMainWindow, GUIParameterTableWindowMap, ARRAYNUMBER(GUIParameterTableWindowMap)) 00060 00061 00062 // =========================================================================== 00063 // method definitions 00064 // =========================================================================== 00065 GUIParameterTableWindow::GUIParameterTableWindow(GUIMainWindow& app, 00066 GUIGlObject& o, size_t noRows) 00067 : FXMainWindow(app.getApp(), (o.getFullName() + " Parameter").c_str(), 00068 NULL, NULL, DECOR_ALL, 20, 20, 300, (FXint)(noRows * 20 + 60)), 00069 myObject(&o), 00070 myApplication(&app), myCurrentPos(0) { 00071 myTable = new FXTable(this, this, MID_TABLE, TABLE_COL_SIZABLE | TABLE_ROW_SIZABLE | LAYOUT_FILL_X | LAYOUT_FILL_Y); 00072 myTable->setVisibleRows((FXint)(noRows + 1)); 00073 myTable->setVisibleColumns(3); 00074 myTable->setTableSize((FXint)(noRows + 1), 3); 00075 myTable->setBackColor(FXRGB(255, 255, 255)); 00076 myTable->setColumnText(0, "Name"); 00077 myTable->setColumnText(1, "Value"); 00078 myTable->setColumnText(2, "Dynamic"); 00079 myTable->getRowHeader()->setWidth(0); 00080 FXHeader* header = myTable->getColumnHeader(); 00081 header->setItemJustify(0, JUSTIFY_CENTER_X); 00082 header->setItemSize(0, 150); 00083 header->setItemJustify(1, JUSTIFY_CENTER_X); 00084 header->setItemSize(1, 80); 00085 header->setItemJustify(2, JUSTIFY_CENTER_X); 00086 header->setItemSize(2, 60); 00087 setIcon(GUIIconSubSys::getIcon(ICON_APP_TABLE)); 00088 myLock.lock(); 00089 myObject->addParameterTable(this); 00090 myLock.unlock(); 00091 } 00092 00093 00094 GUIParameterTableWindow::~GUIParameterTableWindow() { 00095 myApplication->removeChild(this); 00096 myLock.lock(); 00097 for (std::vector<GUIParameterTableItemInterface*>::iterator i = myItems.begin(); i != myItems.end(); ++i) { 00098 delete(*i); 00099 } 00100 if (myObject != 0) { 00101 myObject->removeParameterTable(this); 00102 } 00103 myLock.unlock(); 00104 } 00105 00106 00107 void 00108 GUIParameterTableWindow::removeObject(GUIGlObject* /*i*/) { 00109 myLock.lock(); 00110 myObject = 0; 00111 myLock.unlock(); 00112 } 00113 00114 00115 long 00116 GUIParameterTableWindow::onSimStep(FXObject*, FXSelector, void*) { 00117 updateTable(); 00118 update(); 00119 return 1; 00120 } 00121 00122 00123 long 00124 GUIParameterTableWindow::onTableSelected(FXObject*, FXSelector, void*) { 00125 return 1; 00126 } 00127 00128 00129 long 00130 GUIParameterTableWindow::onTableDeselected(FXObject*, FXSelector, void*) { 00131 return 1; 00132 } 00133 00134 00135 long 00136 GUIParameterTableWindow::onRightButtonPress(FXObject* sender, 00137 FXSelector sel, 00138 void* data) { 00139 // check which value entry was pressed 00140 myTable->onLeftBtnPress(sender, sel, data); 00141 int row = myTable->getCurrentRow(); 00142 if (row == -1 || row >= (int)(myItems.size())) { 00143 return 1; 00144 } 00145 GUIParameterTableItemInterface* i = myItems[row]; 00146 if (!i->dynamic()) { 00147 return 1; 00148 } 00149 00150 GUIParam_PopupMenuInterface* p = new GUIParam_PopupMenuInterface(*myApplication, *this, *myObject, i->getName(), i->getSUMORealSourceCopy()); 00151 new FXMenuCommand(p, "Open in new Tracker", 0, p, MID_OPENTRACKER); 00152 // set geometry 00153 p->setX(static_cast<FXEvent*>(data)->root_x); 00154 p->setY(static_cast<FXEvent*>(data)->root_y); 00155 p->create(); 00156 // show 00157 p->show(); 00158 return 1; 00159 } 00160 00161 00162 00163 void 00164 GUIParameterTableWindow::mkItem(const char* name, bool dynamic, 00165 ValueSource<unsigned> *src) { 00166 GUIParameterTableItemInterface* i = new GUIParameterTableItem<unsigned>(myTable, myCurrentPos++, name, dynamic, src); 00167 myItems.push_back(i); 00168 } 00169 00170 00171 void 00172 GUIParameterTableWindow::mkItem(const char* name, bool dynamic, 00173 ValueSource<SUMOReal> *src) { 00174 GUIParameterTableItemInterface* i = new GUIParameterTableItem<SUMOReal>(myTable, myCurrentPos++, name, dynamic, src); 00175 myItems.push_back(i); 00176 } 00177 00178 00179 #ifndef HAVE_SUBSECOND_TIMESTEPS 00180 void 00181 GUIParameterTableWindow::mkItem(const char* name, bool dynamic, 00182 ValueSource<SUMOTime> *src) { 00183 GUIParameterTableItemInterface* i = new GUIParameterTableItem<SUMOTime>(myTable, myCurrentPos++, name, dynamic, src); 00184 myItems.push_back(i); 00185 } 00186 #endif 00187 00188 00189 void 00190 GUIParameterTableWindow::mkItem(const char* name, bool dynamic, 00191 std::string value) { 00192 // T = SUMOReal is only a dummy type here 00193 GUIParameterTableItemInterface* i = new GUIParameterTableItem<SUMOReal>(myTable, myCurrentPos++, name, dynamic, value); 00194 myItems.push_back(i); 00195 } 00196 00197 00198 void 00199 GUIParameterTableWindow::mkItem(const char* name, bool dynamic, 00200 SUMOReal value) { 00201 GUIParameterTableItemInterface* i = new GUIParameterTableItem<SUMOReal>(myTable, myCurrentPos++, name, dynamic, value); 00202 myItems.push_back(i); 00203 } 00204 00205 00206 void 00207 GUIParameterTableWindow::mkItem(const char* name, bool dynamic, 00208 unsigned value) { 00209 GUIParameterTableItemInterface* i = new GUIParameterTableItem<unsigned>(myTable, myCurrentPos++, name, dynamic, value); 00210 myItems.push_back(i); 00211 } 00212 00213 00214 #ifndef HAVE_SUBSECOND_TIMESTEPS 00215 void 00216 GUIParameterTableWindow::mkItem(const char* name, bool dynamic, 00217 SUMOTime value) { 00218 GUIParameterTableItemInterface* i = new GUIParameterTableItem<SUMOTime>(myTable, myCurrentPos++, name, dynamic, value); 00219 myItems.push_back(i); 00220 } 00221 #endif 00222 00223 00224 void 00225 GUIParameterTableWindow::updateTable() { 00226 myLock.lock(); 00227 if (myObject == 0) { 00228 myLock.unlock(); 00229 return; 00230 } 00231 for (std::vector<GUIParameterTableItemInterface*>::iterator i = myItems.begin(); i != myItems.end(); i++) { 00232 (*i)->update(); 00233 } 00234 myLock.unlock(); 00235 } 00236 00237 00238 void 00239 GUIParameterTableWindow::closeBuilding() { 00240 myApplication->addChild(this, true); 00241 create(); 00242 show(); 00243 } 00244 00245 00246 00247 /****************************************************************************/ 00248