+
+
+
+/**
+ * Called by the system when the File->Load menu command is selected
+ * @param sender the sender object
+ * @param selector message type and id
+ * @param data event related data
+ * @return
+ */
+long GUI::onLoad(FXObject *sender, FXSelector selector, void *data)
+{
+ FXString loadFilename = FXFileDialog::getOpenFilename(this, "Load file...", ".");
+
+ if (!loadFilename.empty())
+ {
+ // load from disk
+ loadLSystem(loadFilename.text());
+ }
+}
+
+
+
+/**
+ * Called by the system when the File->Save menu command is selected
+ * @param sender the sender object
+ * @param selector message type and id
+ * @param data event related data
+ * @return
+ */
+long GUI::onSave(FXObject *sender, FXSelector selector, void *data)
+{
+ FXString saveFilename = FXFileDialog::getSaveFilename(this, "Save file...", ".");
+
+ if (FXStat::exists(saveFilename))
+ {
+ // the file already exists
+
+ if (MBOX_CLICKED_YES == FXMessageBox::question(this, MBOX_YES_NO, "Overwrite file", "Overwrite existing file?"))
+ {
+ // overwrite file
+ _lsystemParameters.save(_lsystem, saveFilename.text());
+ }
+ }
+ else
+ {
+ // save to file
+ _lsystemParameters.save(_lsystem, saveFilename.text());
+ }
+}
+
+
+
+/**
+ * Called by the system when the close button or the File->Quit command item is selected
+ * @param sender the sender object
+ * @param selector message type and id
+ * @param data event related data
+ * @return
+ */
+long GUI::onQuit(FXObject *sender, FXSelector selector, void *data)
+{
+ getApp()->exit(0);
+
+ return 1;
+}
+
+
+
+/**
+ * Called by the system when the Help->Usage menu command is selected
+ * @param sender the sender object
+ * @param selector message type and id
+ * @param data event related data
+ * @return
+ */
+long GUI::onHelpUsage(FXObject *sender, FXSelector selector, void *data)
+{
+ _helpUsageMessageBox->show(PLACEMENT_OWNER);
+}
+
+
+
+/**
+ * Called by the system when the Help->Rules menu command is selected
+ * @param sender the sender object
+ * @param selector message type and id
+ * @param data event related data
+ * @return
+ */
+long GUI::onHelpRules(FXObject *sender, FXSelector selector, void *data)
+{
+ _helpRulesMessageBox->show(PLACEMENT_OWNER);
+}
+
+
+
+/**
+ * Load L-system from file and sync with GUI
+ * @param filename path of the L-system file
+ */
+void GUI::loadLSystem(string filename)
+{
+ // load from file
+ _lsystemParameters.load(_lsystem, filename);
+
+
+ // sync with GUI
+
+ // axiom
+ _axiomTextField->setText(_lsystem->getAxiom().getContent().c_str());
+
+ // rules
+ rulemap rules = _lsystem->getRules().getRules();
+ string rulesString;
+ for (rulemap::iterator it = rules.begin(); it != rules.end(); ++it)
+ {
+ rulesString += it->second.toString();
+ rulesString += '\n';
+ }
+ _rulesText->setText(rulesString.c_str(), rulesString.size());
+
+ // angle
+ _angleRealSpinner->setValue(_lsystem->getAngle());
+
+ // depth
+ _depthSpinner->setValue(_lsystem->getDepth());
+
+ // segment diameter
+ _diameterRealSpinner->setValue(_lsystem->getDiameter());
+
+ // segment diameter factor
+ _diameterFactorRealSpinner->setValue(_lsystem->getDiameterFactor());
+}