コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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));
        }
コード例 #4
0
        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));
        }