Beispiel #1
0
        public IEnumerable <JsonCompletionEntry> GetListEntries(JsonCompletionContext context)
        {
            if (!context.Snapshot.ContentType.IsOfType(ContentTypeDefinitions.TeamsManifestContentTypeConstants.ContentTypeName))
            {
                return(Enumerable.Empty <JsonCompletionEntry>());
            }

            if (!(context.ContextNode is MemberNode property))
            {
                return(Enumerable.Empty <JsonCompletionEntry>());
            }

            var propertyName      = property.UnquotedNameText;
            var completionSession = (ICompletionSession)context.Session;

            var dte = (DTE2)ServiceProvider.GetService(typeof(DTE));

            switch (propertyName)
            {
            case "color":
            case "outline":
                return(GetIconFileCompletionList(dte, completionSession));
            }

            return(Enumerable.Empty <JsonCompletionEntry>());
        }
Beispiel #2
0
        private List <JsonCompletionEntry> GetCompletionList(MemberNode memberNode, JsonCompletionContext context, CompletionSet completionSet, int count)
        {
            int           start               = memberNode.Value.Start;
            ITrackingSpan trackingSpan        = context.Snapshot.CreateTrackingSpan(start + 1 + completionSet.Start, completionSet.Length, SpanTrackingMode.EdgeExclusive);
            bool          isVersionCompletion = (completionSet.CompletionType == CompletionSortOrder.Version);

            List <JsonCompletionEntry> results = new List <JsonCompletionEntry>();

            foreach (CompletionItem item in completionSet.Completions)
            {
                string       insertionText = item.InsertionText.Replace("\\\\", "\\").Replace("\\", "\\\\");
                ImageMoniker moniker       = item.DisplayText.EndsWith("/") || item.DisplayText.EndsWith("\\") ? _folderIcon : _libraryIcon;

                if (isVersionCompletion)
                {
                    results.Add(new VersionCompletionEntry(item.DisplayText, insertionText, item.Description, moniker, trackingSpan, context.Session, ++count));
                }
                else
                {
                    results.Add(new SimpleCompletionEntry(item.DisplayText, insertionText, item.Description, moniker, trackingSpan, context.Session, ++count));
                }
            }

            return(results);
        }
        public IEnumerable <JsonCompletionEntry> GetListEntries(JsonCompletionContext context)
        {
            if (!context.Snapshot.ContentType.IsOfType(TeamsManifestContentTypeConstants.ContentTypeName))
            {
                return(Enumerable.Empty <JsonCompletionEntry>());
            }

            if (!(context.ContextNode is MemberNode property))
            {
                return(Enumerable.Empty <JsonCompletionEntry>());
            }

            var propertyName      = property.Name.GetCanonicalizedText();
            var completionSession = (ICompletionSession)context.Session;

            switch (propertyName)
            {
            case "version":
                return(new JsonCompletionEntry[] {
                    new JsonCompletionEntry("1.0", "\"1.0\"", "Version 1.0", null, "", false, completionSession)
                });

            case "id":
                var newGuid = Guid.NewGuid().ToString("D");
                return(new JsonCompletionEntry[] {
                    new JsonCompletionEntry(
                        "New id...", $"\"{newGuid}\"", "Generate new GUID", null, "", false, completionSession)
                });
            }

            return(Enumerable.Empty <JsonCompletionEntry>());
        }
Beispiel #4
0
        public IEnumerable <JsonCompletionEntry> GetListEntries(JsonCompletionContext context)
        {
            if (!context.Snapshot.ContentType.IsOfType(ContentTypeDefinitions.TeamsManifestContentTypeConstants.ContentTypeName))
            {
                return(Enumerable.Empty <JsonCompletionEntry>());
            }

            if (!(context.ContextNode is MemberNode property))
            {
                return(Enumerable.Empty <JsonCompletionEntry>());
            }

            var propertyName      = property.Name.GetCanonicalizedText();
            var completionSession = (ICompletionSession)context.Session;

            var dte = (DTE2)ServiceProvider.GetService(typeof(DTE));

            switch (propertyName)
            {
            case "color":
            case "outline":
                return(new JsonCompletionEntry[] { new NewFileCompletionEntry(completionSession, dte) });
            }

            return(Enumerable.Empty <JsonCompletionEntry>());
        }
        private FrameworkElement GetPresenter(JsonCompletionContext context)
        {
            var presenter = context?.Session?.Presenter as FrameworkElement;

            presenter?.SetBinding(ImageThemingUtilities.ImageBackgroundColorProperty, new Binding("Background")
            {
                Source    = presenter,
                Converter = new BrushToColorConverter()
            });

            return(presenter);
        }
        public IEnumerable <JsonCompletionEntry> GetListEntries(JsonCompletionContext context)
        {
            if (DocumentService.TryGetTextDocument(context.Snapshot.TextBuffer, out ITextDocument document))
            {
                ConfigFilePath = document.FilePath;
                string fileName = Path.GetFileName(document.FilePath);

                if (fileName.Equals(Constants.ConfigFileName, StringComparison.OrdinalIgnoreCase))
                {
                    return(GetEntries(context));
                }
            }

            return(Empty);
        }
        private static IEnumerable <string> GetUsedFiles(JsonCompletionContext context)
        {
            ArrayNode array = context.ContextNode.FindType <ArrayNode>();

            if (array == null)
            {
                yield break;
            }

            foreach (ArrayElementNode arrayElement in array.Elements)
            {
                if (arrayElement.Value is TokenNode token && token.Text != context.ContextNode.GetText())
                {
                    yield return(token.GetCanonicalizedText());
                }
            }
        }
        protected override IEnumerable <JsonCompletionEntry> GetEntries(JsonCompletionContext context)
        {
            MemberNode member = context.ContextNode.FindType <MemberNode>();

            if (member == null || (member.UnquotedNameText != ManifestConstants.Destination && member.UnquotedNameText != ManifestConstants.DefaultDestination))
            {
                yield break;
            }

            MemberNode parent = member.FindType <ObjectNode>()?.FindType <MemberNode>();

            if (member.UnquotedNameText == ManifestConstants.Destination && (parent == null || parent.UnquotedNameText != ManifestConstants.Libraries))
            {
                yield break;
            }

            if (member.UnquotedNameText == ManifestConstants.DefaultDestination && parent != null)
            {
                yield break;
            }

            int caretPosition = context.Session.TextView.Caret.Position.BufferPosition - member.Value.Start - 1;

            if (caretPosition > member.UnquotedValueText.Length)
            {
                yield break;
            }

            var    dependencies = _dependenciesFactory.FromConfigFile(ConfigFilePath);
            string cwd          = dependencies?.GetHostInteractions().WorkingDirectory;

            if (string.IsNullOrEmpty(cwd))
            {
                yield break;
            }

            IEnumerable <Tuple <string, string> > completions = GetCompletions(cwd, member.UnquotedValueText, caretPosition, out Span span);
            int           start        = member.Value.Start;
            ITrackingSpan trackingSpan = context.Snapshot.CreateTrackingSpan(start + 1 + span.Start, span.Length, SpanTrackingMode.EdgeInclusive);

            foreach (Tuple <string, string> item in completions)
            {
                yield return(new SimpleCompletionEntry(item.Item1, item.Item2, KnownMonikers.FolderClosed, trackingSpan, context.Session));
            }
        }
        protected void UpdateListEntriesSync(JsonCompletionContext context, IEnumerable <JsonCompletionEntry> allEntries)
        {
            if (context.Session.IsDismissed)
            {
                return;
            }

            foreach (CompletionSet curCompletionSet in (context.Session as ICompletionSession)?.CompletionSets)
            {
                if (curCompletionSet is WebCompletionSet webCompletionSet)
                {
                    WebEditor.DispatchOnUIThread(() =>
                    {
                        // only delete our completion entries
                        webCompletionSet.UpdateCompletions(s => s is SimpleCompletionEntry, allEntries);
                    });

                    // The UpdateCompletions call above may modify the collection we're enumerating. That's ok, as we're done anyways.
                    break;
                }
            }
        }
        protected override IEnumerable <JsonCompletionEntry> GetEntries(JsonCompletionContext context)
        {
            var member = context.ContextNode as MemberNode;

            if (member == null || (member.UnquotedNameText != ManifestConstants.Provider && member.UnquotedNameText != ManifestConstants.DefaultProvider))
            {
                yield break;
            }

            var dependencies = _dependenciesFactory.FromConfigFile(ConfigFilePath);
            IEnumerable <string> providerIds = dependencies.Providers?.Select(p => p.Id);

            if (providerIds == null || !providerIds.Any())
            {
                yield break;
            }

            foreach (string id in providerIds)
            {
                yield return(new SimpleCompletionEntry(id, _libraryIcon, context.Session));
            }
        }
        public IEnumerable <JsonCompletionEntry> GetListEntries(JsonCompletionContext context)
        {
            if (!context.Snapshot.ContentType.IsOfType(TeamsManifestContentTypeConstants.ContentTypeName))
            {
                return(Enumerable.Empty <JsonCompletionEntry>());
            }

            if (!(context.ContextNode is MemberNode property))
            {
                return(Enumerable.Empty <JsonCompletionEntry>());
            }

            var propertyName      = property.Name.GetCanonicalizedText();
            var completionSession = (ICompletionSession)context.Session;

            switch (propertyName)
            {
            case "accentColor":
                return(GetColorCompletionList(completionSession));
            }

            return(Enumerable.Empty <JsonCompletionEntry>());
        }
 protected abstract IEnumerable <JsonCompletionEntry> GetEntries(JsonCompletionContext context);
        protected override IEnumerable <JsonCompletionEntry> GetEntries(JsonCompletionContext context)
        {
            MemberNode member = context.ContextNode.FindType <MemberNode>();

            if (member == null || member.UnquotedNameText != "files")
            {
                yield break;
            }

            var parent = member.Parent as ObjectNode;

            if (!JsonHelpers.TryGetInstallationState(parent, out ILibraryInstallationState state))
            {
                yield break;
            }

            if (string.IsNullOrEmpty(state.Name))
            {
                yield break;
            }

            var             dependencies = _dependenciesFactory.FromConfigFile(ConfigFilePath);
            IProvider       provider     = dependencies.GetProvider(state.ProviderId);
            ILibraryCatalog catalog      = provider?.GetCatalog();

            if (catalog == null)
            {
                yield break;
            }

            Task <ILibrary>      task      = catalog.GetLibraryAsync(state.Name, state.Version, CancellationToken.None);
            FrameworkElement     presenter = GetPresenter(context);
            IEnumerable <string> usedFiles = GetUsedFiles(context);

            if (task.IsCompleted)
            {
                if (!(task.Result is ILibrary library))
                {
                    yield break;
                }

                foreach (string file in library.Files.Keys)
                {
                    if (!usedFiles.Contains(file))
                    {
                        ImageSource glyph = WpfUtil.GetIconForFile(presenter, file, out bool isThemeIcon);
                        yield return(new SimpleCompletionEntry(file, glyph, context.Session));
                    }
                }
            }
            else
            {
                yield return(new SimpleCompletionEntry(Resources.Text.Loading, string.Empty, KnownMonikers.Loading, context.Session));

                _ = task.ContinueWith(async(t) =>
                {
                    await VisualStudio.Shell.ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();

                    if (!(t.Result is ILibrary library))
                    {
                        return;
                    }

                    if (!context.Session.IsDismissed)
                    {
                        var results = new List <JsonCompletionEntry>();

                        foreach (string file in library.Files.Keys)
                        {
                            if (!usedFiles.Contains(file))
                            {
                                ImageSource glyph = WpfUtil.GetIconForFile(presenter, file, out bool isThemeIcon);
                                results.Add(new SimpleCompletionEntry(file, glyph, context.Session));
                            }
                        }

                        UpdateListEntriesSync(context, results);
                    }
                }, TaskScheduler.Default);
            }
        }
Beispiel #14
0
        protected override IEnumerable <JsonCompletionEntry> GetEntries(JsonCompletionContext context)
        {
            var member = context.ContextNode as MemberNode;

            if (member == null || member.UnquotedNameText != ManifestConstants.Library)
            {
                yield break;
            }

            var parent = member.Parent as ObjectNode;

            if (!JsonHelpers.TryGetInstallationState(parent, out ILibraryInstallationState state))
            {
                yield break;
            }

            var             dependencies = Dependencies.FromConfigFile(ConfigFilePath);
            IProvider       provider     = dependencies.GetProvider(state.ProviderId);
            ILibraryCatalog catalog      = provider?.GetCatalog();

            if (catalog == null)
            {
                yield break;
            }

            // member.Value is null when there is no value yet, e.g. when typing a space at "library":|
            // where | represents caret position. In this case, set caretPosition to "1" to short circuit execution of this function
            // and return no entries (member.UnquotedValueText will be empty string in that case).
            int caretPosition = member.Value != null ? context.Session.TextView.Caret.Position.BufferPosition - member.Value.Start - 1 : 1;

            if (caretPosition > member.UnquotedValueText.Length)
            {
                yield break;
            }

            Task <CompletionSet> task = catalog.GetLibraryCompletionSetAsync(member.UnquotedValueText, caretPosition);
            int count = 0;

            if (!context.Session.Properties.ContainsProperty(CompletionController.RetriggerCompletion))
            {
                context.Session.Properties.AddProperty(CompletionController.RetriggerCompletion, true);
            }

            if (task.IsCompleted)
            {
                CompletionSet completionSet = task.Result;

                if (completionSet.Completions != null)
                {
                    List <JsonCompletionEntry> results = GetCompletionList(member, context, completionSet, count);

                    foreach (JsonCompletionEntry completionEntry in results)
                    {
                        yield return(completionEntry);
                    }
                }
            }
            else
            {
                yield return(new SimpleCompletionEntry(Resources.Text.Loading, string.Empty, KnownMonikers.Loading, context.Session));

                task.ContinueWith((a) =>
                {
                    if (!context.Session.IsDismissed)
                    {
                        CompletionSet completionSet = task.Result;

                        if (completionSet.Completions != null)
                        {
                            List <JsonCompletionEntry> results = GetCompletionList(member, context, completionSet, count);

                            UpdateListEntriesSync(context, results);
                        }
                    }
                });
            }
        }