private void CustomParameterListRefresh()
        {
            var item = TemplateNodeItemRoot?.GetAllChildren().FirstOrDefault(p => p.Name.EndsWith(".vstemplate"));

            if (item == null)
            {
                return;
            }

            var xmlDocument = new XmlDocument();

            xmlDocument.LoadXml(item.FileContent);
            var nsm = new XmlNamespaceManager(xmlDocument.NameTable);

            nsm.AddNamespace("x", "http://schemas.microsoft.com/developer/vstemplate/2005");
            var lst = new ObservableCollection <NameValue>();

            foreach (XmlNode xmlNode in xmlDocument.SelectNodes("//x:CustomParameters/x:CustomParameter", nsm))
            {
                var nameValue = new NameValue
                {
                    Name  = xmlNode.SelectSingleNode("@Name", nsm).Value,
                    Value = xmlNode.SelectSingleNode("@Value", nsm).Value
                };
                nameValue.PropertyChanged += NameValue_PropertyChanged;
                lst.Add(nameValue);
            }

            CustomParameterList = lst;
            CustomParameterList.CollectionChanged += CustomParameterList_CollectionChanged;
        }
 private void Watcher_Changed(object sender, FileSystemEventArgs e)
 {
     if (e.ChangeType == WatcherChangeTypes.Changed)
     {
         var nodeItem = TemplateNodeItemRoot.GetAllChildren().FirstOrDefault(p => p.FullName == e.FullPath);
         TemplatePreviewFileCommand.ExecuteIfCan(nodeItem);
     }
     else if (e.ChangeType == WatcherChangeTypes.Deleted)
     {
         var nodeItem = TemplateNodeItemRoot.GetAllChildren().FirstOrDefault(p => p.FullName == e.FullPath);
         _dispatcher.Invoke(() => TemplateNodeItemDeleteCommand.ExecuteIfCan(nodeItem));
     }
     else if (e.ChangeType == WatcherChangeTypes.Created)
     {
         _dispatcher.Invoke(() => TemplateNodeItemAddCommand.ExecuteIfCan(e.FullPath));
     }
     else if (e.ChangeType == WatcherChangeTypes.Renamed)
     {
         var e2       = (RenamedEventArgs)e;
         var nodeItem = TemplateNodeItemRoot.GetAllChildren().FirstOrDefault(p => p.FullName == e2.OldFullPath);
         if (nodeItem != null)
         {
             TemplateNodeItemRename(nodeItem, e2.Name, false);
         }
     }
 }
        private void UpdateCustomParameters()
        {
            var item = TemplateNodeItemRoot?.GetAllChildren().FirstOrDefault(p => p.Name.EndsWith(".vstemplate"));

            if (item == null)
            {
                return;
            }

            var xmlDocument = new XmlDocument();

            xmlDocument.PreserveWhitespace = true;

            xmlDocument.LoadXml(item.FileContent);
            var nsm = new XmlNamespaceManager(xmlDocument.NameTable);

            nsm.AddNamespace("x", "http://schemas.microsoft.com/developer/vstemplate/2005");
            var lst = new ObservableCollection <NameValue>();


            var     cpList = xmlDocument.SelectNodes("//x:CustomParameters", nsm);
            XmlNode cpsNode;

            if (cpList.Count == 1)
            {
                cpsNode = cpList[0];
            }
            else
            {
                cpsNode = xmlDocument.SelectSingleNode("//x:TemplateContent", nsm).AppendChild(xmlDocument.CreateNode(XmlNodeType.Element, "CustomParameters", string.Empty));
            }

            cpsNode.RemoveAll();
            foreach (var cp in CustomParameterList)
            {
                var na = xmlDocument.CreateAttribute("Name");
                na.Value = cp.Name;
                var va = xmlDocument.CreateAttribute("Value");
                va.Value = cp.Value;
                cpsNode.AppendChild(xmlDocument.CreateWhitespace("\n      "));
                var cpNode = cpsNode.AppendChild(xmlDocument.CreateNode(XmlNodeType.Element, "CustomParameter", "http://schemas.microsoft.com/developer/vstemplate/2005"));
                cpNode.Attributes.Append(na);
                cpNode.Attributes.Append(va);
            }
            cpsNode.AppendChild(xmlDocument.CreateWhitespace("\n    "));


            item.FileContent = xmlDocument.InnerXml;
        }
        private void TemplateSave()
        {
            foreach (var node in TemplateNodeItemRoot.GetAllChildren())
            {
                if (node.IsModifed)
                {
                    TemplatePreviewSaveCommand.ExecuteIfCan(node);
                }
            }

            if (File.Exists(TemplatePath))
            {
                File.Delete(TemplatePath);
            }
            ZipFile.CreateFromDirectory(TemplateTempDir, TemplatePath);
            TemplateNodeItemRoot.IsModifed = false;
        }
        public NodeItem GetParentNodeItem(NodeItem nodeItem)
        {
            var parent = TemplateNodeItemRoot.GetAllChildren().FirstOrDefault(p => p.FullName == nodeItem.ParentFullName);

            if (parent == null)
            {
                if (TemplateNodeItemRoot.FullName == nodeItem.ParentFullName)
                {
                    parent = TemplateNodeItemRoot;
                }
                else
                {
                    return(null);
                }
            }
            return(parent);
        }
        private void TemplateClose()
        {
            if (TemplateNodeItemRoot.IsModifed)
            {
                var result = MessageBox.Show("Save changes?", "Confirm", MessageBoxButton.YesNoCancel);
                if (result == MessageBoxResult.Yes)
                {
                    TemplateSaveCommand.ExecuteIfCan();
                }
                else if (result == MessageBoxResult.Cancel)
                {
                    return;
                }
            }

            _watcher.EnableRaisingEvents = false;
            TemplateNodeItemRoot.GetAllChildren().ForEach(p => p.PropertyChanged -= NodeItem_PropertyChanged);
            TemplateNodeItemRoot.PropertyChanged -= NodeItem_PropertyChanged;
            Directory.Delete(TemplateTempDir, true);
            TemplateTempDir      = null;
            TemplatePath         = null;
            TemplateNodeItemList = null;
            TemplateNodeItemRoot = null;
        }
        private void TemplateNodeItemAdd(string param)
        {
            var parentDir = Path.GetDirectoryName(param);
            var isDir     = Directory.Exists(param);

            if (isDir)
            {
                if (!Directory.Exists(param))
                {
                    _watcher.EnableRaisingEvents = false;
                    Directory.CreateDirectory(param);
                    _watcher.EnableRaisingEvents = true;
                }
            }
            else
            {
                if (!File.Exists(param))
                {
                    _watcher.EnableRaisingEvents = false;
                    File.WriteAllText(param, string.Empty);
                    _watcher.EnableRaisingEvents = true;
                }
            }

            var parentNode = TemplateNodeItemRoot.FullName == parentDir ? TemplateNodeItemRoot : TemplateNodeItemRoot.GetAllChildren().Where(p => p.FullName == parentDir).Single();

            parentNode.Children.Add(new NodeItem
            {
                IsDir          = isDir,
                FullName       = param,
                Name           = Path.GetFileName(param),
                ParentFullName = parentNode.FullName,
                PreviewType    = isDir ? string.Empty : GetPreviewType(param)
            });
        }