Ejemplo n.º 1
0
        /// <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);
                }
            }
        }
Ejemplo n.º 2
0
        /// <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();
            }
        }
Ejemplo n.º 3
0
        /// <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);
        }