Пример #1
0
 public SvgElementInstanceList(SvgUseElement useElement, SvgElementInstance parent)
 {
     if (parent.CorrespondingElement == null)
     {
         // Handle non SVGElement cases
         items = new SvgElementInstance[0];
     }
     else if (parent.CorrespondingElement is ISvgUseElement)
     {
         // Handle recursive SVGUseElement cases
         items = new SvgElementInstance[1];
         ISvgUseElement iUseElement = (ISvgUseElement)parent.CorrespondingElement;
         items[0] = (SvgElementInstance)iUseElement.InstanceRoot;
         return;
     }
     else
     {
         XmlNodeList xmlChildNodes = parent.CorrespondingElement.ChildNodes;
         for (int i = 0; i < xmlChildNodes.Count; i++)
         {
             items[i] = new SvgElementInstance(xmlChildNodes[i], useElement, parent);
             if (i > 0)
             {
                 items[i].SetPreviousSibling(items[i - 1]);
                 items[i - 1].SetNextSibling(items[i]);
             }
         }
     }
 }
Пример #2
0
 public SvgElementInstance(XmlNode refNode, SvgUseElement useElement, SvgElementInstance parent)
 {
     correspondingUseElement = (ISvgUseElement)useElement;
     parentNode = (SvgElementInstance)parent;
     correspondingElement = (ISvgElement)refNode;
     eventTarget = new EventTarget(this);
 }
Пример #3
0
        public void Visit(ISvgUseElement element)
        {
            SvgUseElement useElement = (SvgUseElement)element;
            SvgDocument   document   = useElement.OwnerDocument;
            XmlElement    refEl      = useElement.ReferencedElement;

            if (refEl == null)
            {
                return;
            }

            bool isImported = false;

            // For the external node, the documents are different, and we may not be
            // able to insert this node, so we first import it...
            if (useElement.OwnerDocument != refEl.OwnerDocument)
            {
                XmlElement importedNode =
                    useElement.OwnerDocument.ImportNode(refEl, true) as XmlElement;

                if (importedNode != null)
                {
                    SvgElement importedSvgElement = importedNode as SvgElement;
                    if (importedSvgElement != null)
                    {
                        importedSvgElement.Imported       = true;
                        importedSvgElement.ImportNode     = refEl as SvgElement;
                        importedSvgElement.ImportDocument = refEl.OwnerDocument as SvgDocument;
                    }

                    refEl      = importedNode;
                    isImported = true;
                }
            }
            XmlElement refElParent = (XmlElement)refEl.ParentNode;

            useElement.OwnerDocument.Static = true;
            useElement.CopyToReferencedElement(refEl);
            if (!isImported) // if imported, we do not need to remove it...
            {
                refElParent.RemoveChild(refEl);
            }
            useElement.AppendChild(refEl);

            // Now, render the use element...
            var refElement = useElement?.FirstChild;

            if (refElement is IElementVisitorTarget evt)
            {
                evt.Accept(this);
            }

            useElement.RemoveChild(refEl);
            useElement.RestoreReferencedElement(refEl);
            if (!isImported)
            {
                refElParent.AppendChild(refEl);
            }
            useElement.OwnerDocument.Static = false;
        }
Пример #4
0
 public SvgElementInstance(XmlNode refNode, SvgUseElement useElement, SvgElementInstance parent)
 {
     _correspondingUseElement = useElement;
     _parentNode           = parent;
     _correspondingElement = refNode as ISvgElement;
     _eventTarget          = new EventTarget(this);
 }
 public SvgElementInstance(XmlNode refNode, SvgUseElement useElement, SvgElementInstance parent)
 {
     correspondingUseElement = (ISvgUseElement)useElement;
     parentNode           = (SvgElementInstance)parent;
     correspondingElement = (ISvgElement)refNode;
     eventTarget          = new EventTarget(this);
 }