/// <summary> /// Выгрузка дерева /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void uploadTagTreeButton_Click(object sender, RoutedEventArgs e) { //Игнорируем, если документ не открыт if (!_isOpenXmlDocument) { return; } //Запрос на выгрузку дерева MessageBoxResult result = MessageBox.Show("Выгрузить дерево и сохранить изменения в Xml файле?", "Внимание!!!", MessageBoxButton.OKCancel); if (result == MessageBoxResult.OK) { this.tagStorage.SaveXmlDocument(); //Выгрузка дерева в другом потоке Task.Factory.StartNew(() => { this.outTreeView.Dispatcher.Invoke(() => outTreeView.ItemsSource = null); }); //Документ закрыт _isOpenXmlDocument = false; //Зануляем инстансы tagStorage = null; tagItem = null; } }
/// <summary> /// Переименовывает заданный тег /// </summary> /// <param _name="path">Путь переименовываемого тега</param> /// <param _name="newname">Новое имя тега</param> public void RenameTag(string path, string newName) { try { TagItem tagItem = new TagItem(_root.SelectSingleNode(path)); tagItem.RenameTag(newName); } catch (Exception e) { throw new Exception(e.Message, e); } }
/// <summary> /// Добавляет новый тег в конец списка дочерних тегов /// </summary> /// <param _name="path">Родительский тег в теле которого, будет создан новый</param> /// <param _name="name">Имя нового тега</param> /// <param _name="type">Тип нового тега</param> public void AddTag(string path, string name, string type) { try { TagItem tagItem = new TagItem(_root.SelectSingleNode(path)); tagItem.AddChildTag(name); } catch (Exception e) { throw new Exception(e.Message, e); } }
//Methods /// <summary> /// Инициализация при загрузке окна /// </summary> private void Window_Loaded(object sender, EventArgs e) { //Пустой XML узел _emptyElement = new XmlDocument().DocumentElement; //Создание екземпляра для загрузки пустого дерева tagItem = new TagItem(_emptyElement); _tagCollection = new ObservableCollection <TagItem>(); this.Title = "TreeView"; //В качестве контента данных используем самих себя this.DataContext = this; //Загрузка пустого дерева в отдельном потоке Task.Factory.StartNew(() => outTreeView.Dispatcher.Invoke(() => outTreeView.ItemsSource = TagCollection)); }
/// <summary> /// Загрузка дерева /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void loadTagTreeButton_Click(object sender, RoutedEventArgs e) { //Инстансыруем классы tagStorage = new TagStorage(_fileName); tagItem = new TagItem(tagStorage.Root); //Создаем главную коллекцию CreateTagCollection(tagStorage.Root); //Привязываем коллекцию к TreeView в отдельном потоке Task.Factory.StartNew(() => outTreeView.Dispatcher.Invoke(() => outTreeView.ItemsSource = TagCollection)); //Документ открыт, если все в порядке if (tagStorage.Root != null) { _isOpenXmlDocument = true; } }
//Methods /// <summary> /// Рекурсивно перебирает все теги и выводит на экран их имена, пути, значения, типы, уровни вложенности /// </summary> /// <param _name="element">Тег с которого строится дерего и выводится на экран</param> private void PrintRec(XmlNode element) { if (element == null) //Выход, если пустая ссылка { return; } TagItem tagItem = new TagItem(element); tagItem.Print(); if (element.HasChildNodes) { foreach (XmlNode e in element.ChildNodes) { PrintRec(e); } } }
/// <summary> /// Удаление тега /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void MenuItem_Click_2(object sender, RoutedEventArgs e) { MessageBoxResult result = MessageBox.Show("Удалить выбранную ветвь?", "Внимание!!!", MessageBoxButton.OKCancel); if (result == MessageBoxResult.OK) { TagItem selectedTag = (TagItem)outTreeView.SelectedItem; //Выбранный тег принадлежит главной колекции if (_tagCollection.Contains(selectedTag)) { //Очищаем главную коллецию this.TagCollection.Remove(selectedTag); //Формирование полного пути тега string xPathName = CreateXPathName(selectedTag.tag); //Если тип Текст, то изменяем строку пути используем перегрузку метода удаления тега из дерева if (!_isText) { tagStorage.RemoveTag(xPathName); } else { xPathName = xPathName.TrimEnd(@"#text".ToCharArray()); tagStorage.RemoveTypedTag(xPathName, ""); } if (_isText) { _isText = false; } _isChanged = true; } //Тег принадлежит Виртуальному дереву else { //Если добавленный тег if (selectedTag.isNewTag) { //Удаляем из шаблона дерева tagStorage.RemoveNewTag(selectedTag.Name); //Находим родительский контейнер выбранного тега в TreeView TagItem selectedTreeViewItemParent2 = (TagItem)ItemsControl.ItemsControlFromItemContainer(_selectedTreeViewItem).DataContext; //Удаляем выбранный тег selectedTreeViewItemParent2.ChildCollection.Remove(selectedTag); return; } //Формирование полного пути тега string xPathName = CreateXPathName(selectedTag.tag); //Аналогичное описание в ифе if (!_isText) { tagStorage.RemoveTag(xPathName); } else { xPathName = xPathName.TrimEnd(@"#text".ToCharArray()); tagStorage.RemoveTypedTag(xPathName, ""); } if (_isText) { _isText = false; } TagItem selectedTreeViewItemParent = (TagItem)ItemsControl.ItemsControlFromItemContainer(_selectedTreeViewItem).DataContext; selectedTreeViewItemParent.ChildCollection.Remove(selectedTag); _isChanged = true; } } }
/// <summary> /// Переименование тега /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void MenuItem_Click_1(object sender, RoutedEventArgs e) { //Окно для ввода нового имени var renameWindow = new RenameWindow(); renameWindow.ShowDialog(); //Сохраняем новое имя в переменную string newName = renameWindow.NewName; //проверка на пустую строку имени if (string.IsNullOrWhiteSpace(newName)) { MessageBox.Show("Введите имя"); return; } //Выбранный тег в TreeView TagItem selectedTag = (TagItem)outTreeView.SelectedItem; //Выбранный тег принадлежит главной колекции if (this.TagCollection.Contains(selectedTag)) { //Находим тег который нужно переименовать foreach (TagItem tag in TagCollection) { if (tag == selectedTag) { //Изменяем имя tag.Name = newName; //Обновляем щаблон дерева string xPathName = CreateXPathName(selectedTag.tag); if (!_isText) { tagStorage.RenameTag(xPathName, newName); } else { tagStorage.RenameTag(xPathName, newName); } //Бмли изменения _isChanged = true; //ВЫходим их цикла при нахождении return; } } } //Тег принадлежит Виртуальному дереву else { TagItem selectedTreeViewItemParent = (TagItem)ItemsControl.ItemsControlFromItemContainer(_selectedTreeViewItem).DataContext; foreach (TagItem tag in selectedTreeViewItemParent.ChildCollection) { if (tag == selectedTag) { tag.Name = newName; _isChanged = true; string xPathName = CreateXPathName(selectedTag.tag); //xPathName = xPathName.TrimEnd if (!_isText) { tagStorage.RenameTag(xPathName, newName); } else { //xPathName = xPathName.TrimEnd(@"#text".ToCharArray()); tagStorage.RenameTag(xPathName, newName); } return; } } } //Дерево изменено _isChanged = true; }
/// <summary> /// Добавление тега /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void MenuItem_Click(object sender, RoutedEventArgs e) { //Окна для ввода имени и типа нового тега var newTagWindow = new NewTagWindow(); newTagWindow.ShowDialog(); //Записываем двнные в переменные string newName = newTagWindow.NewName; string newType = newTagWindow.NewType; //Проверка на Null if (string.IsNullOrWhiteSpace(newName)) { MessageBox.Show("Введите имя"); return; } //Проверка на корректность введенного типа bool isValidType = false; foreach (string type in Enum.GetNames(typeof(XmlNodeType))) { if (newType == type) { isValidType = true; } } //Уведомление, если тип введен не правильно if (!isValidType) { MessageBox.Show("Неверно указан тип. Повторите попытку", "Внимание!!!"); return; } else { //Выделенный тег TagItem selectedTag = (TagItem)outTreeView.SelectedItem; //Принадлежит главной коллекции if (_tagCollection.Contains(selectedTag)) { //Поиск в коллекции foreach (TagItem tag in this._tagCollection) { if (tag == selectedTag) { //Добавление нового тега в локальную коллекцию тега selectedTag.ChildCollection.Add(new TagItem(newName, newType)); } } //Изменения _isChanged = true; } //Тег принадлежит Виртуальному дереву else { //Добавление нового тега в локальную коллекцию тега selectedTag.ChildCollection.Add(new TagItem(newName, newType)); TagItem selectedTreeViewItemParent2 = (TagItem)ItemsControl.ItemsControlFromItemContainer(_selectedTreeViewItem).DataContext; selectedTreeViewItemParent2.GetChildByName(selectedTag.Name).AppendChild(tagStorage.xmlDoc.CreateElement(newName)); //Изменнеия _isChanged = true; } } }