private void FillSessionForRibbonDiffXmlCompletionSet( IList <CompletionSet> completionSets , XElement doc , ConnectionData connectionData , ConnectionIntellisenseDataRepository repositoryEntities , WebResourceIntellisenseDataRepository repositoryWebResource , RibbonIntellisenseDataRepository repositoryRibbon , XElement currentXmlNode , string currentNodeName , string currentAttributeName , ITrackingSpan applicableTo ) { try { RibbonIntellisenseData ribbonIntellisenseData = null; var attrEntityName = doc.Attribute(IntellisenseContext.IntellisenseContextAttributeEntityName); if (attrEntityName != null) { if (!string.IsNullOrEmpty(attrEntityName.Value)) { var connectionIntellisense = repositoryEntities.GetEntitiesIntellisenseData(); if (connectionIntellisense != null && connectionIntellisense.Entities != null && connectionIntellisense.Entities.ContainsKey(attrEntityName.Value) ) { ribbonIntellisenseData = repositoryRibbon.GetRibbonIntellisenseData(attrEntityName.Value); } } else { ribbonIntellisenseData = repositoryRibbon.GetRibbonIntellisenseData(string.Empty); } } if (ControlsWithImagesXmlElements.Contains(currentNodeName) && ImagesXmlAttributes.Contains(currentAttributeName) ) { FillWebResourcesIcons(completionSets, applicableTo, repositoryWebResource.GetWebResourcesIcon()?.Values?.ToList(), "WebResources"); if (ribbonIntellisenseData != null) { FillIntellisenseBySet(completionSets, applicableTo, ribbonIntellisenseData.Images, "Images"); } } if (string.Equals(currentAttributeName, "ModernImage", StringComparison.InvariantCultureIgnoreCase)) { if (ribbonIntellisenseData != null) { FillIntellisenseBySet(completionSets, applicableTo, ribbonIntellisenseData.ModernImages, "ModernImages"); } } if (string.Equals(currentNodeName, "CustomAction", StringComparison.InvariantCultureIgnoreCase) && string.Equals(currentAttributeName, "Location", StringComparison.InvariantCultureIgnoreCase) ) { if (ribbonIntellisenseData != null) { var sorted = new SortedSet <string>(ribbonIntellisenseData.Locations.Keys); FillRibbonLocations(completionSets, applicableTo, sorted, "Locations"); } } if (string.Equals(currentAttributeName, "Sequence", StringComparison.InvariantCultureIgnoreCase)) { if (ribbonIntellisenseData != null) { FillRibbonSequences(completionSets, applicableTo, currentXmlNode, ribbonIntellisenseData.Locations, "Locations"); } } if (string.Equals(currentAttributeName, "TemplateAlias", StringComparison.InvariantCultureIgnoreCase)) { if (ribbonIntellisenseData != null) { FillRibbonTemplateAliases(completionSets, applicableTo, currentXmlNode, ribbonIntellisenseData.Locations, "TemplateAliases"); } } if (LabelXmlAttributes.Contains(currentAttributeName)) { bool isTitleElement = string.Equals(currentNodeName, "Title", StringComparison.InvariantCultureIgnoreCase) && currentXmlNode.Parent != null && string.Equals(currentXmlNode.Parent.Name.LocalName, "Titles", StringComparison.InvariantCultureIgnoreCase) && currentXmlNode.Parent.Parent != null && string.Equals(currentXmlNode.Parent.Parent.Name.LocalName, "LocLabel", StringComparison.InvariantCultureIgnoreCase); if (!isTitleElement) { var localValues = FillLocLables(completionSets, applicableTo, doc, "LocLabels"); if (ribbonIntellisenseData != null) { var sorted = new SortedSet <string>(ribbonIntellisenseData.LabelTexts.Where(s => !localValues.Contains(s))); FillIntellisenseBySet(completionSets, applicableTo, sorted, "Labels in Ribbon"); } } } if (CommandXmlAttributes.Contains(currentAttributeName)) { var localValues = FillCommandsLocal(completionSets, applicableTo, doc, "Commands"); if (ribbonIntellisenseData != null) { var sorted = new SortedSet <string>(ribbonIntellisenseData.CommandDefinitions.Keys.Where(s => !localValues.Contains(s))); FillIntellisenseBySet(completionSets, applicableTo, sorted, "Commands in Ribbon"); } } if (string.Equals(currentNodeName, "EnableRule", StringComparison.InvariantCultureIgnoreCase) && string.Equals(currentAttributeName, "Id", StringComparison.InvariantCultureIgnoreCase) && currentXmlNode.Parent != null && string.Equals(currentXmlNode.Parent.Name.LocalName, "EnableRules", StringComparison.InvariantCultureIgnoreCase) && currentXmlNode.Parent.Parent != null && string.Equals(currentXmlNode.Parent.Parent.Name.LocalName, "CommandDefinition", StringComparison.InvariantCultureIgnoreCase) ) { var localValues = FillEnableRulesLocal(completionSets, applicableTo, doc, "EnableRules"); if (ribbonIntellisenseData != null) { var sorted = new SortedSet <string>(ribbonIntellisenseData.EnableRules.Keys.Where(s => !localValues.Contains(s))); FillIntellisenseBySet(completionSets, applicableTo, sorted, "EnableRules in Ribbon"); } } if (string.Equals(currentNodeName, "DisplayRule", StringComparison.InvariantCultureIgnoreCase) && string.Equals(currentAttributeName, "Id", StringComparison.InvariantCultureIgnoreCase) && currentXmlNode.Parent != null && string.Equals(currentXmlNode.Parent.Name.LocalName, "DisplayRules", StringComparison.InvariantCultureIgnoreCase) && currentXmlNode.Parent.Parent != null && string.Equals(currentXmlNode.Parent.Parent.Name.LocalName, "CommandDefinition", StringComparison.InvariantCultureIgnoreCase) ) { var localValues = FillDisplayRulesLocal(completionSets, applicableTo, doc, "DisplayRules"); if (ribbonIntellisenseData != null) { var sorted = new SortedSet <string>(ribbonIntellisenseData.DisplayRules.Keys.Where(s => !localValues.Contains(s)).Select(s => s)); FillIntellisenseBySet(completionSets, applicableTo, sorted, "DisplayRules in Ribbon"); } } if (string.Equals(currentAttributeName, "EntityName", StringComparison.InvariantCultureIgnoreCase) && ( string.Equals(currentNodeName, "EntityRule", StringComparison.InvariantCultureIgnoreCase) || string.Equals(currentNodeName, "EntityPropertyRule", StringComparison.InvariantCultureIgnoreCase) || string.Equals(currentNodeName, "FormEntityContextRule", StringComparison.InvariantCultureIgnoreCase) || string.Equals(currentNodeName, "EntityPrivilegeRule", StringComparison.InvariantCultureIgnoreCase) ) ) { FillEntityNamesInList(completionSets, applicableTo, repositoryEntities, false, false); } if (string.Equals(currentAttributeName, IntellisenseContext.IntellisenseContextNamespacePrefix + ":" + IntellisenseContext.NameIntellisenseContextAttributeEntityName, StringComparison.InvariantCultureIgnoreCase) && ( string.Equals(currentNodeName, Commands.AbstractDynamicCommandXsdSchemas.RibbonDiffXmlRoot, StringComparison.InvariantCultureIgnoreCase) || string.Equals(currentNodeName, Commands.AbstractDynamicCommandXsdSchemas.RibbonXmlRoot, StringComparison.InvariantCultureIgnoreCase) ) ) { FillEntityNamesInList(completionSets, applicableTo, repositoryEntities, false, false); } if (string.Equals(currentNodeName, "ValueRule", StringComparison.InvariantCultureIgnoreCase) && string.Equals(currentAttributeName, "Field", StringComparison.InvariantCultureIgnoreCase) ) { if (attrEntityName != null && !string.IsNullOrEmpty(attrEntityName.Value) ) { var entityIntellisenseData = repositoryEntities.GetEntitiesIntellisenseData(); if (entityIntellisenseData != null && entityIntellisenseData.Entities.ContainsKey(attrEntityName.Value) ) { FillEntityIntellisenseDataAttributes(completionSets, applicableTo, entityIntellisenseData.Entities[attrEntityName.Value]); } } } if (string.Equals(currentNodeName, "ValueRule", StringComparison.InvariantCultureIgnoreCase) && string.Equals(currentAttributeName, "Value", StringComparison.InvariantCultureIgnoreCase) ) { if (attrEntityName != null && !string.IsNullOrEmpty(attrEntityName.Value) && currentXmlNode.Attribute("Field") != null && !string.IsNullOrEmpty(currentXmlNode.Attribute("Field").Value) ) { FillEntityAttributeValues(completionSets, applicableTo, repositoryEntities, attrEntityName.Value, currentXmlNode.Attribute("Field").Value); } } if (string.Equals(currentNodeName, "CustomRule", StringComparison.InvariantCultureIgnoreCase)) { if (string.Equals(currentAttributeName, "Library", StringComparison.InvariantCultureIgnoreCase)) { FillWebResourcesTextWithWebResourcePrefix(completionSets, applicableTo, repositoryWebResource.GetConnectionWebResourceIntellisenseData()?.GetJavaScriptWebResources()?.ToList(), "WebResources"); if (ribbonIntellisenseData != null) { FillIntellisenseBySet(completionSets, applicableTo, ribbonIntellisenseData.Libraries, "Library from Ribbon"); } } else if (string.Equals(currentAttributeName, "FunctionName", StringComparison.InvariantCultureIgnoreCase)) { if (ribbonIntellisenseData != null) { FillIntellisenseBySet(completionSets, applicableTo, ribbonIntellisenseData.FunctionsNames, "FunctionName from Ribbon"); } } } else if (string.Equals(currentNodeName, "JavaScriptFunction", StringComparison.InvariantCultureIgnoreCase)) { if (string.Equals(currentAttributeName, "Library", StringComparison.InvariantCultureIgnoreCase)) { FillWebResourcesTextWithWebResourcePrefix(completionSets, applicableTo, repositoryWebResource.GetConnectionWebResourceIntellisenseData()?.GetJavaScriptWebResources()?.ToList(), "WebResources"); if (ribbonIntellisenseData != null) { FillIntellisenseBySet(completionSets, applicableTo, ribbonIntellisenseData.Libraries, "Library from Ribbon"); } } else if (string.Equals(currentAttributeName, "FunctionName", StringComparison.InvariantCultureIgnoreCase)) { if (ribbonIntellisenseData != null) { FillIntellisenseBySet(completionSets, applicableTo, ribbonIntellisenseData.FunctionsNames, "FunctionName from Ribbon"); } } } else if (string.Equals(currentNodeName, "Title", StringComparison.InvariantCultureIgnoreCase)) { if (string.Equals(currentAttributeName, "languagecode", StringComparison.InvariantCultureIgnoreCase)) { FillLCID(completionSets, applicableTo); } } } catch (Exception ex) { DTEHelper.WriteExceptionToOutput(connectionData, ex); } }
private void FillSessionForRibbonDiffXml( SnapshotPoint triggerPoint , ICompletionSession session , IList <CompletionSet> completionSets , ITextSnapshot snapshot , XElement doc , ConnectionData connectionData , ConnectionIntellisenseDataRepository repositoryEntities , WebResourceIntellisenseDataRepository repositoryWebResource , RibbonIntellisenseDataRepository repositoryRibbon ) { SnapshotPoint currentPoint = (session.TextView.Caret.Position.BufferPosition) - 1; var spans = _classifier.GetClassificationSpans(new SnapshotSpan(snapshot, 0, snapshot.Length)); var firstSpans = spans .Where(s => s.Span.Start <= currentPoint.Position) .OrderByDescending(s => s.Span.Start.Position) .ToList(); var firstDelimiter = firstSpans.FirstOrDefault(s => s.ClassificationType.IsOfType("XML Attribute Quotes")); var lastSpans = spans .Where(s => s.Span.Start > currentPoint.Position) .OrderBy(s => s.Span.Start.Position) .ToList(); var lastDelimiter = lastSpans.FirstOrDefault(s => s.ClassificationType.IsOfType("XML Attribute Quotes")); SnapshotSpan?extentTemp = null; if (firstDelimiter != null && firstDelimiter.Span.GetText() == "\"\"") { extentTemp = new SnapshotSpan(firstDelimiter.Span.Start.Add(1), firstDelimiter.Span.Start.Add(1)); } else if (firstDelimiter != null && lastDelimiter != null && firstDelimiter.Span.GetText() == "\"" && lastDelimiter.Span.GetText() == "\"") { extentTemp = new SnapshotSpan(firstDelimiter.Span.End, lastDelimiter.Span.Start); } if (!extentTemp.HasValue) { return; } var extent = extentTemp.Value; { var extentText = extent.GetText(); if (extentText == ",\"") { extent = new SnapshotSpan(extent.Snapshot, extent.Start, extent.Length - 1); } } var currentXmlNode = GetCurrentXmlNode(doc, extent); if (currentXmlNode == null) { return; } var containingAttributeSpans = spans .Where(s => s.Span.Contains(extent.Start) && s.Span.Contains(extent) && s.ClassificationType.IsOfType("XML Attribute Value")) .OrderByDescending(s => s.Span.Start.Position) .ToList(); var containingAttributeValue = containingAttributeSpans.FirstOrDefault(); if (containingAttributeValue == null) { containingAttributeValue = spans .Where(s => s.Span.Contains(extent.Start) && s.Span.Contains(extent) && s.ClassificationType.IsOfType("XML Attribute Quotes") && s.Span.GetText() == "\"\"" ) .OrderByDescending(s => s.Span.Start.Position) .FirstOrDefault(); } if (containingAttributeValue == null) { return; } ClassificationSpan currentAttr = GetCurrentXmlAttributeName(snapshot, containingAttributeValue, spans); if (currentAttr == null) { return; } string currentNodeName = currentXmlNode.Name.LocalName; string currentAttributeName = currentAttr.Span.GetText(); ITrackingSpan applicableTo = snapshot.CreateTrackingSpan(extent, SpanTrackingMode.EdgeInclusive); try { RibbonIntellisenseData ribbonIntellisenseData = null; var attrEntityName = doc.Attribute(IntellisenseContext.IntellisenseContextAttributeEntityName); if (attrEntityName != null) { if (!string.IsNullOrEmpty(attrEntityName.Value)) { var connectionIntellisense = repositoryEntities.GetEntitiesIntellisenseData(); if (connectionIntellisense != null && connectionIntellisense.Entities != null && connectionIntellisense.Entities.ContainsKey(attrEntityName.Value) ) { ribbonIntellisenseData = repositoryRibbon.GetRibbonIntellisenseData(attrEntityName.Value); } } else { ribbonIntellisenseData = repositoryRibbon.GetRibbonIntellisenseData(string.Empty); } } if (_controlsWithImagesXmlElements.Contains(currentNodeName) && ImagesXmlAttributes.Contains(currentAttributeName) ) { FillWebResourcesIcons(completionSets, applicableTo, repositoryWebResource.GetWebResourceIntellisenseData()?.WebResourcesIcon?.Values?.ToList(), "WebResources"); if (ribbonIntellisenseData != null) { FillIntellisenseBySet(completionSets, applicableTo, ribbonIntellisenseData.Images, "Images"); } } if (string.Equals(currentAttributeName, "ModernImage", StringComparison.InvariantCultureIgnoreCase)) { if (ribbonIntellisenseData != null) { FillIntellisenseBySet(completionSets, applicableTo, ribbonIntellisenseData.ModernImages, "ModernImages"); } } if (string.Equals(currentNodeName, "CustomAction", StringComparison.InvariantCultureIgnoreCase) && string.Equals(currentAttributeName, "Location", StringComparison.InvariantCultureIgnoreCase) ) { if (ribbonIntellisenseData != null) { var sorted = new SortedSet <string>(ribbonIntellisenseData.Locations.Keys); FillRibbonLocations(completionSets, applicableTo, sorted, "Locations"); } } if (string.Equals(currentAttributeName, "Sequence", StringComparison.InvariantCultureIgnoreCase)) { if (ribbonIntellisenseData != null) { FillRibbonSequences(completionSets, applicableTo, currentXmlNode, ribbonIntellisenseData.Locations, "Locations"); } } if (LabelXmlAttributes.Contains(currentAttributeName)) { bool isTitleElement = string.Equals(currentNodeName, "Title", StringComparison.InvariantCultureIgnoreCase) && currentXmlNode.Parent != null && string.Equals(currentXmlNode.Parent.Name.LocalName, "Titles", StringComparison.InvariantCultureIgnoreCase) && currentXmlNode.Parent.Parent != null && string.Equals(currentXmlNode.Parent.Parent.Name.LocalName, "LocLabel", StringComparison.InvariantCultureIgnoreCase); if (!isTitleElement) { var localValues = FillLocLables(completionSets, applicableTo, doc, "LocLabels"); if (ribbonIntellisenseData != null) { var sorted = new SortedSet <string>(ribbonIntellisenseData.LabelTexts.Where(s => !localValues.Contains(s))); FillIntellisenseBySet(completionSets, applicableTo, sorted, "Labels in Ribbon"); } } } if (CommandXmlAttributes.Contains(currentAttributeName)) { var localValues = FillCommandsLocal(completionSets, applicableTo, doc, "Commands"); if (ribbonIntellisenseData != null) { var sorted = new SortedSet <string>(ribbonIntellisenseData.CommandDefinitions.Keys.Where(s => !localValues.Contains(s))); FillIntellisenseBySet(completionSets, applicableTo, sorted, "Commands in Ribbon"); } } if (string.Equals(currentNodeName, "EnableRule", StringComparison.InvariantCultureIgnoreCase) && string.Equals(currentAttributeName, "Id", StringComparison.InvariantCultureIgnoreCase) && currentXmlNode.Parent != null && string.Equals(currentXmlNode.Parent.Name.LocalName, "EnableRules", StringComparison.InvariantCultureIgnoreCase) && currentXmlNode.Parent.Parent != null && string.Equals(currentXmlNode.Parent.Parent.Name.LocalName, "CommandDefinition", StringComparison.InvariantCultureIgnoreCase) ) { var localValues = FillEnableRulesLocal(completionSets, applicableTo, doc, "EnableRules"); if (ribbonIntellisenseData != null) { var sorted = new SortedSet <string>(ribbonIntellisenseData.EnableRules.Keys.Where(s => !localValues.Contains(s))); FillIntellisenseBySet(completionSets, applicableTo, sorted, "EnableRules in Ribbon"); } } if (string.Equals(currentNodeName, "DisplayRule", StringComparison.InvariantCultureIgnoreCase) && string.Equals(currentAttributeName, "Id", StringComparison.InvariantCultureIgnoreCase) && currentXmlNode.Parent != null && string.Equals(currentXmlNode.Parent.Name.LocalName, "DisplayRules", StringComparison.InvariantCultureIgnoreCase) && currentXmlNode.Parent.Parent != null && string.Equals(currentXmlNode.Parent.Parent.Name.LocalName, "CommandDefinition", StringComparison.InvariantCultureIgnoreCase) ) { var localValues = FillDisplayRulesLocal(completionSets, applicableTo, doc, "DisplayRules"); if (ribbonIntellisenseData != null) { var sorted = new SortedSet <string>(ribbonIntellisenseData.DisplayRules.Keys.Where(s => !localValues.Contains(s)).Select(s => s)); FillIntellisenseBySet(completionSets, applicableTo, sorted, "DisplayRules in Ribbon"); } } if (string.Equals(currentAttributeName, "EntityName", StringComparison.InvariantCultureIgnoreCase) && ( string.Equals(currentNodeName, "EntityRule", StringComparison.InvariantCultureIgnoreCase) || string.Equals(currentNodeName, "EntityPropertyRule", StringComparison.InvariantCultureIgnoreCase) || string.Equals(currentNodeName, "FormEntityContextRule", StringComparison.InvariantCultureIgnoreCase) || string.Equals(currentNodeName, "EntityPrivilegeRule", StringComparison.InvariantCultureIgnoreCase) ) ) { FillEntityNamesInList(completionSets, applicableTo, repositoryEntities, false, false); } if (string.Equals(currentAttributeName, IntellisenseContext.NameIntellisenseContextName + ":" + IntellisenseContext.NameIntellisenseContextAttributeEntityName, StringComparison.InvariantCultureIgnoreCase) && ( string.Equals(currentNodeName, Commands.AbstractDynamicCommandXsdSchemas.RootRibbonDiffXml, StringComparison.InvariantCultureIgnoreCase) || string.Equals(currentNodeName, Commands.AbstractDynamicCommandXsdSchemas.RootRibbonDefinitions, StringComparison.InvariantCultureIgnoreCase) ) ) { FillEntityNamesInList(completionSets, applicableTo, repositoryEntities, false, false); } if (string.Equals(currentNodeName, "ValueRule", StringComparison.InvariantCultureIgnoreCase) && string.Equals(currentAttributeName, "Field", StringComparison.InvariantCultureIgnoreCase) ) { if (attrEntityName != null && !string.IsNullOrEmpty(attrEntityName.Value) ) { var entityIntellisenseData = repositoryEntities.GetEntitiesIntellisenseData(); if (entityIntellisenseData != null && entityIntellisenseData.Entities.ContainsKey(attrEntityName.Value) ) { FillEntityIntellisenseDataAttributes(completionSets, applicableTo, entityIntellisenseData.Entities[attrEntityName.Value]); } } } if (string.Equals(currentNodeName, "ValueRule", StringComparison.InvariantCultureIgnoreCase) && string.Equals(currentAttributeName, "Value", StringComparison.InvariantCultureIgnoreCase) ) { if (attrEntityName != null && !string.IsNullOrEmpty(attrEntityName.Value) && currentXmlNode.Attribute("Field") != null && !string.IsNullOrEmpty(currentXmlNode.Attribute("Field").Value) ) { FillEntityAttributeValues(completionSets, applicableTo, repositoryEntities, attrEntityName.Value, currentXmlNode.Attribute("Field").Value); } } if (string.Equals(currentNodeName, "CustomRule", StringComparison.InvariantCultureIgnoreCase)) { if (string.Equals(currentAttributeName, "Library", StringComparison.InvariantCultureIgnoreCase)) { FillWebResourcesText(completionSets, applicableTo, repositoryWebResource.GetWebResourceIntellisenseData()?.WebResourcesJavaScript?.Values?.ToList(), "WebResources"); if (ribbonIntellisenseData != null) { FillIntellisenseBySet(completionSets, applicableTo, ribbonIntellisenseData.Libraries, "Library from Ribbon"); } } else if (string.Equals(currentAttributeName, "FunctionName", StringComparison.InvariantCultureIgnoreCase)) { if (ribbonIntellisenseData != null) { FillIntellisenseBySet(completionSets, applicableTo, ribbonIntellisenseData.FunctionsNames, "FunctionName from Ribbon"); } } } else if (string.Equals(currentNodeName, "JavaScriptFunction", StringComparison.InvariantCultureIgnoreCase)) { if (string.Equals(currentAttributeName, "Library", StringComparison.InvariantCultureIgnoreCase)) { FillWebResourcesText(completionSets, applicableTo, repositoryWebResource.GetWebResourceIntellisenseData()?.WebResourcesJavaScript?.Values?.ToList(), "WebResources"); if (ribbonIntellisenseData != null) { FillIntellisenseBySet(completionSets, applicableTo, ribbonIntellisenseData.Libraries, "Library from Ribbon"); } } else if (string.Equals(currentAttributeName, "FunctionName", StringComparison.InvariantCultureIgnoreCase)) { if (ribbonIntellisenseData != null) { FillIntellisenseBySet(completionSets, applicableTo, ribbonIntellisenseData.FunctionsNames, "FunctionName from Ribbon"); } } } else if (string.Equals(currentNodeName, "Title", StringComparison.InvariantCultureIgnoreCase)) { if (string.Equals(currentAttributeName, "languagecode", StringComparison.InvariantCultureIgnoreCase)) { FillLCID(completionSets, applicableTo); } } } catch (Exception ex) { DTEHelper.WriteExceptionToOutput(connectionData, ex); } }