Example #1
0
        private void FileTreeContextMenu_Opening(object sender, System.ComponentModel.CancelEventArgs e)
        {
            var gitItem     = tvGitTree.SelectedNode?.Tag as GitItem;
            var enableItems = gitItem != null && gitItem.IsBlob;

            if (gitItem != null && gitItem.IsCommit)
            {
                openSubmoduleMenuItem.Visible = true;
                if (!openSubmoduleMenuItem.Font.Bold)
                {
                    openSubmoduleMenuItem.Font = new Font(openSubmoduleMenuItem.Font, FontStyle.Bold);
                }
            }
            else
            {
                openSubmoduleMenuItem.Visible = false;
            }

            saveAsToolStripMenuItem.Visible                  = enableItems;
            openFileToolStripMenuItem.Visible                = enableItems;
            openFileWithToolStripMenuItem.Visible            = enableItems;
            openWithToolStripMenuItem.Visible                = enableItems;
            copyFilenameToClipboardToolStripMenuItem.Visible = gitItem != null && FormBrowseUtil.IsFileOrDirectory(FormBrowseUtil.GetFullPathFromGitItem(Module, gitItem));
            editCheckedOutFileToolStripMenuItem.Visible      = enableItems;
        }
Example #2
0
        private void fileTreeOpenContainingFolderToolStripMenuItem_Click(object sender, EventArgs e)
        {
            var    gitItem  = tvGitTree.SelectedNode?.Tag as GitItem;
            string filePath = gitItem == null ? Module.WorkingDir : FormBrowseUtil.GetFullPathFromGitItem(Module, gitItem);

            FormBrowseUtil.ShowFileOrFolderInFileExplorer(filePath);
        }
Example #3
0
        private void FileTreeContextMenu_Opening(object sender, System.ComponentModel.CancelEventArgs e)
        {
            var gitItem     = tvGitTree.SelectedNode?.Tag as GitItem;
            var enableItems = gitItem != null && gitItem.ObjectType == GitObjectType.Blob;

            if (gitItem != null && gitItem.ObjectType == GitObjectType.Commit)
            {
                openSubmoduleMenuItem.Visible = true;
                if (!openSubmoduleMenuItem.Font.Bold)
                {
                    openSubmoduleMenuItem.Font = new Font(openSubmoduleMenuItem.Font, FontStyle.Bold);
                }
            }
            else
            {
                openSubmoduleMenuItem.Visible = false;
            }
            this.fileHistoryToolStripMenuItem.Enabled = gitItem != null;

            this.resetToThisRevisionToolStripMenuItem.Enabled     =
                this.blameToolStripMenuItem1.Enabled              =
                    this.fileTreeArchiveToolStripMenuItem.Enabled =
                        enableItems;

            saveAsToolStripMenuItem.Visible                  = enableItems;
            openFileToolStripMenuItem.Visible                = enableItems;
            openFileWithToolStripMenuItem.Visible            = enableItems;
            openWithToolStripMenuItem.Visible                = enableItems;
            copyFilenameToClipboardToolStripMenuItem.Visible = gitItem != null && FormBrowseUtil.IsFileOrDirectory(FormBrowseUtil.GetFullPathFromGitItem(Module, gitItem));
            editCheckedOutFileToolStripMenuItem.Visible      = enableItems;
            toolStripSeparator18.Visible = enableItems;
        }
        private void fileTreeOpenContainingFolderToolStripMenuItem_Click(object sender, EventArgs e)
        {
            string filePath = tvGitTree.SelectedNode?.Tag is GitItem gitItem
                ? _fullPathResolver.Resolve(gitItem.FileName)
                : Module.WorkingDir;

            FormBrowseUtil.ShowFileOrFolderInFileExplorer(filePath);
        }
Example #5
0
        private void DiffContextMenu_Opening(object sender, CancelEventArgs e)
        {
            var selectionInfo = GetSelectionInfo();

            // Many options have no meaning for artificial commits or submodules
            // Hide the obviously no action options when single selected, handle them in actions if multi select

            openWithDifftoolToolStripMenuItem.Enabled         = _revisionDiffController.ShouldShowDifftoolMenus(selectionInfo);
            saveAsToolStripMenuItem1.Visible                  = _revisionDiffController.ShouldShowMenuSaveAs(selectionInfo);
            copyFilenameToClipboardToolStripMenuItem1.Enabled = _revisionDiffController.ShouldShowMenuCopyFileName(selectionInfo);

            stageFileToolStripMenuItem.Visible   = _revisionDiffController.ShouldShowMenuStage(selectionInfo);
            unstageFileToolStripMenuItem.Visible = _revisionDiffController.ShouldShowMenuUnstage(selectionInfo);

            cherryPickSelectedDiffFileToolStripMenuItem.Visible = _revisionDiffController.ShouldShowMenuCherryPick(selectionInfo);

            // Visibility of FileTree is not known, assume (CommitInfoTabControl.Contains(TreeTabPage);)
            diffShowInFileTreeToolStripMenuItem.Visible = _revisionDiffController.ShouldShowMenuShowInFileTree(selectionInfo);
            fileHistoryDiffToolstripMenuItem.Enabled    = _revisionDiffController.ShouldShowMenuFileHistory(selectionInfo);
            blameToolStripMenuItem.Enabled       = _revisionDiffController.ShouldShowMenuBlame(selectionInfo);
            resetFileToToolStripMenuItem.Enabled = _revisionDiffController.ShouldShowResetFileMenus(selectionInfo);

            diffDeleteFileToolStripMenuItem.Visible = _revisionDiffController.ShouldShowMenuDeleteFile(selectionInfo);
            diffEditWorkingDirectoryFileToolStripMenuItem.Visible     = _revisionDiffController.ShouldShowMenuEditWorkingDirectoryFile(selectionInfo);
            diffOpenWorkingDirectoryFileWithToolStripMenuItem.Visible = _revisionDiffController.ShouldShowMenuEditWorkingDirectoryFile(selectionInfo);
            diffOpenRevisionFileToolStripMenuItem.Visible             = _revisionDiffController.ShouldShowMenuOpenRevision(selectionInfo);
            diffOpenRevisionFileWithToolStripMenuItem.Visible         = _revisionDiffController.ShouldShowMenuOpenRevision(selectionInfo);

            diffCommitSubmoduleChanges.Visible    =
                diffResetSubmoduleChanges.Visible =
                    diffStashSubmoduleChangesToolStripMenuItem.Visible =
                        diffSubmoduleSummaryMenuItem.Visible           =
                            diffUpdateSubmoduleMenuItem.Visible        = _revisionDiffController.ShouldShowSubmoduleMenus(selectionInfo);

            diffToolStripSeparator13.Visible = _revisionDiffController.ShouldShowMenuDeleteFile(selectionInfo) ||
                                               _revisionDiffController.ShouldShowSubmoduleMenus(selectionInfo) ||
                                               _revisionDiffController.ShouldShowMenuEditWorkingDirectoryFile(selectionInfo) ||
                                               _revisionDiffController.ShouldShowMenuOpenRevision(selectionInfo);

            // openContainingFolderToolStripMenuItem.Enabled or not
            {
                openContainingFolderToolStripMenuItem.Enabled = false;

                foreach (var item in DiffFiles.SelectedItems)
                {
                    string filePath = _fullPathResolver.Resolve(item.Name);
                    if (FormBrowseUtil.FileOrParentDirectoryExists(filePath))
                    {
                        openContainingFolderToolStripMenuItem.Enabled = true;
                        break;
                    }
                }
            }
        }
        private void FileTreeContextMenu_Opening(object sender, System.ComponentModel.CancelEventArgs e)
        {
            var gitItem                   = tvGitTree.SelectedNode?.Tag as GitItem;
            var itemSelected              = gitItem != null;
            var isFile                    = itemSelected && gitItem.ObjectType == GitObjectType.Blob;
            var isFolder                  = itemSelected && gitItem.ObjectType == GitObjectType.Tree;
            var isFileOrFolder            = isFile || isFolder;
            var isExistingFileOrDirectory = itemSelected && FormBrowseUtil.IsFileOrDirectory(_fullPathResolver.Resolve(gitItem.FileName));

            if (itemSelected && gitItem.ObjectType == GitObjectType.Commit)
            {
                openSubmoduleMenuItem.Visible = true;
                if (!openSubmoduleMenuItem.Font.Bold)
                {
                    openSubmoduleMenuItem.Font = new Font(openSubmoduleMenuItem.Font, FontStyle.Bold);
                }
            }
            else
            {
                openSubmoduleMenuItem.Visible = false;
            }

            saveAsToolStripMenuItem.Visible = isFile;
            resetToThisRevisionToolStripMenuItem.Visible = isFileOrFolder && !Module.IsBareRepository();
            toolStripSeparatorFileSystemActions.Visible  = isFileOrFolder;

            copyFilenameToClipboardToolStripMenuItem.Visible      = itemSelected;
            fileTreeOpenContainingFolderToolStripMenuItem.Enabled = isExistingFileOrDirectory;
            fileTreeArchiveToolStripMenuItem.Enabled          = itemSelected;
            fileTreeCleanWorkingTreeToolStripMenuItem.Visible = isFileOrFolder;
            fileTreeCleanWorkingTreeToolStripMenuItem.Enabled = isExistingFileOrDirectory;

            fileHistoryToolStripMenuItem.Enabled = itemSelected;
            blameToolStripMenuItem1.Visible      = isFile;

            editCheckedOutFileToolStripMenuItem.Visible = isFile;
            editCheckedOutFileToolStripMenuItem.Enabled = isExistingFileOrDirectory;
            openWithToolStripMenuItem.Visible           = isFile;
            openWithToolStripMenuItem.Enabled           = isExistingFileOrDirectory;
            openWithDifftoolToolStripMenuItem.Visible   = isFile;
            openWithDifftoolToolStripMenuItem.Enabled   = FileText.OpenWithDifftool != null;
            openFileToolStripMenuItem.Visible           = isFile;
            openFileWithToolStripMenuItem.Visible       = isFile;

            toolStripSeparatorGitActions.Visible            = isFile;
            stopTrackingThisFileToolStripMenuItem.Visible   = isFile;
            stopTrackingThisFileToolStripMenuItem.Enabled   = isExistingFileOrDirectory;
            assumeUnchangedTheFileToolStripMenuItem.Visible = isFile;
            assumeUnchangedTheFileToolStripMenuItem.Enabled = isExistingFileOrDirectory;
            findToolStripMenuItem.Enabled = tvGitTree.Nodes.Count > 0;

            toolStripSeparatorFileTreeActions.Visible = isFile;
            expandSubtreeToolStripMenuItem.Visible    = isFolder;
        }
Example #7
0
        private ContextMenuDiffToolInfo GetContextMenuDiffToolInfo()
        {
            IList <GitRevision> selectedRevisions = _revisionGrid.GetSelectedRevisions();

            //Should be blocked in the GUI but not an error to show to the user
            Debug.Assert(selectedRevisions.Count == 1 || selectedRevisions.Count == 2,
                         "Unexpectedly number of revisions for difftool" + selectedRevisions.Count);
            if (selectedRevisions.Count < 1)
            {
                return(null);
            }

            bool aIsLocal        = false;
            bool bIsLocal        = false;
            bool showParentItems = selectedRevisions.Count == 2;

            bool localExists = false;
            bool bIsNormal   = false; //B is not new or deleted (we cannot easily check A)

            bIsLocal = selectedRevisions[0].Guid == GitRevision.UnstagedGuid;

            if (selectedRevisions.Count == 2)
            {
                aIsLocal = selectedRevisions[0].Guid == GitRevision.UnstagedGuid;
            }
            //Temporary, until parent is set to HEAD instead of staged
            else
            {
                aIsLocal = bIsLocal;
                bIsLocal = bIsLocal || selectedRevisions[0].Guid == GitRevision.IndexGuid;
            }

            //enable *<->Local items only when local file exists
            //no simple way to check if A (or A/B parents) is normal, ignore that some menus should be disabled
            foreach (var item in DiffFiles.SelectedItems)
            {
                bIsNormal = bIsNormal || !(item.IsNew || item.IsDeleted);
                string filePath = FormBrowseUtil.GetFullPathFromGitItemStatus(Module, item);
                if (File.Exists(filePath) || Directory.Exists(filePath))
                {
                    localExists = true;
                    if (localExists && bIsNormal)
                    {
                        break;
                    }
                }
            }

            var selectionInfo = new ContextMenuDiffToolInfo(aIsLocal, bIsLocal, bIsNormal, localExists, showParentItems);

            return(selectionInfo);
        }
Example #8
0
        private void openWithDifftoolToolStripMenuItem_DropDownOpening(object sender, EventArgs e)
        {
            bool artificialRevSelected = false;
            bool enableDiffDropDown    = true;
            bool showParentItems       = false;

            IList <GitRevision> revisions = _revisionGrid.GetSelectedRevisions();

            if (revisions.Count > 0)
            {
                artificialRevSelected = revisions[0].IsArtificial();

                if (revisions.Count == 2)
                {
                    artificialRevSelected = artificialRevSelected || revisions[revisions.Count - 1].IsArtificial();
                    showParentItems       = true;
                }
                else
                {
                    enableDiffDropDown = revisions.Count == 1;
                }
            }

            aBToolStripMenuItem.Enabled             = enableDiffDropDown;
            bLocalToolStripMenuItem.Enabled         = enableDiffDropDown;
            aLocalToolStripMenuItem.Enabled         = enableDiffDropDown;
            parentOfALocalToolStripMenuItem.Enabled = enableDiffDropDown;
            parentOfBLocalToolStripMenuItem.Enabled = enableDiffDropDown;

            parentOfALocalToolStripMenuItem.Visible = showParentItems;
            parentOfBLocalToolStripMenuItem.Visible = showParentItems;

            if (!enableDiffDropDown)
            {
                return;
            }
            //enable *<->Local items only when local file exists
            foreach (var item in DiffFiles.SelectedItems)
            {
                string filePath = FormBrowseUtil.GetFullPathFromGitItemStatus(Module, item);
                if (File.Exists(filePath))
                {
                    bLocalToolStripMenuItem.Enabled         = !artificialRevSelected;
                    aLocalToolStripMenuItem.Enabled         = !artificialRevSelected;
                    parentOfALocalToolStripMenuItem.Enabled = !artificialRevSelected;
                    parentOfBLocalToolStripMenuItem.Enabled = !artificialRevSelected;
                    return;
                }
            }
        }
Example #9
0
        private ContextMenuSelectionInfo GetSelectionInfo()
        {
            IList <GitRevision> selectedRevisions = _revisionGrid.GetSelectedRevisions();

            bool isAnyCombinedDiff        = DiffFiles.SelectedItemParents.Any(item => item == DiffFiles.CombinedDiff.Text);
            bool isExactlyOneItemSelected = DiffFiles.SelectedItems.Count() == 1;
            bool isAnyItemSelected        = DiffFiles.SelectedItems.Count() > 0;
            var  isCombinedDiff           = isExactlyOneItemSelected && DiffFiles.CombinedDiff.Text == DiffFiles.SelectedItemParent;
            var  selectedItemStatus       = DiffFiles.SelectedItem;
            bool isBareRepository         = Module.IsBareRepository();
            bool singleFileExists         = isExactlyOneItemSelected && File.Exists(FormBrowseUtil.GetFullPathFromGitItemStatus(Module, DiffFiles.SelectedItem));

            var selectionInfo = new ContextMenuSelectionInfo(selectedRevisions, selectedItemStatus, isAnyCombinedDiff, isExactlyOneItemSelected, isCombinedDiff, isAnyItemSelected, isBareRepository, singleFileExists);

            return(selectionInfo);
        }
Example #10
0
        private ContextMenuDiffToolInfo GetContextMenuDiffToolInfo()
        {
            IList <GitRevision> selectedRevisions = _revisionGrid.GetSelectedRevisions();

            //Should be blocked in the GUI but not an error to show to the user
            Debug.Assert(selectedRevisions.Count == 1 || selectedRevisions.Count == 2,
                         "Unexpectedly number of revisions for difftool" + selectedRevisions.Count);
            if (selectedRevisions.Count < 1 || selectedRevisions.Count > 2)
            {
                return(null);
            }

            bool aIsLocal = selectedRevisions.Count == 2 && selectedRevisions[1].Guid == GitRevision.UnstagedGuid;
            bool bIsLocal = selectedRevisions[0].Guid == GitRevision.UnstagedGuid;
            bool multipleRevisionsSelected = selectedRevisions.Count == 2;

            bool localExists = false;
            bool bIsNormal   = false; //B is assumed to be new or deleted (check from DiffFiles)

            //enable *<->Local items only when (any) local file exists
            foreach (var item in DiffFiles.SelectedItems)
            {
                bIsNormal = bIsNormal || !(item.IsNew || item.IsDeleted);
                string filePath = FormBrowseUtil.GetFullPathFromGitItemStatus(Module, item);
                if (File.Exists(filePath) || Directory.Exists(filePath))
                {
                    localExists = true;
                    if (localExists && bIsNormal)
                    {
                        break;
                    }
                }
            }

            var selectionInfo = new ContextMenuDiffToolInfo(aIsLocal, bIsLocal, bIsNormal, localExists, multipleRevisionsSelected);

            return(selectionInfo);
        }
Example #11
0
        private void FileTreeContextMenu_Opening(object sender, System.ComponentModel.CancelEventArgs e)
        {
            var gitItem        = tvGitTree.SelectedNode?.Tag as GitItem;
            var itemSelected   = gitItem is not null;
            var isFile         = itemSelected && gitItem.ObjectType == GitObjectType.Blob;
            var isFolder       = itemSelected && gitItem.ObjectType == GitObjectType.Tree;
            var isFileOrFolder = isFile || isFolder;

            // Many items does not make sense if a local file does not exist, why this is used for Enabled
            var isExistingFileOrDirectory = itemSelected && FormBrowseUtil.IsFileOrDirectory(_fullPathResolver.Resolve(gitItem.FileName));

            var openSubVisible = itemSelected && gitItem.ObjectType == GitObjectType.Commit && isExistingFileOrDirectory;

            openSubmoduleMenuItem.Visible = openSubVisible;
            if (openSubVisible)
            {
                if (!openSubmoduleMenuItem.Font.Bold)
                {
                    openSubmoduleMenuItem.Font = new Font(openSubmoduleMenuItem.Font, FontStyle.Bold);
                }

                if (fileHistoryToolStripMenuItem.Font.Bold)
                {
                    fileHistoryToolStripMenuItem.Font = new Font(fileHistoryToolStripMenuItem.Font, FontStyle.Regular);
                }
            }
            else if (!fileHistoryToolStripMenuItem.Font.Bold)
            {
                fileHistoryToolStripMenuItem.Font = new Font(fileHistoryToolStripMenuItem.Font, FontStyle.Bold);
            }

            // Diff with workTree (some tools like kdiff3 and meld allows diff to NUL)
            resetToThisRevisionToolStripMenuItem.Visible = itemSelected && !Module.IsBareRepository();
            toolStripSeparatorTopActions.Visible         = itemSelected && ((gitItem.ObjectType == GitObjectType.Commit && isExistingFileOrDirectory) ||
                                                                            !Module.IsBareRepository());

            // RememberFile diff can be done for folders too (as well as for submodules, but that is meaningless)
            // However diffs will open many windows that cannot be aborted, so it is blocked
            // Another reason is that file<->folder compare is not giving any result
            // (and diff is shared with Diff tab that has no notion of folders)
            openWithDifftoolToolStripMenuItem.Visible = isFile;
            openWithToolStripMenuItem.Visible         = isFile;
            openWithToolStripMenuItem.Enabled         = isExistingFileOrDirectory;
            var fsi = _rememberFileContextMenuController.CreateFileStatusItem(gitItem?.FileName, _revision);

            diffWithRememberedFileToolStripMenuItem.Visible = _rememberFileContextMenuController.RememberedDiffFileItem is not null;
            diffWithRememberedFileToolStripMenuItem.Enabled = isFile && fsi != _rememberFileContextMenuController.RememberedDiffFileItem &&
                                                              _rememberFileContextMenuController.ShouldEnableSecondItemDiff(fsi);
            diffWithRememberedFileToolStripMenuItem.Text =
                _rememberFileContextMenuController.RememberedDiffFileItem is not null
                    ? string.Format(Strings.DiffSelectedWithRememberedFile, _rememberFileContextMenuController.RememberedDiffFileItem.Item.Name)
                    : string.Empty;

            rememberFileStripMenuItem.Visible = isFile;
            rememberFileStripMenuItem.Enabled = _rememberFileContextMenuController.ShouldEnableFirstItemDiff(fsi, isSecondRevision: true);

            openFileToolStripMenuItem.Visible           = isFile;
            openFileWithToolStripMenuItem.Visible       = isFile;
            saveAsToolStripMenuItem.Visible             = isFile;
            editCheckedOutFileToolStripMenuItem.Visible = isFile;
            editCheckedOutFileToolStripMenuItem.Enabled = isExistingFileOrDirectory;
            toolStripSeparatorFileSystemActions.Visible = isFile;

            copyFilenameToClipboardToolStripMenuItem.Visible      = itemSelected;
            fileTreeOpenContainingFolderToolStripMenuItem.Visible = itemSelected;
            fileTreeOpenContainingFolderToolStripMenuItem.Enabled = isExistingFileOrDirectory;
            toolStripSeparatorFileNameActions.Visible             = itemSelected;

            fileHistoryToolStripMenuItem.Enabled              = itemSelected;
            blameToolStripMenuItem1.Visible                   = isFile;
            fileTreeArchiveToolStripMenuItem.Enabled          = itemSelected;
            fileTreeCleanWorkingTreeToolStripMenuItem.Visible = isFileOrFolder;
            fileTreeCleanWorkingTreeToolStripMenuItem.Enabled = isExistingFileOrDirectory;
            toolStripSeparatorGitActions.Visible              = itemSelected;

            stopTrackingThisFileToolStripMenuItem.Visible   = isFile;
            stopTrackingThisFileToolStripMenuItem.Enabled   = isExistingFileOrDirectory;
            assumeUnchangedTheFileToolStripMenuItem.Visible = isFile;
            assumeUnchangedTheFileToolStripMenuItem.Enabled = isExistingFileOrDirectory;
            toolStripSeparatorGitTrackingActions.Visible    = isFile;

            findToolStripMenuItem.Enabled          = tvGitTree.Nodes.Count > 0;
            expandSubtreeToolStripMenuItem.Visible = isFolder;
        }
Example #12
0
        private void DiffContextMenu_Opening(object sender, CancelEventArgs e)
        {
            bool artificialRevSelected;

            IList <GitRevision> selectedRevisions = _revisionGrid.GetSelectedRevisions();

            if (selectedRevisions.Count == 0)
            {
                artificialRevSelected = false;
            }
            else
            {
                artificialRevSelected = selectedRevisions[0].IsArtificial();
            }
            if (selectedRevisions.Count > 1)
            {
                artificialRevSelected = artificialRevSelected || selectedRevisions[selectedRevisions.Count - 1].IsArtificial();
            }

            //Many options have no meaning for artificial commits or submodules
            //Hide the obviously no action options when single selected, handle them in actions if multi select

            // disable items that need exactly one selected item
            bool isExactlyOneItemSelected = DiffFiles.SelectedItems.Count() == 1;
            var  isCombinedDiff           = isExactlyOneItemSelected &&
                                            DiffFiles.CombinedDiff.Text == DiffFiles.SelectedItemParent;
            var isAnyCombinedDiff = DiffFiles.SelectedItemParents.Any(item => item == DiffFiles.CombinedDiff.Text);

            openWithDifftoolToolStripMenuItem.Enabled           = !isAnyCombinedDiff;
            saveAsToolStripMenuItem1.Visible                    = !isCombinedDiff && isExactlyOneItemSelected && !DiffFiles.SelectedItem.IsSubmodule;
            cherryPickSelectedDiffFileToolStripMenuItem.Visible = !isCombinedDiff && isExactlyOneItemSelected &&
                                                                  !(DiffFiles.SelectedItem.IsSubmodule || selectedRevisions[0].Guid == GitRevision.UnstagedGuid ||
                                                                    (DiffFiles.SelectedItem.IsNew || DiffFiles.SelectedItem.IsDeleted) && selectedRevisions[0].Guid == GitRevision.IndexGuid);
            //Visibility of FileTree is not known, assume (CommitInfoTabControl.Contains(TreeTabPage);)
            diffShowInFileTreeToolStripMenuItem.Visible = isExactlyOneItemSelected && !selectedRevisions[0].IsArtificial();
            fileHistoryDiffToolstripMenuItem.Enabled    = isExactlyOneItemSelected && !(DiffFiles.SelectedItem.IsNew && selectedRevisions[0].IsArtificial());
            blameToolStripMenuItem.Enabled       = isExactlyOneItemSelected && !(DiffFiles.SelectedItem.IsSubmodule || selectedRevisions[0].IsArtificial());
            resetFileToToolStripMenuItem.Enabled = !isCombinedDiff &&
                                                   !(isExactlyOneItemSelected &&
                                                     (DiffFiles.SelectedItem.IsSubmodule || DiffFiles.SelectedItem.IsNew) && selectedRevisions[0].Guid == GitRevision.UnstagedGuid);

            this.diffEditFileToolStripMenuItem.Visible       =
                this.diffDeleteFileToolStripMenuItem.Visible =
                    isExactlyOneItemSelected && !DiffFiles.SelectedItem.IsSubmodule && selectedRevisions[0].IsArtificial();

            this.diffCommitSubmoduleChanges.Visible    =
                this.diffResetSubmoduleChanges.Visible =
                    this.diffStashSubmoduleChangesToolStripMenuItem.Visible =
                        this.diffUpdateSubmoduleMenuItem.Visible            =
                            this.diffSubmoduleSummaryMenuItem.Visible       =
                                isExactlyOneItemSelected && DiffFiles.SelectedItem.IsSubmodule && selectedRevisions[0].Guid == GitRevision.UnstagedGuid;
            this.diffUpdateSubmoduleMenuItem.Visible = false; //TBD

            this.diffToolStripSeparator13.Visible = isExactlyOneItemSelected &&
                                                    (!DiffFiles.SelectedItem.IsSubmodule && selectedRevisions[0].IsArtificial() ||
                                                     DiffFiles.SelectedItem.IsSubmodule && selectedRevisions[0].Guid == GitRevision.UnstagedGuid);

            // openContainingFolderToolStripMenuItem.Enabled or not
            {
                openContainingFolderToolStripMenuItem.Enabled = false;

                foreach (var item in DiffFiles.SelectedItems)
                {
                    string filePath = FormBrowseUtil.GetFullPathFromGitItemStatus(Module, item);
                    if (FormBrowseUtil.FileOrParentDirectoryExists(filePath))
                    {
                        openContainingFolderToolStripMenuItem.Enabled = true;
                        break;
                    }
                }
            }
        }
        private void FileTreeContextMenu_Opening(object sender, System.ComponentModel.CancelEventArgs e)
        {
            var gitItem        = tvGitTree.SelectedNode?.Tag as GitItem;
            var itemSelected   = gitItem != null;
            var isFile         = itemSelected && gitItem.ObjectType == GitObjectType.Blob;
            var isFolder       = itemSelected && gitItem.ObjectType == GitObjectType.Tree;
            var isFileOrFolder = isFile || isFolder;

            // Many items does not make sense if a local file does not exist, why this is used for Enabled
            var isExistingFileOrDirectory = itemSelected && FormBrowseUtil.IsFileOrDirectory(_fullPathResolver.Resolve(gitItem.FileName));

            var openSubVisible = itemSelected && gitItem.ObjectType == GitObjectType.Commit && isExistingFileOrDirectory;

            openSubmoduleMenuItem.Visible = openSubVisible;
            if (openSubVisible)
            {
                if (!openSubmoduleMenuItem.Font.Bold)
                {
                    openSubmoduleMenuItem.Font = new Font(openSubmoduleMenuItem.Font, FontStyle.Bold);
                }

                if (fileHistoryToolStripMenuItem.Font.Bold)
                {
                    fileHistoryToolStripMenuItem.Font = new Font(fileHistoryToolStripMenuItem.Font, FontStyle.Regular);
                }
            }
            else if (!fileHistoryToolStripMenuItem.Font.Bold)
            {
                fileHistoryToolStripMenuItem.Font = new Font(fileHistoryToolStripMenuItem.Font, FontStyle.Bold);
            }

            // Diff with workTree (some tools like kdiff3 and meld allows diff to NUL)
            resetToThisRevisionToolStripMenuItem.Visible = itemSelected && !Module.IsBareRepository();
            toolStripSeparatorTopActions.Visible         = itemSelected && ((gitItem.ObjectType == GitObjectType.Commit && isExistingFileOrDirectory) ||
                                                                            !Module.IsBareRepository());

            openWithDifftoolToolStripMenuItem.Visible   = isFile;
            openWithToolStripMenuItem.Visible           = isFile;
            openWithToolStripMenuItem.Enabled           = isExistingFileOrDirectory;
            openFileToolStripMenuItem.Visible           = isFile;
            openFileWithToolStripMenuItem.Visible       = isFile;
            saveAsToolStripMenuItem.Visible             = isFile;
            editCheckedOutFileToolStripMenuItem.Visible = isFile;
            editCheckedOutFileToolStripMenuItem.Enabled = isExistingFileOrDirectory;
            toolStripSeparatorFileSystemActions.Visible = isFile;

            copyFilenameToClipboardToolStripMenuItem.Visible      = itemSelected;
            fileTreeOpenContainingFolderToolStripMenuItem.Visible = itemSelected;
            fileTreeOpenContainingFolderToolStripMenuItem.Enabled = isExistingFileOrDirectory;
            toolStripSeparatorFileNameActions.Visible             = itemSelected;

            fileHistoryToolStripMenuItem.Enabled              = itemSelected;
            blameToolStripMenuItem1.Visible                   = isFile;
            fileTreeArchiveToolStripMenuItem.Enabled          = itemSelected;
            fileTreeCleanWorkingTreeToolStripMenuItem.Visible = isFileOrFolder;
            fileTreeCleanWorkingTreeToolStripMenuItem.Enabled = isExistingFileOrDirectory;
            toolStripSeparatorGitActions.Visible              = itemSelected;

            stopTrackingThisFileToolStripMenuItem.Visible   = isFile;
            stopTrackingThisFileToolStripMenuItem.Enabled   = isExistingFileOrDirectory;
            assumeUnchangedTheFileToolStripMenuItem.Visible = isFile;
            assumeUnchangedTheFileToolStripMenuItem.Enabled = isExistingFileOrDirectory;
            toolStripSeparatorGitTrackingActions.Visible    = isFile;

            findToolStripMenuItem.Enabled          = tvGitTree.Nodes.Count > 0;
            expandSubtreeToolStripMenuItem.Visible = isFolder;
        }