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