SUMO - Simulation of Urban MObility

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