Update of /cvsroot/wix/wix/src/votive/Core/Infrastructure In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv18778/src/votive/Core/Infrastructure Modified Files: BuildableProjectConfiguration.cs FileHierarchyNode.cs FolderHierarchyNode.cs HelperMethods.cs Hierarchy.cs HierarchyNode.cs HierarchyNodeCollection.cs LibraryFileHierarchyNode.cs Package.cs ProjectFactory.cs ProjectFileXmlWriter.cs ProjectSerializer.cs RootHierarchyNode.cs SortedCollection.cs Tracer.cs VsBuildStatusEventListenerCollection.cs VsHelperMethods.cs VsHierarchyEventListenerCollection.cs Added Files: FileHierarchyNodeProperties.cs FolderHierarchyNodeProperties.cs HierarchyNodeProperties.cs LibraryFileHierarchyNodeProperties.cs RootHierarchyNodeProperties.cs Log Message: sca - support no logging for all websites sca - support INTERACTIVE user in secureobj sca - fix many small code quality/crash prevention bugs wixca - support XmlFile processing tallow - don't print out invalid Registry/@Name attributes votive - small fixes, lots of clean-up votive - install wixui libraries binder - better error reporting when cab can't find files linker - correctly handle ControlEventArg modularization compiler - remove deprecated code compiler - add support for new XmlFile action dark - clean up dark to not use old deprecated code paths localizer - allow same codepage to be provided multiple times localizer - allow comments at top of file Index: VsHierarchyEventListenerCollection.cs =================================================================== RCS file: /cvsroot/wix/wix/src/votive/Core/Infrastructure/VsHierarchyEventListenerCollection.cs,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** VsHierarchyEventListenerCollection.cs 7 Jul 2005 00:29:56 -0000 1.4 --- VsHierarchyEventListenerCollection.cs 20 Aug 2005 11:48:58 -0000 1.5 *************** *** 170,174 **** catch (Exception e) { ! Tracer.WriteLine(classType, "OnPropertyChanged", Tracer.Level.Warning, "There was an exception in the event listener {0} event handling code: {1}", this.CookieOf(i), e.ToString()); } } --- 170,174 ---- catch (Exception e) { ! Tracer.WriteLineWarning(classType, "OnPropertyChanged", "There was an exception in the event listener {0} event handling code: {1}", this.CookieOf(i), e.ToString()); } } Index: SortedCollection.cs =================================================================== RCS file: /cvsroot/wix/wix/src/votive/Core/Infrastructure/SortedCollection.cs,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** SortedCollection.cs 7 Jul 2005 00:29:56 -0000 1.3 --- SortedCollection.cs 20 Aug 2005 11:48:58 -0000 1.4 *************** *** 183,186 **** --- 183,191 ---- } + /// <summary> + /// Removes the element at the specified index after <see cref="OnRemove"/> is called but + /// before <see cref="OnRemoveComplete"/> is called. + /// </summary> + /// <param name="index">A zero-based index of the item to remove.</param> public void RemoveAt(int index) { *************** *** 192,200 **** object value = this.InnerList[index]; this.OnRemove(index, value); - this.list.RemoveAt(index); - this.OnRemoveComplete(index, value); ! // Raise the CollectionChanged event. this.OnCollectionChanged(new CollectionChangeEventArgs(CollectionChangeAction.Remove, value)); } --- 197,206 ---- object value = this.InnerList[index]; this.OnRemove(index, value); ! // Raise the CollectionChanged event before completing the remove. this.OnCollectionChanged(new CollectionChangeEventArgs(CollectionChangeAction.Remove, value)); + + this.list.RemoveAt(index); + this.OnRemoveComplete(index, value); } Index: VsHelperMethods.cs =================================================================== RCS file: /cvsroot/wix/wix/src/votive/Core/Infrastructure/VsHelperMethods.cs,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** VsHelperMethods.cs 7 Jul 2005 00:29:56 -0000 1.3 --- VsHelperMethods.cs 20 Aug 2005 11:48:58 -0000 1.4 *************** *** 63,67 **** if (rdt == null) { ! Tracer.WriteLineVerbose(classType, "TraceRunningDocuments", "Cannot get an instance of IVsRunningDocumentTable to use for enumerating the running documents."); return; } --- 63,67 ---- if (rdt == null) { ! Tracer.WriteLineWarning(classType, "TraceRunningDocuments", "Cannot get an instance of IVsRunningDocumentTable to use for enumerating the running documents."); return; } *************** *** 72,76 **** if (NativeMethods.Failed(hr)) { ! Tracer.WriteLineVerbose(classType, "TraceRunningDocuments", "Cannot get an instance of IEnumRunningDocuments to use for enumerating the running documents."); return; } --- 72,76 ---- if (NativeMethods.Failed(hr)) { ! Tracer.WriteLineWarning(classType, "TraceRunningDocuments", "Cannot get an instance of IEnumRunningDocuments to use for enumerating the running documents."); return; } *************** *** 85,89 **** if (NativeMethods.Failed(hr)) { ! Tracer.WriteLineVerbose(classType, "TraceRunningDocuments", "The enumeration failed for the running documents. Hr=0x{0:X}", hr); return; } --- 85,89 ---- if (NativeMethods.Failed(hr)) { ! Tracer.WriteLineWarning(classType, "TraceRunningDocuments", "The enumeration failed for the running documents. Hr=0x{0:X}", hr); return; } *************** *** 99,103 **** if (cookie == DocumentInfo.NullCookie) { ! Tracer.WriteLineVerbose(classType, "TraceRunningDocuments", "There is a null cookie value in the RDT, which shouldn't be happening."); } else --- 99,103 ---- if (cookie == DocumentInfo.NullCookie) { ! Tracer.WriteLineWarning(classType, "TraceRunningDocuments", "There is a null cookie value in the RDT, which shouldn't be happening."); } else --- NEW FILE: FileHierarchyNodeProperties.cs --- //------------------------------------------------------------------------------------------------- // <copyright file="FileHierarchyNodeProperties.cs" company="Microsoft"> // Copyright (c) Microsoft Corporation. All rights reserved. // // The use and distribution terms for this software are covered by the // Common Public License 1.0 (http://opensource.org/licenses/cpl.php) // which can be found in the file CPL.TXT at the root of this distribution. // By using this software in any fashion, you are agreeing to be bound by // the terms of this license. // // You must not remove this notice, or any other, from this software. // </copyright> // // <summary> // Properties for a file node within a Solution Explorer hierarchy. // </summary> //------------------------------------------------------------------------------------------------- namespace Microsoft.Tools.WindowsInstallerXml.VisualStudio.Infrastructure { using System; using System.ComponentModel; using System.Runtime.InteropServices; /// <summary> /// Represents properties for a file node in a Solution Explorer hierarchy /// that will be shown in the Properties window. /// </summary> internal class FileHierarchyNodeProperties : HierarchyNodeProperties { #region Member Variables //========================================================================================== // Member Variables //========================================================================================== #endregion #region Constructors //========================================================================================== // Constructors //========================================================================================== /// <summary> /// Initializes a new instance of the <see cref="FileHierarchyNodeProperties"/> class. /// </summary> public FileHierarchyNodeProperties(FileHierarchyNode node) : base(node) { } #endregion #region Properties //========================================================================================== // Properties //========================================================================================== /// <summary> /// Gets or sets the build action for the attached node. /// </summary> [Category("Advanced")] [Description("How the file related to the build and deployment processes.")] public BuildAction BuildAction { get { return this.Node.BuildAction; } set { this.Node.BuildAction = value; } } /// <summary> /// Gets or sets the file name (caption) of the attached node. /// </summary> [Category("Misc")] [Description("Name of the file or folder.")] public string FileName { get { return this.Node.Caption; } set { this.Node.Caption = value; } } /// <summary> /// Gets the full path to the file. /// </summary> [Category("Misc")] [Description("Location of the file.")] public string FullPath { get { return this.Node.AbsolutePath; } } /// <summary> /// Gets the <see cref="FileHierarchyNode"/> that this properties object is attached to. /// </summary> public new FileHierarchyNode Node { get { return (FileHierarchyNode)base.Node; } } #endregion #region Methods //========================================================================================== // Methods //========================================================================================== #endregion } } Index: HierarchyNode.cs =================================================================== RCS file: /cvsroot/wix/wix/src/votive/Core/Infrastructure/HierarchyNode.cs,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** HierarchyNode.cs 7 Jul 2005 00:29:55 -0000 1.5 --- HierarchyNode.cs 20 Aug 2005 11:48:58 -0000 1.6 *************** *** 49,55 **** private uint hierarchyId; private bool isDirty; - private HierarchyNode nextSibling; private FolderHierarchyNode parent; - private HierarchyNode previousSibling; #endregion --- 49,53 ---- *************** *** 170,230 **** { // Do a case-sensitive comparison using the current culture. ! if (String.Compare(this.Caption, value, false, CultureInfo.CurrentUICulture) != 0) { ! // If the old and the new caption differ in just case, then we won't do any ! // file moving since the file system is case-insensitive. We do want to allow ! // users to change the case on their captions, though. ! bool differInCaseOnly = (String.Compare(this.Caption, value, true, CultureInfo.CurrentUICulture) == 0); ! string oldPath = this.AbsolutePath; ! string newPath = Path.Combine(Path.GetDirectoryName(HelperMethods.StripTrailingChar(this.AbsolutePath, Path.DirectorySeparatorChar)), value); ! ! if (!differInCaseOnly && !this.VerifyCaption(value, newPath)) { ! // If the caption is not valid we have to re-enable the edit mode on the node. ! this.StartNodeEdit(); } - else - { - this.AbsolutePath = newPath; ! // Move the file/directory on the file system to match the new name. ! if (!differInCaseOnly && this.IsFolder && !this.IsVirtual && Directory.Exists(oldPath) && !Directory.Exists(newPath)) ! { ! Directory.Move(oldPath, newPath); ! } ! else if (!differInCaseOnly && this.IsFile && !this.IsVirtual && File.Exists(oldPath) && !File.Exists(newPath)) ! { ! File.Move(oldPath, newPath); ! } ! // Change the RDT and any open window frames to point to the new name. ! this.RenameDocument(oldPath, newPath); ! // If we've only changed the case, then we don't have to readd the node. ! if (differInCaseOnly) { ! this.Hierarchy.OnInvalidateItems(this.Parent); } ! else ! { ! // We have to remove the node and re-add it so that we can have the sorting preserved. ! // Also, if the extension has changed then we'll have to recreate a new type-specific ! // FileHierarchyNode. The easy way is to remove ourself from the project then tell ! // the project to add an existing file. ! // If we are currently selected, cache the value so we can restore the selection ! // after the addition. ! bool wasSelected = this.Selected; ! string newRelativePath = HelperMethods.MakeRelative(this.Parent.AbsoluteDirectory, newPath); ! // Remove ourself. ! this.RemoveFromProject(); ! // Re-add ourself as a new incarnation (different object). Our life ends here. ! HierarchyNode newNode = this.Hierarchy.AddExistingFile(newRelativePath, true); ! if (wasSelected) ! { ! newNode.Select(); ! } } } --- 168,268 ---- { // Do a case-sensitive comparison using the current culture. ! if (String.Compare(this.Caption, value, false, CultureInfo.CurrentCulture) == 0) { ! // If the caption is the same, then we don't need to do anything. ! return; ! } ! ! // Make sure the new caption is a valid file/folder name. ! if (!HelperMethods.IsValidFileOrFolderName(value)) ! { ! Package.Instance.Context.ShowErrorMessageBox(ResourceId.IDS_E_INVALIDFILENAME); ! this.StartNodeEdit(); ! return; ! } ! ! // If the old and the new caption differ in just case, then we won't do any ! // file moving since the file system is case-insensitive. We do want to allow ! // users to change the case on their captions, though. ! bool differInCaseOnly = (String.Compare(this.Caption, value, true, CultureInfo.CurrentCulture) == 0); ! string oldPath = this.AbsolutePath; ! string newPath = Path.Combine(Path.GetDirectoryName(HelperMethods.StripTrailingChar(this.AbsolutePath, Path.DirectorySeparatorChar)), value); ! ! // If the caption is not valid we have to re-enable the edit mode on the node. ! if (!differInCaseOnly && !this.VerifyCaption(value, newPath)) ! { ! this.StartNodeEdit(); ! return; ! } ! ! if (this.IsFolder) ! { ! // Move the directory on the file system to match the new name. ! if (!differInCaseOnly && !this.IsVirtual && Directory.Exists(oldPath) && !Directory.Exists(newPath)) { ! Tracer.WriteLineInformation(classType, "set_Caption", "Renaming the directory '{0}' to '{1}'.", oldPath, newPath); ! Directory.Move(oldPath, newPath); } ! // Change the relative path of all of the children. ! this.AbsolutePath = newPath; ! ChangeRelativePathOfChildren(newPath, this as FolderHierarchyNode); ! // Inform the environment that we just changed the caption. ! this.OnPropertyChanged(__VSHPROPID.VSHPROPID_Caption); ! } ! else ! { ! Tracer.Assert(this.IsFile, "The hierarchy node '{0}' should either be a file, but it's reporting that it's not.", this.AbsolutePath); ! // See if the user is changing the extension. If so, ask if he really wants to do that. ! string oldExtension = Path.GetExtension(oldPath); ! string newExtension = Path.GetExtension(newPath); ! if (String.Compare(oldExtension, newExtension, true, CultureInfo.CurrentCulture) != 0) ! { ! PackageContext context = Package.Instance.Context; ! string message = context.Resources.GetString(ResourceId.IDS_PROMPTCHANGEEXTENSION); ! VsMessageBoxResult result = context.ShowMessageBox(message, OLEMSGBUTTON.OLEMSGBUTTON_YESNO, OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST, OLEMSGICON.OLEMSGICON_INFO); ! if (result == VsMessageBoxResult.No) { ! return; } ! } ! // Move the file on the file system to match the new name. ! if (!differInCaseOnly && !this.IsVirtual && File.Exists(oldPath) && !File.Exists(newPath)) ! { ! Tracer.WriteLineInformation(classType, "set_Caption", "Renaming the file '{0}' to '{1}'.", oldPath, newPath); ! File.Move(oldPath, newPath); ! } ! // Change the RDT and any open window frames to point to the new name. ! this.RenameDocument(oldPath, newPath); ! // If we've only changed the case, then we don't have to re-add the node. ! if (differInCaseOnly) ! { ! this.OnPropertyChanged(__VSHPROPID.VSHPROPID_Caption); ! } ! else ! { ! // We have to remove the node and re-add it so that we can have the sorting preserved. ! // Also, if the extension has changed then we'll have to recreate a new type-specific ! // FileHierarchyNode. The easy way is to remove ourself from the project then tell ! // the project to add an existing file. ! ! // If we are currently selected, cache the value so we can restore the selection ! // after the addition. ! bool wasSelected = this.Selected; ! string newRelativePath = HelperMethods.MakeRelative(this.Hierarchy.RootNode.AbsoluteDirectory, newPath); ! ! // Remove ourself. ! this.RemoveFromProject(); ! ! // Re-add ourself as a new incarnation (different object). Our life ends here. ! HierarchyNode newNode = this.Hierarchy.AddExistingFile(newRelativePath, true); ! if (wasSelected) ! { ! newNode.Select(); } } *************** *** 297,310 **** public abstract bool IsVirtual { get; } public virtual HierarchyNode NextSibling { ! get { return this.nextSibling; } ! set { ! if (this.NextSibling != value) { ! this.nextSibling = value; ! this.OnPropertyChanged(__VSHPROPID.VSHPROPID_NextSibling); } } } --- 335,357 ---- public abstract bool IsVirtual { get; } + /// <summary> + /// Gets the next sibling of this node if it has one or null if it's the last sibling. + /// </summary> public virtual HierarchyNode NextSibling { ! get { ! if (this.Parent == null) { ! return null; } + + HierarchyNodeCollection siblings = this.Parent.Children; + int thisIndex = siblings.IndexOf(this.HierarchyId); + if (thisIndex + 1 < siblings.Count) + { + return siblings[thisIndex + 1]; + } + return null; } } *************** *** 328,335 **** } public HierarchyNode PreviousSibling { ! get { return this.previousSibling; } ! set { this.previousSibling = value; } } --- 375,406 ---- } + /// <summary> + /// Gets the previous sibling of this node if there is one, or null if this is the first sibling. + /// </summary> public HierarchyNode PreviousSibling { ! get ! { ! if (this.Parent == null) ! { ! return null; ! } ! ! HierarchyNodeCollection siblings = this.Parent.Children; ! int thisIndex = siblings.IndexOf(this.HierarchyId); ! if (thisIndex > 0) ! { ! return siblings[thisIndex - 1]; ! } ! return null; ! } ! } ! ! /// <summary> ! /// Gets the node's properties to show in the Property window. ! /// </summary> ! public virtual HierarchyNodeProperties Properties ! { ! get { return null; } } *************** *** 538,541 **** --- 609,619 ---- switch (propertyId) { + case __VSHPROPID.VSHPROPID_BrowseObject: + if (this.Properties != null) + { + propertyValue = new DispatchWrapper(this.Properties); + } + break; + case __VSHPROPID.VSHPROPID_Caption: propertyValue = this.Caption; *************** *** 882,885 **** --- 960,988 ---- /// <summary> + /// Recursively changes the relative path of the specified node's children. Called when the + /// folder name changes. + /// </summary> + /// <param name="newParentAbsolutePath">The new absolute path of the parent.</param> + /// <param name="parent">The parent that changed.</param> + protected static void ChangeRelativePathOfChildren(string newParentAbsolutePath, FolderHierarchyNode parent) + { + Tracer.VerifyStringArgument(newParentAbsolutePath, "newParentAbsolutePath"); + Tracer.VerifyNonNullArgument(parent, "parent"); + + foreach (HierarchyNode child in parent.Children) + { + // Change the child's absolute path to it's parent's new root directory. + child.AbsolutePath = Path.Combine(parent.AbsoluteDirectory, Path.GetFileName(child.AbsolutePath)); + // Recursive step + if (child.IsFolder) + { + FolderHierarchyNode childAsFolder = child as FolderHierarchyNode; + Tracer.Assert(childAsFolder != null, "The node '{0}' indicates that it is a folder, but it is not a FolderHierarchyNode.", child.AbsolutePath); + ChangeRelativePathOfChildren(child.AbsolutePath, child as FolderHierarchyNode); + } + } + } + + /// <summary> /// Canonicalizes the specified path as a file path. If it should be canonicalized as a folder path /// then the subclass should override. *************** *** 957,960 **** --- 1060,1064 ---- try { + Tracer.WriteLineInformation(classType, "RenameDocument", "Renaming the open document in the RDT from '{0}' to '{1}'.", oldAbsolutePath, newAbsolutePath); NativeMethods.ThrowOnFailure(rdt.RenameDocument(oldAbsolutePath, newAbsolutePath, pIVsHierarchy, itemId)); } *************** *** 1049,1053 **** if (!valid) { ! Tracer.WriteLineVerbose(classType, "VerifyCaption", "An existing file or folder named '{0}' already exists on the disk.", newCaption); PackageContext context = Package.Instance.Context; string title = context.Resources.GetString(ResId.IDS_E_ITEMALREADYEXISTSONDISK_TITLE, newCaption); --- 1153,1157 ---- if (!valid) { ! Tracer.WriteLineInformation(classType, "VerifyCaption", "An existing file or folder named '{0}' already exists on the disk.", newCaption); PackageContext context = Package.Instance.Context; string title = context.Resources.GetString(ResId.IDS_E_ITEMALREADYEXISTSONDISK_TITLE, newCaption); Index: ProjectSerializer.cs =================================================================== RCS file: /cvsroot/wix/wix/src/votive/Core/Infrastructure/ProjectSerializer.cs,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** ProjectSerializer.cs 7 Jul 2005 00:29:56 -0000 1.5 --- ProjectSerializer.cs 20 Aug 2005 11:48:58 -0000 1.6 *************** *** 333,337 **** if (!this.Project.IsDirty && !forceSave) { ! Tracer.WriteLineVerbose(classType, "Save", "The project doesn't need to be saved."); return true; } --- 333,337 ---- if (!this.Project.IsDirty && !forceSave) { ! Tracer.WriteLineInformation(classType, "Save", "The project doesn't need to be saved."); return true; } *************** *** 442,446 **** { value = null; ! Tracer.WriteLineVerbose(classType, "GetRequiredAttribute", "Missing required attribute '{0}' from '{1}'.", name, node.Name); if (!this.SilentFailures) { --- 442,446 ---- { value = null; ! Tracer.WriteLineWarning(classType, "GetRequiredAttribute", "Missing required attribute '{0}' from '{1}'.", name, node.Name); if (!this.SilentFailures) { *************** *** 641,645 **** catch (Exception e) { ! Tracer.WriteLineVerbose(classType, "ReadProjectNode", "Cannot parse the SchemaVersion attribute {0}: {1}.", schemaString, e.ToString()); } if (fileSchemaVersion < this.SchemaVersion) --- 641,645 ---- catch (Exception e) { ! Tracer.WriteLineWarning(classType, "ReadProjectNode", "Cannot parse the SchemaVersion attribute {0}: {1}.", schemaString, e.ToString()); } if (fileSchemaVersion < this.SchemaVersion) *************** *** 708,712 **** if (node.Name != name) { ! Tracer.WriteLineVerbose(classType, "VerifyNode", "Missing '{0}' element in the project file '{1}'.", name, this.Project.FilePath); if (!this.SilentFailures) { --- 708,712 ---- if (node.Name != name) { ! Tracer.WriteLineWarning(classType, "VerifyNode", "Missing '{0}' element in the project file '{1}'.", name, this.Project.FilePath); if (!this.SilentFailures) { Index: LibraryFileHierarchyNode.cs =================================================================== RCS file: /cvsroot/wix/wix/src/votive/Core/Infrastructure/LibraryFileHierarchyNode.cs,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** LibraryFileHierarchyNode.cs 7 Jul 2005 00:29:55 -0000 1.3 --- LibraryFileHierarchyNode.cs 20 Aug 2005 11:48:58 -0000 1.4 *************** *** 25,29 **** /// A library file node within the Solution Explorer hierarchy. /// </summary> ! internal class LibraryFileHierarchyNode : WixFileHierarchyNode { #region Constructors --- 25,29 ---- /// A library file node within the Solution Explorer hierarchy. /// </summary> ! internal class LibraryFileHierarchyNode : FileHierarchyNode { #region Constructors *************** *** 47,50 **** --- 47,58 ---- } + /// <summary> + /// Gets the node's properties to show in the Property window. + /// </summary> + public override HierarchyNodeProperties Properties + { + get { return new LibraryFileHierarchyNodeProperties(this); } + } + public override VsMenus.ContextMenuId VisualStudioContextMenuId { Index: Hierarchy.cs =================================================================== RCS file: /cvsroot/wix/wix/src/votive/Core/Infrastructure/Hierarchy.cs,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** Hierarchy.cs 7 Jul 2005 00:29:55 -0000 1.5 --- Hierarchy.cs 20 Aug 2005 11:48:58 -0000 1.6 *************** *** 804,808 **** { canceled = true; ! Tracer.WriteLineVerbose(classType, "AddCopyOfFile", "The user canceled the add copy of file operation."); return null; } --- 804,808 ---- { canceled = true; ! Tracer.WriteLineInformation(classType, "AddCopyOfFile", "The user canceled the add copy of file operation."); return null; } *************** *** 820,828 **** if (File.Exists(destinationPath)) { ! Tracer.WriteLineVerbose(classType, "AddCopyOfFile", "Overwriting the existing file at '{0}' with '{1}'.", destinationPath, sourcePath); } else { ! Tracer.WriteLineVerbose(classType, "AddCopyOfFile", "Copying '{0}' to '{1}'.", sourcePath, destinationPath); } // Copy the file to the right location. --- 820,828 ---- if (File.Exists(destinationPath)) { ! Tracer.WriteLineInformation(classType, "AddCopyOfFile", "Overwriting the existing file at '{0}' with '{1}'.", destinationPath, sourcePath); } else { ! Tracer.WriteLineInformation(classType, "AddCopyOfFile", "Copying '{0}' to '{1}'.", sourcePath, destinationPath); } // Copy the file to the right location. *************** *** 1007,1011 **** if (!Directory.Exists(folderPath)) { ! Tracer.WriteLineVerbose(classType, "EnsureFolder", "Creating directory '{0}' in the file system.", folderPath); Directory.CreateDirectory(folderPath); } --- 1007,1011 ---- if (!Directory.Exists(folderPath)) { ! Tracer.WriteLineInformation(classType, "EnsureFolder", "Creating directory '{0}' in the file system.", folderPath); Directory.CreateDirectory(folderPath); } *************** *** 1368,1375 **** private void WriteSummary(object sender, EventArgs e) { ! WritePropertySummary(this.supportedGets, "Summary of supported get properties:"); ! WritePropertySummary(this.unsupportedGets, "Summary of unsupported get properties:"); ! WritePropertySummary(this.supportedSets, "Summary of supported set properties:"); ! WritePropertySummary(this.unsupportedSets, "Summary of unsupported set properties:"); } #endregion --- 1368,1376 ---- private void WriteSummary(object sender, EventArgs e) { ! string projectEnd = " for project '" + this.RootNode.Caption + "':"; ! WritePropertySummary(this.supportedGets, "Summary of supported get properties" + projectEnd); ! WritePropertySummary(this.unsupportedGets, "Summary of unsupported get properties" + projectEnd); ! WritePropertySummary(this.supportedSets, "Summary of supported set properties" + projectEnd); ! WritePropertySummary(this.unsupportedSets, "Summary of unsupported set properties" + projectEnd); } #endregion Index: ProjectFileXmlWriter.cs =================================================================== RCS file: /cvsroot/wix/wix/src/votive/Core/Infrastructure/ProjectFileXmlWriter.cs,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** ProjectFileXmlWriter.cs 7 Jul 2005 00:29:56 -0000 1.3 --- ProjectFileXmlWriter.cs 20 Aug 2005 11:48:58 -0000 1.4 *************** *** 229,316 **** #endregion } - // internal sealed class ProjectFileXmlWriter : XmlTextWriter - // { - // #region Member Variables - // //========================================================================================== - // // Member Variables - // //========================================================================================== - // - // private int depth; - // private string filePath; - // private string indentString; - // private TextWriter writer; - // #endregion - // - // #region Constructors - // //========================================================================================== - // // Constructors - // //========================================================================================== - // - // /// <summary> - // /// Initializes a new instance of the <see cref="ProjectFileXmlWriter"/> class using - // /// the specified file. - // /// </summary> - // /// <param name="filePath">The filename to write to. If the file exists, it will truncate - // /// it and overwrite it with the new content.</param> - // /// <param name="encoding">The encoding to use.</param> - // public ProjectFileXmlWriter(TextWriter writer) : base(writer) - // { - // this.filePath = filePath; - // this.Formatting = Formatting.Indented; - // this.writer = writer; - // } - // #endregion - // - // #region Properties - // //========================================================================================== - // // Properties - // //========================================================================================== - // - // public string FilePath - // { - // get { return this.filePath; } - // } - // - // private string IndentString - // { - // get - // { - // if (this.indentString == null) - // { - // this.indentString = new string(this.IndentChar, this.Indentation); - // } - // return this.indentString; - // } - // } - // #endregion - // - // #region Methods - // //========================================================================================== - // // Methods - // //========================================================================================== - // - // public override void WriteEndAttribute() - // { - // base.WriteEndAttribute(); - // // Now write a line followed by the number of indentations. - // this.writer.WriteLine(); - // for (int i = 0; i < this.depth; i++) - // { - // this.writer.Write(this.IndentString); - // } - // } - // - // public override void WriteEndElement() - // { - // base.WriteEndElement(); - // this.depth--; - // } - // - // public override void WriteStartElement(string prefix, string localName, string ns) - // { - // base.WriteStartElement(prefix, localName, ns); - // this.depth++; - // } - // #endregion - // } } --- 229,231 ---- Index: Package.cs =================================================================== RCS file: /cvsroot/wix/wix/src/votive/Core/Infrastructure/Package.cs,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** Package.cs 7 Jul 2005 00:29:56 -0000 1.3 --- Package.cs 20 Aug 2005 11:48:58 -0000 1.4 *************** *** 560,564 **** int IOleServiceProvider.QueryService(ref Guid sid, ref Guid iid, out IntPtr ppvObj) { ! Tracer.WriteLine(classType, "IOleServiceProvider.QueryService", Tracer.Level.Verbose, "Querying for service {0}", sid.ToString("B")); ppvObj = IntPtr.Zero; int hr = NativeMethods.S_OK; --- 560,564 ---- int IOleServiceProvider.QueryService(ref Guid sid, ref Guid iid, out IntPtr ppvObj) { ! Tracer.WriteLineVerbose(classType, "IOleServiceProvider.QueryService", "Querying for service {0}", sid.ToString("B")); ppvObj = IntPtr.Zero; int hr = NativeMethods.S_OK; *************** *** 580,584 **** if (service == null) { ! Tracer.WriteLine(classType, "IOleServiceProvider.QueryService", Tracer.Level.Verbose, "Could not find service {0}", sid.ToString("B")); return NativeMethods.E_NOINTERFACE; } --- 580,584 ---- if (service == null) { ! Tracer.WriteLineVerbose(classType, "IOleServiceProvider.QueryService", "Could not find service {0}", sid.ToString("B")); return NativeMethods.E_NOINTERFACE; } *************** *** 937,941 **** // Create the Project Factory and register our project types. ! Tracer.WriteLineVerbose(classType, "Initialize", "Creating the project factory and registering our project types."); IVsRegisterProjectTypes regProjTypes = (IVsRegisterProjectTypes)this.GetService(typeof(IVsRegisterProjectTypes)); if (regProjTypes == null) --- 937,941 ---- // Create the Project Factory and register our project types. ! Tracer.WriteLineInformation(classType, "Initialize", "Creating the project factory and registering our project types."); IVsRegisterProjectTypes regProjTypes = (IVsRegisterProjectTypes)this.GetService(typeof(IVsRegisterProjectTypes)); if (regProjTypes == null) --- NEW FILE: HierarchyNodeProperties.cs --- //------------------------------------------------------------------------------------------------- // <copyright file="HierarchyNodeProperties.cs" company="Microsoft"> // Copyright (c) Microsoft Corporation. All rights reserved. // // The use and distribution terms for this software are covered by the // Common Public License 1.0 (http://opensource.org/licenses/cpl.php) // which can be found in the file CPL.TXT at the root of this distribution. // By using this software in any fashion, you are agreeing to be bound by // the terms of this license. // // You must not remove this notice, or any other, from this software. // </copyright> // // <summary> // Properties for a node within a Solution Explorer hierarchy. // </summary> //------------------------------------------------------------------------------------------------- namespace Microsoft.Tools.WindowsInstallerXml.VisualStudio.Infrastructure { using System; using System.ComponentModel; using System.Runtime.InteropServices; using Microsoft.VisualStudio.OLE.Interop; using Microsoft.VisualStudio.Shell.Interop; /// <summary> /// Abstract base class representing properties for a node in a Solution Explorer hierarchy /// that will be shown in the Properties window. /// </summary> internal class HierarchyNodeProperties // : ICustomTypeDescriptor, ISpecifyPropertyPages { #region Member Variables //========================================================================================== // Member Variables //========================================================================================== private HierarchyNode node; #endregion #region Constructors //========================================================================================== // Constructors //========================================================================================== /// <summary> /// Initializes a new instance of the <see cref="HierarchyNodeProperties"/> class. /// </summary> protected HierarchyNodeProperties(HierarchyNode node) { Tracer.VerifyNonNullArgument(node, "node"); this.node = node; } #endregion #region Properties //========================================================================================== // Properties //========================================================================================== [Category("Miscellaneous")] [Description("My description")] public string MyProp { get { return "My property"; } set { value = value; } } /// <summary> /// Gets the <see cref="HierarchyNode"/> that this properties object is attached to. /// </summary> internal HierarchyNode Node { get { return this.node; } } #endregion // // #region ICustomTypeDescriptor Implementation // //========================================================================================== // // ICustomTypeDescriptor Implementation // //========================================================================================== // // /// <summary> // /// Returns a collection of type <see cref="Attribute"/> for this object. // /// </summary> // /// <returns>An <see cref="AttributeCollection"/> with the attributes for this object.</returns> // AttributeCollection ICustomTypeDescriptor.GetAttributes() // { // AttributeCollection attributes = TypeDescriptor.GetAttributes(this, true); // return attributes; // } // // /// <summary> // /// Returns the class name of this object. // /// </summary> // /// <returns>The class name of the object, or null if the class does not have a name.</returns> // string ICustomTypeDescriptor.GetClassName() // { // string className = this.GetType().Name; // return className; // } // // /// <summary> // /// Returns the name of this object. // /// </summary> // /// <returns>The name of the object, or null if the class does not have a name.</returns> // string ICustomTypeDescriptor.GetComponentName() // { // string componentName = TypeDescriptor.GetComponentName(this, true); // return componentName; // } // // /// <summary> // /// Returns a type converter for this object. // /// </summary> // /// <returns>A <see cref="TypeConverter"/> that is the converter for this object, or null if there is no <b>TypeConverter</b> for this object.</returns> // TypeConverter ICustomTypeDescriptor.GetConverter() // { // TypeConverter converter = TypeDescriptor.GetConverter(this, true); // return converter; // } // // /// <summary> // /// Returns the default event for this object. // /// </summary> // /// <returns>An <see cref="EventDescriptor"/> that represents the default event for this object, or null if this object does not have events.</returns> // EventDescriptor ICustomTypeDescriptor.GetDefaultEvent() // { // EventDescriptor descriptor = TypeDescriptor.GetDefaultEvent(this, true); // return descriptor; // } // // /// <summary> // /// Returns the default property for this object. // /// </summary> // /// <returns>An <see cref="PropertyDescriptor"/> that represents the default property for this object, or null if this object does not have properties.</returns> // PropertyDescriptor ICustomTypeDescriptor.GetDefaultProperty() // { // PropertyDescriptor descriptor = TypeDescriptor.GetDefaultProperty(this, true); // return descriptor; // } // // /// <summary> // /// Returns an editor of the specified type for this object. // /// </summary> // /// <param name="editorBaseType">A <see cref="Type"/> that represents the editor for this object.</param> // /// <returns>An <see cref="Object"/> of the specified type that is the editor for this object, or null if the editor cannot be found.</returns> // object ICustomTypeDescriptor.GetEditor(Type editorBaseType) // { // object editor = TypeDescriptor.GetEditor(this, editorBaseType, true); // return editor; // } // // /// <summary> // /// Returns the events for this instance of a component. // /// </summary> // /// <returns>An <see cref="EventDescriptorCollection"/> that represents the events for this component instance.</returns> // EventDescriptorCollection ICustomTypeDescriptor.GetEvents() // { // EventDescriptorCollection events = TypeDescriptor.GetEvents(this, true); // return events; // } // // /// <summary> // /// Returns the events for this instance of a component using the attribute array as a filter. // /// </summary> // /// <param name="attributes">An array of type <see cref="Attribute"/> that is used as a filter.</param> // /// <returns>An <see cref="EventDescriptorCollection"/> that represents the events for this component instance that match the given set of attributes.</returns> // EventDescriptorCollection ICustomTypeDescriptor.GetEvents(Attribute[] attributes) // { // EventDescriptorCollection events = TypeDescriptor.GetEvents(this, attributes, true); // return events; // } // // /// <summary> // /// Returns the properties for this instance of a component. // /// </summary> // /// <returns>An <see cref="PropertyDescriptorCollection"/> that represents the properties for this component instance.</returns> // PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties() // { // PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(this, true); // return properties; // } // // /// <summary> // /// Returns the properties for this instance of a component using the attribute array as a filter. // /// </summary> // /// <param name="attributes">An array of type <see cref="Attribute"/> that is used as a filter.</param> // /// <returns>An <see cref="PropertyDescriptorCollection"/> that represents the properties for this component instance that match the given set of attributes.</returns> // PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties(Attribute[] attributes) // { // PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(this, attributes, true); // return properties; // } // // /// <summary> // /// Returns the object that this value is a member of. // /// </summary> // /// <param name="pd">A <see cref="PropertyDescriptor"/> that represents the property whose owner is to be found.</param> // /// <returns>An <see cref="Object"/> that represents the owner of the specified property.</returns> // object ICustomTypeDescriptor.GetPropertyOwner(PropertyDescriptor pd) // { // return this; // } // #endregion // // #region ISpecifyPropertyPages Implementation // //========================================================================================== // // ISpecifyPropertyPages Implementation // //========================================================================================== // // void ISpecifyPropertyPages.GetPages(CAUUID[] pages) // { // pages[0] = new CAUUID(); // pages[0].cElems = 0; // } // #endregion } } --- NEW FILE: FolderHierarchyNodeProperties.cs --- //------------------------------------------------------------------------------------------------- // <copyright file="FolderHierarchyNodeProperties.cs" company="Microsoft"> // Copyright (c) Microsoft Corporation. All rights reserved. // // The use and distribution terms for this software are covered by the // Common Public License 1.0 (http://opensource.org/licenses/cpl.php) // which can be found in the file CPL.TXT at the root of this distribution. // By using this software in any fashion, you are agreeing to be bound by // the terms of this license. // // You must not remove this notice, or any other, from this software. // </copyright> // // <summary> // Properties for a folder node within a Solution Explorer hierarchy. // </summary> //------------------------------------------------------------------------------------------------- namespace Microsoft.Tools.WindowsInstallerXml.VisualStudio.Infrastructure { using System; using System.ComponentModel; using System.Runtime.InteropServices; /// <summary> /// Represents properties for a folder node in a Solution Explorer hierarchy /// that will be shown in the Properties window. /// </summary> internal class FolderHierarchyNodeProperties : HierarchyNodeProperties { #region Member Variables //========================================================================================== // Member Variables //========================================================================================== #endregion #region Constructors //========================================================================================== // Constructors //========================================================================================== /// <summary> /// Initializes a new instance of the <see cref="FolderHierarchyNodeProperties"/> class. /// </summary> public FolderHierarchyNodeProperties(FolderHierarchyNode node) : base(node) { } #endregion #region Properties //========================================================================================== // Properties //========================================================================================== /// <summary> /// Gets or sets the folder name (caption) of the attached node. /// </summary> [Category("Misc")] [Description("Name of the folder.")] public string FolderName { get { return this.Node.Caption; } set { this.Node.Caption = value; } } /// <summary> /// Gets the <see cref="FolderHierarchyNode"/> that this properties object is attached to. /// </summary> public new FolderHierarchyNode Node { get { return (FolderHierarchyNode)base.Node; } } #endregion #region Methods //========================================================================================== // Methods //========================================================================================== #endregion } } Index: FolderHierarchyNode.cs =================================================================== RCS file: /cvsroot/wix/wix/src/votive/Core/Infrastructure/FolderHierarchyNode.cs,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** FolderHierarchyNode.cs 7 Jul 2005 00:29:55 -0000 1.3 --- FolderHierarchyNode.cs 20 Aug 2005 11:48:58 -0000 1.4 *************** *** 144,147 **** --- 144,155 ---- } + /// <summary> + /// Gets the node's properties to show in the Property window. + /// </summary> + public override HierarchyNodeProperties Properties + { + get { return new FolderHierarchyNodeProperties(this); } + } + public override Guid VisualStudioTypeGuid { *************** *** 378,382 **** } ! Tracer.WriteLineVerbose(classType, "GenerateUniqueName", "Found a unique name for a new node. New name = '{0}'.", uniqueName); return uniqueName; } --- 386,390 ---- } ! Tracer.WriteLineInformation(classType, "GenerateUniqueName", "Found a unique name for a new node. New name = '{0}'.", uniqueName); return uniqueName; } Index: FileHierarchyNode.cs =================================================================== RCS file: /cvsroot/wix/wix/src/votive/Core/Infrastructure/FileHierarchyNode.cs,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** FileHierarchyNode.cs 7 Jul 2005 00:29:55 -0000 1.3 --- FileHierarchyNode.cs 20 Aug 2005 11:48:57 -0000 1.4 *************** *** 79,82 **** --- 79,90 ---- } + /// <summary> + /// Gets the node's properties to show in the Property window. + /// </summary> + public override HierarchyNodeProperties Properties + { + get { return new FileHierarchyNodeProperties(this); } + } + public override VsMenus.ContextMenuId VisualStudioContextMenuId { *************** *** 231,235 **** int saveCanceled; int hr = docInfo.VisualStudioPersistDocData.SaveDocData(VSSAVEFLAGS.VSSAVE_SilentSave, out newPath, out saveCanceled); ! Tracer.WriteLineIf(classType, "Save", Tracer.Level.Verbose, NativeMethods.Succeeded(hr), "Successfully saved node '{0}'.", this.ToString()); NativeMethods.ThrowOnFailure(hr); } --- 239,243 ---- int saveCanceled; int hr = docInfo.VisualStudioPersistDocData.SaveDocData(VSSAVEFLAGS.VSSAVE_SilentSave, out newPath, out saveCanceled); ! Tracer.WriteLineIf(classType, "Save", Tracer.Level.Information, NativeMethods.Succeeded(hr), "Successfully saved node '{0}'.", this.ToString()); NativeMethods.ThrowOnFailure(hr); } *************** *** 307,311 **** if (NativeMethods.Succeeded(hr)) { ! Tracer.WriteLineVerbose(classType, "Open", "Succeeded in opening '{0}' with a {1} editor.", this.AbsolutePath, editorTypeName); if (windowFrame != null) { --- 315,319 ---- if (NativeMethods.Succeeded(hr)) { ! Tracer.WriteLineInformation(classType, "Open", "Succeeded in opening '{0}' with a {1} editor.", this.AbsolutePath, editorTypeName); if (windowFrame != null) { *************** *** 318,322 **** uint cookie = unchecked((uint)(int)pvar); this.SetDocumentCookie(cookie); ! Tracer.WriteLineVerbose(classType, "Open", "Document '{0}' has a cookie value of {1}", this.AbsolutePath, cookie); // Show the window frame of the open document. The documentation says we don't need to do this, but the reality is different. --- 326,330 ---- uint cookie = unchecked((uint)(int)pvar); this.SetDocumentCookie(cookie); ! Tracer.WriteLineInformation(classType, "Open", "Document '{0}' has a cookie value of {1}", this.AbsolutePath, cookie); // Show the window frame of the open document. The documentation says we don't need to do this, but the reality is different. *************** *** 334,338 **** else if (hr == NativeMethods.OLE_E_PROMPTSAVECANCELLED) { ! Tracer.WriteLineVerbose(classType, "Open", "The user canceled out of the open dialog box."); } else --- 342,346 ---- else if (hr == NativeMethods.OLE_E_PROMPTSAVECANCELLED) { ! Tracer.WriteLineInformation(classType, "Open", "The user canceled out of the open dialog box."); } else --- NEW FILE: RootHierarchyNodeProperties.cs --- //------------------------------------------------------------------------------------------------- // <copyright file="RootHierarchyNodeProperties.cs" company="Microsoft"> // Copyright (c) Microsoft Corporation. All rights reserved. // // The use and distribution terms for this software are covered by the // Common Public License 1.0 (http://opensource.org/licenses/cpl.php) // which can be found in the file CPL.TXT at the root of this distribution. // By using this software in any fashion, you are agreeing to be bound by // the terms of this license. // // You must not remove this notice, or any other, from this software. // </copyright> // // <summary> // Properties for a root (project) node within a Solution Explorer hierarchy. // </summary> //------------------------------------------------------------------------------------------------- namespace Microsoft.Tools.WindowsInstallerXml.VisualStudio.Infrastructure { using System; using System.ComponentModel; using System.Runtime.InteropServices; /// <summary> /// Represents properties for a root (project) node in a Solution Explorer hierarchy /// that will be shown in the Properties window. /// </summary> internal class RootHierarchyNodeProperties : HierarchyNodeProperties { #region Member Variables //========================================================================================== // Member Variables //========================================================================================== #endregion #region Constructors //======================================================... [truncated message content] |