/// <summary>ツリーになるようにNodeの子を作る</summary> /// <param name="parent">親のNode</param> /// <param name="parentList">個を入れるリスト</param> /// <param name="ie">リストに入れるNode</param> /// <param name="tagTypeStrings">分類用のタグ一覧</param> /// <param name="tagTypeIndex">分類の順位</param> private void SetChildNodes(TreeNodeItem parent, IList <TreeNodeItem> parentList, IEnumerable <TreeNodeItem> ie, IList <string> tagTypeStrings, int tagTypeIndex) { if (parent != null) { parent.FilteredItems.AddRange(ie.OrderBy(_ => _.OrderIndex)); } if (tagTypeStrings.Count() <= tagTypeIndex) { parent.IsLastNode = true; foreach (TreeNodeItem n in ie) { n.Parent = parent; parentList.Add(n); } } else { string tagTypeString = tagTypeStrings[tagTypeIndex]; var xx = ie.Select(n => new { Node = n, Tags = n.Tags.Where(t => t.Type == tagTypeString).ToArray() }); var tags = xx.SelectMany(_ => _.Tags).Distinct().ToArray(); foreach (Tag tag in tags) { TreeNodeItem child = new TreeNodeItem(); child.Header = tag.Value; child.Parent = parent; child.IsOther = tag.IsOther; child.AddTag(tag); var subItems = xx.Where(o => o.Tags.Any(t => t.Value == tag.Value)).Select(_ => _.Node); SetChildNodes(child, child.Items, subItems, tagTypeStrings, tagTypeIndex + 1); parentList.Add(child); } var others = parentList.Where(_ => _.IsOther).ToArray(); int i = parentList.Count(); foreach (TreeNodeItem node in others) { parentList.Remove(node); parentList.Add(node); } } }
/// <summary>最近使用したテンプレートの一覧を更新</summary> /// <param name="ie"></param> private void UpdateRecentNode(System.Collections.IEnumerable ie) { if (this.recentNode != null && ie != null) { this.recentNode.Items.Clear(); foreach (object o in ie) { var o_ext = o.GetType().GetProperty("Template")?.GetValue(o); TreeNodeItem node = CreateTreeNodeItemFromExtension(o_ext); if (node != null) { node.FilteredItems.Add(node); this.recentNode.Items.Add(node); this.recentNode.FilteredItems.Add(node); } } ExpandFirstRecentTree(); } }
/// <summary>元のViewModelからテンプレート一覧を作る</summary> /// <param name="projectCreationViewModel"></param> /// <returns></returns> private bool BuildTemplateNodes(object projectCreationViewModel) { this.TemplateNodes.Clear(); this.Tags.Clear(); Type t = projectCreationViewModel.GetType(); var extensions = projectCreationViewModel.GetType() .GetProperty("Extensions")? .GetValue(projectCreationViewModel) as System.Collections.IEnumerable; if (extensions == null) { return(false); } //"その他"に対応する文字列を調べる IEnumerable <TreeNodeTemplateItem> converter(bool forTest) => extensions.Cast <object>().Select(o_ext => CreateTreeNodeItemFromExtension(o_ext, forTest)).OfType <TreeNodeTemplateItem>(); var tagOther = converter(true).SelectMany(n => n.Tags.Where(_ => _.Id?.ToString() == "other")).FirstOrDefault(); if (tagOther != null) { this.header_other = tagOther.Value ?? "Other"; } this.Tags.Clear(); int nodeOrderIndex = 0; foreach (TreeNodeTemplateItem node in converter(false)) { node.OrderIndex = nodeOrderIndex++; this.TemplateNodes.Add(node); } //ユーザーテンプレートに言語タグが付いていないので他の言語と比較して設定 TreeNodeTemplateItem[] noLanguageTemplates = this.TemplateNodes.Where(_ => _.LanguageTags.Count() == 1 && _.LanguageTags.First().IsOther).ToArray(); Tag[] languageTags = this.Tags.Where(_ => _.Type == TagTypeKey.Language && !_.IsOther).ToArray(); foreach (Tag languageTag in languageTags) { var languages = this.TemplateNodes.Where(_ => _.Tags.Contains(languageTag)).Select(_ => new TemplateWrapper(_).ProjectType).Distinct().ToArray(); if (languages.Length == 1) { string language = languages[0]; foreach (TreeNodeTemplateItem nolanguage in noLanguageTemplates.Where(_ => _.TemplateWrapper.ProjectType == language)) { int index = nolanguage.RemoveTag(nolanguage.LanguageTags.First()); nolanguage.insertTag(index, languageTag); } } } foreach (TreeNodeTemplateItem userTemplate in this.TemplateNodes.Where(_ => _.TemplateWrapper.IsUserTemplate)) { userTemplate.OrderIndex -= 10000; } //最近使ったテンプレートの一覧用 this.recentNode = new TreeNodeItem() { Header = header_recent, IsExpanded = true, IsVisible = true }; var mruvm = projectCreationViewModel.GetType().GetProperty("MruNewProjectsListViewModel")?.GetValue(projectCreationViewModel); if (mruvm != null) { var recents = mruvm?.GetType().GetProperty("RecentTemplates")?.GetValue(mruvm) as System.Collections.IEnumerable; UpdateRecentNode(recents); this.recentCollection = recents as System.Collections.Specialized.INotifyCollectionChanged; if (this.recentCollection != null) { this.recentCollection.CollectionChanged += recentCollection_CollectionChanged; } } //2017にはあるオンラインテンプレートの検索はマーケットプレイスのページを表示させる var link = new Hyperlink(new Run("Online")) { NavigateUri = new Uri("https://marketplace.visualstudio.com/search?sortBy=Downloads&category=Templates&target=VS&vsVersion=vs2019") }; System.Windows.Controls.TextBlock onlineHeader = new System.Windows.Controls.TextBlock(); onlineHeader.Inlines.Add(link); onlineHeader.ToolTip = "Open Marketplace"; link.RequestNavigate += (s, e) => { if (e.Uri != null) { System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo(e.Uri.AbsoluteUri)); link.NavigateUri = null; Window.GetWindow(onlineHeader)?.Close(); } }; this.onlineNode = new TreeNodeItem() { Header = onlineHeader, IsExpanded = true, IsVisible = true }; foreach (Tag tag in Tags.Where(_ => _.IsOther).ToArray()) { this.Tags.Remove(tag); this.Tags.Add(tag); } return(true); }