protected override Action <ITextControl> ExecutePsiTransaction(ISolution solution, IProgressIndicator progress)
        {
            IXmlTagHeader tagHeader = GetTagHeader();

            if (tagHeader == null)
            {
                return(null);
            }

            IXmlTag tag = XmlTagNavigator.GetByTagHeader(tagHeader);

            if (tag == null)
            {
                return(null);
            }

            XmlElementFactory factory = XmlElementFactory.GetInstance(tag);

            IXmlAttribute idAttr = factory.CreateAttributeForTag(tag, "id=\"\"");

            tag.AddAttributeBefore(idAttr, null);

            // continuation to do after transaction committed
            return(textControl =>
                   // move cursor inside new created id attribute
                   textControl.Caret.MoveTo(idAttr.Value.GetDocumentRange().TextRange.StartOffset, CaretVisualPlacement.Generic));
        }
        public override bool IsAvailable(IUserDataHolder dataHolder)
        {
            // grab the tag we're on
            IXmlTagHeader tagHeader = GetTagHeader();

            if (tagHeader == null)
            {
                return(false);
            }

            // check if the attribute is already there (case-insensitive)
            IXmlAttribute idAttr = tagHeader.GetAttribute(attr => StringComparer.OrdinalIgnoreCase.Equals(attr.AttributeName, "id"));

            if (idAttr != null)
            {
                return(false);
            }

            return(true);
        }