protected override void OnDocumentChanged(EventArgs e)
 {
     base.OnDocumentChanged(e);
     if (_currentDocument != null)
     {
         _currentDocument.TextChanged -= Document_TextChanged;
     }
     _currentDocument      = Document;
     Document.TextChanged += Document_TextChanged;
 }
        private string GetId(ICSharpCode.AvalonEdit.Document.IDocument doc, ICSharpCode.AvalonEdit.Editing.Caret caret)
        {
            string amlQuery;
            var    settings = new System.Xml.XmlReaderSettings();

            if (this.Helper == null)
            {
                amlQuery = doc.Text;
            }
            else
            {
                amlQuery = this.Helper.GetCurrentQuery(doc.Text, caret.Offset);
                var loc = doc.GetLocation(doc.Text.IndexOf(amlQuery));
                settings.LineNumberOffset = loc.Line;
            }

            string lastItemId = null;
            string lastId     = null;
            var    elems      = new Stack <string>();


            using (var reader = new System.IO.StringReader(amlQuery))
            {
                using (var xmlReader = System.Xml.XmlReader.Create(reader))
                {
                    var lineInfo = (System.Xml.IXmlLineInfo)xmlReader;
                    while (xmlReader.Read())
                    {
                        switch (xmlReader.NodeType)
                        {
                        case System.Xml.XmlNodeType.Element:
                        case System.Xml.XmlNodeType.EndElement:
                            if (lineInfo.LineNumber > this.editor.TextArea.Caret.Line ||
                                (lineInfo.LineNumber == this.editor.TextArea.Caret.Line && (lineInfo.LinePosition - 1) > this.editor.TextArea.Caret.Column))
                            {
                                return(lastId ?? lastItemId);
                            }
                            break;
                        }

                        switch (xmlReader.NodeType)
                        {
                        case System.Xml.XmlNodeType.Element:
                            switch (xmlReader.LocalName)
                            {
                            case "Item":
                                lastItemId = xmlReader.GetAttribute("id");
                                lastId     = xmlReader.GetAttribute("id");
                                break;
                            }
                            if (!xmlReader.IsEmptyElement)
                            {
                                elems.Push(xmlReader.LocalName);
                            }
                            break;

                        case System.Xml.XmlNodeType.Text:
                            if (xmlReader.Value.IsGuid())
                            {
                                switch (elems.Peek())
                                {
                                case "id":
                                    lastItemId = xmlReader.Value;
                                    break;

                                default:
                                    lastId = xmlReader.Value;
                                    break;
                                }
                            }
                            break;

                        case System.Xml.XmlNodeType.EndElement:
                            lastId = null;
                            if (elems.Pop() == "Item")
                            {
                                lastItemId = null;
                            }
                            break;
                        }
                    }
                }
            }

            return(null);
        }