internal void SaveElement(ElementSave elementSave) { if (elementSave.IsSourceFileMissing) { MessageBox.Show("Cannot save " + elementSave + " because its source file is missing"); } else { bool succeeded = true; UndoManager.Self.RecordUndo(); bool doesProjectNeedToSave = false; bool shouldSave = AskUserForProjectNameIfNecessary(out doesProjectNeedToSave); if (doesProjectNeedToSave) { SaveProject(); } if (shouldSave) { PluginManager.Self.BeforeElementSave(elementSave); string fileName = elementSave.GetFullPathXmlFile(); // if it's readonly, let's warn the user bool isReadOnly = IsFileReadOnly(fileName); if (isReadOnly) { ShowReadOnlyDialog(fileName); } else { FileWatchLogic.Self.IgnoreNextChangeOn(fileName); const int maxNumberOfTries = 5; const int msBetweenSaves = 100; int numberOfTimesTried = 0; succeeded = false; Exception exception = null; while (numberOfTimesTried < maxNumberOfTries) { try { elementSave.Save(fileName); succeeded = true; break; } catch (Exception e) { exception = e; System.Threading.Thread.Sleep(msBetweenSaves); numberOfTimesTried++; } } if (succeeded == false) { MessageBox.Show("Unknown error trying to save the file\n\n" + fileName + "\n\n" + exception.ToString()); succeeded = false; } } if (succeeded) { OutputManager.Self.AddOutput("Saved " + elementSave + " to " + fileName); PluginManager.Self.AfterElementSave(elementSave); } } PluginManager.Self.Export(elementSave); } }