/// <summary> /// Добавить компоненты в словари /// </summary> private bool AddComponents(ISchemeComp schemeComp, AttrTranslator attrTranslator) { CompLibSpec compLibSpec = schemeComp.CompLibSpec; string errMsg; if (compLibSpec != null) { if (compLibSpec.Validate(out errMsg) && compLibSpec.CompFactory != null) { allSpecs.Add(compLibSpec); factsByPrefix[compLibSpec.XmlPrefix] = compLibSpec.CompFactory; foreach (CompItem compItem in compLibSpec.CompItems) { if (compItem != null && compItem.CompType != null) { specsByType[compItem.CompType.FullName] = compLibSpec; if (attrTranslator != null) { attrTranslator.TranslateAttrs(compItem.CompType); } } } return(true); } else if (!string.IsNullOrEmpty(errMsg)) { LoadErrors.Add(errMsg); } } return(false); }
/// <summary> /// Получить спецификации библиотек, отсортированные по заголовкам групп /// </summary> public CompLibSpec[] GetSortedSpecs() { int specCnt = allSpecs.Count; string[] headers = new string[specCnt]; CompLibSpec[] specs = new CompLibSpec[specCnt]; for (int i = 0; i < specCnt; i++) { CompLibSpec spec = allSpecs[i]; headers[i] = spec.GroupHeader; specs[i] = spec; } Array.Sort(headers, specs); return(specs); }
/// <summary> /// Сохранить схему в файле /// </summary> public bool SaveToFile(string fileName, out string errMsg) { try { XmlDocument xmlDoc = new XmlDocument(); XmlDeclaration xmlDecl = xmlDoc.CreateXmlDeclaration("1.0", "utf-8", null); xmlDoc.AppendChild(xmlDecl); // запись заголовка представления XmlElement rootElem = xmlDoc.CreateElement("SchemeView"); rootElem.SetAttribute("title", SchemeDoc.Title); xmlDoc.AppendChild(rootElem); // пока используется старый формат файла // запись документа схемы XmlElement documentElem = xmlDoc.CreateElement("Scheme"); rootElem.AppendChild(documentElem); SchemeDoc.SaveToXml(documentElem); // запись компонентов схемы CompManager compManager = CompManager.GetInstance(); HashSet <string> prefixes = new HashSet <string>(); XmlElement componentsElem = xmlDoc.CreateElement("Components"); rootElem.AppendChild(componentsElem); foreach (BaseComponent component in Components.Values) { if (component is UnknownComponent) { componentsElem.AppendChild(((UnknownComponent)component).XmlNode); } else { Type compType = component.GetType(); CompLibSpec compLibSpec = compManager.GetSpecByType(compType); // добавление пространства имён if (compLibSpec != null && !prefixes.Contains(compLibSpec.XmlPrefix)) { rootElem.SetAttribute("xmlns:" + compLibSpec.XmlPrefix, compLibSpec.XmlNs); prefixes.Add(compLibSpec.XmlPrefix); } // создание XML-элемента компонента XmlElement componentElem = compLibSpec == null? xmlDoc.CreateElement(compType.Name) /*стандартный компонент*/ : xmlDoc.CreateElement(compLibSpec.XmlPrefix, compType.Name, compLibSpec.XmlNs); componentsElem.AppendChild(componentElem); component.SaveToXml(componentElem); } } // запись изображений схемы XmlElement imagesElem = xmlDoc.CreateElement("Images"); rootElem.AppendChild(imagesElem); foreach (Image image in SchemeDoc.Images.Values) { XmlElement imageElem = xmlDoc.CreateElement("Image"); imagesElem.AppendChild(imageElem); image.SaveToXml(imageElem); } // запись фильтра по входным каналам XmlElement cnlsFilterElem = xmlDoc.CreateElement("CnlsFilter"); cnlsFilterElem.InnerText = SchemeDoc.CnlFilter.CnlFilterToString(); rootElem.AppendChild(cnlsFilterElem); xmlDoc.Save(fileName); errMsg = ""; return(true); } catch (Exception ex) { errMsg = SchemePhrases.SaveSchemeViewError + ": " + ex.Message; return(false); } }