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); }
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)); } }
// // 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); }