/// <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; } } } }
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(); }
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); }
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); } } }
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)"; } }
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; } }