private void AddPackageNodes(IGraphContext context, Func <GraphNode> parentNode, IEnumerable <PaketMetadata> installedPackages)
        {
            var allPackages = installedPackages.ToList();

            for (int index = 0; index < allPackages.Count; index++)
            {
                PaketMetadata paketMetadata = allPackages[index];

                using (var scope = new GraphTransactionScope())
                {
                    CreateNode(context, parentNode(), paketMetadata);
                    scope.Complete();
                }

                context.ReportProgress(index, allPackages.Count, null);

                if (context.CancelToken.IsCancellationRequested)
                {
                    break;
                }
            }
        }
        private void CreateNode(IGraphContext context, GraphNode parent, PaketMetadata metadata)
        {
            var parentId = parent.GetValue <GraphNodeId>("Id");
            var id       = GraphNodeId.GetNested(
                parentId,
                GraphNodeId.GetPartial(CodeGraphNodeIdName.Member, metadata.Id),
                GraphNodeId.GetPartial(CodeGraphNodeIdName.Parameter, metadata.VersionString));

            var node = context.Graph.Nodes.Get(id);

            if (node == null)
            {
                string label = metadata.Id + " " + metadata.VersionString;

                node = context.Graph.Nodes.GetOrCreate(id, label, PaketGraphSchema.PaketCategory);

                node.SetValue(DgmlNodeProperties.ContainsChildren, false);
                node.SetValue(CodeNodeProperties.SourceLocation, new SourceLocation(new Uri(parentId.GetFileName(), UriKind.Absolute),
                                                                                    new Position(PaketGraphSchema.GetDisplayIndex(node), 1)));
                node.SetValue(DgmlNodeProperties.Icon, GraphIcons.Package);
            }

            context.Graph.Links.GetOrCreate(parent, node, null, GraphCommonSchema.Contains);
        }