/// <summary> /// Constructor to create a new MSBuild.ProjectItem and add it to the project /// Only have internal constructors as the only one who should be creating /// such object is the project itself (see Project.CreateFileNode()). /// </summary> internal MsBuildProjectElement(ProjectNode project, string itemPath, string itemType) : base(project) { Utilities.ArgumentNotNullOrEmpty("itemPath", itemPath); Utilities.ArgumentNotNullOrEmpty("itemType", itemType); // create and add the item to the project _item = project.BuildProject.AddItem(itemType, Microsoft.Build.Evaluation.ProjectCollection.Escape(itemPath))[0]; }
/// <summary> /// Initializes the in memory project. Sets BuildEnabled on the project to true. /// </summary> /// <param name="engine">The build engine to use to create a build project.</param> /// <param name="fullProjectPath">The full path of the project.</param> /// <returns>A loaded msbuild project.</returns> internal static MSBuild.Project InitializeMsBuildProject(MSBuild.ProjectCollection buildEngine, string fullProjectPath) { Utilities.ArgumentNotNullOrEmpty("fullProjectPath", fullProjectPath); // Call GetFullPath to expand any relative path passed into this method. fullProjectPath = CommonUtils.NormalizePath(fullProjectPath); // Check if the project already has been loaded with the fullProjectPath. If yes return the build project associated to it. var loadedProject = new List <MSBuild.Project>(buildEngine.GetLoadedProjects(fullProjectPath)); var buildProject = loadedProject != null && loadedProject.Count > 0 && loadedProject[0] != null ? loadedProject[0] : null; if (buildProject == null) { buildProject = buildEngine.LoadProject(fullProjectPath); } return(buildProject); }
/// <summary> /// Performs a SaveAs operation of an open document. Called from SaveItem after the running document table has been updated with the new doc data. /// </summary> /// <param name="docData">A pointer to the document in the rdt</param> /// <param name="newFilePath">The new file path to the document</param> /// <returns></returns> internal override int AfterSaveItemAs(IntPtr docData, string newFilePath) { Utilities.ArgumentNotNullOrEmpty("newFilePath", newFilePath); int returnCode = VSConstants.S_OK; newFilePath = newFilePath.Trim(); //Identify if Path or FileName are the same for old and new file string newDirectoryName = CommonUtils.NormalizeDirectoryPath(Path.GetDirectoryName(newFilePath)); string oldDirectoryName = CommonUtils.NormalizeDirectoryPath(Path.GetDirectoryName(this.GetMkDocument())); bool isSamePath = CommonUtils.IsSameDirectory(newDirectoryName, oldDirectoryName); bool isSameFile = CommonUtils.IsSamePath(newFilePath, this.Url); //Get target container HierarchyNode targetContainer = null; bool isLink = false; if (isSamePath) { targetContainer = this.Parent; } else if (!CommonUtils.IsSubpathOf(this.ProjectMgr.ProjectHome, newDirectoryName)) { targetContainer = this.Parent; isLink = true; } else if (CommonUtils.IsSameDirectory(this.ProjectMgr.ProjectHome, newDirectoryName)) { //the projectnode is the target container targetContainer = this.ProjectMgr; } else { //search for the target container among existing child nodes targetContainer = this.ProjectMgr.FindNodeByFullPath(newDirectoryName); if (targetContainer != null && (targetContainer is FileNode)) { // We already have a file node with this name in the hierarchy. throw new InvalidOperationException(SR.GetString(SR.FileAlreadyExistsAndCannotBeRenamed, Path.GetFileName(newFilePath))); } } if (targetContainer == null) { // Add a chain of subdirectories to the project. string relativeUri = CommonUtils.GetRelativeDirectoryPath(this.ProjectMgr.ProjectHome, newDirectoryName); targetContainer = this.ProjectMgr.CreateFolderNodes(relativeUri); } Utilities.CheckNotNull(targetContainer, "Could not find a target container"); //Suspend file changes while we rename the document string oldrelPath = this.ItemNode.GetMetadata(ProjectFileConstants.Include); string oldName = CommonUtils.GetAbsoluteFilePath(this.ProjectMgr.ProjectHome, oldrelPath); SuspendFileChanges sfc = new SuspendFileChanges(this.ProjectMgr.Site, oldName); sfc.Suspend(); try { // Rename the node. DocumentManager.UpdateCaption(this.ProjectMgr.Site, Path.GetFileName(newFilePath), docData); // Check if the file name was actually changed. // In same cases (e.g. if the item is a file and the user has changed its encoding) this function // is called even if there is no real rename. if (!isSameFile || (this.Parent.ID != targetContainer.ID)) { // The path of the file is changed or its parent is changed; in both cases we have // to rename the item. if (isLink != IsLinkFile) { if (isLink) { var newPath = CommonUtils.GetRelativeFilePath( this.ProjectMgr.ProjectHome, Path.Combine(Path.GetDirectoryName(Url), Path.GetFileName(newFilePath)) ); ItemNode.SetMetadata(ProjectFileConstants.Link, newPath); } else { ItemNode.SetMetadata(ProjectFileConstants.Link, null); } SetIsLinkFile(isLink); } RenameFileNode(oldName, newFilePath, targetContainer); ProjectMgr.OnInvalidateItems(this.Parent); } } catch (Exception e) { Trace.WriteLine("Exception : " + e.Message); this.RecoverFromRenameFailure(newFilePath, oldrelPath); throw; } finally { sfc.Resume(); } return(returnCode); }