<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"><static initializer></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> * "nestedContext".</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 = "JSP_CLOSE"; //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">91</TD><TD> private static final String JSP_COMMENT_CLOSE = "JSP_COMMENT_CLOSE"; //$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 = "JSP_COMMENT_OPEN"; //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">94</TD><TD> private static final String JSP_DECLARATION_OPEN = "JSP_DECLARATION_OPEN"; //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">95</TD><TD> private static final String JSP_DIRECTIVE_CLOSE = "JSP_DIRECTIVE_CLOSE"; //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">96</TD><TD> private static final String JSP_DIRECTIVE_NAME = "JSP_DIRECTIVE_NAME"; //$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 = "JSP_DIRECTIVE_OPEN"; //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">99</TD><TD> private static final String JSP_EXPRESSION_OPEN = "JSP_EXPRESSION_OPEN"; //$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 = "JSP_ROOT_TAG_NAME"; //$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 = "JSP_SCRIPTLET_OPEN"; //$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 < 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 < 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) <= contentAssistRequest.getReplacementBeginPosition()) && (sdRegion.getStartOffset(name) + name.getLength() >= contentAssistRequest.getReplacementBeginPosition() + contentAssistRequest.getReplacementLength()) && (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 < 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 && 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 && ((attr == null) || ((nameRegion != null) && (sdRegion.getStartOffset(nameRegion) <= contentAssistRequest.getReplacementBeginPosition()) && (sdRegion.getStartOffset(nameRegion) + nameRegion.getLength() >= 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 > 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) && (value.length() > 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 "", 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 && (proposedText.lastIndexOf('\"') - proposedText.indexOf('\"') == 1 && 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 < 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 >= 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 < 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) && (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) && (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() > 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 = ""; //$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() > 0) && (matchString.startsWith("\"") || matchString.startsWith("'"))) {</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) && (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 = "\"" + possibleValue + "\""; //$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 && ((matchString.length() == 0) || defaultValue.startsWith(matchString))) {</TD></TR><TR CLASS="z"><TD CLASS="l">361</TD><TD> String rString = "\"" + defaultValue + "\""; //$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)) && (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) && (value.length() > 0)) {</TD></TR><TR CLASS="z"><TD CLASS="l">371</TD><TD> String rValue = "\"" + value + "\"";//$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() > 0) && !value.equals(currentValue)) {</TD></TR><TR CLASS="z"><TD CLASS="l">375</TD><TD> rValue = "\"" + currentValue + "\""; //$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) && (currentValue.length() > 0)) {</TD></TR><TR CLASS="z"><TD CLASS="l">387</TD><TD> String rValue = "\"" + currentValue + "\""; //$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("<!-- -->", //$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[]{" <!-- -->"})), //$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 < 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("Unknown content child: " + 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 = "unspecified"; //$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 = "<!DOCTYPE " + rootname + " PUBLIC \"//UNKNOWN/\" \"unknown.dtd\">"; //$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), "<!DOCTYPE ... >", //$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() < contentAssistRequest.getReplacementBeginPosition()) {</TD></TR><TR CLASS="z"><TD CLASS="l">464</TD><TD> CustomCompletionProposal proposal = new CustomCompletionProposal(">", //$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[]{" '>'"})), //$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("</")) {</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) && ((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) && !contentAssistRequest.getDocumentRegion().isEnded()) {</TD></TR><TR CLASS="z"><TD CLASS="l">486</TD><TD> proposedText += ">"; //$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[]{"'" + proposedText + "'"})), //$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: <br></TD></TR><TR><TD CLASS="l">514</TD><TD> * <tagOpen>| <br></TD></TR><TR><TD CLASS="l">515</TD><TD> * <tagOpen>< |<br></TD></TR><TR><TD CLASS="l">516</TD><TD> * <tagOpen></ |</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) && 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) && 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() + ">"; //$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 = ""; //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">548</TD><TD> String proposedInfo = ""; //$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 "<", "</", 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 = ""; //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">561</TD><TD> while ((xmlEndTagOpen != null) && ((type = xmlEndTagOpen.getType()) != DOMRegionContext.XML_END_TAG_OPEN) && (type != DOMRegionContext.XML_TAG_CLOSE) && !needsEndTag(xmlEndTagOpen) && (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> // <p></TD></TR><TR><TD CLASS="l">576</TD><TD> // <% String test = "test"; %></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 = "</" + tagName + ">"; //$NON-NLS-1$ //$NON-NLS-2$ $NON-NLS-2$</TD></TR><TR><TD CLASS="l">583</TD><TD> // replaceText = "</" + node.getNodeName() + ">";</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: <tag> </ |</TD></TR><TR><TD CLASS="l">592</TD><TD> // possibly <tag> </ |<anotherTag></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 > xmlEndTagOpen.getTextEndOffset()) ? replaceBegin - xmlEndTagOpen.getTextEndOffset() : 0;</TD></TR><TR CLASS="z"><TD CLASS="l">595</TD><TD> replaceText = node.getNodeName() + ">"; //$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: <tag> < |</TD></TR><TR CLASS="z"><TD CLASS="l">603</TD><TD> replaceText = "/" + node.getNodeName() + ">"; //$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 = "/" + node.getNodeName() + ">"; //$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 > 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[]{"/" + 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) && (node.getNodeValue().indexOf("</") != -1)) { //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">618</TD><TD> // the case where "</" 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: <tag> </|</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) && (parent.getNodeType() != Node.DOCUMENT_NODE)) {</TD></TR><TR CLASS="z"><TD CLASS="l">623</TD><TD> replaceText = parent.getNodeName() + ">"; //$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) && (i < 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 = ""; //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">652</TD><TD> String entityValue = ""; //$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 = ""; //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">655</TD><TD> String displayString = ""; //$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) && 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("")) //$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 = "&" + entityName + ";"; //$NON-NLS-1$ //$NON-NLS-2$ </TD></TR><TR CLASS="z"><TD CLASS="l">672</TD><TD> displayString = "&" + entityName + "; (" + entityValue + ")"; //$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("<![CDATA[]]>", //$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), "CDATA Section", //$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), "#PCDATA", //$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> // ==> // 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) && (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) && child.getNodeName().equals("xml")); //$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> // ==> // 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) && (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) && (child instanceof IDOMNode)) {</TD></TR><TR CLASS="z"><TD CLASS="l">718</TD><TD> if ((contentAssistRequest.getReplacementBeginPosition() >= ((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 && (owningDocument.getDoctype() == null) && isCursorAfterXMLPI(contentAssistRequest) && 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 "/>"</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) && (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()) && !(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) && (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(">", //$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[]{" '>'"})), //$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. <%@ vs. <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() : ""; //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">782</TD><TD> if ((openingTagText != null) && (openingTagText.indexOf(node.getNodeName()) != -1)) {</TD></TR><TR CLASS="z"><TD CLASS="l">783</TD><TD> proposal = new CustomCompletionProposal("></" + node.getNodeName() + ">", //$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 "/>" 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("/>", //$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[]{" \"/>\""})), //$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()) && !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(">", //$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[]{" '>'"})), //$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) && (parent.getNodeType() == Node.DOCUMENT_NODE) && ((IDOMDocument) parent).isXMLType() && !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 "hide" 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) && (parent instanceof IDOMNode) && 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) && 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 < 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) && (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 <'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() > 0) && (Character.isWhitespace(matchString.charAt(0)) || beginsWith(matchString, "<"))) {</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) && (contentAssistRequest.getMatchString().length() > 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$ = "No known child tag names of <{0}> begin with \"{1}\"."</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) && child.getNodeName().equals("xml")); //$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 && (minimumOffset < 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() >= 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 < 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 &lt; and &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 <'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() > 0) && (Character.isWhitespace(matchString.charAt(0)) || beginsWith(matchString, "<"))) {</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) && (node.getAttributes() != null) && (node.getAttributes().getLength() > 0) && attributeInList(node, parent, elementDecl)) || ((node.getNodeType() != Node.TEXT_NODE) && 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 '<' 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 += "></" +</TD></TR><TR><TD CLASS="l">1064</TD><TD> // getRequiredName(parent, elementDecl) + ">";</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) && (contentAssistRequest.getMatchString().length() > 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$ = "No known child tag names of <{0}> begin with \"{1}\""</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 < 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/ '<', 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("\"\"") + 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('>') + 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 = "<?xml version=\"1.0\" encoding=\"" + ContentTypeEncodingPreferences.getUserPreferredCharsetName(ContentTypeIdForXML.ContentTypeID_XML) + "\"?>"; //$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 = ""; //$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) && (i < 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 < 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) && (k < 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 < 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) && (!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 > sdRegion.getStartOffset(completionRegion) + completionRegion.getTextLength()) && (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) && !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() && (documentPosition < 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) && (documentPosition == sdRegion.getTextEndOffset()) && (sdRegion.getText(completionRegion).endsWith("\"") || sdRegion.getText(completionRegion).endsWith("\'"))) //$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)) && (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 >= 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)) && (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) && (node.getNodeType() == Node.TEXT_NODE) && (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)) && (completionRegion == null) && ((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("problem getting model")); //$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("completion region was null")); //$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, ""); //$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) && ((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, ""); //$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 + " " + completionRegion.getType() + "@" + 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 && 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) && (node.getNodeType() == Node.DOCUMENT_NODE) && (((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> * <code>null</code> 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) && (regionAtEndOfCompletion != null) && (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 >= 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) && (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 &, 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) && regionText.trim().equals("") && (documentPosition > 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) && prev.getText().equals("&")) { //$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/ &</TD></TR><TR CLASS="c"><TD CLASS="l">1523</TD><TD> if ((regionText != null) && regionText.startsWith("&")) { //$NON-NLS-1$ </TD></TR><TR CLASS="z"><TD CLASS="l">1524</TD><TD> String key = (nodeOffset > 0) ? regionText.substring(1, nodeOffset) : ""; //$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("quot", "\""); //$NON-NLS-1$ //$NON-NLS-2$</TD></TR><TR CLASS="z"><TD CLASS="l">1544</TD><TD> entities.put("apos", "'"); //$NON-NLS-1$ //$NON-NLS-2$</TD></TR><TR CLASS="z"><TD CLASS="l">1545</TD><TD> entities.put("amp", "&"); //$NON-NLS-1$ //$NON-NLS-2$</TD></TR><TR CLASS="z"><TD CLASS="l">1546</TD><TD> entities.put("lt", "<"); //$NON-NLS-1$ //$NON-NLS-2$</TD></TR><TR CLASS="z"><TD CLASS="l">1547</TD><TD> entities.put("gt", ">"); //$NON-NLS-1$ //$NON-NLS-2$ </TD></TR><TR CLASS="z"><TD CLASS="l">1548</TD><TD> entities.put("nbsp", " "); //$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() > 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) && (valueRegion.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE) && (sdRegion.getStartOffset(valueRegion) <= 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 >= 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) && (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) && (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 <= 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) && (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 "<tagname1 |<tagname2"</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 > 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 >= 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 > 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 >= 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 "<<tagname"</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 '<'</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 '<'</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 && 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) && ((sdRegion.getStartOffset(name) <= documentPosition) && (sdRegion.getEndOffset(name) >= 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> * <code>null</code> 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("Null declaration!").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) && (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 "root" 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) && 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) && ((((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 + " already present!"); //$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("No definition found for " + rootName + " in " + docType.getPublicId() + "/" + 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 = "" + (docType.getPublicId() != null ? docType.getPublicId() + "/" : "") + (docType.getSystemId() != null ? docType.getSystemId() : ""); //$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() > 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("No content model found."); //$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 = "" + (docType.getPublicId() != null ? docType.getPublicId() + "/" : "") + (docType.getSystemId() != null ? docType.getSystemId() : ""); //$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() > 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> * <code>null</code> 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()) && (sdRegion.getPrevious() != null) && (!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) && (previousRegion != region) && (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 > 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) && (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) && (startTag.getStartOffset() <= offset) && (offset < 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) && (endTag.getStartOffset() <= offset) && (offset < 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() <= documentPosition) && (flatNode.getEndOffset() >= 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 '<'</TD></TR><TR CLASS="c"><TD CLASS="l">1987</TD><TD> if ((offset == flatNode.getStartOffset()) && (flatNode.getPrevious() != null) && (((flatNode.getRegionAtCharacterOffset(documentPosition) != null) && (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> * <code>null</code> 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 <code>null</code> 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 <code>null</code> 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 < 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 <code>null</code> 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 ""; //$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 > parent.getStartOffset(aRegion) + aRegion.getTextLength())) {</TD></TR><TR CLASS="c"><TD CLASS="l">2114</TD><TD> matchString = ""; //$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 = ""; //$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() > 0) && (parent.getStartOffset(aRegion) < 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 = ""; //$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 < 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("Null declaration!").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 ""; //$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("Null attribute declaration!").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 ""; //$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("Null attribute declaration!").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 ""; //$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 = ""; //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">2227</TD><TD> for (int i = 0; i < 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 -> (A, B, C)</TD></TR><TR><TD CLASS="l">2244</TD><TD> // snippet : <Foo><A>|</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 < 0) || (((action.getStartIndex() <= childPosition) && (childPosition <= action.getEndIndex())) && (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) && !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 -> (A, B, C)</TD></TR><TR><TD CLASS="l"><A NAME="4b">2273</A></TD><TD> // snippet : <Foo><A>|</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 < 0) || (((action.getStartIndex() <= childPosition) && (childPosition <= action.getEndIndex())) && (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) && !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) && ((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) && (node instanceof IDOMElement) && ((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() >= 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) && child.getNodeName().equals("xml")); //$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() >= 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() > 0) {</TD></TR><TR CLASS="z"><TD CLASS="l">2395</TD><TD> return (trimmed.charAt(0) == '\'') || (trimmed.charAt(0) == '"');</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() > 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) && 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 < 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> |