private Addition CanAddFolderFromProjectReference()

in Nodejs/Product/Nodejs/SharedProject/ProjectNode.CopyPaste.cs [581:708]


            private Addition CanAddFolderFromProjectReference(string folderToAdd)
            {
                Utilities.ArgumentNotNullOrEmpty(nameof(folderToAdd), folderToAdd);

                var targetFolderNode = this.TargetNode.GetDragTargetHandlerNode();
                GetPathAndHierarchy(folderToAdd, out var folder, out var sourceHierarchy);

                // Ensure we don't end up in an endless recursion
                if (Utilities.IsSameComObject(this.Project, sourceHierarchy))
                {
                    if (StringComparer.OrdinalIgnoreCase.Equals(folder, targetFolderNode.FullPathToChildren))
                    {
                        if (this.DropEffect == DropEffect.Move &&
                            IsBadMove(targetFolderNode.FullPathToChildren, folder, false))
                        {
                            return null;
                        }
                    }

                    if (targetFolderNode.FullPathToChildren.StartsWith(folder, StringComparison.OrdinalIgnoreCase) &&
                        !StringComparer.OrdinalIgnoreCase.Equals(targetFolderNode.FullPathToChildren, folder))
                    {
                        // dragging a folder into a child, that's not allowed
                        Utilities.ShowMessageBox(
                            this.Project.Site,
                            SR.GetString(SR.CannotMoveIntoSubfolder, CommonUtils.GetFileOrDirectoryName(folder)),
                            null,
                            OLEMSGICON.OLEMSGICON_CRITICAL,
                            OLEMSGBUTTON.OLEMSGBUTTON_OK,
                            OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST);
                        return null;
                    }
                }

                var targetPath = Path.Combine(targetFolderNode.FullPathToChildren, CommonUtils.GetFileOrDirectoryName(folder));
                if (File.Exists(targetPath))
                {
                    Utilities.ShowMessageBox(
                       this.Project.Site,
                       SR.GetString(SR.CannotAddFileExists, CommonUtils.GetFileOrDirectoryName(folder)),
                       null,
                       OLEMSGICON.OLEMSGICON_CRITICAL,
                       OLEMSGBUTTON.OLEMSGBUTTON_OK,
                       OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST);
                    return null;
                }

                if (Directory.Exists(targetPath))
                {
                    if (this.DropEffect == DropEffect.Move)
                    {
                        if (targetPath == folderToAdd)
                        {
                            CannotMoveSameLocation(folderToAdd);
                        }
                        else
                        {
                            Utilities.ShowMessageBox(
                               this.Project.Site,
                               SR.GetString(SR.CannotMoveFolderExists, CommonUtils.GetFileOrDirectoryName(folder)),
                               null,
                               OLEMSGICON.OLEMSGICON_CRITICAL,
                               OLEMSGBUTTON.OLEMSGBUTTON_OK,
                               OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST);
                        }
                        return null;
                    }

                    var dialog = new OverwriteFileDialog(
                        SR.GetString(SR.OverwriteFilesInExistingFolder, CommonUtils.GetFileOrDirectoryName(folder)),
                        false
                    );
                    dialog.Owner = Application.Current.MainWindow;
                    var res = dialog.ShowDialog();
                    if (res == null)
                    {
                        // cancel, abort the whole copy
                        return null;
                    }
                    else if (!dialog.ShouldOverwrite)
                    {
                        // no, don't copy the folder
                        return SkipOverwriteAddition.Instance;
                    }
                    // otherwise yes, and we'll prompt about the files.
                }

                var targetFileName = CommonUtils.GetFileOrDirectoryName(folder);
                if (Utilities.IsSameComObject(this.Project, sourceHierarchy) &&
                    StringComparer.OrdinalIgnoreCase.Equals(targetFolderNode.FullPathToChildren, folder))
                {
                    // copying a folder onto its self, make a copy
                    targetFileName = GetCopyName(targetFolderNode.FullPathToChildren);
                }

                var additions = new List<Addition>();
                if (ErrorHandler.Failed(sourceHierarchy.ParseCanonicalName(folder, out var folderId)))
                {
                    // the folder may have been deleted between the copy & paste
                    ReportMissingItem(folder);
                    return null;
                }

                if (Path.Combine(targetFolderNode.FullPathToChildren, targetFileName).Length >= NativeMethods.MAX_FOLDER_PATH)
                {
                    Utilities.ShowMessageBox(
                        this.Project.Site,
                        SR.GetString(SR.FolderPathTooLongShortMessage),
                        null,
                        OLEMSGICON.OLEMSGICON_CRITICAL,
                        OLEMSGBUTTON.OLEMSGBUTTON_OK,
                        OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST);
                    return null;
                }

                if (!WalkSourceProjectAndAdd(sourceHierarchy, folderId, targetFolderNode.FullPathToChildren, false, additions, targetFileName))
                {
                    return null;
                }

                if (additions.Count == 1)
                {
                    return (FolderAddition)additions[0];
                }

                Debug.Assert(additions.Count == 0);
                return null;
            }