示例#1
0
        internal void AssociateDroppedSolutionItems(HashSet <string> paths)
        {
            if (paths.Count == 0)
            {
                return;
            }

            var existingUris = new HashSet <string>(SolutionArtifactLinkReference
                                                    .GetReferenceValues(this.CurrentElement)
                                                    .Select(u => u.ToString().ToLowerInvariant()));

            var items = this.Solution.Find(i =>
                                           (i.Kind == ItemKind.Item || i.Kind == ItemKind.Project) &&
                                           paths.Contains(i.PhysicalPath.ToLowerInvariant()));

            foreach (var item in items)
            {
                var uri = UriService.CreateUri(item);
                if (!existingUris.Contains(uri.ToString().ToLowerInvariant()))
                {
                    // add new reference with tag
                    ReferenceKindProvider <SolutionArtifactLinkReference, Uri> .AddReference(CurrentElement, uri).Tag =
                        this.Tag ?? string.Empty;
                }
                else
                {
                    // Update tag on reference (add if not already exist)
                    var reference = ReferenceKindProvider <SolutionArtifactLinkReference, Uri> .GetReference(CurrentElement, uri);

                    if (reference != null)
                    {
                        reference.AddTag(this.Tag);
                    }
                }
            }
        }
        public override void Execute()
        {
            try
            {
                this.ValidateObject();

                tracer.Info(
                    Resources.SynchArtifactNameCommand_TraceInitial, this.CurrentElement.InstanceName, this.ReferenceTag);

                if (!string.IsNullOrEmpty(this.ReferenceTag) && this.ReferenceTag != FilteredReferenceTagValue)
                {
                    UpdateReferenceTagTo1113();
                }

                foreach (var reference in this.CurrentElement.References)
                {
                    if (reference.Kind == typeof(SolutionArtifactLinkReference).ToString())
                    {
                        var referenceTag = GetReference(reference.Tag);
                        if (referenceTag == null)
                        {
                            continue;
                        }

                        if (referenceTag.SyncNames || this.ReferenceTag == null)
                        {
                            var referenceUri = ReferenceKindProvider <SolutionArtifactLinkReference, Uri> .FromReference(reference);

                            var solutionItem = this.UriReferenceService.TryResolveUri <IItemContainer>(referenceUri);
                            if (solutionItem == null)
                            {
                                tracer.Warn(
                                    Resources.SynchArtifactNameCommand_TraceFailedToResolveReference, referenceUri, this.CurrentElement.InstanceName);
                                continue;
                            }

                            var solutionItemName = Path.GetFileNameWithoutExtension(solutionItem.Name);

                            if (!solutionItemName.Equals(this.CurrentElement.InstanceName, StringComparison.OrdinalIgnoreCase))
                            {
                                var proposedItemName = string.Empty;
                                if (string.IsNullOrEmpty(referenceTag.TargetFileName))
                                {
                                    // TODO: Determine if the 'InstanceName' property was the one changed, if not abort sync

                                    proposedItemName = this.CurrentElement.InstanceName;
                                }
                                else
                                {
                                    // TODO: Determine whether any of the properties referenced in TargetFileName syntax
                                    // (i.e. {InstanceName} or {PropertyName}) was the property actually changed, and if not, dont sync!

                                    var resolver = new PathResolver(this.CurrentElement, this.UriReferenceService, @"\",
                                                                    string.IsNullOrEmpty(referenceTag.TargetFileName) ? this.CurrentElement.InstanceName : referenceTag.TargetFileName);
                                    resolver.Resolve();

                                    proposedItemName = Path.GetFileNameWithoutExtension(resolver.FileName);
                                }

                                tracer.Info(
                                    Resources.SynchArtifactNameCommand_TraceRenameSolutionItem, solutionItem.Name, proposedItemName);

                                var uiService   = (IVsUIShell)this.ServiceProvider.GetService(typeof(IVsUIShell));
                                var newItemName = solutionItem.Rename(proposedItemName, true, uiService);

                                tracer.Info(
                                    Resources.SynchArtifactNameCommand_TraceSolutionItemRenamed, solutionItem.Name, newItemName);
                            }
                            else
                            {
                                tracer.Info(
                                    Resources.SynchArtifactNameCommand_TraceItemIgnoredSameName, solutionItem.Name);
                            }
                        }
                    }
                }
            }
            catch (Exception)
            {
                tracer.Error(
                    Resources.SynchArtifactNameCommand_TraceFailedSync, this.CurrentElement.InstanceName);
                throw;
            }
        }