GUIDialog_ViewSettings.cpp

Go to the documentation of this file.
00001 /****************************************************************************/
00007 // The dialog to change the view (gui) settings.
00008 /****************************************************************************/
00009 // SUMO, Simulation of Urban MObility; see http://sumo.sourceforge.net/
00010 // Copyright 2001-2010 DLR (http://www.dlr.de/) and contributors
00011 /****************************************************************************/
00012 //
00013 //   This program is free software; you can redistribute it and/or modify
00014 //   it under the terms of the GNU General Public License as published by
00015 //   the Free Software Foundation; either version 2 of the License, or
00016 //   (at your option) any later version.
00017 //
00018 /****************************************************************************/
00019 
00020 
00021 // ===========================================================================
00022 // included modules
00023 // ===========================================================================
00024 #ifdef _MSC_VER
00025 #include <windows_config.h>
00026 #else
00027 #include <config.h>
00028 #endif
00029 
00030 #include <fstream>
00031 #include "GUIDialog_ViewSettings.h"
00032 #include <utils/gui/windows/GUIAppEnum.h>
00033 #include <gui/GUIGlobals.h>
00034 #include <utils/gui/images/GUIImageGlobals.h>
00035 #include <utils/gui/windows/GUISUMOAbstractView.h>
00036 #include <utils/foxtools/MFXUtils.h>
00037 #include <utils/common/RGBColor.h>
00038 #include <utils/foxtools/MFXAddEditTypedTable.h>
00039 #include <utils/common/ToString.h>
00040 #include <utils/common/StringUtils.h>
00041 #include <utils/common/TplConvert.h>
00042 #include <utils/gui/settings/GUICompleteSchemeStorage.h>
00043 #include <utils/gui/images/GUIIconSubSys.h>
00044 #include <utils/gui/div/GUIIOGlobals.h>
00045 #include <utils/importio/LineReader.h>
00046 #include <utils/iodevices/OutputDevice.h>
00047 #include <utils/gui/settings/GUISettingsHandler.h>
00048 
00049 #ifdef CHECK_MEMORY_LEAKS
00050 #include <foreign/nvwa/debug_new.h>
00051 #endif // CHECK_MEMORY_LEAKS
00052 
00053 
00054 // ===========================================================================
00055 // FOX callback mapping
00056 // ===========================================================================
00057 FXDEFMAP(GUIDialog_ViewSettings) GUIDialog_ViewSettingsMap[]= {
00058     FXMAPFUNC(SEL_CHANGED,  MID_SIMPLE_VIEW_COLORCHANGE,    GUIDialog_ViewSettings::onCmdColorChange),
00059     FXMAPFUNC(SEL_COMMAND,  MID_SIMPLE_VIEW_COLORCHANGE,    GUIDialog_ViewSettings::onCmdColorChange),
00060     FXMAPFUNC(SEL_COMMAND,  MID_SIMPLE_VIEW_NAMECHANGE,     GUIDialog_ViewSettings::onCmdNameChange),
00061     FXMAPFUNC(SEL_COMMAND,  MID_SETTINGS_OK,                GUIDialog_ViewSettings::onCmdOk),
00062     FXMAPFUNC(SEL_COMMAND,  MID_SETTINGS_CANCEL,            GUIDialog_ViewSettings::onCmdCancel),
00063     FXMAPFUNC(SEL_CHANGED,  MFXAddEditTypedTable::ID_TEXT_CHANGED,  GUIDialog_ViewSettings::onCmdEditTable),
00064 
00065     FXMAPFUNC(SEL_COMMAND,  MID_SIMPLE_VIEW_SAVE,    GUIDialog_ViewSettings::onCmdSaveSetting),
00066     FXMAPFUNC(SEL_UPDATE,  MID_SIMPLE_VIEW_SAVE,    GUIDialog_ViewSettings::onUpdSaveSetting),
00067     FXMAPFUNC(SEL_COMMAND,  MID_SIMPLE_VIEW_DELETE,    GUIDialog_ViewSettings::onCmdDeleteSetting),
00068     FXMAPFUNC(SEL_UPDATE,  MID_SIMPLE_VIEW_DELETE,    GUIDialog_ViewSettings::onUpdDeleteSetting),
00069     FXMAPFUNC(SEL_COMMAND,  MID_SIMPLE_VIEW_EXPORT,    GUIDialog_ViewSettings::onCmdExportSetting),
00070     FXMAPFUNC(SEL_UPDATE,  MID_SIMPLE_VIEW_EXPORT,    GUIDialog_ViewSettings::onUpdExportSetting),
00071     FXMAPFUNC(SEL_COMMAND,  MID_SIMPLE_VIEW_IMPORT,    GUIDialog_ViewSettings::onCmdImportSetting),
00072     FXMAPFUNC(SEL_UPDATE,  MID_SIMPLE_VIEW_IMPORT,    GUIDialog_ViewSettings::onUpdImportSetting),
00073 
00074     FXMAPFUNC(SEL_COMMAND,  MID_SIMPLE_VIEW_LOAD_DECALS,    GUIDialog_ViewSettings::onCmdLoadDecals),
00075     FXMAPFUNC(SEL_COMMAND,  MID_SIMPLE_VIEW_SAVE_DECALS,    GUIDialog_ViewSettings::onCmdSaveDecals),
00076 
00077 };
00078 
00079 
00080 FXIMPLEMENT(GUIDialog_ViewSettings, FXDialogBox, GUIDialog_ViewSettingsMap, ARRAYNUMBER(GUIDialog_ViewSettingsMap))
00081 
00082 
00083 // ===========================================================================
00084 // method definitions
00085 // ===========================================================================
00086 GUIDialog_ViewSettings::GUIDialog_ViewSettings(
00087     GUISUMOAbstractView *parent,
00088     GUIVisualizationSettings *settings,
00089     std::vector<GUISUMOAbstractView::Decal> *decals,
00090     MFXMutex *decalsLock) throw()
00091         : FXDialogBox(parent, "View Settings", DECOR_TITLE|DECOR_BORDER, 0,0,0,0, 0,0,0,0, 0,0),
00092         myParent(parent), mySettings(settings),
00093         myDecals(decals), myDecalsLock(decalsLock), myDecalsTable(0) {
00094     myBackup = (*mySettings);
00095 
00096     FXVerticalFrame *contentFrame =
00097         new FXVerticalFrame(this, LAYOUT_SIDE_TOP|LAYOUT_FILL_X|LAYOUT_FILL_Y,
00098                             0,0,0,0, 0,0,0,0, 2,2);
00099     //
00100     {
00101         FXHorizontalFrame *frame0 =
00102             new FXHorizontalFrame(contentFrame,FRAME_THICK, 0,0,0,0, 0,0,0,0, 2,2);
00103         mySchemeName = new FXComboBox(frame0, 20, this, MID_SIMPLE_VIEW_NAMECHANGE, COMBOBOX_INSERT_LAST|FRAME_SUNKEN|LAYOUT_LEFT|LAYOUT_CENTER_Y|COMBOBOX_STATIC);
00104         const std::vector<std::string> &names = gSchemeStorage.getNames();
00105         for (std::vector<std::string>::const_iterator i=names.begin(); i!=names.end(); ++i) {
00106             size_t index = mySchemeName->appendItem((*i).c_str());
00107             if ((*i) == mySettings->name) {
00108                 mySchemeName->setCurrentItem((FXint) index);
00109             }
00110         }
00111         mySchemeName->setNumVisible(5);
00112 
00113         new FXButton(frame0,"\t\tSave the setting to registry",
00114                      GUIIconSubSys::getIcon(ICON_SAVEDB), this, MID_SIMPLE_VIEW_SAVE,
00115                      ICON_ABOVE_TEXT|BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT);
00116         new FXButton(frame0,"\t\tRemove the setting from registry",
00117                      GUIIconSubSys::getIcon(ICON_REMOVEDB), this, MID_SIMPLE_VIEW_DELETE,
00118                      ICON_ABOVE_TEXT|BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT);
00119         new FXButton(frame0,"\t\tExport setting to file",
00120                      GUIIconSubSys::getIcon(ICON_SAVE), this, MID_SIMPLE_VIEW_EXPORT,
00121                      ICON_ABOVE_TEXT|BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT);
00122         new FXButton(frame0,"\t\tLoad setting from file",
00123                      GUIIconSubSys::getIcon(ICON_OPEN_CONFIG), this, MID_SIMPLE_VIEW_IMPORT,
00124                      ICON_ABOVE_TEXT|BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT);
00125 
00126     }
00127     //
00128     FXTabBook *tabbook =
00129         new FXTabBook(contentFrame,0,0,TABBOOK_LEFTTABS|PACK_UNIFORM_WIDTH|PACK_UNIFORM_HEIGHT|LAYOUT_FILL_X|LAYOUT_FILL_Y|LAYOUT_RIGHT,
00130                       0,0,0,0, 0,0,0,0);
00131     {
00132         // tab for the background
00133         new FXTabItem(tabbook,"Background",NULL,TAB_LEFT_NORMAL, 0,0,0,0, 4,8,4,4);
00134         FXVerticalFrame *frame1 =
00135             new FXVerticalFrame(tabbook,FRAME_THICK|FRAME_RAISED, 0,0,0,0, 0,0,0,0, 2,2);
00136 
00137         FXMatrix *m11 =
00138             new FXMatrix(frame1,2,LAYOUT_FILL_X|LAYOUT_TOP|LAYOUT_LEFT|MATRIX_BY_COLUMNS,
00139                          0,0,0,0, 10,10,10,10, 5,5);
00140         new FXLabel(m11, "Color", 0, LAYOUT_CENTER_Y);
00141         myBackgroundColor = new FXColorWell(m11, convert(settings->backgroundColor),
00142                                             this, MID_SIMPLE_VIEW_COLORCHANGE,
00143                                             LAYOUT_FIX_WIDTH|LAYOUT_CENTER_Y|LAYOUT_SIDE_TOP|FRAME_SUNKEN|FRAME_THICK|ICON_AFTER_TEXT,
00144                                             0, 0, 100, 0,   0, 0, 0, 0);
00145 
00146         new FXHorizontalSeparator(frame1,SEPARATOR_GROOVE|LAYOUT_FILL_X);
00147 
00148         FXVerticalFrame *frame11 =
00149             new FXVerticalFrame(frame1,LAYOUT_FILL_Y, 0,0,0,0, 10,10,10,10, 5,5);
00150         new FXLabel(frame11, "Decals:");
00151         myDecalsFrame = new FXVerticalFrame(frame11);
00152         FXHorizontalFrame *frame111 = new FXHorizontalFrame(frame11, LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_FILL_X|PACK_UNIFORM_WIDTH,0,0,0,0, 10,10,5,5);
00153         new FXButton(frame111,"&Load Decals",NULL,this,MID_SIMPLE_VIEW_LOAD_DECALS,BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_CENTER_X,0,0,0,0, 20,20,4,4);
00154         new FXButton(frame111,"&Save Decals",NULL,this,MID_SIMPLE_VIEW_SAVE_DECALS,BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_CENTER_X,0,0,0,0, 20,20,4,4);
00155 
00156         new FXHorizontalSeparator(frame1,SEPARATOR_GROOVE|LAYOUT_FILL_X);
00157 
00158         FXMatrix *m12 =
00159             new FXMatrix(frame1,2,LAYOUT_FILL_X|LAYOUT_BOTTOM|LAYOUT_LEFT|MATRIX_BY_COLUMNS,
00160                          0,0,0,0, 10,10,10,10, 5,5);
00161         myShowGrid =
00162             new FXCheckButton(m12, "Show grid", this, MID_SIMPLE_VIEW_COLORCHANGE, LAYOUT_CENTER_Y|CHECKBUTTON_NORMAL);
00163         myShowGrid->setCheck(mySettings->showGrid);
00164         new FXLabel(m12, "");
00165         FXMatrix *m121 =
00166             new FXMatrix(m12,2,LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_BOTTOM|LAYOUT_LEFT|MATRIX_BY_COLUMNS,
00167                          0,0,0,0, 10,10,0,0, 5,5);
00168         new FXLabel(m121, "x-spacing", 0, LAYOUT_CENTER_Y);
00169         myGridXSizeDialer =
00170             new FXRealSpinDial(m121, 10, this, MID_SIMPLE_VIEW_COLORCHANGE,
00171                                LAYOUT_CENTER_Y|LAYOUT_TOP|FRAME_SUNKEN|FRAME_THICK);
00172         myGridXSizeDialer->setRange(1, 10000);
00173         myGridXSizeDialer->setValue(mySettings->gridXSize);
00174         FXMatrix *m122 =
00175             new FXMatrix(m12,2,LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_BOTTOM|LAYOUT_LEFT|MATRIX_BY_COLUMNS,
00176                          0,0,0,0, 10,10,0,0, 5,5);
00177         new FXLabel(m122, "y-spacing", 0, LAYOUT_CENTER_Y);
00178         myGridYSizeDialer =
00179             new FXRealSpinDial(m122, 10, this, MID_SIMPLE_VIEW_COLORCHANGE,
00180                                LAYOUT_CENTER_Y|LAYOUT_TOP|FRAME_SUNKEN|FRAME_THICK);
00181         myGridYSizeDialer->setRange(1, 10000);
00182         myGridYSizeDialer->setValue(mySettings->gridXSize);
00183     }
00184     {
00185         // tab for the streets
00186         new FXTabItem(tabbook,"Streets",NULL,TAB_LEFT_NORMAL, 0,0,0,0, 4,8,4,4);
00187 
00188         FXVerticalFrame *frame2 =
00189             new FXVerticalFrame(tabbook,FRAME_THICK|FRAME_RAISED, 0,0,0,0, 0,0,0,0, 2,2);
00190         FXMatrix *m21 =
00191             new FXMatrix(frame2,3,LAYOUT_FILL_X|LAYOUT_TOP|LAYOUT_LEFT|MATRIX_BY_COLUMNS,
00192                          0,0,0,0, 10,10,10,2, 5,5);
00193         new FXLabel(m21, "Color by", 0, LAYOUT_CENTER_Y);
00194         myLaneEdgeColorMode = new FXComboBox(m21, 30, this, MID_SIMPLE_VIEW_COLORCHANGE, FRAME_SUNKEN|LAYOUT_LEFT|LAYOUT_TOP|COMBOBOX_STATIC);
00195         myLaneEdgeColorMode->setNumVisible(10);
00196         myLaneColorInterpolation = new FXCheckButton(m21, "Interpolate", this, MID_SIMPLE_VIEW_COLORCHANGE, LAYOUT_CENTER_Y|CHECKBUTTON_NORMAL);
00197         FXScrollWindow *genScroll = new FXScrollWindow(frame2, LAYOUT_FILL_X|LAYOUT_SIDE_TOP|FRAME_RAISED|FRAME_THICK|LAYOUT_FIX_HEIGHT, 0,0,0,80);
00198         myLaneColorSettingFrame =
00199             new FXVerticalFrame(genScroll, LAYOUT_FILL_X|LAYOUT_FILL_Y,  0,0,0,0, 10,10,2,8, 5,2);
00200 //we should insert a FXScrollWindow around the frame2
00201 #ifdef HAVE_MESOSIM
00202         if (MSGlobals::gUseMesoSim) {
00203             mySettings->edgeColorer.fill(*myLaneEdgeColorMode);
00204         } else {
00205 #endif
00206             mySettings->laneColorer.fill(*myLaneEdgeColorMode);
00207 #ifdef HAVE_MESOSIM
00208         }
00209 #endif
00210 
00211         new FXHorizontalSeparator(frame2,SEPARATOR_GROOVE|LAYOUT_FILL_X);
00212         FXMatrix *m22 =
00213             new FXMatrix(frame2,2,LAYOUT_FILL_X|LAYOUT_BOTTOM|LAYOUT_LEFT|MATRIX_BY_COLUMNS,
00214                          0,0,0,0, 10,10,10,10, 5,5);
00215         myShowLaneBorders = new FXCheckButton(m22, "Show lane borders", this, MID_SIMPLE_VIEW_COLORCHANGE);
00216         myShowLaneBorders->setCheck(mySettings->laneShowBorders);
00217         new FXLabel(m22, " ", 0, LAYOUT_CENTER_Y);
00218         myShowLaneDecals = new FXCheckButton(m22, "Show link decals", this, MID_SIMPLE_VIEW_COLORCHANGE);
00219         myShowLaneDecals->setCheck(mySettings->showLinkDecals);
00220         new FXLabel(m22, " ", 0, LAYOUT_CENTER_Y);
00221         myShowRails = new FXCheckButton(m22, "Show rails", this, MID_SIMPLE_VIEW_COLORCHANGE);
00222         myShowRails->setCheck(mySettings->showRails);
00223         new FXLabel(m22, " ", 0, LAYOUT_CENTER_Y);
00224         myHideMacroConnectors = new FXCheckButton(m22, "Hide macro connectors", this, MID_SIMPLE_VIEW_COLORCHANGE);
00225         myHideMacroConnectors->setCheck(mySettings->hideConnectors);
00226         new FXLabel(m22, " ", 0, LAYOUT_CENTER_Y);
00227         myShowEdgeName = new FXCheckButton(m22, "Show edge name", this, MID_SIMPLE_VIEW_COLORCHANGE, LAYOUT_CENTER_Y|CHECKBUTTON_NORMAL);
00228         myShowEdgeName->setCheck(mySettings->drawEdgeName);
00229         new FXLabel(m22, "");
00230         FXMatrix *m221 =
00231             new FXMatrix(m22,2,LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_BOTTOM|LAYOUT_LEFT|MATRIX_BY_COLUMNS,
00232                          0,0,0,0, 10,10,0,0, 5,5);
00233         new FXLabel(m221, "Size", 0, LAYOUT_CENTER_Y);
00234         myEdgeNameSizeDialer =
00235             new FXRealSpinDial(m221, 10, this, MID_SIMPLE_VIEW_COLORCHANGE,
00236                                LAYOUT_CENTER_Y|LAYOUT_TOP|FRAME_SUNKEN|FRAME_THICK);
00237         myEdgeNameSizeDialer->setRange(10, 1000);
00238         myEdgeNameSizeDialer->setValue(mySettings->edgeNameSize);
00239         FXMatrix *m222 =
00240             new FXMatrix(m22,2,LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_BOTTOM|LAYOUT_LEFT|MATRIX_BY_COLUMNS,
00241                          0,0,0,0, 10,10,0,0, 5,5);
00242         new FXLabel(m222, "Color", 0, LAYOUT_CENTER_Y);
00243         myEdgeNameColor = new FXColorWell(m222, convert(settings->edgeNameColor),
00244                                           this, MID_SIMPLE_VIEW_COLORCHANGE,
00245                                           LAYOUT_FIX_WIDTH|LAYOUT_CENTER_Y|LAYOUT_SIDE_TOP|FRAME_SUNKEN|FRAME_THICK|ICON_AFTER_TEXT,
00246                                           0, 0, 100, 0,   0, 0, 0, 0);
00247         myShowInternalEdgeName = new FXCheckButton(m22, "Show internal edge name", this, MID_SIMPLE_VIEW_COLORCHANGE, LAYOUT_CENTER_Y|CHECKBUTTON_NORMAL);
00248         myShowInternalEdgeName->setCheck(mySettings->drawInternalEdgeName);
00249         new FXLabel(m22, "");
00250         FXMatrix *m223 =
00251             new FXMatrix(m22,2,LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_BOTTOM|LAYOUT_LEFT|MATRIX_BY_COLUMNS,
00252                          0,0,0,0, 10,10,0,0, 5,5);
00253         new FXLabel(m223, "Size", 0, LAYOUT_CENTER_Y);
00254         myInternalEdgeNameSizeDialer =
00255             new FXRealSpinDial(m223, 10, this, MID_SIMPLE_VIEW_COLORCHANGE,
00256                                LAYOUT_CENTER_Y|LAYOUT_TOP|FRAME_SUNKEN|FRAME_THICK);
00257         myInternalEdgeNameSizeDialer->setRange(10, 1000);
00258         myInternalEdgeNameSizeDialer->setValue(mySettings->internalEdgeNameSize);
00259         FXMatrix *m224 =
00260             new FXMatrix(m22,2,LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_BOTTOM|LAYOUT_LEFT|MATRIX_BY_COLUMNS,
00261                          0,0,0,0, 10,10,0,0, 5,5);
00262         new FXLabel(m224, "Color", 0, LAYOUT_CENTER_Y);
00263         myInternalEdgeNameColor = new FXColorWell(m224, convert(settings->internalEdgeNameColor),
00264                 this, MID_SIMPLE_VIEW_COLORCHANGE,
00265                 LAYOUT_FIX_WIDTH|LAYOUT_CENTER_Y|LAYOUT_SIDE_TOP|FRAME_SUNKEN|FRAME_THICK|ICON_AFTER_TEXT,
00266                 0, 0, 100, 0,   0, 0, 0, 0);
00267     }
00268     {
00269         new FXTabItem(tabbook,"Vehicles",NULL,TAB_LEFT_NORMAL, 0,0,0,0, 4,8,4,4);
00270         FXVerticalFrame *frame3 =
00271             new FXVerticalFrame(tabbook,FRAME_THICK|FRAME_RAISED, 0,0,0,0, 0,0,0,0, 2,2);
00272 
00273         FXMatrix *m31 =
00274             new FXMatrix(frame3,2,LAYOUT_FILL_X|LAYOUT_TOP|LAYOUT_LEFT|MATRIX_BY_COLUMNS,
00275                          0,0,0,0, 10,10,10,2, 5,5);
00276         new FXLabel(m31, "Show As", 0, LAYOUT_CENTER_Y);
00277         myVehicleShapeDetail = new FXComboBox(m31, 20, this, MID_SIMPLE_VIEW_COLORCHANGE, FRAME_SUNKEN|LAYOUT_LEFT|LAYOUT_TOP|COMBOBOX_STATIC);
00278         myVehicleShapeDetail->appendItem("'triangles'");
00279         myVehicleShapeDetail->appendItem("'boxes'");
00280         myVehicleShapeDetail->appendItem("'simple shapes'");
00281         myVehicleShapeDetail->setNumVisible(3);
00282         myVehicleShapeDetail->setCurrentItem(settings->vehicleQuality);
00283 
00284         new FXHorizontalSeparator(frame3,SEPARATOR_GROOVE|LAYOUT_FILL_X);
00285 
00286         FXMatrix *m32 =
00287             new FXMatrix(frame3,3,LAYOUT_FILL_X|LAYOUT_TOP|LAYOUT_LEFT|MATRIX_BY_COLUMNS,
00288                          0,0,0,0, 10,10,10,2, 5,5);
00289         new FXLabel(m32, "Color by", 0, LAYOUT_CENTER_Y);
00290         myVehicleColorMode = new FXComboBox(m32, 20, this, MID_SIMPLE_VIEW_COLORCHANGE, FRAME_SUNKEN|LAYOUT_LEFT|LAYOUT_TOP|COMBOBOX_STATIC);
00291         mySettings->vehicleColorer.fill(*myVehicleColorMode);
00292         myVehicleColorMode->setNumVisible(10);
00293         myVehicleColorInterpolation = new FXCheckButton(m32, "Interpolate", this, MID_SIMPLE_VIEW_COLORCHANGE, LAYOUT_CENTER_Y|CHECKBUTTON_NORMAL);
00294 
00295         FXScrollWindow *genScroll = new FXScrollWindow(frame3, LAYOUT_FILL_X|LAYOUT_SIDE_TOP|FRAME_RAISED|FRAME_THICK|LAYOUT_FIX_HEIGHT, 0,0,0,80);
00296         myVehicleColorSettingFrame =
00297             new FXVerticalFrame(genScroll, LAYOUT_FILL_X|LAYOUT_FILL_Y,  0,0,0,0, 10,10,2,8, 5,2);
00298 
00299         new FXHorizontalSeparator(frame3,SEPARATOR_GROOVE|LAYOUT_FILL_X);
00300 
00301         FXMatrix *m33 =
00302             new FXMatrix(frame3,2,LAYOUT_FILL_X|LAYOUT_TOP|LAYOUT_LEFT|MATRIX_BY_COLUMNS,
00303                          0,0,0,0, 10,10,10,10, 5,5);
00304         myShowBlinker = new FXCheckButton(m33, "Show blinker", this, MID_SIMPLE_VIEW_COLORCHANGE);
00305         myShowBlinker->setCheck(mySettings->showBlinker);
00306         new FXLabel(m33, " ", 0, LAYOUT_CENTER_Y);
00307         /*
00308         myShowLaneChangePreference = new FXCheckButton(m33, "Show lane change preference", this, MID_SIMPLE_VIEW_COLORCHANGE);
00309         myShowLaneChangePreference->setCheck(mySettings->drawLaneChangePreference);
00310         new FXLabel(m33, " ", 0, LAYOUT_CENTER_Y);
00311         */
00312         myShowVehicleName = new FXCheckButton(m33, "Show vehicle name", this, MID_SIMPLE_VIEW_COLORCHANGE, LAYOUT_CENTER_Y|CHECKBUTTON_NORMAL);
00313         myShowVehicleName->setCheck(mySettings->drawVehicleName);
00314         new FXLabel(m33, "");
00315         FXMatrix *m331 =
00316             new FXMatrix(m33,2,LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_BOTTOM|LAYOUT_LEFT|MATRIX_BY_COLUMNS,
00317                          0,0,0,0, 10,10,0,0, 5,5);
00318         new FXLabel(m331, "Size", 0, LAYOUT_CENTER_Y);
00319         myVehicleNameSizeDialer =
00320             new FXRealSpinDial(m331, 10, this, MID_SIMPLE_VIEW_COLORCHANGE,
00321                                LAYOUT_CENTER_Y|CHECKBUTTON_NORMAL|FRAME_SUNKEN|FRAME_THICK);
00322         myVehicleNameSizeDialer->setRange(10, 1000);
00323         myVehicleNameSizeDialer->setValue(mySettings->vehicleNameSize);
00324         FXMatrix *m332 =
00325             new FXMatrix(m33,2,LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_BOTTOM|LAYOUT_LEFT|MATRIX_BY_COLUMNS,
00326                          0,0,0,0, 10,10,0,0, 5,5);
00327         new FXLabel(m332, "Color", 0, LAYOUT_CENTER_Y);
00328         myVehicleNameColor = new FXColorWell(m332, convert(settings->vehicleNameColor),
00329                                              this, MID_SIMPLE_VIEW_COLORCHANGE,
00330                                              LAYOUT_FIX_WIDTH|LAYOUT_CENTER_Y|LAYOUT_SIDE_TOP|FRAME_SUNKEN|FRAME_THICK|ICON_AFTER_TEXT,
00331                                              0, 0, 100, 0,   0, 0, 0, 0);
00332         /*
00333         FXCheckButton *tmpc = new FXCheckButton(m33, "Show braking lights", 0 ,0);
00334         tmpc->disable();
00335         tmpc = new FXCheckButton(m33, "Show needed headway", 0 ,0);
00336         tmpc->disable();
00337         */
00338 
00339         new FXHorizontalSeparator(frame3,SEPARATOR_GROOVE|LAYOUT_FILL_X);
00340 
00341         FXMatrix *m34 =
00342             new FXMatrix(frame3,2,LAYOUT_FILL_X|LAYOUT_BOTTOM|LAYOUT_LEFT|MATRIX_BY_COLUMNS,
00343                          0,0,0,0, 10,10,10,10, 5,5);
00344         FXMatrix *m341 =
00345             new FXMatrix(m34,2,LAYOUT_FILL_X|LAYOUT_BOTTOM|LAYOUT_LEFT|MATRIX_BY_COLUMNS,
00346                          0,0,0,0, 10,10,0,0, 5,5);
00347         new FXLabel(m341, "Minimum size", 0, LAYOUT_CENTER_Y);
00348         myVehicleMinSizeDialer =
00349             new FXRealSpinDial(m341, 10, this, MID_SIMPLE_VIEW_COLORCHANGE,
00350                                LAYOUT_TOP|FRAME_SUNKEN|FRAME_THICK);
00351         myVehicleMinSizeDialer->setValue(mySettings->minVehicleSize);
00352         FXMatrix *m342 =
00353             new FXMatrix(m34,2,LAYOUT_FILL_X|LAYOUT_BOTTOM|LAYOUT_LEFT|MATRIX_BY_COLUMNS,
00354                          0,0,0,0, 10,10,0,0, 5,5);
00355         new FXLabel(m342, "Exaggerate by", 0, LAYOUT_CENTER_Y);
00356         myVehicleUpscaleDialer =
00357             new FXRealSpinDial(m342, 10, this, MID_SIMPLE_VIEW_COLORCHANGE,
00358                                LAYOUT_TOP|FRAME_SUNKEN|FRAME_THICK);
00359         myVehicleUpscaleDialer->setRange(1, 100);
00360         myVehicleUpscaleDialer->setValue(mySettings->vehicleExaggeration);
00361     } {
00362         new FXTabItem(tabbook,"Nodes",NULL,TAB_LEFT_NORMAL, 0,0,0,0, 4,8,4,4);
00363         FXVerticalFrame *frame4 =
00364             new FXVerticalFrame(tabbook,FRAME_THICK|FRAME_RAISED, 0,0,0,0, 0,0,0,0, 2,2);
00365 
00366         FXMatrix *m33 =
00367             new FXMatrix(frame4,2,LAYOUT_FILL_X|LAYOUT_TOP|LAYOUT_LEFT|MATRIX_BY_COLUMNS,
00368                          0,0,0,0, 10,10,10,10, 5,5);
00369         myShowTLIndex = new FXCheckButton(m33, "Show link tls index", this, MID_SIMPLE_VIEW_COLORCHANGE);
00370         myShowTLIndex->setCheck(mySettings->drawLinkTLIndex);
00371         new FXLabel(m33, " ", 0, LAYOUT_CENTER_Y);
00372         myShowJunctionIndex = new FXCheckButton(m33, "Show link junction index", this, MID_SIMPLE_VIEW_COLORCHANGE);
00373         myShowJunctionIndex->setCheck(mySettings->drawLinkJunctionIndex);
00374         new FXLabel(m33, " ", 0, LAYOUT_CENTER_Y);
00375         myShowLane2Lane = new FXCheckButton(m33, "Show lane to lane connections", this, MID_SIMPLE_VIEW_COLORCHANGE);
00376         myShowLane2Lane->setCheck(mySettings->showLane2Lane);
00377         new FXLabel(m33, " ", 0, LAYOUT_CENTER_Y);
00378 
00379         myShowJunctionName = new FXCheckButton(m33, "Show junction name", this, MID_SIMPLE_VIEW_COLORCHANGE, LAYOUT_CENTER_Y|CHECKBUTTON_NORMAL);
00380         myShowJunctionName->setCheck(mySettings->drawJunctionName);
00381         new FXLabel(m33, "");
00382         FXMatrix *m331 =
00383             new FXMatrix(m33,2,LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_BOTTOM|LAYOUT_LEFT|MATRIX_BY_COLUMNS,
00384                          0,0,0,0, 10,10,0,0, 5,5);
00385         new FXLabel(m331, "Size", 0, LAYOUT_CENTER_Y);
00386         myJunctionNameSizeDialer =
00387             new FXRealSpinDial(m331, 10, this, MID_SIMPLE_VIEW_COLORCHANGE,
00388                                FRAME_SUNKEN|FRAME_THICK|LAYOUT_CENTER_Y);
00389         myJunctionNameSizeDialer->setRange(10, 1000);
00390         myJunctionNameSizeDialer->setValue(mySettings->junctionNameSize);
00391         FXMatrix *m332 =
00392             new FXMatrix(m33,2,LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_BOTTOM|LAYOUT_LEFT|MATRIX_BY_COLUMNS,
00393                          0,0,0,0, 10,10,0,0, 5,5);
00394         new FXLabel(m332, "Color", 0, LAYOUT_CENTER_Y);
00395         myJunctionNameColor = new FXColorWell(m332, convert(settings->junctionNameColor),
00396                                               this, MID_SIMPLE_VIEW_COLORCHANGE,
00397                                               LAYOUT_FIX_WIDTH|LAYOUT_CENTER_Y|LAYOUT_SIDE_TOP|FRAME_SUNKEN|FRAME_THICK|ICON_AFTER_TEXT,
00398                                               0, 0, 100, 0,   0, 0, 0, 0);
00399     } {
00400         new FXTabItem(tabbook,"Detectors/Trigger",NULL,TAB_LEFT_NORMAL, 0,0,0,0, 4,8,4,4);
00401         FXVerticalFrame *frame5 =
00402             new FXVerticalFrame(tabbook,FRAME_THICK|FRAME_RAISED, 0,0,0,0, 0,0,0,0, 2,2);
00403 
00404         FXMatrix *m51 =
00405             new FXMatrix(frame5,2,LAYOUT_FILL_X|LAYOUT_TOP|LAYOUT_LEFT|MATRIX_BY_COLUMNS,
00406                          0,0,0,0, 10,10,10,10, 5,5);
00407         myShowAddName = new FXCheckButton(m51, "Show detector name", this, MID_SIMPLE_VIEW_COLORCHANGE);
00408         myShowAddName->setCheck(mySettings->drawAddName);
00409         new FXLabel(m51, "");
00410         FXMatrix *m511 =
00411             new FXMatrix(m51,2,LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_BOTTOM|LAYOUT_LEFT|MATRIX_BY_COLUMNS,
00412                          0,0,0,0, 10,10,0,0, 5,5);
00413         new FXLabel(m511, "Size", 0, LAYOUT_CENTER_Y);
00414         myAddNameSizeDialer =
00415             new FXRealSpinDial(m511, 10, this, MID_SIMPLE_VIEW_COLORCHANGE,
00416                                FRAME_SUNKEN|FRAME_THICK|LAYOUT_CENTER_Y);
00417         myAddNameSizeDialer->setRange(10, 1000);
00418         myAddNameSizeDialer->setValue(mySettings->addNameSize);
00419         FXMatrix *m512 =
00420             new FXMatrix(m51,2,LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_BOTTOM|LAYOUT_LEFT|MATRIX_BY_COLUMNS,
00421                          0,0,0,0, 10,10,0,0, 5,5);
00422         new FXLabel(m512, "");
00423         new FXLabel(m512, "");
00424 
00425         new FXHorizontalSeparator(frame5 ,SEPARATOR_GROOVE|LAYOUT_FILL_X);
00426 
00427         FXMatrix *m52 =
00428             new FXMatrix(frame5,2,LAYOUT_FILL_X|LAYOUT_TOP|LAYOUT_LEFT|MATRIX_BY_COLUMNS,
00429                          0,0,0,0, 10,10,10,10, 5,5);
00430         FXMatrix *m521 =
00431             new FXMatrix(m52,2,LAYOUT_FILL_X|LAYOUT_TOP|LAYOUT_LEFT|MATRIX_BY_COLUMNS,
00432                          0,0,0,0, 10,10,0,0, 5,5);
00433         new FXLabel(m521, "Minimum size", 0, LAYOUT_CENTER_Y);
00434         myDetectorMinSizeDialer =
00435             new FXRealSpinDial(m521, 10, this, MID_SIMPLE_VIEW_COLORCHANGE,
00436                                LAYOUT_TOP|FRAME_SUNKEN|FRAME_THICK);
00437         FXMatrix *m522 =
00438             new FXMatrix(m52,2,LAYOUT_FILL_X|LAYOUT_TOP|LAYOUT_LEFT|MATRIX_BY_COLUMNS,
00439                          0,0,0,0, 10,10,0,0, 5,5);
00440         myDetectorMinSizeDialer->setValue(mySettings->minAddSize);
00441         new FXLabel(m522, "Exaggerate by", 0, LAYOUT_CENTER_Y);
00442         myDetectorUpscaleDialer =
00443             new FXRealSpinDial(m522, 10, this, MID_SIMPLE_VIEW_COLORCHANGE,
00444                                LAYOUT_TOP|FRAME_SUNKEN|FRAME_THICK);
00445         myDetectorUpscaleDialer->setRange(1, 100);
00446         myDetectorUpscaleDialer->setValue(mySettings->addExaggeration);
00447 
00448 
00449         /*
00450         new FXLabel(m522, "Color", 0, LAYOUT_CENTER_Y);
00451         myDetectorNameColor = new FXColorWell(m522, convert(settings->addNameColor),
00452                             this, MID_SIMPLE_VIEW_COLORCHANGE,
00453                             LAYOUT_FIX_WIDTH|LAYOUT_CENTER_Y|LAYOUT_SIDE_TOP|FRAME_SUNKEN|FRAME_THICK|ICON_AFTER_TEXT,
00454                             0, 0, 100, 0,   0, 0, 0, 0);
00455                             */
00456     } {
00457         new FXTabItem(tabbook,"POIs",NULL,TAB_LEFT_NORMAL, 0,0,0,0, 4,8,4,4);
00458         FXVerticalFrame *frame6 =
00459             new FXVerticalFrame(tabbook,FRAME_THICK|FRAME_RAISED, 0,0,0,0, 0,0,0,0, 2,2);
00460 
00461         FXMatrix *m61 =
00462             new FXMatrix(frame6,2,LAYOUT_FILL_X|LAYOUT_TOP|LAYOUT_LEFT|MATRIX_BY_COLUMNS,
00463                          0,0,0,0, 10,10,10,10, 5,5);
00464         myShowPOIName = new FXCheckButton(m61, "Show poi name", this, MID_SIMPLE_VIEW_COLORCHANGE, LAYOUT_CENTER_Y|CHECKBUTTON_NORMAL);
00465         myShowPOIName->setCheck(mySettings->drawPOIName);
00466         new FXLabel(m61, "");
00467         FXMatrix *m611 =
00468             new FXMatrix(m61,2,LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_BOTTOM|LAYOUT_LEFT|MATRIX_BY_COLUMNS,
00469                          0,0,0,0, 10,10,0,0, 5,5);
00470         new FXLabel(m611, "Size", 0, LAYOUT_CENTER_Y);
00471         myPOINameSizeDialer =
00472             new FXRealSpinDial(m611, 10, this, MID_SIMPLE_VIEW_COLORCHANGE,
00473                                LAYOUT_TOP|FRAME_SUNKEN|FRAME_THICK);
00474         myPOINameSizeDialer->setRange(10, 1000);
00475         myPOINameSizeDialer->setValue(mySettings->poiNameSize);
00476         FXMatrix *m612 =
00477             new FXMatrix(m61,2,LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_BOTTOM|LAYOUT_LEFT|MATRIX_BY_COLUMNS,
00478                          0,0,0,0, 10,10,0,0, 5,5);
00479         new FXLabel(m612, "Color", 0, LAYOUT_CENTER_Y);
00480         myPOINameColor = new FXColorWell(m612, convert(settings->poiNameColor),
00481                                          this, MID_SIMPLE_VIEW_COLORCHANGE,
00482                                          LAYOUT_FIX_WIDTH|LAYOUT_CENTER_Y|LAYOUT_SIDE_TOP|FRAME_SUNKEN|FRAME_THICK|ICON_AFTER_TEXT,
00483                                          0, 0, 100, 0,   0, 0, 0, 0);
00484 
00485         new FXHorizontalSeparator(frame6 ,SEPARATOR_GROOVE|LAYOUT_FILL_X);
00486 
00487         FXMatrix *m62 =
00488             new FXMatrix(frame6,2,LAYOUT_FILL_X|LAYOUT_TOP|LAYOUT_LEFT|MATRIX_BY_COLUMNS,
00489                          0,0,0,0, 10,10,10,10, 5,5);
00490         FXMatrix *m621 =
00491             new FXMatrix(m62,2,LAYOUT_FILL_X|LAYOUT_TOP|LAYOUT_LEFT|MATRIX_BY_COLUMNS,
00492                          0,0,0,0, 10,10,0,0, 5,5);
00493         new FXLabel(m621, "Minimum size to show", 0, LAYOUT_CENTER_Y);
00494         myPOIMinSizeDialer =
00495             new FXRealSpinDial(m621, 10, this, MID_SIMPLE_VIEW_COLORCHANGE,
00496                                LAYOUT_TOP|FRAME_SUNKEN|FRAME_THICK);
00497         FXMatrix *m622 =
00498             new FXMatrix(m62,2,LAYOUT_FILL_X|LAYOUT_TOP|LAYOUT_LEFT|MATRIX_BY_COLUMNS,
00499                          0,0,0,0, 10,10,0,0, 5,5);
00500         myPOIMinSizeDialer->setValue(mySettings->minPOISize);
00501         new FXLabel(m622, "Exaggerate by", 0, LAYOUT_CENTER_Y);
00502         myPOIUpscaleDialer =
00503             new FXRealSpinDial(m622, 10, this, MID_SIMPLE_VIEW_COLORCHANGE,
00504                                LAYOUT_TOP|FRAME_SUNKEN|FRAME_THICK);
00505         myPOIUpscaleDialer->setRange(1, 1000);
00506         myPOIUpscaleDialer->setValue(mySettings->addExaggeration);
00507 
00508 
00509     } {
00510         new FXTabItem(tabbook,"Legend",NULL,TAB_LEFT_NORMAL, 0,0,0,0, 4,8,4,4);
00511         FXVerticalFrame *frame7 =
00512             new FXVerticalFrame(tabbook,FRAME_THICK|FRAME_RAISED, 0,0,0,0, 0,0,0,0, 2,2);
00513 
00514         FXMatrix *m72 =
00515             new FXMatrix(frame7,2,LAYOUT_FILL_X|LAYOUT_TOP|LAYOUT_LEFT|MATRIX_BY_COLUMNS,
00516                          0,0,0,0, 10,10,10,10, 5,5);
00517         myShowSizeLegend = new FXCheckButton(m72, "Show Size Legend", this, MID_SIMPLE_VIEW_COLORCHANGE);
00518         myShowSizeLegend->setCheck(mySettings->showSizeLegend);
00519         new FXLabel(m72, "");
00520     } {
00521         new FXTabItem(tabbook,"openGL",NULL,TAB_LEFT_NORMAL, 0,0,0,0, 4,8,4,4);
00522         FXVerticalFrame *frame8 =
00523             new FXVerticalFrame(tabbook,FRAME_THICK|FRAME_RAISED, 0,0,0,0, 0,0,0,0, 2,2);
00524 
00525         FXMatrix *m82 =
00526             new FXMatrix(frame8,1,LAYOUT_FILL_X|LAYOUT_TOP|LAYOUT_LEFT|MATRIX_BY_COLUMNS,
00527                          0,0,0,0, 10,10,10,10, 5,5);
00528         myAntialiase = new FXCheckButton(m82, "Antialiase", this, MID_SIMPLE_VIEW_COLORCHANGE);
00529         myAntialiase->setCheck(mySettings->antialiase);
00530         myDither = new FXCheckButton(m82, "Dither", this, MID_SIMPLE_VIEW_COLORCHANGE);
00531         myDither->setCheck(mySettings->dither);
00532     }
00533     FXHorizontalFrame *f2 = new FXHorizontalFrame(contentFrame, LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_FILL_X|PACK_UNIFORM_WIDTH,0,0,0,0, 10,10,5,5);
00534     FXButton *initial=new FXButton(f2,"&Use",NULL,this,MID_SETTINGS_OK,BUTTON_INITIAL|BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_CENTER_X,0,0,0,0, 30,30,4,4);
00535     new FXButton(f2,"&Discard",NULL,this,MID_SETTINGS_CANCEL,BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_CENTER_X,0,0,0,0, 30,30,4,4);
00536     initial->setFocus();
00537 
00538     rebuildColorMatrices(false);
00539     setIcon(GUIIconSubSys::getIcon(ICON_EMPTY));
00540 }
00541 
00542 
00543 GUIDialog_ViewSettings::~GUIDialog_ViewSettings() throw() {
00544     myParent->remove(this);
00545 }
00546 
00547 
00548 void
00549 GUIDialog_ViewSettings::setCurrent(GUIVisualizationSettings *settings) throw() {
00550     mySettings = settings;
00551     myBackup = (*settings);
00552     onCmdNameChange(0, 0, 0);
00553 }
00554 
00555 
00556 long
00557 GUIDialog_ViewSettings::onCmdOk(FXObject*,FXSelector,void*) {
00558     hide();
00559     return 1;
00560 }
00561 
00562 
00563 long
00564 GUIDialog_ViewSettings::onCmdCancel(FXObject*,FXSelector,void*) {
00565     hide();
00566     (*mySettings) = myBackup;
00567     return 1;
00568 }
00569 
00570 
00571 long
00572 GUIDialog_ViewSettings::onCmdNameChange(FXObject*,FXSelector,void*data) {
00573     if (data!=0) {
00574         FXString dataS = (char*) data; // !!!unicode
00575         // check whether this item has been added twice
00576         if (dataS==mySchemeName->getItemText(mySchemeName->getNumItems()-1)) {
00577             for (int i=0; i<mySchemeName->getNumItems()-1; ++i) {
00578                 if (dataS==mySchemeName->getItemText(i)) {
00579                     mySchemeName->removeItem(i);
00580                 }
00581             }
00582         }
00583         myBackup = gSchemeStorage.get(dataS.text());
00584         mySettings = &gSchemeStorage.get(dataS.text());
00585     }
00586     rebuildColorMatrices(true);
00587 
00588     myBackgroundColor->setRGBA(convert(mySettings->backgroundColor));
00589 
00590     myLaneEdgeColorMode->setCurrentItem((FXint) mySettings->getLaneEdgeMode());
00591     myShowLaneBorders->setCheck(mySettings->laneShowBorders);
00592     myShowLaneDecals->setCheck(mySettings->showLinkDecals);
00593     myShowRails->setCheck(mySettings->showRails);
00594     myShowEdgeName->setCheck(mySettings->drawEdgeName);
00595     myEdgeNameSizeDialer->setValue(mySettings->edgeNameSize);
00596     myEdgeNameColor->setRGBA(convert(mySettings->edgeNameColor));
00597     myShowInternalEdgeName->setCheck(mySettings->drawInternalEdgeName);
00598     myInternalEdgeNameSizeDialer->setValue(mySettings->internalEdgeNameSize);
00599     myInternalEdgeNameColor->setRGBA(convert(mySettings->internalEdgeNameColor));
00600     myHideMacroConnectors->setCheck(mySettings->hideConnectors);
00601 
00602     myVehicleColorMode->setCurrentItem((FXint) mySettings->vehicleColorer.getActive());
00603     myVehicleShapeDetail->setCurrentItem(mySettings->vehicleQuality);
00604     myVehicleUpscaleDialer->setValue(mySettings->vehicleExaggeration);
00605     myVehicleMinSizeDialer->setValue(mySettings->minVehicleSize);
00606     myShowBlinker->setCheck(mySettings->showBlinker);
00607     /*
00608     myShowLaneChangePreference->setCheck(mySettings->drawLaneChangePreference);
00609     */
00610     myShowVehicleName->setCheck(mySettings->drawVehicleName);
00611     myVehicleNameSizeDialer->setValue(mySettings->vehicleNameSize);
00612     myVehicleNameColor->setRGBA(convert(mySettings->vehicleNameColor));
00613 
00614     myShowTLIndex->setCheck(mySettings->drawLinkTLIndex);
00615     myShowJunctionIndex->setCheck(mySettings->drawLinkJunctionIndex);
00616     myShowJunctionName->setCheck(mySettings->drawJunctionName);
00617     myJunctionNameSizeDialer->setValue(mySettings->junctionNameSize);
00618     myJunctionNameColor->setRGBA(convert(mySettings->junctionNameColor));
00619 
00620     myDetectorUpscaleDialer->setValue(mySettings->addExaggeration);
00621     myDetectorMinSizeDialer->setValue(mySettings->minAddSize);
00622     myShowAddName->setCheck(mySettings->drawAddName);
00623     myAddNameSizeDialer->setValue(mySettings->addNameSize);
00624     //myDetectorNameColor->setRGBA(convert(mySettings->addNameColor));
00625 
00626     myPOIUpscaleDialer->setValue(mySettings->poiExaggeration);
00627     myPOIMinSizeDialer->setValue(mySettings->minPOISize);
00628     myShowPOIName->setCheck(mySettings->drawPOIName);
00629     myPOINameSizeDialer->setValue(mySettings->poiNameSize);
00630     myPOINameColor->setRGBA(convert(mySettings->poiNameColor));
00631 
00632     myShowLane2Lane->setCheck(mySettings->showLane2Lane);
00633     myAntialiase->setCheck(mySettings->antialiase);
00634     myDither->setCheck(mySettings->dither);
00635     myShowSizeLegend->setCheck(mySettings->showSizeLegend);
00636 
00637     myParent->setColorScheme(mySettings->name);
00638     update();
00639     myParent->update();
00640     return 1;
00641 }
00642 
00643 
00644 long
00645 GUIDialog_ViewSettings::onCmdColorChange(FXObject*sender,FXSelector,void*val) {
00646     GUIVisualizationSettings tmpSettings = *mySettings;
00647     size_t prevLaneMode = mySettings->getLaneEdgeMode();
00648     size_t prevVehicleMode = mySettings->vehicleColorer.getActive();
00649     bool doRebuildColorMatrices = false;
00650 
00651     tmpSettings.name = mySettings->name;
00652     tmpSettings.backgroundColor = convert(myBackgroundColor->getRGBA());
00653     tmpSettings.showGrid = myShowGrid->getCheck()!=0;
00654     tmpSettings.gridXSize = (SUMOReal) myGridXSizeDialer->getValue();
00655     tmpSettings.gridYSize = (SUMOReal) myGridYSizeDialer->getValue();
00656 
00657 #ifdef HAVE_MESOSIM
00658     if (MSGlobals::gUseMesoSim) {
00659         tmpSettings.edgeColorer.setActive(myLaneEdgeColorMode->getCurrentItem());
00660     } else {
00661 #endif
00662         tmpSettings.laneColorer.setActive(myLaneEdgeColorMode->getCurrentItem());
00663 #ifdef HAVE_MESOSIM
00664     }
00665 #endif
00666     tmpSettings.laneShowBorders = myShowLaneBorders->getCheck()!=0;
00667     tmpSettings.showLinkDecals = myShowLaneDecals->getCheck()!=0;
00668     tmpSettings.showRails = myShowRails->getCheck()!=0;
00669     tmpSettings.drawEdgeName = myShowEdgeName->getCheck()!=0;
00670     tmpSettings.edgeNameSize = (SUMOReal) myEdgeNameSizeDialer->getValue();
00671     tmpSettings.edgeNameColor = convert(myEdgeNameColor->getRGBA());
00672     tmpSettings.drawInternalEdgeName = myShowInternalEdgeName->getCheck()!=0;
00673     tmpSettings.internalEdgeNameSize = (SUMOReal) myInternalEdgeNameSizeDialer->getValue();
00674     tmpSettings.internalEdgeNameColor = convert(myInternalEdgeNameColor->getRGBA());
00675     tmpSettings.hideConnectors = myHideMacroConnectors->getCheck()!=0;
00676 
00677     tmpSettings.vehicleColorer.setActive(myVehicleColorMode->getCurrentItem());
00678     tmpSettings.vehicleQuality = myVehicleShapeDetail->getCurrentItem();
00679     tmpSettings.vehicleExaggeration = (SUMOReal) myVehicleUpscaleDialer->getValue();
00680     tmpSettings.minVehicleSize = (SUMOReal) myVehicleMinSizeDialer->getValue();
00681     tmpSettings.showBlinker = myShowBlinker->getCheck()!=0;
00682     /*
00683     tmpSettings.drawLaneChangePreference = myShowLaneChangePreference->getCheck()!=0;
00684     */
00685     tmpSettings.drawVehicleName = myShowVehicleName->getCheck()!=0;
00686     tmpSettings.vehicleNameSize = (SUMOReal) myVehicleNameSizeDialer->getValue();
00687     tmpSettings.vehicleNameColor = convert(myVehicleNameColor->getRGBA());
00688 
00689     tmpSettings.drawLinkTLIndex = myShowTLIndex->getCheck()!=0;
00690     tmpSettings.drawLinkJunctionIndex = myShowJunctionIndex->getCheck()!=0;
00691     tmpSettings.drawJunctionName = myShowJunctionName->getCheck()!=0;
00692     tmpSettings.junctionNameSize = (SUMOReal) myJunctionNameSizeDialer->getValue();
00693     tmpSettings.junctionNameColor = convert(myJunctionNameColor->getRGBA());
00694 
00695     tmpSettings.addExaggeration = (SUMOReal) myDetectorUpscaleDialer->getValue();
00696     tmpSettings.minAddSize = (SUMOReal) myDetectorMinSizeDialer->getValue();
00697     tmpSettings.drawAddName = myShowAddName->getCheck()!=0;
00698     tmpSettings.addNameSize = (SUMOReal) myAddNameSizeDialer->getValue();
00699     //mySettings->addNameColor = convert(myDetectorNameColor->getRGBA());
00700 
00701     tmpSettings.poiExaggeration = (SUMOReal) myPOIUpscaleDialer->getValue();
00702     tmpSettings.minPOISize = (SUMOReal) myPOIMinSizeDialer->getValue();
00703     tmpSettings.drawPOIName = myShowPOIName->getCheck()!=0;
00704     tmpSettings.poiNameSize = (SUMOReal) myPOINameSizeDialer->getValue();
00705     tmpSettings.poiNameColor = convert(myPOINameColor->getRGBA());
00706 
00707     tmpSettings.showLane2Lane = myShowLane2Lane->getCheck()!=0;
00708     tmpSettings.antialiase = myAntialiase->getCheck()!=0;
00709     tmpSettings.dither = myDither->getCheck()!=0;
00710     tmpSettings.showSizeLegend = myShowSizeLegend->getCheck()!=0;
00711 
00712     // lanes
00713     if (tmpSettings.getLaneEdgeMode()==prevLaneMode) {
00714         std::vector<FXColorWell*>::const_iterator colIt = myLaneColors.begin();
00715         std::vector<FXRealSpinDial*>::const_iterator threshIt = myLaneThresholds.begin();
00716         std::vector<FXButton*>::const_iterator buttonIt = myLaneButtons.begin();
00717         GUIColorScheme &scheme = tmpSettings.getLaneEdgeScheme();
00718         size_t pos = 0;
00719         while (colIt != myLaneColors.end()) {
00720             if (scheme.isFixed()) {
00721                 if (sender == *colIt) {
00722                     scheme.setColor(pos, convert((*colIt)->getRGBA()));
00723                 }
00724             } else {
00725                 if (sender == *threshIt) {
00726                     const SUMOReal val = (*threshIt)->getValue();
00727                     double lo, hi;
00728                     if (pos != 0) {
00729                         threshIt--;
00730                         (*threshIt)->getRange(lo, hi);
00731                         (*threshIt)->setRange(lo, val);
00732                         threshIt++;
00733                     }
00734                     threshIt++;
00735                     if (threshIt != myLaneThresholds.end()) {
00736                         (*threshIt)->getRange(lo, hi);
00737                         (*threshIt)->setRange(val, hi);
00738                     }
00739                     scheme.setThreshold(pos, val);
00740                     break;
00741                 }
00742                 if (sender == *colIt) {
00743                     scheme.setColor(pos, convert((*colIt)->getRGBA()));
00744                     break;
00745                 }
00746                 if (sender == *buttonIt) {
00747                     if (pos == 0) {
00748                         scheme.addColor(convert((*colIt)->getRGBA()), (*threshIt)->getValue());
00749                     } else {
00750                         scheme.removeColor(pos);
00751                     }
00752                     doRebuildColorMatrices = true;
00753                     break;
00754                 }
00755                 ++threshIt;
00756                 ++buttonIt;
00757             }
00758             ++colIt;
00759             pos++;
00760         }
00761         if (sender == myLaneColorInterpolation) {
00762             scheme.setInterpolated(myLaneColorInterpolation->getCheck());
00763             doRebuildColorMatrices = true;
00764         }
00765     } else {
00766         doRebuildColorMatrices = true;
00767     }
00768     // vehicles
00769     if (tmpSettings.vehicleColorer.getActive()==prevVehicleMode) {
00770         std::vector<FXColorWell*>::const_iterator colIt = myVehicleColors.begin();
00771         std::vector<FXRealSpinDial*>::const_iterator threshIt = myVehicleThresholds.begin();
00772         std::vector<FXButton*>::const_iterator buttonIt = myVehicleButtons.begin();
00773         GUIColorScheme &scheme = tmpSettings.vehicleColorer.getScheme();
00774         size_t pos = 0;
00775         while (colIt != myVehicleColors.end()) {
00776             if (scheme.isFixed()) {
00777                 if (sender == *colIt) {
00778                     scheme.setColor(pos, convert((*colIt)->getRGBA()));
00779                 }
00780             } else {
00781                 if (sender == *threshIt) {
00782                     const SUMOReal val = (*threshIt)->getValue();
00783                     double lo, hi;
00784                     if (pos != 0) {
00785                         threshIt--;
00786                         (*threshIt)->getRange(lo, hi);
00787                         (*threshIt)->setRange(lo, val);
00788                         threshIt++;
00789                     }
00790                     threshIt++;
00791                     if (threshIt != myVehicleThresholds.end()) {
00792                         (*threshIt)->getRange(lo, hi);
00793                         (*threshIt)->setRange(val, hi);
00794                     }
00795                     scheme.setThreshold(pos, val);
00796                     break;
00797                 }
00798                 if (sender == *colIt) {
00799                     scheme.setColor(pos, convert((*colIt)->getRGBA()));
00800                     break;
00801                 }
00802                 if (sender == *buttonIt) {
00803                     if (pos == 0) {
00804                         scheme.addColor(convert((*colIt)->getRGBA()), (*threshIt)->getValue());
00805                     } else {
00806                         scheme.removeColor(pos);
00807                     }
00808                     doRebuildColorMatrices = true;
00809                     break;
00810                 }
00811                 ++threshIt;
00812                 ++buttonIt;
00813             }
00814             ++colIt;
00815             pos++;
00816         }
00817         if (sender == myVehicleColorInterpolation) {
00818             scheme.setInterpolated(myVehicleColorInterpolation->getCheck());
00819             doRebuildColorMatrices = true;
00820         }
00821     } else {
00822         doRebuildColorMatrices = true;
00823     }
00824 
00825     if (tmpSettings==*mySettings) {
00826         return 1;
00827     }
00828 
00829     if (tmpSettings.name[0]!='*') {
00830         tmpSettings.name = '*' + tmpSettings.name;
00831     }
00832     gSchemeStorage.add(tmpSettings);
00833     int index = mySchemeName->getCurrentItem();
00834     if (index<(int) gSchemeStorage.getNumInitialSettings()) {
00835         index = mySchemeName->appendItem(tmpSettings.name.c_str());
00836         gSchemeStorage.add(tmpSettings);
00837         mySchemeName->setCurrentItem(index);
00838         myParent->getColoringSchemesCombo().appendItem(tmpSettings.name.c_str());
00839         myParent->getColoringSchemesCombo().setCurrentItem(index);
00840         myParent->setColorScheme(tmpSettings.name);
00841     } else {
00842         mySchemeName->setItemText(index, tmpSettings.name.c_str());
00843         myParent->getColoringSchemesCombo().setItemText(index, tmpSettings.name.c_str());
00844         myParent->setColorScheme(tmpSettings.name);
00845     }
00846     mySettings = &gSchemeStorage.get(tmpSettings.name);
00847 
00848     if (doRebuildColorMatrices) {
00849         rebuildColorMatrices(true);
00850     }
00851     myParent->forceRefresh();
00852     getApp()->forceRefresh();
00853     return 1;
00854 }
00855 
00856 
00857 void
00858 GUIDialog_ViewSettings::loadSettings(const std::string &file) throw() {
00859     GUISettingsHandler handler(file);
00860     std::string settingsName = handler.addSettings(myParent);
00861     if (settingsName != "") {
00862         FXint index = mySchemeName->appendItem(settingsName.c_str());
00863         mySchemeName->setCurrentItem(index);
00864         mySettings = &gSchemeStorage.get(settingsName);
00865     }
00866 }
00867 
00868 
00869 void
00870 GUIDialog_ViewSettings::saveDecals(const std::string &file) const throw() {
00871     try {
00872         OutputDevice &dev = OutputDevice::getDevice(file);
00873         dev << "<decals>\n";
00874         std::vector<GUISUMOAbstractView::Decal>::iterator j;
00875         for (j=myDecals->begin(); j!=myDecals->end(); ++j) {
00876             GUISUMOAbstractView::Decal &d = *j;
00877             dev << "    <decal filename=\"" << d.filename
00878             << "\" centerX=\"" << d.centerX
00879             << "\" centerY=\"" << d.centerY
00880             << "\" width=\"" << d.width
00881             << "\" height=\"" << d.height
00882             << "\" rotation=\"" << d.rot
00883             << "\"/>\n";
00884         }
00885         dev << "</decals>\n";
00886         dev.close();
00887     } catch (IOError &e) {
00888         FXMessageBox::error(myParent, MBOX_OK, "Storing failed!", e.what());
00889     }
00890 }
00891 
00892 
00893 void
00894 GUIDialog_ViewSettings::loadDecals(const std::string &file) throw() {
00895     myDecalsLock->lock();
00896     GUISettingsHandler handler(file);
00897     if (handler.hasDecals()) {
00898         (*myDecals) = handler.getDecals();
00899     }
00900     rebuildList();
00901     myParent->update();
00902     myDecalsLock->unlock();
00903 }
00904 
00905 
00906 long
00907 GUIDialog_ViewSettings::onCmdSaveSetting(FXObject*,FXSelector,void*data) {
00908     int index = mySchemeName->getCurrentItem();
00909     if (index<(int) gSchemeStorage.getNumInitialSettings()) {
00910         return 1;
00911     }
00912     // get the name
00913     while (true) {
00914         FXDialogBox dialog(this,"Enter a name",DECOR_TITLE|DECOR_BORDER);
00915         FXVerticalFrame* content=new FXVerticalFrame(&dialog,LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0,10,10,10,10,10,10);
00916         new FXLabel(content,"Please enter an alphanumeric name: ",NULL,LAYOUT_FILL_X|JUSTIFY_LEFT);
00917         FXTextField *text=new FXTextField(content,40,&dialog,FXDialogBox::ID_ACCEPT,TEXTFIELD_ENTER_ONLY|FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_X);
00918         new FXHorizontalSeparator(content,SEPARATOR_GROOVE|LAYOUT_FILL_X);
00919         FXHorizontalFrame* buttons=new FXHorizontalFrame(content,LAYOUT_FILL_X|PACK_UNIFORM_WIDTH,0,0,0,0,0,0,0,0);
00920         new FXButton(buttons,"&OK",NULL,&dialog,FXDialogBox::ID_ACCEPT,BUTTON_INITIAL|BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_RIGHT);
00921         new FXButton(buttons,"&Cancel",NULL,&dialog,FXDialogBox::ID_CANCEL,BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_RIGHT,0,0,0,0,20,20);
00922         dialog.create();
00923         text->setFocus();
00924         if (dialog.execute()) {
00925             std::string name = text->getText().text();
00926             bool isAlphaNum = true;
00927             for (size_t i=0; i<name.length(); ++i) {
00928                 if (name[i]=='_' || (name[i]>='a'&&name[i]<='z') || (name[i]>='A'&&name[i]<='Z') || (name[i]>='0'&&name[i]<='9')) {
00929                     continue;
00930                 }
00931                 isAlphaNum = false;
00932             }
00933             isAlphaNum = isAlphaNum & (name.length()>0);
00934             if (isAlphaNum) {
00935                 GUIVisualizationSettings tmpSettings = *mySettings;
00936                 gSchemeStorage.remove(mySettings->name);
00937                 tmpSettings.name = name;
00938                 gSchemeStorage.add(tmpSettings);
00939                 mySchemeName->setItemText(index, tmpSettings.name.c_str());
00940                 myParent->getColoringSchemesCombo().setItemText(index, tmpSettings.name.c_str());
00941                 myParent->setColorScheme(tmpSettings.name);
00942                 mySettings = &gSchemeStorage.get(name);
00943                 myBackup = *mySettings;
00944                 gSchemeStorage.writeSettings(getApp());
00945                 return 1;
00946             }
00947         } else {
00948             return 1;
00949         }
00950     }
00951     // save
00952     return 1;
00953 }
00954 
00955 
00956 long
00957 GUIDialog_ViewSettings::onUpdSaveSetting(FXObject*sender,FXSelector,void*ptr) {
00958     sender->handle(this,
00959                    mySchemeName->getCurrentItem()<(int) gSchemeStorage.getNumInitialSettings()
00960                    ? FXSEL(SEL_COMMAND,ID_DISABLE) : FXSEL(SEL_COMMAND,ID_ENABLE),
00961                    ptr);
00962     return 1;
00963 }
00964 
00965 
00966 long
00967 GUIDialog_ViewSettings::onCmdDeleteSetting(FXObject*,FXSelector,void*data) {
00968     int index = mySchemeName->getCurrentItem();
00969     if (index<(int) gSchemeStorage.getNumInitialSettings()) {
00970         return 1;
00971     }
00972     std::string name = mySchemeName->getItem(index).text();
00973     gSchemeStorage.remove(name);
00974     mySchemeName->removeItem(index);
00975     onCmdNameChange(0, 0, (void*) mySchemeName->getItem(0).text());
00976     gSchemeStorage.writeSettings(getApp());
00977     return 1;
00978 }
00979 
00980 
00981 long
00982 GUIDialog_ViewSettings::onUpdDeleteSetting(FXObject*sender,FXSelector,void*ptr) {
00983     sender->handle(this,
00984                    mySchemeName->getCurrentItem()<(int) gSchemeStorage.getNumInitialSettings()
00985                    ? FXSEL(SEL_COMMAND,ID_DISABLE) : FXSEL(SEL_COMMAND,ID_ENABLE),
00986                    ptr);
00987     return 1;
00988 }
00989 
00990 
00991 long
00992 GUIDialog_ViewSettings::onCmdExportSetting(FXObject*,FXSelector,void*data) {
00993     FXFileDialog opendialog(this, "Export view settings");
00994     opendialog.setIcon(GUIIconSubSys::getIcon(ICON_EMPTY));
00995     opendialog.setSelectMode(SELECTFILE_ANY);
00996     opendialog.setPatternList("*.xml");
00997     if (gCurrentFolder.length()!=0) {
00998         opendialog.setDirectory(gCurrentFolder);
00999     }
01000     if (!opendialog.execute()||!MFXUtils::userPermitsOverwritingWhenFileExists(this, opendialog.getFilename())) {
01001         return 1;
01002     }
01003     try {
01004         OutputDevice &dev = OutputDevice::getDevice(opendialog.getFilename().text());
01005         mySettings->save(dev);
01006         dev.close();
01007     } catch (IOError &e) {
01008         FXMessageBox::error(this, MBOX_OK, "Storing failed!", e.what());
01009     }
01010     return 1;
01011 }
01012 
01013 
01014 long
01015 GUIDialog_ViewSettings::onUpdExportSetting(FXObject*sender,FXSelector,void*ptr) {
01016     sender->handle(this,
01017                    mySchemeName->getCurrentItem()<(int) gSchemeStorage.getNumInitialSettings()
01018                    ? FXSEL(SEL_COMMAND,ID_DISABLE) : FXSEL(SEL_COMMAND,ID_ENABLE),
01019                    ptr);
01020     return 1;
01021 }
01022 
01023 
01024 long
01025 GUIDialog_ViewSettings::onCmdImportSetting(FXObject*,FXSelector,void*data) {
01026     FXFileDialog opendialog(this, "Import view settings");
01027     opendialog.setIcon(GUIIconSubSys::getIcon(ICON_EMPTY));
01028     opendialog.setSelectMode(SELECTFILE_ANY);
01029     opendialog.setPatternList("*.xml");
01030     if (gCurrentFolder.length()!=0) {
01031         opendialog.setDirectory(gCurrentFolder);
01032     }
01033     if (opendialog.execute()) {
01034         gCurrentFolder = opendialog.getDirectory();
01035         loadSettings(opendialog.getFilename().text());
01036     }
01037     return 1;
01038 }
01039 
01040 
01041 long
01042 GUIDialog_ViewSettings::onCmdLoadDecals(FXObject*,FXSelector,void*data) {
01043     FXFileDialog opendialog(this, "Load Decals");
01044     opendialog.setIcon(GUIIconSubSys::getIcon(ICON_EMPTY));
01045     opendialog.setSelectMode(SELECTFILE_ANY);
01046     opendialog.setPatternList("*.xml");
01047     if (gCurrentFolder.length()!=0) {
01048         opendialog.setDirectory(gCurrentFolder);
01049     }
01050     if (opendialog.execute()) {
01051         gCurrentFolder = opendialog.getDirectory();
01052         loadDecals(opendialog.getFilename().text());
01053     }
01054     return 1;
01055 }
01056 
01057 
01058 long
01059 GUIDialog_ViewSettings::onCmdSaveDecals(FXObject*,FXSelector,void*data) {
01060     FXFileDialog opendialog(this, "Save Decals");
01061     opendialog.setIcon(GUIIconSubSys::getIcon(ICON_EMPTY));
01062     opendialog.setSelectMode(SELECTFILE_ANY);
01063     opendialog.setPatternList("*.xml");
01064     if (gCurrentFolder.length()!=0) {
01065         opendialog.setDirectory(gCurrentFolder);
01066     }
01067     if (!opendialog.execute()||!MFXUtils::userPermitsOverwritingWhenFileExists(this, opendialog.getFilename())) {
01068         return 1;
01069     }
01070     saveDecals(opendialog.getFilename().text());
01071     return 1;
01072 }
01073 
01074 
01075 
01076 
01077 long
01078 GUIDialog_ViewSettings::onUpdImportSetting(FXObject*sender,FXSelector,void*ptr) {
01079     sender->handle(this, FXSEL(SEL_COMMAND,ID_ENABLE), ptr);
01080     return 1;
01081 }
01082 
01083 
01084 RGBColor
01085 GUIDialog_ViewSettings::convert(const FXColor c) const throw() {
01086     return RGBColor(
01087                (SUMOReal) FXREDVAL(c) / (SUMOReal) 255.,
01088                (SUMOReal) FXGREENVAL(c) / (SUMOReal) 255.,
01089                (SUMOReal) FXBLUEVAL(c) / (SUMOReal) 255.);
01090 }
01091 
01092 
01093 FXColor
01094 GUIDialog_ViewSettings::convert(const RGBColor &c) const throw() {
01095     return FXRGB(c.red()*255., c.green()*255., c.blue()*255.);
01096 }
01097 
01098 
01099 void
01100 GUIDialog_ViewSettings::rebuildList() throw() {
01101     myDecalsTable->clearItems();
01102     // set table attributes
01103     myDecalsTable->setTableSize(10, 6);
01104     myDecalsTable->setColumnText(0, "picture file");
01105     myDecalsTable->setColumnText(1, "center x");
01106     myDecalsTable->setColumnText(2, "center y");
01107     myDecalsTable->setColumnText(3, "width");
01108     myDecalsTable->setColumnText(4, "height");
01109     myDecalsTable->setColumnText(5, "rotation");
01110     FXHeader *header = myDecalsTable->getColumnHeader();
01111     header->setHeight(getApp()->getNormalFont()->getFontHeight()+getApp()->getNormalFont()->getFontAscent());
01112     int k;
01113     for (k=0; k<6; k++) {
01114         header->setItemJustify(k, JUSTIFY_CENTER_X|JUSTIFY_TOP);
01115         header->setItemSize(k, 60);
01116     }
01117     header->setItemSize(0, 150);
01118     // insert already known decals information into table
01119     FXint row = 0;
01120     std::vector<GUISUMOAbstractView::Decal>::iterator j;
01121     for (j=myDecals->begin(); j!=myDecals->end(); ++j) {
01122         GUISUMOAbstractView::Decal &d = *j;
01123         myDecalsTable->setItemText(row, 0, d.filename.c_str());
01124         myDecalsTable->setItemText(row, 1, toString<SUMOReal>(d.centerX).c_str());
01125         myDecalsTable->setItemText(row, 2, toString<SUMOReal>(d.centerY).c_str());
01126         myDecalsTable->setItemText(row, 3, toString<SUMOReal>(d.width).c_str());
01127         myDecalsTable->setItemText(row, 4, toString<SUMOReal>(d.height).c_str());
01128         myDecalsTable->setItemText(row, 5, toString<SUMOReal>(d.rot).c_str());
01129         row++;
01130     }
01131     // insert dummy last field
01132     for (k=0; k<6; k++) {
01133         myDecalsTable->setItemText(row, k, " ");
01134     }
01135 }
01136 
01137 
01138 void
01139 GUIDialog_ViewSettings::rebuildColorMatrices(bool doCreate) throw() {
01140     // decals
01141     delete myDecalsTable;
01142     myDecalsTable = new MFXAddEditTypedTable(myDecalsFrame, this, MID_TABLE,
01143             LAYOUT_FILL_Y|LAYOUT_FIX_WIDTH/*|LAYOUT_FIX_HEIGHT*/, 0,0, 470, 0);
01144     myDecalsTable->setVisibleRows(5);
01145     myDecalsTable->setVisibleColumns(6);
01146     myDecalsTable->setTableSize(5,6);
01147     myDecalsTable->setBackColor(FXRGB(255,255,255));
01148     myDecalsTable->getRowHeader()->setWidth(0);
01149     for (int i=1; i<5; ++i) {
01150         myDecalsTable->setCellType(i, CT_REAL);
01151         myDecalsTable->setNumberCellParams(i, -10000000, 10000000, 1, 10, 100, "%.2f");
01152     }
01153     myDecalsTable->setCellType(5, CT_REAL);
01154     myDecalsTable->setNumberCellParams(5, -10000000, 10000000, .1, 1, 10, "%.2f");
01155     rebuildList();
01156     if (doCreate) {
01157         myDecalsTable->create();
01158     }
01159     {
01160         // lane / edge
01161         MFXUtils::deleteChildren(myLaneColorSettingFrame);
01162         FXMatrix *m = new FXMatrix(myLaneColorSettingFrame,3,
01163                                    LAYOUT_FILL_X|MATRIX_BY_COLUMNS,
01164                                    0,0,0,0,10,10,0,0, 5,3);
01165         myLaneColors.clear();
01166         myLaneThresholds.clear();
01167         myLaneButtons.clear();
01168         GUIColorScheme &scheme = mySettings->getLaneEdgeScheme();
01169         const bool interpolate = scheme.isInterpolated();
01170         const bool fixed = scheme.isFixed();
01171         const std::vector<RGBColor> &colors = scheme.getColors();
01172         std::vector<RGBColor>::const_iterator colIt = colors.begin();
01173         std::vector<SUMOReal>::const_iterator threshIt = scheme.getThresholds().begin();
01174         std::vector<std::string>::const_iterator nameIt = scheme.getNames().begin();
01175         FX::FXString buttonText = "Add";
01176         while (colIt != colors.end()) {
01177             myLaneColors.push_back(new FXColorWell(m , convert(*colIt),
01178                                                    this, MID_SIMPLE_VIEW_COLORCHANGE,
01179                                                    LAYOUT_FIX_WIDTH|LAYOUT_CENTER_Y|FRAME_SUNKEN|FRAME_THICK|ICON_AFTER_TEXT,
01180                                                    0, 0, 100, 0,   0, 0, 0, 0));
01181             if (fixed) {
01182                 new FXLabel(m, nameIt->c_str());
01183                 new FXLabel(m, "");
01184             } else {
01185                 FXRealSpinDial* threshDialer =
01186                     new FXRealSpinDial(m, 10, this, MID_SIMPLE_VIEW_COLORCHANGE,
01187                                        LAYOUT_CENTER_Y|LAYOUT_TOP|FRAME_SUNKEN|FRAME_THICK|SPINDIAL_NOMAX);
01188                 threshDialer->setValue(*threshIt);
01189                 myLaneThresholds.push_back(threshDialer);
01190                 myLaneButtons.push_back(new FXButton(m,buttonText,NULL,this,MID_SIMPLE_VIEW_COLORCHANGE,BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_CENTER_X,0,0,0,0, 20,20,4,4));
01191                 buttonText = "Remove";
01192             }
01193             colIt++;
01194             threshIt++;
01195             nameIt++;
01196         }
01197         myLaneColorInterpolation->setCheck(scheme.isInterpolated());
01198         if (fixed) {
01199             myLaneColorInterpolation->disable();
01200         } else {
01201             if (colors.size() > 1) {
01202                 myLaneColorInterpolation->enable();
01203                 if (myLaneColorInterpolation->getCheck()) {
01204                     myLaneThresholds.front()->enable();
01205                 } else {
01206                     myLaneThresholds.front()->disable();
01207                 }
01208             } else {
01209                 myLaneColorInterpolation->disable();
01210                 myLaneThresholds.front()->disable();
01211             }
01212         }
01213         if (doCreate) {
01214             m->create();
01215         }
01216         myLaneColorSettingFrame->getParent()->recalc();
01217     }
01218     {
01219         // vehicles
01220         MFXUtils::deleteChildren(myVehicleColorSettingFrame);
01221         FXMatrix *m = new FXMatrix(myVehicleColorSettingFrame,3,
01222                                    LAYOUT_FILL_X|MATRIX_BY_COLUMNS,
01223                                    0,0,0,0,10,10,0,0, 5,3);
01224         myVehicleColors.clear();
01225         myVehicleThresholds.clear();
01226         myVehicleButtons.clear();
01227         const bool interpolate = mySettings->vehicleColorer.getScheme().isInterpolated();
01228         const bool fixed = mySettings->vehicleColorer.getScheme().isFixed();
01229         const std::vector<RGBColor> &colors = mySettings->vehicleColorer.getScheme().getColors();
01230         std::vector<RGBColor>::const_iterator colIt = colors.begin();
01231         std::vector<SUMOReal>::const_iterator threshIt = mySettings->vehicleColorer.getScheme().getThresholds().begin();
01232         std::vector<std::string>::const_iterator nameIt = mySettings->vehicleColorer.getScheme().getNames().begin();
01233         FX::FXString buttonText = "Add";
01234         while (colIt != colors.end()) {
01235             myVehicleColors.push_back(new FXColorWell(m , convert(*colIt),
01236                                       this, MID_SIMPLE_VIEW_COLORCHANGE,
01237                                       LAYOUT_FIX_WIDTH|LAYOUT_CENTER_Y|FRAME_SUNKEN|FRAME_THICK|ICON_AFTER_TEXT,
01238                                       0, 0, 100, 0,   0, 0, 0, 0));
01239             if (fixed) {
01240                 new FXLabel(m, nameIt->c_str());
01241                 new FXLabel(m, "");
01242             } else {
01243                 FXRealSpinDial* threshDialer =
01244                     new FXRealSpinDial(m, 10, this, MID_SIMPLE_VIEW_COLORCHANGE,
01245                                        LAYOUT_CENTER_Y|LAYOUT_TOP|FRAME_SUNKEN|FRAME_THICK|SPINDIAL_NOMAX);
01246                 threshDialer->setValue(*threshIt);
01247                 myVehicleThresholds.push_back(threshDialer);
01248                 myVehicleButtons.push_back(new FXButton(m,buttonText,NULL,this,MID_SIMPLE_VIEW_COLORCHANGE,BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_CENTER_X,0,0,0,0, 20,20,4,4));
01249                 buttonText = "Remove";
01250             }
01251             colIt++;
01252             threshIt++;
01253             nameIt++;
01254         }
01255         myVehicleColorInterpolation->setCheck(mySettings->vehicleColorer.getScheme().isInterpolated());
01256         if (fixed) {
01257             myVehicleColorInterpolation->disable();
01258         } else {
01259             if (colors.size() > 1) {
01260                 myVehicleColorInterpolation->enable();
01261                 if (myVehicleColorInterpolation->getCheck()) {
01262                     myVehicleThresholds.front()->enable();
01263                 } else {
01264                     myVehicleThresholds.front()->disable();
01265                 }
01266             } else {
01267                 myVehicleColorInterpolation->disable();
01268                 myVehicleThresholds.front()->disable();
01269             }
01270         }
01271         if (doCreate) {
01272             m->create();
01273         }
01274         myVehicleColorSettingFrame->getParent()->recalc();
01275     }
01276     layout();
01277     update();
01278 }
01279 
01280 
01281 long
01282 GUIDialog_ViewSettings::onCmdEditTable(FXObject*,FXSelector,void*data) {
01283     MFXEditedTableItem *i = (MFXEditedTableItem*) data;
01284     std::string value = i->item->getText().text();
01285     // check whether the inserted value is empty
01286     if (value.find_first_not_of(" ")==std::string::npos) {
01287         return 1;
01288     }
01289     GUISUMOAbstractView::Decal d;
01290     int row = i->row;
01291     if (row==myDecals->size()) {
01292         d.filename = "";
01293         d.centerX = SUMOReal(myParent->getGridWidth() / 2.);
01294         d.centerY = SUMOReal(myParent->getGridHeight() / 2.);
01295         d.width = SUMOReal(myParent->getGridWidth());
01296         d.height = SUMOReal(myParent->getGridHeight());
01297         d.initialised = false;
01298         d.rot = 0;
01299         myDecalsLock->lock();
01300         myDecals->push_back(d);
01301         myDecalsLock->unlock();
01302     } else {
01303         d = (*myDecals)[row];
01304     }
01305 
01306     switch (i->col) {
01307     case 0:
01308         if (d.initialised&&d.filename!=value) {
01309             d.initialised = false;
01310         }
01311         d.filename = value;
01312         break;
01313     case 1:
01314         try {
01315             d.centerX = TplConvert<char>::_2SUMOReal(value.c_str());
01316         } catch (NumberFormatException &) {
01317             std::string msg = "The value must be a float, is:" + value;
01318             FXMessageBox::error(this, MBOX_OK, "Number format error", msg.c_str());
01319         }
01320         break;
01321     case 2:
01322         try {
01323             d.centerY = TplConvert<char>::_2SUMOReal(value.c_str());
01324         } catch (NumberFormatException &) {
01325             std::string msg = "The value must be a float, is:" + value;
01326             FXMessageBox::error(this, MBOX_OK, "Number format error", msg.c_str());
01327         }
01328         break;
01329     case 3:
01330         try {
01331             d.width = TplConvert<char>::_2SUMOReal(value.c_str());
01332         } catch (NumberFormatException &) {
01333             std::string msg = "The value must be a float, is:" + value;
01334             FXMessageBox::error(this, MBOX_OK, "Number format error", msg.c_str());
01335         }
01336         break;
01337     case 4:
01338         try {
01339             d.height = TplConvert<char>::_2SUMOReal(value.c_str());
01340         } catch (NumberFormatException &) {
01341             std::string msg = "The value must be a float, is:" + value;
01342             FXMessageBox::error(this, MBOX_OK, "Number format error", msg.c_str());
01343         }
01344         break;
01345     case 5:
01346         try {
01347             d.rot = TplConvert<char>::_2SUMOReal(value.c_str());
01348         } catch (NumberFormatException &) {
01349             std::string msg = "The value must be a float, is:" + value;
01350             FXMessageBox::error(this, MBOX_OK, "Number format error", msg.c_str());
01351         }
01352         break;
01353     default:
01354         throw 1;
01355     }
01356     (*myDecals)[row] = d;
01357     if (!i->updateOnly) {
01358         rebuildList();
01359     }
01360     myParent->update();
01361     return 1;
01362 }
01363 
01364 
01365 std::string
01366 GUIDialog_ViewSettings::getCurrentScheme() const throw() {
01367     return mySchemeName->getItem(mySchemeName->getCurrentItem()).text();
01368 }
01369 
01370 
01371 void
01372 GUIDialog_ViewSettings::setCurrentScheme(const std::string &name) throw() {
01373     if (name.c_str()==mySchemeName->getItemText(mySchemeName->getCurrentItem())) {
01374         return;
01375     }
01376     for (int i=0; i<mySchemeName->getNumItems(); ++i) {
01377         if (name.c_str()==mySchemeName->getItemText(i)) {
01378             mySchemeName->setCurrentItem(i);
01379             onCmdNameChange(0,0,(void*)name.c_str());
01380             return;
01381         }
01382     }
01383 }
01384 
01385 
01386 /****************************************************************************/
01387 

Generated on Wed May 5 00:06:29 2010 for Sumo - Simulation of Urban MObility by  doxygen 1.5.6