SUMO - Simulation of Urban MObility
GNEGenericParameterDialog.cpp
Go to the documentation of this file.
1 /****************************************************************************/
2 // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.org/sumo
3 // Copyright (C) 2001-2018 German Aerospace Center (DLR) and others.
4 // This program and the accompanying materials
5 // are made available under the terms of the Eclipse Public License v2.0
6 // which accompanies this distribution, and is available at
7 // http://www.eclipse.org/legal/epl-v20.html
8 // SPDX-License-Identifier: EPL-2.0
9 /****************************************************************************/
15 // Dialog for edit rerouters
16 /****************************************************************************/
17 
18 // ===========================================================================
19 // included modules
20 // ===========================================================================
21 #include <config.h>
22 
23 #include <iostream>
29 #include <utils/common/ToString.h>
31 #include <utils/xml/XMLSubSys.h>
33 #include <netedit/GNEViewNet.h>
35 
37 
38 
39 // ===========================================================================
40 // FOX callback mapping
41 // ===========================================================================
42 
43 FXDEFMAP(GNEGenericParameterDialog) GNEGenericParameterDialogMap[] = {
47  FXMAPFUNC(SEL_CHORE, FXDialogBox::ID_CANCEL, GNEGenericParameterDialog::onCmdCancel),
48  FXMAPFUNC(SEL_TIMEOUT, FXDialogBox::ID_CANCEL, GNEGenericParameterDialog::onCmdCancel),
49  FXMAPFUNC(SEL_COMMAND, FXDialogBox::ID_CANCEL, GNEGenericParameterDialog::onCmdCancel),
50  FXMAPFUNC(SEL_CLOSE, 0, GNEGenericParameterDialog::onCmdCancel),
51 };
52 
53 FXDEFMAP(GNEGenericParameterDialog::GenericParametersValues) GenericParametersValuesMap[] = {
57 };
58 
59 FXDEFMAP(GNEGenericParameterDialog::GenericParametersOptions) GenericParametersOptionsMap[] = {
65 };
66 
67 // Object implementation
68 FXIMPLEMENT(GNEGenericParameterDialog, FXDialogBox, GNEGenericParameterDialogMap, ARRAYNUMBER(GNEGenericParameterDialogMap))
69 FXIMPLEMENT(GNEGenericParameterDialog::GenericParametersValues, FXGroupBox, GenericParametersValuesMap, ARRAYNUMBER(GenericParametersValuesMap))
70 FXIMPLEMENT(GNEGenericParameterDialog::GenericParametersOptions, FXGroupBox, GenericParametersOptionsMap, ARRAYNUMBER(GenericParametersOptionsMap))
71 
72 // ===========================================================================
73 // member method definitions
74 // ===========================================================================
75 
76 // ---------------------------------------------------------------------------
77 // GNEGenericParameterDialog::GenericParametersValues - methods
78 // ---------------------------------------------------------------------------
79 
80 GNEGenericParameterDialog::GenericParametersValues::GenericParametersValues(FXHorizontalFrame* frame, GNEGenericParameterDialog* genericParameterDialogParent, std::vector<std::pair<std::string, std::string> >* genericParameters) :
81  FXGroupBox(frame, "Generic Parameters", GUIDesignGroupBoxFrameFill),
82  myGenericParameterDialogParent(genericParameterDialogParent),
83  myGenericParameters(genericParameters) {
84  // create labels for keys and values
85  FXHorizontalFrame* horizontalFrameLabels = new FXHorizontalFrame(this, GUIDesignAuxiliarHorizontalFrame);
86  myKeyLabel = new FXLabel(horizontalFrameLabels, "key", nullptr, GUIDesignLabelThick100);
87  new FXLabel(horizontalFrameLabels, "value", nullptr, GUIDesignLabelCenterThick);
88  // create scroll windows
89  FXScrollWindow* scrollWindow = new FXScrollWindow(this, LAYOUT_FILL);
90  // create vertical frame for rows
91  myVerticalFrameRow = new FXVerticalFrame(scrollWindow, GUIDesignAuxiliarFrame);
92  // update values
93  updateValues();
94 }
95 
96 
98 
99 
100 void
102  // first show the correct number of rows
103  while ((myGenericParameters->size() + 1) < myGenericParameterRows.size()) {
104  delete myGenericParameterRows.back();
105  myGenericParameterRows.pop_back();
106  }
107  while ((myGenericParameters->size() + 1) > myGenericParameterRows.size()) {
109  }
110  // fill rows
111  for (int i = 0; i < (int)myGenericParameters->size(); i++) {
112  myGenericParameterRows.at(i)->enableRow(myGenericParameters->at(i).first, myGenericParameters->at(i).second);
113  }
114  // set last myGenericParameterRows with the add button
115  myGenericParameterRows.back()->toogleAddButton();
116 }
117 
118 
119 const std::vector<std::pair<std::string, std::string> >*
121  return myGenericParameters;
122 }
123 
124 
125 std::vector<std::pair<std::string, std::string> >
127  return *myGenericParameters;
128 }
129 
130 
131 void
132 GNEGenericParameterDialog::GenericParametersValues::setGenericParameters(const std::vector<std::pair<std::string, std::string> >& newGenericParameters) {
133  *myGenericParameters = newGenericParameters;
134  // update values
135  updateValues();
136 }
137 
138 
139 void
140 GNEGenericParameterDialog::GenericParametersValues::addGenericParameter(std::pair<std::string, std::string> newGenericParameter) {
141  myGenericParameters->push_back(newGenericParameter);
142  // update values
143  updateValues();
144 }
145 
146 
147 void
149  myGenericParameters->clear();
150  updateValues();
151 }
152 
153 
154 long
156  // size of key label has to be updated in every interation
157  if (myGenericParameterRows.size() > 0) {
158  myKeyLabel->setWidth(myGenericParameterRows.front()->keyField->getWidth());
159  }
160  return FXGroupBox::onPaint(o, f, p);
161 }
162 
163 
164 long
166  // find what value was changed
167  for (int i = 0; i < (int)myGenericParameterRows.size(); i++) {
168  if (myGenericParameterRows.at(i)->keyField == obj) {
169  // change key of Generic Parameter
170  myGenericParameters->at(i).first = myGenericParameterRows.at(i)->keyField->getText().text();
171  // change color of text field depending if key is valid or empty
173  myGenericParameterRows.at(i)->keyField->setTextColor(FXRGB(0, 0, 0));
174  } else {
175  myGenericParameterRows.at(i)->keyField->setTextColor(FXRGB(255, 0, 0));
176  myGenericParameterRows.at(i)->keyField->killFocus();
177  }
178  } else if (myGenericParameterRows.at(i)->valueField == obj) {
179  // change value of Generic Parameter
180  myGenericParameters->at(i).second = myGenericParameterRows.at(i)->valueField->getText().text();
181  // change color of text field depending if attribute is valid
183  myGenericParameterRows.at(i)->valueField->setTextColor(FXRGB(0, 0, 0));
184  } else {
185  myGenericParameterRows.at(i)->valueField->setTextColor(FXRGB(255, 0, 0));
186  myGenericParameterRows.at(i)->valueField->killFocus();
187  }
188  }
189  }
190  return 1;
191 }
192 
193 
194 long
196  // first check if add button was pressed
197  if (myGenericParameterRows.back()->button == obj) {
198  // create new generic parameter
199  myGenericParameters->push_back(std::make_pair("", ""));
200  // update values and finish
201  updateValues();
202  return 1;
203  } else {
204  // in other case, button press was a "remove button". Find id and remove the Generic Parameter
205  for (int i = 0; i < (int)myGenericParameterRows.size(); i++) {
206  if (myGenericParameterRows.at(i)->button == obj && i < (int)myGenericParameters->size()) {
207  // remove generic parameter
208  myGenericParameters->erase(myGenericParameters->begin() + i);
209  // update values and finish
210  updateValues();
211  return 1;
212  }
213  }
214  }
215  // Nothing to do
216  return 1;
217 }
218 
219 
221  horizontalFrame = new FXHorizontalFrame(verticalFrameParent, GUIDesignAuxiliarHorizontalFrame);
222  keyField = new FXTextField(horizontalFrame, GUIDesignTextFieldNCol, genericParametersValues, MID_GNE_SET_ATTRIBUTE, GUIDesignTextField);
223  valueField = new FXTextField(horizontalFrame, GUIDesignTextFieldNCol, genericParametersValues, MID_GNE_SET_ATTRIBUTE, GUIDesignTextField);
224  button = new FXButton(horizontalFrame, "", GUIIconSubSys::getIcon(ICON_REMOVE), genericParametersValues, MID_GNE_REMOVE_ATTRIBUTE, GUIDesignButtonIcon);
225  // only create elements if vertical frame was previously created
226  if (verticalFrameParent->id()) {
227  horizontalFrame->create();
228  }
229  // by defaults rows are disabled
230  disableRow();
231 }
232 
233 
235  // simply delete horizontalFrame (rest of elements will be automatic deleted due they are childs of horizontal frame)
236  delete horizontalFrame;
237 }
238 
239 
240 void
242  // hide all
243  keyField->setText("");
244  keyField->disable();
245  valueField->setText("");
246  valueField->disable();
247  button->disable();
248  button->setIcon(GUIIconSubSys::getIcon(ICON_REMOVE));
249 }
250 
251 
252 void
253 GNEGenericParameterDialog::GenericParametersValues::GenericParameterRow::enableRow(const std::string& parameter, const std::string& value) const {
254  // restore color and enable key field
255  keyField->setText(parameter.c_str());
256  if (parameter.empty() || SUMOXMLDefinitions::isValidGenericParameterKey(parameter)) {
257  keyField->setTextColor(FXRGB(0, 0, 0));
258  } else {
259  keyField->setTextColor(FXRGB(255, 0, 0));
260  }
261  keyField->enable();
262  // restore color and enable value field
263  valueField->setText(value.c_str());
265  valueField->setTextColor(FXRGB(0, 0, 0));
266  } else {
267  valueField->setTextColor(FXRGB(255, 0, 0));
268  }
269  valueField->enable();
270  // enable button and set icon remove
271  button->enable();
272  button->setIcon(GUIIconSubSys::getIcon(ICON_REMOVE));
273 }
274 
275 
276 void
278  // clear and disable parameter and value fields
279  keyField->setText("");
280  keyField->disable();
281  valueField->setText("");
282  valueField->disable();
283  // enable remove button and set "add" icon and focus
284  button->enable();
285  button->setIcon(GUIIconSubSys::getIcon(ICON_ADD));
286  button->setFocus();
287 }
288 
289 
290 bool
292  return (button->getIcon() == GUIIconSubSys::getIcon(ICON_ADD));
293 }
294 
295 
296 void
298  keyField->setText(other.keyField->getText());
299  valueField->setText(other.valueField->getText());
300 }
301 
302 // ---------------------------------------------------------------------------
303 // GNEGenericParameterDialog::GenericParametersOptions - methods
304 // ---------------------------------------------------------------------------
305 
307  FXGroupBox(frame, "Options", GUIDesignGroupBoxFrame100),
308  myGenericParameterDialogParent(genericParameterDialogParent) {
309  // create buttons
315 }
316 
317 
319 
320 
321 long
323  // get the Additional file name
324  FXFileDialog opendialog(this, "Open Generic Parameter Template");
325  opendialog.setIcon(GUIIconSubSys::getIcon(ICON_GREENVEHICLE));
326  opendialog.setSelectMode(SELECTFILE_EXISTING);
327  opendialog.setPatternList("Generic Parameter Template files (*.xml)\nAll files (*)");
328  if (gCurrentFolder.length() != 0) {
329  opendialog.setDirectory(gCurrentFolder);
330  }
331  if (opendialog.execute()) {
332  gCurrentFolder = opendialog.getDirectory();
333  std::string file = opendialog.getFilename().text();
334  // save current number of generic parameters
335  int numberOfGenericParametersbeforeLoad = (int)myGenericParameterDialogParent->myGenericParametersValues->getGenericParameters()->size();
336  // Create additional handler and run parser
338  if (!XMLSubSys::runParser(handler, file, false)) {
339  WRITE_MESSAGE("Loading of Generic Parameters From " + file + " failed.");
340  }
341  // show loaded attributes
342  WRITE_MESSAGE("Loaded " + toString((int)myGenericParameterDialogParent->myGenericParametersValues->getGenericParameters()->size() - numberOfGenericParametersbeforeLoad) + " Generic Parameters.");
343  // update values
345  }
346  return 1;
347 }
348 
349 
350 long
352  // obtain file to save generic parameters
353  FXString file = MFXUtils::getFilename2Write(this,
354  "Select name of the Generic Parameter Template file", ".xml",
357  if (file == "") {
358  // None generic parameter file was selected, then stop function
359  return 1;
360  } else {
361  OutputDevice& device = OutputDevice::getDevice(file.text());
362  device.writeXMLHeader("genericParameter", "genericparameter_file.xsd");
363  // iterate over all generic parameters and save it in the filename
365  device.openTag(SUMO_TAG_PARAM);
366  device.writeAttr(SUMO_ATTR_KEY, i->first);
367  device.writeAttr(SUMO_ATTR_VALUE, i->second);
368  device.closeTag();
369  }
370  device.close();
371  }
372  return 1;
373 }
374 
375 
376 long
378  // simply clear generic parameters from GenericParametersValues
380  return 1;
381 }
382 
383 
384 long
386  std::vector<std::pair<std::string, std::string> > genericParametersNoEmpty;
387  std::vector<std::string> valuesEmpty;
388  // first extract empty values
390  if (!i->first.empty()) {
391  genericParametersNoEmpty.push_back(*i);
392  } else if (i->first.empty() && !i->second.empty()) {
393  valuesEmpty.push_back(i->second);
394  }
395  }
396  // now sort non-empty generic parameters
397  std::sort(genericParametersNoEmpty.begin(), genericParametersNoEmpty.end());
398  // add values without key
399  for (auto i : valuesEmpty) {
400  genericParametersNoEmpty.push_back(std::make_pair("", i));
401  }
402  // fill genericParametersNoEmpty with empty values
403  while (genericParametersNoEmpty.size() < myGenericParameterDialogParent->myGenericParametersValues->getGenericParameters()->size()) {
404  genericParametersNoEmpty.push_back(std::make_pair("", ""));
405  }
406  // finally replace generic parameters in myGenericParametersValues with genericParametersNoEmpty
408  // update values
410  return 1;
411 }
412 
413 
414 long
416  // Create dialog box
417  FXDialogBox* GenericParameterHelpDialog = new FXDialogBox(this, "Generic Parameters Help", GUIDesignDialogBox);
418  GenericParameterHelpDialog->setIcon(GUIIconSubSys::getIcon(ICON_APP_TABLE));
419  // set help text
420  std::ostringstream help;
421  help
422  << "- Generic Parameters are defined by a Key and a Value.\n"
423  << "- In Netedit can be defined using format key1=parameter1|key2=parameter2|...\n"
424  << " - Duplicated and empty Keys aren't valid.\n"
425  << " - Certain characters aren't allowed (\t\n\r@$%^&/|\\....)\n";
426  // Create label with the help text
427  new FXLabel(GenericParameterHelpDialog, help.str().c_str(), nullptr, GUIDesignLabelFrameInformation);
428  // Create horizontal separator
429  new FXHorizontalSeparator(GenericParameterHelpDialog, GUIDesignHorizontalSeparator);
430  // Create frame for OK Button
431  FXHorizontalFrame* myHorizontalFrameOKButton = new FXHorizontalFrame(GenericParameterHelpDialog, GUIDesignAuxiliarHorizontalFrame);
432  // Create Button Close (And two more horizontal frames to center it)
433  new FXHorizontalFrame(myHorizontalFrameOKButton, GUIDesignAuxiliarHorizontalFrame);
434  new FXButton(myHorizontalFrameOKButton, "OK\t\tclose", GUIIconSubSys::getIcon(ICON_ACCEPT), GenericParameterHelpDialog, FXDialogBox::ID_ACCEPT, GUIDesignButtonOK);
435  new FXHorizontalFrame(myHorizontalFrameOKButton, GUIDesignAuxiliarHorizontalFrame);
436  // Write Warning in console if we're in testing mode
437  WRITE_DEBUG("Opening Generic Parameter help dialog");
438  // create Dialog
439  GenericParameterHelpDialog->create();
440  // show in the given position
441  GenericParameterHelpDialog->show(PLACEMENT_CURSOR);
442  // refresh APP
443  getApp()->refresh();
444  // open as modal dialog (will block all windows until stop() or stopModal() is called)
445  getApp()->runModalFor(GenericParameterHelpDialog);
446  // Write Warning in console if we're in testing mode
447  WRITE_DEBUG("Closing Generic Parameter help dialog");
448  return 1;
449 }
450 
451 
453  SUMOSAXHandler(file),
454  myGenericParameterDialogParent(genericParameterDialogParent),
455  myMaximumNumberOfAttributesShown(false) {
456 }
457 
458 
460 
461 
462 void
464  // Obtain tag of element
465  SumoXMLTag tag = static_cast<SumoXMLTag>(element);
466  // only continue if tag is valid
467  if (tag != SUMO_TAG_NOTHING) {
468  // Call parse and build depending of tag
469  switch (tag) {
470  case SUMO_TAG_PARAM:
471  // Check that format of Generic Parameter is correct
472  if (!attrs.hasAttribute(SUMO_ATTR_KEY)) {
473  WRITE_WARNING("Key of Generic Parameter not defined");
474  } else if (!attrs.hasAttribute(SUMO_ATTR_VALUE)) {
475  WRITE_WARNING("Value of Generic Parameter not defined");
476  } else {
477  // obtain Key and value
478  std::string key = attrs.getString(SUMO_ATTR_KEY);
479  std::string value = attrs.getString(SUMO_ATTR_VALUE);
480  // check that parsed values are correct
482  if (key.size() == 0) {
483  WRITE_WARNING("Key of Generic Parameter cannot be empty");
484  } else {
485  WRITE_WARNING("Key '" + key + "' of Generic Parameter contains invalid characters");
486  }
488  WRITE_WARNING("Value '" + value + "'of Generic Parameter contains invalid characters");
489  } else {
490  // add generic parameter to vector of myGenericParameterDialogParent
492  }
493  }
494  break;
495  default:
496  break;
497  }
498  }
499 }
500 
501 // ---------------------------------------------------------------------------
502 // GNEGenericParameterDialog - methods
503 // ---------------------------------------------------------------------------
504 
505 GNEGenericParameterDialog::GNEGenericParameterDialog(GNEViewNet* viewNet, std::vector<std::pair<std::string, std::string> >* genericParameters) :
506  FXDialogBox(viewNet->getApp(), "Edit generic parameters", GUIDesignDialogBoxExplicitStretchable, 0, 0, 400, 300),
507  myViewNet(viewNet),
508  myCopyOfGenericParameters(*genericParameters) {
509  assert(genericParameters);
510  // set vehicle icon for this dialog
512  // create main frame
513  FXVerticalFrame* mainFrame = new FXVerticalFrame(this, GUIDesignAuxiliarFrame);
514  // create frame for Generic Parameters and options
515  FXHorizontalFrame* horizontalFrameGenericParametersAndOptions = new FXHorizontalFrame(mainFrame, GUIDesignAuxiliarFrame);
516  // create generic parameters values
517  myGenericParametersValues = new GenericParametersValues(horizontalFrameGenericParametersAndOptions, this, genericParameters);
518  // create generic parameters options
519  myGenericParametersOptions = new GenericParametersOptions(horizontalFrameGenericParametersAndOptions, this);
520  // add separator
521  new FXHorizontalSeparator(mainFrame, GUIDesignHorizontalSeparator);
522  // create dialog buttons bot centered
523  FXHorizontalFrame* buttonsFrame = new FXHorizontalFrame(mainFrame, GUIDesignHorizontalFrame);
524  new FXHorizontalFrame(buttonsFrame, GUIDesignAuxiliarHorizontalFrame);
525  myAcceptButton = new FXButton(buttonsFrame, "accept\t\tclose", GUIIconSubSys::getIcon(ICON_ACCEPT), this, MID_GNE_ADDITIONALDIALOG_BUTTONACCEPT, GUIDesignButtonAccept);
526  myCancelButton = new FXButton(buttonsFrame, "cancel\t\tclose", GUIIconSubSys::getIcon(ICON_CANCEL), this, MID_GNE_ADDITIONALDIALOG_BUTTONCANCEL, GUIDesignButtonCancel);
527  myResetButton = new FXButton(buttonsFrame, "reset\t\tclose", GUIIconSubSys::getIcon(ICON_RESET), this, MID_GNE_ADDITIONALDIALOG_BUTTONRESET, GUIDesignButtonReset);
528  new FXHorizontalFrame(buttonsFrame, GUIDesignAuxiliarHorizontalFrame);
529 }
530 
531 
533 
534 
535 long
536 GNEGenericParameterDialog::onCmdAccept(FXObject*, FXSelector, void*) {
537  // check if all edited generic parameters are valid
538  for (auto i = myGenericParametersValues->getGenericParameters()->begin(); i != myGenericParametersValues->getGenericParameters()->end(); i++) {
539  if (i->first.empty()) {
540  // write warning if netedit is running in testing mode
541  WRITE_DEBUG("Opening FXMessageBox of type 'warning'");
542  // open warning Box
543  FXMessageBox::warning(getApp(), MBOX_OK, "Empty Generic Parameter key", "%s", "Generic Parameters with empty keys aren't allowed");
544  // write warning if netedit is running in testing mode
545  WRITE_DEBUG("Closed FXMessageBox of type 'warning' with 'OK'");
546  return 1;
547  } else if (!SUMOXMLDefinitions::isValidGenericParameterKey(i->first)) {
548  // write warning if netedit is running in testing mode
549  WRITE_DEBUG("Opening FXMessageBox of type 'warning'");
550  // open warning Box
551  FXMessageBox::warning(getApp(), MBOX_OK, "Invalid Generic Parameter key", "%s", "There are keys of Generic Parameters with invalid characters");
552  // write warning if netedit is running in testing mode
553  WRITE_DEBUG("Closed FXMessageBox of type 'warning' with 'OK'");
554  return 1;
555  } else if (!SUMOXMLDefinitions::isValidGenericParameterValue(i->second)) {
556  // write warning if netedit is running in testing mode
557  WRITE_DEBUG("Opening FXMessageBox of type 'warning'");
558  // open warning Box
559  FXMessageBox::warning(getApp(), MBOX_OK, "Invalid Generic Parameter value", "%s", "There are values of Generic Parameters with invalid characters");
560  // write warning if netedit is running in testing mode
561  WRITE_DEBUG("Closed FXMessageBox of type 'warning' with 'OK'");
562 
563  return 1;
564  }
565  }
566  // now check if there is duplicates generic parameters
567  std::vector<std::pair<std::string, std::string> > sortedGenericParameters = myGenericParametersValues->getCopyOfGenericParameters();
568  std::sort(sortedGenericParameters.begin(), sortedGenericParameters.end());
569  for (auto i = sortedGenericParameters.begin(); i != sortedGenericParameters.end(); i++) {
570  if (((i + 1) != sortedGenericParameters.end()) && (i->first) == (i + 1)->first) {
571  // write warning if netedit is running in testing mode
572  WRITE_DEBUG("Opening FXMessageBox of type 'warning'");
573  // open warning Box
574  FXMessageBox::warning(getApp(), MBOX_OK, "Duplicated Generic Parameters", "%s", "Generic Parameters with the same Key aren't allowed");
575  // write warning if netedit is running in testing mode
576  WRITE_DEBUG("Closed FXMessageBox of type 'warning' with 'OK'");
577  return 1;
578  }
579  }
580  // all ok, then close dialog
581  getApp()->stopModal(this, TRUE);
582  return 1;
583 }
584 
585 
586 long
587 GNEGenericParameterDialog::onCmdCancel(FXObject*, FXSelector, void*) {
588  // restore copy of generic parameters
590  // Stop Modal
591  getApp()->stopModal(this, FALSE);
592  return 1;
593 }
594 
595 
596 long
597 GNEGenericParameterDialog::onCmdReset(FXObject*, FXSelector, void*) {
598  // simply restore copy of generic parameters and continue editing
600  return 1;
601 }
602 
603 /****************************************************************************/
const std::vector< std::pair< std::string, std::string > > myCopyOfGenericParameters
OutputDevice & writeAttr(const SumoXMLAttr attr, const T &val)
writes a named attribute
Definition: OutputDevice.h:256
void close()
Closes the device and removes it from the dictionary.
long onCmdSortGenericParameters(FXObject *, FXSelector, void *)
event when user press sort generic parameters button
SumoXMLTag
Numbers representing SUMO-XML - element names.
#define GUIDesignHorizontalFrame
Definition: GUIDesigns.h:212
std::vector< std::pair< std::string, std::string > > getCopyOfGenericParameters() const
get a copy of current edited generic parameters
bool isButtonInAddMode() const
check if remove button is in mode "add"
const std::vector< std::pair< std::string, std::string > > * getGenericParameters() const
get current edited generic parameters
attribute removed
Definition: GUIAppEnum.h:535
FXButton * myAcceptButton
accept button
long onCmdAccept(FXObject *, FXSelector, void *)
long onCmdButtonPress(FXObject *, FXSelector, void *)
event when user press a remove (or add) button
#define GUIDesignButtonCancel
Cancel Button.
Definition: GUIDesigns.h:102
long onCmdCancel(FXObject *, FXSelector, void *)
event after press cancel button
long onCmdHelpGenericParameter(FXObject *, FXSelector, void *)
event when user press help generic parameters button
FXString gCurrentFolder
The folder used as last.
SAX-handler base for SUMO-files.
static bool runParser(GenericSAXHandler &handler, const std::string &file, const bool isNet=false)
Runs the given handler on the given file; returns if everything&#39;s ok.
Definition: XMLSubSys.cpp:113
static bool isValidGenericParameterKey(const std::string &value)
whether the given string is a valid key for a generic parameter
static FXString getFilename2Write(FXWindow *parent, const FXString &header, const FXString &extension, FXIcon *icon, FXString &currentFolder)
Returns the file name to write.
Definition: MFXUtils.cpp:84
virtual bool hasAttribute(int id) const =0
Returns the information whether the named (by its enum-value) attribute is within the current list...
void copyValues(const GenericParameterRow &other)
copy values of other parameter Row
#define WRITE_WARNING(msg)
Definition: MsgHandler.h:241
#define GUIDesignButtonRectangular100x23
button rectangular with thick and raise frame with a size of 100x23
Definition: GUIDesigns.h:69
virtual std::string getString(int id) const =0
Returns the string-value of the named (by its enum-value) attribute.
#define GUIDesignDialogBoxExplicitStretchable
design for dialog box with specift width and height that can be stretched (But not shrinked) ...
Definition: GUIDesigns.h:425
GNEGenericParameterDialog * myGenericParameterDialogParent
pointer to genericParameterDialog parent
Dialog for edit generic parameters.
FXLabel * myKeyLabel
label for key (its neccesary because has to be resized in every onPaint() iteration) ...
Generic parameters dialog sort.
Definition: GUIAppEnum.h:918
#define GUIDesignAuxiliarFrame
design for auxiliar (Without borders) frames used to pack another frames extended in all directions ...
Definition: GUIDesigns.h:258
static bool isValidGenericParameterValue(const std::string &value)
whether the given string is a valid value for a generic parameter
long onCmdSetAttribute(FXObject *, FXSelector, void *)
event when user change an attribute
#define GUIDesignHorizontalSeparator
Definition: GUIDesigns.h:298
#define GUIDesignTextField
Definition: GUIDesigns.h:34
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition: ToString.h:49
Encapsulated SAX-Attributes.
help button
Definition: GUIAppEnum.h:400
Generic parameters dialog clear.
Definition: GUIAppEnum.h:916
bool writeXMLHeader(const std::string &rootElement, const std::string &schemaFile, std::map< SumoXMLAttr, std::string > attrs=std::map< SumoXMLAttr, std::string >())
Writes an XML header with optional configuration.
parameter associated to a certain key
#define GUIDesignAuxiliarHorizontalFrame
design for auxiliar (Without borders) horizontal frame used to pack another frames ...
Definition: GUIDesigns.h:261
FXDEFMAP(GNEGenericParameterDialog) GNEGenericParameterDialogMap[]
#define GUIDesignButtonReset
Reset Button.
Definition: GUIDesigns.h:105
GNEViewNet * myViewNet
to viewNet
std::vector< GenericParameterRow * > myGenericParameterRows
vector with the GenericParameterRows
long onCmdClearGenericParameters(FXObject *, FXSelector, void *)
event when user press clear generic parameters button
long onCmdSaveGenericParameters(FXObject *, FXSelector, void *)
event when user press save generic parameters button
#define WRITE_DEBUG(msg)
Definition: MsgHandler.h:248
#define GUIDesignLabelFrameInformation
label extended over frame without thick and with text justify to left, used to show information in fr...
Definition: GUIDesigns.h:184
void addGenericParameter(std::pair< std::string, std::string > newGenericParameter)
add a single generic parameter
#define GUIDesignGroupBoxFrameFill
Group box design extended over frame (X and Y)
Definition: GUIDesigns.h:230
#define GUIDesignButtonAccept
Accept Button.
Definition: GUIDesigns.h:99
FXButton * myResetButton
cancel button
#define GUIDesignButtonIcon
button only with icon (23x23)
Definition: GUIDesigns.h:63
#define GUIDesignLabelCenterThick
label extended over frame with thick and with text justify to center and height of 23 ...
Definition: GUIDesigns.h:163
#define GUIDesignTextFieldNCol
Num of column of text field.
Definition: GUIDesigns.h:46
GenericParametersOptions * myGenericParametersOptions
pointer to generic parameters options
GenericParameterRow(GenericParametersValues *genericParametersValues, FXVerticalFrame *verticalFrameParent)
constructor
FXVerticalFrame * myVerticalFrameRow
vertical frame in which rows are placed
#define GUIDesignDialogBox
Definition: GUIDesigns.h:410
GNEGenericParameterDialog * myGenericParameterDialogParent
pointer to Shape Frame Parent
Generic parameters dialog load.
Definition: GUIAppEnum.h:912
static OutputDevice & getDevice(const std::string &name)
Returns the described OutputDevice.
Generic parameters dialog save.
Definition: GUIAppEnum.h:914
FXButton * myCancelButton
cancel button
GenericParametersValues * myGenericParametersValues
pointer to generic parameters values
std::vector< std::pair< std::string, std::string > > * myGenericParameters
edited generic parameters
void enableRow(const std::string &parameter, const std::string &value) const
enable rlow
attribute edited
Definition: GUIAppEnum.h:537
#define GUIDesignButtonOK
Definition: GUIDesigns.h:96
GNEGenericParameterHandler(GNEGenericParameterDialog *genericParameterDialogParent, const std::string &file)
Constructor.
Static storage of an output device and its base (abstract) implementation.
Definition: OutputDevice.h:64
bool closeTag(const std::string &comment="")
Closes the most recently opened tag and optionally adds a comment.
#define GUIDesignLabelThick100
label with thick, text justify to left and size of 100x23
Definition: GUIDesigns.h:187
void setGenericParameters(const std::vector< std::pair< std::string, std::string > > &newGenericParameters)
set generic parameters
long onCmdReset(FXObject *, FXSelector, void *)
event after press reset button
void myStartElement(int element, const SUMOSAXAttributes &attrs)
Called on the opening of a tag;.
#define WRITE_MESSAGE(msg)
Definition: MsgHandler.h:242
long onCmdLoadGenericParameters(FXObject *, FXSelector, void *)
static FXIcon * getIcon(GUIIcon which)
returns a icon previously defined in the enum GUIIcon
GNEGenericParameterDialog * myGenericParameterDialogParent
pointer to Shape Frame Parent
OutputDevice & openTag(const std::string &xmlElement)
Opens an XML tag.
#define GUIDesignGroupBoxFrame100
Group box design for elements of width 100.
Definition: GUIDesigns.h:233