Exemple #1
0
        public override bool OnSynchronizeDropdowns(LanguageService languageService, IVsTextView textView, int line, int col, ArrayList dropDownTypes, ArrayList dropDownMembers, ref int selectedType, ref int selectedMember)
        {
            if (_bufferHasChanged || dropDownMembers.Count == 0)
            {
                dropDownMembers.Clear();

                _document.Items.OfType <Entry>()
                .Select(entry => CreateDropDownMember(entry, textView))
                .ToList()
                .ForEach(ddm => dropDownMembers.Add(ddm));
            }

            if (dropDownTypes.Count == 0)
            {
                var thisExt = $"{Vsix.Name} ({Vsix.Version})";
                dropDownTypes.Add(new DropDownMember(thisExt, new TextSpan(), 126, DROPDOWNFONTATTR.FONTATTR_GRAY));
            }

            DropDownMember currentDropDown = dropDownMembers
                                             .OfType <DropDownMember>()
                                             .Where(d => d.Span.iStartLine <= line)
                                             .LastOrDefault();

            selectedMember    = dropDownMembers.IndexOf(currentDropDown);
            selectedType      = 0;
            _bufferHasChanged = false;

            return(true);
        }
Exemple #2
0
        private void AddToDropDownTypeList(LibraryNode node, ref ArrayList dropDownTypes)
        {
            DropDownMember exists = (from DropDownMember item in dropDownTypes
                                     where String.Equals(item.Label, node.UniqueName)
                                     select item).LastOrDefault();

            if (exists == null)
            {
                int glyph = 0;
                if (node.NodeType == LibraryNode.LibraryNodeType.Members)
                {
                    glyph = (int)GlyphImageIndex.Method;
                }
                dropDownTypes.Add(new DropDownMember(node.UniqueName, node.Span, glyph, DROPDOWNFONTATTR.FONTATTR_PLAIN));
            }
        }
Exemple #3
0
        //
        // Summary:
        //     Called to fill and synchronize all combo boxes.
        //
        // Parameters:
        //   languageService:
        //     [in] A Microsoft.VisualStudio.Package.LanguageService object representing
        //     the language service that uses the combo boxes.
        //
        //   textView:
        //     [in] An Microsoft.VisualStudio.TextManager.Interop.IVsTextView object representing
        //     the view the combo boxes are placed in and the view that shows the source
        //     file.
        //
        //   line:
        //     [in] The line number the caret is currently on.
        //
        //   col:
        //     [in] The character offset the caret is currently on.
        //
        //   dropDownTypes:
        //     [in, out] An System.Collections.ArrayList of Microsoft.VisualStudio.Package.DropDownMembers
        //     representing the types combo box.
        //
        //   dropDownMembers:
        //     [in, out] An System.Collections.ArrayList of Microsoft.VisualStudio.Package.DropDownMembers
        //     representing the members combo box.
        //
        //   selectedType:
        //     [in, out] The index of the entry to be selected in the types combo box. This
        //     can also be set if the current selection is invalid.
        //
        //   selectedMember:
        //     [in, out] The index of the entry to be selected in the members combo box.
        //     This can also be set if the current selection is invalid.
        //
        // Returns:
        //     If successful, returns true if the combo boxes have been changed; otherwise
        //     returns false.
        public override bool OnSynchronizeDropdowns(LanguageService languageService, IVsTextView textView, int line, int col, ArrayList dropDownTypes, ArrayList dropDownMembers, ref int selectedType, ref int selectedMember)
        {
            Source source = languageService.GetSource(textView);

            if (source == null)
            {
                return(false);
            }

            LibraryNode            filenode;
            SquirrelLibraryManager libraryManager = languageService.Site.GetService(typeof(ISquirrelLibraryManager)) as SquirrelLibraryManager;
            string currentfile = source.GetFilePath();

            lock (libraryManager.Library)
            {
                libraryManager.Library.FileNodes.TryGetValue(currentfile, out filenode);
            }

            if (previousfile != currentfile)
            {
                scopelist.Clear();
                dropDownTypes.Clear();
                PopulateTypeList(filenode, ref dropDownTypes);
                dropDownTypes.Sort();
                previousfile = currentfile;
            }

            DropDownMember scope = (from DropDownMember item in scopelist
                                    where TextSpanHelper.ContainsInclusive(item.Span, line, col)
                                    orderby(item.Span.iStartLine << 16) + item.Span.iStartIndex
                                    select item).LastOrDefault();

            string currenttype = "";

            if (scope != null)
            {
                bool found = false;
                foreach (DropDownMember type in dropDownTypes)
                {
                    if (scope.Label == type.Label)
                    {
                        selectedType = dropDownTypes.IndexOf(type);
                        currenttype  = type.Label;
                        found        = true;
                        break;
                    }
                }

                if (!found)
                {
                    int    lastidx = scope.Label.LastIndexOf('.');
                    string typeLabel;
                    if (lastidx != -1)
                    {
                        typeLabel = scope.Label.Substring(0, lastidx);
                        foreach (DropDownMember type in dropDownTypes)
                        {
                            if (typeLabel == type.Label)
                            {
                                selectedType = dropDownTypes.IndexOf(type);
                                currenttype  = type.Label;
                                break;
                            }
                        }
                    }
                }

                if (previoustype != currenttype)
                {
                    dropDownMembers.Clear();
                    LibraryNode merge = new LibraryNode("merge");
                    MergeFileNode(filenode, ref merge);
                    RemoveGlobalNode(ref merge);
                    LibraryNode typenode = null;
                    GetTypeNode(currenttype, merge, ref typenode);
                    PopulateMemberList(typenode, ref dropDownMembers);
                    dropDownMembers.Sort();
                    previoustype = currenttype;
                }

                selectedMember = -1;
                foreach (DropDownMember member in dropDownMembers)
                {
                    if (scope.Label.Split('.').Last() == member.Label)
                    {
                        selectedMember = dropDownMembers.IndexOf(member);
                        break;
                    }
                }
            }

            return(true);
        }