Exemplo n.º 1
0
        /// <summary>
        /// Loads children item for the given <paramref name="item"/>.
        /// </summary>
        /// <returns>The item's children.</returns>
        /// <exception cref="ArgumentNullException"><paramref name="item"/> is <see langword="null"/>.</exception>
        /// <exception cref="ArgumentException"><see cref="IGitItem.Guid"/> is not supplied.</exception>
        public IEnumerable <IGitItem> LoadChildren(IGitItem item)
        {
            if (item == null)
            {
                throw new ArgumentNullException(nameof(item));
            }

            if (string.IsNullOrWhiteSpace(item.Guid))
            {
                throw new ArgumentException("Item must have a valid identifier", nameof(item.Guid));
            }

            var module = _getModule();

            if (module == null)
            {
                throw new ArgumentException($"Require a valid instance of {nameof(IGitModule)}");
            }

            var subItems = module.GetTree(item.Guid, false).ToList();

            foreach (var subItem in subItems.OfType <GitItem>())
            {
                subItem.FileName = Path.Combine((item as GitItem)?.FileName ?? string.Empty, subItem.FileName ?? string.Empty);
            }

            return(subItems);
        }
        /// <summary>
        /// Loads children items for the provided item in to the specified nodes.
        /// Loaded children are cached until <see cref="ResetCache"/> method is called.
        /// For file type items it also loads icons associated with these types at the OS level.
        /// </summary>
        /// <param name="item"></param>
        /// <param name="nodes"></param>
        /// <param name="imageCollection"></param>
        /// <remarks>The method DOES NOT check any input parameters for performance reasons.</remarks>
        public void LoadChildren(IGitItem item, TreeNodeCollection nodes, ImageList.ImageCollection imageCollection)
        {
            var childrenItems = _cachedItems.GetOrAdd(item.Guid, _revisionInfoProvider.LoadChildren(item));

            if (childrenItems == null)
            {
                return;
            }

            foreach (var childItem in childrenItems.OrderBy(gi => gi, new GitFileTreeComparer()))
            {
                var subNode = nodes.Add(childItem.Name);
                subNode.Tag = childItem;

                var gitItem = childItem as GitItem;
                if (gitItem == null)
                {
                    subNode.Nodes.Add(new TreeNode());
                    continue;
                }

                switch (gitItem.ObjectType)
                {
                case GitObjectType.Tree:
                {
                    subNode.ImageIndex = subNode.SelectedImageIndex = TreeNodeImages.Folder;
                    subNode.Nodes.Add(new TreeNode());
                    break;
                }

                case GitObjectType.Commit:
                {
                    subNode.ImageIndex = subNode.SelectedImageIndex = TreeNodeImages.Submodule;
                    subNode.Text       = $@"{childItem.Name} (Submodule)";
                    break;
                }

                case GitObjectType.Blob:
                {
                    var extension = Path.GetExtension(gitItem.FileName);
                    if (string.IsNullOrWhiteSpace(extension))
                    {
                        continue;
                    }
                    if (!imageCollection.ContainsKey(extension))
                    {
                        var fileIcon = _iconProvider.Get(_module.WorkingDir, gitItem.FileName);
                        if (fileIcon == null)
                        {
                            continue;
                        }
                        imageCollection.Add(extension, fileIcon);
                    }
                    subNode.ImageKey = subNode.SelectedImageKey = extension;
                    break;
                }
                }
            }
        }
Exemplo n.º 3
0
 protected void LoadInTreeSingle(IGitItem item, TreeNodeCollection node)
 {
     List<IGitItem> list = new List<IGitItem>();
     list.Add(item);
     LoadInTree(list, node);
     if (node.Count > 0)
         node[0].Expand();
 }
Exemplo n.º 4
0
        private void FileChangesDoubleClick(object sender, EventArgs e)
        {
            if (FileChanges.GetRevisions().Count == 0)
            {
                GitUICommands.Instance.StartCompareRevisionsDialog();
                return;
            }

            IGitItem revision = FileChanges.GetRevisions()[0];

            var form = new FormDiffSmall();

            form.SetRevision(revision.Guid);
            form.ShowDialog();
        }
        public void LoadItemsInTreeView_should_add_all_none_GitItem_items_with_1st_level_nodes()
        {
            var items = new IGitItem[] { new MockGitItem("file1"), new MockGitItem("file2") };

            _controller.LoadItemsInTreeView(items, _rootNode.Nodes, _imageList.Images);

            _rootNode.Nodes.Count.Should().Be(items.Length);
            for (int i = 0; i < items.Length - 1; i++)
            {
                _rootNode.Nodes[i].Text.Should().Be(items[i].Name);
                _rootNode.Nodes[i].ImageIndex.Should().Be(-1);
                _rootNode.Nodes[i].SelectedImageIndex.Should().Be(-1);
                _rootNode.Nodes[i].Nodes.Count.Should().Be(1);
            }
            _imageList.Images.Count.Should().Be(0);
        }
Exemplo n.º 6
0
        private void UpdateSelectedFileViewers()
        {
            var selectedRows = FileChanges.GetSelectedRevisions();

            if (selectedRows.Count == 0)
            {
                return;
            }

            IGitItem revision = selectedRows[0];

            var fileName = revision.Name;

            if (string.IsNullOrEmpty(fileName))
            {
                fileName = FileName;
            }

            Text = string.Format("File History - {0}", FileName);
            if (!fileName.Equals(FileName))
            {
                Text = Text + string.Format(" ({0})", fileName);
            }

            if (tabControl1.SelectedTab == BlameTab)
            {
                Blame.LoadBlame(revision.Guid, fileName, FileChanges, BlameTab, Diff.Encoding);
            }
            if (tabControl1.SelectedTab == ViewTab)
            {
                var scrollpos = View.ScrollPos;

                View.Encoding = Diff.Encoding;
                View.ViewGitItemRevision(fileName, revision.Guid);
                View.ScrollPos = scrollpos;
            }

            if (tabControl1.SelectedTab == DiffTab)
            {
                GitItemStatus file = new GitItemStatus();
                file.IsTracked = true;
                file.Name      = fileName;
                Diff.ViewPatch(FileChanges, file, "You need to select at least one revision to view diff.");
            }
        }
        /// <summary>
        /// Loads children item for the given <paramref name="item"/>.
        /// </summary>
        /// <returns>The item's children.</returns>
        /// <exception cref="ArgumentNullException"><paramref name="item"/> is <see langword="null"/>.</exception>
        /// <exception cref="ArgumentException"><see cref="IGitItem.Guid"/> is not supplied.</exception>
        public IEnumerable <IGitItem> LoadChildren(IGitItem item)
        {
            if (item == null)
            {
                throw new ArgumentNullException(nameof(item));
            }

            if (string.IsNullOrWhiteSpace(item.Guid))
            {
                throw new ArgumentException("Item must have a valid identifier", nameof(item.Guid));
            }

            var module = _getModule();

            if (module == null)
            {
                throw new ArgumentException($"Require a valid instance of {nameof(IGitModule)}");
            }

            return(YieldSubItems());

            IEnumerable <IGitItem> YieldSubItems()
            {
                var basePath = (item as GitItem)?.FileName ?? string.Empty;

                foreach (var subItem in module.GetTree(item.ObjectId, full: false))
                {
                    if (subItem is GitItem gitItem)
                    {
                        gitItem.FileName = Path.Combine(
                            basePath,
                            gitItem.FileName ?? string.Empty);
                    }

                    yield return(subItem);
                }
            }
        }
Exemplo n.º 8
0
        private static void ProcessItem(TreeNodeCollection node, IGitItem item)
        {
            var subNode = node.Add(item.Name);
            subNode.Tag = item;

            var gitItem = item as GitItem;

            if (gitItem == null)
            {
                subNode.Nodes.Add(new TreeNode());
                return;
            }

            if (gitItem.IsTree)
            {
                subNode.ImageIndex = 1;
                subNode.SelectedImageIndex = 1;
                subNode.Nodes.Add(new TreeNode());
                return;
            }
            if (gitItem.IsCommit)
            {
                subNode.ImageIndex = 2;
                subNode.SelectedImageIndex = 2;
                subNode.Text = item.Name + " (Submodule)";
            }
        }
Exemplo n.º 9
0
        private void UpdateSelectedFileViewers()
        {
            var selectedRows = FileChanges.GetSelectedRevisions();

            if (selectedRows.Count == 0)
            {
                return;
            }

            IGitItem revision = selectedRows[0];

            var fileName = revision.Name;

            if (string.IsNullOrEmpty(fileName))
            {
                fileName = FileName;
            }

            Text = string.Format("File History ({0})", fileName);

            if (tabControl1.SelectedTab == Blame)
            {
                blameControl1.LoadBlame(revision.Guid, fileName, FileChanges);
            }
            if (tabControl1.SelectedTab == ViewTab)
            {
                var scrollpos = View.ScrollPos;

                View.ViewGitItemRevision(fileName, revision.Guid);
                View.ScrollPos = scrollpos;
            }

            switch (selectedRows.Count)
            {
            case 1:
            {
                IGitItem revision1 = selectedRows[0];

                if (tabControl1.SelectedTab == DiffTab)
                {
                    Diff.ViewPatch(
                        () =>
                        {
                            Patch diff = Settings.Module.GetSingleDiff(revision1.Guid, revision1.Guid + "^", fileName,
                                                                       Diff.GetExtraDiffArguments(), Diff.Encoding);
                            if (diff == null)
                            {
                                return(string.Empty);
                            }
                            return(diff.Text);
                        }
                        );
                }
            }
            break;

            case 2:
            {
                IGitItem revision1 = selectedRows[0];
                IGitItem revision2 = selectedRows[1];

                if (tabControl1.SelectedTab == DiffTab)
                {
                    Diff.ViewPatch(
                        () =>
                        Settings.Module.GetSingleDiff(revision1.Guid, revision2.Guid, fileName,
                                                      Diff.GetExtraDiffArguments(), Diff.Encoding).Text);
                }
            }
            break;

            default:
                Diff.ViewPatch("You need to select 2 files to view diff.");
                break;
            }
        }