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;
}