Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/netedit/dialogs/GNEParametersDialog.cpp
169678 views
1
/****************************************************************************/
2
// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3
// Copyright (C) 2001-2025 German Aerospace Center (DLR) and others.
4
// This program and the accompanying materials are made available under the
5
// terms of the Eclipse Public License 2.0 which is available at
6
// https://www.eclipse.org/legal/epl-2.0/
7
// This Source Code may also be made available under the following Secondary
8
// Licenses when the conditions for such availability set forth in the Eclipse
9
// Public License 2.0 are satisfied: GNU General Public License, version 2
10
// or later which is available at
11
// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13
/****************************************************************************/
14
/// @file GNEParametersDialog.cpp
15
/// @author Pablo Alvarez Lopez
16
/// @date Jul 2018
17
///
18
// Dialog for edit parameters
19
/****************************************************************************/
20
21
#include <netbuild/NBLoadedSUMOTLDef.h>
22
#include <netedit/GNEApplicationWindow.h>
23
#include <netedit/GNENet.h>
24
#include <netedit/GNEUndoList.h>
25
#include <netedit/GNEViewParent.h>
26
#include <netedit/dialogs/basic/GNEHelpBasicDialog.h>
27
#include <netedit/dialogs/basic/GNEWarningBasicDialog.h>
28
#include <netedit/frames/common/GNEInspectorFrame.h>
29
#include <utils/gui/div/GUIDesigns.h>
30
#include <utils/xml/XMLSubSys.h>
31
32
#include "GNEParametersDialog.h"
33
34
// ===========================================================================
35
// FOX callback mapping
36
// ===========================================================================
37
38
FXDEFMAP(GNEParametersDialog) GNEParametersDialogMap[] = {
39
FXMAPFUNC(SEL_COMMAND, MID_GNE_BUTTON_ACCEPT, GNEParametersDialog::onCmdAccept),
40
FXMAPFUNC(SEL_COMMAND, MID_GNE_BUTTON_CANCEL, GNEParametersDialog::onCmdCancel),
41
FXMAPFUNC(SEL_COMMAND, MID_GNE_BUTTON_RESET, GNEParametersDialog::onCmdReset),
42
FXMAPFUNC(SEL_CHORE, FXDialogBox::ID_CANCEL, GNEParametersDialog::onCmdCancel),
43
FXMAPFUNC(SEL_TIMEOUT, FXDialogBox::ID_CANCEL, GNEParametersDialog::onCmdCancel),
44
FXMAPFUNC(SEL_COMMAND, FXDialogBox::ID_CANCEL, GNEParametersDialog::onCmdCancel),
45
FXMAPFUNC(SEL_CLOSE, 0, GNEParametersDialog::onCmdCancel),
46
};
47
48
FXDEFMAP(GNEParametersDialog::ParametersValues) ParametersValuesMap[] = {
49
FXMAPFUNC(SEL_COMMAND, MID_GNE_SET_ATTRIBUTE, GNEParametersDialog::ParametersValues::onCmdSetAttribute),
50
FXMAPFUNC(SEL_COMMAND, MID_GNE_REMOVE_ATTRIBUTE, GNEParametersDialog::ParametersValues::onCmdButtonPress),
51
FXMAPFUNC(SEL_PAINT, 0, GNEParametersDialog::ParametersValues::onPaint),
52
};
53
54
FXDEFMAP(GNEParametersDialog::ParametersOperations) ParametersOperationsMap[] = {
55
FXMAPFUNC(SEL_COMMAND, MID_GNE_BUTTON_LOAD, GNEParametersDialog::ParametersOperations::onCmdLoadParameters),
56
FXMAPFUNC(SEL_COMMAND, MID_GNE_BUTTON_SAVE, GNEParametersDialog::ParametersOperations::onCmdSaveParameters),
57
FXMAPFUNC(SEL_COMMAND, MID_GNE_BUTTON_CLEAR, GNEParametersDialog::ParametersOperations::onCmdClearParameters),
58
FXMAPFUNC(SEL_COMMAND, MID_GNE_BUTTON_SORT, GNEParametersDialog::ParametersOperations::onCmdSortParameters),
59
FXMAPFUNC(SEL_COMMAND, MID_HELP, GNEParametersDialog::ParametersOperations::onCmdHelpParameter),
60
};
61
62
// Object implementation
63
FXIMPLEMENT(GNEParametersDialog, GNEDialog, GNEParametersDialogMap, ARRAYNUMBER(GNEParametersDialogMap))
64
FXIMPLEMENT(GNEParametersDialog::ParametersValues, FXGroupBox, ParametersValuesMap, ARRAYNUMBER(ParametersValuesMap))
65
FXIMPLEMENT(GNEParametersDialog::ParametersOperations, FXGroupBox, ParametersOperationsMap, ARRAYNUMBER(ParametersOperationsMap))
66
67
// ===========================================================================
68
// member method definitions
69
// ===========================================================================
70
71
// ---------------------------------------------------------------------------
72
// GNEParametersDialog::ParametersValues - methods
73
// ---------------------------------------------------------------------------
74
75
GNEParametersDialog::ParametersValues::ParametersValues(FXHorizontalFrame* frame, const std::string& name) :
76
FXGroupBox(frame, name.c_str(), GUIDesignGroupBoxFrameFill) {
77
// create labels for keys and values
78
FXHorizontalFrame* horizontalFrameLabels = new FXHorizontalFrame(this, GUIDesignAuxiliarHorizontalFrame);
79
myKeyLabel = new FXLabel(horizontalFrameLabels, "key", nullptr, GUIDesignLabelThickedFixed(100));
80
new FXLabel(horizontalFrameLabels, "value", nullptr, GUIDesignLabelThick(JUSTIFY_NORMAL));
81
// create scroll windows
82
FXScrollWindow* scrollWindow = new FXScrollWindow(this, LAYOUT_FILL);
83
// create vertical frame for rows
84
myVerticalFrameRow = new FXVerticalFrame(scrollWindow, GUIDesignAuxiliarFrame);
85
}
86
87
88
GNEParametersDialog::ParametersValues::~ParametersValues() {}
89
90
91
void
92
GNEParametersDialog::ParametersValues::setParameters(const Parameterised::Map& newParameters) {
93
// clear rows
94
clearParameters();
95
// iterate over parameters
96
for (const auto& newParameter : newParameters) {
97
addParameter(newParameter);
98
}
99
}
100
101
102
void
103
GNEParametersDialog::ParametersValues::setParameters(const std::vector<std::pair<std::string, std::string> >& newParameters) {
104
// clear rows
105
clearParameters();
106
// iterate over parameters
107
for (const auto& newParameter : newParameters) {
108
addParameter(newParameter);
109
}
110
}
111
112
113
void
114
GNEParametersDialog::ParametersValues::addParameter(std::pair<std::string, std::string> newParameter) {
115
// enable last row
116
myParameterRows.back()->enableRow(newParameter.first, newParameter.second);
117
// add row
118
myParameterRows.push_back(new ParameterRow(this, myVerticalFrameRow));
119
// enable add button in the last row
120
myParameterRows.back()->toggleAddButton();
121
}
122
123
124
void
125
GNEParametersDialog::ParametersValues::clearParameters() {
126
// iterate over all rows
127
for (const auto& parameterRow : myParameterRows) {
128
delete parameterRow;
129
}
130
//clear myParameterRows;
131
myParameterRows.clear();
132
// add row
133
myParameterRows.push_back(new ParameterRow(this, myVerticalFrameRow));
134
// enable add button in the last row
135
myParameterRows.back()->toggleAddButton();
136
}
137
138
139
const std::vector<GNEParametersDialog::ParametersValues::ParameterRow*>
140
GNEParametersDialog::ParametersValues::getParameterRows() const {
141
return myParameterRows;
142
}
143
144
145
bool
146
GNEParametersDialog::ParametersValues::keyExist(const std::string& key) const {
147
// just iterate over myParameterRows and compare key
148
for (const auto& row : myParameterRows) {
149
if (row->keyField->getText().text() == key) {
150
return true;
151
}
152
}
153
return false;
154
}
155
156
157
long
158
GNEParametersDialog::ParametersValues::onPaint(FXObject* o, FXSelector f, void* p) {
159
// size of key label has to be updated in every interation
160
if (myParameterRows.size() > 0) {
161
myKeyLabel->setWidth(myParameterRows.front()->keyField->getWidth());
162
}
163
return FXGroupBox::onPaint(o, f, p);
164
}
165
166
167
long
168
GNEParametersDialog::ParametersValues::onCmdSetAttribute(FXObject* obj, FXSelector, void*) {
169
// find what value was changed
170
for (int i = 0; i < (int)myParameterRows.size(); i++) {
171
if (myParameterRows.at(i)->keyField == obj) {
172
// change color of text field depending if key is valid or empty
173
if (myParameterRows.at(i)->keyField->getText().empty() || SUMOXMLDefinitions::isValidParameterKey(myParameterRows.at(i)->keyField->getText().text())) {
174
myParameterRows.at(i)->keyField->setTextColor(GUIDesignTextColorBlack);
175
} else {
176
myParameterRows.at(i)->keyField->setTextColor(GUIDesignTextColorRed);
177
myParameterRows.at(i)->keyField->killFocus();
178
}
179
}
180
}
181
return 1;
182
}
183
184
185
long
186
GNEParametersDialog::ParametersValues::onCmdButtonPress(FXObject* obj, FXSelector, void*) {
187
// first check if add button was pressed
188
if (myParameterRows.back()->button == obj) {
189
// create new parameter
190
addParameter(std::make_pair("", ""));
191
return 1;
192
} else {
193
// in other case, button press was a "remove button". Find id and remove the Parameter
194
for (int i = 0; i < (int)myParameterRows.size(); i++) {
195
if (myParameterRows.at(i)->button == obj) {
196
// delete row
197
delete myParameterRows.at(i);
198
// just remove row
199
myParameterRows.erase(myParameterRows.begin() + i);
200
return 1;
201
}
202
}
203
}
204
// Nothing to do
205
return 1;
206
}
207
208
209
GNEParametersDialog::ParametersValues::ParameterRow::ParameterRow(ParametersValues* ParametersValues, FXVerticalFrame* verticalFrameParent) {
210
horizontalFrame = new FXHorizontalFrame(verticalFrameParent, GUIDesignAuxiliarHorizontalFrame);
211
keyField = new FXTextField(horizontalFrame, GUIDesignTextFieldNCol, ParametersValues, MID_GNE_SET_ATTRIBUTE, GUIDesignTextField);
212
valueField = new FXTextField(horizontalFrame, GUIDesignTextFieldNCol, ParametersValues, MID_GNE_SET_ATTRIBUTE, GUIDesignTextField);
213
button = GUIDesigns::buildFXButton(horizontalFrame, "", "", "", GUIIconSubSys::getIcon(GUIIcon::REMOVE), ParametersValues, MID_GNE_REMOVE_ATTRIBUTE, GUIDesignButtonIcon);
214
// only create elements if vertical frame was previously created
215
if (verticalFrameParent->id()) {
216
horizontalFrame->create();
217
}
218
// by defaults rows are disabled
219
disableRow();
220
}
221
222
223
GNEParametersDialog::ParametersValues::ParameterRow::~ParameterRow() {
224
// simply delete horizontalFrame (rest of elements will be automatic deleted due they are children of horizontal frame)
225
delete horizontalFrame;
226
}
227
228
229
void
230
GNEParametersDialog::ParametersValues::ParameterRow::disableRow() {
231
// hide all
232
keyField->setText("");
233
keyField->disable();
234
valueField->setText("");
235
valueField->disable();
236
button->disable();
237
button->setIcon(GUIIconSubSys::getIcon(GUIIcon::REMOVE));
238
}
239
240
241
void
242
GNEParametersDialog::ParametersValues::ParameterRow::enableRow(const std::string& parameter, const std::string& value) const {
243
// restore color and enable key field
244
keyField->setText(parameter.c_str());
245
if (parameter.empty() || SUMOXMLDefinitions::isValidParameterKey(parameter)) {
246
keyField->setTextColor(GUIDesignTextColorBlack);
247
} else {
248
keyField->setTextColor(GUIDesignTextColorRed);
249
}
250
keyField->enable();
251
// restore color and enable value field
252
valueField->setText(value.c_str());
253
valueField->enable();
254
// enable button and set icon remove
255
button->enable();
256
button->setIcon(GUIIconSubSys::getIcon(GUIIcon::REMOVE));
257
}
258
259
260
void
261
GNEParametersDialog::ParametersValues::ParameterRow::toggleAddButton() {
262
// clear and disable parameter and value fields
263
keyField->setText("");
264
keyField->disable();
265
valueField->setText("");
266
valueField->disable();
267
// enable remove button and set "add" icon and focus
268
button->enable();
269
button->setIcon(GUIIconSubSys::getIcon(GUIIcon::ADD));
270
button->setFocus();
271
}
272
273
274
bool
275
GNEParametersDialog::ParametersValues::ParameterRow::isButtonInAddMode() const {
276
return (button->getIcon() == GUIIconSubSys::getIcon(GUIIcon::ADD));
277
}
278
279
280
void
281
GNEParametersDialog::ParametersValues::ParameterRow::copyValues(const ParameterRow& other) {
282
keyField->setText(other.keyField->getText());
283
valueField->setText(other.valueField->getText());
284
}
285
286
// ---------------------------------------------------------------------------
287
// GNEParametersDialog::ParametersOperations - methods
288
// ---------------------------------------------------------------------------
289
290
GNEParametersDialog::ParametersOperations::ParametersOperations(FXHorizontalFrame* frame, GNEParametersDialog* ParameterDialogParent) :
291
FXGroupBox(frame, TL("Operations"), GUIDesignGroupBoxFrame100),
292
myParameterDialogParent(ParameterDialogParent) {
293
// create buttons
294
mySortButton = GUIDesigns::buildFXButton(this, TL("Sort"), "", "", GUIIconSubSys::getIcon(GUIIcon::RELOAD), this, MID_GNE_BUTTON_SORT, GUIDesignButtonFixed(100));
295
myClearButton = GUIDesigns::buildFXButton(this, TL("Clear"), "", "", GUIIconSubSys::getIcon(GUIIcon::CLEANJUNCTIONS), this, MID_GNE_BUTTON_CLEAR, GUIDesignButtonFixed(100));
296
myLoadButton = GUIDesigns::buildFXButton(this, TL("Load"), "", "", GUIIconSubSys::getIcon(GUIIcon::OPEN), this, MID_GNE_BUTTON_LOAD, GUIDesignButtonFixed(100));
297
mySaveButton = GUIDesigns::buildFXButton(this, TL("Save"), "", "", GUIIconSubSys::getIcon(GUIIcon::SAVE), this, MID_GNE_BUTTON_SAVE, GUIDesignButtonFixed(100));
298
myHelpButton = GUIDesigns::buildFXButton(this, TL("Help"), "", "", GUIIconSubSys::getIcon(GUIIcon::HELP), this, MID_HELP, GUIDesignButtonFixed(100));
299
}
300
301
302
GNEParametersDialog::ParametersOperations::~ParametersOperations() {}
303
304
305
long
306
GNEParametersDialog::ParametersOperations::onCmdLoadParameters(FXObject*, FXSelector, void*) {
307
// get the Additional file name
308
FXFileDialog opendialog(this, TL("Open Parameter Template"));
309
opendialog.setIcon(GUIIconSubSys::getIcon(GUIIcon::GREENVEHICLE));
310
opendialog.setSelectMode(SELECTFILE_EXISTING);
311
opendialog.setPatternList(SUMOXMLDefinitions::XMLFileExtensions.getMultilineString().c_str());
312
if (gCurrentFolder.length() != 0) {
313
opendialog.setDirectory(gCurrentFolder);
314
}
315
if (opendialog.execute()) {
316
gCurrentFolder = opendialog.getDirectory();
317
std::string file = opendialog.getFilename().text();
318
// save current number of parameters
319
const int numberOfParametersbeforeLoad = (int)myParameterDialogParent->myParametersValues->getParameterRows().size();
320
// Create additional handler and run parser
321
GNEParameterHandler handler(this, file);
322
if (!XMLSubSys::runParser(handler, file, false)) {
323
WRITE_MESSAGEF(TL("Loading of Parameters From % failed."), file);
324
}
325
// show loaded attributes
326
WRITE_MESSAGEF(TL("Loaded % Parameters."), toString((int)myParameterDialogParent->myParametersValues->getParameterRows().size() - numberOfParametersbeforeLoad));
327
}
328
return 1;
329
}
330
331
332
long
333
GNEParametersDialog::ParametersOperations::onCmdSaveParameters(FXObject*, FXSelector, void*) {
334
// obtain file to save parameters
335
FXString file = MFXUtils::getFilename2Write(this,
336
TL("Save Parameter Template file"),
337
SUMOXMLDefinitions::XMLFileExtensions.getMultilineString().c_str(),
338
GUIIconSubSys::getIcon(GUIIcon::GREENVEHICLE),
339
gCurrentFolder);
340
if (file == "") {
341
// None parameter file was selected, then stop function
342
return 1;
343
} else {
344
// open device
345
OutputDevice& device = OutputDevice::getDevice(file.text());
346
// write header
347
device.writeXMLHeader("Parameter", "parameter_file.xsd");
348
// iterate over all parameters and save it in the filename
349
for (const auto& row : myParameterDialogParent->myParametersValues->getParameterRows()) {
350
// write all except last
351
if (row != myParameterDialogParent->myParametersValues->getParameterRows().back()) {
352
// open tag
353
device.openTag(SUMO_TAG_PARAM);
354
// write key
355
device.writeAttr(SUMO_ATTR_KEY, row->keyField->getText().text());
356
// write value
357
device.writeAttr(SUMO_ATTR_VALUE, row->valueField->getText().text());
358
// close tag
359
device.closeTag();
360
}
361
}
362
// close device
363
device.close();
364
}
365
return 1;
366
}
367
368
369
long
370
GNEParametersDialog::ParametersOperations::onCmdClearParameters(FXObject*, FXSelector, void*) {
371
// simply clear parameters from ParametersValues
372
myParameterDialogParent->myParametersValues->clearParameters();
373
return 1;
374
}
375
376
377
long
378
GNEParametersDialog::ParametersOperations::onCmdSortParameters(FXObject*, FXSelector, void*) {
379
// declare two containers for parameters
380
std::vector<std::pair<std::string, std::string> > nonEmptyKeyValues;
381
std::vector<std::string> emptyKeyValues;
382
// first extract empty values
383
for (const auto& parameterRow : myParameterDialogParent->myParametersValues->getParameterRows()) {
384
// check if key is empty
385
if (!parameterRow->keyField->getText().empty()) {
386
nonEmptyKeyValues.push_back(std::make_pair(parameterRow->keyField->getText().text(), parameterRow->valueField->getText().text()));
387
} else if (!parameterRow->valueField->getText().empty()) {
388
emptyKeyValues.push_back(parameterRow->valueField->getText().text());
389
}
390
}
391
// sort non-empty parameters
392
std::sort(nonEmptyKeyValues.begin(), nonEmptyKeyValues.end());
393
// sort non-empty parameters
394
std::sort(emptyKeyValues.begin(), emptyKeyValues.end());
395
// add values without key
396
for (const auto& emptyKeyValue : emptyKeyValues) {
397
nonEmptyKeyValues.push_back(std::make_pair("", emptyKeyValue));
398
}
399
// finally setparameters in myParametersValues
400
myParameterDialogParent->myParametersValues->setParameters(nonEmptyKeyValues);
401
return 1;
402
}
403
404
405
long
406
GNEParametersDialog::ParametersOperations::onCmdHelpParameter(FXObject*, FXSelector, void*) {
407
// set help text
408
std::ostringstream help;
409
help
410
<< TL("- Parameters are defined by a Key and a Value.") << "\n"
411
<< TL("- In Netedit can be defined using format key1=parameter1|key2=parameter2|...") << "\n"
412
<< TL("- Duplicated and empty Keys aren't valid.") << "\n"
413
<< TL("- Whitespace and certain characters aren't allowed (@$%^&/|\\....)");
414
// create and open dialog
415
GNEHelpBasicDialog(myParameterDialogParent->getApplicationWindow(),
416
TL("Parameters Help"), help);
417
return 1;
418
}
419
420
421
GNEParametersDialog::ParametersOperations::GNEParameterHandler::GNEParameterHandler(ParametersOperations* ParametersOperationsParent, const std::string& file) :
422
SUMOSAXHandler(file),
423
myParametersOperationsParent(ParametersOperationsParent) {
424
}
425
426
427
GNEParametersDialog::ParametersOperations::GNEParameterHandler::~GNEParameterHandler() {}
428
429
430
void
431
GNEParametersDialog::ParametersOperations::GNEParameterHandler::myStartElement(int element, const SUMOSAXAttributes& attrs) {
432
// only continue if tag is valid
433
if (element != SUMO_TAG_NOTHING) {
434
// Call parse and build depending of tag
435
switch (element) {
436
case SUMO_TAG_PARAM:
437
// Check that format of Parameter is correct
438
if (!attrs.hasAttribute(SUMO_ATTR_KEY)) {
439
WRITE_WARNING(TL("Key of Parameter not defined"));
440
} else if (!attrs.hasAttribute(SUMO_ATTR_VALUE)) {
441
WRITE_WARNING(TL("Value of Parameter not defined"));
442
} else {
443
// obtain Key and value
444
std::string key = attrs.getString(SUMO_ATTR_KEY);
445
std::string value = attrs.getString(SUMO_ATTR_VALUE);
446
// check that parsed values are correct
447
if (!SUMOXMLDefinitions::isValidParameterKey(key)) {
448
if (key.size() == 0) {
449
WRITE_WARNING(TL("Key of Parameter cannot be empty"));
450
} else {
451
WRITE_WARNINGF(TL("Key '%' of Parameter contains invalid characters"), key);
452
}
453
} else if (myParametersOperationsParent->myParameterDialogParent->myParametersValues->keyExist(key)) {
454
WRITE_WARNINGF(TL("Key '%' already exist"), key);
455
} else {
456
// add parameter to vector of myParameterDialogParent
457
myParametersOperationsParent->myParameterDialogParent->myParametersValues->addParameter(std::make_pair(key, value));
458
}
459
}
460
break;
461
default:
462
break;
463
}
464
}
465
}
466
467
// ---------------------------------------------------------------------------
468
// GNEParametersDialog - methods
469
// ---------------------------------------------------------------------------
470
471
GNEParametersDialog::GNEParametersDialog(GNEApplicationWindow* applicationWindow, const Parameterised::Map& parameters) :
472
GNEDialog(applicationWindow, TL("Edit parameters"), GUIIcon::APP_TABLE, DialogType::PARAMETERS,
473
GNEDialog::Buttons::ACCEPT_CANCEL_RESET, OpenType::MODAL, GNEDialog::ResizeMode::RESIZABLE, 400, 300),
474
myOriginalParameters(parameters) {
475
// create frame for Parameters and operations
476
FXHorizontalFrame* horizontalFrame = new FXHorizontalFrame(myContentFrame, GUIDesignAuxiliarFrame);
477
// create parameters values
478
myParametersValues = new ParametersValues(horizontalFrame, TL("Parameters"));
479
// create parameters operations
480
myParametersOperations = new ParametersOperations(horizontalFrame, this);
481
// fill myParametersValues
482
myParametersValues->setParameters(parameters);
483
// open modal dialog
484
openDialog();
485
}
486
487
GNEParametersDialog::~GNEParametersDialog() {}
488
489
490
void
491
GNEParametersDialog::runInternalTest(const InternalTestStep::DialogArgument* /*dialogArgument*/) {
492
// nothing to do (yet)
493
}
494
495
496
std::vector<std::pair<std::string, std::string> >
497
GNEParametersDialog::getEditedParameters() const {
498
std::vector<std::pair<std::string, std::string> > parameters;
499
for (const auto& parameterRow : myParametersValues->getParameterRows()) {
500
// ignore last row (the row with + button)
501
if (parameterRow != myParametersValues->getParameterRows().back()) {
502
// insert in parameters
503
parameters.push_back(std::make_pair(parameterRow->keyField->getText().text(), parameterRow->valueField->getText().text()));
504
}
505
}
506
return parameters;
507
}
508
509
510
long
511
GNEParametersDialog::onCmdAccept(FXObject*, FXSelector, void*) {
512
// declare vector for parameters in stringvector format
513
std::vector<std::pair<std::string, std::string> > editedParameters = getEditedParameters();
514
// check keys
515
for (const auto& editedParameter : editedParameters) {
516
if (editedParameter.first.empty()) {
517
// open warning Box
518
GNEWarningBasicDialog(myApplicationWindow, TL("Empty Parameter key"), TL("Parameters with empty keys aren't allowed"));
519
return 1;
520
} else if (!SUMOXMLDefinitions::isValidParameterKey(editedParameter.first)) {
521
// open warning Box
522
GNEWarningBasicDialog(myApplicationWindow, TL("Invalid Parameter key"), TL("There are keys with invalid characters"));
523
return 1;
524
}
525
}
526
// sort sortedParameters
527
std::sort(editedParameters.begin(), editedParameters.end());
528
// check if there is duplicated keys
529
for (auto i = editedParameters.begin(); (i + 1) != editedParameters.end(); i++) {
530
if ((i->first) == (i + 1)->first) {
531
// open warning Box
532
GNEWarningBasicDialog(myApplicationWindow, TL("Duplicated Parameters"), TL("Parameters with the same key aren't allowed"));
533
return 1;
534
}
535
}
536
// close dialog accepting
537
return closeDialogAccepting();
538
}
539
540
541
long
542
GNEParametersDialog::onCmdReset(FXObject*, FXSelector, void*) {
543
// restore original parameters
544
myParametersValues->setParameters(myOriginalParameters);
545
return 1;
546
}
547
548
/****************************************************************************/
549
550