private void saveButton_Click(object sender, EventArgs e) { @enum.Name = enumNameTextBox.Text; var values = new Dictionary <string, long>(); foreach (var row in enumDataGridView.Rows.Cast <DataGridViewRow>().Where(r => r.IsNewRow == false)) { if (!long.TryParse(Convert.ToString(row.Cells[0].Value), out var itemValue)) { continue; } var itemName = Convert.ToString(row.Cells[1].Value); values.Add(itemName, itemValue); } @enum.SetData(enumFlagCheckBox.Checked, enumUnderlyingTypeSizeComboBox.SelectedValue, values); }
public void Load(Stream input, ILogger logger) { Contract.Requires(input != null); Contract.Requires(logger != null); using (var archive = new ZipArchive(input, ZipArchiveMode.Read)) { var dataEntry = archive.GetEntry(DataFileName); if (dataEntry == null) { throw new FormatException(); } using (var entryStream = dataEntry.Open()) { var document = XDocument.Load(entryStream); if (document.Root?.Element(XmlClassesElement) == null) { throw new FormatException("The data has not the correct format."); } uint.TryParse(document.Root.Attribute(XmlVersionAttribute)?.Value, out var fileVersion); if ((fileVersion & FileVersionCriticalMask) > (FileVersion & FileVersionCriticalMask)) { throw new FormatException($"The file version is unsupported. A newer {Constants.ApplicationName} version is required to read it."); } var platform = document.Root.Attribute(XmlPlatformAttribute)?.Value; if (platform != Constants.Platform) { logger.Log(LogLevel.Warning, $"The platform of the file ({platform}) doesn't match the program platform ({Constants.Platform})."); } var customDataElement = document.Root.Element(XmlCustomDataElement); if (customDataElement != null) { project.CustomData.Deserialize(customDataElement); } var typeMappingElement = document.Root.Element(XmlTypeMappingElement); if (typeMappingElement != null) { project.TypeMapping.Deserialize(typeMappingElement); } var enumsElement = document.Root.Element(XmlEnumsElement); if (enumsElement != null) { foreach (var enumElement in enumsElement.Elements(XmlEnumElement)) { var name = enumElement.Attribute(XmlNameAttribute)?.Value ?? string.Empty; var useFlagsMode = (bool?)enumElement.Attribute(XmlFlagsAttribute) ?? false; var size = enumElement.Attribute(XmlSizeAttribute).GetEnumValue <EnumDescription.UnderlyingTypeSize>(); var values = new Dictionary <string, long>(); foreach (var itemElement in enumElement.Elements(XmlItemElement)) { var itemName = itemElement.Attribute(XmlNameAttribute)?.Value ?? string.Empty; var itemValue = (long?)itemElement.Attribute(XmlValueAttribute) ?? 0L; values.Add(itemName, itemValue); } var @enum = new EnumDescription { Name = name }; @enum.SetData(useFlagsMode, size, values); project.AddEnum(@enum); } } var classes = new List <Tuple <XElement, ClassNode> >(); var classesElement = document.Root.Element(XmlClassesElement); if (classesElement != null) { foreach (var element in classesElement .Elements(XmlClassElement) .DistinctBy(e => e.Attribute(XmlUuidAttribute)?.Value)) { var node = new ClassNode(false) { Uuid = NodeUuid.FromBase64String(element.Attribute(XmlUuidAttribute)?.Value, true), Name = element.Attribute(XmlNameAttribute)?.Value ?? string.Empty, Comment = element.Attribute(XmlCommentAttribute)?.Value ?? string.Empty, AddressFormula = element.Attribute(XmlAddressAttribute)?.Value ?? string.Empty }; if (!project.ContainsClass(node.Uuid)) { project.AddClass(node); classes.Add(Tuple.Create(element, node)); } } } foreach (var t in classes) { var nodes = t.Item1.Elements(XmlNodeElement) .Select(e => CreateNodeFromElement(e, t.Item2, logger)) .Where(n => n != null); foreach (var node in nodes) { t.Item2.AddNode(node); } } } } }