SUMO - Simulation of Urban MObility
GUIParameterTableWindow.cpp
Go to the documentation of this file.
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 
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Friends Defines