/// <summary> /// ОК. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void okButton_Click(object sender, EventArgs e) { try { _CurrentDefinition.Validate(); } catch (EmptyFormFieldException eex) { if (!WSSDeveloperPackage.ShowUserConfirmOkCancel(eex.Message + "\nПродолжить?", "Не заполнены поля")) { return; } } this.TypesManager.Add(_CurrentDefinition); this.DialogResult = DialogResult.OK; this.Close(); }
/// <summary> /// Выполняет деплой модуля. /// </summary> /// <param name="deployInfo"></param> internal override bool Deploy(DeployInfo deployInfo) { if (deployInfo == null) { throw new ArgumentNullException(nameof(deployInfo)); } //получаем указанную папку string selectedPath = this.FolderPath.Text; if (String.IsNullOrEmpty(selectedPath)) { throw new NotificationException("Не выбран путь для комплекта"); } DirectoryInfo targetDir; if (!Directory.Exists(selectedPath)) { if (WSSDeveloperPackage.ShowUserConfirmOkCancel("Папка " + selectedPath + " отсутствует.\nСоздать?", "Папка отсутствует")) { targetDir = Directory.CreateDirectory(selectedPath); } else { return(false); } } else { targetDir = new DirectoryInfo(selectedPath); } //деплоим в указанную папку deployInfo.CreateReleaseDirectory(targetDir, false); deployInfo.CreateSourcesDirectory(targetDir, false); this.Form.Command.Package.WriteToOutput( $"Сформирован комплект для проекта {deployInfo.Project.Name} по пути:\n<file://{targetDir.FullName.TrimStart('\\').Replace('\\', '/')}>"); return(true); }
/// <summary> /// Создаёт XML описание элемента. /// </summary> /// <returns></returns> internal override string CreateXml() { StringBuilder sb = new StringBuilder(4096); using (DefinitionXmlBuilder xb = new DefinitionXmlBuilder(sb, "ListFormWebControlDefinition")) { xb.Append(_Type); xb.AppendClassName(this.Metadata); CodeClass factoryClass = this.FindControlFactory(); if (factoryClass != null) { xb.Append("FactoryClassName", this.Metadata.Class.FullName + "+" + factoryClass.Name); } else if (!WSSDeveloperPackage.ShowUserConfirmOkCancel("Фабрика контрола не задана, продолжить?", "Не задана фабрика")) { throw new NotificationException("Операция прервана"); } xb.Append(_DisplayName); } return(sb.ToString()); }
/// <summary> /// Добавляет определение в XML. /// </summary> /// <param name="definition"></param> public void Add(ItemDefinition definition) { if (definition == null) { throw new ArgumentNullException(nameof(definition)); } string typesXmlPath = this.TypesXmlItem.GetFullPath(); //грузим существующий XML XmlDocument xdoc = new XmlDocument(); xdoc.PreserveWhitespace = false; xdoc.LoadXml(File.ReadAllText(typesXmlPath)); XmlNode typeDefinitionsNode = xdoc.SelectSingleNode("TypeDefinitions"); if (typeDefinitionsNode == null) { throw new Exception("Узел <TypeDefinitions> не найден"); } //находим соответствующую секцию для типа XmlNode section = typeDefinitionsNode.SelectSingleNode(definition.SectionName); if (section == null) { //создаём секцию section = xdoc.CreateElement(definition.SectionName); typeDefinitionsNode.AppendChild(section); } else { //ищем дубликаты в секции XmlNode duplicateNode = section.SelectSingleNode(definition.UniqueNodeXPath); if (duplicateNode != null) { if (WSSDeveloperPackage.ShowUserConfirmOkCancel($"В файле Types.xml уже есть определение по xpath: {definition.UniqueNodeXPath}.\n\nЗаменить?", "Дублирование")) { XmlNode parentNode; if ((parentNode = duplicateNode.ParentNode) == null) { throw new NotificationException("Некорректный формат Types.xml"); } section.RemoveChild(parentNode); } else { return; } } } //вставляем XML-определение типа XmlDocument temp = new XmlDocument(); temp.LoadXml(definition.CreateXml()); section.AppendChild(xdoc.ImportNode(temp.FirstChild, true)); //делаем чекаут Types.xml this.Cmd.DTE.CheckOutItem(this.TypesXmlItem); //сохраняем XML xdoc.Save(typesXmlPath); //открываем Window win = this.Cmd.DTE.ItemOperations.OpenFile(typesXmlPath, EnvDTE.Constants.vsViewKindTextView); }