bool IXmlHandler.CanAutoComplete(bool textChanged) { var node = bindingEditor.GetNodeAt(bindingEditor.SelectionStart - 1); _lastValueNode = node as XmlValueExpressionNode; if (_lastValueNode != null) { return(_lastValueNode.Type == XmlValueExpressionType.ElementStartTag || _lastValueNode.Type == XmlValueExpressionType.AttributeName); } if (textChanged) { return(false); } var invalidExpressionNode = node as XmlInvalidExpressionNode; if (invalidExpressionNode != null && invalidExpressionNode.Nodes != null) { _lastElement = invalidExpressionNode.Nodes.OfType <XmlElementExpressionNode>().FirstOrDefault(); } else { _lastElement = node as XmlElementExpressionNode; } return(_lastElement != null); }
private ICollection <AutoCompleteItem> ProvideAttributeAutoCompleteItems(XmlElementExpressionNode parent, ref int startIndexToReplace, ref int endIndexToReplace) { SortedDictionary <string, AutoCompleteItem> list; if (!_controlsDictionary.TryGetValue(parent.Name, out list)) { return(null); } var attributeName = _lastValueNode.GetValue(bindingEditor.Text); var members = attributeName.Split(DotSeparator, StringSplitOptions.None); var path = members[0]; var cursorIndex = bindingEditor.SelectionStart - _lastValueNode.Start; AutoCompleteItem member; if (members.Length == 1 || path.Length >= cursorIndex || !list.TryGetValue(path, out member)) { startIndexToReplace = _lastValueNode.Start; endIndexToReplace = startIndexToReplace + path.Length; return(FindItems(list, attributeName.Substring(0, cursorIndex))); } Type type = member.Type; int currentLength = members[0].Length; int startIndex = currentLength + 1; for (int i = 1; i < members.Length; i++) { path = members[i]; currentLength += path.Length; if (startIndex + path.Length >= cursorIndex) { startIndexToReplace = startIndex + _lastValueNode.Start; endIndexToReplace = startIndexToReplace + path.Length; if (!string.IsNullOrEmpty(path) && cursorIndex > startIndex) { path = path.Substring(0, cursorIndex - startIndex); } return(FindControlMemberItems(type, path)); } var bindingMember = BindingServiceProvider .MemberProvider .GetBindingMember(type, path, false, false); type = bindingMember == null ? typeof(object) : bindingMember.Type; startIndex += path.Length + 1; } return(null); }
private XmlExpressionNode TryParseAttribute(XmlElementExpressionNode element) { int startPosition = _tokenizer.FirstCharPosition; var name = new XmlValueExpressionNode(element, XmlValueExpressionType.AttributeName, startPosition, _tokenizer.Position); if (_tokenizer.NextToken(true) != TokenType.Equal) { return(InvalidExpression(XmlInvalidExpressionType.Attribute, startPosition, EndElementTokens, name)); } var equal = new XmlValueExpressionNode(element, XmlValueExpressionType.AttributeEqual, name.End, _tokenizer.Position); if (_tokenizer.NextToken(true) != TokenType.StringLiteral) { return(InvalidExpression(XmlInvalidExpressionType.Attribute, startPosition, EndElementTokens, name, equal)); } var value = new XmlValueExpressionNode(XmlValueExpressionType.AttributeValue, _tokenizer.FirstCharPosition, _tokenizer.Position); int position = _tokenizer.Position; _tokenizer.NextToken(true); return(new XmlAttributeExpressionNode(name, equal, value, startPosition, position)); }
private XmlExpressionNode TryParseElement() { int startPosition = _tokenizer.FirstCharPosition; var tagEnd = _tokenizer.Position; _tokenizer.NextToken(false); if (!IsXmlIdentifier()) { var node = new XmlValueExpressionNode(XmlValueExpressionType.ElementStartTag, startPosition, tagEnd); return(InvalidExpression(XmlInvalidExpressionType.Element, startPosition, node)); } var startTag = new XmlValueExpressionNode(XmlValueExpressionType.ElementStartTag, startPosition, _tokenizer.Position); string nameString = _tokenizer.Value; _tokenizer.NextToken(true); var elementNode = new XmlElementExpressionNode(startTag, nameString, startPosition, -1); while (_tokenizer.Token != TokenType.Eof) { if (IsXmlIdentifier()) { XmlExpressionNode attribute = TryParseAttribute(elementNode); elementNode.AddAttribute(attribute); continue; } if (_tokenizer.Token == XmlTokens.CloseElement) { elementNode.UpdateCloseTag( new XmlValueExpressionNode(XmlValueExpressionType.ElementEndTag, _tokenizer.FirstCharPosition, _tokenizer.Position), _tokenizer.Position); _tokenizer.NextToken(false); return(elementNode); } if (_tokenizer.Token == TokenType.GreaterThan) { elementNode.UpdateStartTagEnd(new XmlValueExpressionNode(XmlValueExpressionType.ElementStartTagEnd, _tokenizer.FirstCharPosition, _tokenizer.Position)); _tokenizer.NextToken(false); IList <XmlExpressionNode> nodes = TryParseElementValue(); for (int i = 0; i < nodes.Count; i++) { elementNode.AddElement(nodes[i]); } int closeElementPosition = _tokenizer.FirstCharPosition; if (_tokenizer.Token != XmlTokens.ComplexCloseElement) { return(InvalidExpression(XmlInvalidExpressionType.Element, startPosition, elementNode)); } _tokenizer.NextToken(false); if (_tokenizer.Value != nameString) { return(InvalidExpression(XmlInvalidExpressionType.Element, startPosition, elementNode)); } if (_tokenizer.NextToken(false) != TokenType.GreaterThan) { return(InvalidExpression(XmlInvalidExpressionType.Element, startPosition, elementNode)); } elementNode.UpdateCloseTag( new XmlValueExpressionNode(XmlValueExpressionType.ElementEndTag, closeElementPosition, _tokenizer.Position), _tokenizer.Position); _tokenizer.NextToken(false); return(elementNode); } if (_tokenizer.Token == TokenType.Whitespace) { _tokenizer.NextToken(true); } return(InvalidExpression(XmlInvalidExpressionType.Element, startPosition, elementNode)); } return(InvalidExpression(XmlInvalidExpressionType.Element, startPosition, elementNode)); }