blob: 1147dabf9ea2e82ed1abdbdf23029c850a8c6c25 [file] [log] [blame]
<HTML><HEAD><META CONTENT="text/html; charset=UTF-8" HTTP-EQUIV="Content-Type"/><TITLE>EMMA Coverage Report</TITLE><STYLE TYPE="text/css"> TABLE,TD,TH {border-style:solid; border-color:black;} TD,TH {background:white;margin:0;line-height:100%;padding-left:0.5em;padding-right:0.5em;} TD {border-width:0 1px 0 0;} TH {border-width:1px 1px 1px 0;} TR TD.h {color:red;} TABLE {border-spacing:0; border-collapse:collapse;border-width:0 0 1px 1px;} P,H1,H2,H3,TH {font-family:verdana,arial,sans-serif;font-size:10pt;} TD {font-family:courier,monospace;font-size:10pt;} TABLE.hdft {border-spacing:0;border-collapse:collapse;border-style:none;} TABLE.hdft TH,TABLE.hdft TD {border-style:none;line-height:normal;} TABLE.hdft TH.tl,TABLE.hdft TD.tl {background:#6699CC;color:white;} TABLE.hdft TD.nv {background:#6633DD;color:white;} .nv A:link {color:white;} .nv A:visited {color:white;} .nv A:active {color:yellow;} TABLE.hdft A:link {color:white;} TABLE.hdft A:visited {color:white;} TABLE.hdft A:active {color:yellow;} .in {color:#356085;} TABLE.s TD {padding-left:0.25em;padding-right:0.25em;} TABLE.s TD.l {padding-left:0.25em;padding-right:0.25em;text-align:right;background:#F0F0F0;} TABLE.s TR.z TD {background:#FF9999;} TABLE.s TR.p TD {background:#FFFF88;} TABLE.s TR.c TD {background:#CCFFCC;} A:link {color:#0000EE;text-decoration:none;} A:visited {color:#0000EE;text-decoration:none;} A:hover {color:#0000EE;text-decoration:underline;} TABLE.cn {border-width:0 0 1px 0;} TABLE.s {border-width:1px 0 1px 1px;} TD.h {color:red;border-width:0 1px 0 0;} TD.f {border-width:0 1px 0 1px;} TD.hf {color:red;border-width:0 1px 0 1px;} TH.f {border-width:1px 1px 1px 1px;} TR.cis TD {background:#F0F0F0;} TR.cis TD {border-width:1px 1px 1px 0;} TR.cis TD.h {color:red;border-width:1px 1px 1px 0;} TR.cis TD.f {border-width:1px 1px 1px 1px;} TR.cis TD.hf {color:red;border-width:1px 1px 1px 1px;} TD.b {border-style:none;background:transparent;line-height:50%;} TD.bt {border-width:1px 0 0 0;background:transparent;line-height:50%;} TR.o TD {background:#F0F0F0;}TABLE.it {border-style:none;}TABLE.it TD,TABLE.it TH {border-style:none;}</STYLE></HEAD><BODY><TABLE CLASS="hdft" CELLSPACING="0" WIDTH="100%"><TR><TH CLASS="tl"><A HREF="http://www.eclemma.org/">EMMA</A> Coverage Report (generated Fri Feb 20 18:44:54 GMT 2009)</TH></TR><TR><TD CLASS="nv">[<A HREF="../xslUnitTestCoverage.html">all classes</A>][<A HREF="85.html">org.eclipse.wst.xml.core.internal.document</A>]</TD></TR></TABLE><H2>COVERAGE SUMMARY FOR SOURCE FILE [<SPAN CLASS="in">XMLModelParser.java</SPAN>]</H2><TABLE CELLSPACING="0" WIDTH="100%"><TR><TH>name</TH><TH>class, %</TH><TH>method, %</TH><TH>block, %</TH><TH>line, %</TH></TR><TR><TD>XMLModelParser.java</TD><TD>100% (1/1)</TD><TD CLASS="h">47%  (26/55)</TD><TD CLASS="h">21%  (914/4384)</TD><TD CLASS="h">19%  (278.9/1432)</TD></TR></TABLE><H3>COVERAGE BREAKDOWN BY CLASS AND METHOD</H3><TABLE CLASS="cn" CELLSPACING="0" WIDTH="100%"><TR><TH CLASS="f">name</TH><TH>class, %</TH><TH>method, %</TH><TH>block, %</TH><TH>line, %</TH></TR><TR><TD CLASS="b"> </TD><TD CLASS="b"> </TD><TD CLASS="b"> </TD><TD CLASS="b"> </TD><TD CLASS="b"> </TD></TR><TR CLASS="cis"><TD CLASS="f">class <A HREF="#0">XMLModelParser</A></TD><TD>100% (1/1)</TD><TD CLASS="h">47%  (26/55)</TD><TD CLASS="h">21%  (914/4384)</TD><TD CLASS="h">19%  (278.9/1432)</TD></TR><TR><TD CLASS="f"><A HREF="#1">canBeImplicitTag (Element): boolean</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/11)</TD><TD CLASS="h">0%   (0/4)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#2">canBeImplicitTag (Element, Node): boolean</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/12)</TD><TD CLASS="h">0%   (0/4)</TD></TR><TR><TD CLASS="f"><A HREF="#3">changeAttrEqual (IStructuredDocumentRegion, ITextRegion): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/36)</TD><TD CLASS="h">0%   (0/15)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#4">changeAttrName (IStructuredDocumentRegion, ITextRegion): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/76)</TD><TD CLASS="h">0%   (0/29)</TD></TR><TR><TD CLASS="f"><A HREF="#5">changeAttrValue (IStructuredDocumentRegion, ITextRegion): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/71)</TD><TD CLASS="h">0%   (0/28)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#6">changeData (IStructuredDocumentRegion, ITextRegion): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/54)</TD><TD CLASS="h">0%   (0/24)</TD></TR><TR><TD CLASS="f"><A HREF="#7">changeEndTag (IStructuredDocumentRegion, ITextRegionList, ITextRegionList): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/78)</TD><TD CLASS="h">0%   (0/31)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#8">changeRegion (IStructuredDocumentRegion, ITextRegion): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/82)</TD><TD CLASS="h">0%   (0/18)</TD></TR><TR><TD CLASS="f"><A HREF="#9">changeStartTag (IStructuredDocumentRegion, ITextRegionList, ITextRegionList):...</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/343)</TD><TD CLASS="h">0%   (0/115)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#a">changeStructuredDocumentRegion (IStructuredDocumentRegion): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/25)</TD><TD CLASS="h">0%   (0/11)</TD></TR><TR><TD CLASS="f"><A HREF="#b">changeTagName (IStructuredDocumentRegion, ITextRegion): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/68)</TD><TD CLASS="h">0%   (0/23)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#c">computeNestedTag (String, String, IStructuredDocumentRegion, ITextRegion): St...</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/2)</TD><TD CLASS="h">0%   (0/1)</TD></TR><TR><TD CLASS="f"><A HREF="#d">getContext (): XMLModelContext</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/3)</TD><TD CLASS="h">0%   (0/1)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#e">getModel (): IDOMModel</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/3)</TD><TD CLASS="h">0%   (0/1)</TD></TR><TR><TD CLASS="f"><A HREF="#f">insertCDATASection (IStructuredDocumentRegion): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/30)</TD><TD CLASS="h">0%   (0/12)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#10">insertDecl (IStructuredDocumentRegion): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/96)</TD><TD CLASS="h">0%   (0/35)</TD></TR><TR><TD CLASS="f"><A HREF="#11">insertEntityRef (IStructuredDocumentRegion): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/104)</TD><TD CLASS="h">0%   (0/36)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#12">insertInvalidDecl (IStructuredDocumentRegion): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/33)</TD><TD CLASS="h">0%   (0/13)</TD></TR><TR><TD CLASS="f"><A HREF="#13">insertNestedTag (IStructuredDocumentRegion): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/175)</TD><TD CLASS="h">0%   (0/54)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#14">isEndTag (IDOMElement): boolean</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/12)</TD><TD CLASS="h">0%   (0/4)</TD></TR><TR><TD CLASS="f"><A HREF="#15">isNestedContent (String): boolean</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/4)</TD><TD CLASS="h">0%   (0/2)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#16">isNestedTagClose (String): boolean</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/4)</TD><TD CLASS="h">0%   (0/2)</TD></TR><TR><TD CLASS="f"><A HREF="#17">isNestedTagOpen (String): boolean</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/4)</TD><TD CLASS="h">0%   (0/2)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#18">removeEndTag (Element): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/99)</TD><TD CLASS="h">0%   (0/32)</TD></TR><TR><TD CLASS="f"><A HREF="#19">removeImplicitElement (Node): Element</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/112)</TD><TD CLASS="h">0%   (0/35)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#1a">removeNode (Node): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/137)</TD><TD CLASS="h">0%   (0/40)</TD></TR><TR><TD CLASS="f"><A HREF="#1b">removeStartTag (Element): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/589)</TD><TD CLASS="h">0%   (0/183)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#1c">removeStructuredDocumentRegion (IStructuredDocumentRegion): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/235)</TD><TD CLASS="h">0%   (0/77)</TD></TR><TR><TD CLASS="f"><A HREF="#1d">replaceRegions (IStructuredDocumentRegion, ITextRegionList, ITextRegionList):...</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/41)</TD><TD CLASS="h">0%   (0/12)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#1e">demoteNodes (Node, Node, Node, Node): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">15%  (29/197)</TD><TD CLASS="h">14%  (10/71)</TD></TR><TR><TD CLASS="f"><A HREF="#1f">promoteNodes (Node, Node, Node, Node, Node): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">19%  (37/190)</TD><TD CLASS="h">20%  (13/64)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#20">cleanupEndTag (): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">22%  (30/134)</TD><TD CLASS="h">25%  (10/40)</TD></TR><TR><TD CLASS="f"><A HREF="#21">setupContext (IStructuredDocumentRegion): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">23%  (24/104)</TD><TD CLASS="h">25%  (9/36)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#22">insertNode (Node): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">33%  (47/142)</TD><TD CLASS="h">28%  (13.4/48)</TD></TR><TR><TD CLASS="f"><A HREF="#23">cleanupText (): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">34%  (50/146)</TD><TD CLASS="h">35%  (13.9/40)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#24">insertNode (Node, Node, Node): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">40%  (16/40)</TD><TD CLASS="h">34%  (4.4/13)</TD></TR><TR><TD CLASS="f"><A HREF="#25">createImplicitElement (Node, Node): Element</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">47%  (7/15)</TD><TD CLASS="h">75%  (3/4)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#26">insertComment (IStructuredDocumentRegion): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">58%  (68/117)</TD><TD CLASS="h">54%  (21/39)</TD></TR><TR><TD CLASS="f"><A HREF="#27">getFindRootName (String): String</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">64%  (7/11)</TD><TD CLASS="h">75%  (3/4)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#28">insertEndTag (Element): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">64%  (41/64)</TD><TD CLASS="h">59%  (13/22)</TD></TR><TR><TD CLASS="f"><A HREF="#29">insertEndTag (IStructuredDocumentRegion): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">66%  (56/85)</TD><TD CLASS="h">59%  (17/29)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#2a">replaceStructuredDocumentRegions (IStructuredDocumentRegionList, IStructuredD...</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">68%  (55/81)</TD><TD CLASS="h">70%  (14.6/21)</TD></TR><TR><TD CLASS="f"><A HREF="#2b">canContain (Element, Node): boolean</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">70%  (30/43)</TD><TD CLASS="h">64%  (9/14)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#2c">createCommentElement (String, boolean): Element</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">71%  (49/69)</TD><TD CLASS="h">77%  (10.8/14)</TD></TR><TR><TD CLASS="f"><A HREF="#2d">getParserAdapter (): ModelParserAdapter</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">71%  (15/21)</TD><TD CLASS="h">71%  (0.7/1)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#2e">insertStructuredDocumentRegion (IStructuredDocumentRegion): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">77%  (55/71)</TD><TD CLASS="h">79%  (15/19)</TD></TR><TR><TD CLASS="f"><A HREF="#2f">insertStartTag (Element): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>85%  (44/52)</TD><TD CLASS="h">78%  (14/18)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#30">insertStartTag (IStructuredDocumentRegion): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>96%  (143/149)</TD><TD>92%  (44/48)</TD></TR><TR><TD CLASS="f"><A HREF="#31">insertPI (IStructuredDocumentRegion): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>96%  (51/53)</TD><TD>89%  (16/18)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#32">insertText (IStructuredDocumentRegion): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>97%  (30/31)</TD><TD>91%  (10/11)</TD></TR><TR><TD CLASS="f"><A HREF="#0">XMLModelParser (DOMModelImpl): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (14/14)</TD><TD>100% (6/6)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#34">isNestedCommentOpen (String): boolean</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (4/4)</TD><TD>100% (2/2)</TD></TR><TR><TD CLASS="f"><A HREF="#35">isNestedCommentText (String): boolean</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (4/4)</TD><TD>100% (2/2)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#36">isNestedTag (String): boolean</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (4/4)</TD><TD>100% (2/2)</TD></TR><TR><TD CLASS="f"><A HREF="#37">isNestedTagName (String): boolean</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (4/4)</TD><TD>100% (2/2)</TD></TR></TABLE><P></P><TABLE CLASS="s" CELLSPACING="0" WIDTH="100%"><TR><TD CLASS="l">1</TD><TD>/*******************************************************************************</TD></TR><TR><TD CLASS="l">2</TD><TD> * Copyright (c) 2001, 2008 IBM Corporation and others.</TD></TR><TR><TD CLASS="l">3</TD><TD> * All rights reserved. This program and the accompanying materials</TD></TR><TR><TD CLASS="l">4</TD><TD> * are made available under the terms of the Eclipse Public License v1.0</TD></TR><TR><TD CLASS="l">5</TD><TD> * which accompanies this distribution, and is available at</TD></TR><TR><TD CLASS="l">6</TD><TD> * http://www.eclipse.org/legal/epl-v10.html</TD></TR><TR><TD CLASS="l">7</TD><TD> *</TD></TR><TR><TD CLASS="l">8</TD><TD> * Contributors:</TD></TR><TR><TD CLASS="l">9</TD><TD> *     IBM Corporation - initial API and implementation</TD></TR><TR><TD CLASS="l">10</TD><TD> *     Jens Lukowski/Innoopract - initial renaming/restructuring</TD></TR><TR><TD CLASS="l">11</TD><TD> *     </TD></TR><TR><TD CLASS="l">12</TD><TD> *******************************************************************************/</TD></TR><TR><TD CLASS="l">13</TD><TD>package org.eclipse.wst.xml.core.internal.document;</TD></TR><TR><TD CLASS="l">14</TD><TD> </TD></TR><TR><TD CLASS="l">15</TD><TD> </TD></TR><TR><TD CLASS="l">16</TD><TD> </TD></TR><TR><TD CLASS="l">17</TD><TD>import java.util.ArrayList;</TD></TR><TR><TD CLASS="l">18</TD><TD>import java.util.Iterator;</TD></TR><TR><TD CLASS="l">19</TD><TD>import java.util.List;</TD></TR><TR><TD CLASS="l">20</TD><TD> </TD></TR><TR><TD CLASS="l">21</TD><TD>import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;</TD></TR><TR><TD CLASS="l">22</TD><TD>import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegionList;</TD></TR><TR><TD CLASS="l">23</TD><TD>import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;</TD></TR><TR><TD CLASS="l">24</TD><TD>import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;</TD></TR><TR><TD CLASS="l">25</TD><TD>import org.eclipse.wst.xml.core.internal.commentelement.impl.CommentElementConfiguration;</TD></TR><TR><TD CLASS="l">26</TD><TD>import org.eclipse.wst.xml.core.internal.commentelement.impl.CommentElementRegistry;</TD></TR><TR><TD CLASS="l">27</TD><TD>import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;</TD></TR><TR><TD CLASS="l">28</TD><TD>import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;</TD></TR><TR><TD CLASS="l">29</TD><TD>import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;</TD></TR><TR><TD CLASS="l">30</TD><TD>import org.w3c.dom.Attr;</TD></TR><TR><TD CLASS="l">31</TD><TD>import org.w3c.dom.DOMException;</TD></TR><TR><TD CLASS="l">32</TD><TD>import org.w3c.dom.Element;</TD></TR><TR><TD CLASS="l">33</TD><TD>import org.w3c.dom.NamedNodeMap;</TD></TR><TR><TD CLASS="l">34</TD><TD>import org.w3c.dom.Node;</TD></TR><TR><TD CLASS="l">35</TD><TD>import org.w3c.dom.Text;</TD></TR><TR><TD CLASS="l">36</TD><TD> </TD></TR><TR><TD CLASS="l">37</TD><TD> </TD></TR><TR><TD CLASS="l">38</TD><TD>/**</TD></TR><TR><TD CLASS="l">39</TD><TD> * XMLModelParser</TD></TR><TR><TD CLASS="l">40</TD><TD> */</TD></TR><TR><TD CLASS="l">41</TD><TD>public class XMLModelParser {</TD></TR><TR CLASS="c"><TD CLASS="l">42</TD><TD>        private XMLModelContext context = null;</TD></TR><TR CLASS="c"><TD CLASS="l">43</TD><TD>        private DOMModelImpl model = null;</TD></TR><TR><TD CLASS="l"><A NAME="0">44</A></TD><TD> </TD></TR><TR><TD CLASS="l">45</TD><TD>        /**</TD></TR><TR><TD CLASS="l">46</TD><TD>         */</TD></TR><TR><TD CLASS="l">47</TD><TD>        protected XMLModelParser(DOMModelImpl model) {</TD></TR><TR CLASS="c"><TD CLASS="l">48</TD><TD>                super();</TD></TR><TR><TD CLASS="l">49</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">50</TD><TD>                if (model != null) {</TD></TR><TR CLASS="c"><TD CLASS="l">51</TD><TD>                        this.model = model;</TD></TR><TR><TD CLASS="l">52</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">53</TD><TD>        }</TD></TR><TR><TD CLASS="l"><A NAME="1">54</A></TD><TD> </TD></TR><TR><TD CLASS="l">55</TD><TD>        /**</TD></TR><TR><TD CLASS="l">56</TD><TD>         */</TD></TR><TR><TD CLASS="l">57</TD><TD>        protected boolean canBeImplicitTag(Element element) {</TD></TR><TR CLASS="z"><TD CLASS="l">58</TD><TD>                ModelParserAdapter adapter = getParserAdapter();</TD></TR><TR CLASS="z"><TD CLASS="l">59</TD><TD>                if (adapter != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">60</TD><TD>                        return adapter.canBeImplicitTag(element);</TD></TR><TR><TD CLASS="l">61</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">62</TD><TD>                return false;</TD></TR><TR><TD CLASS="l">63</TD><TD>        }</TD></TR><TR><TD CLASS="l"><A NAME="2">64</A></TD><TD> </TD></TR><TR><TD CLASS="l">65</TD><TD>        /**</TD></TR><TR><TD CLASS="l">66</TD><TD>         */</TD></TR><TR><TD CLASS="l">67</TD><TD>        protected boolean canBeImplicitTag(Element element, Node child) {</TD></TR><TR CLASS="z"><TD CLASS="l">68</TD><TD>                ModelParserAdapter adapter = getParserAdapter();</TD></TR><TR CLASS="z"><TD CLASS="l">69</TD><TD>                if (adapter != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">70</TD><TD>                        return adapter.canBeImplicitTag(element, child);</TD></TR><TR><TD CLASS="l">71</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">72</TD><TD>                return false;</TD></TR><TR><TD CLASS="l">73</TD><TD>        }</TD></TR><TR><TD CLASS="l"><A NAME="2b">74</A></TD><TD> </TD></TR><TR><TD CLASS="l">75</TD><TD>        /**</TD></TR><TR><TD CLASS="l">76</TD><TD>         */</TD></TR><TR><TD CLASS="l">77</TD><TD>        protected boolean canContain(Element element, Node child) {</TD></TR><TR CLASS="c"><TD CLASS="l">78</TD><TD>                if (element == null || child == null)</TD></TR><TR CLASS="z"><TD CLASS="l">79</TD><TD>                        return false;</TD></TR><TR CLASS="c"><TD CLASS="l">80</TD><TD>                ElementImpl impl = (ElementImpl) element;</TD></TR><TR CLASS="c"><TD CLASS="l">81</TD><TD>                if (impl.isEndTag())</TD></TR><TR CLASS="z"><TD CLASS="l">82</TD><TD>                        return false; // invalid (floating) end tag</TD></TR><TR CLASS="c"><TD CLASS="l">83</TD><TD>                if (!impl.isContainer())</TD></TR><TR CLASS="z"><TD CLASS="l">84</TD><TD>                        return false;</TD></TR><TR CLASS="c"><TD CLASS="l">85</TD><TD>                if (child.getNodeType() != Node.TEXT_NODE) {</TD></TR><TR CLASS="c"><TD CLASS="l">86</TD><TD>                        if (impl.isJSPContainer() || impl.isCDATAContainer()) {</TD></TR><TR><TD CLASS="l">87</TD><TD>                                // accepts only Text child</TD></TR><TR CLASS="z"><TD CLASS="l">88</TD><TD>                                return false;</TD></TR><TR><TD CLASS="l">89</TD><TD>                        }</TD></TR><TR><TD CLASS="l">90</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">91</TD><TD>                ModelParserAdapter adapter = getParserAdapter();</TD></TR><TR CLASS="c"><TD CLASS="l">92</TD><TD>                if (adapter != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">93</TD><TD>                        return adapter.canContain(element, child);</TD></TR><TR><TD CLASS="l">94</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">95</TD><TD>                return true;</TD></TR><TR><TD CLASS="l">96</TD><TD>        }</TD></TR><TR><TD CLASS="l"><A NAME="3">97</A></TD><TD> </TD></TR><TR><TD CLASS="l">98</TD><TD>        /**</TD></TR><TR><TD CLASS="l">99</TD><TD>         */</TD></TR><TR><TD CLASS="l">100</TD><TD>        private void changeAttrEqual(IStructuredDocumentRegion flatNode, ITextRegion region) {</TD></TR><TR CLASS="z"><TD CLASS="l">101</TD><TD>                int offset = flatNode.getStart();</TD></TR><TR CLASS="z"><TD CLASS="l">102</TD><TD>                if (offset &lt; 0)</TD></TR><TR CLASS="z"><TD CLASS="l">103</TD><TD>                        return;</TD></TR><TR CLASS="z"><TD CLASS="l">104</TD><TD>                NodeImpl root = (NodeImpl) this.context.getRootNode();</TD></TR><TR CLASS="z"><TD CLASS="l">105</TD><TD>                if (root == null)</TD></TR><TR CLASS="z"><TD CLASS="l">106</TD><TD>                        return;</TD></TR><TR CLASS="z"><TD CLASS="l">107</TD><TD>                Node node = root.getNodeAt(offset);</TD></TR><TR CLASS="z"><TD CLASS="l">108</TD><TD>                if (node == null)</TD></TR><TR CLASS="z"><TD CLASS="l">109</TD><TD>                        return;</TD></TR><TR CLASS="z"><TD CLASS="l">110</TD><TD>                if (node.getNodeType() != Node.ELEMENT_NODE) {</TD></TR><TR CLASS="z"><TD CLASS="l">111</TD><TD>                        if (node.getNodeType() == Node.PROCESSING_INSTRUCTION_NODE) {</TD></TR><TR><TD CLASS="l">112</TD><TD>                                // just notify the change instead of setting data</TD></TR><TR CLASS="z"><TD CLASS="l">113</TD><TD>                                ProcessingInstructionImpl pi = (ProcessingInstructionImpl) node;</TD></TR><TR CLASS="z"><TD CLASS="l">114</TD><TD>                                pi.notifyValueChanged();</TD></TR><TR><TD CLASS="l">115</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">116</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">117</TD><TD>                }</TD></TR><TR><TD CLASS="l">118</TD><TD>                // actually, do nothing</TD></TR><TR CLASS="z"><TD CLASS="l">119</TD><TD>        }</TD></TR><TR><TD CLASS="l">120</TD><TD> </TD></TR><TR><TD CLASS="l">121</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="4">122</A></TD><TD>         * changeAttrName method</TD></TR><TR><TD CLASS="l">123</TD><TD>         * </TD></TR><TR><TD CLASS="l">124</TD><TD>         */</TD></TR><TR><TD CLASS="l">125</TD><TD>        private void changeAttrName(IStructuredDocumentRegion flatNode, ITextRegion region) {</TD></TR><TR CLASS="z"><TD CLASS="l">126</TD><TD>                int offset = flatNode.getStart();</TD></TR><TR CLASS="z"><TD CLASS="l">127</TD><TD>                if (offset &lt; 0)</TD></TR><TR CLASS="z"><TD CLASS="l">128</TD><TD>                        return;</TD></TR><TR CLASS="z"><TD CLASS="l">129</TD><TD>                NodeImpl root = (NodeImpl) this.context.getRootNode();</TD></TR><TR CLASS="z"><TD CLASS="l">130</TD><TD>                if (root == null)</TD></TR><TR CLASS="z"><TD CLASS="l">131</TD><TD>                        return;</TD></TR><TR CLASS="z"><TD CLASS="l">132</TD><TD>                Node node = root.getNodeAt(offset);</TD></TR><TR CLASS="z"><TD CLASS="l">133</TD><TD>                if (node == null)</TD></TR><TR CLASS="z"><TD CLASS="l">134</TD><TD>                        return;</TD></TR><TR CLASS="z"><TD CLASS="l">135</TD><TD>                if (node.getNodeType() != Node.ELEMENT_NODE) {</TD></TR><TR CLASS="z"><TD CLASS="l">136</TD><TD>                        if (node.getNodeType() == Node.PROCESSING_INSTRUCTION_NODE) {</TD></TR><TR><TD CLASS="l">137</TD><TD>                                // just notify the change instead of setting data</TD></TR><TR CLASS="z"><TD CLASS="l">138</TD><TD>                                ProcessingInstructionImpl pi = (ProcessingInstructionImpl) node;</TD></TR><TR CLASS="z"><TD CLASS="l">139</TD><TD>                                pi.notifyValueChanged();</TD></TR><TR><TD CLASS="l">140</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">141</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">142</TD><TD>                }</TD></TR><TR><TD CLASS="l">143</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">144</TD><TD>                ElementImpl element = (ElementImpl) node;</TD></TR><TR CLASS="z"><TD CLASS="l">145</TD><TD>                NamedNodeMap attributes = element.getAttributes();</TD></TR><TR CLASS="z"><TD CLASS="l">146</TD><TD>                if (attributes == null)</TD></TR><TR CLASS="z"><TD CLASS="l">147</TD><TD>                        return;</TD></TR><TR CLASS="z"><TD CLASS="l">148</TD><TD>                int length = attributes.getLength();</TD></TR><TR CLASS="z"><TD CLASS="l">149</TD><TD>                for (int i = 0; i &lt; length; i++) {</TD></TR><TR CLASS="z"><TD CLASS="l">150</TD><TD>                        AttrImpl attr = (AttrImpl) attributes.item(i);</TD></TR><TR CLASS="z"><TD CLASS="l">151</TD><TD>                        if (attr == null)</TD></TR><TR CLASS="z"><TD CLASS="l">152</TD><TD>                                continue;</TD></TR><TR CLASS="z"><TD CLASS="l">153</TD><TD>                        if (attr.getNameRegion() != region)</TD></TR><TR CLASS="z"><TD CLASS="l">154</TD><TD>                                continue;</TD></TR><TR><TD CLASS="l">155</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">156</TD><TD>                        String name = flatNode.getText(region);</TD></TR><TR CLASS="z"><TD CLASS="l">157</TD><TD>                        attr.setName(name);</TD></TR><TR CLASS="z"><TD CLASS="l">158</TD><TD>                        break;</TD></TR><TR><TD CLASS="l">159</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">160</TD><TD>        }</TD></TR><TR><TD CLASS="l">161</TD><TD> </TD></TR><TR><TD CLASS="l">162</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="5">163</A></TD><TD>         * changeAttrValue method</TD></TR><TR><TD CLASS="l">164</TD><TD>         * </TD></TR><TR><TD CLASS="l">165</TD><TD>         */</TD></TR><TR><TD CLASS="l">166</TD><TD>        private void changeAttrValue(IStructuredDocumentRegion flatNode, ITextRegion region) {</TD></TR><TR CLASS="z"><TD CLASS="l">167</TD><TD>                int offset = flatNode.getStart();</TD></TR><TR CLASS="z"><TD CLASS="l">168</TD><TD>                if (offset &lt; 0)</TD></TR><TR CLASS="z"><TD CLASS="l">169</TD><TD>                        return;</TD></TR><TR CLASS="z"><TD CLASS="l">170</TD><TD>                NodeImpl root = (NodeImpl) this.context.getRootNode();</TD></TR><TR CLASS="z"><TD CLASS="l">171</TD><TD>                if (root == null)</TD></TR><TR CLASS="z"><TD CLASS="l">172</TD><TD>                        return;</TD></TR><TR CLASS="z"><TD CLASS="l">173</TD><TD>                Node node = root.getNodeAt(offset);</TD></TR><TR CLASS="z"><TD CLASS="l">174</TD><TD>                if (node == null)</TD></TR><TR CLASS="z"><TD CLASS="l">175</TD><TD>                        return;</TD></TR><TR CLASS="z"><TD CLASS="l">176</TD><TD>                if (node.getNodeType() != Node.ELEMENT_NODE) {</TD></TR><TR CLASS="z"><TD CLASS="l">177</TD><TD>                        if (node.getNodeType() == Node.PROCESSING_INSTRUCTION_NODE) {</TD></TR><TR><TD CLASS="l">178</TD><TD>                                // just notify the change instead of setting data</TD></TR><TR CLASS="z"><TD CLASS="l">179</TD><TD>                                ProcessingInstructionImpl pi = (ProcessingInstructionImpl) node;</TD></TR><TR CLASS="z"><TD CLASS="l">180</TD><TD>                                pi.notifyValueChanged();</TD></TR><TR><TD CLASS="l">181</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">182</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">183</TD><TD>                }</TD></TR><TR><TD CLASS="l">184</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">185</TD><TD>                ElementImpl element = (ElementImpl) node;</TD></TR><TR CLASS="z"><TD CLASS="l">186</TD><TD>                NamedNodeMap attributes = element.getAttributes();</TD></TR><TR CLASS="z"><TD CLASS="l">187</TD><TD>                if (attributes == null)</TD></TR><TR CLASS="z"><TD CLASS="l">188</TD><TD>                        return;</TD></TR><TR CLASS="z"><TD CLASS="l">189</TD><TD>                int length = attributes.getLength();</TD></TR><TR CLASS="z"><TD CLASS="l">190</TD><TD>                for (int i = 0; i &lt; length; i++) {</TD></TR><TR CLASS="z"><TD CLASS="l">191</TD><TD>                        AttrImpl attr = (AttrImpl) attributes.item(i);</TD></TR><TR CLASS="z"><TD CLASS="l">192</TD><TD>                        if (attr == null)</TD></TR><TR CLASS="z"><TD CLASS="l">193</TD><TD>                                continue;</TD></TR><TR CLASS="z"><TD CLASS="l">194</TD><TD>                        if (attr.getValueRegion() != region)</TD></TR><TR CLASS="z"><TD CLASS="l">195</TD><TD>                                continue;</TD></TR><TR><TD CLASS="l">196</TD><TD>                        // just notify the change instead of setting value</TD></TR><TR CLASS="z"><TD CLASS="l">197</TD><TD>                        attr.notifyValueChanged();</TD></TR><TR CLASS="z"><TD CLASS="l">198</TD><TD>                        break;</TD></TR><TR><TD CLASS="l">199</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">200</TD><TD>        }</TD></TR><TR><TD CLASS="l">201</TD><TD> </TD></TR><TR><TD CLASS="l">202</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="6">203</A></TD><TD>         * changeData method</TD></TR><TR><TD CLASS="l">204</TD><TD>         * </TD></TR><TR><TD CLASS="l">205</TD><TD>         */</TD></TR><TR><TD CLASS="l">206</TD><TD>        private void changeData(IStructuredDocumentRegion flatNode, ITextRegion region) {</TD></TR><TR CLASS="z"><TD CLASS="l">207</TD><TD>                int offset = flatNode.getStart();</TD></TR><TR CLASS="z"><TD CLASS="l">208</TD><TD>                if (offset &lt; 0)</TD></TR><TR CLASS="z"><TD CLASS="l">209</TD><TD>                        return;</TD></TR><TR CLASS="z"><TD CLASS="l">210</TD><TD>                NodeImpl root = (NodeImpl) this.context.getRootNode();</TD></TR><TR CLASS="z"><TD CLASS="l">211</TD><TD>                if (root == null)</TD></TR><TR CLASS="z"><TD CLASS="l">212</TD><TD>                        return;</TD></TR><TR CLASS="z"><TD CLASS="l">213</TD><TD>                Node node = root.getNodeAt(offset);</TD></TR><TR CLASS="z"><TD CLASS="l">214</TD><TD>                if (node == null)</TD></TR><TR CLASS="z"><TD CLASS="l">215</TD><TD>                        return;</TD></TR><TR CLASS="z"><TD CLASS="l">216</TD><TD>                switch (node.getNodeType()) {</TD></TR><TR><TD CLASS="l">217</TD><TD>                        case Node.TEXT_NODE : {</TD></TR><TR CLASS="z"><TD CLASS="l">218</TD><TD>                                TextImpl text = (TextImpl) node;</TD></TR><TR CLASS="z"><TD CLASS="l">219</TD><TD>                                if (text.isSharingStructuredDocumentRegion(flatNode)) {</TD></TR><TR><TD CLASS="l">220</TD><TD>                                        // has consecutive text sharing IStructuredDocumentRegion</TD></TR><TR CLASS="z"><TD CLASS="l">221</TD><TD>                                        changeStructuredDocumentRegion(flatNode);</TD></TR><TR CLASS="z"><TD CLASS="l">222</TD><TD>                                        return;</TD></TR><TR><TD CLASS="l">223</TD><TD>                                }</TD></TR><TR CLASS="z"><TD CLASS="l">224</TD><TD>                                this.context.setNextNode(node);</TD></TR><TR CLASS="z"><TD CLASS="l">225</TD><TD>                                cleanupText();</TD></TR><TR CLASS="z"><TD CLASS="l">226</TD><TD>                                break;</TD></TR><TR><TD CLASS="l">227</TD><TD>                        }</TD></TR><TR><TD CLASS="l">228</TD><TD>                        case Node.CDATA_SECTION_NODE :</TD></TR><TR><TD CLASS="l">229</TD><TD>                        case Node.PROCESSING_INSTRUCTION_NODE :</TD></TR><TR CLASS="z"><TD CLASS="l">230</TD><TD>                                break;</TD></TR><TR><TD CLASS="l">231</TD><TD>                        case Node.COMMENT_NODE :</TD></TR><TR><TD CLASS="l">232</TD><TD>                        case Node.ELEMENT_NODE :</TD></TR><TR><TD CLASS="l">233</TD><TD>                                // comment tag</TD></TR><TR CLASS="z"><TD CLASS="l">234</TD><TD>                                changeStructuredDocumentRegion(flatNode);</TD></TR><TR CLASS="z"><TD CLASS="l">235</TD><TD>                                return;</TD></TR><TR><TD CLASS="l">236</TD><TD>                        default :</TD></TR><TR CLASS="z"><TD CLASS="l">237</TD><TD>                                return;</TD></TR><TR><TD CLASS="l">238</TD><TD>                }</TD></TR><TR><TD CLASS="l">239</TD><TD> </TD></TR><TR><TD CLASS="l">240</TD><TD>                // just notify the change instead of setting data</TD></TR><TR CLASS="z"><TD CLASS="l">241</TD><TD>                NodeImpl impl = (NodeImpl) node;</TD></TR><TR CLASS="z"><TD CLASS="l">242</TD><TD>                impl.notifyValueChanged();</TD></TR><TR CLASS="z"><TD CLASS="l">243</TD><TD>        }</TD></TR><TR><TD CLASS="l"><A NAME="7">244</A></TD><TD> </TD></TR><TR><TD CLASS="l">245</TD><TD>        /**</TD></TR><TR><TD CLASS="l">246</TD><TD>         */</TD></TR><TR><TD CLASS="l">247</TD><TD>        private void changeEndTag(IStructuredDocumentRegion flatNode, ITextRegionList newRegions, ITextRegionList oldRegions) {</TD></TR><TR CLASS="z"><TD CLASS="l">248</TD><TD>                int offset = flatNode.getStart();</TD></TR><TR CLASS="z"><TD CLASS="l">249</TD><TD>                if (offset &lt; 0)</TD></TR><TR CLASS="z"><TD CLASS="l">250</TD><TD>                        return; // error</TD></TR><TR CLASS="z"><TD CLASS="l">251</TD><TD>                NodeImpl root = (NodeImpl) this.context.getRootNode();</TD></TR><TR CLASS="z"><TD CLASS="l">252</TD><TD>                if (root == null)</TD></TR><TR CLASS="z"><TD CLASS="l">253</TD><TD>                        return; // error</TD></TR><TR CLASS="z"><TD CLASS="l">254</TD><TD>                Node node = root.getNodeAt(offset);</TD></TR><TR CLASS="z"><TD CLASS="l">255</TD><TD>                if (node == null)</TD></TR><TR CLASS="z"><TD CLASS="l">256</TD><TD>                        return; // error</TD></TR><TR><TD CLASS="l">257</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">258</TD><TD>                if (node.getNodeType() != Node.ELEMENT_NODE) {</TD></TR><TR CLASS="z"><TD CLASS="l">259</TD><TD>                        changeStructuredDocumentRegion(flatNode);</TD></TR><TR CLASS="z"><TD CLASS="l">260</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">261</TD><TD>                }</TD></TR><TR><TD CLASS="l">262</TD><TD> </TD></TR><TR><TD CLASS="l">263</TD><TD>                // check if change is only for close tag</TD></TR><TR CLASS="z"><TD CLASS="l">264</TD><TD>                if (newRegions != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">265</TD><TD>                        Iterator e = newRegions.iterator();</TD></TR><TR CLASS="z"><TD CLASS="l">266</TD><TD>                        while (e.hasNext()) {</TD></TR><TR CLASS="z"><TD CLASS="l">267</TD><TD>                                ITextRegion region = (ITextRegion) e.next();</TD></TR><TR CLASS="z"><TD CLASS="l">268</TD><TD>                                String regionType = region.getType();</TD></TR><TR CLASS="z"><TD CLASS="l">269</TD><TD>                                if (regionType == DOMRegionContext.XML_TAG_CLOSE)</TD></TR><TR CLASS="z"><TD CLASS="l">270</TD><TD>                                        continue;</TD></TR><TR><TD CLASS="l">271</TD><TD> </TD></TR><TR><TD CLASS="l">272</TD><TD>                                // other region has changed</TD></TR><TR CLASS="z"><TD CLASS="l">273</TD><TD>                                changeStructuredDocumentRegion(flatNode);</TD></TR><TR CLASS="z"><TD CLASS="l">274</TD><TD>                                return;</TD></TR><TR><TD CLASS="l">275</TD><TD>                        }</TD></TR><TR><TD CLASS="l">276</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">277</TD><TD>                if (oldRegions != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">278</TD><TD>                        Iterator e = oldRegions.iterator();</TD></TR><TR CLASS="z"><TD CLASS="l">279</TD><TD>                        while (e.hasNext()) {</TD></TR><TR CLASS="z"><TD CLASS="l">280</TD><TD>                                ITextRegion region = (ITextRegion) e.next();</TD></TR><TR CLASS="z"><TD CLASS="l">281</TD><TD>                                String regionType = region.getType();</TD></TR><TR CLASS="z"><TD CLASS="l">282</TD><TD>                                if (regionType == DOMRegionContext.XML_TAG_CLOSE)</TD></TR><TR CLASS="z"><TD CLASS="l">283</TD><TD>                                        continue;</TD></TR><TR><TD CLASS="l">284</TD><TD> </TD></TR><TR><TD CLASS="l">285</TD><TD>                                // other region has changed</TD></TR><TR CLASS="z"><TD CLASS="l">286</TD><TD>                                changeStructuredDocumentRegion(flatNode);</TD></TR><TR CLASS="z"><TD CLASS="l">287</TD><TD>                                return;</TD></TR><TR><TD CLASS="l">288</TD><TD>                        }</TD></TR><TR><TD CLASS="l">289</TD><TD>                }</TD></TR><TR><TD CLASS="l">290</TD><TD> </TD></TR><TR><TD CLASS="l">291</TD><TD>                // change for close tag has no impact</TD></TR><TR><TD CLASS="l">292</TD><TD>                // do nothing</TD></TR><TR CLASS="z"><TD CLASS="l">293</TD><TD>        }</TD></TR><TR><TD CLASS="l">294</TD><TD> </TD></TR><TR><TD CLASS="l">295</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="8">296</A></TD><TD>         * changeRegion method</TD></TR><TR><TD CLASS="l">297</TD><TD>         * </TD></TR><TR><TD CLASS="l">298</TD><TD>         */</TD></TR><TR><TD CLASS="l">299</TD><TD>        void changeRegion(IStructuredDocumentRegion flatNode, ITextRegion region) {</TD></TR><TR CLASS="z"><TD CLASS="l">300</TD><TD>                if (flatNode == null || region == null)</TD></TR><TR CLASS="z"><TD CLASS="l">301</TD><TD>                        return;</TD></TR><TR CLASS="z"><TD CLASS="l">302</TD><TD>                if (this.model.getDocument() == null)</TD></TR><TR CLASS="z"><TD CLASS="l">303</TD><TD>                        return;</TD></TR><TR CLASS="z"><TD CLASS="l">304</TD><TD>                this.context = new XMLModelContext(this.model.getDocument());</TD></TR><TR><TD CLASS="l">305</TD><TD> </TD></TR><TR><TD CLASS="l">306</TD><TD>                // optimize typical cases</TD></TR><TR CLASS="z"><TD CLASS="l">307</TD><TD>                String regionType = region.getType();</TD></TR><TR CLASS="z"><TD CLASS="l">308</TD><TD>                if (regionType == DOMRegionContext.XML_CONTENT || regionType == DOMRegionContext.XML_COMMENT_TEXT || regionType == DOMRegionContext.XML_CDATA_TEXT || regionType == DOMRegionContext.BLOCK_TEXT || isNestedContent(regionType)) {</TD></TR><TR CLASS="z"><TD CLASS="l">309</TD><TD>                        changeData(flatNode, region);</TD></TR><TR><TD CLASS="l">310</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">311</TD><TD>                else if (regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME) {</TD></TR><TR CLASS="z"><TD CLASS="l">312</TD><TD>                        changeAttrName(flatNode, region);</TD></TR><TR><TD CLASS="l">313</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">314</TD><TD>                else if (regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE) {</TD></TR><TR CLASS="z"><TD CLASS="l">315</TD><TD>                        changeAttrValue(flatNode, region);</TD></TR><TR><TD CLASS="l">316</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">317</TD><TD>                else if (regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS) {</TD></TR><TR CLASS="z"><TD CLASS="l">318</TD><TD>                        changeAttrEqual(flatNode, region);</TD></TR><TR><TD CLASS="l">319</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">320</TD><TD>                else if (regionType == DOMRegionContext.XML_TAG_NAME || isNestedTagName(regionType)) {</TD></TR><TR CLASS="z"><TD CLASS="l">321</TD><TD>                        changeTagName(flatNode, region);</TD></TR><TR><TD CLASS="l">322</TD><TD>                }</TD></TR><TR><TD CLASS="l">323</TD><TD>                else {</TD></TR><TR CLASS="z"><TD CLASS="l">324</TD><TD>                        changeStructuredDocumentRegion(flatNode);</TD></TR><TR><TD CLASS="l">325</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">326</TD><TD>        }</TD></TR><TR><TD CLASS="l">327</TD><TD> </TD></TR><TR><TD CLASS="l">328</TD><TD> </TD></TR><TR><TD CLASS="l"><A NAME="9">329</A></TD><TD> </TD></TR><TR><TD CLASS="l">330</TD><TD>        /**</TD></TR><TR><TD CLASS="l">331</TD><TD>         */</TD></TR><TR><TD CLASS="l">332</TD><TD>        private void changeStartTag(IStructuredDocumentRegion flatNode, ITextRegionList newRegions, ITextRegionList oldRegions) {</TD></TR><TR CLASS="z"><TD CLASS="l">333</TD><TD>                int offset = flatNode.getStart();</TD></TR><TR CLASS="z"><TD CLASS="l">334</TD><TD>                if (offset &lt; 0)</TD></TR><TR CLASS="z"><TD CLASS="l">335</TD><TD>                        return; // error</TD></TR><TR CLASS="z"><TD CLASS="l">336</TD><TD>                NodeImpl root = (NodeImpl) this.context.getRootNode();</TD></TR><TR CLASS="z"><TD CLASS="l">337</TD><TD>                if (root == null)</TD></TR><TR CLASS="z"><TD CLASS="l">338</TD><TD>                        return; // error</TD></TR><TR CLASS="z"><TD CLASS="l">339</TD><TD>                Node node = root.getNodeAt(offset);</TD></TR><TR CLASS="z"><TD CLASS="l">340</TD><TD>                if (node == null)</TD></TR><TR CLASS="z"><TD CLASS="l">341</TD><TD>                        return; // error</TD></TR><TR><TD CLASS="l">342</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">343</TD><TD>                if (node.getNodeType() != Node.ELEMENT_NODE) {</TD></TR><TR CLASS="z"><TD CLASS="l">344</TD><TD>                        changeStructuredDocumentRegion(flatNode);</TD></TR><TR CLASS="z"><TD CLASS="l">345</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">346</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">347</TD><TD>                ElementImpl element = (ElementImpl) node;</TD></TR><TR><TD CLASS="l">348</TD><TD> </TD></TR><TR><TD CLASS="l">349</TD><TD>                // check if changes are only for attributes and close tag</TD></TR><TR CLASS="z"><TD CLASS="l">350</TD><TD>                boolean tagNameUnchanged = false;</TD></TR><TR CLASS="z"><TD CLASS="l">351</TD><TD>                if (newRegions != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">352</TD><TD>                        Iterator e = newRegions.iterator();</TD></TR><TR CLASS="z"><TD CLASS="l">353</TD><TD>                        while (e.hasNext()) {</TD></TR><TR CLASS="z"><TD CLASS="l">354</TD><TD>                                ITextRegion region = (ITextRegion) e.next();</TD></TR><TR CLASS="z"><TD CLASS="l">355</TD><TD>                                String regionType = region.getType();</TD></TR><TR CLASS="z"><TD CLASS="l">356</TD><TD>                                if (regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME || regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS || regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE)</TD></TR><TR CLASS="z"><TD CLASS="l">357</TD><TD>                                        continue;</TD></TR><TR CLASS="z"><TD CLASS="l">358</TD><TD>                                if (regionType == DOMRegionContext.XML_TAG_CLOSE) {</TD></TR><TR><TD CLASS="l">359</TD><TD>                                        // change from empty tag may have impact on structure</TD></TR><TR CLASS="z"><TD CLASS="l">360</TD><TD>                                        if (!element.isEmptyTag())</TD></TR><TR CLASS="z"><TD CLASS="l">361</TD><TD>                                                continue;</TD></TR><TR><TD CLASS="l">362</TD><TD>                                }</TD></TR><TR CLASS="z"><TD CLASS="l">363</TD><TD>                                else if (regionType == DOMRegionContext.XML_TAG_NAME || isNestedTagName(regionType)) {</TD></TR><TR CLASS="z"><TD CLASS="l">364</TD><TD>                                        String oldTagName = element.getTagName();</TD></TR><TR CLASS="z"><TD CLASS="l">365</TD><TD>                                        String newTagName = flatNode.getText(region);</TD></TR><TR CLASS="z"><TD CLASS="l">366</TD><TD>                                        if (oldTagName != null &amp;&amp; newTagName != null &amp;&amp; oldTagName.equals(newTagName)) {</TD></TR><TR><TD CLASS="l">367</TD><TD>                                                // the tag name is unchanged</TD></TR><TR CLASS="z"><TD CLASS="l">368</TD><TD>                                                tagNameUnchanged = true;</TD></TR><TR CLASS="z"><TD CLASS="l">369</TD><TD>                                                continue;</TD></TR><TR><TD CLASS="l">370</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">371</TD><TD>                                }</TD></TR><TR><TD CLASS="l">372</TD><TD> </TD></TR><TR><TD CLASS="l">373</TD><TD>                                // other region has changed</TD></TR><TR CLASS="z"><TD CLASS="l">374</TD><TD>                                changeStructuredDocumentRegion(flatNode);</TD></TR><TR CLASS="z"><TD CLASS="l">375</TD><TD>                                return;</TD></TR><TR><TD CLASS="l">376</TD><TD>                        }</TD></TR><TR><TD CLASS="l">377</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">378</TD><TD>                if (oldRegions != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">379</TD><TD>                        Iterator e = oldRegions.iterator();</TD></TR><TR CLASS="z"><TD CLASS="l">380</TD><TD>                        while (e.hasNext()) {</TD></TR><TR CLASS="z"><TD CLASS="l">381</TD><TD>                                ITextRegion region = (ITextRegion) e.next();</TD></TR><TR CLASS="z"><TD CLASS="l">382</TD><TD>                                String regionType = region.getType();</TD></TR><TR CLASS="z"><TD CLASS="l">383</TD><TD>                                if (regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME || regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS || regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE)</TD></TR><TR CLASS="z"><TD CLASS="l">384</TD><TD>                                        continue;</TD></TR><TR CLASS="z"><TD CLASS="l">385</TD><TD>                                if (regionType == DOMRegionContext.XML_TAG_CLOSE) {</TD></TR><TR><TD CLASS="l">386</TD><TD>                                        // change from empty tag may have impact on structure</TD></TR><TR CLASS="z"><TD CLASS="l">387</TD><TD>                                        if (!element.isEmptyTag())</TD></TR><TR CLASS="z"><TD CLASS="l">388</TD><TD>                                                continue;</TD></TR><TR><TD CLASS="l">389</TD><TD>                                }</TD></TR><TR CLASS="z"><TD CLASS="l">390</TD><TD>                                else if (regionType == DOMRegionContext.XML_TAG_NAME || isNestedTagName(regionType)) {</TD></TR><TR><TD CLASS="l">391</TD><TD>                                        // if new tag name is unchanged, it's OK</TD></TR><TR CLASS="z"><TD CLASS="l">392</TD><TD>                                        if (tagNameUnchanged)</TD></TR><TR CLASS="z"><TD CLASS="l">393</TD><TD>                                                continue;</TD></TR><TR><TD CLASS="l">394</TD><TD>                                }</TD></TR><TR><TD CLASS="l">395</TD><TD> </TD></TR><TR><TD CLASS="l">396</TD><TD>                                // other region has changed</TD></TR><TR CLASS="z"><TD CLASS="l">397</TD><TD>                                changeStructuredDocumentRegion(flatNode);</TD></TR><TR CLASS="z"><TD CLASS="l">398</TD><TD>                                return;</TD></TR><TR><TD CLASS="l">399</TD><TD>                        }</TD></TR><TR><TD CLASS="l">400</TD><TD>                }</TD></TR><TR><TD CLASS="l">401</TD><TD> </TD></TR><TR><TD CLASS="l">402</TD><TD>                // update attributes</TD></TR><TR CLASS="z"><TD CLASS="l">403</TD><TD>                ITextRegionList regions = flatNode.getRegions();</TD></TR><TR CLASS="z"><TD CLASS="l">404</TD><TD>                if (regions == null)</TD></TR><TR CLASS="z"><TD CLASS="l">405</TD><TD>                        return; // error</TD></TR><TR CLASS="z"><TD CLASS="l">406</TD><TD>                NamedNodeMap attributes = element.getAttributes();</TD></TR><TR CLASS="z"><TD CLASS="l">407</TD><TD>                if (attributes == null)</TD></TR><TR CLASS="z"><TD CLASS="l">408</TD><TD>                        return; // error</TD></TR><TR><TD CLASS="l">409</TD><TD> </TD></TR><TR><TD CLASS="l">410</TD><TD>                // first remove attributes</TD></TR><TR CLASS="z"><TD CLASS="l">411</TD><TD>                int regionIndex = 0;</TD></TR><TR CLASS="z"><TD CLASS="l">412</TD><TD>                int attrIndex = 0;</TD></TR><TR CLASS="z"><TD CLASS="l">413</TD><TD>                AttrImpl attr = null;</TD></TR><TR CLASS="z"><TD CLASS="l">414</TD><TD>                while (attrIndex &lt; attributes.getLength()) {</TD></TR><TR CLASS="z"><TD CLASS="l">415</TD><TD>                        attr = (AttrImpl) attributes.item(attrIndex);</TD></TR><TR CLASS="z"><TD CLASS="l">416</TD><TD>                        if (attr == null) { // error</TD></TR><TR CLASS="z"><TD CLASS="l">417</TD><TD>                                attrIndex++;</TD></TR><TR CLASS="z"><TD CLASS="l">418</TD><TD>                                continue;</TD></TR><TR><TD CLASS="l">419</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">420</TD><TD>                        ITextRegion nameRegion = attr.getNameRegion();</TD></TR><TR CLASS="z"><TD CLASS="l">421</TD><TD>                        if (nameRegion == null) { // error</TD></TR><TR CLASS="z"><TD CLASS="l">422</TD><TD>                                element.removeAttributeNode(attr);</TD></TR><TR CLASS="z"><TD CLASS="l">423</TD><TD>                                continue;</TD></TR><TR><TD CLASS="l">424</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">425</TD><TD>                        boolean found = false;</TD></TR><TR CLASS="z"><TD CLASS="l">426</TD><TD>                        for (int i = regionIndex; i &lt; regions.size(); i++) {</TD></TR><TR CLASS="z"><TD CLASS="l">427</TD><TD>                                ITextRegion region = regions.get(i);</TD></TR><TR CLASS="z"><TD CLASS="l">428</TD><TD>                                if (region == nameRegion) {</TD></TR><TR CLASS="z"><TD CLASS="l">429</TD><TD>                                        regionIndex = i + 1; // next region</TD></TR><TR CLASS="z"><TD CLASS="l">430</TD><TD>                                        found = true;</TD></TR><TR CLASS="z"><TD CLASS="l">431</TD><TD>                                        break;</TD></TR><TR><TD CLASS="l">432</TD><TD>                                }</TD></TR><TR><TD CLASS="l">433</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">434</TD><TD>                        if (found) {</TD></TR><TR CLASS="z"><TD CLASS="l">435</TD><TD>                                attrIndex++;</TD></TR><TR><TD CLASS="l">436</TD><TD>                        }</TD></TR><TR><TD CLASS="l">437</TD><TD>                        else {</TD></TR><TR CLASS="z"><TD CLASS="l">438</TD><TD>                                element.removeAttributeNode(attr);</TD></TR><TR><TD CLASS="l">439</TD><TD>                        }</TD></TR><TR><TD CLASS="l">440</TD><TD>                }</TD></TR><TR><TD CLASS="l">441</TD><TD> </TD></TR><TR><TD CLASS="l">442</TD><TD>                // insert or update attributes</TD></TR><TR CLASS="z"><TD CLASS="l">443</TD><TD>                attrIndex = 0; // reset to first</TD></TR><TR CLASS="z"><TD CLASS="l">444</TD><TD>                AttrImpl newAttr = null;</TD></TR><TR CLASS="z"><TD CLASS="l">445</TD><TD>                ITextRegion oldValueRegion = null;</TD></TR><TR CLASS="z"><TD CLASS="l">446</TD><TD>                Iterator e = regions.iterator();</TD></TR><TR CLASS="z"><TD CLASS="l">447</TD><TD>                while (e.hasNext()) {</TD></TR><TR CLASS="z"><TD CLASS="l">448</TD><TD>                        ITextRegion region = (ITextRegion) e.next();</TD></TR><TR CLASS="z"><TD CLASS="l">449</TD><TD>                        String regionType = region.getType();</TD></TR><TR CLASS="z"><TD CLASS="l">450</TD><TD>                        if (regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME) {</TD></TR><TR CLASS="z"><TD CLASS="l">451</TD><TD>                                if (newAttr != null) {</TD></TR><TR><TD CLASS="l">452</TD><TD>                                        // insert deferred new attribute</TD></TR><TR CLASS="z"><TD CLASS="l">453</TD><TD>                                        element.insertAttributeNode(newAttr, attrIndex++);</TD></TR><TR CLASS="z"><TD CLASS="l">454</TD><TD>                                        newAttr = null;</TD></TR><TR><TD CLASS="l">455</TD><TD>                                }</TD></TR><TR CLASS="z"><TD CLASS="l">456</TD><TD>                                else if (attr != null &amp;&amp; oldValueRegion != null) {</TD></TR><TR><TD CLASS="l">457</TD><TD>                                        // notify existing attribute value removal</TD></TR><TR CLASS="z"><TD CLASS="l">458</TD><TD>                                        attr.notifyValueChanged();</TD></TR><TR><TD CLASS="l">459</TD><TD>                                }</TD></TR><TR><TD CLASS="l">460</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">461</TD><TD>                                oldValueRegion = null;</TD></TR><TR CLASS="z"><TD CLASS="l">462</TD><TD>                                attr = (AttrImpl) attributes.item(attrIndex);</TD></TR><TR CLASS="z"><TD CLASS="l">463</TD><TD>                                if (attr != null &amp;&amp; attr.getNameRegion() == region) {</TD></TR><TR><TD CLASS="l">464</TD><TD>                                        // existing attribute</TD></TR><TR CLASS="z"><TD CLASS="l">465</TD><TD>                                        attrIndex++;</TD></TR><TR><TD CLASS="l">466</TD><TD>                                        // clear other regions</TD></TR><TR CLASS="z"><TD CLASS="l">467</TD><TD>                                        oldValueRegion = attr.getValueRegion();</TD></TR><TR CLASS="z"><TD CLASS="l">468</TD><TD>                                        attr.setEqualRegion(null);</TD></TR><TR CLASS="z"><TD CLASS="l">469</TD><TD>                                        attr.setValueRegion(null);</TD></TR><TR><TD CLASS="l">470</TD><TD>                                }</TD></TR><TR><TD CLASS="l">471</TD><TD>                                else {</TD></TR><TR CLASS="z"><TD CLASS="l">472</TD><TD>                                        String name = flatNode.getText(region);</TD></TR><TR CLASS="z"><TD CLASS="l">473</TD><TD>                                        attr = (AttrImpl) this.model.getDocument().createAttribute(name);</TD></TR><TR CLASS="z"><TD CLASS="l">474</TD><TD>                                        if (attr != null)</TD></TR><TR CLASS="z"><TD CLASS="l">475</TD><TD>                                                attr.setNameRegion(region);</TD></TR><TR><TD CLASS="l">476</TD><TD>                                        // defer insertion of new attribute</TD></TR><TR CLASS="z"><TD CLASS="l">477</TD><TD>                                        newAttr = attr;</TD></TR><TR><TD CLASS="l">478</TD><TD>                                }</TD></TR><TR><TD CLASS="l">479</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">480</TD><TD>                        else if (regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS) {</TD></TR><TR CLASS="z"><TD CLASS="l">481</TD><TD>                                if (attr != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">482</TD><TD>                                        attr.setEqualRegion(region);</TD></TR><TR><TD CLASS="l">483</TD><TD>                                }</TD></TR><TR><TD CLASS="l">484</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">485</TD><TD>                        else if (regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE) {</TD></TR><TR CLASS="z"><TD CLASS="l">486</TD><TD>                                if (attr != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">487</TD><TD>                                        attr.setValueRegion(region);</TD></TR><TR CLASS="z"><TD CLASS="l">488</TD><TD>                                        if (attr != newAttr &amp;&amp; oldValueRegion != region) {</TD></TR><TR><TD CLASS="l">489</TD><TD>                                                // notify existing attribute value changed</TD></TR><TR CLASS="z"><TD CLASS="l">490</TD><TD>                                                attr.notifyValueChanged();</TD></TR><TR><TD CLASS="l">491</TD><TD>                                        }</TD></TR><TR CLASS="z"><TD CLASS="l">492</TD><TD>                                        oldValueRegion = null;</TD></TR><TR CLASS="z"><TD CLASS="l">493</TD><TD>                                        attr = null;</TD></TR><TR><TD CLASS="l">494</TD><TD>                                }</TD></TR><TR><TD CLASS="l">495</TD><TD>                        }</TD></TR><TR><TD CLASS="l">496</TD><TD>                }</TD></TR><TR><TD CLASS="l">497</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">498</TD><TD>                if (newAttr != null) {</TD></TR><TR><TD CLASS="l">499</TD><TD>                        // insert deferred new attribute</TD></TR><TR CLASS="z"><TD CLASS="l">500</TD><TD>                        element.appendAttributeNode(newAttr);</TD></TR><TR><TD CLASS="l">501</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">502</TD><TD>                else if (attr != null &amp;&amp; oldValueRegion != null) {</TD></TR><TR><TD CLASS="l">503</TD><TD>                        // notify existing attribute value removal</TD></TR><TR CLASS="z"><TD CLASS="l">504</TD><TD>                        attr.notifyValueChanged();</TD></TR><TR><TD CLASS="l">505</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">506</TD><TD>        }</TD></TR><TR><TD CLASS="l">507</TD><TD> </TD></TR><TR><TD CLASS="l">508</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="a">509</A></TD><TD>         * changeStructuredDocumentRegion method</TD></TR><TR><TD CLASS="l">510</TD><TD>         * </TD></TR><TR><TD CLASS="l">511</TD><TD>         */</TD></TR><TR><TD CLASS="l">512</TD><TD>        private void changeStructuredDocumentRegion(IStructuredDocumentRegion flatNode) {</TD></TR><TR CLASS="z"><TD CLASS="l">513</TD><TD>                if (flatNode == null)</TD></TR><TR CLASS="z"><TD CLASS="l">514</TD><TD>                        return;</TD></TR><TR CLASS="z"><TD CLASS="l">515</TD><TD>                if (this.model.getDocument() == null)</TD></TR><TR CLASS="z"><TD CLASS="l">516</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">517</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">518</TD><TD>                setupContext(flatNode);</TD></TR><TR><TD CLASS="l">519</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">520</TD><TD>                removeStructuredDocumentRegion(flatNode);</TD></TR><TR><TD CLASS="l">521</TD><TD>                // make sure the parent is set to deepest level</TD></TR><TR><TD CLASS="l">522</TD><TD>                // when end tag has been removed</TD></TR><TR CLASS="z"><TD CLASS="l">523</TD><TD>                this.context.setLast();</TD></TR><TR CLASS="z"><TD CLASS="l">524</TD><TD>                insertStructuredDocumentRegion(flatNode);</TD></TR><TR><TD CLASS="l">525</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">526</TD><TD>                cleanupText();</TD></TR><TR CLASS="z"><TD CLASS="l">527</TD><TD>                cleanupEndTag();</TD></TR><TR CLASS="z"><TD CLASS="l">528</TD><TD>        }</TD></TR><TR><TD CLASS="l"><A NAME="b">529</A></TD><TD> </TD></TR><TR><TD CLASS="l">530</TD><TD>        /**</TD></TR><TR><TD CLASS="l">531</TD><TD>         */</TD></TR><TR><TD CLASS="l">532</TD><TD>        private void changeTagName(IStructuredDocumentRegion flatNode, ITextRegion region) {</TD></TR><TR CLASS="z"><TD CLASS="l">533</TD><TD>                int offset = flatNode.getStart();</TD></TR><TR CLASS="z"><TD CLASS="l">534</TD><TD>                if (offset &lt; 0)</TD></TR><TR CLASS="z"><TD CLASS="l">535</TD><TD>                        return; // error</TD></TR><TR CLASS="z"><TD CLASS="l">536</TD><TD>                NodeImpl root = (NodeImpl) this.context.getRootNode();</TD></TR><TR CLASS="z"><TD CLASS="l">537</TD><TD>                if (root == null)</TD></TR><TR CLASS="z"><TD CLASS="l">538</TD><TD>                        return; // error</TD></TR><TR CLASS="z"><TD CLASS="l">539</TD><TD>                Node node = root.getNodeAt(offset);</TD></TR><TR CLASS="z"><TD CLASS="l">540</TD><TD>                if (node == null)</TD></TR><TR CLASS="z"><TD CLASS="l">541</TD><TD>                        return; // error</TD></TR><TR><TD CLASS="l">542</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">543</TD><TD>                if (node.getNodeType() != Node.ELEMENT_NODE) {</TD></TR><TR CLASS="z"><TD CLASS="l">544</TD><TD>                        changeStructuredDocumentRegion(flatNode);</TD></TR><TR CLASS="z"><TD CLASS="l">545</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">546</TD><TD>                }</TD></TR><TR><TD CLASS="l">547</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">548</TD><TD>                ElementImpl element = (ElementImpl) node;</TD></TR><TR CLASS="z"><TD CLASS="l">549</TD><TD>                String newTagName = flatNode.getText(region);</TD></TR><TR CLASS="z"><TD CLASS="l">550</TD><TD>                if (newTagName == null || !element.matchTagName(newTagName)) {</TD></TR><TR><TD CLASS="l">551</TD><TD>                        // the tag name is changed</TD></TR><TR CLASS="z"><TD CLASS="l">552</TD><TD>                        changeStructuredDocumentRegion(flatNode);</TD></TR><TR CLASS="z"><TD CLASS="l">553</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">554</TD><TD>                }</TD></TR><TR><TD CLASS="l">555</TD><TD> </TD></TR><TR><TD CLASS="l">556</TD><TD>                // the tag name is unchanged</TD></TR><TR><TD CLASS="l">557</TD><TD>                // this happens when typing spaces after the tag name</TD></TR><TR><TD CLASS="l">558</TD><TD>                // do nothing, but...</TD></TR><TR><TD CLASS="l">559</TD><TD>                // if it's not a change in the end tag of an element with the start</TD></TR><TR><TD CLASS="l">560</TD><TD>                // tag,</TD></TR><TR><TD CLASS="l">561</TD><TD>                // and case has been changed, set to element and notify</TD></TR><TR CLASS="z"><TD CLASS="l">562</TD><TD>                if (!element.hasStartTag() || StructuredDocumentRegionUtil.getFirstRegionType(flatNode) != DOMRegionContext.XML_END_TAG_OPEN) {</TD></TR><TR CLASS="z"><TD CLASS="l">563</TD><TD>                        String tagName = element.getTagName();</TD></TR><TR CLASS="z"><TD CLASS="l">564</TD><TD>                        if (tagName == null || !tagName.equals(newTagName)) {</TD></TR><TR CLASS="z"><TD CLASS="l">565</TD><TD>                                element.setTagName(newTagName);</TD></TR><TR CLASS="z"><TD CLASS="l">566</TD><TD>                                element.notifyValueChanged();</TD></TR><TR><TD CLASS="l">567</TD><TD>                        }</TD></TR><TR><TD CLASS="l">568</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">569</TD><TD>        }</TD></TR><TR><TD CLASS="l">570</TD><TD> </TD></TR><TR><TD CLASS="l"><A NAME="20">571</A></TD><TD>        /**</TD></TR><TR><TD CLASS="l">572</TD><TD>         * cleanupContext method</TD></TR><TR><TD CLASS="l">573</TD><TD>         */</TD></TR><TR><TD CLASS="l">574</TD><TD>        private void cleanupEndTag() {</TD></TR><TR CLASS="c"><TD CLASS="l">575</TD><TD>                Node parent = this.context.getParentNode();</TD></TR><TR CLASS="c"><TD CLASS="l">576</TD><TD>                Node next = this.context.getNextNode();</TD></TR><TR CLASS="c"><TD CLASS="l">577</TD><TD>                while (parent != null) {</TD></TR><TR CLASS="c"><TD CLASS="l">578</TD><TD>                        while (next != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">579</TD><TD>                                if (next.getNodeType() == Node.ELEMENT_NODE) {</TD></TR><TR CLASS="z"><TD CLASS="l">580</TD><TD>                                        ElementImpl element = (ElementImpl) next;</TD></TR><TR CLASS="z"><TD CLASS="l">581</TD><TD>                                        if (element.isEndTag()) {</TD></TR><TR><TD CLASS="l">582</TD><TD>                                                // floating end tag</TD></TR><TR CLASS="z"><TD CLASS="l">583</TD><TD>                                                String tagName = element.getTagName();</TD></TR><TR CLASS="z"><TD CLASS="l">584</TD><TD>                                                String rootName = getFindRootName(tagName);</TD></TR><TR CLASS="z"><TD CLASS="l">585</TD><TD>                                                ElementImpl start = (ElementImpl) this.context.findStartTag(tagName, rootName);</TD></TR><TR CLASS="z"><TD CLASS="l">586</TD><TD>                                                if (start != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">587</TD><TD>                                                        insertEndTag(start);</TD></TR><TR><TD CLASS="l">588</TD><TD>                                                        // move the end tag from 'element' to 'start'</TD></TR><TR CLASS="z"><TD CLASS="l">589</TD><TD>                                                        start.addEndTag(element);</TD></TR><TR CLASS="z"><TD CLASS="l">590</TD><TD>                                                        removeNode(element);</TD></TR><TR CLASS="z"><TD CLASS="l">591</TD><TD>                                                        parent = this.context.getParentNode();</TD></TR><TR CLASS="z"><TD CLASS="l">592</TD><TD>                                                        next = this.context.getNextNode();</TD></TR><TR CLASS="z"><TD CLASS="l">593</TD><TD>                                                        continue;</TD></TR><TR><TD CLASS="l">594</TD><TD>                                                }</TD></TR><TR><TD CLASS="l">595</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">596</TD><TD>                                }</TD></TR><TR><TD CLASS="l">597</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">598</TD><TD>                                Node first = next.getFirstChild();</TD></TR><TR CLASS="z"><TD CLASS="l">599</TD><TD>                                if (first != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">600</TD><TD>                                        parent = next;</TD></TR><TR CLASS="z"><TD CLASS="l">601</TD><TD>                                        next = first;</TD></TR><TR CLASS="z"><TD CLASS="l">602</TD><TD>                                        this.context.setNextNode(next);</TD></TR><TR><TD CLASS="l">603</TD><TD>                                }</TD></TR><TR><TD CLASS="l">604</TD><TD>                                else {</TD></TR><TR CLASS="z"><TD CLASS="l">605</TD><TD>                                        next = next.getNextSibling();</TD></TR><TR CLASS="z"><TD CLASS="l">606</TD><TD>                                        this.context.setNextNode(next);</TD></TR><TR><TD CLASS="l">607</TD><TD>                                }</TD></TR><TR><TD CLASS="l">608</TD><TD>                        }</TD></TR><TR><TD CLASS="l">609</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">610</TD><TD>                        if (parent.getNodeType() == Node.ELEMENT_NODE) {</TD></TR><TR CLASS="z"><TD CLASS="l">611</TD><TD>                                ElementImpl element = (ElementImpl) parent;</TD></TR><TR CLASS="z"><TD CLASS="l">612</TD><TD>                                if (!element.hasEndTag() &amp;&amp; element.hasStartTag() &amp;&amp; element.getNextSibling() == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">613</TD><TD>                                        String tagName = element.getTagName();</TD></TR><TR CLASS="z"><TD CLASS="l">614</TD><TD>                                        ElementImpl end = (ElementImpl) this.context.findEndTag(tagName);</TD></TR><TR CLASS="z"><TD CLASS="l">615</TD><TD>                                        if (end != null) {</TD></TR><TR><TD CLASS="l">616</TD><TD>                                                // move the end tag from 'end' to 'element'</TD></TR><TR CLASS="z"><TD CLASS="l">617</TD><TD>                                                element.addEndTag(end);</TD></TR><TR CLASS="z"><TD CLASS="l">618</TD><TD>                                                removeEndTag(end);</TD></TR><TR CLASS="z"><TD CLASS="l">619</TD><TD>                                                this.context.setParentNode(parent); // reset context</TD></TR><TR CLASS="z"><TD CLASS="l">620</TD><TD>                                                continue;</TD></TR><TR><TD CLASS="l">621</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">622</TD><TD>                                }</TD></TR><TR><TD CLASS="l">623</TD><TD>                        }</TD></TR><TR><TD CLASS="l">624</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">625</TD><TD>                        next = parent.getNextSibling();</TD></TR><TR CLASS="c"><TD CLASS="l">626</TD><TD>                        parent = parent.getParentNode();</TD></TR><TR CLASS="c"><TD CLASS="l">627</TD><TD>                        if (next != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">628</TD><TD>                                this.context.setNextNode(next);</TD></TR><TR><TD CLASS="l">629</TD><TD>                        }</TD></TR><TR><TD CLASS="l">630</TD><TD>                        else {</TD></TR><TR CLASS="c"><TD CLASS="l">631</TD><TD>                                this.context.setParentNode(parent);</TD></TR><TR><TD CLASS="l">632</TD><TD>                        }</TD></TR><TR><TD CLASS="l">633</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">634</TD><TD>        }</TD></TR><TR><TD CLASS="l"><A NAME="23">635</A></TD><TD> </TD></TR><TR><TD CLASS="l">636</TD><TD>        /**</TD></TR><TR><TD CLASS="l">637</TD><TD>         */</TD></TR><TR><TD CLASS="l">638</TD><TD>        private void cleanupText() {</TD></TR><TR CLASS="c"><TD CLASS="l">639</TD><TD>                Node parent = this.context.getParentNode();</TD></TR><TR CLASS="c"><TD CLASS="l">640</TD><TD>                if (parent == null)</TD></TR><TR CLASS="z"><TD CLASS="l">641</TD><TD>                        return; // error</TD></TR><TR CLASS="c"><TD CLASS="l">642</TD><TD>                Node next = this.context.getNextNode();</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="89% line coverage (16 out of 18 instructions)">643</TD><TD TITLE="89% line coverage (16 out of 18 instructions)">                Node prev = (next == null ? parent.getLastChild() : next.getPreviousSibling());</TD></TR><TR><TD CLASS="l">644</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">645</TD><TD>                TextImpl nextText = null;</TD></TR><TR CLASS="c"><TD CLASS="l">646</TD><TD>                TextImpl prevText = null;</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="64% line coverage (7 out of 11 instructions)">647</TD><TD TITLE="64% line coverage (7 out of 11 instructions)">                if (next != null &amp;&amp; next.getNodeType() == Node.TEXT_NODE) {</TD></TR><TR CLASS="z"><TD CLASS="l">648</TD><TD>                        nextText = (TextImpl) next;</TD></TR><TR><TD CLASS="l">649</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">650</TD><TD>                if (prev != null &amp;&amp; prev.getNodeType() == Node.TEXT_NODE) {</TD></TR><TR CLASS="c"><TD CLASS="l">651</TD><TD>                        prevText = (TextImpl) prev;</TD></TR><TR><TD CLASS="l">652</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">653</TD><TD>                if (nextText == null &amp;&amp; prevText == null)</TD></TR><TR CLASS="c"><TD CLASS="l">654</TD><TD>                        return;</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="50% line coverage (2 out of 4 instructions)">655</TD><TD TITLE="50% line coverage (2 out of 4 instructions)">                if (nextText != null &amp;&amp; prevText != null) {</TD></TR><TR><TD CLASS="l">656</TD><TD>                        // consecutive Text nodes created by setupContext(),</TD></TR><TR><TD CLASS="l">657</TD><TD>                        // concat them</TD></TR><TR CLASS="z"><TD CLASS="l">658</TD><TD>                        IStructuredDocumentRegion flatNode = nextText.getStructuredDocumentRegion();</TD></TR><TR CLASS="z"><TD CLASS="l">659</TD><TD>                        if (flatNode != null)</TD></TR><TR CLASS="z"><TD CLASS="l">660</TD><TD>                                prevText.appendStructuredDocumentRegion(flatNode);</TD></TR><TR CLASS="z"><TD CLASS="l">661</TD><TD>                        Node newNext = next.getNextSibling();</TD></TR><TR CLASS="z"><TD CLASS="l">662</TD><TD>                        parent.removeChild(next);</TD></TR><TR CLASS="z"><TD CLASS="l">663</TD><TD>                        next = null;</TD></TR><TR CLASS="z"><TD CLASS="l">664</TD><TD>                        this.context.setNextNode(newNext);</TD></TR><TR><TD CLASS="l">665</TD><TD>                }</TD></TR><TR><TD CLASS="l">666</TD><TD> </TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="89% line coverage (8 out of 9 instructions)">667</TD><TD TITLE="89% line coverage (8 out of 9 instructions)">                TextImpl childText = (prevText != null ? prevText : nextText);</TD></TR><TR CLASS="c"><TD CLASS="l">668</TD><TD>                if (childText.getNextSibling() == null &amp;&amp; childText.getPreviousSibling() == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">669</TD><TD>                        if (parent.getNodeType() == Node.ELEMENT_NODE) {</TD></TR><TR CLASS="z"><TD CLASS="l">670</TD><TD>                                ElementImpl parentElement = (ElementImpl) parent;</TD></TR><TR CLASS="z"><TD CLASS="l">671</TD><TD>                                if (!parentElement.hasStartTag() &amp;&amp; !parentElement.hasEndTag()) {</TD></TR><TR CLASS="z"><TD CLASS="l">672</TD><TD>                                        if (childText.isWhitespace() || childText.isInvalid()) {</TD></TR><TR><TD CLASS="l">673</TD><TD>                                                // implicit parent is not required</TD></TR><TR CLASS="z"><TD CLASS="l">674</TD><TD>                                                Node newParent = parent.getParentNode();</TD></TR><TR CLASS="z"><TD CLASS="l">675</TD><TD>                                                if (newParent != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">676</TD><TD>                                                        Node newNext = parent.getNextSibling();</TD></TR><TR CLASS="z"><TD CLASS="l">677</TD><TD>                                                        newParent.removeChild(parent);</TD></TR><TR CLASS="z"><TD CLASS="l">678</TD><TD>                                                        parent.removeChild(childText);</TD></TR><TR CLASS="z"><TD CLASS="l">679</TD><TD>                                                        newParent.insertBefore(childText, newNext);</TD></TR><TR CLASS="z"><TD CLASS="l">680</TD><TD>                                                        if (childText == next) {</TD></TR><TR CLASS="z"><TD CLASS="l">681</TD><TD>                                                                this.context.setNextNode(childText);</TD></TR><TR><TD CLASS="l">682</TD><TD>                                                        }</TD></TR><TR CLASS="z"><TD CLASS="l">683</TD><TD>                                                        else if (newNext != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">684</TD><TD>                                                                this.context.setNextNode(newNext);</TD></TR><TR><TD CLASS="l">685</TD><TD>                                                        }</TD></TR><TR><TD CLASS="l">686</TD><TD>                                                        else {</TD></TR><TR CLASS="z"><TD CLASS="l">687</TD><TD>                                                                this.context.setParentNode(newParent);</TD></TR><TR><TD CLASS="l">688</TD><TD>                                                        }</TD></TR><TR><TD CLASS="l">689</TD><TD>                                                        // try again</TD></TR><TR CLASS="z"><TD CLASS="l">690</TD><TD>                                                        cleanupText();</TD></TR><TR><TD CLASS="l">691</TD><TD>                                                }</TD></TR><TR><TD CLASS="l">692</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">693</TD><TD>                                }</TD></TR><TR><TD CLASS="l">694</TD><TD>                        }</TD></TR><TR><TD CLASS="l">695</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">696</TD><TD>        }</TD></TR><TR><TD CLASS="l">697</TD><TD> </TD></TR><TR><TD CLASS="l">698</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="2c">699</A></TD><TD>         * This routine create an Element from comment data for comment style</TD></TR><TR><TD CLASS="l">700</TD><TD>         * elements, such as SSI and METADATA</TD></TR><TR><TD CLASS="l">701</TD><TD>         */</TD></TR><TR><TD CLASS="l">702</TD><TD>        protected Element createCommentElement(String data, boolean isJSPTag) {</TD></TR><TR CLASS="c"><TD CLASS="l">703</TD><TD>                String trimmedData = data.trim();</TD></TR><TR CLASS="c"><TD CLASS="l">704</TD><TD>                CommentElementConfiguration[] configs = CommentElementRegistry.getInstance().getConfigurations();</TD></TR><TR CLASS="c"><TD CLASS="l">705</TD><TD>                for (int iConfig = 0; iConfig &lt; configs.length; iConfig++) {</TD></TR><TR CLASS="c"><TD CLASS="l">706</TD><TD>                        CommentElementConfiguration config = configs[iConfig];</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="79% line coverage (11 out of 14 instructions)">707</TD><TD TITLE="79% line coverage (11 out of 14 instructions)">                        if ((isJSPTag &amp;&amp; !config.acceptJSPComment()) || (!isJSPTag &amp;&amp; !config.acceptXMLComment())) {</TD></TR><TR CLASS="z"><TD CLASS="l">708</TD><TD>                                continue;</TD></TR><TR><TD CLASS="l">709</TD><TD>                        }</TD></TR><TR CLASS="c"><TD CLASS="l">710</TD><TD>                        String[] prefixes = config.getPrefix();</TD></TR><TR CLASS="c"><TD CLASS="l">711</TD><TD>                        for (int iPrefix = 0; iPrefix &lt; prefixes.length; iPrefix++) {</TD></TR><TR CLASS="c"><TD CLASS="l">712</TD><TD>                                if (trimmedData.startsWith(prefixes[iPrefix])) {</TD></TR><TR CLASS="z"><TD CLASS="l">713</TD><TD>                                        return config.createElement(this.model.getDocument(), data, isJSPTag);</TD></TR><TR><TD CLASS="l">714</TD><TD>                                }</TD></TR><TR><TD CLASS="l">715</TD><TD>                        }</TD></TR><TR><TD CLASS="l">716</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">717</TD><TD>                ModelParserAdapter adapter = getParserAdapter();</TD></TR><TR CLASS="c"><TD CLASS="l">718</TD><TD>                if (adapter != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">719</TD><TD>                        return adapter.createCommentElement(this.model.getDocument(), data, isJSPTag);</TD></TR><TR><TD CLASS="l">720</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">721</TD><TD>                return null;</TD></TR><TR><TD CLASS="l">722</TD><TD>        }</TD></TR><TR><TD CLASS="l">723</TD><TD> </TD></TR><TR><TD CLASS="l">724</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="25">725</A></TD><TD>         * This routine create an implicit Element for given parent and child,</TD></TR><TR><TD CLASS="l">726</TD><TD>         * such as HTML, BODY, HEAD, and TBODY for HTML document.</TD></TR><TR><TD CLASS="l">727</TD><TD>         */</TD></TR><TR><TD CLASS="l">728</TD><TD>        protected Element createImplicitElement(Node parent, Node child) {</TD></TR><TR CLASS="c"><TD CLASS="l">729</TD><TD>                ModelParserAdapter adapter = getParserAdapter();</TD></TR><TR CLASS="c"><TD CLASS="l">730</TD><TD>                if (adapter != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">731</TD><TD>                        return adapter.createImplicitElement(this.model.getDocument(), parent, child);</TD></TR><TR><TD CLASS="l">732</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">733</TD><TD>                return null;</TD></TR><TR><TD CLASS="l">734</TD><TD>        }</TD></TR><TR><TD CLASS="l"><A NAME="1e">735</A></TD><TD> </TD></TR><TR><TD CLASS="l">736</TD><TD>        /**</TD></TR><TR><TD CLASS="l">737</TD><TD>         */</TD></TR><TR><TD CLASS="l">738</TD><TD>        private void demoteNodes(Node root, Node newParent, Node oldParent, Node next) {</TD></TR><TR CLASS="c"><TD CLASS="l">739</TD><TD>                if (newParent.getNodeType() != Node.ELEMENT_NODE)</TD></TR><TR CLASS="z"><TD CLASS="l">740</TD><TD>                        return;</TD></TR><TR CLASS="c"><TD CLASS="l">741</TD><TD>                ElementImpl newElement = (ElementImpl) newParent;</TD></TR><TR><TD CLASS="l">742</TD><TD> </TD></TR><TR><TD CLASS="l">743</TD><TD>                // find next</TD></TR><TR CLASS="c"><TD CLASS="l">744</TD><TD>                while (next == null) {</TD></TR><TR CLASS="c"><TD CLASS="l">745</TD><TD>                        if (oldParent.getNodeType() != Node.ELEMENT_NODE)</TD></TR><TR CLASS="c"><TD CLASS="l">746</TD><TD>                                return;</TD></TR><TR CLASS="c"><TD CLASS="l">747</TD><TD>                        ElementImpl oldElement = (ElementImpl) oldParent;</TD></TR><TR CLASS="c"><TD CLASS="l">748</TD><TD>                        if (oldElement.hasEndTag())</TD></TR><TR CLASS="z"><TD CLASS="l">749</TD><TD>                                return;</TD></TR><TR CLASS="c"><TD CLASS="l">750</TD><TD>                        oldParent = oldElement.getParentNode();</TD></TR><TR CLASS="c"><TD CLASS="l">751</TD><TD>                        if (oldParent == null)</TD></TR><TR CLASS="z"><TD CLASS="l">752</TD><TD>                                return; // error</TD></TR><TR CLASS="c"><TD CLASS="l">753</TD><TD>                        next = oldElement.getNextSibling();</TD></TR><TR><TD CLASS="l">754</TD><TD>                }</TD></TR><TR><TD CLASS="l">755</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">756</TD><TD>                while (next != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">757</TD><TD>                        boolean done = false;</TD></TR><TR CLASS="z"><TD CLASS="l">758</TD><TD>                        if (next.getNodeType() == Node.ELEMENT_NODE) {</TD></TR><TR CLASS="z"><TD CLASS="l">759</TD><TD>                                ElementImpl nextElement = (ElementImpl) next;</TD></TR><TR CLASS="z"><TD CLASS="l">760</TD><TD>                                if (!nextElement.hasStartTag()) {</TD></TR><TR CLASS="z"><TD CLASS="l">761</TD><TD>                                        Node nextChild = nextElement.getFirstChild();</TD></TR><TR CLASS="z"><TD CLASS="l">762</TD><TD>                                        if (nextChild != null) {</TD></TR><TR><TD CLASS="l">763</TD><TD>                                                // demote children</TD></TR><TR CLASS="z"><TD CLASS="l">764</TD><TD>                                                next = nextChild;</TD></TR><TR CLASS="z"><TD CLASS="l">765</TD><TD>                                                oldParent = nextElement;</TD></TR><TR CLASS="z"><TD CLASS="l">766</TD><TD>                                                continue;</TD></TR><TR><TD CLASS="l">767</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">768</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">769</TD><TD>                                        if (nextElement.hasEndTag()) {</TD></TR><TR CLASS="z"><TD CLASS="l">770</TD><TD>                                                if (nextElement.matchEndTag(newElement)) {</TD></TR><TR><TD CLASS="l">771</TD><TD>                                                        // stop at the matched invalid end tag</TD></TR><TR CLASS="z"><TD CLASS="l">772</TD><TD>                                                        next = nextElement.getNextSibling();</TD></TR><TR CLASS="z"><TD CLASS="l">773</TD><TD>                                                        oldParent.removeChild(nextElement);</TD></TR><TR CLASS="z"><TD CLASS="l">774</TD><TD>                                                        newElement.addEndTag(nextElement);</TD></TR><TR><TD CLASS="l">775</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">776</TD><TD>                                                        if (newElement == root)</TD></TR><TR CLASS="z"><TD CLASS="l">777</TD><TD>                                                                return;</TD></TR><TR CLASS="z"><TD CLASS="l">778</TD><TD>                                                        Node p = newElement.getParentNode();</TD></TR><TR><TD CLASS="l">779</TD><TD>                                                        // check if reached to top</TD></TR><TR CLASS="z"><TD CLASS="l">780</TD><TD>                                                        if (p == null || p == oldParent || p.getNodeType() != Node.ELEMENT_NODE)</TD></TR><TR CLASS="z"><TD CLASS="l">781</TD><TD>                                                                return;</TD></TR><TR CLASS="z"><TD CLASS="l">782</TD><TD>                                                        newElement = (ElementImpl) p;</TD></TR><TR CLASS="z"><TD CLASS="l">783</TD><TD>                                                        done = true;</TD></TR><TR><TD CLASS="l">784</TD><TD>                                                }</TD></TR><TR><TD CLASS="l">785</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">786</TD><TD>                                        else {</TD></TR><TR><TD CLASS="l">787</TD><TD>                                                // remove implicit element</TD></TR><TR CLASS="z"><TD CLASS="l">788</TD><TD>                                                next = nextElement.getNextSibling();</TD></TR><TR CLASS="z"><TD CLASS="l">789</TD><TD>                                                oldParent.removeChild(nextElement);</TD></TR><TR CLASS="z"><TD CLASS="l">790</TD><TD>                                                done = true;</TD></TR><TR><TD CLASS="l">791</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">792</TD><TD>                                }</TD></TR><TR><TD CLASS="l">793</TD><TD>                        }</TD></TR><TR><TD CLASS="l">794</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">795</TD><TD>                        if (!done) {</TD></TR><TR CLASS="z"><TD CLASS="l">796</TD><TD>                                if (!canContain(newElement, next)) {</TD></TR><TR CLASS="z"><TD CLASS="l">797</TD><TD>                                        if (newElement == root)</TD></TR><TR CLASS="z"><TD CLASS="l">798</TD><TD>                                                return;</TD></TR><TR CLASS="z"><TD CLASS="l">799</TD><TD>                                        Node p = newElement.getParentNode();</TD></TR><TR><TD CLASS="l">800</TD><TD>                                        // check if reached to top</TD></TR><TR CLASS="z"><TD CLASS="l">801</TD><TD>                                        if (p == null || p == oldParent || p.getNodeType() != Node.ELEMENT_NODE)</TD></TR><TR CLASS="z"><TD CLASS="l">802</TD><TD>                                                return;</TD></TR><TR CLASS="z"><TD CLASS="l">803</TD><TD>                                        newElement = (ElementImpl) p;</TD></TR><TR CLASS="z"><TD CLASS="l">804</TD><TD>                                        continue;</TD></TR><TR><TD CLASS="l">805</TD><TD>                                }</TD></TR><TR><TD CLASS="l">806</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">807</TD><TD>                                Node child = next;</TD></TR><TR CLASS="z"><TD CLASS="l">808</TD><TD>                                next = next.getNextSibling();</TD></TR><TR CLASS="z"><TD CLASS="l">809</TD><TD>                                oldParent.removeChild(child);</TD></TR><TR CLASS="z"><TD CLASS="l">810</TD><TD>                                insertNode(newElement, child, null);</TD></TR><TR CLASS="z"><TD CLASS="l">811</TD><TD>                                Node childParent = child.getParentNode();</TD></TR><TR CLASS="z"><TD CLASS="l">812</TD><TD>                                if (childParent != newElement) {</TD></TR><TR CLASS="z"><TD CLASS="l">813</TD><TD>                                        newElement = (ElementImpl) childParent;</TD></TR><TR><TD CLASS="l">814</TD><TD>                                }</TD></TR><TR><TD CLASS="l">815</TD><TD>                        }</TD></TR><TR><TD CLASS="l">816</TD><TD> </TD></TR><TR><TD CLASS="l">817</TD><TD>                        // find next parent and sibling</TD></TR><TR CLASS="z"><TD CLASS="l">818</TD><TD>                        while (next == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">819</TD><TD>                                if (oldParent.getNodeType() != Node.ELEMENT_NODE)</TD></TR><TR CLASS="z"><TD CLASS="l">820</TD><TD>                                        return;</TD></TR><TR CLASS="z"><TD CLASS="l">821</TD><TD>                                ElementImpl oldElement = (ElementImpl) oldParent;</TD></TR><TR><TD CLASS="l">822</TD><TD> </TD></TR><TR><TD CLASS="l">823</TD><TD>                                // dug parent must not have children at this point</TD></TR><TR CLASS="z"><TD CLASS="l">824</TD><TD>                                if (!oldElement.hasChildNodes() &amp;&amp; !oldElement.hasStartTag()) {</TD></TR><TR CLASS="z"><TD CLASS="l">825</TD><TD>                                        oldParent = oldElement.getParentNode();</TD></TR><TR CLASS="z"><TD CLASS="l">826</TD><TD>                                        if (oldParent == null)</TD></TR><TR CLASS="z"><TD CLASS="l">827</TD><TD>                                                return; // error</TD></TR><TR CLASS="z"><TD CLASS="l">828</TD><TD>                                        next = oldElement;</TD></TR><TR CLASS="z"><TD CLASS="l">829</TD><TD>                                        break;</TD></TR><TR><TD CLASS="l">830</TD><TD>                                }</TD></TR><TR><TD CLASS="l">831</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">832</TD><TD>                                if (oldElement.hasEndTag())</TD></TR><TR CLASS="z"><TD CLASS="l">833</TD><TD>                                        return;</TD></TR><TR CLASS="z"><TD CLASS="l">834</TD><TD>                                oldParent = oldElement.getParentNode();</TD></TR><TR CLASS="z"><TD CLASS="l">835</TD><TD>                                if (oldParent == null)</TD></TR><TR CLASS="z"><TD CLASS="l">836</TD><TD>                                        return; // error</TD></TR><TR CLASS="z"><TD CLASS="l">837</TD><TD>                                next = oldElement.getNextSibling();</TD></TR><TR><TD CLASS="l">838</TD><TD>                        }</TD></TR><TR><TD CLASS="l"><A NAME="2d">839</A></TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">840</TD><TD>        }</TD></TR><TR><TD CLASS="l">841</TD><TD> </TD></TR><TR><TD CLASS="l">842</TD><TD>        private ModelParserAdapter getParserAdapter() {</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="71% line coverage (15 out of 21 instructions)">843</TD><TD TITLE="71% line coverage (15 out of 21 instructions)">                return (ModelParserAdapter) this.model.getDocument().getAdapterFor(ModelParserAdapter.class);</TD></TR><TR><TD CLASS="l">844</TD><TD>        }</TD></TR><TR><TD CLASS="l"><A NAME="27">845</A></TD><TD>        </TD></TR><TR><TD CLASS="l">846</TD><TD>        /**</TD></TR><TR><TD CLASS="l">847</TD><TD>         */</TD></TR><TR><TD CLASS="l">848</TD><TD>        protected String getFindRootName(String tagName) {</TD></TR><TR CLASS="c"><TD CLASS="l">849</TD><TD>                ModelParserAdapter adapter = getParserAdapter();</TD></TR><TR CLASS="c"><TD CLASS="l">850</TD><TD>                if (adapter != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">851</TD><TD>                        return adapter.getFindRootName(tagName);</TD></TR><TR><TD CLASS="l">852</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">853</TD><TD>                return null;</TD></TR><TR><TD CLASS="l">854</TD><TD>        }</TD></TR><TR><TD CLASS="l"><A NAME="e">855</A></TD><TD> </TD></TR><TR><TD CLASS="l">856</TD><TD>        /**</TD></TR><TR><TD CLASS="l">857</TD><TD>         */</TD></TR><TR><TD CLASS="l">858</TD><TD>        protected final IDOMModel getModel() {</TD></TR><TR CLASS="z"><TD CLASS="l">859</TD><TD>                return this.model;</TD></TR><TR><TD CLASS="l">860</TD><TD>        }</TD></TR><TR><TD CLASS="l">861</TD><TD> </TD></TR><TR><TD CLASS="l">862</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="f">863</A></TD><TD>         * insertCDATASection method</TD></TR><TR><TD CLASS="l">864</TD><TD>         * </TD></TR><TR><TD CLASS="l">865</TD><TD>         */</TD></TR><TR><TD CLASS="l">866</TD><TD>        private void insertCDATASection(IStructuredDocumentRegion flatNode) {</TD></TR><TR CLASS="z"><TD CLASS="l">867</TD><TD>                ITextRegionList regions = flatNode.getRegions();</TD></TR><TR CLASS="z"><TD CLASS="l">868</TD><TD>                if (regions == null)</TD></TR><TR CLASS="z"><TD CLASS="l">869</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">870</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">871</TD><TD>                CDATASectionImpl cdata = null;</TD></TR><TR><TD CLASS="l">872</TD><TD>                try {</TD></TR><TR CLASS="z"><TD CLASS="l">873</TD><TD>                        cdata = (CDATASectionImpl) this.model.getDocument().createCDATASection(null);</TD></TR><TR><TD CLASS="l">874</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">875</TD><TD>                catch (DOMException ex) {</TD></TR><TR><TD CLASS="l">876</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">877</TD><TD>                if (cdata == null) { // CDATA section might not be supported</TD></TR><TR CLASS="z"><TD CLASS="l">878</TD><TD>                        insertInvalidDecl(flatNode); // regard as invalid decl</TD></TR><TR CLASS="z"><TD CLASS="l">879</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">880</TD><TD>                }</TD></TR><TR><TD CLASS="l">881</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">882</TD><TD>                cdata.setStructuredDocumentRegion(flatNode);</TD></TR><TR CLASS="z"><TD CLASS="l">883</TD><TD>                insertNode(cdata);</TD></TR><TR CLASS="z"><TD CLASS="l">884</TD><TD>        }</TD></TR><TR><TD CLASS="l">885</TD><TD> </TD></TR><TR><TD CLASS="l">886</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="26">887</A></TD><TD>         * insertComment method</TD></TR><TR><TD CLASS="l">888</TD><TD>         * </TD></TR><TR><TD CLASS="l">889</TD><TD>         */</TD></TR><TR><TD CLASS="l">890</TD><TD>        private void insertComment(IStructuredDocumentRegion flatNode) {</TD></TR><TR CLASS="c"><TD CLASS="l">891</TD><TD>                ITextRegionList regions = flatNode.getRegions();</TD></TR><TR CLASS="c"><TD CLASS="l">892</TD><TD>                if (regions == null)</TD></TR><TR CLASS="z"><TD CLASS="l">893</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">894</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">895</TD><TD>                String data = null;</TD></TR><TR CLASS="c"><TD CLASS="l">896</TD><TD>                boolean isJSPTag = false;</TD></TR><TR CLASS="c"><TD CLASS="l">897</TD><TD>                Iterator e = regions.iterator();</TD></TR><TR CLASS="c"><TD CLASS="l">898</TD><TD>                while (e.hasNext()) {</TD></TR><TR CLASS="c"><TD CLASS="l">899</TD><TD>                        ITextRegion region = (ITextRegion) e.next();</TD></TR><TR CLASS="c"><TD CLASS="l">900</TD><TD>                        String regionType = region.getType();</TD></TR><TR CLASS="c"><TD CLASS="l">901</TD><TD>                        if (isNestedCommentOpen(regionType)) {</TD></TR><TR CLASS="z"><TD CLASS="l">902</TD><TD>                                isJSPTag = true;</TD></TR><TR><TD CLASS="l">903</TD><TD>                        }</TD></TR><TR CLASS="c"><TD CLASS="l">904</TD><TD>                        else if (regionType == DOMRegionContext.XML_COMMENT_TEXT || isNestedCommentText(regionType)) {</TD></TR><TR CLASS="c"><TD CLASS="l">905</TD><TD>                                if (data == null) {</TD></TR><TR CLASS="c"><TD CLASS="l">906</TD><TD>                                        data = flatNode.getText(region);</TD></TR><TR><TD CLASS="l">907</TD><TD>                                }</TD></TR><TR><TD CLASS="l">908</TD><TD>                        }</TD></TR><TR><TD CLASS="l">909</TD><TD>                }</TD></TR><TR><TD CLASS="l">910</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">911</TD><TD>                if (data != null) {</TD></TR><TR CLASS="c"><TD CLASS="l">912</TD><TD>                        ElementImpl element = (ElementImpl) createCommentElement(data, isJSPTag);</TD></TR><TR CLASS="c"><TD CLASS="l">913</TD><TD>                        if (element != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">914</TD><TD>                                if (!isEndTag(element)) {</TD></TR><TR CLASS="z"><TD CLASS="l">915</TD><TD>                                        element.setStartStructuredDocumentRegion(flatNode);</TD></TR><TR CLASS="z"><TD CLASS="l">916</TD><TD>                                        insertStartTag(element);</TD></TR><TR CLASS="z"><TD CLASS="l">917</TD><TD>                                        return;</TD></TR><TR><TD CLASS="l">918</TD><TD>                                }</TD></TR><TR><TD CLASS="l">919</TD><TD> </TD></TR><TR><TD CLASS="l">920</TD><TD>                                // end tag</TD></TR><TR CLASS="z"><TD CLASS="l">921</TD><TD>                                element.setEndStructuredDocumentRegion(flatNode);</TD></TR><TR><TD CLASS="l">922</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">923</TD><TD>                                String tagName = element.getTagName();</TD></TR><TR CLASS="z"><TD CLASS="l">924</TD><TD>                                String rootName = getFindRootName(tagName);</TD></TR><TR CLASS="z"><TD CLASS="l">925</TD><TD>                                ElementImpl start = (ElementImpl) this.context.findStartTag(tagName, rootName);</TD></TR><TR CLASS="z"><TD CLASS="l">926</TD><TD>                                if (start != null) { // start tag found</TD></TR><TR CLASS="z"><TD CLASS="l">927</TD><TD>                                        insertEndTag(start);</TD></TR><TR CLASS="z"><TD CLASS="l">928</TD><TD>                                        start.addEndTag(element);</TD></TR><TR CLASS="z"><TD CLASS="l">929</TD><TD>                                        return;</TD></TR><TR><TD CLASS="l">930</TD><TD>                                }</TD></TR><TR><TD CLASS="l">931</TD><TD> </TD></TR><TR><TD CLASS="l">932</TD><TD>                                // invalid end tag</TD></TR><TR CLASS="z"><TD CLASS="l">933</TD><TD>                                insertNode(element);</TD></TR><TR CLASS="z"><TD CLASS="l">934</TD><TD>                                return;</TD></TR><TR><TD CLASS="l">935</TD><TD>                        }</TD></TR><TR><TD CLASS="l">936</TD><TD>                }</TD></TR><TR><TD CLASS="l">937</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">938</TD><TD>                CommentImpl comment = (CommentImpl) this.model.getDocument().createComment(null);</TD></TR><TR CLASS="c"><TD CLASS="l">939</TD><TD>                if (comment == null)</TD></TR><TR CLASS="z"><TD CLASS="l">940</TD><TD>                        return;</TD></TR><TR CLASS="c"><TD CLASS="l">941</TD><TD>                if (isJSPTag)</TD></TR><TR CLASS="z"><TD CLASS="l">942</TD><TD>                        comment.setJSPTag(true);</TD></TR><TR CLASS="c"><TD CLASS="l">943</TD><TD>                comment.setStructuredDocumentRegion(flatNode);</TD></TR><TR CLASS="c"><TD CLASS="l">944</TD><TD>                insertNode(comment);</TD></TR><TR CLASS="c"><TD CLASS="l">945</TD><TD>        }</TD></TR><TR><TD CLASS="l">946</TD><TD> </TD></TR><TR><TD CLASS="l">947</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="10">948</A></TD><TD>         * insertDecl method</TD></TR><TR><TD CLASS="l">949</TD><TD>         * </TD></TR><TR><TD CLASS="l">950</TD><TD>         */</TD></TR><TR><TD CLASS="l">951</TD><TD>        private void insertDecl(IStructuredDocumentRegion flatNode) {</TD></TR><TR CLASS="z"><TD CLASS="l">952</TD><TD>                ITextRegionList regions = flatNode.getRegions();</TD></TR><TR CLASS="z"><TD CLASS="l">953</TD><TD>                if (regions == null)</TD></TR><TR CLASS="z"><TD CLASS="l">954</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">955</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">956</TD><TD>                boolean isDocType = false;</TD></TR><TR CLASS="z"><TD CLASS="l">957</TD><TD>                String name = null;</TD></TR><TR CLASS="z"><TD CLASS="l">958</TD><TD>                String publicId = null;</TD></TR><TR CLASS="z"><TD CLASS="l">959</TD><TD>                String systemId = null;</TD></TR><TR CLASS="z"><TD CLASS="l">960</TD><TD>                Iterator e = regions.iterator();</TD></TR><TR CLASS="z"><TD CLASS="l">961</TD><TD>                while (e.hasNext()) {</TD></TR><TR CLASS="z"><TD CLASS="l">962</TD><TD>                        ITextRegion region = (ITextRegion) e.next();</TD></TR><TR CLASS="z"><TD CLASS="l">963</TD><TD>                        String regionType = region.getType();</TD></TR><TR CLASS="z"><TD CLASS="l">964</TD><TD>                        if (regionType == DOMRegionContext.XML_DOCTYPE_DECLARATION) {</TD></TR><TR CLASS="z"><TD CLASS="l">965</TD><TD>                                isDocType = true;</TD></TR><TR><TD CLASS="l">966</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">967</TD><TD>                        else if (regionType == DOMRegionContext.XML_DOCTYPE_NAME) {</TD></TR><TR CLASS="z"><TD CLASS="l">968</TD><TD>                                if (name == null)</TD></TR><TR CLASS="z"><TD CLASS="l">969</TD><TD>                                        name = flatNode.getText(region);</TD></TR><TR><TD CLASS="l">970</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">971</TD><TD>                        else if (regionType == DOMRegionContext.XML_DOCTYPE_EXTERNAL_ID_PUBREF) {</TD></TR><TR CLASS="z"><TD CLASS="l">972</TD><TD>                                if (publicId == null)</TD></TR><TR CLASS="z"><TD CLASS="l">973</TD><TD>                                        publicId = StructuredDocumentRegionUtil.getAttrValue(flatNode, region);</TD></TR><TR><TD CLASS="l">974</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">975</TD><TD>                        else if (regionType == DOMRegionContext.XML_DOCTYPE_EXTERNAL_ID_SYSREF) {</TD></TR><TR CLASS="z"><TD CLASS="l">976</TD><TD>                                if (systemId == null)</TD></TR><TR CLASS="z"><TD CLASS="l">977</TD><TD>                                        systemId = StructuredDocumentRegionUtil.getAttrValue(flatNode, region);</TD></TR><TR><TD CLASS="l">978</TD><TD>                        }</TD></TR><TR><TD CLASS="l">979</TD><TD>                }</TD></TR><TR><TD CLASS="l">980</TD><TD> </TD></TR><TR><TD CLASS="l">981</TD><TD>                // invalid declaration</TD></TR><TR CLASS="z"><TD CLASS="l">982</TD><TD>                if (!isDocType) {</TD></TR><TR CLASS="z"><TD CLASS="l">983</TD><TD>                        insertInvalidDecl(flatNode);</TD></TR><TR CLASS="z"><TD CLASS="l">984</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">985</TD><TD>                }</TD></TR><TR><TD CLASS="l">986</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">987</TD><TD>                DocumentTypeImpl docType = (DocumentTypeImpl) this.model.getDocument().createDoctype(name);</TD></TR><TR CLASS="z"><TD CLASS="l">988</TD><TD>                if (docType == null)</TD></TR><TR CLASS="z"><TD CLASS="l">989</TD><TD>                        return;</TD></TR><TR CLASS="z"><TD CLASS="l">990</TD><TD>                if (publicId != null)</TD></TR><TR CLASS="z"><TD CLASS="l">991</TD><TD>                        docType.setPublicId(publicId);</TD></TR><TR CLASS="z"><TD CLASS="l">992</TD><TD>                if (systemId != null)</TD></TR><TR CLASS="z"><TD CLASS="l">993</TD><TD>                        docType.setSystemId(systemId);</TD></TR><TR CLASS="z"><TD CLASS="l">994</TD><TD>                docType.setStructuredDocumentRegion(flatNode);</TD></TR><TR CLASS="z"><TD CLASS="l">995</TD><TD>                insertNode(docType);</TD></TR><TR CLASS="z"><TD CLASS="l">996</TD><TD>        }</TD></TR><TR><TD CLASS="l">997</TD><TD> </TD></TR><TR><TD CLASS="l">998</TD><TD>        /**</TD></TR><TR><TD CLASS="l">999</TD><TD>         * insertEndTag method can be used by subclasses, but not overrided.</TD></TR><TR><TD CLASS="l">1000</TD><TD>         * </TD></TR><TR><TD CLASS="l"><A NAME="28">1001</A></TD><TD>         * @param element</TD></TR><TR><TD CLASS="l">1002</TD><TD>         *            org.w3c.dom.Element</TD></TR><TR><TD CLASS="l">1003</TD><TD>         */</TD></TR><TR><TD CLASS="l">1004</TD><TD>        protected void insertEndTag(Element element) {</TD></TR><TR CLASS="c"><TD CLASS="l">1005</TD><TD>                if (element == null)</TD></TR><TR CLASS="z"><TD CLASS="l">1006</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">1007</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1008</TD><TD>                Node newParent = element.getParentNode();</TD></TR><TR CLASS="c"><TD CLASS="l">1009</TD><TD>                if (newParent == null)</TD></TR><TR CLASS="z"><TD CLASS="l">1010</TD><TD>                        return; // error</TD></TR><TR><TD CLASS="l">1011</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1012</TD><TD>                if (!((ElementImpl) element).isContainer()) {</TD></TR><TR><TD CLASS="l">1013</TD><TD>                        // just update context</TD></TR><TR CLASS="z"><TD CLASS="l">1014</TD><TD>                        Node elementNext = element.getNextSibling();</TD></TR><TR CLASS="z"><TD CLASS="l">1015</TD><TD>                        if (elementNext != null)</TD></TR><TR CLASS="z"><TD CLASS="l">1016</TD><TD>                                this.context.setNextNode(elementNext);</TD></TR><TR><TD CLASS="l">1017</TD><TD>                        else</TD></TR><TR CLASS="z"><TD CLASS="l">1018</TD><TD>                                this.context.setParentNode(newParent);</TD></TR><TR CLASS="z"><TD CLASS="l">1019</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">1020</TD><TD>                }</TD></TR><TR><TD CLASS="l">1021</TD><TD> </TD></TR><TR><TD CLASS="l">1022</TD><TD>                // promote children</TD></TR><TR CLASS="c"><TD CLASS="l">1023</TD><TD>                Node newNext = element.getNextSibling();</TD></TR><TR CLASS="c"><TD CLASS="l">1024</TD><TD>                Node oldParent = this.context.getParentNode();</TD></TR><TR CLASS="c"><TD CLASS="l">1025</TD><TD>                if (oldParent == null)</TD></TR><TR CLASS="z"><TD CLASS="l">1026</TD><TD>                        return; // error</TD></TR><TR CLASS="c"><TD CLASS="l">1027</TD><TD>                Node oldNext = this.context.getNextNode();</TD></TR><TR CLASS="c"><TD CLASS="l">1028</TD><TD>                promoteNodes(element, newParent, newNext, oldParent, oldNext);</TD></TR><TR><TD CLASS="l">1029</TD><TD> </TD></TR><TR><TD CLASS="l">1030</TD><TD>                // update context</TD></TR><TR><TD CLASS="l">1031</TD><TD>                // re-check the next sibling</TD></TR><TR CLASS="c"><TD CLASS="l">1032</TD><TD>                newNext = element.getNextSibling();</TD></TR><TR CLASS="c"><TD CLASS="l">1033</TD><TD>                if (newNext != null)</TD></TR><TR CLASS="z"><TD CLASS="l">1034</TD><TD>                        this.context.setNextNode(newNext);</TD></TR><TR><TD CLASS="l">1035</TD><TD>                else</TD></TR><TR CLASS="c"><TD CLASS="l">1036</TD><TD>                        this.context.setParentNode(newParent);</TD></TR><TR CLASS="c"><TD CLASS="l">1037</TD><TD>        }</TD></TR><TR><TD CLASS="l">1038</TD><TD> </TD></TR><TR><TD CLASS="l">1039</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="29">1040</A></TD><TD>         * insertEndTag method</TD></TR><TR><TD CLASS="l">1041</TD><TD>         * </TD></TR><TR><TD CLASS="l">1042</TD><TD>         */</TD></TR><TR><TD CLASS="l">1043</TD><TD>        private void insertEndTag(IStructuredDocumentRegion flatNode) {</TD></TR><TR CLASS="c"><TD CLASS="l">1044</TD><TD>                ITextRegionList regions = flatNode.getRegions();</TD></TR><TR CLASS="c"><TD CLASS="l">1045</TD><TD>                if (regions == null)</TD></TR><TR CLASS="z"><TD CLASS="l">1046</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">1047</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1048</TD><TD>                String tagName = null;</TD></TR><TR CLASS="c"><TD CLASS="l">1049</TD><TD>                Iterator e = regions.iterator();</TD></TR><TR CLASS="c"><TD CLASS="l">1050</TD><TD>                while (e.hasNext()) {</TD></TR><TR CLASS="c"><TD CLASS="l">1051</TD><TD>                        ITextRegion region = (ITextRegion) e.next();</TD></TR><TR CLASS="c"><TD CLASS="l">1052</TD><TD>                        String regionType = region.getType();</TD></TR><TR CLASS="c"><TD CLASS="l">1053</TD><TD>                        if (regionType == DOMRegionContext.XML_TAG_NAME || isNestedTagName(regionType)) {</TD></TR><TR CLASS="c"><TD CLASS="l">1054</TD><TD>                                if (tagName == null)</TD></TR><TR CLASS="c"><TD CLASS="l">1055</TD><TD>                                        tagName = flatNode.getText(region);</TD></TR><TR><TD CLASS="l">1056</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1057</TD><TD>                }</TD></TR><TR><TD CLASS="l">1058</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1059</TD><TD>                if (tagName == null) { // invalid end tag</TD></TR><TR CLASS="z"><TD CLASS="l">1060</TD><TD>                        insertText(flatNode); // regard as invalid text</TD></TR><TR CLASS="z"><TD CLASS="l">1061</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">1062</TD><TD>                }</TD></TR><TR><TD CLASS="l">1063</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1064</TD><TD>                String rootName = getFindRootName(tagName);</TD></TR><TR CLASS="c"><TD CLASS="l">1065</TD><TD>                ElementImpl start = (ElementImpl) this.context.findStartTag(tagName, rootName);</TD></TR><TR CLASS="c"><TD CLASS="l">1066</TD><TD>                if (start != null) { // start tag found</TD></TR><TR CLASS="c"><TD CLASS="l">1067</TD><TD>                        insertEndTag(start);</TD></TR><TR CLASS="c"><TD CLASS="l">1068</TD><TD>                        start.setEndStructuredDocumentRegion(flatNode);</TD></TR><TR CLASS="c"><TD CLASS="l">1069</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">1070</TD><TD>                }</TD></TR><TR><TD CLASS="l">1071</TD><TD> </TD></TR><TR><TD CLASS="l">1072</TD><TD>                // invalid end tag</TD></TR><TR CLASS="z"><TD CLASS="l">1073</TD><TD>                ElementImpl end = null;</TD></TR><TR><TD CLASS="l">1074</TD><TD>                try {</TD></TR><TR CLASS="z"><TD CLASS="l">1075</TD><TD>                        end = (ElementImpl) this.model.getDocument().createElement(tagName);</TD></TR><TR><TD CLASS="l">1076</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1077</TD><TD>                catch (DOMException ex) {</TD></TR><TR><TD CLASS="l">1078</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1079</TD><TD>                if (end == null) { // invalid end tag</TD></TR><TR CLASS="z"><TD CLASS="l">1080</TD><TD>                        insertText(flatNode); // regard as invalid text</TD></TR><TR CLASS="z"><TD CLASS="l">1081</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">1082</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1083</TD><TD>                end.setEndStructuredDocumentRegion(flatNode);</TD></TR><TR CLASS="z"><TD CLASS="l">1084</TD><TD>                insertNode(end);</TD></TR><TR CLASS="z"><TD CLASS="l">1085</TD><TD>        }</TD></TR><TR><TD CLASS="l">1086</TD><TD> </TD></TR><TR><TD CLASS="l">1087</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="11">1088</A></TD><TD>         * insertEntityRef method</TD></TR><TR><TD CLASS="l">1089</TD><TD>         * </TD></TR><TR><TD CLASS="l">1090</TD><TD>         */</TD></TR><TR><TD CLASS="l">1091</TD><TD>        private void insertEntityRef(IStructuredDocumentRegion flatNode) {</TD></TR><TR CLASS="z"><TD CLASS="l">1092</TD><TD>                ITextRegionList regions = flatNode.getRegions();</TD></TR><TR CLASS="z"><TD CLASS="l">1093</TD><TD>                if (regions == null)</TD></TR><TR CLASS="z"><TD CLASS="l">1094</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">1095</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1096</TD><TD>                String name = null;</TD></TR><TR CLASS="z"><TD CLASS="l">1097</TD><TD>                Iterator e = regions.iterator();</TD></TR><TR CLASS="z"><TD CLASS="l">1098</TD><TD>                while (e.hasNext()) {</TD></TR><TR CLASS="z"><TD CLASS="l">1099</TD><TD>                        ITextRegion region = (ITextRegion) e.next();</TD></TR><TR CLASS="z"><TD CLASS="l">1100</TD><TD>                        String regionType = region.getType();</TD></TR><TR CLASS="z"><TD CLASS="l">1101</TD><TD>                        if (regionType == DOMRegionContext.XML_ENTITY_REFERENCE || regionType == DOMRegionContext.XML_CHAR_REFERENCE) {</TD></TR><TR CLASS="z"><TD CLASS="l">1102</TD><TD>                                if (name == null)</TD></TR><TR CLASS="z"><TD CLASS="l">1103</TD><TD>                                        name = StructuredDocumentRegionUtil.getEntityRefName(flatNode, region);</TD></TR><TR><TD CLASS="l">1104</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1105</TD><TD>                }</TD></TR><TR><TD CLASS="l">1106</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1107</TD><TD>                if (name == null) { // invalid entity</TD></TR><TR CLASS="z"><TD CLASS="l">1108</TD><TD>                        insertText(flatNode);</TD></TR><TR CLASS="z"><TD CLASS="l">1109</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">1110</TD><TD>                }</TD></TR><TR><TD CLASS="l">1111</TD><TD> </TD></TR><TR><TD CLASS="l">1112</TD><TD>                // ISSUE: avoid this cast</TD></TR><TR CLASS="z"><TD CLASS="l">1113</TD><TD>                String value = ((DocumentImpl)this.model.getDocument()).getCharValue(name);</TD></TR><TR CLASS="z"><TD CLASS="l">1114</TD><TD>                if (value != null) { // character entity</TD></TR><TR CLASS="z"><TD CLASS="l">1115</TD><TD>                        TextImpl text = (TextImpl) this.context.findPreviousText();</TD></TR><TR CLASS="z"><TD CLASS="l">1116</TD><TD>                        if (text != null) { // existing text found</TD></TR><TR><TD CLASS="l">1117</TD><TD>                                // do not append data</TD></TR><TR CLASS="z"><TD CLASS="l">1118</TD><TD>                                text.appendStructuredDocumentRegion(flatNode);</TD></TR><TR><TD CLASS="l">1119</TD><TD>                                // notify the change</TD></TR><TR CLASS="z"><TD CLASS="l">1120</TD><TD>                                text.notifyValueChanged();</TD></TR><TR CLASS="z"><TD CLASS="l">1121</TD><TD>                                return;</TD></TR><TR><TD CLASS="l">1122</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1123</TD><TD> </TD></TR><TR><TD CLASS="l">1124</TD><TD>                        // new text</TD></TR><TR CLASS="z"><TD CLASS="l">1125</TD><TD>                        text = (TextImpl) this.model.getDocument().createTextNode(null);</TD></TR><TR CLASS="z"><TD CLASS="l">1126</TD><TD>                        if (text == null)</TD></TR><TR CLASS="z"><TD CLASS="l">1127</TD><TD>                                return;</TD></TR><TR CLASS="z"><TD CLASS="l">1128</TD><TD>                        text.setStructuredDocumentRegion(flatNode);</TD></TR><TR CLASS="z"><TD CLASS="l">1129</TD><TD>                        insertNode(text);</TD></TR><TR CLASS="z"><TD CLASS="l">1130</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">1131</TD><TD>                }</TD></TR><TR><TD CLASS="l">1132</TD><TD> </TD></TR><TR><TD CLASS="l">1133</TD><TD>                // general entity reference</TD></TR><TR CLASS="z"><TD CLASS="l">1134</TD><TD>                EntityReferenceImpl ref = null;</TD></TR><TR><TD CLASS="l">1135</TD><TD>                try {</TD></TR><TR CLASS="z"><TD CLASS="l">1136</TD><TD>                        ref = (EntityReferenceImpl) this.model.getDocument().createEntityReference(name);</TD></TR><TR><TD CLASS="l">1137</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1138</TD><TD>                catch (DOMException ex) {</TD></TR><TR><TD CLASS="l">1139</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1140</TD><TD>                if (ref == null) { // entity reference might not be supported</TD></TR><TR CLASS="z"><TD CLASS="l">1141</TD><TD>                        insertText(flatNode); // regard as invalid text</TD></TR><TR CLASS="z"><TD CLASS="l">1142</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">1143</TD><TD>                }</TD></TR><TR><TD CLASS="l">1144</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1145</TD><TD>                ref.setStructuredDocumentRegion(flatNode);</TD></TR><TR CLASS="z"><TD CLASS="l">1146</TD><TD>                insertNode(ref);</TD></TR><TR CLASS="z"><TD CLASS="l">1147</TD><TD>        }</TD></TR><TR><TD CLASS="l">1148</TD><TD> </TD></TR><TR><TD CLASS="l">1149</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="12">1150</A></TD><TD>         * insertInvalidDecl method</TD></TR><TR><TD CLASS="l">1151</TD><TD>         * </TD></TR><TR><TD CLASS="l">1152</TD><TD>         */</TD></TR><TR><TD CLASS="l">1153</TD><TD>        private void insertInvalidDecl(IStructuredDocumentRegion flatNode) {</TD></TR><TR CLASS="z"><TD CLASS="l">1154</TD><TD>                ITextRegionList regions = flatNode.getRegions();</TD></TR><TR CLASS="z"><TD CLASS="l">1155</TD><TD>                if (regions == null)</TD></TR><TR CLASS="z"><TD CLASS="l">1156</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">1157</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1158</TD><TD>                ElementImpl element = null;</TD></TR><TR><TD CLASS="l">1159</TD><TD>                try {</TD></TR><TR CLASS="z"><TD CLASS="l">1160</TD><TD>                        element = (ElementImpl) this.model.getDocument().createElement(&#34;!&#34;);//$NON-NLS-1$</TD></TR><TR><TD CLASS="l">1161</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1162</TD><TD>                catch (DOMException ex) {</TD></TR><TR><TD CLASS="l">1163</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1164</TD><TD>                if (element == null) { // invalid tag</TD></TR><TR CLASS="z"><TD CLASS="l">1165</TD><TD>                        insertText(flatNode); // regard as invalid text</TD></TR><TR CLASS="z"><TD CLASS="l">1166</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">1167</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1168</TD><TD>                element.setEmptyTag(true);</TD></TR><TR CLASS="z"><TD CLASS="l">1169</TD><TD>                element.setStartStructuredDocumentRegion(flatNode);</TD></TR><TR CLASS="z"><TD CLASS="l">1170</TD><TD>                insertNode(element);</TD></TR><TR CLASS="z"><TD CLASS="l">1171</TD><TD>        }</TD></TR><TR><TD CLASS="l">1172</TD><TD> </TD></TR><TR><TD CLASS="l">1173</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="13">1174</A></TD><TD>         * insertJSPTag method</TD></TR><TR><TD CLASS="l">1175</TD><TD>         * </TD></TR><TR><TD CLASS="l">1176</TD><TD>         */</TD></TR><TR><TD CLASS="l">1177</TD><TD>        private void insertNestedTag(IStructuredDocumentRegion flatNode) {</TD></TR><TR CLASS="z"><TD CLASS="l">1178</TD><TD>                ITextRegionList regions = flatNode.getRegions();</TD></TR><TR CLASS="z"><TD CLASS="l">1179</TD><TD>                if (regions == null)</TD></TR><TR CLASS="z"><TD CLASS="l">1180</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">1181</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1182</TD><TD>                String tagName = null;</TD></TR><TR CLASS="z"><TD CLASS="l">1183</TD><TD>                AttrImpl attr = null;</TD></TR><TR CLASS="z"><TD CLASS="l">1184</TD><TD>                List attrNodes = null;</TD></TR><TR CLASS="z"><TD CLASS="l">1185</TD><TD>                boolean isCloseTag = false;</TD></TR><TR CLASS="z"><TD CLASS="l">1186</TD><TD>                Iterator e = regions.iterator();</TD></TR><TR CLASS="z"><TD CLASS="l">1187</TD><TD>                while (e.hasNext()) {</TD></TR><TR CLASS="z"><TD CLASS="l">1188</TD><TD>                        ITextRegion region = (ITextRegion) e.next();</TD></TR><TR CLASS="z"><TD CLASS="l">1189</TD><TD>                        String regionType = region.getType();</TD></TR><TR CLASS="z"><TD CLASS="l">1190</TD><TD>                        if (isNestedTagOpen(regionType) || isNestedTagName(regionType)) {</TD></TR><TR CLASS="z"><TD CLASS="l">1191</TD><TD>                                tagName = computeNestedTag(regionType, tagName, flatNode, region);</TD></TR><TR><TD CLASS="l">1192</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">1193</TD><TD>                        else if (isNestedTagClose(regionType)) {</TD></TR><TR CLASS="z"><TD CLASS="l">1194</TD><TD>                                isCloseTag = true;</TD></TR><TR><TD CLASS="l">1195</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">1196</TD><TD>                        else if (regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME) {</TD></TR><TR CLASS="z"><TD CLASS="l">1197</TD><TD>                                String name = flatNode.getText(region);</TD></TR><TR CLASS="z"><TD CLASS="l">1198</TD><TD>                                attr = (AttrImpl) this.model.getDocument().createAttribute(name);</TD></TR><TR CLASS="z"><TD CLASS="l">1199</TD><TD>                                if (attr != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1200</TD><TD>                                        attr.setNameRegion(region);</TD></TR><TR CLASS="z"><TD CLASS="l">1201</TD><TD>                                        if (attrNodes == null)</TD></TR><TR CLASS="z"><TD CLASS="l">1202</TD><TD>                                                attrNodes = new ArrayList();</TD></TR><TR CLASS="z"><TD CLASS="l">1203</TD><TD>                                        attrNodes.add(attr);</TD></TR><TR><TD CLASS="l">1204</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1205</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">1206</TD><TD>                        else if (regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS) {</TD></TR><TR CLASS="z"><TD CLASS="l">1207</TD><TD>                                if (attr != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1208</TD><TD>                                        attr.setEqualRegion(region);</TD></TR><TR><TD CLASS="l">1209</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1210</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">1211</TD><TD>                        else if (regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE) {</TD></TR><TR CLASS="z"><TD CLASS="l">1212</TD><TD>                                if (attr != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1213</TD><TD>                                        attr.setValueRegion(region);</TD></TR><TR CLASS="z"><TD CLASS="l">1214</TD><TD>                                        attr = null;</TD></TR><TR><TD CLASS="l">1215</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1216</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1217</TD><TD>                }</TD></TR><TR><TD CLASS="l">1218</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1219</TD><TD>                if (tagName == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1220</TD><TD>                        if (isCloseTag) {</TD></TR><TR><TD CLASS="l">1221</TD><TD>                                // close JSP tag</TD></TR><TR CLASS="z"><TD CLASS="l">1222</TD><TD>                                Node parent = this.context.getParentNode();</TD></TR><TR CLASS="z"><TD CLASS="l">1223</TD><TD>                                if (parent != null &amp;&amp; parent.getNodeType() == Node.ELEMENT_NODE) {</TD></TR><TR CLASS="z"><TD CLASS="l">1224</TD><TD>                                        ElementImpl start = (ElementImpl) parent;</TD></TR><TR CLASS="z"><TD CLASS="l">1225</TD><TD>                                        if (start.isJSPContainer()) {</TD></TR><TR CLASS="z"><TD CLASS="l">1226</TD><TD>                                                insertEndTag(start);</TD></TR><TR CLASS="z"><TD CLASS="l">1227</TD><TD>                                                start.setEndStructuredDocumentRegion(flatNode);</TD></TR><TR CLASS="z"><TD CLASS="l">1228</TD><TD>                                                return;</TD></TR><TR><TD CLASS="l">1229</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">1230</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1231</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1232</TD><TD>                        // invalid JSP tag</TD></TR><TR CLASS="z"><TD CLASS="l">1233</TD><TD>                        insertText(flatNode); // regard as invalid text</TD></TR><TR CLASS="z"><TD CLASS="l">1234</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">1235</TD><TD>                }</TD></TR><TR><TD CLASS="l">1236</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1237</TD><TD>                ElementImpl element = null;</TD></TR><TR><TD CLASS="l">1238</TD><TD>                try {</TD></TR><TR CLASS="z"><TD CLASS="l">1239</TD><TD>                        element = (ElementImpl) this.model.getDocument().createElement(tagName);</TD></TR><TR><TD CLASS="l">1240</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1241</TD><TD>                catch (DOMException ex) {</TD></TR><TR><TD CLASS="l">1242</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1243</TD><TD>                if (element == null) { // invalid tag</TD></TR><TR CLASS="z"><TD CLASS="l">1244</TD><TD>                        insertText(flatNode); // regard as invalid text</TD></TR><TR CLASS="z"><TD CLASS="l">1245</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">1246</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1247</TD><TD>                if (attrNodes != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1248</TD><TD>                        for (int i = 0; i &lt; attrNodes.size(); i++) {</TD></TR><TR CLASS="z"><TD CLASS="l">1249</TD><TD>                                element.appendAttributeNode((Attr) attrNodes.get(i));</TD></TR><TR><TD CLASS="l">1250</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1251</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1252</TD><TD>                element.setJSPTag(true);</TD></TR><TR CLASS="z"><TD CLASS="l">1253</TD><TD>                element.setStartStructuredDocumentRegion(flatNode);</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="16">1254</A></TD><TD>                insertStartTag(element);</TD></TR><TR CLASS="z"><TD CLASS="l">1255</TD><TD>        }</TD></TR><TR><TD CLASS="l">1256</TD><TD> </TD></TR><TR><TD CLASS="l">1257</TD><TD>        protected boolean isNestedTagClose(String regionType) {</TD></TR><TR CLASS="z"><TD CLASS="l">1258</TD><TD>                boolean result = false;</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="17">1259</A></TD><TD>                return result;</TD></TR><TR><TD CLASS="l">1260</TD><TD>        }</TD></TR><TR><TD CLASS="l">1261</TD><TD> </TD></TR><TR><TD CLASS="l">1262</TD><TD>        protected boolean isNestedTagOpen(String regionType) {</TD></TR><TR CLASS="z"><TD CLASS="l">1263</TD><TD>                boolean result = false;</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="c">1264</A></TD><TD>                return result;</TD></TR><TR><TD CLASS="l">1265</TD><TD>        }</TD></TR><TR><TD CLASS="l">1266</TD><TD> </TD></TR><TR><TD CLASS="l">1267</TD><TD>        protected String computeNestedTag(String regionType, String tagName, IStructuredDocumentRegion structuredDocumentRegion, ITextRegion region) {</TD></TR><TR CLASS="z"><TD CLASS="l">1268</TD><TD>                return tagName;</TD></TR><TR><TD CLASS="l">1269</TD><TD>        }</TD></TR><TR><TD CLASS="l">1270</TD><TD> </TD></TR><TR><TD CLASS="l">1271</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1272</TD><TD>         * insertNode method</TD></TR><TR><TD CLASS="l">1273</TD><TD>         * </TD></TR><TR><TD CLASS="l"><A NAME="22">1274</A></TD><TD>         * @param child</TD></TR><TR><TD CLASS="l">1275</TD><TD>         *            org.w3c.dom.Node</TD></TR><TR><TD CLASS="l">1276</TD><TD>         */</TD></TR><TR><TD CLASS="l">1277</TD><TD>        private void insertNode(Node node) {</TD></TR><TR CLASS="c"><TD CLASS="l">1278</TD><TD>                if (node == null)</TD></TR><TR CLASS="z"><TD CLASS="l">1279</TD><TD>                        return;</TD></TR><TR CLASS="c"><TD CLASS="l">1280</TD><TD>                if (this.context == null)</TD></TR><TR CLASS="z"><TD CLASS="l">1281</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">1282</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1283</TD><TD>                Node parent = this.context.getParentNode();</TD></TR><TR CLASS="c"><TD CLASS="l">1284</TD><TD>                if (parent == null)</TD></TR><TR CLASS="z"><TD CLASS="l">1285</TD><TD>                        return;</TD></TR><TR CLASS="c"><TD CLASS="l">1286</TD><TD>                Node next = this.context.getNextNode();</TD></TR><TR CLASS="c"><TD CLASS="l">1287</TD><TD>                while (parent.getNodeType() == Node.ELEMENT_NODE) {</TD></TR><TR CLASS="c"><TD CLASS="l">1288</TD><TD>                        ElementImpl element = (ElementImpl) parent;</TD></TR><TR CLASS="c"><TD CLASS="l">1289</TD><TD>                        if (canContain(element, node)) {</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="43% line coverage (3 out of 7 instructions)">1290</TD><TD TITLE="43% line coverage (3 out of 7 instructions)">                                if (!element.hasStartTag() &amp;&amp; next == element.getFirstChild()) {</TD></TR><TR><TD CLASS="l">1291</TD><TD>                                        // first child of implicit tag</TD></TR><TR><TD CLASS="l">1292</TD><TD>                                        // deletege to the parent</TD></TR><TR CLASS="z"><TD CLASS="l">1293</TD><TD>                                        parent = element.getParentNode();</TD></TR><TR CLASS="z"><TD CLASS="l">1294</TD><TD>                                        if (parent == null)</TD></TR><TR CLASS="z"><TD CLASS="l">1295</TD><TD>                                                return;</TD></TR><TR CLASS="z"><TD CLASS="l">1296</TD><TD>                                        next = element;</TD></TR><TR CLASS="z"><TD CLASS="l">1297</TD><TD>                                        this.context.setNextNode(next);</TD></TR><TR CLASS="z"><TD CLASS="l">1298</TD><TD>                                        continue;</TD></TR><TR><TD CLASS="l">1299</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1300</TD><TD>                                break;</TD></TR><TR><TD CLASS="l">1301</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">1302</TD><TD>                        parent = element.getParentNode();</TD></TR><TR CLASS="z"><TD CLASS="l">1303</TD><TD>                        if (parent == null)</TD></TR><TR CLASS="z"><TD CLASS="l">1304</TD><TD>                                return;</TD></TR><TR><TD CLASS="l">1305</TD><TD> </TD></TR><TR><TD CLASS="l">1306</TD><TD>                        // promote siblings</TD></TR><TR CLASS="z"><TD CLASS="l">1307</TD><TD>                        Node newNext = element.getNextSibling();</TD></TR><TR CLASS="z"><TD CLASS="l">1308</TD><TD>                        Node child = next;</TD></TR><TR CLASS="z"><TD CLASS="l">1309</TD><TD>                        while (child != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1310</TD><TD>                                Node nextChild = child.getNextSibling();</TD></TR><TR CLASS="z"><TD CLASS="l">1311</TD><TD>                                element.removeChild(child);</TD></TR><TR CLASS="z"><TD CLASS="l">1312</TD><TD>                                parent.insertBefore(child, newNext);</TD></TR><TR CLASS="z"><TD CLASS="l">1313</TD><TD>                                child = nextChild;</TD></TR><TR><TD CLASS="l">1314</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1315</TD><TD> </TD></TR><TR><TD CLASS="l">1316</TD><TD>                        // leave the old end tag where it is</TD></TR><TR CLASS="z"><TD CLASS="l">1317</TD><TD>                        if (element.hasEndTag()) {</TD></TR><TR CLASS="z"><TD CLASS="l">1318</TD><TD>                                Element end = element.removeEndTag();</TD></TR><TR CLASS="z"><TD CLASS="l">1319</TD><TD>                                if (end != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1320</TD><TD>                                        parent.insertBefore(end, newNext);</TD></TR><TR CLASS="z"><TD CLASS="l">1321</TD><TD>                                        if (next == null)</TD></TR><TR CLASS="z"><TD CLASS="l">1322</TD><TD>                                                next = end;</TD></TR><TR><TD CLASS="l">1323</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1324</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">1325</TD><TD>                        if (!element.hasStartTag()) {</TD></TR><TR><TD CLASS="l">1326</TD><TD>                                // implicit element</TD></TR><TR CLASS="z"><TD CLASS="l">1327</TD><TD>                                if (!element.hasChildNodes()) {</TD></TR><TR CLASS="z"><TD CLASS="l">1328</TD><TD>                                        parent.removeChild(element);</TD></TR><TR><TD CLASS="l">1329</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1330</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1331</TD><TD> </TD></TR><TR><TD CLASS="l">1332</TD><TD>                        // update context</TD></TR><TR CLASS="z"><TD CLASS="l">1333</TD><TD>                        if (next == null)</TD></TR><TR CLASS="z"><TD CLASS="l">1334</TD><TD>                                next = newNext;</TD></TR><TR CLASS="z"><TD CLASS="l">1335</TD><TD>                        if (next != null)</TD></TR><TR CLASS="z"><TD CLASS="l">1336</TD><TD>                                this.context.setNextNode(next);</TD></TR><TR><TD CLASS="l">1337</TD><TD>                        else</TD></TR><TR CLASS="z"><TD CLASS="l">1338</TD><TD>                                this.context.setParentNode(parent);</TD></TR><TR><TD CLASS="l">1339</TD><TD>                }</TD></TR><TR><TD CLASS="l">1340</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1341</TD><TD>                insertNode(parent, node, next);</TD></TR><TR CLASS="c"><TD CLASS="l">1342</TD><TD>                next = node.getNextSibling();</TD></TR><TR CLASS="c"><TD CLASS="l">1343</TD><TD>                if (next != null)</TD></TR><TR CLASS="z"><TD CLASS="l">1344</TD><TD>                        this.context.setNextNode(next);</TD></TR><TR><TD CLASS="l">1345</TD><TD>                else</TD></TR><TR CLASS="c"><TD CLASS="l">1346</TD><TD>                        this.context.setParentNode(node.getParentNode());</TD></TR><TR CLASS="c"><TD CLASS="l">1347</TD><TD>        }</TD></TR><TR><TD CLASS="l"><A NAME="24">1348</A></TD><TD> </TD></TR><TR><TD CLASS="l">1349</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1350</TD><TD>         */</TD></TR><TR><TD CLASS="l">1351</TD><TD>        private void insertNode(Node parent, Node node, Node next) {</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="43% line coverage (3 out of 7 instructions)">1352</TD><TD TITLE="43% line coverage (3 out of 7 instructions)">                while (next != null &amp;&amp; next.getNodeType() == Node.ELEMENT_NODE) {</TD></TR><TR CLASS="z"><TD CLASS="l">1353</TD><TD>                        ElementImpl nextElement = (ElementImpl) next;</TD></TR><TR CLASS="z"><TD CLASS="l">1354</TD><TD>                        if (nextElement.hasStartTag())</TD></TR><TR CLASS="z"><TD CLASS="l">1355</TD><TD>                                break;</TD></TR><TR CLASS="z"><TD CLASS="l">1356</TD><TD>                        if (!canBeImplicitTag(nextElement, node))</TD></TR><TR CLASS="z"><TD CLASS="l">1357</TD><TD>                                break;</TD></TR><TR CLASS="z"><TD CLASS="l">1358</TD><TD>                        parent = nextElement;</TD></TR><TR CLASS="z"><TD CLASS="l">1359</TD><TD>                        next = nextElement.getFirstChild();</TD></TR><TR><TD CLASS="l">1360</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">1361</TD><TD>                Element implicitElement = createImplicitElement(parent, node);</TD></TR><TR CLASS="c"><TD CLASS="l">1362</TD><TD>                if (implicitElement != null)</TD></TR><TR CLASS="z"><TD CLASS="l">1363</TD><TD>                        node = implicitElement;</TD></TR><TR CLASS="c"><TD CLASS="l">1364</TD><TD>                parent.insertBefore(node, next);</TD></TR><TR CLASS="c"><TD CLASS="l">1365</TD><TD>        }</TD></TR><TR><TD CLASS="l">1366</TD><TD> </TD></TR><TR><TD CLASS="l">1367</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="31">1368</A></TD><TD>         * insertPI method</TD></TR><TR><TD CLASS="l">1369</TD><TD>         * </TD></TR><TR><TD CLASS="l">1370</TD><TD>         */</TD></TR><TR><TD CLASS="l">1371</TD><TD>        private void insertPI(IStructuredDocumentRegion flatNode) {</TD></TR><TR CLASS="c"><TD CLASS="l">1372</TD><TD>                ITextRegionList regions = flatNode.getRegions();</TD></TR><TR CLASS="c"><TD CLASS="l">1373</TD><TD>                if (regions == null)</TD></TR><TR CLASS="z"><TD CLASS="l">1374</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">1375</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1376</TD><TD>                String target = null;</TD></TR><TR CLASS="c"><TD CLASS="l">1377</TD><TD>                Iterator e = regions.iterator();</TD></TR><TR CLASS="c"><TD CLASS="l">1378</TD><TD>                while (e.hasNext()) {</TD></TR><TR CLASS="c"><TD CLASS="l">1379</TD><TD>                        ITextRegion region = (ITextRegion) e.next();</TD></TR><TR CLASS="c"><TD CLASS="l">1380</TD><TD>                        String regionType = region.getType();</TD></TR><TR CLASS="c"><TD CLASS="l">1381</TD><TD>                        if (regionType == DOMRegionContext.XML_PI_OPEN || regionType == DOMRegionContext.XML_PI_CLOSE)</TD></TR><TR CLASS="c"><TD CLASS="l">1382</TD><TD>                                continue;</TD></TR><TR CLASS="c"><TD CLASS="l">1383</TD><TD>                        if (target == null)</TD></TR><TR CLASS="c"><TD CLASS="l">1384</TD><TD>                                target = flatNode.getText(region);</TD></TR><TR><TD CLASS="l">1385</TD><TD>                }</TD></TR><TR><TD CLASS="l">1386</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1387</TD><TD>                ProcessingInstructionImpl pi = (ProcessingInstructionImpl) this.model.getDocument().createProcessingInstruction(target, null);</TD></TR><TR CLASS="c"><TD CLASS="l">1388</TD><TD>                if (pi == null)</TD></TR><TR CLASS="z"><TD CLASS="l">1389</TD><TD>                        return;</TD></TR><TR CLASS="c"><TD CLASS="l">1390</TD><TD>                pi.setStructuredDocumentRegion(flatNode);</TD></TR><TR CLASS="c"><TD CLASS="l">1391</TD><TD>                insertNode(pi);</TD></TR><TR CLASS="c"><TD CLASS="l">1392</TD><TD>        }</TD></TR><TR><TD CLASS="l">1393</TD><TD> </TD></TR><TR><TD CLASS="l">1394</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1395</TD><TD>         * insertStartTag method can be used by subclasses, but not overridden.</TD></TR><TR><TD CLASS="l">1396</TD><TD>         * </TD></TR><TR><TD CLASS="l"><A NAME="2f">1397</A></TD><TD>         * @param element</TD></TR><TR><TD CLASS="l">1398</TD><TD>         *            org.w3c.dom.Element</TD></TR><TR><TD CLASS="l">1399</TD><TD>         */</TD></TR><TR><TD CLASS="l">1400</TD><TD>        protected void insertStartTag(Element element) {</TD></TR><TR CLASS="c"><TD CLASS="l">1401</TD><TD>                if (element == null)</TD></TR><TR CLASS="z"><TD CLASS="l">1402</TD><TD>                        return;</TD></TR><TR CLASS="c"><TD CLASS="l">1403</TD><TD>                if (this.context == null)</TD></TR><TR CLASS="z"><TD CLASS="l">1404</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">1405</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1406</TD><TD>                insertNode(element);</TD></TR><TR><TD CLASS="l">1407</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1408</TD><TD>                ElementImpl newElement = (ElementImpl) element;</TD></TR><TR CLASS="c"><TD CLASS="l">1409</TD><TD>                if (newElement.isEmptyTag() || !newElement.isContainer())</TD></TR><TR CLASS="c"><TD CLASS="l">1410</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">1411</TD><TD> </TD></TR><TR><TD CLASS="l">1412</TD><TD>                // demote siblings</TD></TR><TR CLASS="c"><TD CLASS="l">1413</TD><TD>                Node parent = this.context.getParentNode();</TD></TR><TR CLASS="c"><TD CLASS="l">1414</TD><TD>                if (parent == null)</TD></TR><TR CLASS="z"><TD CLASS="l">1415</TD><TD>                        return; // error</TD></TR><TR CLASS="c"><TD CLASS="l">1416</TD><TD>                Node next = this.context.getNextNode();</TD></TR><TR CLASS="c"><TD CLASS="l">1417</TD><TD>                demoteNodes(element, element, parent, next);</TD></TR><TR><TD CLASS="l">1418</TD><TD> </TD></TR><TR><TD CLASS="l">1419</TD><TD>                // update context</TD></TR><TR CLASS="c"><TD CLASS="l">1420</TD><TD>                Node firstChild = element.getFirstChild();</TD></TR><TR CLASS="c"><TD CLASS="l">1421</TD><TD>                if (firstChild != null)</TD></TR><TR CLASS="z"><TD CLASS="l">1422</TD><TD>                        this.context.setNextNode(firstChild);</TD></TR><TR><TD CLASS="l">1423</TD><TD>                else</TD></TR><TR CLASS="c"><TD CLASS="l">1424</TD><TD>                        this.context.setParentNode(element);</TD></TR><TR CLASS="c"><TD CLASS="l">1425</TD><TD>        }</TD></TR><TR><TD CLASS="l">1426</TD><TD> </TD></TR><TR><TD CLASS="l">1427</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="30">1428</A></TD><TD>         * insertStartTag method</TD></TR><TR><TD CLASS="l">1429</TD><TD>         * </TD></TR><TR><TD CLASS="l">1430</TD><TD>         */</TD></TR><TR><TD CLASS="l">1431</TD><TD>        private void insertStartTag(IStructuredDocumentRegion flatNode) {</TD></TR><TR CLASS="c"><TD CLASS="l">1432</TD><TD>                ITextRegionList regions = flatNode.getRegions();</TD></TR><TR CLASS="c"><TD CLASS="l">1433</TD><TD>                if (regions == null)</TD></TR><TR CLASS="z"><TD CLASS="l">1434</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">1435</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1436</TD><TD>                String tagName = null;</TD></TR><TR CLASS="c"><TD CLASS="l">1437</TD><TD>                boolean isEmptyTag = false;</TD></TR><TR CLASS="c"><TD CLASS="l">1438</TD><TD>                AttrImpl attr = null;</TD></TR><TR CLASS="c"><TD CLASS="l">1439</TD><TD>                List attrNodes = null;</TD></TR><TR CLASS="c"><TD CLASS="l">1440</TD><TD>                Iterator e = regions.iterator();</TD></TR><TR CLASS="c"><TD CLASS="l">1441</TD><TD>                while (e.hasNext()) {</TD></TR><TR CLASS="c"><TD CLASS="l">1442</TD><TD>                        ITextRegion region = (ITextRegion) e.next();</TD></TR><TR CLASS="c"><TD CLASS="l">1443</TD><TD>                        String regionType = region.getType();</TD></TR><TR CLASS="c"><TD CLASS="l">1444</TD><TD>                        if (regionType == DOMRegionContext.XML_TAG_NAME || isNestedTagName(regionType)) {</TD></TR><TR CLASS="c"><TD CLASS="l">1445</TD><TD>                                if (tagName == null)</TD></TR><TR CLASS="c"><TD CLASS="l">1446</TD><TD>                                        tagName = flatNode.getText(region);</TD></TR><TR><TD CLASS="l">1447</TD><TD>                        }</TD></TR><TR CLASS="c"><TD CLASS="l">1448</TD><TD>                        else if (regionType == DOMRegionContext.XML_EMPTY_TAG_CLOSE) {</TD></TR><TR CLASS="c"><TD CLASS="l">1449</TD><TD>                                isEmptyTag = true;</TD></TR><TR><TD CLASS="l">1450</TD><TD>                        }</TD></TR><TR CLASS="c"><TD CLASS="l">1451</TD><TD>                        else if (regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME) {</TD></TR><TR CLASS="c"><TD CLASS="l">1452</TD><TD>                                String name = flatNode.getText(region);</TD></TR><TR CLASS="c"><TD CLASS="l">1453</TD><TD>                                attr = (AttrImpl) this.model.getDocument().createAttribute(name);</TD></TR><TR CLASS="c"><TD CLASS="l">1454</TD><TD>                                if (attr != null) {</TD></TR><TR CLASS="c"><TD CLASS="l">1455</TD><TD>                                        attr.setNameRegion(region);</TD></TR><TR CLASS="c"><TD CLASS="l">1456</TD><TD>                                        if (attrNodes == null)</TD></TR><TR CLASS="c"><TD CLASS="l">1457</TD><TD>                                                attrNodes = new ArrayList();</TD></TR><TR CLASS="c"><TD CLASS="l">1458</TD><TD>                                        attrNodes.add(attr);</TD></TR><TR><TD CLASS="l">1459</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1460</TD><TD>                        }</TD></TR><TR CLASS="c"><TD CLASS="l">1461</TD><TD>                        else if (regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS) {</TD></TR><TR CLASS="c"><TD CLASS="l">1462</TD><TD>                                if (attr != null) {</TD></TR><TR CLASS="c"><TD CLASS="l">1463</TD><TD>                                        attr.setEqualRegion(region);</TD></TR><TR><TD CLASS="l">1464</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1465</TD><TD>                        }</TD></TR><TR CLASS="c"><TD CLASS="l">1466</TD><TD>                        else if (regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE) {</TD></TR><TR CLASS="c"><TD CLASS="l">1467</TD><TD>                                if (attr != null) {</TD></TR><TR CLASS="c"><TD CLASS="l">1468</TD><TD>                                        attr.setValueRegion(region);</TD></TR><TR CLASS="c"><TD CLASS="l">1469</TD><TD>                                        attr = null;</TD></TR><TR><TD CLASS="l">1470</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1471</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1472</TD><TD>                }</TD></TR><TR><TD CLASS="l">1473</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1474</TD><TD>                if (tagName == null) { // invalid start tag</TD></TR><TR CLASS="c"><TD CLASS="l">1475</TD><TD>                        insertText(flatNode); // regard as invalid text</TD></TR><TR CLASS="c"><TD CLASS="l">1476</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">1477</TD><TD>                }</TD></TR><TR><TD CLASS="l">1478</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1479</TD><TD>                ElementImpl element = null;</TD></TR><TR><TD CLASS="l">1480</TD><TD>                try {</TD></TR><TR CLASS="c"><TD CLASS="l">1481</TD><TD>                        element = (ElementImpl) this.model.getDocument().createElement(tagName);</TD></TR><TR><TD CLASS="l">1482</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1483</TD><TD>                catch (DOMException ex) {</TD></TR><TR><TD CLASS="l">1484</TD><TD>                        // typically invalid name</TD></TR><TR><TD CLASS="l">1485</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">1486</TD><TD>                if (element == null) { // invalid tag</TD></TR><TR CLASS="z"><TD CLASS="l">1487</TD><TD>                        insertText(flatNode); // regard as invalid text</TD></TR><TR CLASS="z"><TD CLASS="l">1488</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">1489</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">1490</TD><TD>                if (attrNodes != null) {</TD></TR><TR CLASS="c"><TD CLASS="l">1491</TD><TD>                        for (int i = 0; i &lt; attrNodes.size(); i++) {</TD></TR><TR CLASS="c"><TD CLASS="l">1492</TD><TD>                                element.appendAttributeNode((Attr) attrNodes.get(i));</TD></TR><TR><TD CLASS="l">1493</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1494</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">1495</TD><TD>                if (isEmptyTag)</TD></TR><TR CLASS="c"><TD CLASS="l">1496</TD><TD>                        element.setEmptyTag(true);</TD></TR><TR CLASS="c"><TD CLASS="l">1497</TD><TD>                element.setStartStructuredDocumentRegion(flatNode);</TD></TR><TR CLASS="c"><TD CLASS="l">1498</TD><TD>                insertStartTag(element);</TD></TR><TR CLASS="c"><TD CLASS="l">1499</TD><TD>        }</TD></TR><TR><TD CLASS="l">1500</TD><TD> </TD></TR><TR><TD CLASS="l">1501</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="2e">1502</A></TD><TD>         * insertStructuredDocumentRegion method</TD></TR><TR><TD CLASS="l">1503</TD><TD>         * </TD></TR><TR><TD CLASS="l">1504</TD><TD>         */</TD></TR><TR><TD CLASS="l">1505</TD><TD>        protected void insertStructuredDocumentRegion(IStructuredDocumentRegion flatNode) {</TD></TR><TR CLASS="c"><TD CLASS="l">1506</TD><TD>                String regionType = StructuredDocumentRegionUtil.getFirstRegionType(flatNode);</TD></TR><TR CLASS="c"><TD CLASS="l">1507</TD><TD>                if (regionType == DOMRegionContext.XML_TAG_OPEN) {</TD></TR><TR CLASS="c"><TD CLASS="l">1508</TD><TD>                        insertStartTag(flatNode);</TD></TR><TR><TD CLASS="l">1509</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">1510</TD><TD>                else if (regionType == DOMRegionContext.XML_END_TAG_OPEN) {</TD></TR><TR CLASS="c"><TD CLASS="l">1511</TD><TD>                        insertEndTag(flatNode);</TD></TR><TR><TD CLASS="l">1512</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">1513</TD><TD>                else if (regionType == DOMRegionContext.XML_COMMENT_OPEN || isNestedCommentOpen(regionType)) {</TD></TR><TR CLASS="c"><TD CLASS="l">1514</TD><TD>                        insertComment(flatNode);</TD></TR><TR><TD CLASS="l">1515</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">1516</TD><TD>                else if (regionType == DOMRegionContext.XML_ENTITY_REFERENCE || regionType == DOMRegionContext.XML_CHAR_REFERENCE) {</TD></TR><TR CLASS="z"><TD CLASS="l">1517</TD><TD>                        insertEntityRef(flatNode);</TD></TR><TR><TD CLASS="l">1518</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">1519</TD><TD>                else if (regionType == DOMRegionContext.XML_DECLARATION_OPEN) {</TD></TR><TR CLASS="z"><TD CLASS="l">1520</TD><TD>                        insertDecl(flatNode);</TD></TR><TR><TD CLASS="l">1521</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">1522</TD><TD>                else if (regionType == DOMRegionContext.XML_PI_OPEN) {</TD></TR><TR CLASS="c"><TD CLASS="l">1523</TD><TD>                        insertPI(flatNode);</TD></TR><TR><TD CLASS="l">1524</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">1525</TD><TD>                else if (regionType == DOMRegionContext.XML_CDATA_OPEN) {</TD></TR><TR CLASS="z"><TD CLASS="l">1526</TD><TD>                        insertCDATASection(flatNode);</TD></TR><TR><TD CLASS="l">1527</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">1528</TD><TD>                else if (isNestedTag(regionType)) {</TD></TR><TR CLASS="z"><TD CLASS="l">1529</TD><TD>                        insertNestedTag(flatNode);</TD></TR><TR><TD CLASS="l">1530</TD><TD>                }</TD></TR><TR><TD CLASS="l">1531</TD><TD>                else {</TD></TR><TR CLASS="c"><TD CLASS="l">1532</TD><TD>                        insertText(flatNode);</TD></TR><TR><TD CLASS="l"><A NAME="36">1533</A></TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">1534</TD><TD>        }</TD></TR><TR><TD CLASS="l">1535</TD><TD> </TD></TR><TR><TD CLASS="l">1536</TD><TD>        protected boolean isNestedTag(String regionType) {</TD></TR><TR CLASS="c"><TD CLASS="l">1537</TD><TD>                boolean result = false;</TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="35">1538</A></TD><TD>                return result;</TD></TR><TR><TD CLASS="l">1539</TD><TD>        }</TD></TR><TR><TD CLASS="l">1540</TD><TD> </TD></TR><TR><TD CLASS="l">1541</TD><TD>        protected boolean isNestedCommentText(String regionType) {</TD></TR><TR CLASS="c"><TD CLASS="l">1542</TD><TD>                boolean result = false;</TD></TR><TR CLASS="c"><TD CLASS="l">1543</TD><TD>                return result;</TD></TR><TR><TD CLASS="l"><A NAME="34">1544</A></TD><TD>        }</TD></TR><TR><TD CLASS="l">1545</TD><TD> </TD></TR><TR><TD CLASS="l">1546</TD><TD> </TD></TR><TR><TD CLASS="l">1547</TD><TD>        protected boolean isNestedCommentOpen(String regionType) {</TD></TR><TR CLASS="c"><TD CLASS="l">1548</TD><TD>                boolean result = false;</TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="37">1549</A></TD><TD>                return result;</TD></TR><TR><TD CLASS="l">1550</TD><TD>        }</TD></TR><TR><TD CLASS="l">1551</TD><TD> </TD></TR><TR><TD CLASS="l">1552</TD><TD>        protected boolean isNestedTagName(String regionType) {</TD></TR><TR CLASS="c"><TD CLASS="l">1553</TD><TD>                boolean result = false;</TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="15">1554</A></TD><TD>                return result;</TD></TR><TR><TD CLASS="l">1555</TD><TD>        }</TD></TR><TR><TD CLASS="l">1556</TD><TD> </TD></TR><TR><TD CLASS="l">1557</TD><TD>        protected boolean isNestedContent(String regionType) {</TD></TR><TR CLASS="z"><TD CLASS="l">1558</TD><TD>                boolean result = false;</TD></TR><TR CLASS="z"><TD CLASS="l">1559</TD><TD>                return result;</TD></TR><TR><TD CLASS="l">1560</TD><TD>        }</TD></TR><TR><TD CLASS="l">1561</TD><TD> </TD></TR><TR><TD CLASS="l">1562</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1563</TD><TD>         * insertText method Can be called from subclasses, not to be overrided or</TD></TR><TR><TD CLASS="l"><A NAME="32">1564</A></TD><TD>         * re-implemented.</TD></TR><TR><TD CLASS="l">1565</TD><TD>         * </TD></TR><TR><TD CLASS="l">1566</TD><TD>         */</TD></TR><TR><TD CLASS="l">1567</TD><TD>        protected void insertText(IStructuredDocumentRegion flatNode) {</TD></TR><TR CLASS="c"><TD CLASS="l">1568</TD><TD>                TextImpl text = (TextImpl) this.context.findPreviousText();</TD></TR><TR CLASS="c"><TD CLASS="l">1569</TD><TD>                if (text != null) { // existing text found</TD></TR><TR CLASS="c"><TD CLASS="l">1570</TD><TD>                        text.appendStructuredDocumentRegion(flatNode);</TD></TR><TR><TD CLASS="l">1571</TD><TD>                        // notify the change</TD></TR><TR CLASS="c"><TD CLASS="l">1572</TD><TD>                        text.notifyValueChanged();</TD></TR><TR CLASS="c"><TD CLASS="l">1573</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">1574</TD><TD>                }</TD></TR><TR><TD CLASS="l">1575</TD><TD> </TD></TR><TR><TD CLASS="l">1576</TD><TD>                // new text</TD></TR><TR CLASS="c"><TD CLASS="l">1577</TD><TD>                text = (TextImpl) this.model.getDocument().createTextNode(null);</TD></TR><TR CLASS="c"><TD CLASS="l">1578</TD><TD>                if (text == null)</TD></TR><TR CLASS="z"><TD CLASS="l">1579</TD><TD>                        return;</TD></TR><TR CLASS="c"><TD CLASS="l">1580</TD><TD>                text.setStructuredDocumentRegion(flatNode);</TD></TR><TR CLASS="c"><TD CLASS="l">1581</TD><TD>                insertNode(text);</TD></TR><TR CLASS="c"><TD CLASS="l">1582</TD><TD>        }</TD></TR><TR><TD CLASS="l"><A NAME="14">1583</A></TD><TD> </TD></TR><TR><TD CLASS="l">1584</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1585</TD><TD>         */</TD></TR><TR><TD CLASS="l">1586</TD><TD>        protected boolean isEndTag(IDOMElement element) {</TD></TR><TR CLASS="z"><TD CLASS="l">1587</TD><TD>                ModelParserAdapter adapter = getParserAdapter();</TD></TR><TR CLASS="z"><TD CLASS="l">1588</TD><TD>                if (adapter != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1589</TD><TD>                        return adapter.isEndTag(element);</TD></TR><TR><TD CLASS="l">1590</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1591</TD><TD>                return element.isEndTag();</TD></TR><TR><TD CLASS="l">1592</TD><TD>        }</TD></TR><TR><TD CLASS="l"><A NAME="1f">1593</A></TD><TD> </TD></TR><TR><TD CLASS="l">1594</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1595</TD><TD>         */</TD></TR><TR><TD CLASS="l">1596</TD><TD>        private void promoteNodes(Node root, Node newParent, Node newNext, Node oldParent, Node next) {</TD></TR><TR CLASS="c"><TD CLASS="l">1597</TD><TD>                ElementImpl newElement = null;</TD></TR><TR CLASS="c"><TD CLASS="l">1598</TD><TD>                if (newParent.getNodeType() == Node.ELEMENT_NODE) {</TD></TR><TR CLASS="c"><TD CLASS="l">1599</TD><TD>                        newElement = (ElementImpl) newParent;</TD></TR><TR><TD CLASS="l">1600</TD><TD>                }</TD></TR><TR><TD CLASS="l">1601</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1602</TD><TD>                Node rootParent = root.getParentNode();</TD></TR><TR CLASS="c"><TD CLASS="l">1603</TD><TD>                while (oldParent != rootParent) {</TD></TR><TR CLASS="c"><TD CLASS="l">1604</TD><TD>                        while (next != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1605</TD><TD>                                boolean done = false;</TD></TR><TR CLASS="z"><TD CLASS="l">1606</TD><TD>                                boolean endTag = false;</TD></TR><TR CLASS="z"><TD CLASS="l">1607</TD><TD>                                if (next.getNodeType() == Node.ELEMENT_NODE) {</TD></TR><TR CLASS="z"><TD CLASS="l">1608</TD><TD>                                        ElementImpl nextElement = (ElementImpl) next;</TD></TR><TR CLASS="z"><TD CLASS="l">1609</TD><TD>                                        if (!nextElement.hasStartTag()) {</TD></TR><TR CLASS="z"><TD CLASS="l">1610</TD><TD>                                                Node nextChild = nextElement.getFirstChild();</TD></TR><TR CLASS="z"><TD CLASS="l">1611</TD><TD>                                                if (nextChild != null) {</TD></TR><TR><TD CLASS="l">1612</TD><TD>                                                        // promote children</TD></TR><TR CLASS="z"><TD CLASS="l">1613</TD><TD>                                                        next = nextChild;</TD></TR><TR CLASS="z"><TD CLASS="l">1614</TD><TD>                                                        oldParent = nextElement;</TD></TR><TR CLASS="z"><TD CLASS="l">1615</TD><TD>                                                        continue;</TD></TR><TR><TD CLASS="l">1616</TD><TD>                                                }</TD></TR><TR><TD CLASS="l">1617</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1618</TD><TD>                                                if (nextElement.hasEndTag()) {</TD></TR><TR CLASS="z"><TD CLASS="l">1619</TD><TD>                                                        if (nextElement.matchEndTag(newElement)) {</TD></TR><TR CLASS="z"><TD CLASS="l">1620</TD><TD>                                                                endTag = true;</TD></TR><TR><TD CLASS="l">1621</TD><TD>                                                        }</TD></TR><TR><TD CLASS="l">1622</TD><TD>                                                }</TD></TR><TR><TD CLASS="l">1623</TD><TD>                                                else {</TD></TR><TR><TD CLASS="l">1624</TD><TD>                                                        // remove implicit element</TD></TR><TR CLASS="z"><TD CLASS="l">1625</TD><TD>                                                        next = nextElement.getNextSibling();</TD></TR><TR CLASS="z"><TD CLASS="l">1626</TD><TD>                                                        oldParent.removeChild(nextElement);</TD></TR><TR CLASS="z"><TD CLASS="l">1627</TD><TD>                                                        done = true;</TD></TR><TR><TD CLASS="l">1628</TD><TD>                                                }</TD></TR><TR><TD CLASS="l">1629</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">1630</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1631</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1632</TD><TD>                                if (!done) {</TD></TR><TR CLASS="z"><TD CLASS="l">1633</TD><TD>                                        if (!endTag &amp;&amp; newElement != null &amp;&amp; !canContain(newElement, next)) {</TD></TR><TR CLASS="z"><TD CLASS="l">1634</TD><TD>                                                newParent = newElement.getParentNode();</TD></TR><TR CLASS="z"><TD CLASS="l">1635</TD><TD>                                                if (newParent == null)</TD></TR><TR CLASS="z"><TD CLASS="l">1636</TD><TD>                                                        return; // error</TD></TR><TR CLASS="z"><TD CLASS="l">1637</TD><TD>                                                Node elementNext = newElement.getNextSibling();</TD></TR><TR><TD CLASS="l">1638</TD><TD>                                                // promote siblings</TD></TR><TR CLASS="z"><TD CLASS="l">1639</TD><TD>                                                promoteNodes(newElement, newParent, elementNext, newElement, newNext);</TD></TR><TR CLASS="z"><TD CLASS="l">1640</TD><TD>                                                newNext = newElement.getNextSibling();</TD></TR><TR CLASS="z"><TD CLASS="l">1641</TD><TD>                                                if (newParent.getNodeType() == Node.ELEMENT_NODE) {</TD></TR><TR CLASS="z"><TD CLASS="l">1642</TD><TD>                                                        newElement = (ElementImpl) newParent;</TD></TR><TR><TD CLASS="l">1643</TD><TD>                                                }</TD></TR><TR><TD CLASS="l">1644</TD><TD>                                                else {</TD></TR><TR CLASS="z"><TD CLASS="l">1645</TD><TD>                                                        newElement = null;</TD></TR><TR><TD CLASS="l">1646</TD><TD>                                                }</TD></TR><TR CLASS="z"><TD CLASS="l">1647</TD><TD>                                                continue;</TD></TR><TR><TD CLASS="l">1648</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">1649</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1650</TD><TD>                                        Node child = next;</TD></TR><TR CLASS="z"><TD CLASS="l">1651</TD><TD>                                        next = next.getNextSibling();</TD></TR><TR CLASS="z"><TD CLASS="l">1652</TD><TD>                                        oldParent.removeChild(child);</TD></TR><TR CLASS="z"><TD CLASS="l">1653</TD><TD>                                        insertNode(newParent, child, newNext);</TD></TR><TR CLASS="z"><TD CLASS="l">1654</TD><TD>                                        Node childParent = child.getParentNode();</TD></TR><TR CLASS="z"><TD CLASS="l">1655</TD><TD>                                        if (childParent != newParent) {</TD></TR><TR CLASS="z"><TD CLASS="l">1656</TD><TD>                                                newParent = childParent;</TD></TR><TR CLASS="z"><TD CLASS="l">1657</TD><TD>                                                newElement = (ElementImpl) newParent;</TD></TR><TR CLASS="z"><TD CLASS="l">1658</TD><TD>                                                newNext = child.getNextSibling();</TD></TR><TR><TD CLASS="l">1659</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">1660</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1661</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1662</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1663</TD><TD>                        if (oldParent.getNodeType() != Node.ELEMENT_NODE)</TD></TR><TR CLASS="z"><TD CLASS="l">1664</TD><TD>                                return;</TD></TR><TR CLASS="c"><TD CLASS="l">1665</TD><TD>                        ElementImpl oldElement = (ElementImpl) oldParent;</TD></TR><TR CLASS="c"><TD CLASS="l">1666</TD><TD>                        oldParent = oldElement.getParentNode();</TD></TR><TR CLASS="c"><TD CLASS="l">1667</TD><TD>                        if (oldParent == null)</TD></TR><TR CLASS="z"><TD CLASS="l">1668</TD><TD>                                return; // error</TD></TR><TR CLASS="c"><TD CLASS="l">1669</TD><TD>                        next = oldElement.getNextSibling();</TD></TR><TR><TD CLASS="l">1670</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1671</TD><TD>                        if (oldElement.hasEndTag()) {</TD></TR><TR CLASS="z"><TD CLASS="l">1672</TD><TD>                                Element end = null;</TD></TR><TR CLASS="z"><TD CLASS="l">1673</TD><TD>                                if (!oldElement.hasChildNodes() &amp;&amp; !oldElement.hasStartTag()) {</TD></TR><TR CLASS="z"><TD CLASS="l">1674</TD><TD>                                        oldParent.removeChild(oldElement);</TD></TR><TR CLASS="z"><TD CLASS="l">1675</TD><TD>                                        end = oldElement;</TD></TR><TR><TD CLASS="l">1676</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1677</TD><TD>                                else {</TD></TR><TR CLASS="z"><TD CLASS="l">1678</TD><TD>                                        end = oldElement.removeEndTag();</TD></TR><TR><TD CLASS="l">1679</TD><TD>                                }</TD></TR><TR CLASS="z"><TD CLASS="l">1680</TD><TD>                                if (end != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1681</TD><TD>                                        insertNode(newParent, end, newNext);</TD></TR><TR CLASS="z"><TD CLASS="l">1682</TD><TD>                                        Node endParent = end.getParentNode();</TD></TR><TR CLASS="z"><TD CLASS="l">1683</TD><TD>                                        if (endParent != newParent) {</TD></TR><TR CLASS="z"><TD CLASS="l">1684</TD><TD>                                                newParent = endParent;</TD></TR><TR CLASS="z"><TD CLASS="l">1685</TD><TD>                                                newElement = (ElementImpl) newParent;</TD></TR><TR CLASS="z"><TD CLASS="l">1686</TD><TD>                                                newNext = end.getNextSibling();</TD></TR><TR><TD CLASS="l">1687</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">1688</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1689</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1690</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">1691</TD><TD>        }</TD></TR><TR><TD CLASS="l">1692</TD><TD> </TD></TR><TR><TD CLASS="l">1693</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1694</TD><TD>         * removeEndTag method</TD></TR><TR><TD CLASS="l">1695</TD><TD>         * </TD></TR><TR><TD CLASS="l"><A NAME="18">1696</A></TD><TD>         * @param element</TD></TR><TR><TD CLASS="l">1697</TD><TD>         *            org.w3c.dom.Element</TD></TR><TR><TD CLASS="l">1698</TD><TD>         */</TD></TR><TR><TD CLASS="l">1699</TD><TD>        private void removeEndTag(Element element) {</TD></TR><TR CLASS="z"><TD CLASS="l">1700</TD><TD>                if (element == null)</TD></TR><TR CLASS="z"><TD CLASS="l">1701</TD><TD>                        return;</TD></TR><TR CLASS="z"><TD CLASS="l">1702</TD><TD>                if (this.context == null)</TD></TR><TR CLASS="z"><TD CLASS="l">1703</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">1704</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1705</TD><TD>                Node parent = element.getParentNode();</TD></TR><TR CLASS="z"><TD CLASS="l">1706</TD><TD>                if (parent == null)</TD></TR><TR CLASS="z"><TD CLASS="l">1707</TD><TD>                        return; // error</TD></TR><TR><TD CLASS="l">1708</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1709</TD><TD>                if (!((ElementImpl) element).isContainer()) {</TD></TR><TR><TD CLASS="l">1710</TD><TD>                        // just update context</TD></TR><TR CLASS="z"><TD CLASS="l">1711</TD><TD>                        Node elementNext = element.getNextSibling();</TD></TR><TR CLASS="z"><TD CLASS="l">1712</TD><TD>                        if (elementNext != null)</TD></TR><TR CLASS="z"><TD CLASS="l">1713</TD><TD>                                this.context.setNextNode(elementNext);</TD></TR><TR><TD CLASS="l">1714</TD><TD>                        else</TD></TR><TR CLASS="z"><TD CLASS="l">1715</TD><TD>                                this.context.setParentNode(parent);</TD></TR><TR CLASS="z"><TD CLASS="l">1716</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">1717</TD><TD>                }</TD></TR><TR><TD CLASS="l">1718</TD><TD> </TD></TR><TR><TD CLASS="l">1719</TD><TD>                // demote siblings</TD></TR><TR CLASS="z"><TD CLASS="l">1720</TD><TD>                Node next = element.getNextSibling();</TD></TR><TR CLASS="z"><TD CLASS="l">1721</TD><TD>                ElementImpl newElement = (ElementImpl) element;</TD></TR><TR><TD CLASS="l">1722</TD><TD>                // find new parent</TD></TR><TR CLASS="z"><TD CLASS="l">1723</TD><TD>                for (Node last = newElement.getLastChild(); last != null; last = last.getLastChild()) {</TD></TR><TR CLASS="z"><TD CLASS="l">1724</TD><TD>                        if (last.getNodeType() != Node.ELEMENT_NODE)</TD></TR><TR CLASS="z"><TD CLASS="l">1725</TD><TD>                                break;</TD></TR><TR CLASS="z"><TD CLASS="l">1726</TD><TD>                        ElementImpl lastElement = (ElementImpl) last;</TD></TR><TR CLASS="z"><TD CLASS="l">1727</TD><TD>                        if (lastElement.hasEndTag() || lastElement.isEmptyTag() || !lastElement.isContainer())</TD></TR><TR CLASS="z"><TD CLASS="l">1728</TD><TD>                                break;</TD></TR><TR CLASS="z"><TD CLASS="l">1729</TD><TD>                        newElement = lastElement;</TD></TR><TR><TD CLASS="l">1730</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1731</TD><TD>                Node lastChild = newElement.getLastChild();</TD></TR><TR CLASS="z"><TD CLASS="l">1732</TD><TD>                demoteNodes(element, newElement, parent, next);</TD></TR><TR><TD CLASS="l">1733</TD><TD> </TD></TR><TR><TD CLASS="l">1734</TD><TD>                // update context</TD></TR><TR CLASS="z"><TD CLASS="l">1735</TD><TD>                Node newNext = null;</TD></TR><TR CLASS="z"><TD CLASS="l">1736</TD><TD>                if (lastChild != null)</TD></TR><TR CLASS="z"><TD CLASS="l">1737</TD><TD>                        newNext = lastChild.getNextSibling();</TD></TR><TR><TD CLASS="l">1738</TD><TD>                else</TD></TR><TR CLASS="z"><TD CLASS="l">1739</TD><TD>                        newNext = newElement.getFirstChild();</TD></TR><TR CLASS="z"><TD CLASS="l">1740</TD><TD>                if (newNext != null)</TD></TR><TR CLASS="z"><TD CLASS="l">1741</TD><TD>                        this.context.setNextNode(newNext);</TD></TR><TR><TD CLASS="l">1742</TD><TD>                else</TD></TR><TR CLASS="z"><TD CLASS="l">1743</TD><TD>                        this.context.setParentNode(newElement);</TD></TR><TR CLASS="z"><TD CLASS="l">1744</TD><TD>        }</TD></TR><TR><TD CLASS="l">1745</TD><TD> </TD></TR><TR><TD CLASS="l">1746</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="19">1747</A></TD><TD>         * Remove the specified node if it is no longer required implicit tag with</TD></TR><TR><TD CLASS="l">1748</TD><TD>         * remaining child nodes promoted.</TD></TR><TR><TD CLASS="l">1749</TD><TD>         */</TD></TR><TR><TD CLASS="l">1750</TD><TD>        private Element removeImplicitElement(Node parent) {</TD></TR><TR CLASS="z"><TD CLASS="l">1751</TD><TD>                if (parent == null)</TD></TR><TR CLASS="z"><TD CLASS="l">1752</TD><TD>                        return null;</TD></TR><TR CLASS="z"><TD CLASS="l">1753</TD><TD>                if (parent.getNodeType() != Node.ELEMENT_NODE)</TD></TR><TR CLASS="z"><TD CLASS="l">1754</TD><TD>                        return null;</TD></TR><TR CLASS="z"><TD CLASS="l">1755</TD><TD>                ElementImpl element = (ElementImpl) parent;</TD></TR><TR CLASS="z"><TD CLASS="l">1756</TD><TD>                if (!element.isImplicitTag())</TD></TR><TR CLASS="z"><TD CLASS="l">1757</TD><TD>                        return null;</TD></TR><TR CLASS="z"><TD CLASS="l">1758</TD><TD>                if (canBeImplicitTag(element))</TD></TR><TR CLASS="z"><TD CLASS="l">1759</TD><TD>                        return null;</TD></TR><TR><TD CLASS="l">1760</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1761</TD><TD>                Node elementParent = element.getParentNode();</TD></TR><TR CLASS="z"><TD CLASS="l">1762</TD><TD>                if (elementParent == null)</TD></TR><TR CLASS="z"><TD CLASS="l">1763</TD><TD>                        return null; // error</TD></TR><TR CLASS="z"><TD CLASS="l">1764</TD><TD>                Node firstChild = element.getFirstChild();</TD></TR><TR CLASS="z"><TD CLASS="l">1765</TD><TD>                Node child = firstChild;</TD></TR><TR CLASS="z"><TD CLASS="l">1766</TD><TD>                Node elementNext = element.getNextSibling();</TD></TR><TR CLASS="z"><TD CLASS="l">1767</TD><TD>                while (child != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1768</TD><TD>                        Node nextChild = child.getNextSibling();</TD></TR><TR CLASS="z"><TD CLASS="l">1769</TD><TD>                        element.removeChild(child);</TD></TR><TR CLASS="z"><TD CLASS="l">1770</TD><TD>                        elementParent.insertBefore(child, elementNext);</TD></TR><TR CLASS="z"><TD CLASS="l">1771</TD><TD>                        child = nextChild;</TD></TR><TR><TD CLASS="l">1772</TD><TD>                }</TD></TR><TR><TD CLASS="l">1773</TD><TD> </TD></TR><TR><TD CLASS="l">1774</TD><TD>                // reset context</TD></TR><TR CLASS="z"><TD CLASS="l">1775</TD><TD>                if (this.context.getParentNode() == element) {</TD></TR><TR CLASS="z"><TD CLASS="l">1776</TD><TD>                        Node oldNext = this.context.getNextNode();</TD></TR><TR CLASS="z"><TD CLASS="l">1777</TD><TD>                        if (oldNext != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1778</TD><TD>                                this.context.setNextNode(oldNext);</TD></TR><TR><TD CLASS="l">1779</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1780</TD><TD>                        else {</TD></TR><TR CLASS="z"><TD CLASS="l">1781</TD><TD>                                if (elementNext != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1782</TD><TD>                                        this.context.setNextNode(elementNext);</TD></TR><TR><TD CLASS="l">1783</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1784</TD><TD>                                else {</TD></TR><TR CLASS="z"><TD CLASS="l">1785</TD><TD>                                        this.context.setParentNode(elementParent);</TD></TR><TR><TD CLASS="l">1786</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1787</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1788</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1789</TD><TD>                else if (this.context.getNextNode() == element) {</TD></TR><TR CLASS="z"><TD CLASS="l">1790</TD><TD>                        if (firstChild != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1791</TD><TD>                                this.context.setNextNode(firstChild);</TD></TR><TR><TD CLASS="l">1792</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1793</TD><TD>                        else {</TD></TR><TR CLASS="z"><TD CLASS="l">1794</TD><TD>                                if (elementNext != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1795</TD><TD>                                        this.context.setNextNode(elementNext);</TD></TR><TR><TD CLASS="l">1796</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1797</TD><TD>                                else {</TD></TR><TR CLASS="z"><TD CLASS="l">1798</TD><TD>                                        this.context.setParentNode(elementParent);</TD></TR><TR><TD CLASS="l">1799</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1800</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1801</TD><TD>                }</TD></TR><TR><TD CLASS="l">1802</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1803</TD><TD>                removeNode(element);</TD></TR><TR CLASS="z"><TD CLASS="l">1804</TD><TD>                return element;</TD></TR><TR><TD CLASS="l">1805</TD><TD>        }</TD></TR><TR><TD CLASS="l">1806</TD><TD> </TD></TR><TR><TD CLASS="l">1807</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1808</TD><TD>         * removeNode method</TD></TR><TR><TD CLASS="l">1809</TD><TD>         * </TD></TR><TR><TD CLASS="l"><A NAME="1a">1810</A></TD><TD>         * @param node</TD></TR><TR><TD CLASS="l">1811</TD><TD>         *            org.w3c.dom.Node</TD></TR><TR><TD CLASS="l">1812</TD><TD>         */</TD></TR><TR><TD CLASS="l">1813</TD><TD>        private void removeNode(Node node) {</TD></TR><TR CLASS="z"><TD CLASS="l">1814</TD><TD>                if (node == null)</TD></TR><TR CLASS="z"><TD CLASS="l">1815</TD><TD>                        return;</TD></TR><TR CLASS="z"><TD CLASS="l">1816</TD><TD>                if (this.context == null)</TD></TR><TR CLASS="z"><TD CLASS="l">1817</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">1818</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1819</TD><TD>                Node parent = node.getParentNode();</TD></TR><TR CLASS="z"><TD CLASS="l">1820</TD><TD>                if (parent == null)</TD></TR><TR CLASS="z"><TD CLASS="l">1821</TD><TD>                        return;</TD></TR><TR CLASS="z"><TD CLASS="l">1822</TD><TD>                Node next = node.getNextSibling();</TD></TR><TR CLASS="z"><TD CLASS="l">1823</TD><TD>                Node prev = node.getPreviousSibling();</TD></TR><TR><TD CLASS="l">1824</TD><TD> </TD></TR><TR><TD CLASS="l">1825</TD><TD>                // update context</TD></TR><TR CLASS="z"><TD CLASS="l">1826</TD><TD>                Node oldParent = this.context.getParentNode();</TD></TR><TR CLASS="z"><TD CLASS="l">1827</TD><TD>                if (node == oldParent) {</TD></TR><TR CLASS="z"><TD CLASS="l">1828</TD><TD>                        if (next != null)</TD></TR><TR CLASS="z"><TD CLASS="l">1829</TD><TD>                                this.context.setNextNode(next);</TD></TR><TR><TD CLASS="l">1830</TD><TD>                        else</TD></TR><TR CLASS="z"><TD CLASS="l">1831</TD><TD>                                this.context.setParentNode(parent);</TD></TR><TR><TD CLASS="l">1832</TD><TD>                }</TD></TR><TR><TD CLASS="l">1833</TD><TD>                else {</TD></TR><TR CLASS="z"><TD CLASS="l">1834</TD><TD>                        Node oldNext = this.context.getNextNode();</TD></TR><TR CLASS="z"><TD CLASS="l">1835</TD><TD>                        if (node == oldNext) {</TD></TR><TR CLASS="z"><TD CLASS="l">1836</TD><TD>                                this.context.setNextNode(next);</TD></TR><TR><TD CLASS="l">1837</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1838</TD><TD>                }</TD></TR><TR><TD CLASS="l">1839</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1840</TD><TD>                parent.removeChild(node);</TD></TR><TR><TD CLASS="l">1841</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1842</TD><TD>                if (removeImplicitElement(parent) != null)</TD></TR><TR CLASS="z"><TD CLASS="l">1843</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">1844</TD><TD> </TD></TR><TR><TD CLASS="l">1845</TD><TD>                // demote sibling</TD></TR><TR CLASS="z"><TD CLASS="l">1846</TD><TD>                if (prev != null &amp;&amp; prev.getNodeType() == Node.ELEMENT_NODE) {</TD></TR><TR CLASS="z"><TD CLASS="l">1847</TD><TD>                        ElementImpl newElement = (ElementImpl) prev;</TD></TR><TR CLASS="z"><TD CLASS="l">1848</TD><TD>                        if (!newElement.hasEndTag() &amp;&amp; !newElement.isEmptyTag() &amp;&amp; newElement.isContainer()) {</TD></TR><TR><TD CLASS="l">1849</TD><TD>                                // find new parent</TD></TR><TR CLASS="z"><TD CLASS="l">1850</TD><TD>                                for (Node last = newElement.getLastChild(); last != null; last = last.getLastChild()) {</TD></TR><TR CLASS="z"><TD CLASS="l">1851</TD><TD>                                        if (last.getNodeType() != Node.ELEMENT_NODE)</TD></TR><TR CLASS="z"><TD CLASS="l">1852</TD><TD>                                                break;</TD></TR><TR CLASS="z"><TD CLASS="l">1853</TD><TD>                                        ElementImpl lastElement = (ElementImpl) last;</TD></TR><TR CLASS="z"><TD CLASS="l">1854</TD><TD>                                        if (lastElement.hasEndTag() || lastElement.isEmptyTag() || !lastElement.isContainer())</TD></TR><TR CLASS="z"><TD CLASS="l">1855</TD><TD>                                                break;</TD></TR><TR CLASS="z"><TD CLASS="l">1856</TD><TD>                                        newElement = lastElement;</TD></TR><TR><TD CLASS="l">1857</TD><TD>                                }</TD></TR><TR CLASS="z"><TD CLASS="l">1858</TD><TD>                                Node lastChild = newElement.getLastChild();</TD></TR><TR CLASS="z"><TD CLASS="l">1859</TD><TD>                                demoteNodes(prev, newElement, parent, next);</TD></TR><TR><TD CLASS="l">1860</TD><TD> </TD></TR><TR><TD CLASS="l">1861</TD><TD>                                // update context</TD></TR><TR CLASS="z"><TD CLASS="l">1862</TD><TD>                                Node newNext = null;</TD></TR><TR CLASS="z"><TD CLASS="l">1863</TD><TD>                                if (lastChild != null)</TD></TR><TR CLASS="z"><TD CLASS="l">1864</TD><TD>                                        newNext = lastChild.getNextSibling();</TD></TR><TR><TD CLASS="l">1865</TD><TD>                                else</TD></TR><TR CLASS="z"><TD CLASS="l">1866</TD><TD>                                        newNext = newElement.getFirstChild();</TD></TR><TR CLASS="z"><TD CLASS="l">1867</TD><TD>                                if (newNext != null)</TD></TR><TR CLASS="z"><TD CLASS="l">1868</TD><TD>                                        this.context.setNextNode(newNext);</TD></TR><TR><TD CLASS="l">1869</TD><TD>                                else</TD></TR><TR CLASS="z"><TD CLASS="l">1870</TD><TD>                                        this.context.setParentNode(newElement);</TD></TR><TR><TD CLASS="l">1871</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1872</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1873</TD><TD>        }</TD></TR><TR><TD CLASS="l">1874</TD><TD> </TD></TR><TR><TD CLASS="l">1875</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1876</TD><TD>         * removeStartTag method</TD></TR><TR><TD CLASS="l">1877</TD><TD>         * </TD></TR><TR><TD CLASS="l"><A NAME="1b">1878</A></TD><TD>         * @param element</TD></TR><TR><TD CLASS="l">1879</TD><TD>         *            org.w3c.dom.Element</TD></TR><TR><TD CLASS="l">1880</TD><TD>         */</TD></TR><TR><TD CLASS="l">1881</TD><TD>        private void removeStartTag(Element element) {</TD></TR><TR CLASS="z"><TD CLASS="l">1882</TD><TD>                if (element == null)</TD></TR><TR CLASS="z"><TD CLASS="l">1883</TD><TD>                        return;</TD></TR><TR CLASS="z"><TD CLASS="l">1884</TD><TD>                if (this.context == null)</TD></TR><TR CLASS="z"><TD CLASS="l">1885</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">1886</TD><TD> </TD></TR><TR><TD CLASS="l">1887</TD><TD>                // for implicit tag</TD></TR><TR CLASS="z"><TD CLASS="l">1888</TD><TD>                ElementImpl oldElement = (ElementImpl) element;</TD></TR><TR CLASS="z"><TD CLASS="l">1889</TD><TD>                if (canBeImplicitTag(oldElement)) {</TD></TR><TR CLASS="z"><TD CLASS="l">1890</TD><TD>                        Node newParent = null;</TD></TR><TR CLASS="z"><TD CLASS="l">1891</TD><TD>                        Node prev = oldElement.getPreviousSibling();</TD></TR><TR CLASS="z"><TD CLASS="l">1892</TD><TD>                        if (prev != null &amp;&amp; prev.getNodeType() == Node.ELEMENT_NODE) {</TD></TR><TR CLASS="z"><TD CLASS="l">1893</TD><TD>                                ElementImpl prevElement = (ElementImpl) prev;</TD></TR><TR CLASS="z"><TD CLASS="l">1894</TD><TD>                                if (!prevElement.hasEndTag()) {</TD></TR><TR CLASS="z"><TD CLASS="l">1895</TD><TD>                                        if (prevElement.hasStartTag() || prevElement.matchTagName(oldElement.getTagName())) {</TD></TR><TR CLASS="z"><TD CLASS="l">1896</TD><TD>                                                newParent = prevElement;</TD></TR><TR><TD CLASS="l">1897</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">1898</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1899</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">1900</TD><TD>                        if (newParent == null) {</TD></TR><TR><TD CLASS="l">1901</TD><TD>                                // this element should stay as implicit tag</TD></TR><TR><TD CLASS="l">1902</TD><TD>                                // just remove all attributes</TD></TR><TR CLASS="z"><TD CLASS="l">1903</TD><TD>                                oldElement.removeStartTag();</TD></TR><TR><TD CLASS="l">1904</TD><TD> </TD></TR><TR><TD CLASS="l">1905</TD><TD>                                // update context</TD></TR><TR CLASS="z"><TD CLASS="l">1906</TD><TD>                                Node child = oldElement.getFirstChild();</TD></TR><TR CLASS="z"><TD CLASS="l">1907</TD><TD>                                if (child != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1908</TD><TD>                                        this.context.setNextNode(child);</TD></TR><TR><TD CLASS="l">1909</TD><TD>                                }</TD></TR><TR CLASS="z"><TD CLASS="l">1910</TD><TD>                                else if (oldElement.hasEndTag()) {</TD></TR><TR CLASS="z"><TD CLASS="l">1911</TD><TD>                                        this.context.setParentNode(oldElement);</TD></TR><TR><TD CLASS="l">1912</TD><TD>                                }</TD></TR><TR CLASS="z"><TD CLASS="l">1913</TD><TD>                                return;</TD></TR><TR><TD CLASS="l">1914</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1915</TD><TD>                }</TD></TR><TR><TD CLASS="l">1916</TD><TD>                // for comment tag</TD></TR><TR CLASS="z"><TD CLASS="l">1917</TD><TD>                if (oldElement.isCommentTag())</TD></TR><TR CLASS="z"><TD CLASS="l">1918</TD><TD>                        oldElement.removeStartTag();</TD></TR><TR><TD CLASS="l">1919</TD><TD> </TD></TR><TR><TD CLASS="l">1920</TD><TD>                // promote children</TD></TR><TR CLASS="z"><TD CLASS="l">1921</TD><TD>                Node elementParent = element.getParentNode();</TD></TR><TR CLASS="z"><TD CLASS="l">1922</TD><TD>                Node parent = elementParent;</TD></TR><TR CLASS="z"><TD CLASS="l">1923</TD><TD>                if (parent == null)</TD></TR><TR CLASS="z"><TD CLASS="l">1924</TD><TD>                        return;</TD></TR><TR CLASS="z"><TD CLASS="l">1925</TD><TD>                Node first = element.getFirstChild();</TD></TR><TR CLASS="z"><TD CLASS="l">1926</TD><TD>                Node firstElement = null; // for the case first is removed as end</TD></TR><TR><TD CLASS="l">1927</TD><TD>                // tag</TD></TR><TR CLASS="z"><TD CLASS="l">1928</TD><TD>                if (first != null) {</TD></TR><TR><TD CLASS="l">1929</TD><TD>                        // find new parent for children</TD></TR><TR CLASS="z"><TD CLASS="l">1930</TD><TD>                        ElementImpl newElement = null;</TD></TR><TR CLASS="z"><TD CLASS="l">1931</TD><TD>                        for (Node last = element.getPreviousSibling(); last != null; last = last.getLastChild()) {</TD></TR><TR CLASS="z"><TD CLASS="l">1932</TD><TD>                                if (last.getNodeType() != Node.ELEMENT_NODE)</TD></TR><TR CLASS="z"><TD CLASS="l">1933</TD><TD>                                        break;</TD></TR><TR CLASS="z"><TD CLASS="l">1934</TD><TD>                                ElementImpl lastElement = (ElementImpl) last;</TD></TR><TR CLASS="z"><TD CLASS="l">1935</TD><TD>                                if (lastElement.hasEndTag() || lastElement.isEmptyTag() || !lastElement.isContainer())</TD></TR><TR CLASS="z"><TD CLASS="l">1936</TD><TD>                                        break;</TD></TR><TR CLASS="z"><TD CLASS="l">1937</TD><TD>                                newElement = lastElement;</TD></TR><TR><TD CLASS="l">1938</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">1939</TD><TD>                        Node next = first;</TD></TR><TR CLASS="z"><TD CLASS="l">1940</TD><TD>                        if (newElement != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1941</TD><TD>                                while (next != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1942</TD><TD>                                        if (!newElement.hasEndTag() &amp;&amp; newElement.hasStartTag() &amp;&amp; next.getNodeType() == Node.ELEMENT_NODE) {</TD></TR><TR CLASS="z"><TD CLASS="l">1943</TD><TD>                                                ElementImpl nextElement = (ElementImpl) next;</TD></TR><TR CLASS="z"><TD CLASS="l">1944</TD><TD>                                                if (!nextElement.hasStartTag() &amp;&amp; nextElement.hasEndTag() &amp;&amp; nextElement.matchEndTag(newElement)) {</TD></TR><TR><TD CLASS="l">1945</TD><TD>                                                        // stop at the matched invalid end tag</TD></TR><TR CLASS="z"><TD CLASS="l">1946</TD><TD>                                                        Node elementChild = nextElement.getFirstChild();</TD></TR><TR CLASS="z"><TD CLASS="l">1947</TD><TD>                                                        while (elementChild != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1948</TD><TD>                                                                Node nextChild = elementChild.getNextSibling();</TD></TR><TR CLASS="z"><TD CLASS="l">1949</TD><TD>                                                                nextElement.removeChild(elementChild);</TD></TR><TR CLASS="z"><TD CLASS="l">1950</TD><TD>                                                                newElement.appendChild(elementChild);</TD></TR><TR CLASS="z"><TD CLASS="l">1951</TD><TD>                                                                elementChild = nextChild;</TD></TR><TR><TD CLASS="l">1952</TD><TD>                                                        }</TD></TR><TR><TD CLASS="l">1953</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1954</TD><TD>                                                        next = nextElement.getNextSibling();</TD></TR><TR CLASS="z"><TD CLASS="l">1955</TD><TD>                                                        element.removeChild(nextElement);</TD></TR><TR CLASS="z"><TD CLASS="l">1956</TD><TD>                                                        newElement.addEndTag(nextElement);</TD></TR><TR CLASS="z"><TD CLASS="l">1957</TD><TD>                                                        if (nextElement == first)</TD></TR><TR CLASS="z"><TD CLASS="l">1958</TD><TD>                                                                firstElement = newElement;</TD></TR><TR><TD CLASS="l">1959</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1960</TD><TD>                                                        Node newParent = newElement.getParentNode();</TD></TR><TR CLASS="z"><TD CLASS="l">1961</TD><TD>                                                        if (newParent == parent)</TD></TR><TR CLASS="z"><TD CLASS="l">1962</TD><TD>                                                                break;</TD></TR><TR CLASS="z"><TD CLASS="l">1963</TD><TD>                                                        if (newParent == null || newParent.getNodeType() != Node.ELEMENT_NODE)</TD></TR><TR CLASS="z"><TD CLASS="l">1964</TD><TD>                                                                break; // error</TD></TR><TR CLASS="z"><TD CLASS="l">1965</TD><TD>                                                        newElement = (ElementImpl) newParent;</TD></TR><TR CLASS="z"><TD CLASS="l">1966</TD><TD>                                                        continue;</TD></TR><TR><TD CLASS="l">1967</TD><TD>                                                }</TD></TR><TR><TD CLASS="l">1968</TD><TD>                                        }</TD></TR><TR CLASS="z"><TD CLASS="l">1969</TD><TD>                                        if (!canContain(newElement, next)) {</TD></TR><TR CLASS="z"><TD CLASS="l">1970</TD><TD>                                                Node newParent = newElement.getParentNode();</TD></TR><TR CLASS="z"><TD CLASS="l">1971</TD><TD>                                                if (newParent == parent)</TD></TR><TR CLASS="z"><TD CLASS="l">1972</TD><TD>                                                        break;</TD></TR><TR CLASS="z"><TD CLASS="l">1973</TD><TD>                                                if (newParent == null || newParent.getNodeType() != Node.ELEMENT_NODE)</TD></TR><TR CLASS="z"><TD CLASS="l">1974</TD><TD>                                                        break; // error</TD></TR><TR CLASS="z"><TD CLASS="l">1975</TD><TD>                                                newElement = (ElementImpl) newParent;</TD></TR><TR CLASS="z"><TD CLASS="l">1976</TD><TD>                                                continue;</TD></TR><TR><TD CLASS="l">1977</TD><TD>                                        }</TD></TR><TR CLASS="z"><TD CLASS="l">1978</TD><TD>                                        Node child = next;</TD></TR><TR CLASS="z"><TD CLASS="l">1979</TD><TD>                                        next = next.getNextSibling();</TD></TR><TR CLASS="z"><TD CLASS="l">1980</TD><TD>                                        element.removeChild(child);</TD></TR><TR CLASS="z"><TD CLASS="l">1981</TD><TD>                                        newElement.appendChild(child);</TD></TR><TR><TD CLASS="l">1982</TD><TD>                                }</TD></TR><TR CLASS="z"><TD CLASS="l">1983</TD><TD>                                newElement = null;</TD></TR><TR><TD CLASS="l">1984</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">1985</TD><TD>                        if (parent.getNodeType() == Node.ELEMENT_NODE) {</TD></TR><TR CLASS="z"><TD CLASS="l">1986</TD><TD>                                newElement = (ElementImpl) parent;</TD></TR><TR><TD CLASS="l">1987</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">1988</TD><TD>                        while (next != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1989</TD><TD>                                if (newElement == null || canContain(newElement, next)) {</TD></TR><TR CLASS="z"><TD CLASS="l">1990</TD><TD>                                        Node child = next;</TD></TR><TR CLASS="z"><TD CLASS="l">1991</TD><TD>                                        next = next.getNextSibling();</TD></TR><TR CLASS="z"><TD CLASS="l">1992</TD><TD>                                        element.removeChild(child);</TD></TR><TR CLASS="z"><TD CLASS="l">1993</TD><TD>                                        parent.insertBefore(child, element);</TD></TR><TR CLASS="z"><TD CLASS="l">1994</TD><TD>                                        continue;</TD></TR><TR><TD CLASS="l">1995</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1996</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1997</TD><TD>                                parent = newElement.getParentNode();</TD></TR><TR CLASS="z"><TD CLASS="l">1998</TD><TD>                                if (parent == null)</TD></TR><TR CLASS="z"><TD CLASS="l">1999</TD><TD>                                        return;</TD></TR><TR><TD CLASS="l">2000</TD><TD> </TD></TR><TR><TD CLASS="l">2001</TD><TD>                                // promote siblings</TD></TR><TR CLASS="z"><TD CLASS="l">2002</TD><TD>                                Node newNext = newElement.getNextSibling();</TD></TR><TR CLASS="z"><TD CLASS="l">2003</TD><TD>                                Node child = element;</TD></TR><TR CLASS="z"><TD CLASS="l">2004</TD><TD>                                while (child != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">2005</TD><TD>                                        Node nextChild = child.getNextSibling();</TD></TR><TR CLASS="z"><TD CLASS="l">2006</TD><TD>                                        newElement.removeChild(child);</TD></TR><TR CLASS="z"><TD CLASS="l">2007</TD><TD>                                        parent.insertBefore(child, newNext);</TD></TR><TR CLASS="z"><TD CLASS="l">2008</TD><TD>                                        child = nextChild;</TD></TR><TR><TD CLASS="l">2009</TD><TD>                                }</TD></TR><TR><TD CLASS="l">2010</TD><TD> </TD></TR><TR><TD CLASS="l">2011</TD><TD>                                // leave the old end tag where it is</TD></TR><TR CLASS="z"><TD CLASS="l">2012</TD><TD>                                if (newElement.hasEndTag()) {</TD></TR><TR CLASS="z"><TD CLASS="l">2013</TD><TD>                                        Element end = newElement.removeEndTag();</TD></TR><TR CLASS="z"><TD CLASS="l">2014</TD><TD>                                        if (end != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">2015</TD><TD>                                                parent.insertBefore(end, newNext);</TD></TR><TR><TD CLASS="l">2016</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">2017</TD><TD>                                }</TD></TR><TR CLASS="z"><TD CLASS="l">2018</TD><TD>                                if (!newElement.hasStartTag()) {</TD></TR><TR><TD CLASS="l">2019</TD><TD>                                        // implicit element</TD></TR><TR CLASS="z"><TD CLASS="l">2020</TD><TD>                                        if (!newElement.hasChildNodes()) {</TD></TR><TR CLASS="z"><TD CLASS="l">2021</TD><TD>                                                parent.removeChild(newElement);</TD></TR><TR><TD CLASS="l">2022</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">2023</TD><TD>                                }</TD></TR><TR><TD CLASS="l">2024</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">2025</TD><TD>                                if (parent.getNodeType() == Node.ELEMENT_NODE) {</TD></TR><TR CLASS="z"><TD CLASS="l">2026</TD><TD>                                        newElement = (ElementImpl) parent;</TD></TR><TR><TD CLASS="l">2027</TD><TD>                                }</TD></TR><TR><TD CLASS="l">2028</TD><TD>                                else {</TD></TR><TR CLASS="z"><TD CLASS="l">2029</TD><TD>                                        newElement = null;</TD></TR><TR><TD CLASS="l">2030</TD><TD>                                }</TD></TR><TR><TD CLASS="l">2031</TD><TD>                        }</TD></TR><TR><TD CLASS="l">2032</TD><TD>                }</TD></TR><TR><TD CLASS="l">2033</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">2034</TD><TD>                Node newNext = element;</TD></TR><TR CLASS="z"><TD CLASS="l">2035</TD><TD>                Node startElement = null; // for the case element is removed as end</TD></TR><TR><TD CLASS="l">2036</TD><TD>                // tag</TD></TR><TR CLASS="z"><TD CLASS="l">2037</TD><TD>                if (oldElement.hasEndTag()) {</TD></TR><TR><TD CLASS="l">2038</TD><TD>                        // find new parent for invalid end tag and siblings</TD></TR><TR CLASS="z"><TD CLASS="l">2039</TD><TD>                        ElementImpl newElement = null;</TD></TR><TR CLASS="z"><TD CLASS="l">2040</TD><TD>                        for (Node last = element.getPreviousSibling(); last != null; last = last.getLastChild()) {</TD></TR><TR CLASS="z"><TD CLASS="l">2041</TD><TD>                                if (last.getNodeType() != Node.ELEMENT_NODE)</TD></TR><TR CLASS="z"><TD CLASS="l">2042</TD><TD>                                        break;</TD></TR><TR CLASS="z"><TD CLASS="l">2043</TD><TD>                                ElementImpl lastElement = (ElementImpl) last;</TD></TR><TR CLASS="z"><TD CLASS="l">2044</TD><TD>                                if (lastElement.hasEndTag() || lastElement.isEmptyTag() || !lastElement.isContainer())</TD></TR><TR CLASS="z"><TD CLASS="l">2045</TD><TD>                                        break;</TD></TR><TR CLASS="z"><TD CLASS="l">2046</TD><TD>                                newElement = lastElement;</TD></TR><TR><TD CLASS="l">2047</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">2048</TD><TD>                        if (newElement != null) {</TD></TR><TR><TD CLASS="l">2049</TD><TD>                                // demote invalid end tag and sibling</TD></TR><TR CLASS="z"><TD CLASS="l">2050</TD><TD>                                Node next = element;</TD></TR><TR CLASS="z"><TD CLASS="l">2051</TD><TD>                                while (next != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">2052</TD><TD>                                        if (!newElement.hasEndTag() &amp;&amp; newElement.hasStartTag() &amp;&amp; next.getNodeType() == Node.ELEMENT_NODE) {</TD></TR><TR CLASS="z"><TD CLASS="l">2053</TD><TD>                                                ElementImpl nextElement = (ElementImpl) next;</TD></TR><TR CLASS="z"><TD CLASS="l">2054</TD><TD>                                                if (!nextElement.hasStartTag() &amp;&amp; nextElement.hasEndTag() &amp;&amp; nextElement.matchEndTag(newElement)) {</TD></TR><TR><TD CLASS="l">2055</TD><TD>                                                        // stop at the matched invalid end tag</TD></TR><TR CLASS="z"><TD CLASS="l">2056</TD><TD>                                                        Node elementChild = nextElement.getFirstChild();</TD></TR><TR CLASS="z"><TD CLASS="l">2057</TD><TD>                                                        while (elementChild != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">2058</TD><TD>                                                                Node nextChild = elementChild.getNextSibling();</TD></TR><TR CLASS="z"><TD CLASS="l">2059</TD><TD>                                                                nextElement.removeChild(elementChild);</TD></TR><TR CLASS="z"><TD CLASS="l">2060</TD><TD>                                                                newElement.appendChild(elementChild);</TD></TR><TR CLASS="z"><TD CLASS="l">2061</TD><TD>                                                                elementChild = nextChild;</TD></TR><TR><TD CLASS="l">2062</TD><TD>                                                        }</TD></TR><TR><TD CLASS="l">2063</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">2064</TD><TD>                                                        next = nextElement.getNextSibling();</TD></TR><TR CLASS="z"><TD CLASS="l">2065</TD><TD>                                                        parent.removeChild(nextElement);</TD></TR><TR CLASS="z"><TD CLASS="l">2066</TD><TD>                                                        newElement.addEndTag(nextElement);</TD></TR><TR CLASS="z"><TD CLASS="l">2067</TD><TD>                                                        if (nextElement == newNext)</TD></TR><TR CLASS="z"><TD CLASS="l">2068</TD><TD>                                                                startElement = newElement;</TD></TR><TR><TD CLASS="l">2069</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">2070</TD><TD>                                                        Node newParent = newElement.getParentNode();</TD></TR><TR CLASS="z"><TD CLASS="l">2071</TD><TD>                                                        if (newParent == parent)</TD></TR><TR CLASS="z"><TD CLASS="l">2072</TD><TD>                                                                break;</TD></TR><TR CLASS="z"><TD CLASS="l">2073</TD><TD>                                                        if (newParent == null || newParent.getNodeType() != Node.ELEMENT_NODE)</TD></TR><TR CLASS="z"><TD CLASS="l">2074</TD><TD>                                                                break; // error</TD></TR><TR CLASS="z"><TD CLASS="l">2075</TD><TD>                                                        newElement = (ElementImpl) newParent;</TD></TR><TR CLASS="z"><TD CLASS="l">2076</TD><TD>                                                        continue;</TD></TR><TR><TD CLASS="l">2077</TD><TD>                                                }</TD></TR><TR><TD CLASS="l">2078</TD><TD>                                        }</TD></TR><TR CLASS="z"><TD CLASS="l">2079</TD><TD>                                        if (!canContain(newElement, next)) {</TD></TR><TR CLASS="z"><TD CLASS="l">2080</TD><TD>                                                Node newParent = newElement.getParentNode();</TD></TR><TR CLASS="z"><TD CLASS="l">2081</TD><TD>                                                if (newParent == parent)</TD></TR><TR CLASS="z"><TD CLASS="l">2082</TD><TD>                                                        break;</TD></TR><TR CLASS="z"><TD CLASS="l">2083</TD><TD>                                                if (newParent == null || newParent.getNodeType() != Node.ELEMENT_NODE)</TD></TR><TR CLASS="z"><TD CLASS="l">2084</TD><TD>                                                        break; // error</TD></TR><TR CLASS="z"><TD CLASS="l">2085</TD><TD>                                                newElement = (ElementImpl) newParent;</TD></TR><TR CLASS="z"><TD CLASS="l">2086</TD><TD>                                                continue;</TD></TR><TR><TD CLASS="l">2087</TD><TD>                                        }</TD></TR><TR CLASS="z"><TD CLASS="l">2088</TD><TD>                                        Node child = next;</TD></TR><TR CLASS="z"><TD CLASS="l">2089</TD><TD>                                        next = next.getNextSibling();</TD></TR><TR CLASS="z"><TD CLASS="l">2090</TD><TD>                                        parent.removeChild(child);</TD></TR><TR CLASS="z"><TD CLASS="l">2091</TD><TD>                                        if (child == oldElement) {</TD></TR><TR CLASS="z"><TD CLASS="l">2092</TD><TD>                                                if (!oldElement.isCommentTag()) {</TD></TR><TR><TD CLASS="l">2093</TD><TD>                                                        // clone (re-create) end tag</TD></TR><TR CLASS="z"><TD CLASS="l">2094</TD><TD>                                                        Element end = oldElement.removeEndTag();</TD></TR><TR CLASS="z"><TD CLASS="l">2095</TD><TD>                                                        if (end != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">2096</TD><TD>                                                                child = end;</TD></TR><TR CLASS="z"><TD CLASS="l">2097</TD><TD>                                                                newNext = end;</TD></TR><TR><TD CLASS="l">2098</TD><TD>                                                        }</TD></TR><TR><TD CLASS="l">2099</TD><TD>                                                }</TD></TR><TR><TD CLASS="l">2100</TD><TD>                                        }</TD></TR><TR CLASS="z"><TD CLASS="l">2101</TD><TD>                                        newElement.appendChild(child);</TD></TR><TR><TD CLASS="l">2102</TD><TD>                                }</TD></TR><TR><TD CLASS="l">2103</TD><TD>                        }</TD></TR><TR><TD CLASS="l">2104</TD><TD>                        else {</TD></TR><TR CLASS="z"><TD CLASS="l">2105</TD><TD>                                if (!oldElement.isCommentTag()) {</TD></TR><TR><TD CLASS="l">2106</TD><TD>                                        // clone (re-create) end tag</TD></TR><TR CLASS="z"><TD CLASS="l">2107</TD><TD>                                        Element end = oldElement.removeEndTag();</TD></TR><TR CLASS="z"><TD CLASS="l">2108</TD><TD>                                        if (end != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">2109</TD><TD>                                                parent.insertBefore(end, oldElement);</TD></TR><TR CLASS="z"><TD CLASS="l">2110</TD><TD>                                                parent.removeChild(oldElement);</TD></TR><TR CLASS="z"><TD CLASS="l">2111</TD><TD>                                                newNext = end;</TD></TR><TR><TD CLASS="l">2112</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">2113</TD><TD>                                }</TD></TR><TR><TD CLASS="l">2114</TD><TD>                        }</TD></TR><TR><TD CLASS="l">2115</TD><TD>                }</TD></TR><TR><TD CLASS="l">2116</TD><TD>                else {</TD></TR><TR CLASS="z"><TD CLASS="l">2117</TD><TD>                        newNext = oldElement.getNextSibling();</TD></TR><TR CLASS="z"><TD CLASS="l">2118</TD><TD>                        parent.removeChild(oldElement);</TD></TR><TR><TD CLASS="l">2119</TD><TD>                }</TD></TR><TR><TD CLASS="l">2120</TD><TD> </TD></TR><TR><TD CLASS="l">2121</TD><TD>                // update context</TD></TR><TR CLASS="z"><TD CLASS="l">2122</TD><TD>                Node oldParent = this.context.getParentNode();</TD></TR><TR CLASS="z"><TD CLASS="l">2123</TD><TD>                Node oldNext = this.context.getNextNode();</TD></TR><TR CLASS="z"><TD CLASS="l">2124</TD><TD>                if (element == oldParent) {</TD></TR><TR CLASS="z"><TD CLASS="l">2125</TD><TD>                        if (oldNext != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">2126</TD><TD>                                this.context.setNextNode(oldNext); // reset for new parent</TD></TR><TR><TD CLASS="l">2127</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">2128</TD><TD>                        else if (newNext != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">2129</TD><TD>                                this.context.setNextNode(newNext);</TD></TR><TR><TD CLASS="l">2130</TD><TD>                        }</TD></TR><TR><TD CLASS="l">2131</TD><TD>                        else {</TD></TR><TR CLASS="z"><TD CLASS="l">2132</TD><TD>                                this.context.setParentNode(parent);</TD></TR><TR><TD CLASS="l">2133</TD><TD>                        }</TD></TR><TR><TD CLASS="l">2134</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">2135</TD><TD>                else if (element == oldNext) {</TD></TR><TR CLASS="z"><TD CLASS="l">2136</TD><TD>                        if (firstElement != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">2137</TD><TD>                                this.context.setParentNode(firstElement);</TD></TR><TR><TD CLASS="l">2138</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">2139</TD><TD>                        else if (first != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">2140</TD><TD>                                this.context.setNextNode(first);</TD></TR><TR><TD CLASS="l">2141</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">2142</TD><TD>                        else if (startElement != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">2143</TD><TD>                                this.context.setParentNode(startElement);</TD></TR><TR><TD CLASS="l">2144</TD><TD>                        }</TD></TR><TR><TD CLASS="l">2145</TD><TD>                        else {</TD></TR><TR CLASS="z"><TD CLASS="l">2146</TD><TD>                                this.context.setNextNode(newNext);</TD></TR><TR><TD CLASS="l">2147</TD><TD>                        }</TD></TR><TR><TD CLASS="l">2148</TD><TD>                }</TD></TR><TR><TD CLASS="l">2149</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">2150</TD><TD>                removeImplicitElement(elementParent);</TD></TR><TR CLASS="z"><TD CLASS="l">2151</TD><TD>        }</TD></TR><TR><TD CLASS="l">2152</TD><TD> </TD></TR><TR><TD CLASS="l">2153</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="1c">2154</A></TD><TD>         * removeStructuredDocumentRegion method</TD></TR><TR><TD CLASS="l">2155</TD><TD>         * </TD></TR><TR><TD CLASS="l">2156</TD><TD>         */</TD></TR><TR><TD CLASS="l">2157</TD><TD>        private void removeStructuredDocumentRegion(IStructuredDocumentRegion oldStructuredDocumentRegion) {</TD></TR><TR CLASS="z"><TD CLASS="l">2158</TD><TD>                NodeImpl next = (NodeImpl) this.context.getNextNode();</TD></TR><TR CLASS="z"><TD CLASS="l">2159</TD><TD>                if (next != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">2160</TD><TD>                        short nodeType = next.getNodeType();</TD></TR><TR CLASS="z"><TD CLASS="l">2161</TD><TD>                        if (nodeType != Node.ELEMENT_NODE) {</TD></TR><TR CLASS="z"><TD CLASS="l">2162</TD><TD>                                IStructuredDocumentRegion flatNode = next.getStructuredDocumentRegion();</TD></TR><TR CLASS="z"><TD CLASS="l">2163</TD><TD>                                if (flatNode == oldStructuredDocumentRegion) {</TD></TR><TR CLASS="z"><TD CLASS="l">2164</TD><TD>                                        removeNode(next);</TD></TR><TR CLASS="z"><TD CLASS="l">2165</TD><TD>                                        return;</TD></TR><TR><TD CLASS="l">2166</TD><TD>                                }</TD></TR><TR CLASS="z"><TD CLASS="l">2167</TD><TD>                                if (nodeType != Node.TEXT_NODE) {</TD></TR><TR CLASS="z"><TD CLASS="l">2168</TD><TD>                                        throw new StructuredDocumentRegionManagementException();</TD></TR><TR><TD CLASS="l">2169</TD><TD>                                }</TD></TR><TR CLASS="z"><TD CLASS="l">2170</TD><TD>                                if (flatNode == null) {</TD></TR><TR><TD CLASS="l">2171</TD><TD>                                        // this is the case for empty Text</TD></TR><TR><TD CLASS="l">2172</TD><TD>                                        // remove and continue</TD></TR><TR CLASS="z"><TD CLASS="l">2173</TD><TD>                                        removeNode(next);</TD></TR><TR CLASS="z"><TD CLASS="l">2174</TD><TD>                                        removeStructuredDocumentRegion(oldStructuredDocumentRegion);</TD></TR><TR CLASS="z"><TD CLASS="l">2175</TD><TD>                                        return;</TD></TR><TR><TD CLASS="l">2176</TD><TD>                                }</TD></TR><TR CLASS="z"><TD CLASS="l">2177</TD><TD>                                TextImpl text = (TextImpl) next;</TD></TR><TR CLASS="z"><TD CLASS="l">2178</TD><TD>                                boolean isShared = text.isSharingStructuredDocumentRegion(oldStructuredDocumentRegion);</TD></TR><TR CLASS="z"><TD CLASS="l">2179</TD><TD>                                if (isShared) {</TD></TR><TR><TD CLASS="l">2180</TD><TD>                                        // make sure there is next Text node sharing this</TD></TR><TR CLASS="z"><TD CLASS="l">2181</TD><TD>                                        TextImpl nextText = (TextImpl) this.context.findNextText();</TD></TR><TR CLASS="z"><TD CLASS="l">2182</TD><TD>                                        if (nextText == null || !nextText.hasStructuredDocumentRegion(oldStructuredDocumentRegion)) {</TD></TR><TR CLASS="z"><TD CLASS="l">2183</TD><TD>                                                isShared = false;</TD></TR><TR><TD CLASS="l">2184</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">2185</TD><TD>                                }</TD></TR><TR CLASS="z"><TD CLASS="l">2186</TD><TD>                                oldStructuredDocumentRegion = text.removeStructuredDocumentRegion(oldStructuredDocumentRegion);</TD></TR><TR CLASS="z"><TD CLASS="l">2187</TD><TD>                                if (oldStructuredDocumentRegion == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">2188</TD><TD>                                        throw new StructuredDocumentRegionManagementException();</TD></TR><TR><TD CLASS="l">2189</TD><TD>                                }</TD></TR><TR CLASS="z"><TD CLASS="l">2190</TD><TD>                                if (text.getStructuredDocumentRegion() == null) {</TD></TR><TR><TD CLASS="l">2191</TD><TD>                                        // this is the case partial IStructuredDocumentRegion is</TD></TR><TR><TD CLASS="l">2192</TD><TD>                                        // removed</TD></TR><TR CLASS="z"><TD CLASS="l">2193</TD><TD>                                        removeNode(text);</TD></TR><TR><TD CLASS="l">2194</TD><TD>                                }</TD></TR><TR><TD CLASS="l">2195</TD><TD>                                else {</TD></TR><TR><TD CLASS="l">2196</TD><TD>                                        // notify the change</TD></TR><TR CLASS="z"><TD CLASS="l">2197</TD><TD>                                        text.notifyValueChanged();</TD></TR><TR><TD CLASS="l">2198</TD><TD>                                }</TD></TR><TR><TD CLASS="l">2199</TD><TD>                                // if shared, continue to remove IStructuredDocumentRegion</TD></TR><TR><TD CLASS="l">2200</TD><TD>                                // from them</TD></TR><TR CLASS="z"><TD CLASS="l">2201</TD><TD>                                if (isShared)</TD></TR><TR CLASS="z"><TD CLASS="l">2202</TD><TD>                                        removeStructuredDocumentRegion(oldStructuredDocumentRegion);</TD></TR><TR CLASS="z"><TD CLASS="l">2203</TD><TD>                                return;</TD></TR><TR><TD CLASS="l">2204</TD><TD>                        }</TD></TR><TR><TD CLASS="l">2205</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">2206</TD><TD>                        ElementImpl element = (ElementImpl) next;</TD></TR><TR CLASS="z"><TD CLASS="l">2207</TD><TD>                        if (element.hasStartTag()) {</TD></TR><TR CLASS="z"><TD CLASS="l">2208</TD><TD>                                IStructuredDocumentRegion flatNode = element.getStartStructuredDocumentRegion();</TD></TR><TR CLASS="z"><TD CLASS="l">2209</TD><TD>                                if (flatNode != oldStructuredDocumentRegion) {</TD></TR><TR CLASS="z"><TD CLASS="l">2210</TD><TD>                                        throw new StructuredDocumentRegionManagementException();</TD></TR><TR><TD CLASS="l">2211</TD><TD>                                }</TD></TR><TR CLASS="z"><TD CLASS="l">2212</TD><TD>                                if (element.hasEndTag() || element.hasChildNodes()) {</TD></TR><TR CLASS="z"><TD CLASS="l">2213</TD><TD>                                        element.setStartStructuredDocumentRegion(null);</TD></TR><TR CLASS="z"><TD CLASS="l">2214</TD><TD>                                        removeStartTag(element);</TD></TR><TR><TD CLASS="l">2215</TD><TD>                                }</TD></TR><TR><TD CLASS="l">2216</TD><TD>                                else {</TD></TR><TR CLASS="z"><TD CLASS="l">2217</TD><TD>                                        removeNode(element);</TD></TR><TR><TD CLASS="l">2218</TD><TD>                                }</TD></TR><TR><TD CLASS="l">2219</TD><TD>                        }</TD></TR><TR><TD CLASS="l">2220</TD><TD>                        else {</TD></TR><TR CLASS="z"><TD CLASS="l">2221</TD><TD>                                Node child = element.getFirstChild();</TD></TR><TR CLASS="z"><TD CLASS="l">2222</TD><TD>                                if (child != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">2223</TD><TD>                                        this.context.setNextNode(child);</TD></TR><TR CLASS="z"><TD CLASS="l">2224</TD><TD>                                        removeStructuredDocumentRegion(oldStructuredDocumentRegion);</TD></TR><TR CLASS="z"><TD CLASS="l">2225</TD><TD>                                        return;</TD></TR><TR><TD CLASS="l">2226</TD><TD>                                }</TD></TR><TR><TD CLASS="l">2227</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">2228</TD><TD>                                if (!element.hasEndTag()) {</TD></TR><TR><TD CLASS="l">2229</TD><TD>                                        // implicit element</TD></TR><TR CLASS="z"><TD CLASS="l">2230</TD><TD>                                        removeNode(element);</TD></TR><TR CLASS="z"><TD CLASS="l">2231</TD><TD>                                        removeStructuredDocumentRegion(oldStructuredDocumentRegion);</TD></TR><TR CLASS="z"><TD CLASS="l">2232</TD><TD>                                        return;</TD></TR><TR><TD CLASS="l">2233</TD><TD>                                }</TD></TR><TR><TD CLASS="l">2234</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">2235</TD><TD>                                IStructuredDocumentRegion flatNode = element.getEndStructuredDocumentRegion();</TD></TR><TR CLASS="z"><TD CLASS="l">2236</TD><TD>                                if (flatNode != oldStructuredDocumentRegion) {</TD></TR><TR CLASS="z"><TD CLASS="l">2237</TD><TD>                                        throw new StructuredDocumentRegionManagementException();</TD></TR><TR><TD CLASS="l">2238</TD><TD>                                }</TD></TR><TR CLASS="z"><TD CLASS="l">2239</TD><TD>                                removeNode(element);</TD></TR><TR><TD CLASS="l">2240</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">2241</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">2242</TD><TD>                }</TD></TR><TR><TD CLASS="l">2243</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">2244</TD><TD>                Node parent = this.context.getParentNode();</TD></TR><TR CLASS="z"><TD CLASS="l">2245</TD><TD>                if (parent == null || parent.getNodeType() != Node.ELEMENT_NODE) {</TD></TR><TR CLASS="z"><TD CLASS="l">2246</TD><TD>                        throw new StructuredDocumentRegionManagementException();</TD></TR><TR><TD CLASS="l">2247</TD><TD>                }</TD></TR><TR><TD CLASS="l">2248</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">2249</TD><TD>                ElementImpl end = (ElementImpl) parent;</TD></TR><TR CLASS="z"><TD CLASS="l">2250</TD><TD>                if (end.hasEndTag()) {</TD></TR><TR CLASS="z"><TD CLASS="l">2251</TD><TD>                        IStructuredDocumentRegion flatNode = end.getEndStructuredDocumentRegion();</TD></TR><TR CLASS="z"><TD CLASS="l">2252</TD><TD>                        if (flatNode != oldStructuredDocumentRegion) {</TD></TR><TR CLASS="z"><TD CLASS="l">2253</TD><TD>                                throw new StructuredDocumentRegionManagementException();</TD></TR><TR><TD CLASS="l">2254</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">2255</TD><TD>                        if (!end.hasStartTag() &amp;&amp; !end.hasChildNodes()) {</TD></TR><TR CLASS="z"><TD CLASS="l">2256</TD><TD>                                this.context.setNextNode(end);</TD></TR><TR CLASS="z"><TD CLASS="l">2257</TD><TD>                                removeNode(end);</TD></TR><TR><TD CLASS="l">2258</TD><TD>                        }</TD></TR><TR><TD CLASS="l">2259</TD><TD>                        else {</TD></TR><TR CLASS="z"><TD CLASS="l">2260</TD><TD>                                end.setEndStructuredDocumentRegion(null);</TD></TR><TR CLASS="z"><TD CLASS="l">2261</TD><TD>                                removeEndTag(end);</TD></TR><TR><TD CLASS="l">2262</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">2263</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">2264</TD><TD>                }</TD></TR><TR><TD CLASS="l">2265</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">2266</TD><TD>                next = (NodeImpl) end.getNextSibling();</TD></TR><TR CLASS="z"><TD CLASS="l">2267</TD><TD>                if (next != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">2268</TD><TD>                        this.context.setNextNode(next);</TD></TR><TR CLASS="z"><TD CLASS="l">2269</TD><TD>                        removeStructuredDocumentRegion(oldStructuredDocumentRegion);</TD></TR><TR CLASS="z"><TD CLASS="l">2270</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">2271</TD><TD>                }</TD></TR><TR><TD CLASS="l">2272</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">2273</TD><TD>                parent = end.getParentNode();</TD></TR><TR CLASS="z"><TD CLASS="l">2274</TD><TD>                if (parent != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">2275</TD><TD>                        this.context.setParentNode(parent);</TD></TR><TR CLASS="z"><TD CLASS="l">2276</TD><TD>                        removeStructuredDocumentRegion(oldStructuredDocumentRegion);</TD></TR><TR CLASS="z"><TD CLASS="l">2277</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">2278</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">2279</TD><TD>        }</TD></TR><TR><TD CLASS="l">2280</TD><TD> </TD></TR><TR><TD CLASS="l">2281</TD><TD>        /**</TD></TR><TR><TD CLASS="l">2282</TD><TD>         * replaceRegions method</TD></TR><TR><TD CLASS="l">2283</TD><TD>         * </TD></TR><TR><TD CLASS="l">2284</TD><TD>         * @param newRegions</TD></TR><TR><TD CLASS="l">2285</TD><TD>         *            java.util.Vector</TD></TR><TR><TD CLASS="l"><A NAME="1d">2286</A></TD><TD>         * @param oldRegions</TD></TR><TR><TD CLASS="l">2287</TD><TD>         *            java.util.Vector</TD></TR><TR><TD CLASS="l">2288</TD><TD>         */</TD></TR><TR><TD CLASS="l">2289</TD><TD>        void replaceRegions(IStructuredDocumentRegion flatNode, ITextRegionList newRegions, ITextRegionList oldRegions) {</TD></TR><TR CLASS="z"><TD CLASS="l">2290</TD><TD>                if (flatNode == null)</TD></TR><TR CLASS="z"><TD CLASS="l">2291</TD><TD>                        return;</TD></TR><TR CLASS="z"><TD CLASS="l">2292</TD><TD>                if (this.model.getDocument() == null)</TD></TR><TR CLASS="z"><TD CLASS="l">2293</TD><TD>                        return;</TD></TR><TR CLASS="z"><TD CLASS="l">2294</TD><TD>                this.context = new XMLModelContext(this.model.getDocument());</TD></TR><TR><TD CLASS="l">2295</TD><TD> </TD></TR><TR><TD CLASS="l">2296</TD><TD>                // optimize typical cases</TD></TR><TR CLASS="z"><TD CLASS="l">2297</TD><TD>                String regionType = StructuredDocumentRegionUtil.getFirstRegionType(flatNode);</TD></TR><TR CLASS="z"><TD CLASS="l">2298</TD><TD>                if (regionType == DOMRegionContext.XML_TAG_OPEN) {</TD></TR><TR CLASS="z"><TD CLASS="l">2299</TD><TD>                        changeStartTag(flatNode, newRegions, oldRegions);</TD></TR><TR><TD CLASS="l">2300</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">2301</TD><TD>                else if (regionType == DOMRegionContext.XML_END_TAG_OPEN) {</TD></TR><TR CLASS="z"><TD CLASS="l">2302</TD><TD>                        changeEndTag(flatNode, newRegions, oldRegions);</TD></TR><TR><TD CLASS="l">2303</TD><TD>                }</TD></TR><TR><TD CLASS="l">2304</TD><TD>                else {</TD></TR><TR CLASS="z"><TD CLASS="l">2305</TD><TD>                        changeStructuredDocumentRegion(flatNode);</TD></TR><TR><TD CLASS="l">2306</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">2307</TD><TD>        }</TD></TR><TR><TD CLASS="l">2308</TD><TD> </TD></TR><TR><TD CLASS="l">2309</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="2a">2310</A></TD><TD>         * replaceStructuredDocumentRegions method</TD></TR><TR><TD CLASS="l">2311</TD><TD>         * </TD></TR><TR><TD CLASS="l">2312</TD><TD>         */</TD></TR><TR><TD CLASS="l">2313</TD><TD>        void replaceStructuredDocumentRegions(IStructuredDocumentRegionList newStructuredDocumentRegions, IStructuredDocumentRegionList oldStructuredDocumentRegions) {</TD></TR><TR CLASS="c"><TD CLASS="l">2314</TD><TD>                if (this.model.getDocument() == null)</TD></TR><TR CLASS="z"><TD CLASS="l">2315</TD><TD>                        return;</TD></TR><TR CLASS="c"><TD CLASS="l">2316</TD><TD>                this.context = new XMLModelContext(this.model.getDocument());</TD></TR><TR><TD CLASS="l">2317</TD><TD> </TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="94% line coverage (16 out of 17 instructions)">2318</TD><TD TITLE="94% line coverage (16 out of 17 instructions)">                int newCount = (newStructuredDocumentRegions != null ? newStructuredDocumentRegions.getLength() : 0);</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="70% line coverage (7 out of 10 instructions)">2319</TD><TD TITLE="70% line coverage (7 out of 10 instructions)">                int oldCount = (oldStructuredDocumentRegions != null ? oldStructuredDocumentRegions.getLength() : 0);</TD></TR><TR><TD CLASS="l">2320</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">2321</TD><TD>                if (oldCount &gt; 0) {</TD></TR><TR CLASS="z"><TD CLASS="l">2322</TD><TD>                        setupContext(oldStructuredDocumentRegions.item(0));</TD></TR><TR><TD CLASS="l">2323</TD><TD>                        // Node startParent = this.context.getParentNode();</TD></TR><TR><TD CLASS="l">2324</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">2325</TD><TD>                        for (int i = 0; i &lt; oldCount; i++) {</TD></TR><TR CLASS="z"><TD CLASS="l">2326</TD><TD>                                IStructuredDocumentRegion documentRegion = oldStructuredDocumentRegions.item(i);</TD></TR><TR CLASS="z"><TD CLASS="l">2327</TD><TD>                                removeStructuredDocumentRegion(documentRegion);</TD></TR><TR><TD CLASS="l">2328</TD><TD>                        }</TD></TR><TR><TD CLASS="l">2329</TD><TD>                }</TD></TR><TR><TD CLASS="l">2330</TD><TD>                else {</TD></TR><TR CLASS="c"><TD CLASS="l">2331</TD><TD>                        if (newCount == 0)</TD></TR><TR CLASS="z"><TD CLASS="l">2332</TD><TD>                                return;</TD></TR><TR CLASS="c"><TD CLASS="l">2333</TD><TD>                        setupContext(newStructuredDocumentRegions.item(0));</TD></TR><TR><TD CLASS="l">2334</TD><TD>                }</TD></TR><TR><TD CLASS="l">2335</TD><TD>                // make sure the parent is set to deepest level</TD></TR><TR><TD CLASS="l">2336</TD><TD>                // when end tag has been removed</TD></TR><TR CLASS="c"><TD CLASS="l">2337</TD><TD>                this.context.setLast();</TD></TR><TR><TD CLASS="l">2338</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">2339</TD><TD>                if (newCount &gt; 0) {</TD></TR><TR CLASS="c"><TD CLASS="l">2340</TD><TD>                        for (int i = 0; i &lt; newCount; i++) {</TD></TR><TR CLASS="c"><TD CLASS="l">2341</TD><TD>                                IStructuredDocumentRegion documentRegion = newStructuredDocumentRegions.item(i);</TD></TR><TR CLASS="c"><TD CLASS="l">2342</TD><TD>                                insertStructuredDocumentRegion(documentRegion);</TD></TR><TR><TD CLASS="l">2343</TD><TD>                        }</TD></TR><TR><TD CLASS="l">2344</TD><TD>                }</TD></TR><TR><TD CLASS="l">2345</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">2346</TD><TD>                cleanupText();</TD></TR><TR CLASS="c"><TD CLASS="l">2347</TD><TD>                cleanupEndTag();</TD></TR><TR CLASS="c"><TD CLASS="l">2348</TD><TD>        }</TD></TR><TR><TD CLASS="l">2349</TD><TD> </TD></TR><TR><TD CLASS="l">2350</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="21">2351</A></TD><TD>         * setupContext method</TD></TR><TR><TD CLASS="l">2352</TD><TD>         * </TD></TR><TR><TD CLASS="l">2353</TD><TD>         */</TD></TR><TR><TD CLASS="l">2354</TD><TD>        private void setupContext(IStructuredDocumentRegion startStructuredDocumentRegion) {</TD></TR><TR CLASS="c"><TD CLASS="l">2355</TD><TD>                int offset = startStructuredDocumentRegion.getStart();</TD></TR><TR CLASS="c"><TD CLASS="l">2356</TD><TD>                if (offset &lt; 0)</TD></TR><TR CLASS="z"><TD CLASS="l">2357</TD><TD>                        return;</TD></TR><TR CLASS="c"><TD CLASS="l">2358</TD><TD>                NodeImpl root = (NodeImpl) this.context.getRootNode();</TD></TR><TR CLASS="c"><TD CLASS="l">2359</TD><TD>                if (root == null)</TD></TR><TR CLASS="z"><TD CLASS="l">2360</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">2361</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">2362</TD><TD>                if (offset == 0) {</TD></TR><TR><TD CLASS="l">2363</TD><TD>                        // at the beginning of document</TD></TR><TR CLASS="c"><TD CLASS="l">2364</TD><TD>                        Node child = root.getFirstChild();</TD></TR><TR CLASS="c"><TD CLASS="l">2365</TD><TD>                        if (child != null)</TD></TR><TR CLASS="z"><TD CLASS="l">2366</TD><TD>                                this.context.setNextNode(child);</TD></TR><TR><TD CLASS="l">2367</TD><TD>                        else</TD></TR><TR CLASS="c"><TD CLASS="l">2368</TD><TD>                                this.context.setParentNode(root);</TD></TR><TR CLASS="c"><TD CLASS="l">2369</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">2370</TD><TD>                }</TD></TR><TR><TD CLASS="l">2371</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">2372</TD><TD>                NodeImpl node = (NodeImpl) root.getNodeAt(offset);</TD></TR><TR CLASS="z"><TD CLASS="l">2373</TD><TD>                if (node == null) {</TD></TR><TR><TD CLASS="l">2374</TD><TD>                        // might be at the end of document</TD></TR><TR CLASS="z"><TD CLASS="l">2375</TD><TD>                        this.context.setParentNode(root);</TD></TR><TR CLASS="z"><TD CLASS="l">2376</TD><TD>                        this.context.setLast();</TD></TR><TR CLASS="z"><TD CLASS="l">2377</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">2378</TD><TD>                }</TD></TR><TR><TD CLASS="l">2379</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">2380</TD><TD>                if (offset == node.getStartOffset()) {</TD></TR><TR CLASS="z"><TD CLASS="l">2381</TD><TD>                        this.context.setNextNode(node);</TD></TR><TR CLASS="z"><TD CLASS="l">2382</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">2383</TD><TD>                }</TD></TR><TR><TD CLASS="l">2384</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">2385</TD><TD>                if (node.getNodeType() == Node.TEXT_NODE) {</TD></TR><TR CLASS="z"><TD CLASS="l">2386</TD><TD>                        TextImpl text = (TextImpl) node;</TD></TR><TR CLASS="z"><TD CLASS="l">2387</TD><TD>                        Text nextText = text.splitText(startStructuredDocumentRegion);</TD></TR><TR><TD CLASS="l">2388</TD><TD>                        // notify the change</TD></TR><TR CLASS="z"><TD CLASS="l">2389</TD><TD>                        text.notifyValueChanged();</TD></TR><TR CLASS="z"><TD CLASS="l">2390</TD><TD>                        if (nextText == null)</TD></TR><TR CLASS="z"><TD CLASS="l">2391</TD><TD>                                return; // error</TD></TR><TR CLASS="z"><TD CLASS="l">2392</TD><TD>                        this.context.setNextNode(nextText);</TD></TR><TR CLASS="z"><TD CLASS="l">2393</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">2394</TD><TD>                }</TD></TR><TR><TD CLASS="l">2395</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">2396</TD><TD>                for (Node child = node.getFirstChild(); child != null; child = child.getNextSibling()) {</TD></TR><TR CLASS="z"><TD CLASS="l">2397</TD><TD>                        if (offset &gt;= ((NodeImpl) child).getEndOffset())</TD></TR><TR CLASS="z"><TD CLASS="l">2398</TD><TD>                                continue;</TD></TR><TR CLASS="z"><TD CLASS="l">2399</TD><TD>                        this.context.setNextNode(child);</TD></TR><TR CLASS="z"><TD CLASS="l">2400</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">2401</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">2402</TD><TD>                this.context.setParentNode(node);</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="d">2403</A></TD><TD>                this.context.setLast();</TD></TR><TR CLASS="z"><TD CLASS="l">2404</TD><TD>        }</TD></TR><TR><TD CLASS="l">2405</TD><TD> </TD></TR><TR><TD CLASS="l">2406</TD><TD>        protected XMLModelContext getContext() {</TD></TR><TR CLASS="z"><TD CLASS="l">2407</TD><TD>                return context;</TD></TR><TR><TD CLASS="l">2408</TD><TD>        }</TD></TR><TR><TD CLASS="l">2409</TD><TD> </TD></TR><TR><TD CLASS="l">2410</TD><TD>}</TD></TR></TABLE><P></P><TABLE CLASS="hdft" CELLSPACING="0" WIDTH="100%"><TR><TD CLASS="nv">[<A HREF="../xslUnitTestCoverage.html">all classes</A>][<A HREF="85.html">org.eclipse.wst.xml.core.internal.document</A>]</TD></TR><TR><TD CLASS="tl"><A HREF="http://www.eclemma.org/support.html">EMMA 2.0.5312 EclEmma Fix 1</A> (C) Vladimir Roubtsov</TD></TR></TABLE></BODY></HTML>