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>
34 
36 
37 
38 // ===========================================================================
39 // FOX callback mapping
40 // ===========================================================================
41 
42 FXDEFMAP(GNEGenericParameterDialog) GNEGenericParameterDialogMap[] = {
46  FXMAPFUNC(SEL_CHORE, FXDialogBox::ID_CANCEL, GNEGenericParameterDialog::onCmdCancel),
47  FXMAPFUNC(SEL_TIMEOUT, FXDialogBox::ID_CANCEL, GNEGenericParameterDialog::onCmdCancel),
48  FXMAPFUNC(SEL_COMMAND, FXDialogBox::ID_CANCEL, GNEGenericParameterDialog::onCmdCancel),
49  FXMAPFUNC(SEL_CLOSE, 0, GNEGenericParameterDialog::onCmdCancel),
50 };
51 
52 FXDEFMAP(GNEGenericParameterDialog::GenericParametersValues) GenericParametersValuesMap[] = {
56 };
57 
58 FXDEFMAP(GNEGenericParameterDialog::GenericParametersOptions) GenericParametersOptionsMap[] = {
64 };
65 
66 // Object implementation
67 FXIMPLEMENT(GNEGenericParameterDialog, FXDialogBox, GNEGenericParameterDialogMap, ARRAYNUMBER(GNEGenericParameterDialogMap))
68 FXIMPLEMENT(GNEGenericParameterDialog::GenericParametersValues, FXGroupBox, GenericParametersValuesMap, ARRAYNUMBER(GenericParametersValuesMap))
69 FXIMPLEMENT(GNEGenericParameterDialog::GenericParametersOptions, FXGroupBox, GenericParametersOptionsMap, ARRAYNUMBER(GenericParametersOptionsMap))
70 
71 // ===========================================================================
72 // member method definitions
73 // ===========================================================================
74 
75 // ---------------------------------------------------------------------------
76 // GNEGenericParameterDialog::GenericParametersValues - methods
77 // ---------------------------------------------------------------------------
78 
79 GNEGenericParameterDialog::GenericParametersValues::GenericParametersValues(FXHorizontalFrame* frame, GNEGenericParameterDialog* genericParameterDialogParent, std::vector<std::pair<std::string, std::string> >* genericParameters) :
80  FXGroupBox(frame, "Generic Parameters", GUIDesignGroupBoxFrameFill),
81  myGenericParameterDialogParent(genericParameterDialogParent),
82  myGenericParameters(genericParameters) {
83  // create labels for keys and values
84  FXHorizontalFrame* horizontalFrameLabels = new FXHorizontalFrame(this, GUIDesignAuxiliarHorizontalFrame);
85  myKeyLabel = new FXLabel(horizontalFrameLabels, "key", 0, GUIDesignLabelThick100);
86  new FXLabel(horizontalFrameLabels, "value", 0, GUIDesignLabelCenterThick);
87  // create scroll windows
88  FXScrollWindow* scrollWindow = new FXScrollWindow(this, LAYOUT_FILL);
89  // create vertical frame for rows
90  myVerticalFrameRow = new FXVerticalFrame(scrollWindow, GUIDesignAuxiliarFrame);
91  // update values
92  updateValues();
93 }
94 
95 
97 
98 
99 void
101  // first show the correct number of rows
102  while ((myGenericParameters->size() + 1) < myGenericParameterRows.size()) {
103  delete myGenericParameterRows.back();
104  myGenericParameterRows.pop_back();
105  }
106  while ((myGenericParameters->size() + 1) > myGenericParameterRows.size()) {
108  }
109  // fill rows
110  for (int i = 0; i < (int)myGenericParameters->size(); i++) {
111  myGenericParameterRows.at(i)->enableRow(myGenericParameters->at(i).first, myGenericParameters->at(i).second);
112  }
113  // set last myGenericParameterRows with the add button
114  myGenericParameterRows.back()->toogleAddButton();
115 }
116 
117 
118 const std::vector<std::pair<std::string, std::string> >*
120  return myGenericParameters;
121 }
122 
123 
124 std::vector<std::pair<std::string, std::string> >
126  return *myGenericParameters;
127 }
128 
129 
130 void
131 GNEGenericParameterDialog::GenericParametersValues::setGenericParameters(const std::vector<std::pair<std::string, std::string> >& newGenericParameters) {
132  *myGenericParameters = newGenericParameters;
133  // update values
134  updateValues();
135 }
136 
137 
138 void
139 GNEGenericParameterDialog::GenericParametersValues::addGenericParameter(std::pair<std::string, std::string> newGenericParameter) {
140  myGenericParameters->push_back(newGenericParameter);
141  // update values
142  updateValues();
143 }
144 
145 
146 void
148  myGenericParameters->clear();
149  updateValues();
150 }
151 
152 
153 long
155  // size of key label has to be updated in every interation
156  if (myGenericParameterRows.size() > 0) {
157  myKeyLabel->setWidth(myGenericParameterRows.front()->keyField->getWidth());
158  }
159  return FXGroupBox::onPaint(o, f, p);
160 }
161 
162 
163 long
165  // find what value was changed
166  for (int i = 0; i < (int)myGenericParameterRows.size(); i++) {
167  if (myGenericParameterRows.at(i)->keyField == obj) {
168  // change key of Generic Parameter
169  myGenericParameters->at(i).first = myGenericParameterRows.at(i)->keyField->getText().text();
170  // change color of text field depending if key is valid or empty
172  myGenericParameterRows.at(i)->keyField->setTextColor(FXRGB(0, 0, 0));
173  } else {
174  myGenericParameterRows.at(i)->keyField->setTextColor(FXRGB(255, 0, 0));
175  myGenericParameterRows.at(i)->keyField->killFocus();
176  }
177  } else if (myGenericParameterRows.at(i)->valueField == obj) {
178  // change value of Generic Parameter
179  myGenericParameters->at(i).second = myGenericParameterRows.at(i)->valueField->getText().text();
180  // change color of text field depending if attribute is valid
182  myGenericParameterRows.at(i)->valueField->setTextColor(FXRGB(0, 0, 0));
183  } else {
184  myGenericParameterRows.at(i)->valueField->setTextColor(FXRGB(255, 0, 0));
185  myGenericParameterRows.at(i)->valueField->killFocus();
186  }
187  }
188  }
189  return 1;
190 }
191 
192 
193 long
195  // first check if add button was pressed
196  if (myGenericParameterRows.back()->button == obj) {
197  // create new generic parameter
198  myGenericParameters->push_back(std::make_pair("", ""));
199  // update values and finish
200  updateValues();
201  return 1;
202  } else {
203  // in other case, button press was a "remove button". Find id and remove the Generic Parameter
204  for (int i = 0; i < (int)myGenericParameterRows.size(); i++) {
205  if (myGenericParameterRows.at(i)->button == obj && i < (int)myGenericParameters->size()) {
206  // remove generic parameter
207  myGenericParameters->erase(myGenericParameters->begin() + i);
208  // update values and finish
209  updateValues();
210  return 1;
211  }
212  }
213  }
214  // Nothing to do
215  return 1;
216 }
217 
218 
220  horizontalFrame = new FXHorizontalFrame(verticalFrameParent, GUIDesignAuxiliarHorizontalFrame);
221  keyField = new FXTextField(horizontalFrame, GUIDesignTextFieldNCol, genericParametersValues, MID_GNE_SET_ATTRIBUTE, GUIDesignTextField);
222  valueField = new FXTextField(horizontalFrame, GUIDesignTextFieldNCol, genericParametersValues, MID_GNE_SET_ATTRIBUTE, GUIDesignTextField);
223  button = new FXButton(horizontalFrame, "", GUIIconSubSys::getIcon(ICON_REMOVE), genericParametersValues, MID_GNE_REMOVE_ATTRIBUTE, GUIDesignButtonIcon);
224  // only create elements if vertical frame was previously created
225  if (verticalFrameParent->id()) {
226  horizontalFrame->create();
227  }
228  // by defaults rows are disabled
229  disableRow();
230 }
231 
232 
234  // simply delete horizontalFrame (rest of elements will be automatic deleted due they are childs of horizontal frame)
235  delete horizontalFrame;
236 }
237 
238 
239 void
241  // hide all
242  keyField->setText("");
243  keyField->disable();
244  valueField->setText("");
245  valueField->disable();
246  button->disable();
247  button->setIcon(GUIIconSubSys::getIcon(ICON_REMOVE));
248 }
249 
250 
251 void
252 GNEGenericParameterDialog::GenericParametersValues::GenericParameterRow::enableRow(const std::string& parameter, const std::string& value) const {
253  // restore color and enable key field
254  keyField->setText(parameter.c_str());
255  if (parameter.empty() || SUMOXMLDefinitions::isValidGenericParameterKey(parameter)) {
256  keyField->setTextColor(FXRGB(0, 0, 0));
257  } else {
258  keyField->setTextColor(FXRGB(255, 0, 0));
259  }
260  keyField->enable();
261  // restore color and enable value field
262  valueField->setText(value.c_str());
264  valueField->setTextColor(FXRGB(0, 0, 0));
265  } else {
266  valueField->setTextColor(FXRGB(255, 0, 0));
267  }
268  valueField->enable();
269  // enable button and set icon remove
270  button->enable();
271  button->setIcon(GUIIconSubSys::getIcon(ICON_REMOVE));
272 }
273 
274 
275 void
277  // clear and disable parameter and value fields
278  keyField->setText("");
279  keyField->disable();
280  valueField->setText("");
281  valueField->disable();
282  // enable remove button and set "add" icon and focus
283  button->enable();
284  button->setIcon(GUIIconSubSys::getIcon(ICON_ADD));
285  button->setFocus();
286 }
287 
288 
289 bool
291  return (button->getIcon() == GUIIconSubSys::getIcon(ICON_ADD));
292 }
293 
294 
295 void
297  keyField->setText(other.keyField->getText());
298  valueField->setText(other.valueField->getText());
299 }
300 
301 // ---------------------------------------------------------------------------
302 // GNEGenericParameterDialog::GenericParametersOptions - methods
303 // ---------------------------------------------------------------------------
304 
306  FXGroupBox(frame, "Options", GUIDesignGroupBoxFrame100),
307  myGenericParameterDialogParent(genericParameterDialogParent) {
308  // create buttons
314 }
315 
316 
318 
319 
320 long
322  // get the Additional file name
323  FXFileDialog opendialog(this, "Open Generic Parameter Template");
324  opendialog.setIcon(GUIIconSubSys::getIcon(ICON_GREENVEHICLE));
325  opendialog.setSelectMode(SELECTFILE_EXISTING);
326  opendialog.setPatternList("Generic Parameter Template files (*.xml)\nAll files (*)");
327  if (gCurrentFolder.length() != 0) {
328  opendialog.setDirectory(gCurrentFolder);
329  }
330  if (opendialog.execute()) {
331  gCurrentFolder = opendialog.getDirectory();
332  std::string file = opendialog.getFilename().text();
333  // save current number of generic parameters
334  int numberOfGenericParametersbeforeLoad = (int)myGenericParameterDialogParent->myGenericParametersValues->getGenericParameters()->size();
335  // Create additional handler and run parser
337  if (!XMLSubSys::runParser(handler, file, false)) {
338  WRITE_MESSAGE("Loading of Generic Parameters From " + file + " failed.");
339  }
340  // show loaded attributes
341  WRITE_MESSAGE("Loaded " + toString((int)myGenericParameterDialogParent->myGenericParametersValues->getGenericParameters()->size() - numberOfGenericParametersbeforeLoad) + " Generic Parameters.");
342  // update values
344  }
345  return 1;
346 }
347 
348 
349 long
351  // obtain file to save generic parameters
352  FXString file = MFXUtils::getFilename2Write(this,
353  "Select name of the Generic Parameter Template file", ".xml",
356  if (file == "") {
357  // None generic parameter file was selected, then stop function
358  return 1;
359  } else {
360  OutputDevice& device = OutputDevice::getDevice(file.text());
361  device.writeXMLHeader("genericParameter", "genericparameter_file.xsd");
362  // iterate over all generic parameters and save it in the filename
364  device.openTag(SUMO_TAG_PARAM);
365  device.writeAttr(SUMO_ATTR_KEY, i->first);
366  device.writeAttr(SUMO_ATTR_VALUE, i->second);
367  device.closeTag();
368  }
369  device.close();
370  }
371  return 1;
372 }
373 
374 
375 long
377  // simply clear generic parameters from GenericParametersValues
379  return 1;
380 }
381 
382 
383 long
385  std::vector<std::pair<std::string, std::string> > genericParametersNoEmpty;
386  std::vector<std::string> valuesEmpty;
387  // first extract empty values
389  if (!i->first.empty()) {
390  genericParametersNoEmpty.push_back(*i);
391  } else if (i->first.empty() && !i->second.empty()) {
392  valuesEmpty.push_back(i->second);
393  }
394  }
395  // now sort non-empty generic parameters
396  std::sort(genericParametersNoEmpty.begin(), genericParametersNoEmpty.end());
397  // add values without key
398  for (auto i : valuesEmpty) {
399  genericParametersNoEmpty.push_back(std::make_pair("", i));
400  }
401  // fill genericParametersNoEmpty with empty values
402  while (genericParametersNoEmpty.size() < myGenericParameterDialogParent->myGenericParametersValues->getGenericParameters()->size()) {
403  genericParametersNoEmpty.push_back(std::make_pair("", ""));
404  }
405  // finally replace generic parameters in myGenericParametersValues with genericParametersNoEmpty
407  // update values
409  return 1;
410 }
411 
412 
413 long
415  // Create dialog box
416  FXDialogBox* GenericParameterHelpDialog = new FXDialogBox(this, "Generic Parameters Help", GUIDesignDialogBox);
417  GenericParameterHelpDialog->setIcon(GUIIconSubSys::getIcon(ICON_APP_TABLE));
418  // set help text
419  std::ostringstream help;
420  help
421  << "- Generic Parameters are defined by a Key and a Value.\n"
422  << "- In Netedit can be defined using format key1=parameter1|key2=parameter2|...\n"
423  << " - Duplicated and empty Keys aren't valid.\n"
424  << " - Certain characters aren't allowed (\t\n\r@$%^&/|\\....)\n";
425  // Create label with the help text
426  new FXLabel(GenericParameterHelpDialog, help.str().c_str(), 0, GUIDesignLabelFrameInformation);
427  // Create horizontal separator
428  new FXHorizontalSeparator(GenericParameterHelpDialog, GUIDesignHorizontalSeparator);
429  // Create frame for OK Button
430  FXHorizontalFrame* myHorizontalFrameOKButton = new FXHorizontalFrame(GenericParameterHelpDialog, GUIDesignAuxiliarHorizontalFrame);
431  // Create Button Close (And two more horizontal frames to center it)
432  new FXHorizontalFrame(myHorizontalFrameOKButton, GUIDesignAuxiliarHorizontalFrame);
433  new FXButton(myHorizontalFrameOKButton, "OK\t\tclose", GUIIconSubSys::getIcon(ICON_ACCEPT), GenericParameterHelpDialog, FXDialogBox::ID_ACCEPT, GUIDesignButtonOK);
434  new FXHorizontalFrame(myHorizontalFrameOKButton, GUIDesignAuxiliarHorizontalFrame);
435  // Write Warning in console if we're in testing mode
436  WRITE_DEBUG("Opening Generic Parameter help dialog");
437  // create Dialog
438  GenericParameterHelpDialog->create();
439  // show in the given position
440  GenericParameterHelpDialog->show(PLACEMENT_CURSOR);
441  // refresh APP
442  getApp()->refresh();
443  // open as modal dialog (will block all windows until stop() or stopModal() is called)
444  getApp()->runModalFor(GenericParameterHelpDialog);
445  // Write Warning in console if we're in testing mode
446  WRITE_DEBUG("Closing Generic Parameter help dialog");
447  return 1;
448 }
449 
450 
452  SUMOSAXHandler(file),
453  myGenericParameterDialogParent(genericParameterDialogParent),
454  myMaximumNumberOfAttributesShown(false) {
455 }
456 
457 
459 
460 
461 void
463  // Obtain tag of element
464  SumoXMLTag tag = static_cast<SumoXMLTag>(element);
465  // only continue if tag is valid
466  if (tag != SUMO_TAG_NOTHING) {
467  // Call parse and build depending of tag
468  switch (tag) {
469  case SUMO_TAG_PARAM:
470  // Check that format of Generic Parameter is correct
471  if (!attrs.hasAttribute(SUMO_ATTR_KEY)) {
472  WRITE_WARNING("Key of Generic Parameter not defined");
473  } else if (!attrs.hasAttribute(SUMO_ATTR_VALUE)) {
474  WRITE_WARNING("Value of Generic Parameter not defined");
475  } else {
476  // obtain Key and value
477  std::string key = attrs.getString(SUMO_ATTR_KEY);
478  std::string value = attrs.getString(SUMO_ATTR_VALUE);
479  // check that parsed values are correct
481  if (key.size() == 0) {
482  WRITE_WARNING("Key of Generic Parameter cannot be empty");
483  } else {
484  WRITE_WARNING("Key '" + key + "' of Generic Parameter contains invalid characters");
485  }
487  WRITE_WARNING("Value '" + value + "'of Generic Parameter contains invalid characters");
488  } else {
489  // add generic parameter to vector of myGenericParameterDialogParent
491  }
492  }
493  break;
494  default:
495  break;
496  }
497  }
498 }
499 
500 // ---------------------------------------------------------------------------
501 // GNEGenericParameterDialog - methods
502 // ---------------------------------------------------------------------------
503 
504 GNEGenericParameterDialog::GNEGenericParameterDialog(GNEViewNet* viewNet, std::vector<std::pair<std::string, std::string> >* genericParameters) :
505  FXDialogBox(viewNet->getApp(), "Edit generic parameters", GUIDesignDialogBoxExplicitStretchable, 0, 0, 400, 300),
506  myViewNet(viewNet),
507  myCopyOfGenericParameters(*genericParameters) {
508  assert(genericParameters);
509  // set vehicle icon for this dialog
511  // create main frame
512  FXVerticalFrame* mainFrame = new FXVerticalFrame(this, GUIDesignAuxiliarFrame);
513  // create frame for Generic Parameters and options
514  FXHorizontalFrame* horizontalFrameGenericParametersAndOptions = new FXHorizontalFrame(mainFrame, GUIDesignAuxiliarFrame);
515  // create generic parameters values
516  myGenericParametersValues = new GenericParametersValues(horizontalFrameGenericParametersAndOptions, this, genericParameters);
517  // create generic parameters options
518  myGenericParametersOptions = new GenericParametersOptions(horizontalFrameGenericParametersAndOptions, this);
519  // add separator
520  new FXHorizontalSeparator(mainFrame, GUIDesignHorizontalSeparator);
521  // create dialog buttons bot centered
522  FXHorizontalFrame* buttonsFrame = new FXHorizontalFrame(mainFrame, GUIDesignHorizontalFrame);
523  new FXHorizontalFrame(buttonsFrame, GUIDesignAuxiliarHorizontalFrame);
524  myAcceptButton = new FXButton(buttonsFrame, "accept\t\tclose", GUIIconSubSys::getIcon(ICON_ACCEPT), this, MID_GNE_ADDITIONALDIALOG_BUTTONACCEPT, GUIDesignButtonAccept);
525  myCancelButton = new FXButton(buttonsFrame, "cancel\t\tclose", GUIIconSubSys::getIcon(ICON_CANCEL), this, MID_GNE_ADDITIONALDIALOG_BUTTONCANCEL, GUIDesignButtonCancel);
526  myResetButton = new FXButton(buttonsFrame, "reset\t\tclose", GUIIconSubSys::getIcon(ICON_RESET), this, MID_GNE_ADDITIONALDIALOG_BUTTONRESET, GUIDesignButtonReset);
527  new FXHorizontalFrame(buttonsFrame, GUIDesignAuxiliarHorizontalFrame);
528 }
529 
530 
532 
533 
534 long
535 GNEGenericParameterDialog::onCmdAccept(FXObject*, FXSelector, void*) {
536  // check if all edited generic parameters are valid
537  for (auto i = myGenericParametersValues->getGenericParameters()->begin(); i != myGenericParametersValues->getGenericParameters()->end(); i++) {
538  if (i->first.empty()) {
539  // write warning if netedit is running in testing mode
540  WRITE_DEBUG("Opening FXMessageBox of type 'warning'");
541  // open warning Box
542  FXMessageBox::warning(getApp(), MBOX_OK, "Empty Generic Parameter key", "%s", "Generic Parameters with empty keys aren't allowed");
543  // write warning if netedit is running in testing mode
544  WRITE_DEBUG("Closed FXMessageBox of type 'warning' with 'OK'");
545  return 1;
546  } else if (!SUMOXMLDefinitions::isValidGenericParameterKey(i->first)) {
547  // write warning if netedit is running in testing mode
548  WRITE_DEBUG("Opening FXMessageBox of type 'warning'");
549  // open warning Box
550  FXMessageBox::warning(getApp(), MBOX_OK, "Invalid Generic Parameter key", "%s", "There are keys of Generic Parameters with invalid characters");
551  // write warning if netedit is running in testing mode
552  WRITE_DEBUG("Closed FXMessageBox of type 'warning' with 'OK'");
553  return 1;
554  } else if (!SUMOXMLDefinitions::isValidGenericParameterValue(i->second)) {
555  // write warning if netedit is running in testing mode
556  WRITE_DEBUG("Opening FXMessageBox of type 'warning'");
557  // open warning Box
558  FXMessageBox::warning(getApp(), MBOX_OK, "Invalid Generic Parameter value", "%s", "There are values of Generic Parameters with invalid characters");
559  // write warning if netedit is running in testing mode
560  WRITE_DEBUG("Closed FXMessageBox of type 'warning' with 'OK'");
561 
562  return 1;
563  }
564  }
565  // now check if there is duplicates generic parameters
566  std::vector<std::pair<std::string, std::string> > sortedGenericParameters = myGenericParametersValues->getCopyOfGenericParameters();
567  std::sort(sortedGenericParameters.begin(), sortedGenericParameters.end());
568  for (auto i = sortedGenericParameters.begin(); i != sortedGenericParameters.end(); i++) {
569  if (((i + 1) != sortedGenericParameters.end()) && (i->first) == (i + 1)->first) {
570  // write warning if netedit is running in testing mode
571  WRITE_DEBUG("Opening FXMessageBox of type 'warning'");
572  // open warning Box
573  FXMessageBox::warning(getApp(), MBOX_OK, "Duplicated Generic Parameters", "%s", "Generic Parameters with the same Key aren't allowed");
574  // write warning if netedit is running in testing mode
575  WRITE_DEBUG("Closed FXMessageBox of type 'warning' with 'OK'");
576  return 1;
577  }
578  }
579  // all ok, then close dialog
580  getApp()->stopModal(this, TRUE);
581  return 1;
582 }
583 
584 
585 long
586 GNEGenericParameterDialog::onCmdCancel(FXObject*, FXSelector, void*) {
587  // restore copy of generic parameters
589  // Stop Modal
590  getApp()->stopModal(this, FALSE);
591  return 1;
592 }
593 
594 
595 long
596 GNEGenericParameterDialog::onCmdReset(FXObject*, FXSelector, void*) {
597  // simply restore copy of generic parameters and continue editing
599  return 1;
600 }
601 
602 /****************************************************************************/
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:533
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:242
#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:422
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:908
#define GUIDesignAuxiliarFrame
design for auxiliar (Without borders) frames used to pack another frames extended in all directions ...
Definition: GUIDesigns.h:255
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:295
#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:906
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:258
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:249
#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:407
GNEGenericParameterDialog * myGenericParameterDialogParent
pointer to Shape Frame Parent
Generic parameters dialog load.
Definition: GUIAppEnum.h:902
static OutputDevice & getDevice(const std::string &name)
Returns the described OutputDevice.
Generic parameters dialog save.
Definition: GUIAppEnum.h:904
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:535
#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:243
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