blob: 4a31b08bd27020ad43e0e5689ec65859f009a746 [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="9f.html">org.eclipse.wst.xml.ui.internal.contentassist</A>]</TD></TR></TABLE><H2>COVERAGE SUMMARY FOR SOURCE FILE [<SPAN CLASS="in">AbstractContentAssistProcessor.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>AbstractContentAssistProcessor.java</TD><TD CLASS="h">67%  (2/3)</TD><TD CLASS="h">58%  (47/81)</TD><TD CLASS="h">33%  (2008/5995)</TD><TD CLASS="h">39%  (438.5/1126)</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">AbstractContentAssistProcessor$DOMJSPRegionContextsPrivateCopy</A></TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/6)</TD><TD CLASS="h">0%   (0/1)</TD></TR><TR><TD CLASS="f"><A HREF="#0">AbstractContentAssistProcessor$DOMJSPRegionContextsPrivateCopy (AbstractConte...</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/6)</TD><TD CLASS="h">0%   (0/1)</TD></TR><TR><TD CLASS="bt"> </TD><TD CLASS="bt"> </TD><TD CLASS="bt"> </TD><TD CLASS="bt"> </TD><TD CLASS="bt"> </TD></TR><TR CLASS="cis"><TD CLASS="f">class <A HREF="#2">AbstractContentAssistProcessor</A></TD><TD>100% (1/1)</TD><TD CLASS="h">57%  (43/76)</TD><TD CLASS="h">33%  (1969/5942)</TD><TD CLASS="h">38%  (428.5/1114)</TD></TR><TR><TD CLASS="f"><A HREF="#3">addCommentProposal (ContentAssistRequest): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/26)</TD><TD CLASS="h">0%   (0/4)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#4">addContent (List, CMContent): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/61)</TD><TD CLASS="h">0%   (0/15)</TD></TR><TR><TD CLASS="f"><A HREF="#5">addDocTypeProposal (ContentAssistRequest): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/44)</TD><TD CLASS="h">0%   (0/8)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#6">addEndTagNameProposals (ContentAssistRequest): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/189)</TD><TD CLASS="h">0%   (0/32)</TD></TR><TR><TD CLASS="f"><A HREF="#7">addEntityProposals (Vector, Properties, String, int, IStructuredDocumentRegio...</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/102)</TD><TD CLASS="h">0%   (0/21)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#8">addPCDATAProposal (String, ContentAssistRequest): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/42)</TD><TD CLASS="h">0%   (0/8)</TD></TR><TR><TD CLASS="f"><A HREF="#9">addStartDocumentProposals (ContentAssistRequest): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/98)</TD><TD CLASS="h">0%   (0/19)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#a">addXMLProposal (ContentAssistRequest): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/33)</TD><TD CLASS="h">0%   (0/4)</TD></TR><TR><TD CLASS="f"><A HREF="#b">attributeInList (IDOMNode, Node, CMNode): boolean</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/113)</TD><TD CLASS="h">0%   (0/24)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#c">computeAttributeProposals (int, String, ITextRegion, IDOMNode, IDOMNode): Con...</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/56)</TD><TD CLASS="h">0%   (0/11)</TD></TR><TR><TD CLASS="f"><A HREF="#d">computeContextInformation (ITextViewer, int): IContextInformation []</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/19)</TD><TD CLASS="h">0%   (0/3)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#e">computeEndTagOpenProposals (int, String, ITextRegion, IDOMNode, IDOMNode): Co...</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/92)</TD><TD CLASS="h">0%   (0/16)</TD></TR><TR><TD CLASS="f"><A HREF="#f">computeEqualsProposals (int, String, ITextRegion, IDOMNode, IDOMNode): Conten...</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/56)</TD><TD CLASS="h">0%   (0/8)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#10">computeStartDocumentProposals (int, String, ITextRegion, IDOMNode, IDOMNode):...</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/19)</TD><TD CLASS="h">0%   (0/4)</TD></TR><TR><TD CLASS="f"><A HREF="#11">computeTagNameProposals (int, String, ITextRegion, IDOMNode, IDOMNode): Conte...</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/239)</TD><TD CLASS="h">0%   (0/32)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#12">getAvailableRootChildren (Document, int): List</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/207)</TD><TD CLASS="h">0%   (0/32)</TD></TR><TR><TD CLASS="f"><A HREF="#13">getCompletionProposalAutoActivationCharacters (): char []</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="#14">getContextInformationAutoActivationCharacters (): char []</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="#15">getContextInformationValidator (): IContextInformationValidator</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/11)</TD><TD CLASS="h">0%   (0/3)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#16">getNameRegion (IStructuredDocumentRegion): ITextRegion</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/24)</TD><TD CLASS="h">0%   (0/8)</TD></TR><TR><TD CLASS="f"><A HREF="#17">getTagName (IStructuredDocumentRegion): String</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/30)</TD><TD CLASS="h">0%   (0/9)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#18">init (): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/1)</TD></TR><TR><TD CLASS="f"><A HREF="#19">isCursorAfterXMLPI (ContentAssistRequest): boolean</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/66)</TD><TD CLASS="h">0%   (0/16)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#1a">isNameRegion (ITextRegion): boolean</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/29)</TD><TD CLASS="h">0%   (0/2)</TD></TR><TR><TD CLASS="f"><A HREF="#1b">isQuote (String): boolean</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/22)</TD><TD CLASS="h">0%   (0/4)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#1c">isSelfClosed (IStructuredDocumentRegion): boolean</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/16)</TD><TD CLASS="h">0%   (0/2)</TD></TR><TR><TD CLASS="f"><A HREF="#1d">isStartTag (IStructuredDocumentRegion): boolean</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/24)</TD><TD CLASS="h">0%   (0/5)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#1e">mapToProperties (CMNamedNodeMap): Properties</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/26)</TD><TD CLASS="h">0%   (0/5)</TD></TR><TR><TD CLASS="f"><A HREF="#1f">needsEndTag (IStructuredDocumentRegion): boolean</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/57)</TD><TD CLASS="h">0%   (0/16)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#20">release (): void</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="#21">setErrorMessage (String, String): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/11)</TD><TD CLASS="h">0%   (0/2)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#22">setErrorMessage (String, String, String): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/13)</TD><TD CLASS="h">0%   (0/2)</TD></TR><TR><TD CLASS="f"><A HREF="#23">stringsEqual (String, 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/1)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#24">addEndTagProposals (ContentAssistRequest): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">7%   (24/332)</TD><TD CLASS="h">11%  (7/65)</TD></TR><TR><TD CLASS="f"><A HREF="#25">addTagNameProposals (ContentAssistRequest, int): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">19%  (60/321)</TD><TD CLASS="h">25%  (15.6/63)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#26">addTagCloseProposals (ContentAssistRequest): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">24%  (60/255)</TD><TD CLASS="h">26%  (11.3/44)</TD></TR><TR><TD CLASS="f"><A HREF="#27">computeCompletionProposals (int, String, ITextRegion, IDOMNode, IDOMNode): Co...</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">27%  (89/324)</TD><TD CLASS="h">43%  (16.4/38)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#28">computeTagOpenProposals (int, String, ITextRegion, IDOMNode, IDOMNode): Conte...</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">28%  (43/153)</TD><TD CLASS="h">36%  (9/25)</TD></TR><TR><TD CLASS="f"><A HREF="#29">addTagInsertionProposals (ContentAssistRequest, int): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">32%  (174/536)</TD><TD CLASS="h">39%  (37.7/96)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#2a">computeAttributeValueProposals (int, String, ITextRegion, IDOMNode, IDOMNode)...</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">36%  (36/100)</TD><TD CLASS="h">42%  (6/14)</TD></TR><TR><TD CLASS="f"><A HREF="#2b">computeEntityReferenceProposals (int, ITextRegion, IDOMNode): ICompletionProp...</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">39%  (59/152)</TD><TD CLASS="h">30%  (9.5/32)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#2c">getCompletionRegion (int, IStructuredDocumentRegion): ITextRegion</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">52%  (49/94)</TD><TD CLASS="h">47%  (8.5/18)</TD></TR><TR><TD CLASS="f"><A HREF="#2d">addEntityProposals (ContentAssistRequest, int, ITextRegion, IDOMNode): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">55%  (12/22)</TD><TD CLASS="h">63%  (2.5/4)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#2e">addAttributeValueProposals (ContentAssistRequest): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">58%  (261/450)</TD><TD CLASS="h">70%  (58.8/84)</TD></TR><TR><TD CLASS="f"><A HREF="#2f">computeCompletionProposals (ITextViewer, int): ICompletionProposal []</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">59%  (119/202)</TD><TD CLASS="h">69%  (27.7/40)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#30">getAdditionalInfo (CMNode, CMNode): String</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">59%  (13/22)</TD><TD CLASS="h">68%  (4.8/7)</TD></TR><TR><TD CLASS="f"><A HREF="#31">computeTagCloseProposals (int, String, ITextRegion, IDOMNode, IDOMNode): Cont...</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">62%  (64/103)</TD><TD CLASS="h">69%  (13.9/20)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#32">addAttributeNameProposals (ContentAssistRequest): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">63%  (207/330)</TD><TD CLASS="h">76%  (44.2/58)</TD></TR><TR><TD CLASS="f"><A HREF="#33">isCursorAfterDoctype (ContentAssistRequest): boolean</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">67%  (30/45)</TD><TD CLASS="h">69%  (9/13)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#34">getCompletionRegion (int, Node): ITextRegion</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">72%  (110/152)</TD><TD CLASS="h">66%  (20.5/31)</TD></TR><TR><TD CLASS="f"><A HREF="#35">getXML (Node): boolean</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">78%  (21/27)</TD><TD CLASS="h">74%  (3.7/5)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#36">getCursorPositionForProposedText (String): int</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">78%  (18/23)</TD><TD>83%  (5/6)</TD></TR><TR><TD CLASS="f"><A HREF="#37">getPossibleDataTypeValues (Node, CMAttributeDeclaration): List</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>81%  (50/62)</TD><TD>81%  (13/16)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#38">getElementPosition (Node): int</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>82%  (28/34)</TD><TD CLASS="h">75%  (9/12)</TD></TR><TR><TD CLASS="f"><A HREF="#39">beginsWith (String, String): boolean</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>83%  (10/12)</TD><TD CLASS="h">67%  (2/3)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#3a">getRequiredName (Node, CMNode): String</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>83%  (10/12)</TD><TD CLASS="h">67%  (2/3)</TD></TR><TR><TD CLASS="f"><A HREF="#3b">isCommentNode (IDOMNode): boolean</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>85%  (11/13)</TD><TD>84%  (0.8/1)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#3c">computeContentProposals (int, String, ITextRegion, IDOMNode, IDOMNode): Conte...</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>85%  (41/48)</TD><TD>87%  (7.8/9)</TD></TR><TR><TD CLASS="f"><A HREF="#3d">getRequiredText (Node, CMAttributeDeclaration): String</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>88%  (15/17)</TD><TD>80%  (4/5)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#3e">getRequiredText (Node, CMElementDeclaration): String</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>88%  (15/17)</TD><TD>80%  (4/5)</TD></TR><TR><TD CLASS="f"><A HREF="#3f">getAvailableChildrenAtIndex (Element, int, int): List</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>94%  (31/33)</TD><TD>99%  (7.9/8)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#40">getMatchString (IStructuredDocumentRegion, ITextRegion, int): String</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>97%  (60/62)</TD><TD>92%  (11/12)</TD></TR><TR><TD CLASS="f"><A HREF="#2">&lt;static initializer&gt;</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (7/7)</TD><TD>100% (4/4)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#42">AbstractContentAssistProcessor (): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (29/29)</TD><TD>100% (11/11)</TD></TR><TR><TD CLASS="f"><A HREF="#43">addEmptyDocumentProposals (ContentAssistRequest): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (1/1)</TD><TD>100% (1/1)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#44">getAvailableChildElementDeclarations (Element, int, int): List</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (50/50)</TD><TD>100% (10/10)</TD></TR><TR><TD CLASS="f"><A HREF="#45">getCMElementDeclaration (Node): CMElementDeclaration</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (19/19)</TD><TD>100% (6/6)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#46">getContentGenerator (): XMLContentModelGenerator</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (11/11)</TD><TD>100% (3/3)</TD></TR><TR><TD CLASS="f"><A HREF="#47">getElementPositionForModelQuery (Node): int</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (4/4)</TD><TD>100% (1/1)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#48">getErrorMessage (): String</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (3/3)</TD><TD>100% (1/1)</TD></TR><TR><TD CLASS="f"><A HREF="#49">getInfoProvider (): MarkupTagInfoProvider</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (11/11)</TD><TD>100% (3/3)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#4a">getStructuredDocumentRegion (int): IStructuredDocumentRegion</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (5/5)</TD><TD>100% (1/1)</TD></TR><TR><TD CLASS="f"><A HREF="#4b">getValidChildElementDeclarations (Element, int, int): List</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (50/50)</TD><TD>100% (10/10)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#4c">isCloseRegion (ITextRegion): boolean</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (44/44)</TD><TD>100% (2/2)</TD></TR><TR><TD CLASS="f"><A HREF="#4d">newContentAssistRequest (Node, Node, IStructuredDocumentRegion, ITextRegion, ...</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (11/11)</TD><TD>100% (1/1)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#4e">setErrorMessage (String): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (4/4)</TD><TD>100% (2/2)</TD></TR><TR><TD CLASS="bt"> </TD><TD CLASS="bt"> </TD><TD CLASS="bt"> </TD><TD CLASS="bt"> </TD><TD CLASS="bt"> </TD></TR><TR CLASS="cis"><TD CLASS="f">class <A HREF="#4f">AbstractContentAssistProcessor$1</A></TD><TD>100% (1/1)</TD><TD>100% (4/4)</TD><TD>83%  (39/47)</TD><TD>92%  (11/12)</TD></TR><TR><TD CLASS="f"><A HREF="#50">getNamedItem (String): CMNode</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">50%  (8/16)</TD><TD CLASS="h">75%  (3/4)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#4f">AbstractContentAssistProcessor$1 (AbstractContentAssistProcessor, CMNamedNode...</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (7/7)</TD><TD>100% (2/2)</TD></TR><TR><TD CLASS="f"><A HREF="#52">getCaseInsensitiveMap (): Map</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (11/11)</TD><TD>100% (3/3)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#53">put (CMNode): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (13/13)</TD><TD>100% (3/3)</TD></TR></TABLE><P></P><TABLE CLASS="s" CELLSPACING="0" WIDTH="100%"><TR CLASS="c"><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.ui.internal.contentassist;</TD></TR><TR><TD CLASS="l">14</TD><TD> </TD></TR><TR><TD CLASS="l">15</TD><TD>import java.util.ArrayList;</TD></TR><TR><TD CLASS="l">16</TD><TD>import java.util.Enumeration;</TD></TR><TR><TD CLASS="l">17</TD><TD>import java.util.HashMap;</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>import java.util.Locale;</TD></TR><TR><TD CLASS="l">21</TD><TD>import java.util.Map;</TD></TR><TR><TD CLASS="l">22</TD><TD>import java.util.Properties;</TD></TR><TR><TD CLASS="l">23</TD><TD>import java.util.Vector;</TD></TR><TR><TD CLASS="l">24</TD><TD> </TD></TR><TR><TD CLASS="l">25</TD><TD>import org.eclipse.jface.text.ITextViewer;</TD></TR><TR><TD CLASS="l">26</TD><TD>import org.eclipse.jface.text.contentassist.ICompletionProposal;</TD></TR><TR><TD CLASS="l">27</TD><TD>import org.eclipse.jface.text.contentassist.IContentAssistProcessor;</TD></TR><TR><TD CLASS="l">28</TD><TD>import org.eclipse.jface.text.contentassist.IContextInformation;</TD></TR><TR><TD CLASS="l">29</TD><TD>import org.eclipse.jface.text.contentassist.IContextInformationValidator;</TD></TR><TR><TD CLASS="l">30</TD><TD>import org.eclipse.osgi.util.NLS;</TD></TR><TR><TD CLASS="l">31</TD><TD>import org.eclipse.swt.graphics.Image;</TD></TR><TR><TD CLASS="l">32</TD><TD>import org.eclipse.wst.sse.core.StructuredModelManager;</TD></TR><TR><TD CLASS="l">33</TD><TD>import org.eclipse.wst.sse.core.internal.encoding.ContentTypeEncodingPreferences;</TD></TR><TR><TD CLASS="l">34</TD><TD>import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;</TD></TR><TR><TD CLASS="l">35</TD><TD>import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;</TD></TR><TR><TD CLASS="l">36</TD><TD>import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;</TD></TR><TR><TD CLASS="l">37</TD><TD>import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;</TD></TR><TR><TD CLASS="l">38</TD><TD>import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;</TD></TR><TR><TD CLASS="l">39</TD><TD>import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionContainer;</TD></TR><TR><TD CLASS="l">40</TD><TD>import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;</TD></TR><TR><TD CLASS="l">41</TD><TD>import org.eclipse.wst.sse.core.internal.util.Debug;</TD></TR><TR><TD CLASS="l">42</TD><TD>import org.eclipse.wst.sse.ui.internal.IReleasable;</TD></TR><TR><TD CLASS="l">43</TD><TD>import org.eclipse.wst.sse.ui.internal.contentassist.ContentAssistUtils;</TD></TR><TR><TD CLASS="l">44</TD><TD>import org.eclipse.wst.sse.ui.internal.contentassist.CustomCompletionProposal;</TD></TR><TR><TD CLASS="l">45</TD><TD>import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;</TD></TR><TR><TD CLASS="l">46</TD><TD>import org.eclipse.wst.xml.core.internal.contentmodel.CMContent;</TD></TR><TR><TD CLASS="l">47</TD><TD>import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;</TD></TR><TR><TD CLASS="l">48</TD><TD>import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;</TD></TR><TR><TD CLASS="l">49</TD><TD>import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;</TD></TR><TR><TD CLASS="l">50</TD><TD>import org.eclipse.wst.xml.core.internal.contentmodel.CMEntityDeclaration;</TD></TR><TR><TD CLASS="l">51</TD><TD>import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;</TD></TR><TR><TD CLASS="l">52</TD><TD>import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;</TD></TR><TR><TD CLASS="l">53</TD><TD>import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;</TD></TR><TR><TD CLASS="l">54</TD><TD>import org.eclipse.wst.xml.core.internal.contentmodel.CMNodeList;</TD></TR><TR><TD CLASS="l">55</TD><TD>import org.eclipse.wst.xml.core.internal.contentmodel.basic.CMNamedNodeMapImpl;</TD></TR><TR><TD CLASS="l">56</TD><TD>import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;</TD></TR><TR><TD CLASS="l">57</TD><TD>import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQueryAction;</TD></TR><TR><TD CLASS="l">58</TD><TD>import org.eclipse.wst.xml.core.internal.contentmodel.util.DOMNamespaceHelper;</TD></TR><TR><TD CLASS="l">59</TD><TD>import org.eclipse.wst.xml.core.internal.document.AttrImpl;</TD></TR><TR><TD CLASS="l">60</TD><TD>import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;</TD></TR><TR><TD CLASS="l">61</TD><TD>import org.eclipse.wst.xml.core.internal.provisional.contenttype.ContentTypeIdForXML;</TD></TR><TR><TD CLASS="l">62</TD><TD>import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;</TD></TR><TR><TD CLASS="l">63</TD><TD>import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;</TD></TR><TR><TD CLASS="l">64</TD><TD>import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;</TD></TR><TR><TD CLASS="l">65</TD><TD>import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;</TD></TR><TR><TD CLASS="l">66</TD><TD>import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;</TD></TR><TR><TD CLASS="l">67</TD><TD>import org.eclipse.wst.xml.ui.internal.Logger;</TD></TR><TR><TD CLASS="l">68</TD><TD>import org.eclipse.wst.xml.ui.internal.XMLUIMessages;</TD></TR><TR><TD CLASS="l">69</TD><TD>import org.eclipse.wst.xml.ui.internal.XMLUIPlugin;</TD></TR><TR><TD CLASS="l">70</TD><TD>import org.eclipse.wst.xml.ui.internal.editor.CMImageUtil;</TD></TR><TR><TD CLASS="l">71</TD><TD>import org.eclipse.wst.xml.ui.internal.editor.XMLEditorPluginImageHelper;</TD></TR><TR><TD CLASS="l">72</TD><TD>import org.eclipse.wst.xml.ui.internal.editor.XMLEditorPluginImages;</TD></TR><TR><TD CLASS="l">73</TD><TD>import org.eclipse.wst.xml.ui.internal.preferences.XMLUIPreferenceNames;</TD></TR><TR><TD CLASS="l">74</TD><TD>import org.eclipse.wst.xml.ui.internal.taginfo.MarkupTagInfoProvider;</TD></TR><TR><TD CLASS="l">75</TD><TD>import org.w3c.dom.Attr;</TD></TR><TR><TD CLASS="l">76</TD><TD>import org.w3c.dom.Document;</TD></TR><TR><TD CLASS="l">77</TD><TD>import org.w3c.dom.DocumentType;</TD></TR><TR><TD CLASS="l">78</TD><TD>import org.w3c.dom.Element;</TD></TR><TR><TD CLASS="l">79</TD><TD>import org.w3c.dom.NamedNodeMap;</TD></TR><TR><TD CLASS="l">80</TD><TD>import org.w3c.dom.Node;</TD></TR><TR><TD CLASS="l">81</TD><TD>import org.w3c.dom.NodeList;</TD></TR><TR><TD CLASS="l">82</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">83</TD><TD>abstract public class AbstractContentAssistProcessor implements IContentAssistProcessor, IReleasable {</TD></TR><TR><TD CLASS="l">84</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="0">85</A></TD><TD>         * ISSUE: this is a bit of hidden JSP knowledge that was implemented this</TD></TR><TR><TD CLASS="l">86</TD><TD>         * way for expedency. Should be evolved in future to depend on</TD></TR><TR><TD CLASS="l">87</TD><TD>         * &#34;nestedContext&#34;.</TD></TR><TR><TD CLASS="l">88</TD><TD>         */</TD></TR><TR CLASS="z"><TD CLASS="l">89</TD><TD>        private class DOMJSPRegionContextsPrivateCopy {</TD></TR><TR><TD CLASS="l">90</TD><TD>                private static final String JSP_CLOSE = &#34;JSP_CLOSE&#34;; //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">91</TD><TD>                private static final String JSP_COMMENT_CLOSE = &#34;JSP_COMMENT_CLOSE&#34;; //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">92</TD><TD> </TD></TR><TR><TD CLASS="l">93</TD><TD>                private static final String JSP_COMMENT_OPEN = &#34;JSP_COMMENT_OPEN&#34;; //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">94</TD><TD>                private static final String JSP_DECLARATION_OPEN = &#34;JSP_DECLARATION_OPEN&#34;; //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">95</TD><TD>                private static final String JSP_DIRECTIVE_CLOSE = &#34;JSP_DIRECTIVE_CLOSE&#34;; //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">96</TD><TD>                private static final String JSP_DIRECTIVE_NAME = &#34;JSP_DIRECTIVE_NAME&#34;; //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">97</TD><TD> </TD></TR><TR><TD CLASS="l">98</TD><TD>                private static final String JSP_DIRECTIVE_OPEN = &#34;JSP_DIRECTIVE_OPEN&#34;; //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">99</TD><TD>                private static final String JSP_EXPRESSION_OPEN = &#34;JSP_EXPRESSION_OPEN&#34;; //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">100</TD><TD> </TD></TR><TR><TD CLASS="l">101</TD><TD>                private static final String JSP_ROOT_TAG_NAME = &#34;JSP_ROOT_TAG_NAME&#34;; //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">102</TD><TD> </TD></TR><TR><TD CLASS="l"><A NAME="2">103</A></TD><TD>                private static final String JSP_SCRIPTLET_OPEN = &#34;JSP_SCRIPTLET_OPEN&#34;; //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">104</TD><TD> </TD></TR><TR><TD CLASS="l">105</TD><TD>        }</TD></TR><TR><TD CLASS="l">106</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">107</TD><TD>        protected static final String INTERNALERROR = XMLUIMessages.SEVERE_internal_error_occu_UI_;</TD></TR><TR CLASS="c"><TD CLASS="l">108</TD><TD>        protected static final String UNKNOWN_ATTR = XMLUIMessages.No_known_attribute__UI_;</TD></TR><TR CLASS="c"><TD CLASS="l">109</TD><TD>        protected static final String UNKNOWN_CONTEXT = XMLUIMessages.Content_Assist_not_availab_UI_;</TD></TR><TR CLASS="c"><TD CLASS="l">110</TD><TD>        protected char completionProposalAutoActivationCharacters[] = null;</TD></TR><TR CLASS="c"><TD CLASS="l">111</TD><TD>        protected char contextInformationAutoActivationCharacters[] = null;</TD></TR><TR CLASS="c"><TD CLASS="l">112</TD><TD>        private AttributeContextInformationProvider fAttributeInfoProvider = null;</TD></TR><TR CLASS="c"><TD CLASS="l">113</TD><TD>        private AttributeContextInformationPresenter fContextInformationPresenter = null;</TD></TR><TR><TD CLASS="l">114</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">115</TD><TD>        protected String fErrorMessage = null;</TD></TR><TR><TD CLASS="l">116</TD><TD>        protected XMLContentModelGenerator fGenerator;</TD></TR><TR><TD CLASS="l">117</TD><TD>        // protected IResource resource = null;</TD></TR><TR CLASS="c"><TD CLASS="l">118</TD><TD>        protected MarkupTagInfoProvider fInfoProvider = null;</TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="42">119</A></TD><TD>        protected ITextViewer fTextViewer = null;</TD></TR><TR><TD CLASS="l">120</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">121</TD><TD>        private final boolean showValues = true;</TD></TR><TR><TD CLASS="l">122</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">123</TD><TD>        public AbstractContentAssistProcessor() {</TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="32">124</A></TD><TD>                init();</TD></TR><TR CLASS="c"><TD CLASS="l">125</TD><TD>        }</TD></TR><TR><TD CLASS="l">126</TD><TD> </TD></TR><TR><TD CLASS="l">127</TD><TD>        protected void addAttributeNameProposals(ContentAssistRequest contentAssistRequest) {</TD></TR><TR CLASS="c"><TD CLASS="l">128</TD><TD>                IDOMNode node = (IDOMNode) contentAssistRequest.getNode();</TD></TR><TR CLASS="c"><TD CLASS="l">129</TD><TD>                IStructuredDocumentRegion sdRegion = contentAssistRequest.getDocumentRegion();</TD></TR><TR><TD CLASS="l">130</TD><TD>                // retrieve the list of attributes</TD></TR><TR CLASS="c"><TD CLASS="l">131</TD><TD>                CMElementDeclaration elementDecl = getCMElementDeclaration(node);</TD></TR><TR CLASS="c"><TD CLASS="l">132</TD><TD>                if (elementDecl != null) {</TD></TR><TR CLASS="c"><TD CLASS="l">133</TD><TD>                        CMNamedNodeMap attributes = elementDecl.getAttributes();</TD></TR><TR><TD CLASS="l">134</TD><TD>                        </TD></TR><TR CLASS="c"><TD CLASS="l">135</TD><TD>                        CMNamedNodeMapImpl allAttributes = new CMNamedNodeMapImpl(attributes);</TD></TR><TR CLASS="c"><TD CLASS="l">136</TD><TD>                        if (node.getNodeType() == Node.ELEMENT_NODE) {</TD></TR><TR CLASS="c"><TD CLASS="l">137</TD><TD>                                List nodes = ModelQueryUtil.getModelQuery(node.getOwnerDocument()).getAvailableContent((Element) node, elementDecl, ModelQuery.INCLUDE_ATTRIBUTES);</TD></TR><TR CLASS="c"><TD CLASS="l">138</TD><TD>                                for (int k = 0; k &lt; nodes.size(); k++) {</TD></TR><TR CLASS="c"><TD CLASS="l">139</TD><TD>                                        CMNode cmnode = (CMNode) nodes.get(k);</TD></TR><TR CLASS="c"><TD CLASS="l">140</TD><TD>                                        if (cmnode.getNodeType() == CMNode.ATTRIBUTE_DECLARATION) {</TD></TR><TR CLASS="c"><TD CLASS="l">141</TD><TD>                                                allAttributes.put(cmnode);</TD></TR><TR><TD CLASS="l">142</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">143</TD><TD>                                }</TD></TR><TR><TD CLASS="l">144</TD><TD>                        }</TD></TR><TR CLASS="c"><TD CLASS="l">145</TD><TD>                        attributes = allAttributes;</TD></TR><TR><TD CLASS="l">146</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">147</TD><TD>                        String matchString = contentAssistRequest.getMatchString();</TD></TR><TR><TD CLASS="l">148</TD><TD> </TD></TR><TR><TD CLASS="l">149</TD><TD>                        // check whether an attribute really exists for the replacement</TD></TR><TR><TD CLASS="l">150</TD><TD>                        // offsets AND if it possesses a value</TD></TR><TR CLASS="c"><TD CLASS="l">151</TD><TD>                        boolean attrAtLocationHasValue = false;</TD></TR><TR CLASS="c"><TD CLASS="l">152</TD><TD>                        NamedNodeMap attrs = node.getAttributes();</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="94% line coverage (17 out of 18 instructions)">153</TD><TD TITLE="94% line coverage (17 out of 18 instructions)">                        for (int i = 0; i &lt; attrs.getLength(); i++) {</TD></TR><TR CLASS="z"><TD CLASS="l">154</TD><TD>                                AttrImpl existingAttr = (AttrImpl) attrs.item(i);</TD></TR><TR CLASS="z"><TD CLASS="l">155</TD><TD>                                ITextRegion name = existingAttr.getNameRegion();</TD></TR><TR><TD CLASS="l">156</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">157</TD><TD>                                if ((sdRegion.getStartOffset(name) &lt;= contentAssistRequest.getReplacementBeginPosition()) &amp;&amp; (sdRegion.getStartOffset(name) + name.getLength() &gt;= contentAssistRequest.getReplacementBeginPosition() + contentAssistRequest.getReplacementLength()) &amp;&amp; (existingAttr.getValueRegion() != null)) {</TD></TR><TR CLASS="z"><TD CLASS="l">158</TD><TD>                                        attrAtLocationHasValue = true;</TD></TR><TR CLASS="z"><TD CLASS="l">159</TD><TD>                                        break;</TD></TR><TR><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">163</TD><TD>                        // only add proposals for the attributes whose names begin with</TD></TR><TR><TD CLASS="l">164</TD><TD>                        // the matchstring</TD></TR><TR CLASS="c"><TD CLASS="l">165</TD><TD>                        if (attributes != null) {</TD></TR><TR CLASS="c"><TD CLASS="l">166</TD><TD>                                for (int i = 0; i &lt; attributes.getLength(); i++) {</TD></TR><TR CLASS="c"><TD CLASS="l">167</TD><TD>                                        CMAttributeDeclaration attrDecl = (CMAttributeDeclaration) attributes.item(i);</TD></TR><TR><TD CLASS="l">168</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">169</TD><TD>                                        int isRequired = 0;</TD></TR><TR CLASS="c"><TD CLASS="l">170</TD><TD>                                        if (attrDecl.getUsage() == CMAttributeDeclaration.REQUIRED) {</TD></TR><TR CLASS="z"><TD CLASS="l">171</TD><TD>                                                isRequired = XMLRelevanceConstants.R_REQUIRED;</TD></TR><TR><TD CLASS="l">172</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">173</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">174</TD><TD>                                        boolean showAttribute = true;</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="96% line coverage (27 out of 28 instructions)">175</TD><TD TITLE="96% line coverage (27 out of 28 instructions)">                                        showAttribute = showAttribute &amp;&amp; beginsWith(getRequiredName(node, attrDecl), matchString.trim());</TD></TR><TR CLASS="c"><TD CLASS="l">176</TD><TD>                                        AttrImpl attr = (AttrImpl) node.getAttributes().getNamedItem(getRequiredName(node, attrDecl));</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="84% line coverage (16 out of 19 instructions)">177</TD><TD TITLE="84% line coverage (16 out of 19 instructions)">                                        ITextRegion nameRegion = attr != null ? attr.getNameRegion() : null;</TD></TR><TR><TD CLASS="l">178</TD><TD>                                        // nameRegion.getEndOffset() + 1 is required to allow for</TD></TR><TR><TD CLASS="l">179</TD><TD>                                        // matches against the full name of an existing Attr</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="32% line coverage (10 out of 31 instructions)">180</TD><TD TITLE="32% line coverage (10 out of 31 instructions)">                                        showAttribute = showAttribute &amp;&amp; ((attr == null) || ((nameRegion != null) &amp;&amp; (sdRegion.getStartOffset(nameRegion) &lt;= contentAssistRequest.getReplacementBeginPosition()) &amp;&amp; (sdRegion.getStartOffset(nameRegion) + nameRegion.getLength() &gt;= contentAssistRequest.getReplacementBeginPosition() + contentAssistRequest.getReplacementLength())));</TD></TR><TR CLASS="c"><TD CLASS="l">181</TD><TD>                                        if (showAttribute) {</TD></TR><TR CLASS="c"><TD CLASS="l">182</TD><TD>                                                Image attrImage = CMImageUtil.getImage(attrDecl);</TD></TR><TR CLASS="c"><TD CLASS="l">183</TD><TD>                                                if (attrImage == null) {</TD></TR><TR CLASS="c"><TD CLASS="l">184</TD><TD>                                                        if (isRequired &gt; 0) {</TD></TR><TR CLASS="z"><TD CLASS="l">185</TD><TD>                                                                attrImage = XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_ATT_REQ_OBJ);</TD></TR><TR><TD CLASS="l">186</TD><TD>                                                        }</TD></TR><TR><TD CLASS="l">187</TD><TD>                                                        else {</TD></TR><TR CLASS="c"><TD CLASS="l">188</TD><TD>                                                                attrImage = XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_ATTRIBUTE);</TD></TR><TR><TD CLASS="l">189</TD><TD>                                                        }</TD></TR><TR><TD CLASS="l">190</TD><TD>                                                }</TD></TR><TR><TD CLASS="l">191</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">192</TD><TD>                                                String proposedText = null;</TD></TR><TR CLASS="c"><TD CLASS="l">193</TD><TD>                                                String proposedInfo = getAdditionalInfo(elementDecl, attrDecl);</TD></TR><TR CLASS="c"><TD CLASS="l">194</TD><TD>                                                CustomCompletionProposal proposal = null;</TD></TR><TR><TD CLASS="l">195</TD><TD>                                                // attribute is at this location and already exists</TD></TR><TR CLASS="c"><TD CLASS="l">196</TD><TD>                                                if (attrAtLocationHasValue) {</TD></TR><TR><TD CLASS="l">197</TD><TD>                                                        // only propose the name</TD></TR><TR CLASS="z"><TD CLASS="l">198</TD><TD>                                                        proposedText = getRequiredName(node, attrDecl);</TD></TR><TR CLASS="z"><TD CLASS="l">199</TD><TD>                                                        proposal = new CustomCompletionProposal(proposedText, contentAssistRequest.getReplacementBeginPosition(), contentAssistRequest.getReplacementLength(), proposedText.length(), attrImage, proposedText, null, proposedInfo, XMLRelevanceConstants.R_XML_ATTRIBUTE_NAME + isRequired, true);</TD></TR><TR><TD CLASS="l">200</TD><TD>                                                }</TD></TR><TR><TD CLASS="l">201</TD><TD>                                                // no attribute exists or is elsewhere, generate</TD></TR><TR><TD CLASS="l">202</TD><TD>                                                // minimally</TD></TR><TR><TD CLASS="l">203</TD><TD>                                                else {</TD></TR><TR CLASS="c"><TD CLASS="l">204</TD><TD>                                                        Attr existingAttrNode = (Attr) node.getAttributes().getNamedItem(getRequiredName(node, attrDecl));</TD></TR><TR CLASS="c"><TD CLASS="l">205</TD><TD>                                                        String value = null;</TD></TR><TR CLASS="c"><TD CLASS="l">206</TD><TD>                                                        if (existingAttrNode != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">207</TD><TD>                                                                value = existingAttrNode.getNodeValue();</TD></TR><TR><TD CLASS="l">208</TD><TD>                                                        }</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="40% line coverage (2 out of 5 instructions)">209</TD><TD TITLE="40% line coverage (2 out of 5 instructions)">                                                        if ((value != null) &amp;&amp; (value.length() &gt; 0)) {</TD></TR><TR CLASS="z"><TD CLASS="l">210</TD><TD>                                                                proposedText = getRequiredName(node, attrDecl);</TD></TR><TR><TD CLASS="l">211</TD><TD>                                                        }</TD></TR><TR><TD CLASS="l">212</TD><TD>                                                        else {</TD></TR><TR CLASS="c"><TD CLASS="l">213</TD><TD>                                                                proposedText = getRequiredText(node, attrDecl);</TD></TR><TR><TD CLASS="l">214</TD><TD>                                                        }</TD></TR><TR CLASS="c"><TD CLASS="l">215</TD><TD>                                                        proposal = new CustomCompletionProposal(proposedText, contentAssistRequest.getReplacementBeginPosition(), contentAssistRequest.getReplacementLength(), attrDecl.getNodeName().length() + 2, attrImage,</TD></TR><TR><TD CLASS="l">216</TD><TD>                                                        // if the value isn't empty (no empty set of</TD></TR><TR><TD CLASS="l">217</TD><TD>                                                                                // quotes), show it</TD></TR><TR><TD CLASS="l">218</TD><TD>                                                        // BUG 203494, content strings may have &#34;&#34;, but not be empty</TD></TR><TR><TD CLASS="l">219</TD><TD>                                                        // An empty string is when there's no content between double quotes</TD></TR><TR><TD CLASS="l">220</TD><TD>                                                        // and there is no single quote that may be encasing a double quote</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="70% line coverage (23 out of 33 instructions)">221</TD><TD TITLE="70% line coverage (23 out of 33 instructions)">                                                                                (showValues &amp;&amp; (proposedText.lastIndexOf('\&#34;') - proposedText.indexOf('\&#34;') ==  1 &amp;&amp; proposedText.indexOf('\'') == -1)) ? getRequiredName(node, attrDecl) : proposedText,</TD></TR><TR CLASS="c"><TD CLASS="l">222</TD><TD>                                                                                null, proposedInfo, XMLRelevanceConstants.R_XML_ATTRIBUTE_NAME + isRequired);</TD></TR><TR><TD CLASS="l">223</TD><TD>                                                }</TD></TR><TR CLASS="c"><TD CLASS="l">224</TD><TD>                                                contentAssistRequest.addProposal(proposal);</TD></TR><TR><TD CLASS="l">225</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">226</TD><TD>                                }</TD></TR><TR><TD CLASS="l">227</TD><TD>                        }</TD></TR><TR><TD CLASS="l">228</TD><TD>                }</TD></TR><TR><TD CLASS="l">229</TD><TD>                else {</TD></TR><TR CLASS="z"><TD CLASS="l">230</TD><TD>                        setErrorMessage(NLS.bind(XMLUIMessages.Element__is_unknown, (new Object[]{node.getNodeName()})));</TD></TR><TR><TD CLASS="l">231</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="2e">232</A></TD><TD>        }</TD></TR><TR><TD CLASS="l">233</TD><TD> </TD></TR><TR><TD CLASS="l">234</TD><TD>        protected void addAttributeValueProposals(ContentAssistRequest contentAssistRequest) {</TD></TR><TR><TD CLASS="l">235</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">236</TD><TD>                IDOMNode node = (IDOMNode) contentAssistRequest.getNode();</TD></TR><TR><TD CLASS="l">237</TD><TD> </TD></TR><TR><TD CLASS="l">238</TD><TD>                // Find the attribute region and name for which this position should</TD></TR><TR><TD CLASS="l">239</TD><TD>                // have a value proposed</TD></TR><TR CLASS="c"><TD CLASS="l">240</TD><TD>                IStructuredDocumentRegion open = node.getFirstStructuredDocumentRegion();</TD></TR><TR CLASS="c"><TD CLASS="l">241</TD><TD>                ITextRegionList openRegions = open.getRegions();</TD></TR><TR CLASS="c"><TD CLASS="l">242</TD><TD>                int i = openRegions.indexOf(contentAssistRequest.getRegion());</TD></TR><TR CLASS="c"><TD CLASS="l">243</TD><TD>                if (i &lt; 0) {</TD></TR><TR CLASS="z"><TD CLASS="l">244</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">245</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">246</TD><TD>                ITextRegion nameRegion = null;</TD></TR><TR CLASS="c"><TD CLASS="l">247</TD><TD>                while (i &gt;= 0) {</TD></TR><TR CLASS="c"><TD CLASS="l">248</TD><TD>                        nameRegion = openRegions.get(i--);</TD></TR><TR CLASS="c"><TD CLASS="l">249</TD><TD>                        if (nameRegion.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME) {</TD></TR><TR CLASS="c"><TD CLASS="l">250</TD><TD>                                break;</TD></TR><TR><TD CLASS="l">251</TD><TD>                        }</TD></TR><TR><TD CLASS="l">252</TD><TD>                }</TD></TR><TR><TD CLASS="l">253</TD><TD> </TD></TR><TR><TD CLASS="l">254</TD><TD>                // the name region is REQUIRED to do anything useful</TD></TR><TR CLASS="c"><TD CLASS="l">255</TD><TD>                if (nameRegion != null) {</TD></TR><TR><TD CLASS="l">256</TD><TD>                        // Retrieve the declaration</TD></TR><TR CLASS="c"><TD CLASS="l">257</TD><TD>                        CMElementDeclaration elementDecl = getCMElementDeclaration(node);</TD></TR><TR><TD CLASS="l">258</TD><TD> </TD></TR><TR><TD CLASS="l">259</TD><TD>                        // String attributeName = nameRegion.getText();</TD></TR><TR CLASS="c"><TD CLASS="l">260</TD><TD>                        String attributeName = open.getText(nameRegion);</TD></TR><TR><TD CLASS="l">261</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">262</TD><TD>                        CMAttributeDeclaration attrDecl = null;</TD></TR><TR><TD CLASS="l">263</TD><TD> </TD></TR><TR><TD CLASS="l">264</TD><TD>                        // No CMElementDeclaration means no attribute metadata, but</TD></TR><TR><TD CLASS="l">265</TD><TD>                        // retrieve the</TD></TR><TR><TD CLASS="l"><A NAME="4f">266</A></TD><TD>                        // declaration for the attribute otherwise</TD></TR><TR CLASS="c"><TD CLASS="l">267</TD><TD>                        if (elementDecl != null) {</TD></TR><TR CLASS="c"><TD CLASS="l">268</TD><TD>                                CMNamedNodeMap attributes = elementDecl.getAttributes();</TD></TR><TR><TD CLASS="l">269</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="52">270</A></TD><TD>                                CMNamedNodeMapImpl allAttributes = new CMNamedNodeMapImpl(attributes) {</TD></TR><TR><TD CLASS="l">271</TD><TD>                                        private Map caseInsensitive;</TD></TR><TR><TD CLASS="l">272</TD><TD>                                        </TD></TR><TR><TD CLASS="l">273</TD><TD>                                        private Map getCaseInsensitiveMap() {</TD></TR><TR CLASS="c"><TD CLASS="l">274</TD><TD>                                                if(caseInsensitive == null)</TD></TR><TR CLASS="c"><TD CLASS="l">275</TD><TD>                                                        caseInsensitive = new HashMap();</TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="50">276</A></TD><TD>                                                return caseInsensitive;</TD></TR><TR><TD CLASS="l">277</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">278</TD><TD> </TD></TR><TR><TD CLASS="l">279</TD><TD>                                        public CMNode getNamedItem(String name) {</TD></TR><TR CLASS="c"><TD CLASS="l">280</TD><TD>                                                CMNode node = super.getNamedItem(name);</TD></TR><TR CLASS="c"><TD CLASS="l">281</TD><TD>                                                if (node == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">282</TD><TD>                                                        node = (CMNode) getCaseInsensitiveMap().get(name.toLowerCase(Locale.US));</TD></TR><TR><TD CLASS="l">283</TD><TD>                                                }</TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="53">284</A></TD><TD>                                                return node;</TD></TR><TR><TD CLASS="l">285</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">286</TD><TD> </TD></TR><TR><TD CLASS="l">287</TD><TD>                                        public void put(CMNode cmNode) {</TD></TR><TR CLASS="c"><TD CLASS="l">288</TD><TD>                                                super.put(cmNode);</TD></TR><TR CLASS="c"><TD CLASS="l">289</TD><TD>                                                getCaseInsensitiveMap().put(cmNode.getNodeName().toLowerCase(Locale.US), cmNode);</TD></TR><TR CLASS="c"><TD CLASS="l">290</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">291</TD><TD>                                };</TD></TR><TR CLASS="c"><TD CLASS="l">292</TD><TD>                                if (node.getNodeType() == Node.ELEMENT_NODE) {</TD></TR><TR CLASS="c"><TD CLASS="l">293</TD><TD>                                        List nodes = ModelQueryUtil.getModelQuery(node.getOwnerDocument()).getAvailableContent((Element) node, elementDecl, ModelQuery.INCLUDE_ATTRIBUTES);</TD></TR><TR CLASS="c"><TD CLASS="l">294</TD><TD>                                        for (int k = 0; k &lt; nodes.size(); k++) {</TD></TR><TR CLASS="c"><TD CLASS="l">295</TD><TD>                                                CMNode cmnode = (CMNode) nodes.get(k);</TD></TR><TR CLASS="c"><TD CLASS="l">296</TD><TD>                                                if (cmnode.getNodeType() == CMNode.ATTRIBUTE_DECLARATION) {</TD></TR><TR CLASS="c"><TD CLASS="l">297</TD><TD>                                                        allAttributes.put(cmnode);</TD></TR><TR><TD CLASS="l">298</TD><TD>                                                }</TD></TR><TR><TD CLASS="l">299</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">300</TD><TD>                                }</TD></TR><TR CLASS="c"><TD CLASS="l">301</TD><TD>                                attributes = allAttributes;</TD></TR><TR><TD CLASS="l">302</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">303</TD><TD>                                String noprefixName = DOMNamespaceHelper.getUnprefixedName(attributeName);</TD></TR><TR CLASS="c"><TD CLASS="l">304</TD><TD>                                if (attributes != null) {</TD></TR><TR CLASS="c"><TD CLASS="l">305</TD><TD>                                        attrDecl = (CMAttributeDeclaration) attributes.getNamedItem(noprefixName);</TD></TR><TR CLASS="c"><TD CLASS="l">306</TD><TD>                                        if (attrDecl == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">307</TD><TD>                                                attrDecl = (CMAttributeDeclaration) attributes.getNamedItem(attributeName);</TD></TR><TR><TD CLASS="l">308</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">309</TD><TD>                                }</TD></TR><TR CLASS="c"><TD CLASS="l">310</TD><TD>                                if (attrDecl == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">311</TD><TD>                                        setErrorMessage(UNKNOWN_ATTR, attributeName);</TD></TR><TR><TD CLASS="l">312</TD><TD>                                }</TD></TR><TR><TD CLASS="l">313</TD><TD>                        }</TD></TR><TR><TD CLASS="l">314</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">315</TD><TD>                        String currentValue = node.getAttributes().getNamedItem(attributeName).getNodeValue();</TD></TR><TR CLASS="c"><TD CLASS="l">316</TD><TD>                        String proposedInfo = null;</TD></TR><TR CLASS="c"><TD CLASS="l">317</TD><TD>                        Image image = CMImageUtil.getImage(attrDecl);</TD></TR><TR CLASS="c"><TD CLASS="l">318</TD><TD>                        if (image == null) {</TD></TR><TR CLASS="c"><TD CLASS="l">319</TD><TD>                                if ((attrDecl != null) &amp;&amp; (attrDecl.getUsage() == CMAttributeDeclaration.REQUIRED)) {</TD></TR><TR CLASS="c"><TD CLASS="l">320</TD><TD>                                        image = XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_ATT_REQ_OBJ);</TD></TR><TR><TD CLASS="l">321</TD><TD>                                }</TD></TR><TR><TD CLASS="l">322</TD><TD>                                else {</TD></TR><TR CLASS="c"><TD CLASS="l">323</TD><TD>                                        image = XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_ATTRIBUTE);</TD></TR><TR><TD CLASS="l">324</TD><TD>                                }</TD></TR><TR><TD CLASS="l">325</TD><TD>                        }</TD></TR><TR><TD CLASS="l">326</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">327</TD><TD>                        if ((attrDecl != null) &amp;&amp; (attrDecl.getAttrType() != null)) {</TD></TR><TR><TD CLASS="l">328</TD><TD>                                // attribute is known, prompt with values from the declaration</TD></TR><TR CLASS="c"><TD CLASS="l">329</TD><TD>                                proposedInfo = getAdditionalInfo(elementDecl, attrDecl);</TD></TR><TR CLASS="c"><TD CLASS="l">330</TD><TD>                                List possibleValues = getPossibleDataTypeValues(node, attrDecl);</TD></TR><TR CLASS="c"><TD CLASS="l">331</TD><TD>                                String defaultValue = attrDecl.getAttrType().getImpliedValue();</TD></TR><TR CLASS="c"><TD CLASS="l">332</TD><TD>                                if (possibleValues.size() &gt; 0 || defaultValue != null) {</TD></TR><TR><TD CLASS="l">333</TD><TD>                                        // ENUMERATED VALUES</TD></TR><TR CLASS="c"><TD CLASS="l">334</TD><TD>                                        String matchString = contentAssistRequest.getMatchString();</TD></TR><TR CLASS="c"><TD CLASS="l">335</TD><TD>                                        if (matchString == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">336</TD><TD>                                                matchString = &#34;&#34;; //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">337</TD><TD>                                        }</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="64% line coverage (7 out of 11 instructions)">338</TD><TD TITLE="64% line coverage (7 out of 11 instructions)">                                        if ((matchString.length() &gt; 0) &amp;&amp; (matchString.startsWith(&#34;\&#34;&#34;) || matchString.startsWith(&#34;'&#34;))) {</TD></TR><TR CLASS="c"><TD CLASS="l">339</TD><TD>                                                matchString = matchString.substring(1);</TD></TR><TR><TD CLASS="l">340</TD><TD>                                        }</TD></TR><TR CLASS="c"><TD CLASS="l">341</TD><TD>                                        boolean currentValid = false;</TD></TR><TR><TD CLASS="l">342</TD><TD> </TD></TR><TR><TD CLASS="l">343</TD><TD>                                        // d210858, if the region's a container, don't suggest the</TD></TR><TR><TD CLASS="l">344</TD><TD>                                        // enumerated values as they probably won't help</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="87% line coverage (13 out of 15 instructions)">345</TD><TD TITLE="87% line coverage (13 out of 15 instructions)">                                        boolean existingComplicatedValue = (contentAssistRequest.getRegion() != null) &amp;&amp; (contentAssistRequest.getRegion() instanceof ITextRegionContainer);</TD></TR><TR CLASS="c"><TD CLASS="l">346</TD><TD>                                        if (!existingComplicatedValue) {</TD></TR><TR CLASS="c"><TD CLASS="l">347</TD><TD>                                                int rOffset = contentAssistRequest.getReplacementBeginPosition();</TD></TR><TR CLASS="c"><TD CLASS="l">348</TD><TD>                                                int rLength = contentAssistRequest.getReplacementLength();</TD></TR><TR CLASS="c"><TD CLASS="l">349</TD><TD>                                                for (Iterator j = possibleValues.iterator(); j.hasNext();) {</TD></TR><TR CLASS="c"><TD CLASS="l">350</TD><TD>                                                        String possibleValue = (String) j.next();</TD></TR><TR CLASS="c"><TD CLASS="l">351</TD><TD>                                                        if(!possibleValue.equals(defaultValue)) {</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="92% line coverage (12 out of 13 instructions)">352</TD><TD TITLE="92% line coverage (12 out of 13 instructions)">                                                                currentValid = currentValid || possibleValue.equals(currentValue);</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="50% line coverage (4 out of 8 instructions)">353</TD><TD TITLE="50% line coverage (4 out of 8 instructions)">                                                                if ((matchString.length() == 0) || possibleValue.startsWith(matchString)) {</TD></TR><TR CLASS="c"><TD CLASS="l">354</TD><TD>                                                                        String rString = &#34;\&#34;&#34; + possibleValue + &#34;\&#34;&#34;; //$NON-NLS-2$//$NON-NLS-1$</TD></TR><TR CLASS="c"><TD CLASS="l">355</TD><TD>                                                                        CustomCompletionProposal proposal = new CustomCompletionProposal(rString, rOffset, rLength, possibleValue.length() + 1, XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_ENUM), rString, null, proposedInfo, XMLRelevanceConstants.R_XML_ATTRIBUTE_VALUE);</TD></TR><TR CLASS="c"><TD CLASS="l">356</TD><TD>                                                                        contentAssistRequest.addProposal(proposal);</TD></TR><TR><TD CLASS="l">357</TD><TD>                                                                }</TD></TR><TR><TD CLASS="l">358</TD><TD>                                                        }</TD></TR><TR><TD CLASS="l">359</TD><TD>                                                }</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="22% line coverage (2 out of 9 instructions)">360</TD><TD TITLE="22% line coverage (2 out of 9 instructions)">                                                if(defaultValue != null &amp;&amp; ((matchString.length() == 0) || defaultValue.startsWith(matchString))) {</TD></TR><TR CLASS="z"><TD CLASS="l">361</TD><TD>                                                        String rString = &#34;\&#34;&#34; + defaultValue + &#34;\&#34;&#34;; //$NON-NLS-2$//$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">362</TD><TD>                                                        CustomCompletionProposal proposal = new CustomCompletionProposal(rString, rOffset, rLength, defaultValue.length() + 1, XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_DEFAULT), rString, null, proposedInfo, XMLRelevanceConstants.R_XML_ATTRIBUTE_VALUE);</TD></TR><TR CLASS="z"><TD CLASS="l">363</TD><TD>                                                        contentAssistRequest.addProposal(proposal);</TD></TR><TR><TD CLASS="l">364</TD><TD>                                                }</TD></TR><TR><TD CLASS="l">365</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">366</TD><TD>                                }</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="69% line coverage (9 out of 13 instructions)">367</TD><TD TITLE="69% line coverage (9 out of 13 instructions)">                                else if (((attrDecl.getUsage() == CMAttributeDeclaration.FIXED) || (attrDecl.getAttrType().getImpliedValueKind() == CMDataType.IMPLIED_VALUE_FIXED)) &amp;&amp; (attrDecl.getAttrType().getImpliedValue() != null)) {</TD></TR><TR><TD CLASS="l">368</TD><TD>                                        // FIXED values</TD></TR><TR CLASS="z"><TD CLASS="l">369</TD><TD>                                        String value = attrDecl.getAttrType().getImpliedValue();</TD></TR><TR CLASS="z"><TD CLASS="l">370</TD><TD>                                        if ((value != null) &amp;&amp; (value.length() &gt; 0)) {</TD></TR><TR CLASS="z"><TD CLASS="l">371</TD><TD>                                                String rValue = &#34;\&#34;&#34; + value + &#34;\&#34;&#34;;//$NON-NLS-2$//$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">372</TD><TD>                                                CustomCompletionProposal proposal = new CustomCompletionProposal(rValue, contentAssistRequest.getReplacementBeginPosition(), contentAssistRequest.getReplacementLength(), rValue.length() + 1, image, rValue, null, proposedInfo, XMLRelevanceConstants.R_XML_ATTRIBUTE_VALUE);</TD></TR><TR CLASS="z"><TD CLASS="l">373</TD><TD>                                                contentAssistRequest.addProposal(proposal);</TD></TR><TR CLASS="z"><TD CLASS="l">374</TD><TD>                                                if ((currentValue.length() &gt; 0) &amp;&amp; !value.equals(currentValue)) {</TD></TR><TR CLASS="z"><TD CLASS="l">375</TD><TD>                                                        rValue = &#34;\&#34;&#34; + currentValue + &#34;\&#34;&#34;; //$NON-NLS-2$//$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">376</TD><TD>                                                        proposal = new CustomCompletionProposal(rValue, contentAssistRequest.getReplacementBeginPosition(), contentAssistRequest.getReplacementLength(), rValue.length() + 1, image, rValue, null, proposedInfo, XMLRelevanceConstants.R_XML_ATTRIBUTE_VALUE);</TD></TR><TR CLASS="z"><TD CLASS="l">377</TD><TD>                                                        contentAssistRequest.addProposal(proposal);</TD></TR><TR><TD CLASS="l">378</TD><TD>                                                }</TD></TR><TR><TD CLASS="l">379</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">380</TD><TD>                                }</TD></TR><TR><TD CLASS="l">381</TD><TD>                        }</TD></TR><TR><TD CLASS="l">382</TD><TD>                        else {</TD></TR><TR><TD CLASS="l">383</TD><TD>                                // unknown attribute, so supply nice empty values</TD></TR><TR CLASS="z"><TD CLASS="l">384</TD><TD>                                proposedInfo = getAdditionalInfo(null, elementDecl);</TD></TR><TR CLASS="z"><TD CLASS="l">385</TD><TD>                                CustomCompletionProposal proposal = null;</TD></TR><TR CLASS="z"><TD CLASS="l">386</TD><TD>                                if ((currentValue != null) &amp;&amp; (currentValue.length() &gt; 0)) {</TD></TR><TR CLASS="z"><TD CLASS="l">387</TD><TD>                                        String rValue = &#34;\&#34;&#34; + currentValue + &#34;\&#34;&#34;; //$NON-NLS-2$//$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">388</TD><TD>                                        proposal = new CustomCompletionProposal(rValue, contentAssistRequest.getReplacementBeginPosition(), contentAssistRequest.getReplacementLength(), 1, image, rValue, null, proposedInfo, XMLRelevanceConstants.R_XML_ATTRIBUTE_VALUE);</TD></TR><TR CLASS="z"><TD CLASS="l">389</TD><TD>                                        contentAssistRequest.addProposal(proposal);</TD></TR><TR><TD CLASS="l">390</TD><TD>                                }</TD></TR><TR><TD CLASS="l">391</TD><TD>                        }</TD></TR><TR><TD CLASS="l">392</TD><TD>                }</TD></TR><TR><TD CLASS="l">393</TD><TD>                else {</TD></TR><TR CLASS="z"><TD CLASS="l">394</TD><TD>                        setErrorMessage(UNKNOWN_CONTEXT);</TD></TR><TR><TD CLASS="l"><A NAME="3">395</A></TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">396</TD><TD>        }</TD></TR><TR><TD CLASS="l">397</TD><TD> </TD></TR><TR><TD CLASS="l">398</TD><TD>        protected void addCommentProposal(ContentAssistRequest contentAssistRequest) {</TD></TR><TR CLASS="z"><TD CLASS="l">399</TD><TD>                contentAssistRequest.addProposal(new CustomCompletionProposal(&#34;&lt;!--  --&gt;&#34;, //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">400</TD><TD>                                        contentAssistRequest.getReplacementBeginPosition(), contentAssistRequest.getReplacementLength(), 5, XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_COMMENT), NLS.bind(XMLUIMessages.Comment__, (new Object[]{&#34; &lt;!--  --&gt;&#34;})), //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">401</TD><TD>                                        null, null, XMLRelevanceConstants.R_COMMENT));</TD></TR><TR CLASS="z"><TD CLASS="l">402</TD><TD>        }</TD></TR><TR><TD CLASS="l">403</TD><TD> </TD></TR><TR><TD CLASS="l">404</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="4">405</A></TD><TD>         * Add all of the element declarations int the CMContent object into one</TD></TR><TR><TD CLASS="l">406</TD><TD>         * big list.</TD></TR><TR><TD CLASS="l">407</TD><TD>         */</TD></TR><TR><TD CLASS="l">408</TD><TD>        protected void addContent(List contentList, CMContent content) {</TD></TR><TR CLASS="z"><TD CLASS="l">409</TD><TD>                if (content == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">410</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">411</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">412</TD><TD>                if (content instanceof CMGroup) {</TD></TR><TR CLASS="z"><TD CLASS="l">413</TD><TD>                        CMNodeList children = ((CMGroup) content).getChildNodes();</TD></TR><TR CLASS="z"><TD CLASS="l">414</TD><TD>                        if (children == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">415</TD><TD>                                return;</TD></TR><TR><TD CLASS="l">416</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">417</TD><TD>                        for (int i = 0; i &lt; children.getLength(); i++) {</TD></TR><TR CLASS="z"><TD CLASS="l">418</TD><TD>                                CMNode child = children.item(i);</TD></TR><TR CLASS="z"><TD CLASS="l">419</TD><TD>                                if (child.getNodeType() == CMNode.ELEMENT_DECLARATION) {</TD></TR><TR CLASS="z"><TD CLASS="l">420</TD><TD>                                        contentList.add(child);</TD></TR><TR><TD CLASS="l">421</TD><TD>                                }</TD></TR><TR><TD CLASS="l">422</TD><TD>                                else {</TD></TR><TR CLASS="z"><TD CLASS="l">423</TD><TD>                                        if (child.getNodeType() == CMNode.GROUP) {</TD></TR><TR CLASS="z"><TD CLASS="l">424</TD><TD>                                                addContent(contentList, (CMContent) child);</TD></TR><TR><TD CLASS="l">425</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">426</TD><TD>                                        else {</TD></TR><TR CLASS="z"><TD CLASS="l">427</TD><TD>                                                throw new IllegalArgumentException(&#34;Unknown content child: &#34; + child); //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">428</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">429</TD><TD>                                }</TD></TR><TR><TD CLASS="l">430</TD><TD>                        }</TD></TR><TR><TD CLASS="l">431</TD><TD>                }</TD></TR><TR><TD CLASS="l">432</TD><TD>                else {</TD></TR><TR CLASS="z"><TD CLASS="l">433</TD><TD>                        contentList.add(content);</TD></TR><TR><TD CLASS="l">434</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="5">435</A></TD><TD>        }</TD></TR><TR><TD CLASS="l">436</TD><TD> </TD></TR><TR><TD CLASS="l">437</TD><TD>        protected void addDocTypeProposal(ContentAssistRequest contentAssistRequest) {</TD></TR><TR><TD CLASS="l">438</TD><TD>                // if a DocumentElement exists, use that for the root Element name</TD></TR><TR CLASS="z"><TD CLASS="l">439</TD><TD>                String rootname = &#34;unspecified&#34;; //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">440</TD><TD>                if (contentAssistRequest.getNode().getOwnerDocument().getDocumentElement() != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">441</TD><TD>                        rootname = contentAssistRequest.getNode().getOwnerDocument().getDocumentElement().getNodeName();</TD></TR><TR><TD CLASS="l">442</TD><TD>                }</TD></TR><TR><TD CLASS="l">443</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">444</TD><TD>                String proposedText = &#34;&lt;!DOCTYPE &#34; + rootname + &#34; PUBLIC \&#34;//UNKNOWN/\&#34; \&#34;unknown.dtd\&#34;&gt;&#34;; //$NON-NLS-1$ //$NON-NLS-2$</TD></TR><TR CLASS="z"><TD CLASS="l">445</TD><TD>                ICompletionProposal proposal = new CustomCompletionProposal(proposedText, contentAssistRequest.getReplacementBeginPosition(), contentAssistRequest.getReplacementLength(), 10, XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_DOCTYPE), &#34;&lt;!DOCTYPE ... &gt;&#34;, //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">446</TD><TD>                                        null, null, XMLRelevanceConstants.R_DOCTYPE);</TD></TR><TR><TD CLASS="l">447</TD><TD>                // TODO provide special documentation on doc type</TD></TR><TR CLASS="z"><TD CLASS="l">448</TD><TD>                contentAssistRequest.addProposal(proposal);</TD></TR><TR CLASS="z"><TD CLASS="l">449</TD><TD>        }</TD></TR><TR><TD CLASS="l">450</TD><TD> </TD></TR><TR><TD CLASS="l">451</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="43">452</A></TD><TD>         * Add the proposals for a completely empty document</TD></TR><TR><TD CLASS="l">453</TD><TD>         */</TD></TR><TR><TD CLASS="l">454</TD><TD>        protected void addEmptyDocumentProposals(ContentAssistRequest contentAssistRequest) {</TD></TR><TR><TD CLASS="l">455</TD><TD>                // nothing</TD></TR><TR CLASS="c"><TD CLASS="l">456</TD><TD>        }</TD></TR><TR><TD CLASS="l">457</TD><TD> </TD></TR><TR><TD CLASS="l">458</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="6">459</A></TD><TD>         * Add the proposals for the name in an end tag</TD></TR><TR><TD CLASS="l">460</TD><TD>         */</TD></TR><TR><TD CLASS="l">461</TD><TD>        protected void addEndTagNameProposals(ContentAssistRequest contentAssistRequest) {</TD></TR><TR><TD CLASS="l">462</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">463</TD><TD>                if (contentAssistRequest.getStartOffset() + contentAssistRequest.getRegion().getTextLength() &lt; contentAssistRequest.getReplacementBeginPosition()) {</TD></TR><TR CLASS="z"><TD CLASS="l">464</TD><TD>                        CustomCompletionProposal proposal = new CustomCompletionProposal(&#34;&gt;&#34;, //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">465</TD><TD>                                                contentAssistRequest.getReplacementBeginPosition(), contentAssistRequest.getReplacementLength(), 1, XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_TAG_GENERIC), NLS.bind(XMLUIMessages.Close_with__, (new Object[]{&#34; '&gt;'&#34;})), //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">466</TD><TD>                                                null, null, XMLRelevanceConstants.R_END_TAG_NAME);</TD></TR><TR CLASS="z"><TD CLASS="l">467</TD><TD>                        contentAssistRequest.addProposal(proposal);</TD></TR><TR><TD CLASS="l">468</TD><TD>                }</TD></TR><TR><TD CLASS="l">469</TD><TD>                else {</TD></TR><TR CLASS="z"><TD CLASS="l">470</TD><TD>                        IDOMNode node = (IDOMNode) contentAssistRequest.getNode();</TD></TR><TR CLASS="z"><TD CLASS="l">471</TD><TD>                        ModelQuery modelQuery = ModelQueryUtil.getModelQuery(node.getOwnerDocument());</TD></TR><TR CLASS="z"><TD CLASS="l">472</TD><TD>                        Node aNode = contentAssistRequest.getNode();</TD></TR><TR CLASS="z"><TD CLASS="l">473</TD><TD>                        String matchString = contentAssistRequest.getMatchString();</TD></TR><TR CLASS="z"><TD CLASS="l">474</TD><TD>                        if (matchString.startsWith(&#34;&lt;/&#34;)) {</TD></TR><TR CLASS="z"><TD CLASS="l">475</TD><TD>                                matchString = matchString.substring(2);</TD></TR><TR><TD CLASS="l">476</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">477</TD><TD>                        while (aNode != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">478</TD><TD>                                if (aNode.getNodeType() == Node.ELEMENT_NODE) {</TD></TR><TR CLASS="z"><TD CLASS="l">479</TD><TD>                                        if (aNode.getNodeName().startsWith(matchString)) {</TD></TR><TR CLASS="z"><TD CLASS="l">480</TD><TD>                                                IDOMNode aXMLNode = (IDOMNode) aNode;</TD></TR><TR CLASS="z"><TD CLASS="l">481</TD><TD>                                                CMElementDeclaration ed = modelQuery.getCMElementDeclaration((Element) aNode);</TD></TR><TR CLASS="z"><TD CLASS="l">482</TD><TD>                                                if ((aXMLNode.getEndStructuredDocumentRegion() == null) &amp;&amp; ((ed == null) || (ed.getContentType() != CMElementDeclaration.EMPTY))) {</TD></TR><TR CLASS="z"><TD CLASS="l">483</TD><TD>                                                        String proposedText = aNode.getNodeName();</TD></TR><TR CLASS="z"><TD CLASS="l">484</TD><TD>                                                        String proposedInfo = (ed != null) ? getAdditionalInfo(null, ed) : null;</TD></TR><TR CLASS="z"><TD CLASS="l">485</TD><TD>                                                        if ((node.getNodeType() == Node.TEXT_NODE) &amp;&amp; !contentAssistRequest.getDocumentRegion().isEnded()) {</TD></TR><TR CLASS="z"><TD CLASS="l">486</TD><TD>                                                                proposedText += &#34;&gt;&#34;; //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">487</TD><TD>                                                        }</TD></TR><TR CLASS="z"><TD CLASS="l">488</TD><TD>                                                        CustomCompletionProposal proposal = null;</TD></TR><TR><TD CLASS="l">489</TD><TD>                                                        // double check to see if the region acted upon is</TD></TR><TR><TD CLASS="l">490</TD><TD>                                                        // a tag name; replace it if so</TD></TR><TR CLASS="z"><TD CLASS="l">491</TD><TD>                                                        Image image = CMImageUtil.getImage(ed);</TD></TR><TR CLASS="z"><TD CLASS="l">492</TD><TD>                                                        if (image == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">493</TD><TD>                                                                image = XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_TAG_GENERIC);</TD></TR><TR><TD CLASS="l">494</TD><TD>                                                        }</TD></TR><TR CLASS="z"><TD CLASS="l">495</TD><TD>                                                        if (contentAssistRequest.getRegion().getType() == DOMRegionContext.XML_TAG_NAME) {</TD></TR><TR CLASS="z"><TD CLASS="l">496</TD><TD>                                                                proposal = new CustomCompletionProposal(proposedText, contentAssistRequest.getStartOffset(), contentAssistRequest.getRegion().getTextLength(), proposedText.length(), image, proposedText, null, proposedInfo, XMLRelevanceConstants.R_END_TAG_NAME);</TD></TR><TR><TD CLASS="l">497</TD><TD>                                                        }</TD></TR><TR><TD CLASS="l">498</TD><TD>                                                        else {</TD></TR><TR CLASS="z"><TD CLASS="l">499</TD><TD>                                                                proposal = new CustomCompletionProposal(proposedText, contentAssistRequest.getReplacementBeginPosition(), contentAssistRequest.getReplacementLength(), proposedText.length(), image, NLS.bind(XMLUIMessages.Close_with__, (new Object[]{&#34;'&#34; + proposedText + &#34;'&#34;})), //$NON-NLS-1$ //$NON-NLS-2$</TD></TR><TR CLASS="z"><TD CLASS="l">500</TD><TD>                                                                                        null, proposedInfo, XMLRelevanceConstants.R_END_TAG_NAME);</TD></TR><TR><TD CLASS="l">501</TD><TD>                                                        }</TD></TR><TR CLASS="z"><TD CLASS="l">502</TD><TD>                                                        contentAssistRequest.addProposal(proposal);</TD></TR><TR><TD CLASS="l">503</TD><TD>                                                }</TD></TR><TR><TD CLASS="l">504</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">505</TD><TD>                                }</TD></TR><TR CLASS="z"><TD CLASS="l">506</TD><TD>                                aNode = aNode.getParentNode();</TD></TR><TR><TD CLASS="l">507</TD><TD>                        }</TD></TR><TR><TD CLASS="l">508</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">509</TD><TD>        }</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>         * Prompt for end tags to a non-empty Node that hasn't ended Handles these</TD></TR><TR><TD CLASS="l">513</TD><TD>         * cases: &lt;br&gt;</TD></TR><TR><TD CLASS="l">514</TD><TD>         * &lt;tagOpen&gt;| &lt;br&gt;</TD></TR><TR><TD CLASS="l">515</TD><TD>         * &lt;tagOpen&gt;&lt; |&lt;br&gt;</TD></TR><TR><TD CLASS="l">516</TD><TD>         * &lt;tagOpen&gt;&lt;/ |</TD></TR><TR><TD CLASS="l"><A NAME="24">517</A></TD><TD>         * </TD></TR><TR><TD CLASS="l">518</TD><TD>         * @param contentAssistRequest</TD></TR><TR><TD CLASS="l">519</TD><TD>         */</TD></TR><TR><TD CLASS="l">520</TD><TD>        protected void addEndTagProposals(ContentAssistRequest contentAssistRequest) {</TD></TR><TR CLASS="c"><TD CLASS="l">521</TD><TD>                IDOMNode node = (IDOMNode) contentAssistRequest.getParent();</TD></TR><TR><TD CLASS="l">522</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">523</TD><TD>                if (isCommentNode(node)) {</TD></TR><TR><TD CLASS="l">524</TD><TD>                        // loop and find non comment node parent</TD></TR><TR CLASS="z"><TD CLASS="l">525</TD><TD>                        while ((node != null) &amp;&amp; isCommentNode(node)) {</TD></TR><TR CLASS="z"><TD CLASS="l">526</TD><TD>                                node = (IDOMNode) node.getParentNode();</TD></TR><TR><TD CLASS="l">527</TD><TD>                        }</TD></TR><TR><TD CLASS="l">528</TD><TD>                }</TD></TR><TR><TD CLASS="l">529</TD><TD> </TD></TR><TR><TD CLASS="l">530</TD><TD>                // node is already closed</TD></TR><TR CLASS="c"><TD CLASS="l">531</TD><TD>                if (node.isClosed()) {</TD></TR><TR><TD CLASS="l">532</TD><TD>                        // loop and find non comment unclose node parent</TD></TR><TR CLASS="c"><TD CLASS="l">533</TD><TD>                        while ((node != null) &amp;&amp; node.isClosed()) {</TD></TR><TR CLASS="c"><TD CLASS="l">534</TD><TD>                                node = (IDOMNode) node.getParentNode();</TD></TR><TR><TD CLASS="l">535</TD><TD>                        }</TD></TR><TR><TD CLASS="l">536</TD><TD>                }</TD></TR><TR><TD CLASS="l">537</TD><TD>                // there were no unclosed tags</TD></TR><TR CLASS="c"><TD CLASS="l">538</TD><TD>                if (node == null) {</TD></TR><TR CLASS="c"><TD CLASS="l">539</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">540</TD><TD>                }</TD></TR><TR><TD CLASS="l">541</TD><TD> </TD></TR><TR><TD CLASS="l">542</TD><TD>                // data to create a CustomCompletionProposal</TD></TR><TR CLASS="z"><TD CLASS="l">543</TD><TD>                String replaceText = node.getNodeName() + &#34;&gt;&#34;; //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">544</TD><TD>                int replaceBegin = contentAssistRequest.getReplacementBeginPosition();</TD></TR><TR CLASS="z"><TD CLASS="l">545</TD><TD>                int replaceLength = contentAssistRequest.getReplacementLength();</TD></TR><TR CLASS="z"><TD CLASS="l">546</TD><TD>                int cursorOffset = node.getNodeName().length() + 1;</TD></TR><TR CLASS="z"><TD CLASS="l">547</TD><TD>                String displayString = &#34;&#34;; //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">548</TD><TD>                String proposedInfo = &#34;&#34;; //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">549</TD><TD>                Image image = XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_TAG_GENERIC);</TD></TR><TR><TD CLASS="l">550</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">551</TD><TD>                setErrorMessage(null);</TD></TR><TR CLASS="z"><TD CLASS="l">552</TD><TD>                boolean addProposal = false;</TD></TR><TR><TD CLASS="l">553</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">554</TD><TD>                if (node.getNodeType() == Node.ELEMENT_NODE) {</TD></TR><TR><TD CLASS="l">555</TD><TD>                        // ////////////////////////////////////////////////////////////////////////////////////</TD></TR><TR CLASS="z"><TD CLASS="l">556</TD><TD>                        IStructuredDocument sDoc = (IStructuredDocument) fTextViewer.getDocument();</TD></TR><TR CLASS="z"><TD CLASS="l">557</TD><TD>                        IStructuredDocumentRegion xmlEndTagOpen = sDoc.getRegionAtCharacterOffset(contentAssistRequest.getReplacementBeginPosition());</TD></TR><TR><TD CLASS="l">558</TD><TD>                        // skip backward to &#34;&lt;&#34;, &#34;&lt;/&#34;, or the (unclosed) start tag, null</TD></TR><TR><TD CLASS="l">559</TD><TD>                        // if not found</TD></TR><TR CLASS="z"><TD CLASS="l">560</TD><TD>                        String type = &#34;&#34;; //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">561</TD><TD>                        while ((xmlEndTagOpen != null) &amp;&amp; ((type = xmlEndTagOpen.getType()) != DOMRegionContext.XML_END_TAG_OPEN) &amp;&amp; (type != DOMRegionContext.XML_TAG_CLOSE) &amp;&amp; !needsEndTag(xmlEndTagOpen) &amp;&amp; (type != DOMRegionContext.XML_TAG_OPEN)) {</TD></TR><TR CLASS="z"><TD CLASS="l">562</TD><TD>                                xmlEndTagOpen = xmlEndTagOpen.getPrevious();</TD></TR><TR><TD CLASS="l">563</TD><TD>                        }</TD></TR><TR><TD CLASS="l">564</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">565</TD><TD>                        if (xmlEndTagOpen == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">566</TD><TD>                                return;</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>                        node = (IDOMNode) node.getModel().getIndexedRegion(xmlEndTagOpen.getStartOffset());</TD></TR><TR CLASS="z"><TD CLASS="l">570</TD><TD>                        node = (IDOMNode) node.getParentNode();</TD></TR><TR><TD CLASS="l">571</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">572</TD><TD>                        if (isStartTag(xmlEndTagOpen)) {</TD></TR><TR><TD CLASS="l">573</TD><TD>                                // this is the case for a start tag w/out end tag</TD></TR><TR><TD CLASS="l">574</TD><TD>                                // eg:</TD></TR><TR><TD CLASS="l">575</TD><TD>                                // &lt;p&gt;</TD></TR><TR><TD CLASS="l">576</TD><TD>                                // &lt;% String test = &#34;test&#34;; %&gt;</TD></TR><TR><TD CLASS="l">577</TD><TD>                                // |</TD></TR><TR CLASS="z"><TD CLASS="l">578</TD><TD>                                if (needsEndTag(xmlEndTagOpen)) {</TD></TR><TR CLASS="z"><TD CLASS="l">579</TD><TD>                                        String tagName = getTagName(xmlEndTagOpen);</TD></TR><TR CLASS="z"><TD CLASS="l">580</TD><TD>                                        xmlEndTagOpen.getTextEndOffset();</TD></TR><TR CLASS="z"><TD CLASS="l">581</TD><TD>                                        replaceLength = 0;</TD></TR><TR CLASS="z"><TD CLASS="l">582</TD><TD>                                        replaceText = &#34;&lt;/&#34; + tagName + &#34;&gt;&#34;; //$NON-NLS-1$ //$NON-NLS-2$ $NON-NLS-2$</TD></TR><TR><TD CLASS="l">583</TD><TD>                                        // replaceText = &#34;&lt;/&#34; + node.getNodeName() + &#34;&gt;&#34;;</TD></TR><TR><TD CLASS="l">584</TD><TD>                                        // //$NON-NLS-1$ $NON-NLS-2$</TD></TR><TR CLASS="z"><TD CLASS="l">585</TD><TD>                                        cursorOffset = tagName.length() + 3;</TD></TR><TR CLASS="z"><TD CLASS="l">586</TD><TD>                                        displayString = NLS.bind(XMLUIMessages.End_with__, (new Object[]{tagName}));</TD></TR><TR CLASS="z"><TD CLASS="l">587</TD><TD>                                        addProposal = true;</TD></TR><TR><TD CLASS="l">588</TD><TD>                                }</TD></TR><TR><TD CLASS="l">589</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">590</TD><TD>                        else if (type == DOMRegionContext.XML_END_TAG_OPEN) {</TD></TR><TR><TD CLASS="l">591</TD><TD>                                // this is the case for: &lt;tag&gt; &lt;/ |</TD></TR><TR><TD CLASS="l">592</TD><TD>                                // possibly &lt;tag&gt; &lt;/ |&lt;anotherTag&gt;</TD></TR><TR><TD CLASS="l">593</TD><TD>                                // should only be replacing white space...</TD></TR><TR CLASS="z"><TD CLASS="l">594</TD><TD>                                replaceLength = (replaceBegin &gt; xmlEndTagOpen.getTextEndOffset()) ? replaceBegin - xmlEndTagOpen.getTextEndOffset() : 0;</TD></TR><TR CLASS="z"><TD CLASS="l">595</TD><TD>                                replaceText = node.getNodeName() + &#34;&gt;&#34;; //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">596</TD><TD>                                cursorOffset = replaceText.length();</TD></TR><TR CLASS="z"><TD CLASS="l">597</TD><TD>                                replaceBegin = xmlEndTagOpen.getTextEndOffset();</TD></TR><TR CLASS="z"><TD CLASS="l">598</TD><TD>                                displayString = NLS.bind(XMLUIMessages.End_with_, (new Object[]{node.getNodeName()}));</TD></TR><TR CLASS="z"><TD CLASS="l">599</TD><TD>                                addProposal = true;</TD></TR><TR><TD CLASS="l">600</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">601</TD><TD>                        else if (type == DOMRegionContext.XML_TAG_OPEN) {</TD></TR><TR><TD CLASS="l">602</TD><TD>                                // this is the case for: &lt;tag&gt; &lt; |</TD></TR><TR CLASS="z"><TD CLASS="l">603</TD><TD>                                replaceText = &#34;/&#34; + node.getNodeName() + &#34;&gt;&#34;; //$NON-NLS-1$ //$NON-NLS-2$ $NON-NLS-2$</TD></TR><TR CLASS="z"><TD CLASS="l">604</TD><TD>                                cursorOffset = replaceText.length();</TD></TR><TR><TD CLASS="l">605</TD><TD>                                // replaceText = &#34;/&#34; + node.getNodeName() + &#34;&gt;&#34;; //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">606</TD><TD>                                // $NON-NLS-2$</TD></TR><TR><TD CLASS="l">607</TD><TD>                                // should only be replacing white space...</TD></TR><TR CLASS="z"><TD CLASS="l">608</TD><TD>                                replaceLength = (replaceBegin &gt; xmlEndTagOpen.getTextEndOffset()) ? replaceBegin - xmlEndTagOpen.getTextEndOffset() : 0;</TD></TR><TR CLASS="z"><TD CLASS="l">609</TD><TD>                                replaceBegin = xmlEndTagOpen.getTextEndOffset();</TD></TR><TR CLASS="z"><TD CLASS="l">610</TD><TD>                                displayString = NLS.bind(XMLUIMessages.End_with_, (new Object[]{&#34;/&#34; + node.getNodeName()})); //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">611</TD><TD>                                addProposal = true;</TD></TR><TR><TD CLASS="l">612</TD><TD>                        }</TD></TR><TR><TD CLASS="l">613</TD><TD>                }</TD></TR><TR><TD CLASS="l">614</TD><TD>                // ////////////////////////////////////////////////////////////////////////////////////</TD></TR><TR><TD CLASS="l">615</TD><TD>                // sometimes the node is not null, but</TD></TR><TR><TD CLASS="l">616</TD><TD>                // getNodeValue() is null, put in a null check</TD></TR><TR CLASS="z"><TD CLASS="l">617</TD><TD>                else if ((node.getNodeValue() != null) &amp;&amp; (node.getNodeValue().indexOf(&#34;&lt;/&#34;) != -1)) { //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">618</TD><TD>                        // the case where &#34;&lt;/&#34; is started, but the nodes comes in as a</TD></TR><TR><TD CLASS="l">619</TD><TD>                        // text node (instead of element)</TD></TR><TR><TD CLASS="l">620</TD><TD>                        // like this: &lt;tag&gt; &lt;/|</TD></TR><TR CLASS="z"><TD CLASS="l">621</TD><TD>                        Node parent = node.getParentNode();</TD></TR><TR CLASS="z"><TD CLASS="l">622</TD><TD>                        if ((parent != null) &amp;&amp; (parent.getNodeType() != Node.DOCUMENT_NODE)) {</TD></TR><TR CLASS="z"><TD CLASS="l">623</TD><TD>                                replaceText = parent.getNodeName() + &#34;&gt;&#34;; //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">624</TD><TD>                                cursorOffset = replaceText.length();</TD></TR><TR CLASS="z"><TD CLASS="l">625</TD><TD>                                displayString = NLS.bind(XMLUIMessages.End_with__, (new Object[]{parent.getNodeName()}));</TD></TR><TR CLASS="z"><TD CLASS="l">626</TD><TD>                                setErrorMessage(null);</TD></TR><TR CLASS="z"><TD CLASS="l">627</TD><TD>                                addProposal = true;</TD></TR><TR><TD CLASS="l">628</TD><TD>                        }</TD></TR><TR><TD CLASS="l">629</TD><TD>                }</TD></TR><TR><TD CLASS="l">630</TD><TD>                // ////////////////////////////////////////////////////////////////////////////////////</TD></TR><TR CLASS="z"><TD CLASS="l">631</TD><TD>                else if (node.getNodeType() == Node.DOCUMENT_NODE) {</TD></TR><TR CLASS="z"><TD CLASS="l">632</TD><TD>                        setErrorMessage(UNKNOWN_CONTEXT);</TD></TR><TR><TD CLASS="l">633</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">634</TD><TD>                if (addProposal == true) {</TD></TR><TR CLASS="z"><TD CLASS="l">635</TD><TD>                        CustomCompletionProposal proposal = new CustomCompletionProposal(replaceText, replaceBegin, replaceLength, cursorOffset, image, displayString, null, proposedInfo, XMLRelevanceConstants.R_END_TAG);</TD></TR><TR CLASS="z"><TD CLASS="l">636</TD><TD>                        contentAssistRequest.addProposal(proposal);</TD></TR><TR><TD CLASS="l"><A NAME="2d">637</A></TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">638</TD><TD>        }</TD></TR><TR><TD CLASS="l">639</TD><TD> </TD></TR><TR><TD CLASS="l">640</TD><TD>        protected void addEntityProposals(ContentAssistRequest contentAssistRequest, int documentPosition, ITextRegion completionRegion, IDOMNode treeNode) {</TD></TR><TR CLASS="c"><TD CLASS="l">641</TD><TD>                ICompletionProposal[] eps = computeEntityReferenceProposals(documentPosition, completionRegion, treeNode);</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="52% line coverage (11 out of 21 instructions)">642</TD><TD TITLE="52% line coverage (11 out of 21 instructions)">                for (int i = 0; (eps != null) &amp;&amp; (i &lt; eps.length); i++) {</TD></TR><TR CLASS="z"><TD CLASS="l">643</TD><TD>                        contentAssistRequest.addProposal(eps[i]);</TD></TR><TR><TD CLASS="l"><A NAME="7">644</A></TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">645</TD><TD>        }</TD></TR><TR><TD CLASS="l">646</TD><TD> </TD></TR><TR><TD CLASS="l">647</TD><TD>        protected void addEntityProposals(Vector proposals, Properties map, String key, int nodeOffset, IStructuredDocumentRegion sdRegion, ITextRegion completionRegion) {</TD></TR><TR CLASS="z"><TD CLASS="l">648</TD><TD>                if (map == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">649</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">650</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">651</TD><TD>                String entityName = &#34;&#34;; //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">652</TD><TD>                String entityValue = &#34;&#34;; //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">653</TD><TD>                Image entityIcon = XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_ENTITY_REFERENCE);</TD></TR><TR CLASS="z"><TD CLASS="l">654</TD><TD>                String replacementText = &#34;&#34;; //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">655</TD><TD>                String displayString = &#34;&#34;; //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">656</TD><TD>                Enumeration keys = map.keys();</TD></TR><TR><TD CLASS="l">657</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">658</TD><TD>                while ((keys != null) &amp;&amp; keys.hasMoreElements()) {</TD></TR><TR CLASS="z"><TD CLASS="l">659</TD><TD>                        entityName = (String) keys.nextElement();</TD></TR><TR CLASS="z"><TD CLASS="l">660</TD><TD>                        entityValue = map.getProperty(entityName);</TD></TR><TR><TD CLASS="l">661</TD><TD>                        // filter based on partial entity string...</TD></TR><TR CLASS="z"><TD CLASS="l">662</TD><TD>                        if (entityName.toLowerCase().startsWith(key.toLowerCase()) || key.trim().equals(&#34;&#34;)) //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">663</TD><TD>                        {</TD></TR><TR><TD CLASS="l">664</TD><TD>                                // figure out selection...if text is selected, add it to</TD></TR><TR><TD CLASS="l">665</TD><TD>                                // selection length</TD></TR><TR CLASS="z"><TD CLASS="l">666</TD><TD>                                int selectionLength = nodeOffset;</TD></TR><TR CLASS="z"><TD CLASS="l">667</TD><TD>                                if (fTextViewer != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">668</TD><TD>                                        selectionLength += fTextViewer.getSelectedRange().y;</TD></TR><TR><TD CLASS="l">669</TD><TD>                                }</TD></TR><TR><TD CLASS="l">670</TD><TD>                                // create a new proposal for entity string...</TD></TR><TR CLASS="z"><TD CLASS="l">671</TD><TD>                                replacementText = &#34;&amp;&#34; + entityName + &#34;;&#34;; //$NON-NLS-1$ //$NON-NLS-2$ </TD></TR><TR CLASS="z"><TD CLASS="l">672</TD><TD>                                displayString = &#34;&amp;&#34; + entityName + &#34;; (&#34; + entityValue + &#34;)&#34;; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$</TD></TR><TR CLASS="z"><TD CLASS="l">673</TD><TD>                                ICompletionProposal cp = new CustomCompletionProposal(replacementText, sdRegion.getStartOffset(completionRegion), selectionLength, replacementText.length(), entityIcon, displayString, null, null, XMLRelevanceConstants.R_ENTITY);</TD></TR><TR CLASS="z"><TD CLASS="l">674</TD><TD>                                if (cp != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">675</TD><TD>                                        proposals.add(cp);</TD></TR><TR><TD CLASS="l">676</TD><TD>                                }</TD></TR><TR><TD CLASS="l">677</TD><TD>                        }</TD></TR><TR><TD CLASS="l"><A NAME="8">678</A></TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">679</TD><TD>        }</TD></TR><TR><TD CLASS="l">680</TD><TD> </TD></TR><TR><TD CLASS="l">681</TD><TD>        protected void addPCDATAProposal(String nodeName, ContentAssistRequest contentAssistRequest) {</TD></TR><TR CLASS="z"><TD CLASS="l">682</TD><TD>                CustomCompletionProposal proposal = new CustomCompletionProposal(&#34;&lt;![CDATA[]]&gt;&#34;, //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">683</TD><TD>                                        contentAssistRequest.getReplacementBeginPosition(), contentAssistRequest.getReplacementLength(), 9, XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_CDATASECTION), &#34;CDATA Section&#34;, //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">684</TD><TD>                                        null, null, XMLRelevanceConstants.R_CDATA);</TD></TR><TR CLASS="z"><TD CLASS="l">685</TD><TD>                contentAssistRequest.addProposal(proposal);</TD></TR><TR><TD CLASS="l">686</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">687</TD><TD>                proposal = new CustomCompletionProposal(nodeName, contentAssistRequest.getReplacementBeginPosition(), contentAssistRequest.getReplacementLength(), nodeName.length(), XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_TXTEXT), &#34;#PCDATA&#34;, //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">688</TD><TD>                                        null, null, XMLRelevanceConstants.R_CDATA);</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="9">689</A></TD><TD>                contentAssistRequest.addProposal(proposal);</TD></TR><TR CLASS="z"><TD CLASS="l">690</TD><TD>        }</TD></TR><TR><TD CLASS="l">691</TD><TD> </TD></TR><TR><TD CLASS="l">692</TD><TD>        protected void addStartDocumentProposals(ContentAssistRequest contentAssistRequest) {</TD></TR><TR CLASS="z"><TD CLASS="l">693</TD><TD>                Node aNode = contentAssistRequest.getNode();</TD></TR><TR CLASS="z"><TD CLASS="l">694</TD><TD>                boolean xmlpiFound = false;</TD></TR><TR CLASS="z"><TD CLASS="l">695</TD><TD>                Document owningDocument = aNode.getOwnerDocument();</TD></TR><TR><TD CLASS="l">696</TD><TD>                // ==&gt; // int xmlpiNodePosition = -1;</TD></TR><TR><TD CLASS="l">697</TD><TD> </TD></TR><TR><TD CLASS="l">698</TD><TD>                // make sure xmlpi is root element</TD></TR><TR><TD CLASS="l">699</TD><TD>                // don't want doctype proposal if XMLPI isn't first element...</TD></TR><TR CLASS="z"><TD CLASS="l">700</TD><TD>                Node first = owningDocument.getFirstChild();</TD></TR><TR CLASS="z"><TD CLASS="l">701</TD><TD>                boolean xmlpiIsFirstElement = ((first != null) &amp;&amp; (first.getNodeType() == Node.PROCESSING_INSTRUCTION_NODE));</TD></TR><TR CLASS="z"><TD CLASS="l">702</TD><TD>                boolean insertDoctype = xmlpiIsFirstElement;</TD></TR><TR><TD CLASS="l">703</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">704</TD><TD>                for (Node child = owningDocument.getFirstChild(); child != null; child = child.getNextSibling()) {</TD></TR><TR CLASS="z"><TD CLASS="l">705</TD><TD>                        boolean xmlpi = ((child.getNodeType() == Node.PROCESSING_INSTRUCTION_NODE) &amp;&amp; child.getNodeName().equals(&#34;xml&#34;)); //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">706</TD><TD>                        xmlpiFound = xmlpiFound || xmlpi;</TD></TR><TR CLASS="z"><TD CLASS="l">707</TD><TD>                        if (xmlpiFound) {</TD></TR><TR CLASS="z"><TD CLASS="l">708</TD><TD>                                if (child instanceof IDOMNode) {</TD></TR><TR><TD CLASS="l">709</TD><TD>                                        // ==&gt; // int xmlpiNodePosition =</TD></TR><TR><TD CLASS="l">710</TD><TD>                                        // ((XMLNode)child).getEndOffset();</TD></TR><TR><TD CLASS="l">711</TD><TD>                                }</TD></TR><TR><TD CLASS="l">712</TD><TD>                                // skip white space and text</TD></TR><TR CLASS="z"><TD CLASS="l">713</TD><TD>                                while (((child = child.getNextSibling()) != null) &amp;&amp; (child.getNodeType() == Node.TEXT_NODE)) {</TD></TR><TR><TD CLASS="l">714</TD><TD>                                        // just skipping</TD></TR><TR><TD CLASS="l">715</TD><TD>                                }</TD></TR><TR><TD CLASS="l">716</TD><TD>                                // check if theres a node inbetween XMLPI and cursor position</TD></TR><TR CLASS="z"><TD CLASS="l">717</TD><TD>                                if ((child != null) &amp;&amp; (child instanceof IDOMNode)) {</TD></TR><TR CLASS="z"><TD CLASS="l">718</TD><TD>                                        if ((contentAssistRequest.getReplacementBeginPosition() &gt;= ((IDOMNode) child).getEndOffset()) || !xmlpiIsFirstElement) {</TD></TR><TR CLASS="z"><TD CLASS="l">719</TD><TD>                                                insertDoctype = false;</TD></TR><TR><TD CLASS="l">720</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">721</TD><TD>                                }</TD></TR><TR CLASS="z"><TD CLASS="l">722</TD><TD>                                break;</TD></TR><TR><TD CLASS="l">723</TD><TD>                        }</TD></TR><TR><TD CLASS="l">724</TD><TD>                }</TD></TR><TR><TD CLASS="l">725</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">726</TD><TD>                if (xmlpiFound &amp;&amp; (owningDocument.getDoctype() == null) &amp;&amp; isCursorAfterXMLPI(contentAssistRequest) &amp;&amp; insertDoctype) {</TD></TR><TR CLASS="z"><TD CLASS="l">727</TD><TD>                        addDocTypeProposal(contentAssistRequest);</TD></TR><TR><TD CLASS="l">728</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">729</TD><TD>        }</TD></TR><TR><TD CLASS="l">730</TD><TD> </TD></TR><TR><TD CLASS="l"><A NAME="26">731</A></TD><TD>        /**</TD></TR><TR><TD CLASS="l">732</TD><TD>         * Close an unclosed start tag</TD></TR><TR><TD CLASS="l">733</TD><TD>         */</TD></TR><TR><TD CLASS="l">734</TD><TD>        protected void addTagCloseProposals(ContentAssistRequest contentAssistRequest) {</TD></TR><TR CLASS="c"><TD CLASS="l">735</TD><TD>                IDOMNode node = (IDOMNode) contentAssistRequest.getParent();</TD></TR><TR CLASS="c"><TD CLASS="l">736</TD><TD>                if (node.getNodeType() == Node.ELEMENT_NODE) {</TD></TR><TR><TD CLASS="l">737</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">738</TD><TD>                        CMElementDeclaration elementDecl = getCMElementDeclaration(node);</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="93% line coverage (14 out of 15 instructions)">739</TD><TD TITLE="93% line coverage (14 out of 15 instructions)">                        String proposedInfo = (elementDecl != null) ? getAdditionalInfo(null, elementDecl) : null;</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="92% line coverage (11 out of 12 instructions)">740</TD><TD TITLE="92% line coverage (11 out of 12 instructions)">                        int contentType = (elementDecl != null) ? elementDecl.getContentType() : CMElementDeclaration.ANY;</TD></TR><TR><TD CLASS="l">741</TD><TD>                        // if it's XML and content doesn't HAVE to be element, add &#34;/&gt;&#34;</TD></TR><TR><TD CLASS="l">742</TD><TD>                        // proposal.</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="94% line coverage (16 out of 17 instructions)">743</TD><TD TITLE="94% line coverage (16 out of 17 instructions)">                        boolean endWithSlashBracket = (getXML(node) &amp;&amp; (contentType != CMElementDeclaration.ELEMENT));</TD></TR><TR><TD CLASS="l">744</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">745</TD><TD>                        Image image = CMImageUtil.getImage(elementDecl);</TD></TR><TR CLASS="c"><TD CLASS="l">746</TD><TD>                        if (image == null) {</TD></TR><TR CLASS="c"><TD CLASS="l">747</TD><TD>                                image = XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_TAG_GENERIC);</TD></TR><TR><TD CLASS="l">748</TD><TD>                        }</TD></TR><TR><TD CLASS="l">749</TD><TD> </TD></TR><TR><TD CLASS="l">750</TD><TD>                        // is the start tag ended properly?</TD></TR><TR CLASS="c"><TD CLASS="l">751</TD><TD>                        if ((contentAssistRequest.getDocumentRegion() == node.getFirstStructuredDocumentRegion()) &amp;&amp; !(node.getFirstStructuredDocumentRegion()).isEnded()) {</TD></TR><TR CLASS="z"><TD CLASS="l">752</TD><TD>                                setErrorMessage(null);</TD></TR><TR><TD CLASS="l">753</TD><TD>                                // Is this supposed to be an empty tag? Note that if we can't</TD></TR><TR><TD CLASS="l">754</TD><TD>                                // tell, we assume it's not.</TD></TR><TR CLASS="z"><TD CLASS="l">755</TD><TD>                                if ((elementDecl != null) &amp;&amp; (elementDecl.getContentType() == CMElementDeclaration.EMPTY)) {</TD></TR><TR><TD CLASS="l">756</TD><TD>                                        // prompt with a self-closing end character if needed</TD></TR><TR CLASS="z"><TD CLASS="l">757</TD><TD>                                        CustomCompletionProposal proposal = new CustomCompletionProposal(getContentGenerator().getStartTagClose(node, elementDecl), contentAssistRequest.getReplacementBeginPosition(),</TD></TR><TR><TD CLASS="l">758</TD><TD>                                        // this is one of the few times to ignore the length --</TD></TR><TR><TD CLASS="l">759</TD><TD>                                                                // always insert</TD></TR><TR><TD CLASS="l">760</TD><TD>                                                                // contentAssistRequest.getReplacementLength(),</TD></TR><TR CLASS="z"><TD CLASS="l">761</TD><TD>                                                                0, getContentGenerator().getStartTagClose(node, elementDecl).length(), image, NLS.bind(XMLUIMessages.Close_with___, (new Object[]{getContentGenerator().getStartTagClose(node, elementDecl)})), null, proposedInfo, XMLRelevanceConstants.R_CLOSE_TAG);</TD></TR><TR CLASS="z"><TD CLASS="l">762</TD><TD>                                        contentAssistRequest.addProposal(proposal);</TD></TR><TR><TD CLASS="l">763</TD><TD>                                }</TD></TR><TR><TD CLASS="l">764</TD><TD>                                else {</TD></TR><TR><TD CLASS="l">765</TD><TD>                                        // prompt with a close for the start tag</TD></TR><TR CLASS="z"><TD CLASS="l">766</TD><TD>                                        CustomCompletionProposal proposal = new CustomCompletionProposal(&#34;&gt;&#34;, //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">767</TD><TD>                                                                contentAssistRequest.getReplacementBeginPosition(),</TD></TR><TR><TD CLASS="l">768</TD><TD>                                                                // this is one of the few times to ignore the</TD></TR><TR><TD CLASS="l">769</TD><TD>                                                                // length -- always insert</TD></TR><TR><TD CLASS="l">770</TD><TD>                                                                // contentAssistRequest.getReplacementLength(),</TD></TR><TR CLASS="z"><TD CLASS="l">771</TD><TD>                                                                0, 1, image, NLS.bind(XMLUIMessages.Close_with__, (new Object[]{&#34; '&gt;'&#34;})), //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">772</TD><TD>                                                                null, proposedInfo, XMLRelevanceConstants.R_CLOSE_TAG);</TD></TR><TR CLASS="z"><TD CLASS="l">773</TD><TD>                                        contentAssistRequest.addProposal(proposal);</TD></TR><TR><TD CLASS="l">774</TD><TD> </TD></TR><TR><TD CLASS="l">775</TD><TD>                                        // prompt with the closer for the start tag and an end tag</TD></TR><TR><TD CLASS="l">776</TD><TD>                                        // if one is not present</TD></TR><TR CLASS="z"><TD CLASS="l">777</TD><TD>                                        if (node.getEndStructuredDocumentRegion() == null) {</TD></TR><TR><TD CLASS="l">778</TD><TD>                                                // make sure tag name is actually what it thinks it</TD></TR><TR><TD CLASS="l">779</TD><TD>                                                // is...(eg. &lt;%@ vs. &lt;jsp:directive)</TD></TR><TR CLASS="z"><TD CLASS="l">780</TD><TD>                                                IStructuredDocumentRegion sdr = contentAssistRequest.getDocumentRegion();</TD></TR><TR CLASS="z"><TD CLASS="l">781</TD><TD>                                                String openingTagText = (sdr != null) ? sdr.getFullText() : &#34;&#34;; //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">782</TD><TD>                                                if ((openingTagText != null) &amp;&amp; (openingTagText.indexOf(node.getNodeName()) != -1)) {</TD></TR><TR CLASS="z"><TD CLASS="l">783</TD><TD>                                                        proposal = new CustomCompletionProposal(&#34;&gt;&lt;/&#34; + node.getNodeName() + &#34;&gt;&#34;, //$NON-NLS-2$//$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">784</TD><TD>                                                                                contentAssistRequest.getReplacementBeginPosition(),</TD></TR><TR><TD CLASS="l">785</TD><TD>                                                                                // this is one of the few times to</TD></TR><TR><TD CLASS="l">786</TD><TD>                                                                                // ignore the length -- always insert</TD></TR><TR><TD CLASS="l">787</TD><TD>                                                                                // contentAssistRequest.getReplacementLength(),</TD></TR><TR CLASS="z"><TD CLASS="l">788</TD><TD>                                                                                0, 1, image, NLS.bind(XMLUIMessages.Close_with____, (new Object[]{node.getNodeName()})), null, proposedInfo, XMLRelevanceConstants.R_CLOSE_TAG);</TD></TR><TR CLASS="z"><TD CLASS="l">789</TD><TD>                                                        contentAssistRequest.addProposal(proposal);</TD></TR><TR><TD CLASS="l">790</TD><TD>                                                }</TD></TR><TR><TD CLASS="l">791</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">792</TD><TD>                                        // prompt with slash bracket &#34;/&gt;&#34; incase if it's a self</TD></TR><TR><TD CLASS="l">793</TD><TD>                                        // ending tag</TD></TR><TR CLASS="z"><TD CLASS="l">794</TD><TD>                                        if (endWithSlashBracket) {</TD></TR><TR CLASS="z"><TD CLASS="l">795</TD><TD>                                                proposal = new CustomCompletionProposal(&#34;/&gt;&#34;, //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">796</TD><TD>                                                                        contentAssistRequest.getReplacementBeginPosition(),</TD></TR><TR><TD CLASS="l">797</TD><TD>                                                                        // this is one of the few times to ignore</TD></TR><TR><TD CLASS="l">798</TD><TD>                                                                        // the length -- always insert</TD></TR><TR><TD CLASS="l">799</TD><TD>                                                                        // contentAssistRequest.getReplacementLength(),</TD></TR><TR CLASS="z"><TD CLASS="l">800</TD><TD>                                                                        0, 2, image, NLS.bind(XMLUIMessages.Close_with__, (new Object[]{&#34; \&#34;/&gt;\&#34;&#34;})), //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">801</TD><TD>                                                                        null, proposedInfo, XMLRelevanceConstants.R_CLOSE_TAG + 1); // +1</TD></TR><TR><TD CLASS="l">802</TD><TD>                                                // to</TD></TR><TR><TD CLASS="l">803</TD><TD>                                                // bring</TD></TR><TR><TD CLASS="l">804</TD><TD>                                                // to</TD></TR><TR><TD CLASS="l">805</TD><TD>                                                // top</TD></TR><TR><TD CLASS="l">806</TD><TD>                                                // of</TD></TR><TR><TD CLASS="l">807</TD><TD>                                                // list</TD></TR><TR CLASS="z"><TD CLASS="l">808</TD><TD>                                                contentAssistRequest.addProposal(proposal);</TD></TR><TR><TD CLASS="l">809</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">810</TD><TD>                                }</TD></TR><TR><TD CLASS="l">811</TD><TD>                        }</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="56% line coverage (5 out of 9 instructions)">812</TD><TD TITLE="56% line coverage (5 out of 9 instructions)">                        else if ((contentAssistRequest.getDocumentRegion() == node.getLastStructuredDocumentRegion()) &amp;&amp; !node.getLastStructuredDocumentRegion().isEnded()) {</TD></TR><TR CLASS="z"><TD CLASS="l">813</TD><TD>                                setErrorMessage(null);</TD></TR><TR><TD CLASS="l">814</TD><TD>                                // prompt with a closing end character for the end tag</TD></TR><TR CLASS="z"><TD CLASS="l">815</TD><TD>                                CustomCompletionProposal proposal = new CustomCompletionProposal(&#34;&gt;&#34;, //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">816</TD><TD>                                                        contentAssistRequest.getReplacementBeginPosition(),</TD></TR><TR><TD CLASS="l">817</TD><TD>                                                        // this is one of the few times to ignore the</TD></TR><TR><TD CLASS="l">818</TD><TD>                                                        // length -- always insert</TD></TR><TR><TD CLASS="l">819</TD><TD>                                                        // contentAssistRequest.getReplacementLength(),</TD></TR><TR CLASS="z"><TD CLASS="l">820</TD><TD>                                                        0, 1, image, NLS.bind(XMLUIMessages.Close_with__, (new Object[]{&#34; '&gt;'&#34;})), //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">821</TD><TD>                                                        null, proposedInfo, XMLRelevanceConstants.R_CLOSE_TAG);</TD></TR><TR CLASS="z"><TD CLASS="l">822</TD><TD>                                contentAssistRequest.addProposal(proposal);</TD></TR><TR><TD CLASS="l">823</TD><TD>                        }</TD></TR><TR><TD CLASS="l">824</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">825</TD><TD>                else if (node.getNodeType() == Node.DOCUMENT_NODE) {</TD></TR><TR CLASS="z"><TD CLASS="l">826</TD><TD>                        setErrorMessage(UNKNOWN_CONTEXT);</TD></TR><TR><TD CLASS="l"><A NAME="29">827</A></TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">828</TD><TD>        }</TD></TR><TR><TD CLASS="l">829</TD><TD> </TD></TR><TR><TD CLASS="l">830</TD><TD>        protected void addTagInsertionProposals(ContentAssistRequest contentAssistRequest, int childPosition) {</TD></TR><TR CLASS="c"><TD CLASS="l">831</TD><TD>                List cmnodes = null;</TD></TR><TR CLASS="c"><TD CLASS="l">832</TD><TD>                Node parent = contentAssistRequest.getParent();</TD></TR><TR CLASS="c"><TD CLASS="l">833</TD><TD>                String error = null;</TD></TR><TR><TD CLASS="l">834</TD><TD> </TD></TR><TR><TD CLASS="l">835</TD><TD>                // (nsd) This is only valid at the document element level</TD></TR><TR><TD CLASS="l">836</TD><TD>                // only valid if it's XML (check added 2/17/2004)</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="62% line coverage (13 out of 21 instructions)">837</TD><TD TITLE="62% line coverage (13 out of 21 instructions)">                if ((parent != null) &amp;&amp; (parent.getNodeType() == Node.DOCUMENT_NODE) &amp;&amp; ((IDOMDocument) parent).isXMLType() &amp;&amp; !isCursorAfterXMLPI(contentAssistRequest)) {</TD></TR><TR CLASS="z"><TD CLASS="l">838</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">839</TD><TD>                }</TD></TR><TR><TD CLASS="l">840</TD><TD>                // only want proposals if cursor is after doctype...</TD></TR><TR CLASS="c"><TD CLASS="l">841</TD><TD>                if (!isCursorAfterDoctype(contentAssistRequest)) {</TD></TR><TR CLASS="z"><TD CLASS="l">842</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">843</TD><TD>                }</TD></TR><TR><TD CLASS="l">844</TD><TD> </TD></TR><TR><TD CLASS="l">845</TD><TD>                // fix for meta-info comment nodes.. they currently &#34;hide&#34; other</TD></TR><TR><TD CLASS="l">846</TD><TD>                // proposals because the don't</TD></TR><TR><TD CLASS="l">847</TD><TD>                // have a content model (so can't propose any children..)</TD></TR><TR CLASS="c"><TD CLASS="l">848</TD><TD>                if ((parent != null) &amp;&amp; (parent instanceof IDOMNode) &amp;&amp; isCommentNode((IDOMNode) parent)) {</TD></TR><TR><TD CLASS="l">849</TD><TD>                        // loop and find non comment node?</TD></TR><TR CLASS="z"><TD CLASS="l">850</TD><TD>                        while ((parent != null) &amp;&amp; isCommentNode((IDOMNode) parent)) {</TD></TR><TR CLASS="z"><TD CLASS="l">851</TD><TD>                                parent = parent.getParentNode();</TD></TR><TR><TD CLASS="l">852</TD><TD>                        }</TD></TR><TR><TD CLASS="l">853</TD><TD>                }</TD></TR><TR><TD CLASS="l">854</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">855</TD><TD>                if (parent.getNodeType() == Node.ELEMENT_NODE) {</TD></TR><TR CLASS="c"><TD CLASS="l">856</TD><TD>                        CMElementDeclaration parentDecl = getCMElementDeclaration(parent);</TD></TR><TR CLASS="c"><TD CLASS="l">857</TD><TD>                        if (parentDecl != null) {</TD></TR><TR><TD CLASS="l">858</TD><TD>                                // XSD-specific ability - no filtering</TD></TR><TR CLASS="c"><TD CLASS="l">859</TD><TD>                                CMDataType childType = parentDecl.getDataType();</TD></TR><TR CLASS="c"><TD CLASS="l">860</TD><TD>                                if (childType != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">861</TD><TD>                                        String[] childStrings = childType.getEnumeratedValues();</TD></TR><TR CLASS="z"><TD CLASS="l">862</TD><TD>                                        String defaultValue = childType.getImpliedValue();</TD></TR><TR CLASS="z"><TD CLASS="l">863</TD><TD>                                        if (childStrings != null || defaultValue != null) {</TD></TR><TR><TD CLASS="l">864</TD><TD>                                                // the content string is the sole valid child...so</TD></TR><TR><TD CLASS="l">865</TD><TD>                                                // replace the rest</TD></TR><TR CLASS="z"><TD CLASS="l">866</TD><TD>                                                int begin = contentAssistRequest.getReplacementBeginPosition();</TD></TR><TR CLASS="z"><TD CLASS="l">867</TD><TD>                                                int length = contentAssistRequest.getReplacementLength();</TD></TR><TR CLASS="z"><TD CLASS="l">868</TD><TD>                                                if (parent instanceof IDOMNode) {</TD></TR><TR CLASS="z"><TD CLASS="l">869</TD><TD>                                                        if (((IDOMNode) parent).getLastStructuredDocumentRegion() != ((IDOMNode) parent).getFirstStructuredDocumentRegion()) {</TD></TR><TR CLASS="z"><TD CLASS="l">870</TD><TD>                                                                begin = ((IDOMNode) parent).getFirstStructuredDocumentRegion().getEndOffset();</TD></TR><TR CLASS="z"><TD CLASS="l">871</TD><TD>                                                                length = ((IDOMNode) parent).getLastStructuredDocumentRegion().getStartOffset() - begin;</TD></TR><TR><TD CLASS="l">872</TD><TD>                                                        }</TD></TR><TR><TD CLASS="l">873</TD><TD>                                                }</TD></TR><TR CLASS="z"><TD CLASS="l">874</TD><TD>                                                String proposedInfo = getAdditionalInfo(parentDecl, childType);</TD></TR><TR CLASS="z"><TD CLASS="l">875</TD><TD>                                                for (int i = 0; i &lt; childStrings.length; i++) {</TD></TR><TR CLASS="z"><TD CLASS="l">876</TD><TD>                                                        if(!childStrings[i].equals(defaultValue))</TD></TR><TR><TD CLASS="l">877</TD><TD>                                                        {</TD></TR><TR CLASS="z"><TD CLASS="l">878</TD><TD>                                                                CustomCompletionProposal textProposal = new CustomCompletionProposal(childStrings[i], begin, length, childStrings[i].length(), XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_ENUM), childStrings[i], null, proposedInfo, XMLRelevanceConstants.R_TAG_INSERTION);</TD></TR><TR CLASS="z"><TD CLASS="l">879</TD><TD>                                                                contentAssistRequest.addProposal(textProposal);</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>                                                if(defaultValue != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">883</TD><TD>                                                        CustomCompletionProposal textProposal = new CustomCompletionProposal(defaultValue, begin, length, defaultValue.length(), XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_DEFAULT), defaultValue, null, proposedInfo, XMLRelevanceConstants.R_TAG_INSERTION);</TD></TR><TR CLASS="z"><TD CLASS="l">884</TD><TD>                                                        contentAssistRequest.addProposal(textProposal);</TD></TR><TR><TD CLASS="l">885</TD><TD>                                                }</TD></TR><TR><TD CLASS="l">886</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">887</TD><TD>                                }</TD></TR><TR><TD CLASS="l">888</TD><TD>                        }</TD></TR><TR CLASS="c"><TD CLASS="l">889</TD><TD>                        if ((parentDecl != null) &amp;&amp; (parentDecl.getContentType() == CMElementDeclaration.PCDATA)) {</TD></TR><TR CLASS="z"><TD CLASS="l">890</TD><TD>                                addPCDATAProposal(parentDecl.getNodeName(), contentAssistRequest);</TD></TR><TR><TD CLASS="l">891</TD><TD>                        }</TD></TR><TR><TD CLASS="l">892</TD><TD>                        else {</TD></TR><TR><TD CLASS="l">893</TD><TD>                                // retrieve the list of all possible children within this</TD></TR><TR><TD CLASS="l">894</TD><TD>                                // parent context</TD></TR><TR CLASS="c"><TD CLASS="l">895</TD><TD>                                cmnodes = getAvailableChildElementDeclarations((Element) parent, childPosition, ModelQueryAction.INSERT);</TD></TR><TR><TD CLASS="l">896</TD><TD> </TD></TR><TR><TD CLASS="l">897</TD><TD>                                // retrieve the list of the possible children within this</TD></TR><TR><TD CLASS="l">898</TD><TD>                                // parent context and at this index</TD></TR><TR CLASS="c"><TD CLASS="l">899</TD><TD>                                List strictCMNodeSuggestions = null;</TD></TR><TR CLASS="c"><TD CLASS="l">900</TD><TD>                                if (XMLUIPreferenceNames.SUGGESTION_STRATEGY_VALUE_STRICT.equals(XMLUIPlugin.getInstance().getPreferenceStore().getString(XMLUIPreferenceNames.SUGGESTION_STRATEGY))) {</TD></TR><TR CLASS="c"><TD CLASS="l">901</TD><TD>                                        strictCMNodeSuggestions = getValidChildElementDeclarations((Element) parent, childPosition, ModelQueryAction.INSERT);</TD></TR><TR><TD CLASS="l">902</TD><TD>                                }</TD></TR><TR CLASS="c"><TD CLASS="l">903</TD><TD>                                Iterator nodeIterator = cmnodes.iterator();</TD></TR><TR CLASS="c"><TD CLASS="l">904</TD><TD>                                if (!nodeIterator.hasNext()) {</TD></TR><TR CLASS="z"><TD CLASS="l">905</TD><TD>                                        if (getCMElementDeclaration(parent) != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">906</TD><TD>                                                error = NLS.bind(XMLUIMessages._Has_no_available_child, (new Object[]{parent.getNodeName()}));</TD></TR><TR><TD CLASS="l">907</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">908</TD><TD>                                        else {</TD></TR><TR CLASS="z"><TD CLASS="l">909</TD><TD>                                                error = NLS.bind(XMLUIMessages.Element__is_unknown, (new Object[]{parent.getNodeName()}));</TD></TR><TR><TD CLASS="l">910</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">911</TD><TD>                                }</TD></TR><TR CLASS="c"><TD CLASS="l">912</TD><TD>                                String matchString = contentAssistRequest.getMatchString();</TD></TR><TR><TD CLASS="l">913</TD><TD>                                // chop off any leading &lt;'s and whitespace from the</TD></TR><TR><TD CLASS="l">914</TD><TD>                                // matchstring</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="41% line coverage (7 out of 17 instructions)">915</TD><TD TITLE="41% line coverage (7 out of 17 instructions)">                                while ((matchString.length() &gt; 0) &amp;&amp; (Character.isWhitespace(matchString.charAt(0)) || beginsWith(matchString, &#34;&lt;&#34;))) {</TD></TR><TR><TD CLASS="l">916</TD><TD>                                        //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">917</TD><TD>                                        matchString = matchString.substring(1);</TD></TR><TR><TD CLASS="l">918</TD><TD>                                }</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="75% line coverage (3 out of 4 instructions)">919</TD><TD TITLE="75% line coverage (3 out of 4 instructions)">                                while (nodeIterator.hasNext()) {</TD></TR><TR CLASS="c"><TD CLASS="l">920</TD><TD>                                        Object o = nodeIterator.next();</TD></TR><TR CLASS="c"><TD CLASS="l">921</TD><TD>                                        if (o instanceof CMElementDeclaration) {</TD></TR><TR CLASS="c"><TD CLASS="l">922</TD><TD>                                                CMElementDeclaration elementDecl = (CMElementDeclaration) o;</TD></TR><TR><TD CLASS="l">923</TD><TD>                                                // only add proposals for the child element's that</TD></TR><TR><TD CLASS="l">924</TD><TD>                                                // begin with the matchstring</TD></TR><TR CLASS="c"><TD CLASS="l">925</TD><TD>                                                String tagname = getRequiredName(parent, elementDecl);</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="95% line coverage (20 out of 21 instructions)">926</TD><TD TITLE="95% line coverage (20 out of 21 instructions)">                                                boolean isStrictCMNodeSuggestion = strictCMNodeSuggestions != null ? strictCMNodeSuggestions.contains(elementDecl) : false;</TD></TR><TR><TD CLASS="l">927</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">928</TD><TD>                                                Image image = CMImageUtil.getImage(elementDecl);</TD></TR><TR><TD CLASS="l">929</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">930</TD><TD>                                                if (image == null) {</TD></TR><TR CLASS="c"><TD CLASS="l">931</TD><TD>                                                        if (strictCMNodeSuggestions != null) {</TD></TR><TR CLASS="c"><TD CLASS="l">932</TD><TD>                                                                image = isStrictCMNodeSuggestion ? XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_TAG_GENERIC_EMPHASIZED) : XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_TAG_GENERIC_DEEMPHASIZED);</TD></TR><TR><TD CLASS="l">933</TD><TD>                                                        }</TD></TR><TR><TD CLASS="l">934</TD><TD>                                                        else {</TD></TR><TR CLASS="z"><TD CLASS="l">935</TD><TD>                                                                image = XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_TAG_GENERIC);</TD></TR><TR><TD CLASS="l">936</TD><TD>                                                        }</TD></TR><TR><TD CLASS="l">937</TD><TD> </TD></TR><TR><TD CLASS="l">938</TD><TD>                                                }</TD></TR><TR><TD CLASS="l">939</TD><TD> </TD></TR><TR><TD CLASS="l">940</TD><TD>                                                // int markupAdjustment =</TD></TR><TR><TD CLASS="l">941</TD><TD>                                                // getContentGenerator().getMinimalStartTagLength(parent,</TD></TR><TR><TD CLASS="l">942</TD><TD>                                                // elementDecl);</TD></TR><TR CLASS="c"><TD CLASS="l">943</TD><TD>                                                if (beginsWith(tagname, matchString)) {</TD></TR><TR CLASS="c"><TD CLASS="l">944</TD><TD>                                                        String proposedText = getRequiredText(parent, elementDecl);</TD></TR><TR><TD CLASS="l">945</TD><TD> </TD></TR><TR><TD CLASS="l">946</TD><TD>                                                        // https://bugs.eclipse.org/bugs/show_bug.cgi?id=89811</TD></TR><TR><TD CLASS="l">947</TD><TD>                                                        // place cursor in first empty quotes</TD></TR><TR CLASS="c"><TD CLASS="l">948</TD><TD>                                                        int markupAdjustment = getCursorPositionForProposedText(proposedText);</TD></TR><TR><TD CLASS="l">949</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">950</TD><TD>                                                        String proposedInfo = getAdditionalInfo(parentDecl, elementDecl);</TD></TR><TR CLASS="c"><TD CLASS="l">951</TD><TD>                                                        int relevance = isStrictCMNodeSuggestion ? XMLRelevanceConstants.R_STRICTLY_VALID_TAG_INSERTION : XMLRelevanceConstants.R_TAG_INSERTION;</TD></TR><TR CLASS="c"><TD CLASS="l">952</TD><TD>                                                        CustomCompletionProposal proposal = new CustomCompletionProposal(proposedText, contentAssistRequest.getReplacementBeginPosition(), contentAssistRequest.getReplacementLength(), markupAdjustment, image, tagname, null, proposedInfo, relevance);</TD></TR><TR CLASS="c"><TD CLASS="l">953</TD><TD>                                                        contentAssistRequest.addProposal(proposal);</TD></TR><TR><TD CLASS="l">954</TD><TD>                                                }</TD></TR><TR><TD CLASS="l">955</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">956</TD><TD>                                }</TD></TR><TR CLASS="c"><TD CLASS="l">957</TD><TD>                                if (contentAssistRequest.getProposals().size() == 0) {</TD></TR><TR CLASS="z"><TD CLASS="l">958</TD><TD>                                        if (error != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">959</TD><TD>                                                setErrorMessage(error);</TD></TR><TR><TD CLASS="l">960</TD><TD>                                        }</TD></TR><TR CLASS="z"><TD CLASS="l">961</TD><TD>                                        else if ((contentAssistRequest.getMatchString() != null) &amp;&amp; (contentAssistRequest.getMatchString().length() &gt; 0)) {</TD></TR><TR CLASS="z"><TD CLASS="l">962</TD><TD>                                                setErrorMessage(NLS.bind(XMLUIMessages.No_known_child_tag, (new Object[]{parent.getNodeName(), contentAssistRequest.getMatchString()})));</TD></TR><TR><TD CLASS="l">963</TD><TD>                                                //$NON-NLS-1$ = &#34;No known child tag names of &lt;{0}&gt; begin with \&#34;{1}\&#34;.&#34;</TD></TR><TR><TD CLASS="l">964</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">965</TD><TD>                                        else {</TD></TR><TR CLASS="z"><TD CLASS="l">966</TD><TD>                                                setErrorMessage(NLS.bind(XMLUIMessages.__Has_no_known_child, (new Object[]{parent.getNodeName()})));</TD></TR><TR><TD CLASS="l">967</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">968</TD><TD>                                }</TD></TR><TR><TD CLASS="l">969</TD><TD>                        }</TD></TR><TR><TD CLASS="l">970</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">971</TD><TD>                else if (parent.getNodeType() == Node.DOCUMENT_NODE) {</TD></TR><TR><TD CLASS="l">972</TD><TD>                        // Can only prompt with elements if the cursor position is past</TD></TR><TR><TD CLASS="l">973</TD><TD>                        // the XML processing</TD></TR><TR><TD CLASS="l">974</TD><TD>                        // instruction and DOCTYPE declaration</TD></TR><TR CLASS="z"><TD CLASS="l">975</TD><TD>                        boolean xmlpiFound = false;</TD></TR><TR CLASS="z"><TD CLASS="l">976</TD><TD>                        boolean doctypeFound = false;</TD></TR><TR CLASS="z"><TD CLASS="l">977</TD><TD>                        int minimumOffset = -1;</TD></TR><TR><TD CLASS="l">978</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">979</TD><TD>                        for (Node child = parent.getFirstChild(); child != null; child = child.getNextSibling()) {</TD></TR><TR><TD CLASS="l">980</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">981</TD><TD>                                boolean xmlpi = ((child.getNodeType() == Node.PROCESSING_INSTRUCTION_NODE) &amp;&amp; child.getNodeName().equals(&#34;xml&#34;)); //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">982</TD><TD>                                boolean doctype = child.getNodeType() == Node.DOCUMENT_TYPE_NODE;</TD></TR><TR CLASS="z"><TD CLASS="l">983</TD><TD>                                if (xmlpi || (doctype &amp;&amp; (minimumOffset &lt; 0))) {</TD></TR><TR CLASS="z"><TD CLASS="l">984</TD><TD>                                        minimumOffset = ((IDOMNode) child).getFirstStructuredDocumentRegion().getStartOffset() + ((IDOMNode) child).getFirstStructuredDocumentRegion().getTextLength();</TD></TR><TR><TD CLASS="l">985</TD><TD>                                }</TD></TR><TR CLASS="z"><TD CLASS="l">986</TD><TD>                                xmlpiFound = xmlpiFound || xmlpi;</TD></TR><TR CLASS="z"><TD CLASS="l">987</TD><TD>                                doctypeFound = doctypeFound || doctype;</TD></TR><TR><TD CLASS="l">988</TD><TD>                        }</TD></TR><TR><TD CLASS="l">989</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">990</TD><TD>                        if (contentAssistRequest.getReplacementBeginPosition() &gt;= minimumOffset) {</TD></TR><TR CLASS="z"><TD CLASS="l">991</TD><TD>                                List childDecls = getAvailableRootChildren((Document) parent, childPosition);</TD></TR><TR CLASS="z"><TD CLASS="l">992</TD><TD>                                for (int i = 0; i &lt; childDecls.size(); i++) {</TD></TR><TR CLASS="z"><TD CLASS="l">993</TD><TD>                                        CMElementDeclaration ed = (CMElementDeclaration) childDecls.get(i);</TD></TR><TR CLASS="z"><TD CLASS="l">994</TD><TD>                                        if (ed != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">995</TD><TD>                                                Image image = CMImageUtil.getImage(ed);</TD></TR><TR CLASS="z"><TD CLASS="l">996</TD><TD>                                                if (image == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">997</TD><TD>                                                        image = XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_TAG_GENERIC);</TD></TR><TR><TD CLASS="l">998</TD><TD>                                                }</TD></TR><TR CLASS="z"><TD CLASS="l">999</TD><TD>                                                String proposedText = getRequiredText(parent, ed);</TD></TR><TR CLASS="z"><TD CLASS="l">1000</TD><TD>                                                String tagname = getRequiredName(parent, ed);</TD></TR><TR><TD CLASS="l">1001</TD><TD>                                                // account for the &amp;lt; and &amp;gt;</TD></TR><TR CLASS="z"><TD CLASS="l">1002</TD><TD>                                                int markupAdjustment = getContentGenerator().getMinimalStartTagLength(parent, ed);</TD></TR><TR CLASS="z"><TD CLASS="l">1003</TD><TD>                                                String proposedInfo = getAdditionalInfo(null, ed);</TD></TR><TR CLASS="z"><TD CLASS="l">1004</TD><TD>                                                CustomCompletionProposal proposal = new CustomCompletionProposal(proposedText, contentAssistRequest.getReplacementBeginPosition(), contentAssistRequest.getReplacementLength(), markupAdjustment, image, tagname, null, proposedInfo, XMLRelevanceConstants.R_TAG_INSERTION);</TD></TR><TR CLASS="z"><TD CLASS="l">1005</TD><TD>                                                contentAssistRequest.addProposal(proposal);</TD></TR><TR><TD CLASS="l">1006</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">1007</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1008</TD><TD>                        }</TD></TR><TR><TD CLASS="l"><A NAME="25">1009</A></TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">1010</TD><TD>        }</TD></TR><TR><TD CLASS="l">1011</TD><TD> </TD></TR><TR><TD CLASS="l">1012</TD><TD>        protected void addTagNameProposals(ContentAssistRequest contentAssistRequest, int childPosition) {</TD></TR><TR CLASS="c"><TD CLASS="l">1013</TD><TD>                List cmnodes = null;</TD></TR><TR CLASS="c"><TD CLASS="l">1014</TD><TD>                Node parent = contentAssistRequest.getParent();</TD></TR><TR CLASS="c"><TD CLASS="l">1015</TD><TD>                IDOMNode node = (IDOMNode) contentAssistRequest.getNode();</TD></TR><TR CLASS="c"><TD CLASS="l">1016</TD><TD>                String error = null;</TD></TR><TR CLASS="c"><TD CLASS="l">1017</TD><TD>                String matchString = contentAssistRequest.getMatchString();</TD></TR><TR CLASS="c"><TD CLASS="l">1018</TD><TD>                if (parent.getNodeType() == Node.ELEMENT_NODE) {</TD></TR><TR><TD CLASS="l">1019</TD><TD>                        // retrieve the list of children</TD></TR><TR><TD CLASS="l">1020</TD><TD>                        // validActions = getAvailableChildrenAtIndex((Element) parent,</TD></TR><TR><TD CLASS="l">1021</TD><TD>                        // childPosition);</TD></TR><TR CLASS="c"><TD CLASS="l">1022</TD><TD>                        cmnodes = getAvailableChildElementDeclarations((Element) parent, childPosition, ModelQueryAction.INSERT);</TD></TR><TR CLASS="c"><TD CLASS="l">1023</TD><TD>                        Iterator nodeIterator = cmnodes.iterator();</TD></TR><TR><TD CLASS="l">1024</TD><TD>                        // chop off any leading &lt;'s and whitespace from the matchstring</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="58% line coverage (14 out of 24 instructions)">1025</TD><TD TITLE="58% line coverage (14 out of 24 instructions)">                        while ((matchString.length() &gt; 0) &amp;&amp; (Character.isWhitespace(matchString.charAt(0)) || beginsWith(matchString, &#34;&lt;&#34;))) {</TD></TR><TR><TD CLASS="l">1026</TD><TD>                                //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">1027</TD><TD>                                matchString = matchString.substring(1);</TD></TR><TR><TD CLASS="l">1028</TD><TD>                        }</TD></TR><TR CLASS="c"><TD CLASS="l">1029</TD><TD>                        if (!nodeIterator.hasNext()) {</TD></TR><TR CLASS="c"><TD CLASS="l">1030</TD><TD>                                error = NLS.bind(XMLUIMessages.__Has_no_known_child, (new Object[]{parent.getNodeName()}));</TD></TR><TR><TD CLASS="l">1031</TD><TD>                        }</TD></TR><TR CLASS="c"><TD CLASS="l">1032</TD><TD>                        while (nodeIterator.hasNext()) {</TD></TR><TR CLASS="z"><TD CLASS="l">1033</TD><TD>                                CMNode elementDecl = (CMNode) nodeIterator.next();</TD></TR><TR CLASS="z"><TD CLASS="l">1034</TD><TD>                                if (elementDecl != null) {</TD></TR><TR><TD CLASS="l">1035</TD><TD>                                        // only add proposals for the child element's that begin</TD></TR><TR><TD CLASS="l">1036</TD><TD>                                        // with the matchstring</TD></TR><TR CLASS="z"><TD CLASS="l">1037</TD><TD>                                        String proposedText = null;</TD></TR><TR CLASS="z"><TD CLASS="l">1038</TD><TD>                                        int cursorAdjustment = 0;</TD></TR><TR><TD CLASS="l">1039</TD><TD> </TD></TR><TR><TD CLASS="l">1040</TD><TD>                                        // do a check to see if partial attributes of partial tag</TD></TR><TR><TD CLASS="l">1041</TD><TD>                                        // names are in list</TD></TR><TR CLASS="z"><TD CLASS="l">1042</TD><TD>                                        if (((node != null) &amp;&amp; (node.getAttributes() != null) &amp;&amp; (node.getAttributes().getLength() &gt; 0) &amp;&amp; attributeInList(node, parent, elementDecl)) || ((node.getNodeType() != Node.TEXT_NODE) &amp;&amp; node.getFirstStructuredDocumentRegion().isEnded())) {</TD></TR><TR><TD CLASS="l">1043</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1044</TD><TD>                                                proposedText = getRequiredName(parent, elementDecl);</TD></TR><TR CLASS="z"><TD CLASS="l">1045</TD><TD>                                                cursorAdjustment = proposedText.length();</TD></TR><TR><TD CLASS="l">1046</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">1047</TD><TD>                                        else {</TD></TR><TR CLASS="z"><TD CLASS="l">1048</TD><TD>                                                proposedText = getRequiredName(parent, elementDecl);</TD></TR><TR CLASS="z"><TD CLASS="l">1049</TD><TD>                                                cursorAdjustment = proposedText.length();</TD></TR><TR CLASS="z"><TD CLASS="l">1050</TD><TD>                                                if (elementDecl instanceof CMElementDeclaration) {</TD></TR><TR CLASS="z"><TD CLASS="l">1051</TD><TD>                                                        CMElementDeclaration ed = (CMElementDeclaration) elementDecl;</TD></TR><TR><TD CLASS="l">1052</TD><TD>                                                        // https://bugs.eclipse.org/bugs/show_bug.cgi?id=89811</TD></TR><TR CLASS="z"><TD CLASS="l">1053</TD><TD>                                                        StringBuffer sb = new StringBuffer();</TD></TR><TR CLASS="z"><TD CLASS="l">1054</TD><TD>                                                        getContentGenerator().generateTag(parent, ed, sb);</TD></TR><TR><TD CLASS="l">1055</TD><TD>                                                        // since it's a name proposal, assume '&lt;' is</TD></TR><TR><TD CLASS="l">1056</TD><TD>                                                        // already there</TD></TR><TR><TD CLASS="l">1057</TD><TD>                                                        // only return the rest of the tag</TD></TR><TR CLASS="z"><TD CLASS="l">1058</TD><TD>                                                        proposedText = sb.toString().substring(1);</TD></TR><TR CLASS="z"><TD CLASS="l">1059</TD><TD>                                                        cursorAdjustment = getCursorPositionForProposedText(proposedText);</TD></TR><TR><TD CLASS="l">1060</TD><TD> </TD></TR><TR><TD CLASS="l">1061</TD><TD>                                                        // cursorAdjustment = proposedText.length() +</TD></TR><TR><TD CLASS="l">1062</TD><TD>                                                        // 1;</TD></TR><TR><TD CLASS="l">1063</TD><TD>                                                        // proposedText += &#34;&gt;&lt;/&#34; +</TD></TR><TR><TD CLASS="l">1064</TD><TD>                                                        // getRequiredName(parent, elementDecl) + &#34;&gt;&#34;;</TD></TR><TR><TD CLASS="l">1065</TD><TD>                                                        // //$NON-NLS-2$//$NON-NLS-1$</TD></TR><TR><TD CLASS="l">1066</TD><TD>                                                }</TD></TR><TR><TD CLASS="l">1067</TD><TD>                                        }</TD></TR><TR CLASS="z"><TD CLASS="l">1068</TD><TD>                                        if (beginsWith(proposedText, matchString)) {</TD></TR><TR CLASS="z"><TD CLASS="l">1069</TD><TD>                                                Image image = CMImageUtil.getImage(elementDecl);</TD></TR><TR CLASS="z"><TD CLASS="l">1070</TD><TD>                                                if (image == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1071</TD><TD>                                                        image = XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_TAG_GENERIC);</TD></TR><TR><TD CLASS="l">1072</TD><TD>                                                }</TD></TR><TR CLASS="z"><TD CLASS="l">1073</TD><TD>                                                String proposedInfo = getAdditionalInfo(getCMElementDeclaration(parent), elementDecl);</TD></TR><TR CLASS="z"><TD CLASS="l">1074</TD><TD>                                                CustomCompletionProposal proposal = new CustomCompletionProposal(proposedText, contentAssistRequest.getReplacementBeginPosition(), contentAssistRequest.getReplacementLength(), cursorAdjustment, image, getRequiredName(parent, elementDecl), null, proposedInfo, XMLRelevanceConstants.R_TAG_NAME);</TD></TR><TR CLASS="z"><TD CLASS="l">1075</TD><TD>                                                contentAssistRequest.addProposal(proposal);</TD></TR><TR><TD CLASS="l">1076</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">1077</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1078</TD><TD>                        }</TD></TR><TR CLASS="c"><TD CLASS="l">1079</TD><TD>                        if (contentAssistRequest.getProposals().size() == 0) {</TD></TR><TR CLASS="c"><TD CLASS="l">1080</TD><TD>                                if (error != null) {</TD></TR><TR CLASS="c"><TD CLASS="l">1081</TD><TD>                                        setErrorMessage(error);</TD></TR><TR><TD CLASS="l">1082</TD><TD>                                }</TD></TR><TR CLASS="z"><TD CLASS="l">1083</TD><TD>                                else if ((contentAssistRequest.getMatchString() != null) &amp;&amp; (contentAssistRequest.getMatchString().length() &gt; 0)) {</TD></TR><TR CLASS="z"><TD CLASS="l">1084</TD><TD>                                        setErrorMessage(NLS.bind(XMLUIMessages.No_known_child_tag_names, (new Object[]{parent.getNodeName(), contentAssistRequest.getMatchString()})));</TD></TR><TR><TD CLASS="l">1085</TD><TD>                                        //$NON-NLS-1$ = &#34;No known child tag names of &lt;{0}&gt; begin with \&#34;{1}\&#34;&#34;</TD></TR><TR><TD CLASS="l">1086</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1087</TD><TD>                                else {</TD></TR><TR CLASS="z"><TD CLASS="l">1088</TD><TD>                                        setErrorMessage(NLS.bind(XMLUIMessages.__Has_no_known_child, (new Object[]{parent.getNodeName()})));</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>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1092</TD><TD>                else if (parent.getNodeType() == Node.DOCUMENT_NODE) {</TD></TR><TR CLASS="z"><TD CLASS="l">1093</TD><TD>                        List childElements = getAvailableRootChildren((Document) parent, childPosition);</TD></TR><TR CLASS="z"><TD CLASS="l">1094</TD><TD>                        for (int i = 0; i &lt; childElements.size(); i++) {</TD></TR><TR CLASS="z"><TD CLASS="l">1095</TD><TD>                                CMNode ed = (CMNode) childElements.get(i);</TD></TR><TR CLASS="z"><TD CLASS="l">1096</TD><TD>                                if (ed == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1097</TD><TD>                                        continue;</TD></TR><TR><TD CLASS="l">1098</TD><TD>                                }</TD></TR><TR CLASS="z"><TD CLASS="l">1099</TD><TD>                                String proposedText = null;</TD></TR><TR CLASS="z"><TD CLASS="l">1100</TD><TD>                                int cursorAdjustment = 0;</TD></TR><TR CLASS="z"><TD CLASS="l">1101</TD><TD>                                if (ed instanceof CMElementDeclaration) {</TD></TR><TR><TD CLASS="l">1102</TD><TD>                                        // proposedText = getRequiredName(parent, ed);</TD></TR><TR CLASS="z"><TD CLASS="l">1103</TD><TD>                                        StringBuffer sb = new StringBuffer();</TD></TR><TR CLASS="z"><TD CLASS="l">1104</TD><TD>                                        getContentGenerator().generateTag(parent, (CMElementDeclaration) ed, sb);</TD></TR><TR><TD CLASS="l">1105</TD><TD>                                        // tag starts w/ '&lt;', but we want to compare to name</TD></TR><TR CLASS="z"><TD CLASS="l">1106</TD><TD>                                        proposedText = sb.toString().substring(1);</TD></TR><TR><TD CLASS="l">1107</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1108</TD><TD>                                        if (!beginsWith(proposedText, matchString)) {</TD></TR><TR CLASS="z"><TD CLASS="l">1109</TD><TD>                                                continue;</TD></TR><TR><TD CLASS="l">1110</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">1111</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1112</TD><TD>                                        cursorAdjustment = getCursorPositionForProposedText(proposedText);</TD></TR><TR><TD CLASS="l">1113</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1114</TD><TD>                                        String proposedInfo = getAdditionalInfo(null, ed);</TD></TR><TR CLASS="z"><TD CLASS="l">1115</TD><TD>                                        Image image = CMImageUtil.getImage(ed);</TD></TR><TR CLASS="z"><TD CLASS="l">1116</TD><TD>                                        if (image == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1117</TD><TD>                                                image = XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_TAG_GENERIC);</TD></TR><TR><TD CLASS="l">1118</TD><TD>                                        }</TD></TR><TR CLASS="z"><TD CLASS="l">1119</TD><TD>                                        CustomCompletionProposal proposal = new CustomCompletionProposal(proposedText, contentAssistRequest.getReplacementBeginPosition(), contentAssistRequest.getReplacementLength(), cursorAdjustment, image, getRequiredName(parent, ed), null, proposedInfo, XMLRelevanceConstants.R_TAG_NAME);</TD></TR><TR CLASS="z"><TD CLASS="l">1120</TD><TD>                                        contentAssistRequest.addProposal(proposal);</TD></TR><TR><TD CLASS="l">1121</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1122</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1123</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">1124</TD><TD>        }</TD></TR><TR><TD CLASS="l">1125</TD><TD> </TD></TR><TR><TD CLASS="l">1126</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1127</TD><TD>         * this is the position the cursor should be in after the proposal is</TD></TR><TR><TD CLASS="l">1128</TD><TD>         * applied</TD></TR><TR><TD CLASS="l">1129</TD><TD>         * </TD></TR><TR><TD CLASS="l">1130</TD><TD>         * @param proposedText</TD></TR><TR><TD CLASS="l">1131</TD><TD>         * @return the position the cursor should be in after the proposal is</TD></TR><TR><TD CLASS="l"><A NAME="36">1132</A></TD><TD>         *         applied</TD></TR><TR><TD CLASS="l">1133</TD><TD>         */</TD></TR><TR><TD CLASS="l">1134</TD><TD>        private int getCursorPositionForProposedText(String proposedText) {</TD></TR><TR><TD CLASS="l">1135</TD><TD>                int cursorAdjustment;</TD></TR><TR CLASS="c"><TD CLASS="l">1136</TD><TD>                cursorAdjustment = proposedText.indexOf(&#34;\&#34;\&#34;&#34;) + 1; //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">1137</TD><TD>                // otherwise, after the first tag</TD></TR><TR CLASS="c"><TD CLASS="l">1138</TD><TD>                if (cursorAdjustment == 0) {</TD></TR><TR CLASS="c"><TD CLASS="l">1139</TD><TD>                        cursorAdjustment = proposedText.indexOf('&gt;') + 1;</TD></TR><TR><TD CLASS="l">1140</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">1141</TD><TD>                if (cursorAdjustment == 0) {</TD></TR><TR CLASS="z"><TD CLASS="l">1142</TD><TD>                        cursorAdjustment = proposedText.length() + 1;</TD></TR><TR><TD CLASS="l">1143</TD><TD>                }</TD></TR><TR><TD CLASS="l">1144</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1145</TD><TD>                return cursorAdjustment;</TD></TR><TR><TD CLASS="l">1146</TD><TD>        }</TD></TR><TR><TD CLASS="l">1147</TD><TD> </TD></TR><TR><TD CLASS="l"><A NAME="a">1148</A></TD><TD>        /**</TD></TR><TR><TD CLASS="l">1149</TD><TD>         * @deprecated XML proposal is added via xml declaration template instead</TD></TR><TR><TD CLASS="l">1150</TD><TD>         */</TD></TR><TR><TD CLASS="l">1151</TD><TD>        protected void addXMLProposal(ContentAssistRequest contentAssistRequest) {</TD></TR><TR CLASS="z"><TD CLASS="l">1152</TD><TD>                String proposedText = &#34;&lt;?xml version=\&#34;1.0\&#34; encoding=\&#34;&#34; + ContentTypeEncodingPreferences.getUserPreferredCharsetName(ContentTypeIdForXML.ContentTypeID_XML) + &#34;\&#34;?&gt;&#34;; //$NON-NLS-2$//$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">1153</TD><TD>                ICompletionProposal proposal = new CustomCompletionProposal(proposedText, contentAssistRequest.getReplacementBeginPosition(), contentAssistRequest.getReplacementLength(), proposedText.length(), XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_PROCESSINGINSTRUCTION), proposedText, null, null, XMLRelevanceConstants.R_XML_DECLARATION);</TD></TR><TR><TD CLASS="l">1154</TD><TD>                // TODO add special XML proposal info</TD></TR><TR CLASS="z"><TD CLASS="l">1155</TD><TD>                contentAssistRequest.addProposal(proposal);</TD></TR><TR CLASS="z"><TD CLASS="l">1156</TD><TD>        }</TD></TR><TR><TD CLASS="l">1157</TD><TD> </TD></TR><TR><TD CLASS="l">1158</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1159</TD><TD>         * This method determines if any of the attributes in the proposed XMLNode</TD></TR><TR><TD CLASS="l">1160</TD><TD>         * node, are possible values of attributes from possible Elements at this</TD></TR><TR><TD CLASS="l">1161</TD><TD>         * point in the document according to the Content Model.</TD></TR><TR><TD CLASS="l">1162</TD><TD>         * </TD></TR><TR><TD CLASS="l">1163</TD><TD>         * @param node</TD></TR><TR><TD CLASS="l">1164</TD><TD>         *            the element with attributes that you would like to test if</TD></TR><TR><TD CLASS="l">1165</TD><TD>         *            are possible for possible Elements at this point</TD></TR><TR><TD CLASS="l">1166</TD><TD>         * @param cmnode</TD></TR><TR><TD CLASS="l">1167</TD><TD>         *            possible element at this point in the document (depending on</TD></TR><TR><TD CLASS="l"><A NAME="b">1168</A></TD><TD>         *            what 'node' is) true if any attributes of 'node' match any</TD></TR><TR><TD CLASS="l">1169</TD><TD>         *            possible attributes from 'cmnodes' list.</TD></TR><TR><TD CLASS="l">1170</TD><TD>         */</TD></TR><TR><TD CLASS="l">1171</TD><TD>        protected boolean attributeInList(IDOMNode node, Node parent, CMNode cmnode) {</TD></TR><TR CLASS="z"><TD CLASS="l">1172</TD><TD>                if ((node == null) || (parent == null) || (cmnode == null)) {</TD></TR><TR CLASS="z"><TD CLASS="l">1173</TD><TD>                        return false;</TD></TR><TR><TD CLASS="l">1174</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1175</TD><TD>                String elementMatchString = node.getNodeName();</TD></TR><TR CLASS="z"><TD CLASS="l">1176</TD><TD>                String cmnodeName = getRequiredName(parent, cmnode);// cmnode.getNodeName();</TD></TR><TR CLASS="z"><TD CLASS="l">1177</TD><TD>                if (node instanceof Element) {</TD></TR><TR CLASS="z"><TD CLASS="l">1178</TD><TD>                        NamedNodeMap map = ((Element) node).getAttributes();</TD></TR><TR CLASS="z"><TD CLASS="l">1179</TD><TD>                        String attrMatchString = &#34;&#34;; //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">1180</TD><TD>                        CMNamedNodeMap cmattrMap = null;</TD></TR><TR><TD CLASS="l">1181</TD><TD>                        // iterate attribute possibilities for partially started node</TD></TR><TR CLASS="z"><TD CLASS="l">1182</TD><TD>                        for (int i = 0; (map != null) &amp;&amp; (i &lt; map.getLength()); i++) {</TD></TR><TR CLASS="z"><TD CLASS="l">1183</TD><TD>                                attrMatchString = map.item(i).getNodeName();</TD></TR><TR><TD CLASS="l">1184</TD><TD>                                // filter on whatever user typed for element name already</TD></TR><TR CLASS="z"><TD CLASS="l">1185</TD><TD>                                if (beginsWith(cmnodeName, elementMatchString)) {</TD></TR><TR CLASS="z"><TD CLASS="l">1186</TD><TD>                                        if (cmnode.getNodeType() == CMNode.ELEMENT_DECLARATION) {</TD></TR><TR CLASS="z"><TD CLASS="l">1187</TD><TD>                                                cmattrMap = ((CMElementDeclaration) cmnode).getAttributes();</TD></TR><TR><TD CLASS="l">1188</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1189</TD><TD>                                                CMNamedNodeMapImpl allAttributes = new CMNamedNodeMapImpl(cmattrMap);</TD></TR><TR CLASS="z"><TD CLASS="l">1190</TD><TD>                                                List nodes = ModelQueryUtil.getModelQuery(node.getOwnerDocument()).getAvailableContent((Element) node, (CMElementDeclaration) cmnode, ModelQuery.INCLUDE_ATTRIBUTES);</TD></TR><TR CLASS="z"><TD CLASS="l">1191</TD><TD>                                                for (int k = 0; k &lt; nodes.size(); k++) {</TD></TR><TR CLASS="z"><TD CLASS="l">1192</TD><TD>                                                        CMNode adnode = (CMNode) nodes.get(k);</TD></TR><TR CLASS="z"><TD CLASS="l">1193</TD><TD>                                                        if (adnode.getNodeType() == CMNode.ATTRIBUTE_DECLARATION) {</TD></TR><TR CLASS="z"><TD CLASS="l">1194</TD><TD>                                                                allAttributes.put(adnode);</TD></TR><TR><TD CLASS="l">1195</TD><TD>                                                        }</TD></TR><TR><TD CLASS="l">1196</TD><TD>                                                }</TD></TR><TR CLASS="z"><TD CLASS="l">1197</TD><TD>                                                cmattrMap = allAttributes;</TD></TR><TR><TD CLASS="l">1198</TD><TD>                                                </TD></TR><TR><TD CLASS="l">1199</TD><TD>                                                // iterate possible attributes from a cmnode in</TD></TR><TR><TD CLASS="l">1200</TD><TD>                                                // proposal list</TD></TR><TR CLASS="z"><TD CLASS="l">1201</TD><TD>                                                for (int k = 0; (cmattrMap != null) &amp;&amp; (k &lt; cmattrMap.getLength()); k++) {</TD></TR><TR><TD CLASS="l">1202</TD><TD>                                                        // check if name matches</TD></TR><TR CLASS="z"><TD CLASS="l">1203</TD><TD>                                                        if (cmattrMap.item(k).getNodeName().equals(attrMatchString)) {</TD></TR><TR CLASS="z"><TD CLASS="l">1204</TD><TD>                                                                return true;</TD></TR><TR><TD CLASS="l">1205</TD><TD>                                                        }</TD></TR><TR><TD CLASS="l">1206</TD><TD>                                                }</TD></TR><TR><TD CLASS="l">1207</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">1208</TD><TD>                                }</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"><A NAME="39">1211</A></TD><TD>                return false;</TD></TR><TR><TD CLASS="l">1212</TD><TD>        }</TD></TR><TR><TD CLASS="l">1213</TD><TD> </TD></TR><TR><TD CLASS="l">1214</TD><TD>        protected boolean beginsWith(String aString, String prefix) {</TD></TR><TR CLASS="c"><TD CLASS="l">1215</TD><TD>                if ((aString == null) || (prefix == null)) {</TD></TR><TR CLASS="z"><TD CLASS="l">1216</TD><TD>                        return true;</TD></TR><TR><TD CLASS="l">1217</TD><TD>                }</TD></TR><TR><TD CLASS="l">1218</TD><TD>                // (pa) matching independent of case to be consistant with Java</TD></TR><TR><TD CLASS="l">1219</TD><TD>                // editor CA</TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="c">1220</A></TD><TD>                return aString.toLowerCase().startsWith(prefix.toLowerCase());</TD></TR><TR><TD CLASS="l">1221</TD><TD>        }</TD></TR><TR><TD CLASS="l">1222</TD><TD> </TD></TR><TR><TD CLASS="l">1223</TD><TD>        protected ContentAssistRequest computeAttributeProposals(int documentPosition, String matchString, ITextRegion completionRegion, IDOMNode nodeAtOffset, IDOMNode node) {</TD></TR><TR CLASS="z"><TD CLASS="l">1224</TD><TD>                ContentAssistRequest contentAssistRequest = null;</TD></TR><TR CLASS="z"><TD CLASS="l">1225</TD><TD>                IStructuredDocumentRegion sdRegion = getStructuredDocumentRegion(documentPosition);</TD></TR><TR CLASS="z"><TD CLASS="l">1226</TD><TD>                if (documentPosition &lt; sdRegion.getStartOffset(completionRegion)) {</TD></TR><TR><TD CLASS="l">1227</TD><TD>                        // setup to insert new attributes</TD></TR><TR CLASS="z"><TD CLASS="l">1228</TD><TD>                        contentAssistRequest = newContentAssistRequest(nodeAtOffset, node, sdRegion, completionRegion, documentPosition, 0, matchString);</TD></TR><TR><TD CLASS="l">1229</TD><TD>                }</TD></TR><TR><TD CLASS="l">1230</TD><TD>                else {</TD></TR><TR><TD CLASS="l">1231</TD><TD>                        // Setup to replace an existing attribute name</TD></TR><TR CLASS="z"><TD CLASS="l">1232</TD><TD>                        contentAssistRequest = newContentAssistRequest(nodeAtOffset, node, sdRegion, completionRegion, sdRegion.getStartOffset(completionRegion), completionRegion.getTextLength(), matchString);</TD></TR><TR><TD CLASS="l">1233</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1234</TD><TD>                addAttributeNameProposals(contentAssistRequest);</TD></TR><TR CLASS="z"><TD CLASS="l">1235</TD><TD>                contentAssistRequest.setReplacementBeginPosition(documentPosition);</TD></TR><TR CLASS="z"><TD CLASS="l">1236</TD><TD>                contentAssistRequest.setReplacementLength(0);</TD></TR><TR CLASS="z"><TD CLASS="l">1237</TD><TD>                if ((node.getFirstStructuredDocumentRegion() != null) &amp;&amp; (!node.getFirstStructuredDocumentRegion().isEnded())) {</TD></TR><TR CLASS="z"><TD CLASS="l">1238</TD><TD>                        addTagCloseProposals(contentAssistRequest);</TD></TR><TR><TD CLASS="l">1239</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="2a">1240</A></TD><TD>                return contentAssistRequest;</TD></TR><TR><TD CLASS="l">1241</TD><TD>        }</TD></TR><TR><TD CLASS="l">1242</TD><TD> </TD></TR><TR><TD CLASS="l">1243</TD><TD>        protected ContentAssistRequest computeAttributeValueProposals(int documentPosition, String matchString, ITextRegion completionRegion, IDOMNode nodeAtOffset, IDOMNode node) {</TD></TR><TR CLASS="c"><TD CLASS="l">1244</TD><TD>                ContentAssistRequest contentAssistRequest = null;</TD></TR><TR CLASS="c"><TD CLASS="l">1245</TD><TD>                IStructuredDocumentRegion sdRegion = getStructuredDocumentRegion(documentPosition);</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="52% line coverage (14 out of 27 instructions)">1246</TD><TD TITLE="52% line coverage (14 out of 27 instructions)">                if ((documentPosition &gt; sdRegion.getStartOffset(completionRegion) + completionRegion.getTextLength()) &amp;&amp; (sdRegion.getStartOffset(completionRegion) + completionRegion.getTextLength() != sdRegion.getStartOffset(completionRegion) + completionRegion.getLength())) {</TD></TR><TR><TD CLASS="l">1247</TD><TD>                        // setup to add a new attribute at the documentPosition</TD></TR><TR CLASS="z"><TD CLASS="l">1248</TD><TD>                        IDOMNode actualNode = (IDOMNode) node.getModel().getIndexedRegion(sdRegion.getStartOffset(completionRegion));</TD></TR><TR CLASS="z"><TD CLASS="l">1249</TD><TD>                        contentAssistRequest = newContentAssistRequest(actualNode, actualNode, sdRegion, completionRegion, documentPosition, 0, matchString);</TD></TR><TR CLASS="z"><TD CLASS="l">1250</TD><TD>                        addAttributeNameProposals(contentAssistRequest);</TD></TR><TR CLASS="z"><TD CLASS="l">1251</TD><TD>                        if ((actualNode.getFirstStructuredDocumentRegion() != null) &amp;&amp; !actualNode.getFirstStructuredDocumentRegion().isEnded()) {</TD></TR><TR CLASS="z"><TD CLASS="l">1252</TD><TD>                                addTagCloseProposals(contentAssistRequest);</TD></TR><TR><TD CLASS="l">1253</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1254</TD><TD>                }</TD></TR><TR><TD CLASS="l">1255</TD><TD>                else {</TD></TR><TR><TD CLASS="l">1256</TD><TD>                        // setup to replace the existing value</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="44% line coverage (4 out of 9 instructions)">1257</TD><TD TITLE="44% line coverage (4 out of 9 instructions)">                        if (!nodeAtOffset.getFirstStructuredDocumentRegion().isEnded() &amp;&amp; (documentPosition &lt; sdRegion.getStartOffset(completionRegion))) {</TD></TR><TR><TD CLASS="l">1258</TD><TD>                                // if the IStructuredDocumentRegion isn't closed and the</TD></TR><TR><TD CLASS="l">1259</TD><TD>                                // cursor is in front of the value, add</TD></TR><TR CLASS="z"><TD CLASS="l">1260</TD><TD>                                contentAssistRequest = newContentAssistRequest(nodeAtOffset, node, sdRegion, completionRegion, documentPosition, 0, matchString);</TD></TR><TR CLASS="z"><TD CLASS="l">1261</TD><TD>                                addAttributeNameProposals(contentAssistRequest);</TD></TR><TR><TD CLASS="l">1262</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1263</TD><TD>                        else {</TD></TR><TR CLASS="c"><TD CLASS="l">1264</TD><TD>                                contentAssistRequest = newContentAssistRequest(nodeAtOffset, node, sdRegion, completionRegion, sdRegion.getStartOffset(completionRegion), completionRegion.getTextLength(), matchString);</TD></TR><TR CLASS="c"><TD CLASS="l">1265</TD><TD>                                addAttributeValueProposals(contentAssistRequest);</TD></TR><TR><TD CLASS="l">1266</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1267</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="27">1268</A></TD><TD>                return contentAssistRequest;</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>        protected ContentAssistRequest computeCompletionProposals(int documentPosition, String matchString, ITextRegion completionRegion, IDOMNode treeNode, IDOMNode xmlnode) {</TD></TR><TR CLASS="c"><TD CLASS="l">1272</TD><TD>                ContentAssistRequest contentAssistRequest = null;</TD></TR><TR CLASS="c"><TD CLASS="l">1273</TD><TD>                String regionType = completionRegion.getType();</TD></TR><TR CLASS="c"><TD CLASS="l">1274</TD><TD>                IStructuredDocumentRegion sdRegion = getStructuredDocumentRegion(documentPosition);</TD></TR><TR><TD CLASS="l">1275</TD><TD> </TD></TR><TR><TD CLASS="l">1276</TD><TD>                // Handle the most common and best supported cases</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="76% line coverage (13 out of 17 instructions)">1277</TD><TD TITLE="76% line coverage (13 out of 17 instructions)">                if ((xmlnode.getNodeType() == Node.ELEMENT_NODE) || (xmlnode.getNodeType() == Node.DOCUMENT_NODE)) {</TD></TR><TR CLASS="c"><TD CLASS="l">1278</TD><TD>                        if (regionType == DOMRegionContext.XML_TAG_OPEN) {</TD></TR><TR CLASS="c"><TD CLASS="l">1279</TD><TD>                                contentAssistRequest = computeTagOpenProposals(documentPosition, matchString, completionRegion, treeNode, xmlnode);</TD></TR><TR><TD CLASS="l">1280</TD><TD>                        }</TD></TR><TR CLASS="c"><TD CLASS="l">1281</TD><TD>                        else if (regionType == DOMRegionContext.XML_TAG_NAME) {</TD></TR><TR CLASS="z"><TD CLASS="l">1282</TD><TD>                                contentAssistRequest = computeTagNameProposals(documentPosition, matchString, completionRegion, treeNode, xmlnode);</TD></TR><TR><TD CLASS="l">1283</TD><TD>                        }</TD></TR><TR CLASS="c"><TD CLASS="l">1284</TD><TD>                        else if (regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME) {</TD></TR><TR CLASS="z"><TD CLASS="l">1285</TD><TD>                                contentAssistRequest = computeAttributeProposals(documentPosition, matchString, completionRegion, treeNode, xmlnode);</TD></TR><TR><TD CLASS="l">1286</TD><TD>                        }</TD></TR><TR CLASS="c"><TD CLASS="l">1287</TD><TD>                        else if (regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS) {</TD></TR><TR CLASS="z"><TD CLASS="l">1288</TD><TD>                                contentAssistRequest = computeEqualsProposals(documentPosition, matchString, completionRegion, treeNode, xmlnode);</TD></TR><TR><TD CLASS="l">1289</TD><TD>                        }</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="37% line coverage (7 out of 19 instructions)">1290</TD><TD TITLE="37% line coverage (7 out of 19 instructions)">                        else if ((regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE) &amp;&amp; (documentPosition == sdRegion.getTextEndOffset()) &amp;&amp; (sdRegion.getText(completionRegion).endsWith(&#34;\&#34;&#34;) || sdRegion.getText(completionRegion).endsWith(&#34;\'&#34;))) //$NON-NLS-1$ //$NON-NLS-2$</TD></TR><TR><TD CLASS="l">1291</TD><TD>                        {</TD></TR><TR><TD CLASS="l">1292</TD><TD>                                // this is for when the cursor is at the end of the closing</TD></TR><TR><TD CLASS="l">1293</TD><TD>                                // quote for an attribute..</TD></TR><TR CLASS="z"><TD CLASS="l">1294</TD><TD>                                IDOMNode actualNode = (IDOMNode) xmlnode.getModel().getIndexedRegion(sdRegion.getStartOffset(completionRegion));</TD></TR><TR CLASS="z"><TD CLASS="l">1295</TD><TD>                                contentAssistRequest = newContentAssistRequest(actualNode, actualNode, sdRegion, completionRegion, documentPosition, 0, matchString);</TD></TR><TR CLASS="z"><TD CLASS="l">1296</TD><TD>                                addTagCloseProposals(contentAssistRequest);</TD></TR><TR><TD CLASS="l">1297</TD><TD>                        }</TD></TR><TR CLASS="c"><TD CLASS="l">1298</TD><TD>                        else if (regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE) {</TD></TR><TR CLASS="c"><TD CLASS="l">1299</TD><TD>                                contentAssistRequest = computeAttributeValueProposals(documentPosition, matchString, completionRegion, treeNode, xmlnode);</TD></TR><TR><TD CLASS="l">1300</TD><TD>                        }</TD></TR><TR CLASS="c"><TD CLASS="l">1301</TD><TD>                        else if ((regionType == DOMRegionContext.XML_TAG_CLOSE) || (regionType == DOMRegionContext.XML_EMPTY_TAG_CLOSE) || (regionType.equals(DOMJSPRegionContextsPrivateCopy.JSP_DIRECTIVE_CLOSE))) {</TD></TR><TR CLASS="c"><TD CLASS="l">1302</TD><TD>                                contentAssistRequest = computeTagCloseProposals(documentPosition, matchString, completionRegion, treeNode, xmlnode);</TD></TR><TR><TD CLASS="l">1303</TD><TD>                        }</TD></TR><TR CLASS="c"><TD CLASS="l">1304</TD><TD>                        else if (regionType == DOMRegionContext.XML_END_TAG_OPEN) {</TD></TR><TR CLASS="z"><TD CLASS="l">1305</TD><TD>                                contentAssistRequest = computeEndTagOpenProposals(documentPosition, matchString, completionRegion, treeNode, xmlnode);</TD></TR><TR><TD CLASS="l">1306</TD><TD>                        }</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="25% line coverage (3 out of 12 instructions)">1307</TD><TD TITLE="25% line coverage (3 out of 12 instructions)">                        else if ((regionType == DOMRegionContext.XML_CONTENT) || (regionType == DOMRegionContext.XML_CHAR_REFERENCE) || (regionType == DOMRegionContext.XML_ENTITY_REFERENCE) || (regionType == DOMRegionContext.XML_PE_REFERENCE)) {</TD></TR><TR CLASS="c"><TD CLASS="l">1308</TD><TD>                                contentAssistRequest = computeContentProposals(documentPosition, matchString, completionRegion, treeNode, xmlnode);</TD></TR><TR><TD CLASS="l">1309</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1310</TD><TD> </TD></TR><TR><TD CLASS="l">1311</TD><TD>                        // These ITextRegion types begin DOM Elements as well and although</TD></TR><TR><TD CLASS="l">1312</TD><TD>                        // internally harder to assist,</TD></TR><TR><TD CLASS="l">1313</TD><TD>                        // text insertions directly before them can be made</TD></TR><TR CLASS="z"><TD CLASS="l">1314</TD><TD>                        else if ((documentPosition == sdRegion.getStartOffset(completionRegion)) &amp;&amp; (regionType.equals(DOMJSPRegionContextsPrivateCopy.JSP_COMMENT_OPEN) || regionType.equals(DOMJSPRegionContextsPrivateCopy.JSP_DECLARATION_OPEN) || regionType.equals(DOMJSPRegionContextsPrivateCopy.JSP_DIRECTIVE_OPEN) || regionType.equals(DOMJSPRegionContextsPrivateCopy.JSP_EXPRESSION_OPEN) || regionType.equals(DOMJSPRegionContextsPrivateCopy.JSP_SCRIPTLET_OPEN) || (regionType == DOMRegionContext.XML_DECLARATION_OPEN) || (regionType == DOMRegionContext.XML_PI_OPEN) || (regionType == DOMRegionContext.XML_COMMENT_OPEN) || (regionType == DOMRegionContext.XML_CDATA_OPEN))) {</TD></TR><TR CLASS="z"><TD CLASS="l">1315</TD><TD>                                contentAssistRequest = newContentAssistRequest(treeNode, xmlnode.getParentNode(), sdRegion, completionRegion, documentPosition, 0, matchString);</TD></TR><TR CLASS="z"><TD CLASS="l">1316</TD><TD>                                addTagInsertionProposals(contentAssistRequest, getElementPositionForModelQuery(treeNode));</TD></TR><TR CLASS="z"><TD CLASS="l">1317</TD><TD>                                addStartDocumentProposals(contentAssistRequest);</TD></TR><TR><TD CLASS="l">1318</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1319</TD><TD>                }</TD></TR><TR><TD CLASS="l">1320</TD><TD>                // Not a Document or Element? (odd cases go here for now)</TD></TR><TR CLASS="z"><TD CLASS="l">1321</TD><TD>                else if (isCloseRegion(completionRegion)) {</TD></TR><TR CLASS="z"><TD CLASS="l">1322</TD><TD>                        contentAssistRequest = newContentAssistRequest(treeNode, xmlnode.getParentNode(), sdRegion, completionRegion, sdRegion.getStartOffset(completionRegion) + completionRegion.getLength(), 0, matchString);</TD></TR><TR CLASS="z"><TD CLASS="l">1323</TD><TD>                        addStartDocumentProposals(contentAssistRequest);</TD></TR><TR CLASS="z"><TD CLASS="l">1324</TD><TD>                        if (documentPosition &gt;= sdRegion.getTextEndOffset(completionRegion)) {</TD></TR><TR CLASS="z"><TD CLASS="l">1325</TD><TD>                                addTagInsertionProposals(contentAssistRequest, getElementPositionForModelQuery(treeNode) + 1);</TD></TR><TR><TD CLASS="l">1326</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1327</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1328</TD><TD>                else if ((documentPosition == sdRegion.getStartOffset(completionRegion)) &amp;&amp; (regionType.equals(DOMJSPRegionContextsPrivateCopy.JSP_COMMENT_OPEN) || regionType.equals(DOMJSPRegionContextsPrivateCopy.JSP_DECLARATION_OPEN) || regionType.equals(DOMJSPRegionContextsPrivateCopy.JSP_DIRECTIVE_OPEN) || regionType.equals(DOMJSPRegionContextsPrivateCopy.JSP_EXPRESSION_OPEN) || regionType.equals(DOMJSPRegionContextsPrivateCopy.JSP_SCRIPTLET_OPEN) || (regionType == DOMRegionContext.XML_DECLARATION_OPEN) || (regionType == DOMRegionContext.XML_PI_OPEN) || (regionType == DOMRegionContext.XML_COMMENT_OPEN) || (regionType == DOMRegionContext.XML_CDATA_OPEN))) {</TD></TR><TR CLASS="z"><TD CLASS="l">1329</TD><TD>                        contentAssistRequest = newContentAssistRequest(treeNode, xmlnode.getParentNode(), sdRegion, completionRegion, documentPosition, 0, matchString);</TD></TR><TR CLASS="z"><TD CLASS="l">1330</TD><TD>                        addTagInsertionProposals(contentAssistRequest, getElementPositionForModelQuery(treeNode));</TD></TR><TR CLASS="z"><TD CLASS="l">1331</TD><TD>                        addStartDocumentProposals(contentAssistRequest);</TD></TR><TR><TD CLASS="l">1332</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">1333</TD><TD>                return contentAssistRequest;</TD></TR><TR><TD CLASS="l">1334</TD><TD>        }</TD></TR><TR><TD CLASS="l">1335</TD><TD> </TD></TR><TR><TD CLASS="l">1336</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1337</TD><TD>         * CONTENT ASSIST STARTS HERE</TD></TR><TR><TD CLASS="l">1338</TD><TD>         * </TD></TR><TR><TD CLASS="l">1339</TD><TD>         * Return a list of proposed code completions based on the specified</TD></TR><TR><TD CLASS="l">1340</TD><TD>         * location within the document that corresponds to the current cursor</TD></TR><TR><TD CLASS="l">1341</TD><TD>         * position within the text-editor control.</TD></TR><TR><TD CLASS="l">1342</TD><TD>         * </TD></TR><TR><TD CLASS="l">1343</TD><TD>         * @param textViewer</TD></TR><TR><TD CLASS="l">1344</TD><TD>         * @param documentPosition -</TD></TR><TR><TD CLASS="l">1345</TD><TD>         *            the cursor location within the document</TD></TR><TR><TD CLASS="l">1346</TD><TD>         * </TD></TR><TR><TD CLASS="l"><A NAME="2f">1347</A></TD><TD>         * an array of ICompletionProposals</TD></TR><TR><TD CLASS="l">1348</TD><TD>         */</TD></TR><TR><TD CLASS="l">1349</TD><TD>        public ICompletionProposal[] computeCompletionProposals(ITextViewer textViewer, int documentPosition) {</TD></TR><TR><TD CLASS="l">1350</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1351</TD><TD>                setErrorMessage(null);</TD></TR><TR><TD CLASS="l">1352</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1353</TD><TD>                fTextViewer = textViewer;</TD></TR><TR><TD CLASS="l">1354</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1355</TD><TD>                IndexedRegion treeNode = ContentAssistUtils.getNodeAt(textViewer, documentPosition);</TD></TR><TR><TD CLASS="l">1356</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1357</TD><TD>                Node node = (Node) treeNode;</TD></TR><TR CLASS="c"><TD CLASS="l">1358</TD><TD>                while ((node != null) &amp;&amp; (node.getNodeType() == Node.TEXT_NODE) &amp;&amp; (node.getParentNode() != null)) {</TD></TR><TR CLASS="c"><TD CLASS="l">1359</TD><TD>                        node = node.getParentNode();</TD></TR><TR><TD CLASS="l">1360</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">1361</TD><TD>                IDOMNode xmlnode = (IDOMNode) node;</TD></TR><TR><TD CLASS="l">1362</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1363</TD><TD>                ContentAssistRequest contentAssistRequest = null;</TD></TR><TR><TD CLASS="l">1364</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1365</TD><TD>                IStructuredDocumentRegion sdRegion = getStructuredDocumentRegion(documentPosition);</TD></TR><TR CLASS="c"><TD CLASS="l">1366</TD><TD>                ITextRegion completionRegion = getCompletionRegion(documentPosition, node);</TD></TR><TR><TD CLASS="l">1367</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1368</TD><TD>                String matchString = getMatchString(sdRegion, completionRegion, documentPosition);</TD></TR><TR><TD CLASS="l">1369</TD><TD> </TD></TR><TR><TD CLASS="l">1370</TD><TD>                // Handle empty Documents</TD></TR><TR CLASS="c"><TD CLASS="l">1371</TD><TD>                if (completionRegion == null) {</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="33% line coverage (6 out of 18 instructions)">1372</TD><TD TITLE="33% line coverage (6 out of 18 instructions)">                        if (((treeNode == null) || (((Node) treeNode).getNodeType() == Node.DOCUMENT_NODE)) &amp;&amp; (completionRegion == null) &amp;&amp; ((xmlnode == null) || (xmlnode.getChildNodes() == null) || (xmlnode.getChildNodes().getLength() == 0))) {</TD></TR><TR CLASS="c"><TD CLASS="l">1373</TD><TD>                                IStructuredModel sModel = StructuredModelManager.getModelManager().getExistingModelForRead(textViewer.getDocument());</TD></TR><TR><TD CLASS="l">1374</TD><TD>                                try {</TD></TR><TR CLASS="c"><TD CLASS="l">1375</TD><TD>                                        if (sModel != null) {</TD></TR><TR CLASS="c"><TD CLASS="l">1376</TD><TD>                                                IDOMDocument docNode = ((IDOMModel) sModel).getDocument();</TD></TR><TR CLASS="c"><TD CLASS="l">1377</TD><TD>                                                contentAssistRequest = newContentAssistRequest(docNode, docNode, sdRegion, completionRegion, documentPosition, 0, null);</TD></TR><TR CLASS="c"><TD CLASS="l">1378</TD><TD>                                                addEmptyDocumentProposals(contentAssistRequest);</TD></TR><TR><TD CLASS="l">1379</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">1380</TD><TD>                                }</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="60% line coverage (3 out of 5 instructions)">1381</TD><TD TITLE="60% line coverage (3 out of 5 instructions)">                                finally {</TD></TR><TR CLASS="c"><TD CLASS="l">1382</TD><TD>                                        if (sModel != null) {</TD></TR><TR CLASS="c"><TD CLASS="l">1383</TD><TD>                                                sModel.releaseFromRead();</TD></TR><TR><TD CLASS="l">1384</TD><TD>                                        }</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="50% line coverage (2 out of 4 instructions)">1385</TD><TD TITLE="50% line coverage (2 out of 4 instructions)">                                }</TD></TR><TR CLASS="c"><TD CLASS="l">1386</TD><TD>                                if (contentAssistRequest == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1387</TD><TD>                                        Logger.logException(new IllegalStateException(&#34;problem getting model&#34;)); //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">1388</TD><TD>                                        return new ICompletionProposal[0];</TD></TR><TR><TD CLASS="l">1389</TD><TD>                                }</TD></TR><TR CLASS="c"><TD CLASS="l">1390</TD><TD>                                return contentAssistRequest.getCompletionProposals();</TD></TR><TR><TD CLASS="l">1391</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1392</TD><TD>                        // MASSIVE ERROR CONDITION</TD></TR><TR CLASS="z"><TD CLASS="l">1393</TD><TD>                        Logger.logException(new IllegalStateException(&#34;completion region was null&#34;)); //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">1394</TD><TD>                        setErrorMessage(INTERNALERROR);</TD></TR><TR CLASS="z"><TD CLASS="l">1395</TD><TD>                        contentAssistRequest = newContentAssistRequest((Node) treeNode, node.getParentNode(), sdRegion, completionRegion, documentPosition, 0, &#34;&#34;); //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">1396</TD><TD>                        return contentAssistRequest.getCompletionProposals();</TD></TR><TR><TD CLASS="l">1397</TD><TD>                }</TD></TR><TR><TD CLASS="l">1398</TD><TD> </TD></TR><TR><TD CLASS="l">1399</TD><TD> </TD></TR><TR><TD CLASS="l">1400</TD><TD>                // catch documents where no region can be determined</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="31% line coverage (4 out of 13 instructions)">1401</TD><TD TITLE="31% line coverage (4 out of 13 instructions)">                if ((xmlnode.getNodeType() == Node.DOCUMENT_NODE) &amp;&amp; ((completionRegion == null) || (xmlnode.getChildNodes() == null) || (xmlnode.getChildNodes().getLength() == 0))) {</TD></TR><TR CLASS="z"><TD CLASS="l">1402</TD><TD>                        contentAssistRequest = computeStartDocumentProposals(documentPosition, matchString, completionRegion, (IDOMNode) treeNode, xmlnode);</TD></TR><TR CLASS="z"><TD CLASS="l">1403</TD><TD>                        return contentAssistRequest.getCompletionProposals();</TD></TR><TR><TD CLASS="l">1404</TD><TD>                }</TD></TR><TR><TD CLASS="l">1405</TD><TD> </TD></TR><TR><TD CLASS="l">1406</TD><TD>                // compute normal proposals</TD></TR><TR CLASS="c"><TD CLASS="l">1407</TD><TD>                contentAssistRequest = computeCompletionProposals(documentPosition, matchString, completionRegion, (IDOMNode) treeNode, xmlnode);</TD></TR><TR CLASS="c"><TD CLASS="l">1408</TD><TD>                if (contentAssistRequest == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1409</TD><TD>                        contentAssistRequest = newContentAssistRequest((Node) treeNode, node.getParentNode(), sdRegion, completionRegion, documentPosition, 0, &#34;&#34;); //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">1410</TD><TD>                        if (Debug.displayWarnings) {</TD></TR><TR><TD CLASS="l">1411</TD><TD>                                System.out.println(UNKNOWN_CONTEXT + &#34; &#34; + completionRegion.getType() + &#34;@&#34; + documentPosition); //$NON-NLS-2$//$NON-NLS-1$</TD></TR><TR><TD CLASS="l">1412</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">1413</TD><TD>                        setErrorMessage(UNKNOWN_CONTEXT);</TD></TR><TR><TD CLASS="l">1414</TD><TD>                }</TD></TR><TR><TD CLASS="l">1415</TD><TD> </TD></TR><TR><TD CLASS="l">1416</TD><TD>                /* </TD></TR><TR><TD CLASS="l">1417</TD><TD>                 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=123892</TD></TR><TR><TD CLASS="l">1418</TD><TD>                 * Only set this error message if nothing else was already set </TD></TR><TR><TD CLASS="l">1419</TD><TD>                 **/</TD></TR><TR CLASS="c"><TD CLASS="l">1420</TD><TD>                if (contentAssistRequest.getProposals().size() == 0 &amp;&amp; getErrorMessage() == null) {</TD></TR><TR CLASS="c"><TD CLASS="l">1421</TD><TD>                        setErrorMessage(UNKNOWN_CONTEXT);</TD></TR><TR><TD CLASS="l">1422</TD><TD>                }</TD></TR><TR><TD CLASS="l">1423</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="3c">1424</A></TD><TD>                return contentAssistRequest.getCompletionProposals();</TD></TR><TR><TD CLASS="l">1425</TD><TD>        }</TD></TR><TR><TD CLASS="l">1426</TD><TD> </TD></TR><TR><TD CLASS="l">1427</TD><TD>        protected ContentAssistRequest computeContentProposals(int documentPosition, String matchString, ITextRegion completionRegion, IDOMNode nodeAtOffset, IDOMNode node) {</TD></TR><TR CLASS="c"><TD CLASS="l">1428</TD><TD>                ContentAssistRequest contentAssistRequest = null;</TD></TR><TR><TD CLASS="l">1429</TD><TD> </TD></TR><TR><TD CLASS="l">1430</TD><TD>                // setup to add children at the content node's position</TD></TR><TR CLASS="c"><TD CLASS="l">1431</TD><TD>                contentAssistRequest = newContentAssistRequest(nodeAtOffset, node, getStructuredDocumentRegion(documentPosition), completionRegion, documentPosition, 0, matchString);</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="83% line coverage (20 out of 24 instructions)">1432</TD><TD TITLE="83% line coverage (20 out of 24 instructions)">                if ((node != null) &amp;&amp; (node.getNodeType() == Node.DOCUMENT_NODE) &amp;&amp; (((Document) node).getDoctype() == null)) {</TD></TR><TR CLASS="z"><TD CLASS="l">1433</TD><TD>                        addStartDocumentProposals(contentAssistRequest);</TD></TR><TR><TD CLASS="l">1434</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">1435</TD><TD>                addTagInsertionProposals(contentAssistRequest, getElementPositionForModelQuery(nodeAtOffset));</TD></TR><TR CLASS="c"><TD CLASS="l">1436</TD><TD>                if (node.getNodeType() != Node.DOCUMENT_NODE) {</TD></TR><TR CLASS="c"><TD CLASS="l">1437</TD><TD>                        addEndTagProposals(contentAssistRequest);</TD></TR><TR><TD CLASS="l">1438</TD><TD>                }</TD></TR><TR><TD CLASS="l">1439</TD><TD>                // entities?</TD></TR><TR CLASS="c"><TD CLASS="l">1440</TD><TD>                addEntityProposals(contentAssistRequest, documentPosition, completionRegion, node);</TD></TR><TR><TD CLASS="l">1441</TD><TD>                // addEntityProposals(contentAssistRequest);</TD></TR><TR CLASS="c"><TD CLASS="l">1442</TD><TD>                return contentAssistRequest;</TD></TR><TR><TD CLASS="l">1443</TD><TD>        }</TD></TR><TR><TD CLASS="l">1444</TD><TD> </TD></TR><TR><TD CLASS="l">1445</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1446</TD><TD>         * Returns information about possible contexts based on the specified</TD></TR><TR><TD CLASS="l">1447</TD><TD>         * location within the document that corresponds to the current cursor</TD></TR><TR><TD CLASS="l">1448</TD><TD>         * position within the text viewer.</TD></TR><TR><TD CLASS="l">1449</TD><TD>         * </TD></TR><TR><TD CLASS="l">1450</TD><TD>         * @param viewer</TD></TR><TR><TD CLASS="l">1451</TD><TD>         *            the viewer whose document is used to compute the possible</TD></TR><TR><TD CLASS="l"><A NAME="d">1452</A></TD><TD>         *            contexts an array of context information objects or</TD></TR><TR><TD CLASS="l">1453</TD><TD>         *            &lt;code&gt;null&lt;/code&gt; if no context could be found</TD></TR><TR><TD CLASS="l">1454</TD><TD>         */</TD></TR><TR><TD CLASS="l">1455</TD><TD>        public IContextInformation[] computeContextInformation(ITextViewer viewer, int documentOffset) {</TD></TR><TR CLASS="z"><TD CLASS="l">1456</TD><TD>                if (fAttributeInfoProvider == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1457</TD><TD>                        fAttributeInfoProvider = new AttributeContextInformationProvider((IStructuredDocument) viewer.getDocument(), (AttributeContextInformationPresenter) getContextInformationValidator());</TD></TR><TR><TD CLASS="l">1458</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="e">1459</A></TD><TD>                return fAttributeInfoProvider.getAttributeInformation(documentOffset);</TD></TR><TR><TD CLASS="l">1460</TD><TD>        }</TD></TR><TR><TD CLASS="l">1461</TD><TD> </TD></TR><TR><TD CLASS="l">1462</TD><TD>        protected ContentAssistRequest computeEndTagOpenProposals(int documentPosition, String matchString, ITextRegion completionRegion, IDOMNode nodeAtOffset, IDOMNode node) {</TD></TR><TR CLASS="z"><TD CLASS="l">1463</TD><TD>                ContentAssistRequest contentAssistRequest = null;</TD></TR><TR CLASS="z"><TD CLASS="l">1464</TD><TD>                IStructuredDocumentRegion sdRegion = getStructuredDocumentRegion(documentPosition);</TD></TR><TR CLASS="z"><TD CLASS="l">1465</TD><TD>                int completionRegionStart = sdRegion.getStartOffset(completionRegion);</TD></TR><TR CLASS="z"><TD CLASS="l">1466</TD><TD>                int completionRegionLength = completionRegion.getLength();</TD></TR><TR CLASS="z"><TD CLASS="l">1467</TD><TD>                IStructuredDocumentRegion sdRegionAtCompletionOffset = node.getStructuredDocument().getRegionAtCharacterOffset(completionRegionStart + completionRegionLength);</TD></TR><TR CLASS="z"><TD CLASS="l">1468</TD><TD>                ITextRegion regionAtEndOfCompletion = sdRegionAtCompletionOffset.getRegionAtCharacterOffset(completionRegionStart + completionRegionLength);</TD></TR><TR><TD CLASS="l">1469</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1470</TD><TD>                if ((documentPosition != completionRegionStart) &amp;&amp; (regionAtEndOfCompletion != null) &amp;&amp; (regionAtEndOfCompletion.getType() == DOMRegionContext.XML_TAG_NAME)) {</TD></TR><TR CLASS="z"><TD CLASS="l">1471</TD><TD>                        ITextRegion nameRegion = regionAtEndOfCompletion;</TD></TR><TR CLASS="z"><TD CLASS="l">1472</TD><TD>                        contentAssistRequest = newContentAssistRequest(nodeAtOffset, nodeAtOffset.getParentNode(), sdRegion, completionRegion, sdRegion.getStartOffset(nameRegion), nameRegion.getTextLength(), matchString);</TD></TR><TR><TD CLASS="l">1473</TD><TD>                }</TD></TR><TR><TD CLASS="l">1474</TD><TD>                else {</TD></TR><TR CLASS="z"><TD CLASS="l">1475</TD><TD>                        if (nodeAtOffset.getFirstStructuredDocumentRegion() == sdRegion) {</TD></TR><TR><TD CLASS="l">1476</TD><TD>                                // abnormal case, this unmatched end tag will be a sibling</TD></TR><TR CLASS="z"><TD CLASS="l">1477</TD><TD>                                contentAssistRequest = newContentAssistRequest(nodeAtOffset, nodeAtOffset.getParentNode(), sdRegion, completionRegion, documentPosition, 0, matchString);</TD></TR><TR><TD CLASS="l">1478</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1479</TD><TD>                        else {</TD></TR><TR><TD CLASS="l">1480</TD><TD>                                // normal case, this end tag is the parent</TD></TR><TR CLASS="z"><TD CLASS="l">1481</TD><TD>                                contentAssistRequest = newContentAssistRequest(nodeAtOffset, nodeAtOffset, sdRegion, completionRegion, documentPosition, 0, matchString);</TD></TR><TR><TD CLASS="l">1482</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1483</TD><TD>                }</TD></TR><TR><TD CLASS="l">1484</TD><TD>                // if (documentPosition &gt;= sdRegion.getStartOffset(completionRegion) +</TD></TR><TR><TD CLASS="l">1485</TD><TD>                // completionRegion.getTextLength())</TD></TR><TR CLASS="z"><TD CLASS="l">1486</TD><TD>                addEndTagProposals(contentAssistRequest);</TD></TR><TR><TD CLASS="l">1487</TD><TD>                // else</TD></TR><TR CLASS="z"><TD CLASS="l">1488</TD><TD>                if (completionRegionStart == documentPosition) {</TD></TR><TR><TD CLASS="l">1489</TD><TD>                        // positioned at start of end tag</TD></TR><TR CLASS="z"><TD CLASS="l">1490</TD><TD>                        addTagInsertionProposals(contentAssistRequest, node.getChildNodes().getLength());</TD></TR><TR><TD CLASS="l">1491</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1492</TD><TD>                return contentAssistRequest;</TD></TR><TR><TD CLASS="l">1493</TD><TD>        }</TD></TR><TR><TD CLASS="l">1494</TD><TD> </TD></TR><TR><TD CLASS="l">1495</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1496</TD><TD>         * return all possible EntityReferenceProposals (according to current</TD></TR><TR><TD CLASS="l"><A NAME="2b">1497</A></TD><TD>         * position in doc)</TD></TR><TR><TD CLASS="l">1498</TD><TD>         */</TD></TR><TR><TD CLASS="l">1499</TD><TD>        protected ICompletionProposal[] computeEntityReferenceProposals(int documentPosition, ITextRegion completionRegion, IDOMNode treeNode) {</TD></TR><TR><TD CLASS="l">1500</TD><TD>                // only handle XML content for now</TD></TR><TR CLASS="c"><TD CLASS="l">1501</TD><TD>                Vector proposals = new Vector(); // ICompletionProposals</TD></TR><TR CLASS="c"><TD CLASS="l">1502</TD><TD>                IStructuredDocumentRegion sdRegion = getStructuredDocumentRegion(documentPosition);</TD></TR><TR CLASS="c"><TD CLASS="l">1503</TD><TD>                if ((completionRegion != null) &amp;&amp; (completionRegion.getType() == DOMRegionContext.XML_CONTENT)) {</TD></TR><TR CLASS="c"><TD CLASS="l">1504</TD><TD>                        int nodeOffset = documentPosition - sdRegion.getStartOffset(completionRegion);</TD></TR><TR CLASS="c"><TD CLASS="l">1505</TD><TD>                        String regionText = sdRegion.getFullText(completionRegion);</TD></TR><TR><TD CLASS="l">1506</TD><TD> </TD></TR><TR><TD CLASS="l">1507</TD><TD>                        // if directly to the right of a &amp;, region will be null, need to</TD></TR><TR><TD CLASS="l">1508</TD><TD>                        // move to</TD></TR><TR><TD CLASS="l">1509</TD><TD>                        // the previous region...there might be a better way to do this</TD></TR><TR CLASS="c"><TD CLASS="l">1510</TD><TD>                        if ((regionText != null) &amp;&amp; regionText.trim().equals(&#34;&#34;) &amp;&amp; (documentPosition &gt; 0)) { //$NON-NLS-1$</TD></TR><TR CLASS="c"><TD CLASS="l">1511</TD><TD>                                IStructuredDocumentRegion prev = treeNode.getStructuredDocument().getRegionAtCharacterOffset(documentPosition - 1);</TD></TR><TR CLASS="c"><TD CLASS="l">1512</TD><TD>                                if ((prev != null) &amp;&amp; prev.getText().equals(&#34;&amp;&#34;)) { //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">1513</TD><TD>                                        // https://bugs.eclipse.org/bugs/show_bug.cgi?id=206680</TD></TR><TR><TD CLASS="l">1514</TD><TD>                                        // examine previous region</TD></TR><TR CLASS="z"><TD CLASS="l">1515</TD><TD>                                        sdRegion = prev;</TD></TR><TR CLASS="z"><TD CLASS="l">1516</TD><TD>                                        completionRegion = prev.getLastRegion();</TD></TR><TR CLASS="z"><TD CLASS="l">1517</TD><TD>                                        regionText = prev.getFullText();</TD></TR><TR CLASS="z"><TD CLASS="l">1518</TD><TD>                                        nodeOffset = 1;</TD></TR><TR><TD CLASS="l">1519</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1520</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1521</TD><TD> </TD></TR><TR><TD CLASS="l">1522</TD><TD>                        // string must start w/ &amp;</TD></TR><TR CLASS="c"><TD CLASS="l">1523</TD><TD>                        if ((regionText != null) &amp;&amp; regionText.startsWith(&#34;&amp;&#34;)) { //$NON-NLS-1$                                                                 </TD></TR><TR CLASS="z"><TD CLASS="l">1524</TD><TD>                                String key = (nodeOffset &gt; 0) ? regionText.substring(1, nodeOffset) : &#34;&#34;; //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">1525</TD><TD> </TD></TR><TR><TD CLASS="l">1526</TD><TD>                                // get entity proposals, passing in the appropriate start</TD></TR><TR><TD CLASS="l">1527</TD><TD>                                // string</TD></TR><TR CLASS="z"><TD CLASS="l">1528</TD><TD>                                ModelQuery mq = ModelQueryUtil.getModelQuery(((Node) treeNode).getOwnerDocument());</TD></TR><TR CLASS="z"><TD CLASS="l">1529</TD><TD>                                if (mq != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1530</TD><TD>                                        CMDocument xmlDoc = mq.getCorrespondingCMDocument(treeNode);</TD></TR><TR CLASS="z"><TD CLASS="l">1531</TD><TD>                                        CMNamedNodeMap cmmap = null;</TD></TR><TR CLASS="z"><TD CLASS="l">1532</TD><TD>                                        Properties entities = null;</TD></TR><TR CLASS="z"><TD CLASS="l">1533</TD><TD>                                        if (xmlDoc != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1534</TD><TD>                                                cmmap = xmlDoc.getEntities();</TD></TR><TR><TD CLASS="l">1535</TD><TD>                                        }</TD></TR><TR CLASS="z"><TD CLASS="l">1536</TD><TD>                                        if (cmmap != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1537</TD><TD>                                                entities = mapToProperties(cmmap);</TD></TR><TR><TD CLASS="l">1538</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">1539</TD><TD>                                        else // 224787 in absence of content model, just use</TD></TR><TR><TD CLASS="l">1540</TD><TD>                                        // minimal 5 entities</TD></TR><TR><TD CLASS="l">1541</TD><TD>                                        {</TD></TR><TR CLASS="z"><TD CLASS="l">1542</TD><TD>                                                entities = new Properties();</TD></TR><TR CLASS="z"><TD CLASS="l">1543</TD><TD>                                                entities.put(&#34;quot&#34;, &#34;\&#34;&#34;); //$NON-NLS-1$ //$NON-NLS-2$</TD></TR><TR CLASS="z"><TD CLASS="l">1544</TD><TD>                                                entities.put(&#34;apos&#34;, &#34;'&#34;); //$NON-NLS-1$ //$NON-NLS-2$</TD></TR><TR CLASS="z"><TD CLASS="l">1545</TD><TD>                                                entities.put(&#34;amp&#34;, &#34;&amp;&#34;); //$NON-NLS-1$ //$NON-NLS-2$</TD></TR><TR CLASS="z"><TD CLASS="l">1546</TD><TD>                                                entities.put(&#34;lt&#34;, &#34;&lt;&#34;); //$NON-NLS-1$ //$NON-NLS-2$</TD></TR><TR CLASS="z"><TD CLASS="l">1547</TD><TD>                                                entities.put(&#34;gt&#34;, &#34;&gt;&#34;); //$NON-NLS-1$ //$NON-NLS-2$        </TD></TR><TR CLASS="z"><TD CLASS="l">1548</TD><TD>                                                entities.put(&#34;nbsp&#34;, &#34; &#34;); //$NON-NLS-1$ //$NON-NLS-2$                                                                        </TD></TR><TR><TD CLASS="l">1549</TD><TD>                                        }</TD></TR><TR CLASS="z"><TD CLASS="l">1550</TD><TD>                                        addEntityProposals(proposals, entities, key, nodeOffset, sdRegion, completionRegion);</TD></TR><TR><TD CLASS="l">1551</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1552</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1553</TD><TD>                }</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="50% line coverage (6 out of 12 instructions)"><A NAME="f">1554</A></TD><TD TITLE="50% line coverage (6 out of 12 instructions)">                return (ICompletionProposal[]) ((proposals.size() &gt; 0) ? proposals.toArray(new ICompletionProposal[proposals.size()]) : null);</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 ContentAssistRequest computeEqualsProposals(int documentPosition, String matchString, ITextRegion completionRegion, IDOMNode nodeAtOffset, IDOMNode node) {</TD></TR><TR CLASS="z"><TD CLASS="l">1558</TD><TD>                ContentAssistRequest contentAssistRequest = null;</TD></TR><TR CLASS="z"><TD CLASS="l">1559</TD><TD>                IStructuredDocumentRegion sdRegion = getStructuredDocumentRegion(documentPosition);</TD></TR><TR CLASS="z"><TD CLASS="l">1560</TD><TD>                ITextRegion valueRegion = node.getStartStructuredDocumentRegion().getRegionAtCharacterOffset(sdRegion.getStartOffset(completionRegion) + completionRegion.getLength());</TD></TR><TR CLASS="z"><TD CLASS="l">1561</TD><TD>                if ((valueRegion != null) &amp;&amp; (valueRegion.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE) &amp;&amp; (sdRegion.getStartOffset(valueRegion) &lt;= documentPosition)) {</TD></TR><TR><TD CLASS="l">1562</TD><TD>                        // replace the adjacent attribute value</TD></TR><TR CLASS="z"><TD CLASS="l">1563</TD><TD>                        contentAssistRequest = newContentAssistRequest(nodeAtOffset, node, sdRegion, valueRegion, sdRegion.getStartOffset(valueRegion), valueRegion.getTextLength(), matchString);</TD></TR><TR><TD CLASS="l">1564</TD><TD>                }</TD></TR><TR><TD CLASS="l">1565</TD><TD>                else {</TD></TR><TR><TD CLASS="l">1566</TD><TD>                        // append an attribute value after the '='</TD></TR><TR CLASS="z"><TD CLASS="l">1567</TD><TD>                        contentAssistRequest = newContentAssistRequest(nodeAtOffset, node, sdRegion, completionRegion, documentPosition, 0, matchString);</TD></TR><TR><TD CLASS="l">1568</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1569</TD><TD>                addAttributeValueProposals(contentAssistRequest);</TD></TR><TR CLASS="z"><TD CLASS="l">1570</TD><TD>                return contentAssistRequest;</TD></TR><TR><TD CLASS="l">1571</TD><TD>        }</TD></TR><TR><TD CLASS="l"><A NAME="10">1572</A></TD><TD> </TD></TR><TR><TD CLASS="l">1573</TD><TD>        protected ContentAssistRequest computeStartDocumentProposals(int documentPosition, String matchString, ITextRegion completionRegion, IDOMNode nodeAtOffset, IDOMNode node) {</TD></TR><TR><TD CLASS="l">1574</TD><TD>                // setup for a non-empty document, but one that hasn't been formally</TD></TR><TR><TD CLASS="l">1575</TD><TD>                // started</TD></TR><TR CLASS="z"><TD CLASS="l">1576</TD><TD>                ContentAssistRequest contentAssistRequest = null;</TD></TR><TR CLASS="z"><TD CLASS="l">1577</TD><TD>                contentAssistRequest = newContentAssistRequest(nodeAtOffset, node, getStructuredDocumentRegion(documentPosition), completionRegion, documentPosition, 0, matchString);</TD></TR><TR CLASS="z"><TD CLASS="l">1578</TD><TD>                addStartDocumentProposals(contentAssistRequest);</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="31">1579</A></TD><TD>                return contentAssistRequest;</TD></TR><TR><TD CLASS="l">1580</TD><TD>        }</TD></TR><TR><TD CLASS="l">1581</TD><TD> </TD></TR><TR><TD CLASS="l">1582</TD><TD>        protected ContentAssistRequest computeTagCloseProposals(int documentPosition, String matchString, ITextRegion completionRegion, IDOMNode nodeAtOffset, IDOMNode node) {</TD></TR><TR CLASS="c"><TD CLASS="l">1583</TD><TD>                ContentAssistRequest contentAssistRequest = null;</TD></TR><TR CLASS="c"><TD CLASS="l">1584</TD><TD>                IStructuredDocumentRegion sdRegion = getStructuredDocumentRegion(documentPosition);</TD></TR><TR><TD CLASS="l">1585</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1586</TD><TD>                if ((node.getNodeType() == Node.DOCUMENT_NODE) || (documentPosition &gt;= sdRegion.getEndOffset())) {</TD></TR><TR><TD CLASS="l">1587</TD><TD>                        // this is a content request as the documentPosition is AFTER the</TD></TR><TR><TD CLASS="l">1588</TD><TD>                        // end of the closing region</TD></TR><TR CLASS="z"><TD CLASS="l">1589</TD><TD>                        if ((node == nodeAtOffset) &amp;&amp; (node.getParentNode() != null)) {</TD></TR><TR CLASS="z"><TD CLASS="l">1590</TD><TD>                                node = (IDOMNode) node.getParentNode();</TD></TR><TR><TD CLASS="l">1591</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">1592</TD><TD>                        contentAssistRequest = newContentAssistRequest(nodeAtOffset, node, sdRegion, completionRegion, documentPosition, 0, matchString);</TD></TR><TR CLASS="z"><TD CLASS="l">1593</TD><TD>                        addTagInsertionProposals(contentAssistRequest, getElementPositionForModelQuery(nodeAtOffset));</TD></TR><TR CLASS="z"><TD CLASS="l">1594</TD><TD>                        if ((node.getNodeType() != Node.DOCUMENT_NODE) &amp;&amp; (node.getEndStructuredDocumentRegion() == null)) {</TD></TR><TR CLASS="z"><TD CLASS="l">1595</TD><TD>                                addEndTagProposals(contentAssistRequest);</TD></TR><TR><TD CLASS="l">1596</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1597</TD><TD>                }</TD></TR><TR><TD CLASS="l">1598</TD><TD>                else {</TD></TR><TR><TD CLASS="l">1599</TD><TD>                        // at the start of the tag's close or within it</TD></TR><TR CLASS="c"><TD CLASS="l">1600</TD><TD>                        ITextRegion closeRegion = sdRegion.getLastRegion();</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="88% line coverage (15 out of 17 instructions)">1601</TD><TD TITLE="88% line coverage (15 out of 17 instructions)">                        boolean insideTag = !sdRegion.isEnded() || (documentPosition &lt;= sdRegion.getStartOffset(closeRegion));</TD></TR><TR CLASS="c"><TD CLASS="l">1602</TD><TD>                        if (insideTag) {</TD></TR><TR><TD CLASS="l">1603</TD><TD>                                // this is a request for completions within a tag</TD></TR><TR CLASS="c"><TD CLASS="l">1604</TD><TD>                                contentAssistRequest = newContentAssistRequest(nodeAtOffset, node, sdRegion, completionRegion, documentPosition, 0, matchString);</TD></TR><TR CLASS="c"><TD CLASS="l">1605</TD><TD>                                if ((node.getNodeType() != Node.DOCUMENT_NODE) &amp;&amp; (node.getEndStructuredDocumentRegion() != null)) {</TD></TR><TR CLASS="c"><TD CLASS="l">1606</TD><TD>                                        addTagCloseProposals(contentAssistRequest);</TD></TR><TR><TD CLASS="l">1607</TD><TD>                                }</TD></TR><TR CLASS="c"><TD CLASS="l">1608</TD><TD>                                if (sdRegion == nodeAtOffset.getFirstStructuredDocumentRegion()) {</TD></TR><TR CLASS="c"><TD CLASS="l">1609</TD><TD>                                        contentAssistRequest.setReplacementBeginPosition(documentPosition);</TD></TR><TR CLASS="c"><TD CLASS="l">1610</TD><TD>                                        contentAssistRequest.setReplacementLength(0);</TD></TR><TR CLASS="c"><TD CLASS="l">1611</TD><TD>                                        addAttributeNameProposals(contentAssistRequest);</TD></TR><TR><TD CLASS="l">1612</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1613</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1614</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="11">1615</A></TD><TD>                return contentAssistRequest;</TD></TR><TR><TD CLASS="l">1616</TD><TD>        }</TD></TR><TR><TD CLASS="l">1617</TD><TD> </TD></TR><TR><TD CLASS="l">1618</TD><TD>        protected ContentAssistRequest computeTagNameProposals(int documentPosition, String matchString, ITextRegion completionRegion, IDOMNode nodeAtOffset, IDOMNode node) {</TD></TR><TR CLASS="z"><TD CLASS="l">1619</TD><TD>                ContentAssistRequest contentAssistRequest = null;</TD></TR><TR CLASS="z"><TD CLASS="l">1620</TD><TD>                IStructuredDocumentRegion sdRegion = getStructuredDocumentRegion(documentPosition);</TD></TR><TR><TD CLASS="l">1621</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1622</TD><TD>                if (sdRegion != nodeAtOffset.getFirstStructuredDocumentRegion()) {</TD></TR><TR><TD CLASS="l">1623</TD><TD>                        // completing the *first* tag in &#34;&lt;tagname1 |&lt;tagname2&#34;</TD></TR><TR CLASS="z"><TD CLASS="l">1624</TD><TD>                        IDOMNode actualNode = (IDOMNode) node.getModel().getIndexedRegion(sdRegion.getStartOffset(completionRegion));</TD></TR><TR CLASS="z"><TD CLASS="l">1625</TD><TD>                        if (actualNode != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1626</TD><TD>                                if (actualNode.getFirstStructuredDocumentRegion() == sdRegion) {</TD></TR><TR><TD CLASS="l">1627</TD><TD>                                        // start tag</TD></TR><TR CLASS="z"><TD CLASS="l">1628</TD><TD>                                        if (documentPosition &gt; sdRegion.getStartOffset(completionRegion) + completionRegion.getLength()) {</TD></TR><TR><TD CLASS="l">1629</TD><TD>                                                // it's attributes</TD></TR><TR CLASS="z"><TD CLASS="l">1630</TD><TD>                                                contentAssistRequest = newContentAssistRequest(actualNode, actualNode, sdRegion, completionRegion, documentPosition - matchString.length(), matchString.length(), matchString);</TD></TR><TR CLASS="z"><TD CLASS="l">1631</TD><TD>                                                if (node.getStructuredDocument().getRegionAtCharacterOffset(sdRegion.getStartOffset(completionRegion) - 1).getRegionAtCharacterOffset(sdRegion.getStartOffset(completionRegion) - 1).getType() == DOMRegionContext.XML_TAG_OPEN) {</TD></TR><TR CLASS="z"><TD CLASS="l">1632</TD><TD>                                                        addAttributeNameProposals(contentAssistRequest);</TD></TR><TR><TD CLASS="l">1633</TD><TD>                                                }</TD></TR><TR CLASS="z"><TD CLASS="l">1634</TD><TD>                                                addTagCloseProposals(contentAssistRequest);</TD></TR><TR><TD CLASS="l">1635</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">1636</TD><TD>                                        else {</TD></TR><TR><TD CLASS="l">1637</TD><TD>                                                // it's name</TD></TR><TR CLASS="z"><TD CLASS="l">1638</TD><TD>                                                contentAssistRequest = newContentAssistRequest(actualNode, actualNode.getParentNode(), sdRegion, completionRegion, documentPosition - matchString.length(), matchString.length(), matchString);</TD></TR><TR CLASS="z"><TD CLASS="l">1639</TD><TD>                                                addTagNameProposals(contentAssistRequest, getElementPositionForModelQuery(actualNode));</TD></TR><TR><TD CLASS="l">1640</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">1641</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1642</TD><TD>                                else {</TD></TR><TR CLASS="z"><TD CLASS="l">1643</TD><TD>                                        if (documentPosition &gt;= sdRegion.getStartOffset(completionRegion) + completionRegion.getLength()) {</TD></TR><TR><TD CLASS="l">1644</TD><TD>                                                // insert name</TD></TR><TR CLASS="z"><TD CLASS="l">1645</TD><TD>                                                contentAssistRequest = newContentAssistRequest(actualNode, actualNode.getParentNode(), sdRegion, completionRegion, documentPosition, 0, matchString);</TD></TR><TR><TD CLASS="l">1646</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">1647</TD><TD>                                        else {</TD></TR><TR><TD CLASS="l">1648</TD><TD>                                                // replace name</TD></TR><TR CLASS="z"><TD CLASS="l">1649</TD><TD>                                                contentAssistRequest = newContentAssistRequest(actualNode, actualNode.getParentNode(), sdRegion, completionRegion, sdRegion.getStartOffset(completionRegion), completionRegion.getTextLength(), matchString);</TD></TR><TR><TD CLASS="l">1650</TD><TD>                                        }</TD></TR><TR CLASS="z"><TD CLASS="l">1651</TD><TD>                                        addEndTagNameProposals(contentAssistRequest);</TD></TR><TR><TD CLASS="l">1652</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1653</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1654</TD><TD>                }</TD></TR><TR><TD CLASS="l">1655</TD><TD>                else {</TD></TR><TR CLASS="z"><TD CLASS="l">1656</TD><TD>                        if (documentPosition &gt; sdRegion.getStartOffset(completionRegion) + completionRegion.getTextLength()) {</TD></TR><TR><TD CLASS="l">1657</TD><TD>                                // unclosed tag with only a name; should prompt for attributes</TD></TR><TR><TD CLASS="l">1658</TD><TD>                                // and a close instead</TD></TR><TR CLASS="z"><TD CLASS="l">1659</TD><TD>                                contentAssistRequest = newContentAssistRequest(nodeAtOffset, node, sdRegion, completionRegion, documentPosition - matchString.length(), matchString.length(), matchString);</TD></TR><TR CLASS="z"><TD CLASS="l">1660</TD><TD>                                addAttributeNameProposals(contentAssistRequest);</TD></TR><TR CLASS="z"><TD CLASS="l">1661</TD><TD>                                addTagCloseProposals(contentAssistRequest);</TD></TR><TR><TD CLASS="l">1662</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1663</TD><TD>                        else {</TD></TR><TR CLASS="z"><TD CLASS="l">1664</TD><TD>                                if (sdRegion.getRegions().get(0).getType() != DOMRegionContext.XML_END_TAG_OPEN) {</TD></TR><TR CLASS="z"><TD CLASS="l">1665</TD><TD>                                        int replaceLength = documentPosition - sdRegion.getStartOffset(completionRegion);</TD></TR><TR CLASS="z"><TD CLASS="l">1666</TD><TD>                                        contentAssistRequest = newContentAssistRequest(node, node.getParentNode(), sdRegion, completionRegion, sdRegion.getStartOffset(completionRegion), replaceLength, matchString);</TD></TR><TR CLASS="z"><TD CLASS="l">1667</TD><TD>                                        addTagNameProposals(contentAssistRequest, getElementPositionForModelQuery(nodeAtOffset));</TD></TR><TR><TD CLASS="l">1668</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1669</TD><TD>                                else {</TD></TR><TR CLASS="z"><TD CLASS="l">1670</TD><TD>                                        IDOMNode actualNode = (IDOMNode) node.getModel().getIndexedRegion(documentPosition);</TD></TR><TR CLASS="z"><TD CLASS="l">1671</TD><TD>                                        if (actualNode != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1672</TD><TD>                                                if (documentPosition &gt;= sdRegion.getStartOffset(completionRegion) + completionRegion.getTextLength()) {</TD></TR><TR CLASS="z"><TD CLASS="l">1673</TD><TD>                                                        contentAssistRequest = newContentAssistRequest(actualNode, actualNode.getParentNode(), sdRegion, completionRegion, documentPosition, 0, matchString);</TD></TR><TR><TD CLASS="l">1674</TD><TD>                                                }</TD></TR><TR><TD CLASS="l">1675</TD><TD>                                                else {</TD></TR><TR CLASS="z"><TD CLASS="l">1676</TD><TD>                                                        contentAssistRequest = newContentAssistRequest(actualNode, actualNode.getParentNode(), sdRegion, completionRegion, sdRegion.getStartOffset(completionRegion), completionRegion.getTextLength(), matchString);</TD></TR><TR><TD CLASS="l">1677</TD><TD>                                                }</TD></TR><TR CLASS="z"><TD CLASS="l">1678</TD><TD>                                                addEndTagNameProposals(contentAssistRequest);</TD></TR><TR><TD CLASS="l">1679</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">1680</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1681</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1682</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="28">1683</A></TD><TD>                return contentAssistRequest;</TD></TR><TR><TD CLASS="l">1684</TD><TD>        }</TD></TR><TR><TD CLASS="l">1685</TD><TD> </TD></TR><TR><TD CLASS="l">1686</TD><TD>        protected ContentAssistRequest computeTagOpenProposals(int documentPosition, String matchString, ITextRegion completionRegion, IDOMNode nodeAtOffset, IDOMNode node) {</TD></TR><TR CLASS="c"><TD CLASS="l">1687</TD><TD>                ContentAssistRequest contentAssistRequest = null;</TD></TR><TR CLASS="c"><TD CLASS="l">1688</TD><TD>                IStructuredDocumentRegion sdRegion = getStructuredDocumentRegion(documentPosition);</TD></TR><TR CLASS="c"><TD CLASS="l">1689</TD><TD>                if (sdRegion != nodeAtOffset.getFirstStructuredDocumentRegion()) {</TD></TR><TR><TD CLASS="l">1690</TD><TD>                        // completing the *first* XML_TAG_OPEN in &#34;&lt;&lt;tagname&#34;</TD></TR><TR CLASS="c"><TD CLASS="l">1691</TD><TD>                        IDOMNode actualNode = (IDOMNode) node.getModel().getIndexedRegion(sdRegion.getStartOffset(completionRegion));</TD></TR><TR CLASS="c"><TD CLASS="l">1692</TD><TD>                        if (actualNode != null) {</TD></TR><TR CLASS="c"><TD CLASS="l">1693</TD><TD>                                contentAssistRequest = newContentAssistRequest(actualNode, actualNode.getParentNode(), sdRegion, completionRegion, documentPosition, 0, matchString);</TD></TR><TR CLASS="c"><TD CLASS="l">1694</TD><TD>                                addTagNameProposals(contentAssistRequest, getElementPositionForModelQuery(actualNode));</TD></TR><TR CLASS="c"><TD CLASS="l">1695</TD><TD>                                addEndTagProposals(contentAssistRequest); // (pa) 220850</TD></TR><TR><TD CLASS="l">1696</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1697</TD><TD>                }</TD></TR><TR><TD CLASS="l">1698</TD><TD>                else {</TD></TR><TR CLASS="z"><TD CLASS="l">1699</TD><TD>                        if (documentPosition == sdRegion.getStartOffset(completionRegion)) {</TD></TR><TR CLASS="z"><TD CLASS="l">1700</TD><TD>                                if (node.getNodeType() == Node.ELEMENT_NODE) {</TD></TR><TR><TD CLASS="l">1701</TD><TD>                                        // at the start of an existing tag, right before the '&lt;'</TD></TR><TR CLASS="z"><TD CLASS="l">1702</TD><TD>                                        contentAssistRequest = newContentAssistRequest(nodeAtOffset, node.getParentNode(), sdRegion, completionRegion, documentPosition, 0, matchString);</TD></TR><TR CLASS="z"><TD CLASS="l">1703</TD><TD>                                        addTagInsertionProposals(contentAssistRequest, getElementPositionForModelQuery(nodeAtOffset));</TD></TR><TR CLASS="z"><TD CLASS="l">1704</TD><TD>                                        addEndTagProposals(contentAssistRequest);</TD></TR><TR><TD CLASS="l">1705</TD><TD>                                }</TD></TR><TR CLASS="z"><TD CLASS="l">1706</TD><TD>                                else if (node.getNodeType() == Node.DOCUMENT_NODE) {</TD></TR><TR><TD CLASS="l">1707</TD><TD>                                        // at the opening of the VERY first tag with a '&lt;'</TD></TR><TR CLASS="z"><TD CLASS="l">1708</TD><TD>                                        contentAssistRequest = newContentAssistRequest(nodeAtOffset, node.getParentNode(), sdRegion, completionRegion, sdRegion.getStartOffset(completionRegion), completionRegion.getTextLength(), matchString);</TD></TR><TR CLASS="z"><TD CLASS="l">1709</TD><TD>                                        addStartDocumentProposals(contentAssistRequest);</TD></TR><TR><TD CLASS="l">1710</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1711</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1712</TD><TD>                        else {</TD></TR><TR><TD CLASS="l">1713</TD><TD>                                // within the white space</TD></TR><TR CLASS="z"><TD CLASS="l">1714</TD><TD>                                ITextRegion name = getNameRegion(node.getStartStructuredDocumentRegion());</TD></TR><TR><TD CLASS="l">1715</TD><TD>                                // (pa) ITextRegion refactor</TD></TR><TR><TD CLASS="l">1716</TD><TD>                                // if (name != null &amp;&amp; name.containsOffset(documentPosition))</TD></TR><TR><TD CLASS="l">1717</TD><TD>                                // {</TD></TR><TR CLASS="z"><TD CLASS="l">1718</TD><TD>                                if ((name != null) &amp;&amp; ((sdRegion.getStartOffset(name) &lt;= documentPosition) &amp;&amp; (sdRegion.getEndOffset(name) &gt;= documentPosition))) {</TD></TR><TR><TD CLASS="l">1719</TD><TD>                                        // replace the existing name</TD></TR><TR CLASS="z"><TD CLASS="l">1720</TD><TD>                                        contentAssistRequest = newContentAssistRequest(node, node.getParentNode(), sdRegion, completionRegion, sdRegion.getStartOffset(name), name.getTextLength(), matchString);</TD></TR><TR><TD CLASS="l">1721</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1722</TD><TD>                                else {</TD></TR><TR><TD CLASS="l">1723</TD><TD>                                        // insert a valid new name, or possibly an end tag</TD></TR><TR CLASS="z"><TD CLASS="l">1724</TD><TD>                                        contentAssistRequest = newContentAssistRequest(nodeAtOffset, ((Node) nodeAtOffset).getParentNode(), sdRegion, completionRegion, documentPosition, 0, matchString);</TD></TR><TR CLASS="z"><TD CLASS="l">1725</TD><TD>                                        addEndTagProposals(contentAssistRequest);</TD></TR><TR CLASS="z"><TD CLASS="l">1726</TD><TD>                                        contentAssistRequest.setReplacementBeginPosition(documentPosition);</TD></TR><TR CLASS="z"><TD CLASS="l">1727</TD><TD>                                        contentAssistRequest.setReplacementLength(0);</TD></TR><TR><TD CLASS="l">1728</TD><TD>                                }</TD></TR><TR CLASS="z"><TD CLASS="l">1729</TD><TD>                                addTagNameProposals(contentAssistRequest, getElementPositionForModelQuery(nodeAtOffset));</TD></TR><TR><TD CLASS="l">1730</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1731</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">1732</TD><TD>                return contentAssistRequest;</TD></TR><TR><TD CLASS="l">1733</TD><TD>        }</TD></TR><TR><TD CLASS="l">1734</TD><TD> </TD></TR><TR><TD CLASS="l">1735</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1736</TD><TD>         * Retreives cmnode's documentation to display in the completion</TD></TR><TR><TD CLASS="l">1737</TD><TD>         * proposal's additional info. If no documentation exists for cmnode, try</TD></TR><TR><TD CLASS="l">1738</TD><TD>         * displaying parentOrOwner's documentation</TD></TR><TR><TD CLASS="l">1739</TD><TD>         * </TD></TR><TR><TD CLASS="l"><A NAME="30">1740</A></TD><TD>         * String any documentation information to display for cmnode.</TD></TR><TR><TD CLASS="l">1741</TD><TD>         * &lt;code&gt;null&lt;/code&gt; if there is nothing to display.</TD></TR><TR><TD CLASS="l">1742</TD><TD>         */</TD></TR><TR><TD CLASS="l">1743</TD><TD>        protected String getAdditionalInfo(CMNode parentOrOwner, CMNode cmnode) {</TD></TR><TR CLASS="c"><TD CLASS="l">1744</TD><TD>                String addlInfo = null;</TD></TR><TR><TD CLASS="l">1745</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1746</TD><TD>                if (cmnode == null) {</TD></TR><TR><TD CLASS="l">1747</TD><TD>                        if (Debug.displayWarnings) {</TD></TR><TR><TD CLASS="l">1748</TD><TD>                                new IllegalArgumentException(&#34;Null declaration!&#34;).printStackTrace(); //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">1749</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">1750</TD><TD>                        return null;</TD></TR><TR><TD CLASS="l">1751</TD><TD>                }</TD></TR><TR><TD CLASS="l">1752</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1753</TD><TD>                addlInfo = getInfoProvider().getInfo(cmnode);</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="78% line coverage (7 out of 9 instructions)">1754</TD><TD TITLE="78% line coverage (7 out of 9 instructions)">                if ((addlInfo == null) &amp;&amp; (parentOrOwner != null)) {</TD></TR><TR CLASS="z"><TD CLASS="l">1755</TD><TD>                        addlInfo = getInfoProvider().getInfo(parentOrOwner);</TD></TR><TR><TD CLASS="l">1756</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">1757</TD><TD>                return addlInfo;</TD></TR><TR><TD CLASS="l"><A NAME="3f">1758</A></TD><TD>        }</TD></TR><TR><TD CLASS="l">1759</TD><TD> </TD></TR><TR><TD CLASS="l">1760</TD><TD>        // returns a list of ModelQueryActions</TD></TR><TR><TD CLASS="l">1761</TD><TD>        protected List getAvailableChildrenAtIndex(Element parent, int index, int validityChecking) {</TD></TR><TR CLASS="c"><TD CLASS="l">1762</TD><TD>                List list = new ArrayList();</TD></TR><TR CLASS="c"><TD CLASS="l">1763</TD><TD>                CMElementDeclaration parentDecl = getCMElementDeclaration(parent);</TD></TR><TR CLASS="c"><TD CLASS="l">1764</TD><TD>                if (parentDecl != null) {</TD></TR><TR CLASS="c"><TD CLASS="l">1765</TD><TD>                        ModelQuery modelQuery = ModelQueryUtil.getModelQuery(parent.getOwnerDocument());</TD></TR><TR><TD CLASS="l">1766</TD><TD>                        // taken from ActionManagers</TD></TR><TR><TD CLASS="l">1767</TD><TD>                        // int editMode = modelQuery.getEditMode();</TD></TR><TR CLASS="c"><TD CLASS="l">1768</TD><TD>                        int editMode = ModelQuery.EDIT_MODE_UNCONSTRAINED;</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="90% line coverage (19 out of 21 instructions)">1769</TD><TD TITLE="90% line coverage (19 out of 21 instructions)">                        int ic = (editMode == ModelQuery.EDIT_MODE_CONSTRAINED_STRICT) ? ModelQuery.INCLUDE_CHILD_NODES | ModelQuery.INCLUDE_SEQUENCE_GROUPS : ModelQuery.INCLUDE_CHILD_NODES;</TD></TR><TR CLASS="c"><TD CLASS="l">1770</TD><TD>                        modelQuery.getInsertActions(parent, parentDecl, index, ic, validityChecking, list);</TD></TR><TR><TD CLASS="l">1771</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">1772</TD><TD>                return list;</TD></TR><TR><TD CLASS="l"><A NAME="12">1773</A></TD><TD>        }</TD></TR><TR><TD CLASS="l">1774</TD><TD> </TD></TR><TR><TD CLASS="l">1775</TD><TD>        // returns a list of CMElementDeclarations</TD></TR><TR><TD CLASS="l">1776</TD><TD>        protected List getAvailableRootChildren(Document document, int childIndex) {</TD></TR><TR CLASS="z"><TD CLASS="l">1777</TD><TD>                List list = null;</TD></TR><TR><TD CLASS="l">1778</TD><TD> </TD></TR><TR><TD CLASS="l">1779</TD><TD>                // extract the valid 'root' node name from the DocumentType Node</TD></TR><TR CLASS="z"><TD CLASS="l">1780</TD><TD>                DocumentType docType = document.getDoctype();</TD></TR><TR CLASS="z"><TD CLASS="l">1781</TD><TD>                String rootName = null;</TD></TR><TR CLASS="z"><TD CLASS="l">1782</TD><TD>                if (docType != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1783</TD><TD>                        rootName = docType.getNodeName();</TD></TR><TR><TD CLASS="l">1784</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1785</TD><TD>                if (rootName == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1786</TD><TD>                        return new ArrayList(0);</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>                for (Node child = document.getFirstChild(); child != null; child = child.getNextSibling()) {</TD></TR><TR><TD CLASS="l">1790</TD><TD>                        // make sure the &#34;root&#34; Element isn't already present</TD></TR><TR><TD CLASS="l">1791</TD><TD>                        // is it required to be an Element?</TD></TR><TR CLASS="z"><TD CLASS="l">1792</TD><TD>                        if ((child.getNodeType() == Node.ELEMENT_NODE) &amp;&amp; stringsEqual(child.getNodeName(), rootName)) {</TD></TR><TR><TD CLASS="l">1793</TD><TD>                                // if the node is missing either the start or end tag, don't</TD></TR><TR><TD CLASS="l">1794</TD><TD>                                // count it as present</TD></TR><TR CLASS="z"><TD CLASS="l">1795</TD><TD>                                if ((child instanceof IDOMNode) &amp;&amp; ((((IDOMNode) child).getStartStructuredDocumentRegion() == null) || (((IDOMNode) child).getEndStructuredDocumentRegion() == null))) {</TD></TR><TR CLASS="z"><TD CLASS="l">1796</TD><TD>                                        continue;</TD></TR><TR><TD CLASS="l">1797</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1798</TD><TD>                                if (Debug.displayInfo) {</TD></TR><TR><TD CLASS="l">1799</TD><TD>                                        System.out.println(rootName + &#34; already present!&#34;); //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">1800</TD><TD>                                }</TD></TR><TR CLASS="z"><TD CLASS="l">1801</TD><TD>                                setErrorMessage(NLS.bind(XMLUIMessages.The_document_element__, (new Object[]{rootName})));</TD></TR><TR CLASS="z"><TD CLASS="l">1802</TD><TD>                                return new ArrayList(0);</TD></TR><TR><TD CLASS="l">1803</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1804</TD><TD>                }</TD></TR><TR><TD CLASS="l">1805</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1806</TD><TD>                list = new ArrayList(1);</TD></TR><TR CLASS="z"><TD CLASS="l">1807</TD><TD>                ModelQuery modelQuery = ModelQueryUtil.getModelQuery(document);</TD></TR><TR CLASS="z"><TD CLASS="l">1808</TD><TD>                if (modelQuery != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1809</TD><TD>                        CMDocument cmdoc = modelQuery.getCorrespondingCMDocument(document);</TD></TR><TR CLASS="z"><TD CLASS="l">1810</TD><TD>                        if (cmdoc != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1811</TD><TD>                                if (rootName != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1812</TD><TD>                                        CMElementDeclaration rootDecl = (CMElementDeclaration) cmdoc.getElements().getNamedItem(rootName);</TD></TR><TR CLASS="z"><TD CLASS="l">1813</TD><TD>                                        if (rootDecl != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1814</TD><TD>                                                list.add(rootDecl);</TD></TR><TR><TD CLASS="l">1815</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">1816</TD><TD>                                        else {</TD></TR><TR><TD CLASS="l">1817</TD><TD>                                                // supply the given document name anyway, even if it</TD></TR><TR><TD CLASS="l">1818</TD><TD>                                                // is an error</TD></TR><TR CLASS="z"><TD CLASS="l">1819</TD><TD>                                                list.add(new SimpleCMElementDeclaration(rootName));</TD></TR><TR><TD CLASS="l">1820</TD><TD>                                                if (Debug.displayInfo || Debug.displayWarnings) {</TD></TR><TR><TD CLASS="l">1821</TD><TD>                                                        System.out.println(&#34;No definition found for &#34; + rootName + &#34; in &#34; + docType.getPublicId() + &#34;/&#34; + docType.getSystemId()); //$NON-NLS-3$//$NON-NLS-2$//$NON-NLS-1$</TD></TR><TR><TD CLASS="l">1822</TD><TD>                                                }</TD></TR><TR CLASS="z"><TD CLASS="l">1823</TD><TD>                                                String location = &#34;&#34; + (docType.getPublicId() != null ? docType.getPublicId() + &#34;/&#34; : &#34;&#34;) + (docType.getSystemId() != null ? docType.getSystemId() : &#34;&#34;); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$</TD></TR><TR><TD CLASS="l">1824</TD><TD>                                                //$NON-NLS-4$//$NON-NLS-3$//$NON-NLS-2$//$NON-NLS-1$</TD></TR><TR><TD CLASS="l">1825</TD><TD>                                                //$NON-NLS-4$//$NON-NLS-3$//$NON-NLS-2$//$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">1826</TD><TD>                                                if (location.length() &gt; 0) {</TD></TR><TR CLASS="z"><TD CLASS="l">1827</TD><TD>                                                        setErrorMessage(NLS.bind(XMLUIMessages.No_definition_for_in, (new Object[]{rootName, location})));</TD></TR><TR><TD CLASS="l">1828</TD><TD>                                                }</TD></TR><TR><TD CLASS="l">1829</TD><TD>                                                else {</TD></TR><TR CLASS="z"><TD CLASS="l">1830</TD><TD>                                                        setErrorMessage(NLS.bind(XMLUIMessages.No_definition_for, (new Object[]{rootName})));</TD></TR><TR><TD CLASS="l">1831</TD><TD>                                                }</TD></TR><TR><TD CLASS="l">1832</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">1833</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1834</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1835</TD><TD>                        else {</TD></TR><TR><TD CLASS="l">1836</TD><TD>                                if (Debug.displayInfo || Debug.displayWarnings) {</TD></TR><TR><TD CLASS="l">1837</TD><TD>                                        System.out.println(&#34;No content model found.&#34;); //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">1838</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1839</TD><TD>                                //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">1840</TD><TD>                                //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">1841</TD><TD>                                String location = &#34;&#34; + (docType.getPublicId() != null ? docType.getPublicId() + &#34;/&#34; : &#34;&#34;) + (docType.getSystemId() != null ? docType.getSystemId() : &#34;&#34;); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$</TD></TR><TR><TD CLASS="l">1842</TD><TD>                                //$NON-NLS-4$//$NON-NLS-3$//$NON-NLS-2$//$NON-NLS-1$</TD></TR><TR><TD CLASS="l">1843</TD><TD>                                //$NON-NLS-4$//$NON-NLS-3$//$NON-NLS-2$//$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">1844</TD><TD>                                if (location.length() &gt; 0) {</TD></TR><TR CLASS="z"><TD CLASS="l">1845</TD><TD>                                        setErrorMessage(NLS.bind(XMLUIMessages.No_content_model_for, (new Object[]{location})));</TD></TR><TR><TD CLASS="l">1846</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1847</TD><TD>                                else {</TD></TR><TR CLASS="z"><TD CLASS="l">1848</TD><TD>                                        setErrorMessage(XMLUIMessages.No_content_model_found_UI_);</TD></TR><TR><TD CLASS="l">1849</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1850</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1851</TD><TD>                }</TD></TR><TR><TD CLASS="l">1852</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="45">1853</A></TD><TD>                return list;</TD></TR><TR><TD CLASS="l">1854</TD><TD>        }</TD></TR><TR><TD CLASS="l">1855</TD><TD> </TD></TR><TR><TD CLASS="l">1856</TD><TD>        protected CMElementDeclaration getCMElementDeclaration(Node node) {</TD></TR><TR CLASS="c"><TD CLASS="l">1857</TD><TD>                CMElementDeclaration result = null;</TD></TR><TR CLASS="c"><TD CLASS="l">1858</TD><TD>                if (node.getNodeType() == Node.ELEMENT_NODE) {</TD></TR><TR CLASS="c"><TD CLASS="l">1859</TD><TD>                        ModelQuery modelQuery = ModelQueryUtil.getModelQuery(node.getOwnerDocument());</TD></TR><TR CLASS="c"><TD CLASS="l">1860</TD><TD>                        if (modelQuery != null) {</TD></TR><TR CLASS="c"><TD CLASS="l">1861</TD><TD>                                result = modelQuery.getCMElementDeclaration((Element) node);</TD></TR><TR><TD CLASS="l">1862</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1863</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">1864</TD><TD>                return result;</TD></TR><TR><TD CLASS="l">1865</TD><TD>        }</TD></TR><TR><TD CLASS="l">1866</TD><TD> </TD></TR><TR><TD CLASS="l">1867</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1868</TD><TD>         * Returns the characters which when entered by the user should</TD></TR><TR><TD CLASS="l">1869</TD><TD>         * automatically trigger the presentation of possible completions.</TD></TR><TR><TD CLASS="l">1870</TD><TD>         * </TD></TR><TR><TD CLASS="l"><A NAME="13">1871</A></TD><TD>         * the auto activation characters for completion proposal or</TD></TR><TR><TD CLASS="l">1872</TD><TD>         * &lt;code&gt;null&lt;/code&gt; if no auto activation is desired</TD></TR><TR><TD CLASS="l">1873</TD><TD>         */</TD></TR><TR><TD CLASS="l">1874</TD><TD>        public char[] getCompletionProposalAutoActivationCharacters() {</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="2c">1875</A></TD><TD>                return completionProposalAutoActivationCharacters;</TD></TR><TR><TD CLASS="l">1876</TD><TD>        }</TD></TR><TR><TD CLASS="l">1877</TD><TD> </TD></TR><TR><TD CLASS="l">1878</TD><TD>        protected ITextRegion getCompletionRegion(int offset, IStructuredDocumentRegion sdRegion) {</TD></TR><TR CLASS="c"><TD CLASS="l">1879</TD><TD>                ITextRegion region = sdRegion.getRegionAtCharacterOffset(offset);</TD></TR><TR CLASS="c"><TD CLASS="l">1880</TD><TD>                if (region == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1881</TD><TD>                        return null;</TD></TR><TR><TD CLASS="l">1882</TD><TD>                }</TD></TR><TR><TD CLASS="l">1883</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1884</TD><TD>                if (sdRegion.getStartOffset(region) == offset) {</TD></TR><TR><TD CLASS="l">1885</TD><TD>                        // The offset is at the beginning of the region</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="46% line coverage (6 out of 13 instructions)">1886</TD><TD TITLE="46% line coverage (6 out of 13 instructions)">                        if ((sdRegion.getStartOffset(region) == sdRegion.getStartOffset()) &amp;&amp; (sdRegion.getPrevious() != null) &amp;&amp; (!sdRegion.getPrevious().isEnded())) {</TD></TR><TR><TD CLASS="l">1887</TD><TD>                                // Is the region also the start of the node? If so, the</TD></TR><TR><TD CLASS="l">1888</TD><TD>                                // previous IStructuredDocumentRegion is</TD></TR><TR><TD CLASS="l">1889</TD><TD>                                // where to look for a useful region.</TD></TR><TR CLASS="z"><TD CLASS="l">1890</TD><TD>                                region = sdRegion.getPrevious().getRegionAtCharacterOffset(offset - 1);</TD></TR><TR><TD CLASS="l">1891</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1892</TD><TD>                        else {</TD></TR><TR><TD CLASS="l">1893</TD><TD>                                // Is there no separating whitespace from the previous region?</TD></TR><TR><TD CLASS="l">1894</TD><TD>                                // If not,</TD></TR><TR><TD CLASS="l">1895</TD><TD>                                // then that region is the important one</TD></TR><TR CLASS="c"><TD CLASS="l">1896</TD><TD>                                ITextRegion previousRegion = sdRegion.getRegionAtCharacterOffset(offset - 1);</TD></TR><TR CLASS="c"><TD CLASS="l">1897</TD><TD>                                if ((previousRegion != null) &amp;&amp; (previousRegion != region) &amp;&amp; (previousRegion.getTextLength() == previousRegion.getLength())) {</TD></TR><TR CLASS="z"><TD CLASS="l">1898</TD><TD>                                        region = previousRegion;</TD></TR><TR><TD CLASS="l">1899</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1900</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1901</TD><TD>                }</TD></TR><TR><TD CLASS="l">1902</TD><TD>                else {</TD></TR><TR><TD CLASS="l">1903</TD><TD>                        // The offset is NOT at the beginning of the region</TD></TR><TR CLASS="c"><TD CLASS="l">1904</TD><TD>                        if (offset &gt; sdRegion.getStartOffset(region) + region.getTextLength()) {</TD></TR><TR><TD CLASS="l">1905</TD><TD>                                // Is the offset within the whitespace after the text in this</TD></TR><TR><TD CLASS="l">1906</TD><TD>                                // region?</TD></TR><TR><TD CLASS="l">1907</TD><TD>                                // If so, use the next region</TD></TR><TR CLASS="z"><TD CLASS="l">1908</TD><TD>                                ITextRegion nextRegion = sdRegion.getRegionAtCharacterOffset(sdRegion.getStartOffset(region) + region.getLength());</TD></TR><TR CLASS="z"><TD CLASS="l">1909</TD><TD>                                if (nextRegion != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1910</TD><TD>                                        region = nextRegion;</TD></TR><TR><TD CLASS="l">1911</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1912</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1913</TD><TD>                        else {</TD></TR><TR><TD CLASS="l">1914</TD><TD>                                // Is the offset within the important text for this region?</TD></TR><TR><TD CLASS="l">1915</TD><TD>                                // If so, then we've already got the right one.</TD></TR><TR><TD CLASS="l">1916</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1917</TD><TD>                }</TD></TR><TR><TD CLASS="l">1918</TD><TD> </TD></TR><TR><TD CLASS="l">1919</TD><TD>                // valid WHITE_SPACE region handler (#179924)</TD></TR><TR CLASS="c"><TD CLASS="l">1920</TD><TD>                if ((region != null) &amp;&amp; (region.getType() == DOMRegionContext.WHITE_SPACE)) {</TD></TR><TR CLASS="z"><TD CLASS="l">1921</TD><TD>                        ITextRegion previousRegion = sdRegion.getRegionAtCharacterOffset(sdRegion.getStartOffset(region) - 1);</TD></TR><TR CLASS="z"><TD CLASS="l">1922</TD><TD>                        if (previousRegion != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1923</TD><TD>                                region = previousRegion;</TD></TR><TR><TD CLASS="l">1924</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1925</TD><TD>                }</TD></TR><TR><TD CLASS="l">1926</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1927</TD><TD>                return region;</TD></TR><TR><TD CLASS="l">1928</TD><TD>        }</TD></TR><TR><TD CLASS="l">1929</TD><TD> </TD></TR><TR><TD CLASS="l">1930</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1931</TD><TD>         * Return the region whose content's require completion. This is something</TD></TR><TR><TD CLASS="l">1932</TD><TD>         * of a misnomer as sometimes the user wants to be prompted for contents</TD></TR><TR><TD CLASS="l"><A NAME="34">1933</A></TD><TD>         * of a non-existant ITextRegion, such as for enumerated attribute values</TD></TR><TR><TD CLASS="l">1934</TD><TD>         * following an '=' sign.</TD></TR><TR><TD CLASS="l">1935</TD><TD>         */</TD></TR><TR><TD CLASS="l">1936</TD><TD>        protected ITextRegion getCompletionRegion(int documentPosition, Node domnode) {</TD></TR><TR CLASS="c"><TD CLASS="l">1937</TD><TD>                if (domnode == null) {</TD></TR><TR CLASS="c"><TD CLASS="l">1938</TD><TD>                        return null;</TD></TR><TR><TD CLASS="l">1939</TD><TD>                }</TD></TR><TR><TD CLASS="l">1940</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1941</TD><TD>                ITextRegion region = null;</TD></TR><TR CLASS="c"><TD CLASS="l">1942</TD><TD>                int offset = documentPosition;</TD></TR><TR CLASS="c"><TD CLASS="l">1943</TD><TD>                IStructuredDocumentRegion flatNode = null;</TD></TR><TR CLASS="c"><TD CLASS="l">1944</TD><TD>                IDOMNode node = (IDOMNode) domnode;</TD></TR><TR><TD CLASS="l">1945</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1946</TD><TD>                if (node.getNodeType() == Node.DOCUMENT_NODE) {</TD></TR><TR CLASS="z"><TD CLASS="l">1947</TD><TD>                        if (node.getStructuredDocument().getLength() == 0) {</TD></TR><TR CLASS="z"><TD CLASS="l">1948</TD><TD>                                return null;</TD></TR><TR><TD CLASS="l">1949</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">1950</TD><TD>                        ITextRegion result = node.getStructuredDocument().getRegionAtCharacterOffset(offset).getRegionAtCharacterOffset(offset);</TD></TR><TR CLASS="z"><TD CLASS="l">1951</TD><TD>                        while (result == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1952</TD><TD>                                offset--;</TD></TR><TR CLASS="z"><TD CLASS="l">1953</TD><TD>                                result = node.getStructuredDocument().getRegionAtCharacterOffset(offset).getRegionAtCharacterOffset(offset);</TD></TR><TR><TD CLASS="l">1954</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">1955</TD><TD>                        return result;</TD></TR><TR><TD CLASS="l">1956</TD><TD>                }</TD></TR><TR><TD CLASS="l">1957</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1958</TD><TD>                IStructuredDocumentRegion startTag = node.getStartStructuredDocumentRegion();</TD></TR><TR CLASS="c"><TD CLASS="l">1959</TD><TD>                IStructuredDocumentRegion endTag = node.getEndStructuredDocumentRegion();</TD></TR><TR><TD CLASS="l">1960</TD><TD> </TD></TR><TR><TD CLASS="l">1961</TD><TD>                // Determine if the offset is within the start</TD></TR><TR><TD CLASS="l">1962</TD><TD>                // IStructuredDocumentRegion, end IStructuredDocumentRegion, or</TD></TR><TR><TD CLASS="l">1963</TD><TD>                // somewhere within the Node's XML content.</TD></TR><TR CLASS="c"><TD CLASS="l">1964</TD><TD>                if ((startTag != null) &amp;&amp; (startTag.getStartOffset() &lt;= offset) &amp;&amp; (offset &lt; startTag.getStartOffset() + startTag.getLength())) {</TD></TR><TR CLASS="c"><TD CLASS="l">1965</TD><TD>                        flatNode = startTag;</TD></TR><TR><TD CLASS="l">1966</TD><TD>                }</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="46% line coverage (6 out of 13 instructions)">1967</TD><TD TITLE="46% line coverage (6 out of 13 instructions)">                else if ((endTag != null) &amp;&amp; (endTag.getStartOffset() &lt;= offset) &amp;&amp; (offset &lt; endTag.getStartOffset() + endTag.getLength())) {</TD></TR><TR CLASS="z"><TD CLASS="l">1968</TD><TD>                        flatNode = endTag;</TD></TR><TR><TD CLASS="l">1969</TD><TD>                }</TD></TR><TR><TD CLASS="l">1970</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1971</TD><TD>                if (flatNode != null) {</TD></TR><TR><TD CLASS="l">1972</TD><TD>                        // the offset is definitely within the start or end tag, continue</TD></TR><TR><TD CLASS="l">1973</TD><TD>                        // on and find the region</TD></TR><TR CLASS="c"><TD CLASS="l">1974</TD><TD>                        region = getCompletionRegion(offset, flatNode);</TD></TR><TR><TD CLASS="l">1975</TD><TD>                }</TD></TR><TR><TD CLASS="l">1976</TD><TD>                else {</TD></TR><TR><TD CLASS="l">1977</TD><TD>                        // the docPosition is neither within the start nor the end, so it</TD></TR><TR><TD CLASS="l">1978</TD><TD>                        // must be content</TD></TR><TR CLASS="c"><TD CLASS="l">1979</TD><TD>                        flatNode = node.getStructuredDocument().getRegionAtCharacterOffset(offset);</TD></TR><TR><TD CLASS="l">1980</TD><TD>                        // (pa) ITextRegion refactor</TD></TR><TR><TD CLASS="l">1981</TD><TD>                        // if (flatNode.contains(documentPosition)) {</TD></TR><TR CLASS="c"><TD CLASS="l">1982</TD><TD>                        if ((flatNode.getStartOffset() &lt;= documentPosition) &amp;&amp; (flatNode.getEndOffset() &gt;= documentPosition)) {</TD></TR><TR><TD CLASS="l">1983</TD><TD>                                // we're interesting in completing/extending the previous</TD></TR><TR><TD CLASS="l">1984</TD><TD>                                // IStructuredDocumentRegion if the current</TD></TR><TR><TD CLASS="l">1985</TD><TD>                                // IStructuredDocumentRegion isn't plain content or if it's</TD></TR><TR><TD CLASS="l">1986</TD><TD>                                // preceded by an orphan '&lt;'</TD></TR><TR CLASS="c"><TD CLASS="l">1987</TD><TD>                                if ((offset == flatNode.getStartOffset()) &amp;&amp; (flatNode.getPrevious() != null) &amp;&amp; (((flatNode.getRegionAtCharacterOffset(documentPosition) != null) &amp;&amp; (flatNode.getRegionAtCharacterOffset(documentPosition).getType() != DOMRegionContext.XML_CONTENT)) || (flatNode.getPrevious().getLastRegion().getType() == DOMRegionContext.XML_TAG_OPEN) || (flatNode.getPrevious().getLastRegion().getType() == DOMRegionContext.XML_END_TAG_OPEN))) {</TD></TR><TR><TD CLASS="l">1988</TD><TD>                                        // Is the region also the start of the node? If so, the</TD></TR><TR><TD CLASS="l">1989</TD><TD>                                        // previous IStructuredDocumentRegion is</TD></TR><TR><TD CLASS="l">1990</TD><TD>                                        // where to look for a useful region.</TD></TR><TR CLASS="c"><TD CLASS="l">1991</TD><TD>                                        region = flatNode.getPrevious().getLastRegion();</TD></TR><TR><TD CLASS="l">1992</TD><TD>                                }</TD></TR><TR CLASS="c"><TD CLASS="l">1993</TD><TD>                                else if (flatNode.getEndOffset() == documentPosition) {</TD></TR><TR CLASS="z"><TD CLASS="l">1994</TD><TD>                                        region = flatNode.getLastRegion();</TD></TR><TR><TD CLASS="l">1995</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1996</TD><TD>                                else {</TD></TR><TR CLASS="c"><TD CLASS="l">1997</TD><TD>                                        region = flatNode.getFirstRegion();</TD></TR><TR><TD CLASS="l">1998</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1999</TD><TD>                        }</TD></TR><TR><TD CLASS="l">2000</TD><TD>                        else {</TD></TR><TR><TD CLASS="l">2001</TD><TD>                                // catch end of document positions where the docPosition isn't</TD></TR><TR><TD CLASS="l">2002</TD><TD>                                // in a IStructuredDocumentRegion</TD></TR><TR CLASS="z"><TD CLASS="l">2003</TD><TD>                                region = flatNode.getLastRegion();</TD></TR><TR><TD CLASS="l">2004</TD><TD>                        }</TD></TR><TR><TD CLASS="l">2005</TD><TD>                }</TD></TR><TR><TD CLASS="l">2006</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">2007</TD><TD>                return region;</TD></TR><TR><TD CLASS="l">2008</TD><TD>        }</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>         * Provided by default. Subclasses may override with their own</TD></TR><TR><TD CLASS="l">2012</TD><TD>         * implementations.</TD></TR><TR><TD CLASS="l"><A NAME="46">2013</A></TD><TD>         * </TD></TR><TR><TD CLASS="l">2014</TD><TD>         * @see AbstractContentAssistProcessor#getContentGenerator()</TD></TR><TR><TD CLASS="l">2015</TD><TD>         */</TD></TR><TR><TD CLASS="l">2016</TD><TD>        public XMLContentModelGenerator getContentGenerator() {</TD></TR><TR CLASS="c"><TD CLASS="l">2017</TD><TD>                if (fGenerator == null) {</TD></TR><TR CLASS="c"><TD CLASS="l">2018</TD><TD>                        fGenerator = new XMLContentModelGenerator();</TD></TR><TR><TD CLASS="l">2019</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">2020</TD><TD>                return fGenerator;</TD></TR><TR><TD CLASS="l">2021</TD><TD>        }</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>         * Returns the characters which when entered by the user should</TD></TR><TR><TD CLASS="l">2025</TD><TD>         * automatically trigger the presentation of context information.</TD></TR><TR><TD CLASS="l">2026</TD><TD>         * </TD></TR><TR><TD CLASS="l"><A NAME="14">2027</A></TD><TD>         * the auto activation characters for presenting context information or</TD></TR><TR><TD CLASS="l">2028</TD><TD>         * &lt;code&gt;null&lt;/code&gt; if no auto activation is desired</TD></TR><TR><TD CLASS="l">2029</TD><TD>         */</TD></TR><TR><TD CLASS="l">2030</TD><TD>        public char[] getContextInformationAutoActivationCharacters() {</TD></TR><TR CLASS="z"><TD CLASS="l">2031</TD><TD>                return contextInformationAutoActivationCharacters;</TD></TR><TR><TD CLASS="l">2032</TD><TD>        }</TD></TR><TR><TD CLASS="l">2033</TD><TD> </TD></TR><TR><TD CLASS="l">2034</TD><TD>        /**</TD></TR><TR><TD CLASS="l">2035</TD><TD>         * Returns a validator used to determine when displayed context</TD></TR><TR><TD CLASS="l">2036</TD><TD>         * information should be dismissed. May only return &lt;code&gt;null&lt;/code&gt; if</TD></TR><TR><TD CLASS="l">2037</TD><TD>         * the processor is incapable of computing context information.</TD></TR><TR><TD CLASS="l">2038</TD><TD>         * </TD></TR><TR><TD CLASS="l"><A NAME="15">2039</A></TD><TD>         * a context information validator, or &lt;code&gt;null&lt;/code&gt; if the</TD></TR><TR><TD CLASS="l">2040</TD><TD>         * processor is incapable of computing context information</TD></TR><TR><TD CLASS="l">2041</TD><TD>         */</TD></TR><TR><TD CLASS="l">2042</TD><TD>        public IContextInformationValidator getContextInformationValidator() {</TD></TR><TR CLASS="z"><TD CLASS="l">2043</TD><TD>                if (fContextInformationPresenter == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">2044</TD><TD>                        fContextInformationPresenter = new AttributeContextInformationPresenter();</TD></TR><TR><TD CLASS="l">2045</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="38">2046</A></TD><TD>                return fContextInformationPresenter;</TD></TR><TR><TD CLASS="l">2047</TD><TD>        }</TD></TR><TR><TD CLASS="l">2048</TD><TD> </TD></TR><TR><TD CLASS="l">2049</TD><TD>        protected int getElementPosition(Node child) {</TD></TR><TR CLASS="c"><TD CLASS="l">2050</TD><TD>                Node parent = child.getParentNode();</TD></TR><TR CLASS="c"><TD CLASS="l">2051</TD><TD>                if (parent == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">2052</TD><TD>                        return 0;</TD></TR><TR><TD CLASS="l">2053</TD><TD>                }</TD></TR><TR><TD CLASS="l">2054</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">2055</TD><TD>                NodeList children = parent.getChildNodes();</TD></TR><TR CLASS="c"><TD CLASS="l">2056</TD><TD>                if (children == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">2057</TD><TD>                        return 0;</TD></TR><TR><TD CLASS="l">2058</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">2059</TD><TD>                int count = 0;</TD></TR><TR><TD CLASS="l">2060</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">2061</TD><TD>                for (int i = 0; i &lt; children.getLength(); i++) {</TD></TR><TR CLASS="c"><TD CLASS="l">2062</TD><TD>                        if (children.item(i) == child) {</TD></TR><TR CLASS="c"><TD CLASS="l">2063</TD><TD>                                return count;</TD></TR><TR><TD CLASS="l">2064</TD><TD>                        }</TD></TR><TR><TD CLASS="l">2065</TD><TD>                        else {</TD></TR><TR><TD CLASS="l">2066</TD><TD>                                // if (children.item(i).getNodeType() == Node.ELEMENT_NODE)</TD></TR><TR CLASS="c"><TD CLASS="l">2067</TD><TD>                                count++;</TD></TR><TR><TD CLASS="l">2068</TD><TD>                        }</TD></TR><TR><TD CLASS="l">2069</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="47">2070</A></TD><TD>                return 0;</TD></TR><TR><TD CLASS="l">2071</TD><TD>        }</TD></TR><TR><TD CLASS="l">2072</TD><TD> </TD></TR><TR><TD CLASS="l">2073</TD><TD>        private int getElementPositionForModelQuery(Node child) {</TD></TR><TR CLASS="c"><TD CLASS="l">2074</TD><TD>                return getElementPosition(child);</TD></TR><TR><TD CLASS="l">2075</TD><TD>                // return -1;</TD></TR><TR><TD CLASS="l">2076</TD><TD>        }</TD></TR><TR><TD CLASS="l">2077</TD><TD> </TD></TR><TR><TD CLASS="l">2078</TD><TD>        /**</TD></TR><TR><TD CLASS="l">2079</TD><TD>         * Return the reason why computeProposals was not able to find any</TD></TR><TR><TD CLASS="l">2080</TD><TD>         * completions.</TD></TR><TR><TD CLASS="l"><A NAME="48">2081</A></TD><TD>         * </TD></TR><TR><TD CLASS="l">2082</TD><TD>         * an error message or null if no error occurred</TD></TR><TR><TD CLASS="l">2083</TD><TD>         */</TD></TR><TR><TD CLASS="l">2084</TD><TD>        public String getErrorMessage() {</TD></TR><TR CLASS="c"><TD CLASS="l">2085</TD><TD>                return fErrorMessage;</TD></TR><TR><TD CLASS="l">2086</TD><TD>        }</TD></TR><TR><TD CLASS="l">2087</TD><TD> </TD></TR><TR><TD CLASS="l">2088</TD><TD>        /**</TD></TR><TR><TD CLASS="l">2089</TD><TD>         * @param iResource</TD></TR><TR><TD CLASS="l">2090</TD><TD>         */</TD></TR><TR><TD CLASS="l">2091</TD><TD>        // public void initialize(IResource iResource) {</TD></TR><TR><TD CLASS="l">2092</TD><TD>        // this.resource = iResource;</TD></TR><TR><TD CLASS="l">2093</TD><TD>        // }</TD></TR><TR><TD CLASS="l">2094</TD><TD>        /**</TD></TR><TR><TD CLASS="l">2095</TD><TD>         * Gets the infoProvider.</TD></TR><TR><TD CLASS="l">2096</TD><TD>         * </TD></TR><TR><TD CLASS="l"><A NAME="49">2097</A></TD><TD>         * fInfoProvider and if fInfoProvider was &lt;code&gt;null&lt;/code&gt; create a new</TD></TR><TR><TD CLASS="l">2098</TD><TD>         * instance</TD></TR><TR><TD CLASS="l">2099</TD><TD>         */</TD></TR><TR><TD CLASS="l">2100</TD><TD>        public MarkupTagInfoProvider getInfoProvider() {</TD></TR><TR CLASS="c"><TD CLASS="l">2101</TD><TD>                if (fInfoProvider == null) {</TD></TR><TR CLASS="c"><TD CLASS="l">2102</TD><TD>                        fInfoProvider = new MarkupTagInfoProvider();</TD></TR><TR><TD CLASS="l">2103</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="40">2104</A></TD><TD>                return fInfoProvider;</TD></TR><TR><TD CLASS="l">2105</TD><TD>        }</TD></TR><TR><TD CLASS="l">2106</TD><TD> </TD></TR><TR><TD CLASS="l">2107</TD><TD>        protected String getMatchString(IStructuredDocumentRegion parent, ITextRegion aRegion, int offset) {</TD></TR><TR CLASS="c"><TD CLASS="l">2108</TD><TD>                if ((aRegion == null) || isCloseRegion(aRegion)) {</TD></TR><TR CLASS="c"><TD CLASS="l">2109</TD><TD>                        return &#34;&#34;; //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">2110</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">2111</TD><TD>                String matchString = null;</TD></TR><TR CLASS="c"><TD CLASS="l">2112</TD><TD>                String regionType = aRegion.getType();</TD></TR><TR CLASS="c"><TD CLASS="l">2113</TD><TD>                if ((regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS) || (regionType == DOMRegionContext.XML_TAG_OPEN) || (offset &gt; parent.getStartOffset(aRegion) + aRegion.getTextLength())) {</TD></TR><TR CLASS="c"><TD CLASS="l">2114</TD><TD>                        matchString = &#34;&#34;; //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">2115</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">2116</TD><TD>                else if (regionType == DOMRegionContext.XML_CONTENT) {</TD></TR><TR CLASS="c"><TD CLASS="l">2117</TD><TD>                        matchString = &#34;&#34;; //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">2118</TD><TD>                }</TD></TR><TR><TD CLASS="l">2119</TD><TD>                else {</TD></TR><TR CLASS="c"><TD CLASS="l">2120</TD><TD>                        if ((parent.getText(aRegion).length() &gt; 0) &amp;&amp; (parent.getStartOffset(aRegion) &lt; offset)) {</TD></TR><TR CLASS="c"><TD CLASS="l">2121</TD><TD>                                matchString = parent.getText(aRegion).substring(0, offset - parent.getStartOffset(aRegion));</TD></TR><TR><TD CLASS="l">2122</TD><TD>                        }</TD></TR><TR><TD CLASS="l">2123</TD><TD>                        else {</TD></TR><TR CLASS="z"><TD CLASS="l">2124</TD><TD>                                matchString = &#34;&#34;; //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">2125</TD><TD>                        }</TD></TR><TR><TD CLASS="l">2126</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="16">2127</A></TD><TD>                return matchString;</TD></TR><TR><TD CLASS="l">2128</TD><TD>        }</TD></TR><TR><TD CLASS="l">2129</TD><TD> </TD></TR><TR><TD CLASS="l">2130</TD><TD>        protected ITextRegion getNameRegion(IStructuredDocumentRegion flatNode) {</TD></TR><TR CLASS="z"><TD CLASS="l">2131</TD><TD>                if (flatNode == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">2132</TD><TD>                        return null;</TD></TR><TR><TD CLASS="l">2133</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">2134</TD><TD>                Iterator regionList = flatNode.getRegions().iterator();</TD></TR><TR CLASS="z"><TD CLASS="l">2135</TD><TD>                while (regionList.hasNext()) {</TD></TR><TR CLASS="z"><TD CLASS="l">2136</TD><TD>                        ITextRegion region = (ITextRegion) regionList.next();</TD></TR><TR CLASS="z"><TD CLASS="l">2137</TD><TD>                        if (isNameRegion(region)) {</TD></TR><TR CLASS="z"><TD CLASS="l">2138</TD><TD>                                return region;</TD></TR><TR><TD CLASS="l">2139</TD><TD>                        }</TD></TR><TR><TD CLASS="l">2140</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">2141</TD><TD>                return null;</TD></TR><TR><TD CLASS="l">2142</TD><TD>        }</TD></TR><TR><TD CLASS="l">2143</TD><TD> </TD></TR><TR><TD CLASS="l">2144</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="37">2145</A></TD><TD>         * Retrieves all of the possible valid values for this attribute</TD></TR><TR><TD CLASS="l">2146</TD><TD>         * declaration</TD></TR><TR><TD CLASS="l">2147</TD><TD>         */</TD></TR><TR><TD CLASS="l">2148</TD><TD>        protected List getPossibleDataTypeValues(Node node, CMAttributeDeclaration ad) {</TD></TR><TR CLASS="c"><TD CLASS="l">2149</TD><TD>                List list = null;</TD></TR><TR CLASS="c"><TD CLASS="l">2150</TD><TD>                if (node.getNodeType() == Node.ELEMENT_NODE) {</TD></TR><TR CLASS="c"><TD CLASS="l">2151</TD><TD>                        Element element = (Element) node;</TD></TR><TR CLASS="c"><TD CLASS="l">2152</TD><TD>                        String[] dataTypeValues = null;</TD></TR><TR><TD CLASS="l">2153</TD><TD>                        // The ModelQuery may not be available if the corresponding</TD></TR><TR><TD CLASS="l">2154</TD><TD>                        // adapter</TD></TR><TR><TD CLASS="l">2155</TD><TD>                        // is absent</TD></TR><TR CLASS="c"><TD CLASS="l">2156</TD><TD>                        ModelQuery modelQuery = ModelQueryUtil.getModelQuery(element.getOwnerDocument());</TD></TR><TR CLASS="c"><TD CLASS="l">2157</TD><TD>                        if (modelQuery != null) {</TD></TR><TR CLASS="c"><TD CLASS="l">2158</TD><TD>                                dataTypeValues = modelQuery.getPossibleDataTypeValues(element, ad);</TD></TR><TR><TD CLASS="l">2159</TD><TD>                        }</TD></TR><TR><TD CLASS="l">2160</TD><TD>                        else {</TD></TR><TR CLASS="z"><TD CLASS="l">2161</TD><TD>                                if (ad.getAttrType() != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">2162</TD><TD>                                        dataTypeValues = ad.getAttrType().getEnumeratedValues();</TD></TR><TR><TD CLASS="l">2163</TD><TD>                                }</TD></TR><TR><TD CLASS="l">2164</TD><TD>                        }</TD></TR><TR CLASS="c"><TD CLASS="l">2165</TD><TD>                        if (dataTypeValues != null) {</TD></TR><TR CLASS="c"><TD CLASS="l">2166</TD><TD>                                list = new ArrayList(dataTypeValues.length);</TD></TR><TR CLASS="c"><TD CLASS="l">2167</TD><TD>                                for (int i = 0; i &lt; dataTypeValues.length; i++) {</TD></TR><TR CLASS="c"><TD CLASS="l">2168</TD><TD>                                        list.add(dataTypeValues[i]);</TD></TR><TR><TD CLASS="l">2169</TD><TD>                                }</TD></TR><TR><TD CLASS="l">2170</TD><TD>                        }</TD></TR><TR><TD CLASS="l">2171</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">2172</TD><TD>                if (list == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">2173</TD><TD>                        list = new ArrayList(0);</TD></TR><TR><TD CLASS="l">2174</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="3a">2175</A></TD><TD>                return list;</TD></TR><TR><TD CLASS="l">2176</TD><TD>        }</TD></TR><TR><TD CLASS="l">2177</TD><TD> </TD></TR><TR><TD CLASS="l">2178</TD><TD>        protected String getRequiredName(Node parentOrOwner, CMNode cmnode) {</TD></TR><TR CLASS="c"><TD CLASS="l">2179</TD><TD>                if ((cmnode == null) || (parentOrOwner == null)) {</TD></TR><TR><TD CLASS="l">2180</TD><TD>                        if (Debug.displayWarnings) {</TD></TR><TR><TD CLASS="l">2181</TD><TD>                                new IllegalArgumentException(&#34;Null declaration!&#34;).printStackTrace(); //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">2182</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">2183</TD><TD>                        return &#34;&#34;; //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">2184</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="3d">2185</A></TD><TD>                return getContentGenerator().getRequiredName(parentOrOwner, cmnode);</TD></TR><TR><TD CLASS="l">2186</TD><TD>        }</TD></TR><TR><TD CLASS="l">2187</TD><TD> </TD></TR><TR><TD CLASS="l">2188</TD><TD>        protected String getRequiredText(Node parentOrOwner, CMAttributeDeclaration attrDecl) {</TD></TR><TR CLASS="c"><TD CLASS="l">2189</TD><TD>                if (attrDecl == null) {</TD></TR><TR><TD CLASS="l">2190</TD><TD>                        if (Debug.displayWarnings) {</TD></TR><TR><TD CLASS="l">2191</TD><TD>                                new IllegalArgumentException(&#34;Null attribute declaration!&#34;).printStackTrace(); //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">2192</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">2193</TD><TD>                        return &#34;&#34;; //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">2194</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">2195</TD><TD>                StringBuffer buff = new StringBuffer();</TD></TR><TR CLASS="c"><TD CLASS="l">2196</TD><TD>                getContentGenerator().generateRequiredAttribute(parentOrOwner, attrDecl, buff);</TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="3e">2197</A></TD><TD>                return buff.toString();</TD></TR><TR><TD CLASS="l">2198</TD><TD>        }</TD></TR><TR><TD CLASS="l">2199</TD><TD> </TD></TR><TR><TD CLASS="l">2200</TD><TD>        protected String getRequiredText(Node parentOrOwner, CMElementDeclaration elementDecl) {</TD></TR><TR CLASS="c"><TD CLASS="l">2201</TD><TD>                if (elementDecl == null) {</TD></TR><TR><TD CLASS="l">2202</TD><TD>                        if (Debug.displayWarnings) {</TD></TR><TR><TD CLASS="l">2203</TD><TD>                                new IllegalArgumentException(&#34;Null attribute declaration!&#34;).printStackTrace(); //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">2204</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">2205</TD><TD>                        return &#34;&#34;; //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">2206</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">2207</TD><TD>                StringBuffer buff = new StringBuffer();</TD></TR><TR CLASS="c"><TD CLASS="l">2208</TD><TD>                getContentGenerator().generateTag(parentOrOwner, elementDecl, buff);</TD></TR><TR CLASS="c"><TD CLASS="l">2209</TD><TD>                return buff.toString();</TD></TR><TR><TD CLASS="l">2210</TD><TD>        }</TD></TR><TR><TD CLASS="l">2211</TD><TD> </TD></TR><TR><TD CLASS="l">2212</TD><TD>        /**</TD></TR><TR><TD CLASS="l">2213</TD><TD>         * StructuredTextViewer must be set before using this.</TD></TR><TR><TD CLASS="l">2214</TD><TD>         */</TD></TR><TR><TD CLASS="l">2215</TD><TD>        public IStructuredDocumentRegion getStructuredDocumentRegion(int pos) {</TD></TR><TR><TD CLASS="l"><A NAME="4a">2216</A></TD><TD>                // (pa) ITextRegion refactor defect 245190</TD></TR><TR><TD CLASS="l">2217</TD><TD>                // return</TD></TR><TR><TD CLASS="l">2218</TD><TD>                // (IStructuredDocumentRegion)ContentAssistUtils.getNodeAt((StructuredTextViewer)fTextViewer,</TD></TR><TR><TD CLASS="l">2219</TD><TD>                // pos);</TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="17">2220</A></TD><TD>                return ContentAssistUtils.getStructuredDocumentRegion(fTextViewer, pos);</TD></TR><TR><TD CLASS="l">2221</TD><TD>        }</TD></TR><TR><TD CLASS="l">2222</TD><TD> </TD></TR><TR><TD CLASS="l">2223</TD><TD>        private String getTagName(IStructuredDocumentRegion sdRegion) {</TD></TR><TR CLASS="z"><TD CLASS="l">2224</TD><TD>                ITextRegionList regions = sdRegion.getRegions();</TD></TR><TR CLASS="z"><TD CLASS="l">2225</TD><TD>                ITextRegion region = null;</TD></TR><TR CLASS="z"><TD CLASS="l">2226</TD><TD>                String name = &#34;&#34;; //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">2227</TD><TD>                for (int i = 0; i &lt; regions.size(); i++) {</TD></TR><TR CLASS="z"><TD CLASS="l">2228</TD><TD>                        region = regions.get(i);</TD></TR><TR CLASS="z"><TD CLASS="l">2229</TD><TD>                        if (region.getType() == DOMRegionContext.XML_TAG_NAME) {</TD></TR><TR CLASS="z"><TD CLASS="l">2230</TD><TD>                                name = sdRegion.getText(region);</TD></TR><TR CLASS="z"><TD CLASS="l">2231</TD><TD>                                break;</TD></TR><TR><TD CLASS="l">2232</TD><TD>                        }</TD></TR><TR><TD CLASS="l">2233</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">2234</TD><TD>                return name;</TD></TR><TR><TD CLASS="l">2235</TD><TD>        }</TD></TR><TR><TD CLASS="l">2236</TD><TD> </TD></TR><TR><TD CLASS="l">2237</TD><TD>        // returns a list of CMNodes that are available within this parent context</TD></TR><TR><TD CLASS="l">2238</TD><TD>        // Given the grammar shown below and a snippet of XML code (where the '|'</TD></TR><TR><TD CLASS="l">2239</TD><TD>        // indicated the cursor position)</TD></TR><TR><TD CLASS="l">2240</TD><TD>        // the list would return all of the element declarations that are</TD></TR><TR><TD CLASS="l">2241</TD><TD>        // potential child elements of Foo.</TD></TR><TR><TD CLASS="l">2242</TD><TD>        //</TD></TR><TR><TD CLASS="l">2243</TD><TD>        // grammar : Foo -&gt; (A, B, C)</TD></TR><TR><TD CLASS="l">2244</TD><TD>        // snippet : &lt;Foo&gt;&lt;A&gt;|</TD></TR><TR><TD CLASS="l">2245</TD><TD>        // result : {A, B, C}</TD></TR><TR><TD CLASS="l"><A NAME="44">2246</A></TD><TD>        // </TD></TR><TR><TD CLASS="l">2247</TD><TD>        // TODO cs... do we need to pass in the 'kindOfAction'? Seems to me we</TD></TR><TR><TD CLASS="l">2248</TD><TD>        // could assume it's always an insert.</TD></TR><TR><TD CLASS="l">2249</TD><TD>        protected List getAvailableChildElementDeclarations(Element parent, int childPosition, int kindOfAction) {</TD></TR><TR CLASS="c"><TD CLASS="l">2250</TD><TD>                List modelQueryActions = getAvailableChildrenAtIndex(parent, childPosition, ModelQuery.VALIDITY_NONE);</TD></TR><TR CLASS="c"><TD CLASS="l">2251</TD><TD>                Iterator iterator = modelQueryActions.iterator();</TD></TR><TR CLASS="c"><TD CLASS="l">2252</TD><TD>                List cmnodes = new Vector();</TD></TR><TR CLASS="c"><TD CLASS="l">2253</TD><TD>                while (iterator.hasNext()) {</TD></TR><TR CLASS="c"><TD CLASS="l">2254</TD><TD>                        ModelQueryAction action = (ModelQueryAction) iterator.next();</TD></TR><TR CLASS="c"><TD CLASS="l">2255</TD><TD>                        if ((childPosition &lt; 0) || (((action.getStartIndex() &lt;= childPosition) &amp;&amp; (childPosition &lt;= action.getEndIndex())) &amp;&amp; (action.getKind() == kindOfAction))) {</TD></TR><TR CLASS="c"><TD CLASS="l">2256</TD><TD>                                CMNode actionCMNode = action.getCMNode();</TD></TR><TR CLASS="c"><TD CLASS="l">2257</TD><TD>                                if ((actionCMNode != null) &amp;&amp; !cmnodes.contains(actionCMNode)) {</TD></TR><TR CLASS="c"><TD CLASS="l">2258</TD><TD>                                        cmnodes.add(actionCMNode);</TD></TR><TR><TD CLASS="l">2259</TD><TD>                                }</TD></TR><TR><TD CLASS="l">2260</TD><TD>                        }</TD></TR><TR><TD CLASS="l">2261</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">2262</TD><TD>                return cmnodes;</TD></TR><TR><TD CLASS="l">2263</TD><TD>        }</TD></TR><TR><TD CLASS="l">2264</TD><TD> </TD></TR><TR><TD CLASS="l">2265</TD><TD>        // returns a list of CMNodes that can be validly inserted at this</TD></TR><TR><TD CLASS="l">2266</TD><TD>        // childPosition</TD></TR><TR><TD CLASS="l">2267</TD><TD>        // Given the grammar shown below and a snippet of XML code (where the '|'</TD></TR><TR><TD CLASS="l">2268</TD><TD>        // indicated the cursor position)</TD></TR><TR><TD CLASS="l">2269</TD><TD>        // the list would return only the element declarations can be inserted</TD></TR><TR><TD CLASS="l">2270</TD><TD>        // while maintaing validity of the content.</TD></TR><TR><TD CLASS="l">2271</TD><TD>        //</TD></TR><TR><TD CLASS="l">2272</TD><TD>        // grammar : Foo -&gt; (A, B, C)</TD></TR><TR><TD CLASS="l"><A NAME="4b">2273</A></TD><TD>        // snippet : &lt;Foo&gt;&lt;A&gt;|</TD></TR><TR><TD CLASS="l">2274</TD><TD>        // result : {B}</TD></TR><TR><TD CLASS="l">2275</TD><TD>        //    </TD></TR><TR><TD CLASS="l">2276</TD><TD>        protected List getValidChildElementDeclarations(Element parent, int childPosition, int kindOfAction) {</TD></TR><TR CLASS="c"><TD CLASS="l">2277</TD><TD>                List modelQueryActions = getAvailableChildrenAtIndex(parent, childPosition, ModelQuery.VALIDITY_STRICT);</TD></TR><TR CLASS="c"><TD CLASS="l">2278</TD><TD>                Iterator iterator = modelQueryActions.iterator();</TD></TR><TR CLASS="c"><TD CLASS="l">2279</TD><TD>                List cmnodes = new Vector();</TD></TR><TR CLASS="c"><TD CLASS="l">2280</TD><TD>                while (iterator.hasNext()) {</TD></TR><TR CLASS="c"><TD CLASS="l">2281</TD><TD>                        ModelQueryAction action = (ModelQueryAction) iterator.next();</TD></TR><TR CLASS="c"><TD CLASS="l">2282</TD><TD>                        if ((childPosition &lt; 0) || (((action.getStartIndex() &lt;= childPosition) &amp;&amp; (childPosition &lt;= action.getEndIndex())) &amp;&amp; (action.getKind() == kindOfAction))) {</TD></TR><TR CLASS="c"><TD CLASS="l">2283</TD><TD>                                CMNode actionCMNode = action.getCMNode();</TD></TR><TR CLASS="c"><TD CLASS="l">2284</TD><TD>                                if ((actionCMNode != null) &amp;&amp; !cmnodes.contains(actionCMNode)) {</TD></TR><TR CLASS="c"><TD CLASS="l">2285</TD><TD>                                        cmnodes.add(actionCMNode);</TD></TR><TR><TD CLASS="l">2286</TD><TD>                                }</TD></TR><TR><TD CLASS="l">2287</TD><TD>                        }</TD></TR><TR><TD CLASS="l">2288</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">2289</TD><TD>                return cmnodes;</TD></TR><TR><TD CLASS="l">2290</TD><TD>        }</TD></TR><TR><TD CLASS="l">2291</TD><TD> </TD></TR><TR><TD CLASS="l">2292</TD><TD>        /**</TD></TR><TR><TD CLASS="l">2293</TD><TD>         * Similar to the call in HTMLContentAssistProcessor. Pass in a node, it</TD></TR><TR><TD CLASS="l">2294</TD><TD>         * tells you if the document is XML type.</TD></TR><TR><TD CLASS="l">2295</TD><TD>         * </TD></TR><TR><TD CLASS="l"><A NAME="35">2296</A></TD><TD>         * @param node</TD></TR><TR><TD CLASS="l">2297</TD><TD>         * </TD></TR><TR><TD CLASS="l">2298</TD><TD>         */</TD></TR><TR><TD CLASS="l">2299</TD><TD>        protected boolean getXML(Node node) {</TD></TR><TR CLASS="c"><TD CLASS="l">2300</TD><TD>                if (node == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">2301</TD><TD>                        return false;</TD></TR><TR><TD CLASS="l">2302</TD><TD>                }</TD></TR><TR><TD CLASS="l">2303</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">2304</TD><TD>                Document doc = null;</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="87% line coverage (13 out of 15 instructions)">2305</TD><TD TITLE="87% line coverage (13 out of 15 instructions)">                doc = (node.getNodeType() != Node.DOCUMENT_NODE) ? node.getOwnerDocument() : ((Document) node);</TD></TR><TR><TD CLASS="l">2306</TD><TD> </TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="83% line coverage (10 out of 12 instructions)">2307</TD><TD TITLE="83% line coverage (10 out of 12 instructions)">                return (doc instanceof IDOMDocument) &amp;&amp; ((IDOMDocument) doc).isXMLType();</TD></TR><TR><TD CLASS="l">2308</TD><TD>        }</TD></TR><TR><TD CLASS="l"><A NAME="18">2309</A></TD><TD> </TD></TR><TR><TD CLASS="l">2310</TD><TD>        // Initialize local settings</TD></TR><TR><TD CLASS="l">2311</TD><TD>        protected void init() {</TD></TR><TR><TD CLASS="l"><A NAME="4c">2312</A></TD><TD>                // implement in subclasses</TD></TR><TR CLASS="z"><TD CLASS="l">2313</TD><TD>        }</TD></TR><TR><TD CLASS="l">2314</TD><TD> </TD></TR><TR><TD CLASS="l">2315</TD><TD>        protected boolean isCloseRegion(ITextRegion region) {</TD></TR><TR CLASS="c"><TD CLASS="l">2316</TD><TD>                String type = region.getType();</TD></TR><TR CLASS="c"><TD CLASS="l">2317</TD><TD>                return ((type == DOMRegionContext.XML_PI_CLOSE) || (type == DOMRegionContext.XML_TAG_CLOSE) || (type == DOMRegionContext.XML_EMPTY_TAG_CLOSE) || (type == DOMRegionContext.XML_CDATA_CLOSE) || (type == DOMRegionContext.XML_COMMENT_CLOSE) || (type == DOMRegionContext.XML_ATTLIST_DECL_CLOSE) || (type == DOMRegionContext.XML_ELEMENT_DECL_CLOSE) || (type == DOMRegionContext.XML_DOCTYPE_DECLARATION_CLOSE) || (type == DOMJSPRegionContextsPrivateCopy.JSP_CLOSE) || (type == DOMJSPRegionContextsPrivateCopy.JSP_COMMENT_CLOSE) || (type.equals(DOMJSPRegionContextsPrivateCopy.JSP_DIRECTIVE_CLOSE)) || (type == DOMRegionContext.XML_DECLARATION_CLOSE));</TD></TR><TR><TD CLASS="l">2318</TD><TD>        }</TD></TR><TR><TD CLASS="l">2319</TD><TD> </TD></TR><TR><TD CLASS="l">2320</TD><TD>        /*</TD></TR><TR><TD CLASS="l"><A NAME="3b">2321</A></TD><TD>         * This is to determine if a tag is a special meta-info comment tag that</TD></TR><TR><TD CLASS="l">2322</TD><TD>         * shows up as an ELEMENT</TD></TR><TR><TD CLASS="l">2323</TD><TD>         */</TD></TR><TR><TD CLASS="l">2324</TD><TD>        private boolean isCommentNode(IDOMNode node) {</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="85% line coverage (11 out of 13 instructions)">2325</TD><TD TITLE="85% line coverage (11 out of 13 instructions)">                return ((node != null) &amp;&amp; (node instanceof IDOMElement) &amp;&amp; ((IDOMElement) node).isCommentTag());</TD></TR><TR><TD CLASS="l">2326</TD><TD>        }</TD></TR><TR><TD CLASS="l">2327</TD><TD> </TD></TR><TR><TD CLASS="l">2328</TD><TD>        /**</TD></TR><TR><TD CLASS="l">2329</TD><TD>         * Checks if cursor position is after doctype tag...</TD></TR><TR><TD CLASS="l">2330</TD><TD>         * </TD></TR><TR><TD CLASS="l"><A NAME="33">2331</A></TD><TD>         * @param car</TD></TR><TR><TD CLASS="l">2332</TD><TD>         * </TD></TR><TR><TD CLASS="l">2333</TD><TD>         */</TD></TR><TR><TD CLASS="l">2334</TD><TD>        protected boolean isCursorAfterDoctype(ContentAssistRequest car) {</TD></TR><TR CLASS="c"><TD CLASS="l">2335</TD><TD>                Node aNode = car.getNode();</TD></TR><TR CLASS="c"><TD CLASS="l">2336</TD><TD>                Document parent = aNode.getOwnerDocument();</TD></TR><TR CLASS="c"><TD CLASS="l">2337</TD><TD>                int xmldoctypeNodePosition = -1;</TD></TR><TR CLASS="c"><TD CLASS="l">2338</TD><TD>                boolean isAfterDoctype = true;</TD></TR><TR><TD CLASS="l">2339</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">2340</TD><TD>                if (parent == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">2341</TD><TD>                        return true; // blank document case</TD></TR><TR><TD CLASS="l">2342</TD><TD>                }</TD></TR><TR><TD CLASS="l">2343</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">2344</TD><TD>                for (Node child = parent.getFirstChild(); child != null; child = child.getNextSibling()) {</TD></TR><TR CLASS="c"><TD CLASS="l">2345</TD><TD>                        if (child instanceof IDOMNode) {</TD></TR><TR CLASS="c"><TD CLASS="l">2346</TD><TD>                                if (child.getNodeType() == Node.DOCUMENT_TYPE_NODE) {</TD></TR><TR CLASS="z"><TD CLASS="l">2347</TD><TD>                                        xmldoctypeNodePosition = ((IDOMNode) child).getEndOffset();</TD></TR><TR CLASS="z"><TD CLASS="l">2348</TD><TD>                                        isAfterDoctype = (car.getReplacementBeginPosition() &gt;= xmldoctypeNodePosition);</TD></TR><TR CLASS="z"><TD CLASS="l">2349</TD><TD>                                        break;</TD></TR><TR><TD CLASS="l">2350</TD><TD>                                }</TD></TR><TR><TD CLASS="l">2351</TD><TD>                        }</TD></TR><TR><TD CLASS="l">2352</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">2353</TD><TD>                return isAfterDoctype;</TD></TR><TR><TD CLASS="l">2354</TD><TD>        }</TD></TR><TR><TD CLASS="l">2355</TD><TD> </TD></TR><TR><TD CLASS="l">2356</TD><TD>        /**</TD></TR><TR><TD CLASS="l">2357</TD><TD>         * This method can check if the cursor is after the XMLPI</TD></TR><TR><TD CLASS="l">2358</TD><TD>         * </TD></TR><TR><TD CLASS="l"><A NAME="19">2359</A></TD><TD>         * @param car</TD></TR><TR><TD CLASS="l">2360</TD><TD>         * </TD></TR><TR><TD CLASS="l">2361</TD><TD>         */</TD></TR><TR><TD CLASS="l">2362</TD><TD>        protected boolean isCursorAfterXMLPI(ContentAssistRequest car) {</TD></TR><TR CLASS="z"><TD CLASS="l">2363</TD><TD>                Node aNode = car.getNode();</TD></TR><TR CLASS="z"><TD CLASS="l">2364</TD><TD>                boolean xmlpiFound = false;</TD></TR><TR CLASS="z"><TD CLASS="l">2365</TD><TD>                Document parent = aNode.getOwnerDocument();</TD></TR><TR CLASS="z"><TD CLASS="l">2366</TD><TD>                int xmlpiNodePosition = -1;</TD></TR><TR CLASS="z"><TD CLASS="l">2367</TD><TD>                boolean isAfterXMLPI = false;</TD></TR><TR><TD CLASS="l">2368</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">2369</TD><TD>                if (parent == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">2370</TD><TD>                        return true; // blank document case</TD></TR><TR><TD CLASS="l">2371</TD><TD>                }</TD></TR><TR><TD CLASS="l">2372</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">2373</TD><TD>                for (Node child = parent.getFirstChild(); child != null; child = child.getNextSibling()) {</TD></TR><TR CLASS="z"><TD CLASS="l">2374</TD><TD>                        boolean xmlpi = ((child.getNodeType() == Node.PROCESSING_INSTRUCTION_NODE) &amp;&amp; child.getNodeName().equals(&#34;xml&#34;)); //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">2375</TD><TD>                        xmlpiFound = xmlpiFound || xmlpi;</TD></TR><TR CLASS="z"><TD CLASS="l">2376</TD><TD>                        if (xmlpiFound) {</TD></TR><TR CLASS="z"><TD CLASS="l">2377</TD><TD>                                if (child instanceof IDOMNode) {</TD></TR><TR CLASS="z"><TD CLASS="l">2378</TD><TD>                                        xmlpiNodePosition = ((IDOMNode) child).getEndOffset();</TD></TR><TR CLASS="z"><TD CLASS="l">2379</TD><TD>                                        isAfterXMLPI = (car.getReplacementBeginPosition() &gt;= xmlpiNodePosition);</TD></TR><TR><TD CLASS="l">2380</TD><TD>                                }</TD></TR><TR CLASS="z"><TD CLASS="l">2381</TD><TD>                                break;</TD></TR><TR><TD CLASS="l">2382</TD><TD>                        }</TD></TR><TR><TD CLASS="l">2383</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="1a">2384</A></TD><TD>                return isAfterXMLPI;</TD></TR><TR><TD CLASS="l">2385</TD><TD>        }</TD></TR><TR><TD CLASS="l">2386</TD><TD> </TD></TR><TR><TD CLASS="l">2387</TD><TD>        protected boolean isNameRegion(ITextRegion region) {</TD></TR><TR CLASS="z"><TD CLASS="l">2388</TD><TD>                String type = region.getType();</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="1b">2389</A></TD><TD>                return ((type == DOMRegionContext.XML_TAG_NAME) || (type == DOMJSPRegionContextsPrivateCopy.JSP_DIRECTIVE_NAME) || (type == DOMRegionContext.XML_ELEMENT_DECL_NAME) || (type == DOMRegionContext.XML_DOCTYPE_NAME) || (type == DOMRegionContext.XML_ATTLIST_DECL_NAME) || (type == DOMJSPRegionContextsPrivateCopy.JSP_ROOT_TAG_NAME) || type.equals(DOMJSPRegionContextsPrivateCopy.JSP_DIRECTIVE_NAME));</TD></TR><TR><TD CLASS="l">2390</TD><TD>        }</TD></TR><TR><TD CLASS="l">2391</TD><TD> </TD></TR><TR><TD CLASS="l">2392</TD><TD>        protected boolean isQuote(String string) {</TD></TR><TR CLASS="z"><TD CLASS="l">2393</TD><TD>                String trimmed = string.trim();</TD></TR><TR CLASS="z"><TD CLASS="l">2394</TD><TD>                if (trimmed.length() &gt; 0) {</TD></TR><TR CLASS="z"><TD CLASS="l">2395</TD><TD>                        return (trimmed.charAt(0) == '\'') || (trimmed.charAt(0) == '&#34;');</TD></TR><TR><TD CLASS="l">2396</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="1c">2397</A></TD><TD>                return false;</TD></TR><TR><TD CLASS="l">2398</TD><TD>        }</TD></TR><TR><TD CLASS="l">2399</TD><TD> </TD></TR><TR><TD CLASS="l">2400</TD><TD>        private boolean isSelfClosed(IStructuredDocumentRegion startTag) {</TD></TR><TR CLASS="z"><TD CLASS="l">2401</TD><TD>                ITextRegionList regions = startTag.getRegions();</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="1d">2402</A></TD><TD>                return regions.get(regions.size() - 1).getType() == DOMRegionContext.XML_EMPTY_TAG_CLOSE;</TD></TR><TR><TD CLASS="l">2403</TD><TD>        }</TD></TR><TR><TD CLASS="l">2404</TD><TD> </TD></TR><TR><TD CLASS="l">2405</TD><TD>        private boolean isStartTag(IStructuredDocumentRegion sdRegion) {</TD></TR><TR CLASS="z"><TD CLASS="l">2406</TD><TD>                boolean result = false;</TD></TR><TR CLASS="z"><TD CLASS="l">2407</TD><TD>                if (sdRegion.getRegions().size() &gt; 0) {</TD></TR><TR CLASS="z"><TD CLASS="l">2408</TD><TD>                        ITextRegion r = sdRegion.getRegions().get(0);</TD></TR><TR CLASS="z"><TD CLASS="l">2409</TD><TD>                        result = (r.getType() == DOMRegionContext.XML_TAG_OPEN) &amp;&amp; sdRegion.isEnded();</TD></TR><TR><TD CLASS="l">2410</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="1e">2411</A></TD><TD>                return result;</TD></TR><TR><TD CLASS="l">2412</TD><TD>        }</TD></TR><TR><TD CLASS="l">2413</TD><TD> </TD></TR><TR><TD CLASS="l">2414</TD><TD>        protected Properties mapToProperties(CMNamedNodeMap map) {</TD></TR><TR CLASS="z"><TD CLASS="l">2415</TD><TD>                Properties p = new Properties();</TD></TR><TR CLASS="z"><TD CLASS="l">2416</TD><TD>                for (int i = 0; i &lt; map.getLength(); i++) {</TD></TR><TR CLASS="z"><TD CLASS="l">2417</TD><TD>                        CMEntityDeclaration decl = (CMEntityDeclaration) map.item(i);</TD></TR><TR CLASS="z"><TD CLASS="l">2418</TD><TD>                        p.put(decl.getName(), decl.getValue());</TD></TR><TR><TD CLASS="l">2419</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">2420</TD><TD>                return p;</TD></TR><TR><TD CLASS="l">2421</TD><TD>        }</TD></TR><TR><TD CLASS="l">2422</TD><TD> </TD></TR><TR><TD CLASS="l">2423</TD><TD>        /**</TD></TR><TR><TD CLASS="l">2424</TD><TD>         * Gets the corresponding XMLNode, and checks if it's closed.</TD></TR><TR><TD CLASS="l">2425</TD><TD>         * </TD></TR><TR><TD CLASS="l"><A NAME="1f">2426</A></TD><TD>         * @param startTag</TD></TR><TR><TD CLASS="l">2427</TD><TD>         * </TD></TR><TR><TD CLASS="l">2428</TD><TD>         */</TD></TR><TR><TD CLASS="l">2429</TD><TD>        private boolean needsEndTag(IStructuredDocumentRegion startTag) {</TD></TR><TR CLASS="z"><TD CLASS="l">2430</TD><TD>                boolean result = false;</TD></TR><TR CLASS="z"><TD CLASS="l">2431</TD><TD>                IStructuredModel sModel = StructuredModelManager.getModelManager().getExistingModelForRead(fTextViewer.getDocument());</TD></TR><TR><TD CLASS="l">2432</TD><TD>                try {</TD></TR><TR CLASS="z"><TD CLASS="l">2433</TD><TD>                        if (sModel != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">2434</TD><TD>                                IDOMNode xmlNode = (IDOMNode) sModel.getIndexedRegion(startTag.getStart());</TD></TR><TR CLASS="z"><TD CLASS="l">2435</TD><TD>                                if (!isStartTag(startTag)) {</TD></TR><TR CLASS="z"><TD CLASS="l">2436</TD><TD>                                        result = false;</TD></TR><TR><TD CLASS="l">2437</TD><TD>                                }</TD></TR><TR CLASS="z"><TD CLASS="l">2438</TD><TD>                                else if (isSelfClosed(startTag)) {</TD></TR><TR CLASS="z"><TD CLASS="l">2439</TD><TD>                                        result = false;</TD></TR><TR><TD CLASS="l">2440</TD><TD>                                }</TD></TR><TR CLASS="z"><TD CLASS="l">2441</TD><TD>                                else if (!xmlNode.isContainer()) {</TD></TR><TR CLASS="z"><TD CLASS="l">2442</TD><TD>                                        result = false;</TD></TR><TR><TD CLASS="l">2443</TD><TD>                                }</TD></TR><TR><TD CLASS="l">2444</TD><TD>                                else {</TD></TR><TR CLASS="z"><TD CLASS="l">2445</TD><TD>                                        result = xmlNode.getEndStructuredDocumentRegion() == null;</TD></TR><TR><TD CLASS="l">2446</TD><TD>                                }</TD></TR><TR><TD CLASS="l">2447</TD><TD>                        }</TD></TR><TR><TD CLASS="l">2448</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">2449</TD><TD>                finally {</TD></TR><TR CLASS="z"><TD CLASS="l">2450</TD><TD>                        if (sModel != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">2451</TD><TD>                                sModel.releaseFromRead();</TD></TR><TR><TD CLASS="l">2452</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">2453</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="4d">2454</A></TD><TD>                return result;</TD></TR><TR><TD CLASS="l">2455</TD><TD>        }</TD></TR><TR><TD CLASS="l">2456</TD><TD> </TD></TR><TR><TD CLASS="l">2457</TD><TD>        protected ContentAssistRequest newContentAssistRequest(Node node, Node possibleParent, IStructuredDocumentRegion documentRegion, ITextRegion completionRegion, int begin, int length, String filter) {</TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="20">2458</A></TD><TD>                return new ContentAssistRequest(node, possibleParent, documentRegion, completionRegion, begin, length, filter);</TD></TR><TR><TD CLASS="l">2459</TD><TD>        }</TD></TR><TR><TD CLASS="l">2460</TD><TD> </TD></TR><TR><TD CLASS="l">2461</TD><TD>        public void release() {</TD></TR><TR CLASS="z"><TD CLASS="l">2462</TD><TD>                fGenerator = null;</TD></TR><TR CLASS="z"><TD CLASS="l">2463</TD><TD>        }</TD></TR><TR><TD CLASS="l">2464</TD><TD> </TD></TR><TR><TD CLASS="l">2465</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="4e">2466</A></TD><TD>         * Set the reason why computeProposals was not able to find any</TD></TR><TR><TD CLASS="l">2467</TD><TD>         * completions.</TD></TR><TR><TD CLASS="l">2468</TD><TD>         */</TD></TR><TR><TD CLASS="l">2469</TD><TD>        public void setErrorMessage(String errorMessage) {</TD></TR><TR CLASS="c"><TD CLASS="l">2470</TD><TD>                fErrorMessage = errorMessage;</TD></TR><TR CLASS="c"><TD CLASS="l">2471</TD><TD>        }</TD></TR><TR><TD CLASS="l">2472</TD><TD> </TD></TR><TR><TD CLASS="l">2473</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="21">2474</A></TD><TD>         * Set the reason why computeProposals was not able to find any</TD></TR><TR><TD CLASS="l">2475</TD><TD>         * completions.</TD></TR><TR><TD CLASS="l">2476</TD><TD>         */</TD></TR><TR><TD CLASS="l">2477</TD><TD>        protected void setErrorMessage(String errorMessage, String append) {</TD></TR><TR CLASS="z"><TD CLASS="l">2478</TD><TD>                setErrorMessage(errorMessage + append);</TD></TR><TR CLASS="z"><TD CLASS="l">2479</TD><TD>        }</TD></TR><TR><TD CLASS="l">2480</TD><TD> </TD></TR><TR><TD CLASS="l">2481</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="22">2482</A></TD><TD>         * Set the reason why computeProposals was not able to find any</TD></TR><TR><TD CLASS="l">2483</TD><TD>         * completions.</TD></TR><TR><TD CLASS="l">2484</TD><TD>         */</TD></TR><TR><TD CLASS="l">2485</TD><TD>        protected void setErrorMessage(String errorMessage, String prepend, String append) {</TD></TR><TR CLASS="z"><TD CLASS="l">2486</TD><TD>                setErrorMessage(prepend + errorMessage + append);</TD></TR><TR CLASS="z"><TD CLASS="l">2487</TD><TD>        }</TD></TR><TR><TD CLASS="l"><A NAME="23">2488</A></TD><TD> </TD></TR><TR><TD CLASS="l">2489</TD><TD>        protected boolean stringsEqual(String a, String b) {</TD></TR><TR><TD CLASS="l">2490</TD><TD>                // (pa) 221190 matching independent of case to be consistant with Java</TD></TR><TR><TD CLASS="l">2491</TD><TD>                // editor CA</TD></TR><TR CLASS="z"><TD CLASS="l">2492</TD><TD>                return a.equalsIgnoreCase(b);</TD></TR><TR><TD CLASS="l">2493</TD><TD>        }</TD></TR><TR><TD CLASS="l">2494</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="9f.html">org.eclipse.wst.xml.ui.internal.contentassist</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>