Beispiel #1
0
        internal static Duo <XmlNode, string> GetNodeAtPosition(XmlNode node, int selectionStart, int selectionLength, XmlNodeType moveUpTo, params XmlNodeType[] moveUpIf)
        {
            XmlNode parentNode = null;
            string  str        = null;
            string  str2;

            if ((((node != null) && !SharedUtil.IsEmpty(str2 = node.OuterXml)) && ((selectionStart >= 0) && (selectionStart <= str2.Length))) && ((selectionLength >= 0) && ((selectionStart + selectionLength) <= str2.Length)))
            {
                str = str2.Substring(selectionStart, selectionLength);
                if (!node.HasChildNodes)
                {
                    parentNode = node;
                }
                else
                {
                    int    num;
                    string innerXml = node.InnerXml;
                    int    num2     = num = str2.IndexOf(innerXml, str2.IndexOf('>'));
                    if (num2 < 0)
                    {
                        num2 = num = 0;
                    }
                    if (selectionStart >= num)
                    {
                        foreach (XmlNode node3 in node.ChildNodes)
                        {
                            if (((selectionStart >= num2) && (selectionStart < (num2 + node3.OuterXml.Length))) && ((parentNode = GetNodeAtPosition(node3, selectionStart - num2, selectionLength, moveUpTo, new XmlNodeType[0]).Value1) != null))
                            {
                                break;
                            }
                            num2 += node3.OuterXml.Length;
                        }
                    }
                    if (parentNode == null)
                    {
                        parentNode = node;
                    }
                }
                if (moveUpTo != XmlNodeType.None)
                {
                    while (((parentNode != null) && (parentNode.NodeType != moveUpTo)) && (parentNode.ParentNode != null))
                    {
                        parentNode = parentNode.ParentNode;
                    }
                }
                else if (!SharedUtil.IsEmpty((ICollection)moveUpIf))
                {
                    while (((parentNode != null) && SharedUtil.In <XmlNodeType>(parentNode.NodeType, moveUpIf)) && (parentNode.ParentNode != null))
                    {
                        parentNode = parentNode.ParentNode;
                    }
                }
            }
            return(new Duo <XmlNode, string>(parentNode, str));
        }