blob: ac72119ea68cd6ec377c4e102d57007f9431f828 [file] [log] [blame]
<HTML><HEAD><META CONTENT="text/html; charset=UTF-8" HTTP-EQUIV="Content-Type"/><TITLE>EMMA Coverage Report</TITLE><STYLE TYPE="text/css"> TABLE,TD,TH {border-style:solid; border-color:black;} TD,TH {background:white;margin:0;line-height:100%;padding-left:0.5em;padding-right:0.5em;} TD {border-width:0 1px 0 0;} TH {border-width:1px 1px 1px 0;} TR TD.h {color:red;} TABLE {border-spacing:0; border-collapse:collapse;border-width:0 0 1px 1px;} P,H1,H2,H3,TH {font-family:verdana,arial,sans-serif;font-size:10pt;} TD {font-family:courier,monospace;font-size:10pt;} TABLE.hdft {border-spacing:0;border-collapse:collapse;border-style:none;} TABLE.hdft TH,TABLE.hdft TD {border-style:none;line-height:normal;} TABLE.hdft TH.tl,TABLE.hdft TD.tl {background:#6699CC;color:white;} TABLE.hdft TD.nv {background:#6633DD;color:white;} .nv A:link {color:white;} .nv A:visited {color:white;} .nv A:active {color:yellow;} TABLE.hdft A:link {color:white;} TABLE.hdft A:visited {color:white;} TABLE.hdft A:active {color:yellow;} .in {color:#356085;} TABLE.s TD {padding-left:0.25em;padding-right:0.25em;} TABLE.s TD.l {padding-left:0.25em;padding-right:0.25em;text-align:right;background:#F0F0F0;} TABLE.s TR.z TD {background:#FF9999;} TABLE.s TR.p TD {background:#FFFF88;} TABLE.s TR.c TD {background:#CCFFCC;} A:link {color:#0000EE;text-decoration:none;} A:visited {color:#0000EE;text-decoration:none;} A:hover {color:#0000EE;text-decoration:underline;} TABLE.cn {border-width:0 0 1px 0;} TABLE.s {border-width:1px 0 1px 1px;} TD.h {color:red;border-width:0 1px 0 0;} TD.f {border-width:0 1px 0 1px;} TD.hf {color:red;border-width:0 1px 0 1px;} TH.f {border-width:1px 1px 1px 1px;} TR.cis TD {background:#F0F0F0;} TR.cis TD {border-width:1px 1px 1px 0;} TR.cis TD.h {color:red;border-width:1px 1px 1px 0;} TR.cis TD.f {border-width:1px 1px 1px 1px;} TR.cis TD.hf {color:red;border-width:1px 1px 1px 1px;} TD.b {border-style:none;background:transparent;line-height:50%;} TD.bt {border-width:1px 0 0 0;background:transparent;line-height:50%;} TR.o TD {background:#F0F0F0;}TABLE.it {border-style:none;}TABLE.it TD,TABLE.it TH {border-style:none;}</STYLE></HEAD><BODY><TABLE CLASS="hdft" CELLSPACING="0" WIDTH="100%"><TR><TH CLASS="tl"><A HREF="http://www.eclemma.org/">EMMA</A> Coverage Report (generated Fri Feb 20 18:44:54 GMT 2009)</TH></TR><TR><TD CLASS="nv">[<A HREF="../xslUnitTestCoverage.html">all classes</A>][<A HREF="98.html">org.eclipse.wst.sse.core.internal.text</A>]</TD></TR></TABLE><H2>COVERAGE SUMMARY FOR SOURCE FILE [<SPAN CLASS="in">BasicStructuredDocument.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>BasicStructuredDocument.java</TD><TD CLASS="h">60%  (3/5)</TD><TD CLASS="h">52%  (89/171)</TD><TD CLASS="h">46%  (1590/3490)</TD><TD CLASS="h">47%  (433.7/919)</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">BasicStructuredDocument$RegisteredReplace</A></TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/12)</TD><TD CLASS="h">0%   (0/4)</TD></TR><TR><TD CLASS="f"><A HREF="#0">BasicStructuredDocument$RegisteredReplace (BasicStructuredDocument, IDocument...</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/12)</TD><TD CLASS="h">0%   (0/4)</TD></TR><TR><TD CLASS="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">BasicStructuredDocument$StructuredDocumentRewriteSession</A></TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/7)</TD><TD CLASS="h">0%   (0/2)</TD></TR><TR><TD CLASS="f"><A HREF="#2">BasicStructuredDocument$StructuredDocumentRewriteSession (BasicStructuredDocu...</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/7)</TD><TD CLASS="h">0%   (0/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="#4">BasicStructuredDocument</A></TD><TD>100% (1/1)</TD><TD CLASS="h">51%  (81/160)</TD><TD CLASS="h">44%  (1461/3315)</TD><TD CLASS="h">46%  (399.7/869)</TD></TR><TR><TD CLASS="f"><A HREF="#5">_fireEvent (Object [], NoChangeEvent): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/23)</TD><TD CLASS="h">0%   (0/7)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#6">_fireEvent (Object [], RegionChangedEvent): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/23)</TD><TD CLASS="h">0%   (0/7)</TD></TR><TR><TD CLASS="f"><A HREF="#7">_fireEvent (Object [], RegionsReplacedEvent): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/23)</TD><TD CLASS="h">0%   (0/7)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#8">acquireLock (): 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="#9">addPosition (Position): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/5)</TD><TD CLASS="h">0%   (0/2)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#a">addPosition (String, Position): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/6)</TD><TD CLASS="h">0%   (0/2)</TD></TR><TR><TD CLASS="f"><A HREF="#b">charAt (int): char</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/9)</TD><TD CLASS="h">0%   (0/3)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#c">clearReadOnly (): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/27)</TD><TD CLASS="h">0%   (0/8)</TD></TR><TR><TD CLASS="f"><A HREF="#d">computeIndexInCategory (String, int): int</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 CLASS="o"><TD CLASS="f"><A HREF="#e">computeNumberOfLines (String): int</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/5)</TD><TD CLASS="h">0%   (0/1)</TD></TR><TR><TD CLASS="f"><A HREF="#f">computePartitioning (int, int): ITypedRegion []</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/24)</TD><TD CLASS="h">0%   (0/7)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#10">containsPosition (String, int, int): boolean</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/7)</TD><TD CLASS="h">0%   (0/1)</TD></TR><TR><TD CLASS="f"><A HREF="#11">containsPositionCategory (String): boolean</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/5)</TD><TD CLASS="h">0%   (0/1)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#12">fireDocumentRewriteSessionEvent (DocumentRewriteSessionEvent): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/29)</TD><TD CLASS="h">0%   (0/8)</TD></TR><TR><TD CLASS="f"><A HREF="#13">fireReadOnlyAboutToBeChanged (): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/5)</TD><TD CLASS="h">0%   (0/2)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#14">fireReadOnlyStructuredDocumentEvent (NoChangeEvent): void</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><TD CLASS="f"><A HREF="#15">fireStructuredDocumentEvent (NoChangeEvent): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/26)</TD><TD CLASS="h">0%   (0/7)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#16">fireStructuredDocumentEvent (RegionChangedEvent): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/26)</TD><TD CLASS="h">0%   (0/7)</TD></TR><TR><TD CLASS="f"><A HREF="#17">fireStructuredDocumentEvent (RegionsReplacedEvent): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/26)</TD><TD CLASS="h">0%   (0/7)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#18">getActiveRewriteSession (): DocumentRewriteSession</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="#19">getAdapter (Class): Object</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/5)</TD><TD CLASS="h">0%   (0/1)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#1a">getContentType (int): String</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/5)</TD><TD CLASS="h">0%   (0/1)</TD></TR><TR><TD CLASS="f"><A HREF="#1b">getDefaultLineDelimiter (): String</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/57)</TD><TD CLASS="h">0%   (0/17)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#1c">getEncodingMemento (): EncodingMemento</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="#1d">getLastStructuredDocumentRegion (): IStructuredDocumentRegion</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/7)</TD><TD CLASS="h">0%   (0/2)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#1e">getLegalContentTypes (): String []</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/16)</TD><TD CLASS="h">0%   (0/5)</TD></TR><TR><TD CLASS="f"><A HREF="#1f">getLegalContentTypes (String): String []</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/24)</TD><TD CLASS="h">0%   (0/6)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#20">getLegalLineDelimiters (): String []</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><TD CLASS="f"><A HREF="#21">getLineDelimiter (): String</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="#22">getLineDelimiter (int): String</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/5)</TD><TD CLASS="h">0%   (0/1)</TD></TR><TR><TD CLASS="f"><A HREF="#23">getLineLength (int): int</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/5)</TD><TD CLASS="h">0%   (0/1)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#24">getNextModificationStamp (): long</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/23)</TD><TD CLASS="h">0%   (0/4)</TD></TR><TR><TD CLASS="f"><A HREF="#25">getNumberOfLines (int, int): int</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 CLASS="o"><TD CLASS="f"><A HREF="#26">getPartition (int): ITypedRegion</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/23)</TD><TD CLASS="h">0%   (0/7)</TD></TR><TR><TD CLASS="f"><A HREF="#27">getPartitionings (): String []</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/19)</TD><TD CLASS="h">0%   (0/5)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#28">getPositionCategories (): String []</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><TD CLASS="f"><A HREF="#29">getPositionUpdaters (): IPositionUpdater []</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="#2a">getPreferredLineDelimiter (): String</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="#2b">getStructuredDocumentRegions (): IStructuredDocumentRegion []</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 CLASS="o"><TD CLASS="f"><A HREF="#2c">getText (): String</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/5)</TD><TD CLASS="h">0%   (0/2)</TD></TR><TR><TD CLASS="f"><A HREF="#2d">insertPositionUpdater (IPositionUpdater, int): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/6)</TD><TD CLASS="h">0%   (0/2)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#2e">internalGet (int, int): String</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/10)</TD><TD CLASS="h">0%   (0/3)</TD></TR><TR><TD CLASS="f"><A HREF="#2f">internalStartRewriteSession (DocumentRewriteSessionType): DocumentRewriteSession</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="#30">internalStopRewriteSession (DocumentRewriteSession): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/46)</TD><TD CLASS="h">0%   (0/13)</TD></TR><TR><TD CLASS="f"><A HREF="#31">length (): int</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="#32">makeReadOnly (int, int): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/7)</TD><TD CLASS="h">0%   (0/2)</TD></TR><TR><TD CLASS="f"><A HREF="#33">makeReadOnly (int, int, boolean, boolean): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/59)</TD><TD CLASS="h">0%   (0/15)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#34">newInstance (): IStructuredDocument</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/40)</TD><TD CLASS="h">0%   (0/9)</TD></TR><TR><TD CLASS="f"><A HREF="#35">regionMatches (int, int, String): boolean</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/25)</TD><TD CLASS="h">0%   (0/6)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#36">regionMatchesIgnoreCase (int, int, String): boolean</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/25)</TD><TD CLASS="h">0%   (0/6)</TD></TR><TR><TD CLASS="f"><A HREF="#37">registerPostNotificationReplace (IDocumentListener, IDocumentExtension$IRepla...</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/23)</TD><TD CLASS="h">0%   (0/5)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#38">releaseLock (): 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="#39">removePosition (Position): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/5)</TD><TD CLASS="h">0%   (0/2)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#3a">removePosition (String, Position): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/6)</TD><TD CLASS="h">0%   (0/2)</TD></TR><TR><TD CLASS="f"><A HREF="#3b">reparse (Object): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/46)</TD><TD CLASS="h">0%   (0/13)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#3c">replace (int, int, String): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/8)</TD><TD CLASS="h">0%   (0/2)</TD></TR><TR><TD CLASS="f"><A HREF="#3d">replace (int, int, String, long): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/10)</TD><TD CLASS="h">0%   (0/2)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#3e">replaceText (Object, int, int, String): StructuredDocumentEvent</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/27)</TD><TD CLASS="h">0%   (0/3)</TD></TR><TR><TD CLASS="f"><A HREF="#3f">replaceText (Object, int, int, String, boolean): StructuredDocumentEvent</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/23)</TD><TD CLASS="h">0%   (0/4)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#40">resetParser (Reader, int): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/8)</TD><TD CLASS="h">0%   (0/3)</TD></TR><TR><TD CLASS="f"><A HREF="#41">search (int, String, boolean, boolean, boolean): int</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/24)</TD><TD CLASS="h">0%   (0/6)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#42">set (String): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/6)</TD><TD CLASS="h">0%   (0/2)</TD></TR><TR><TD CLASS="f"><A HREF="#43">setFirstDocumentRegion (IStructuredDocumentRegion): 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 CLASS="o"><TD CLASS="f"><A HREF="#44">setInitialLineDelimiter (String): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/31)</TD><TD CLASS="h">0%   (0/6)</TD></TR><TR><TD CLASS="f"><A HREF="#45">setLastDocumentRegion (IStructuredDocumentRegion): 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 CLASS="o"><TD CLASS="f"><A HREF="#46">setLineDelimiter (String): 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="#47">setParser (RegionParser): 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 CLASS="o"><TD CLASS="f"><A HREF="#48">setPositionManager (GenericPositionManager): 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="#49">setPreferredLineDelimiter (String): 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 CLASS="o"><TD CLASS="f"><A HREF="#4a">setText (Object, String): StructuredDocumentEvent</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/15)</TD><TD CLASS="h">0%   (0/3)</TD></TR><TR><TD CLASS="f"><A HREF="#4b">setUSE_LOCAL_THREAD (boolean): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/3)</TD><TD CLASS="h">0%   (0/2)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#4c">setUndoManager (IStructuredTextUndoManager): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/16)</TD><TD CLASS="h">0%   (0/4)</TD></TR><TR><TD CLASS="f"><A HREF="#4d">startRewriteSession (DocumentRewriteSessionType): DocumentRewriteSession</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="#4e">startRewriteSessionOnPartitioners (DocumentRewriteSession): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/25)</TD><TD CLASS="h">0%   (0/8)</TD></TR><TR><TD CLASS="f"><A HREF="#4f">startSequentialRewrite (boolean): 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 CLASS="o"><TD CLASS="f"><A HREF="#50">stopRewriteSession (DocumentRewriteSession): 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="#51">stopRewriteSessionOnPartitioners (DocumentRewriteSession): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/49)</TD><TD CLASS="h">0%   (0/13)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#52">stopSequentialRewrite (): 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="#53">subSequence (int, int): CharSequence</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/5)</TD><TD CLASS="h">0%   (0/1)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#54">_fireStructuredDocumentAboutToChange (Object []): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">6%   (3/47)</TD><TD CLASS="h">20%  (2/10)</TD></TR><TR><TD CLASS="f"><A HREF="#55">fireDocumentPartitioningChanged (DocumentPartitioningChangedEvent): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">8%   (4/51)</TD><TD CLASS="h">10%  (1.4/14)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#56">_fireDocumentChanged (Object [], StructuredDocumentEvent): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">9%   (3/35)</TD><TD CLASS="h">22%  (2/9)</TD></TR><TR><TD CLASS="f"><A HREF="#57">_fireEvent (Object [], StructuredDocumentRegionsReplacedEvent): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">13%  (3/23)</TD><TD CLASS="h">29%  (2/7)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#58">_fireDocumentAboutToChange (Object []): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">18%  (6/33)</TD><TD CLASS="h">33%  (3/9)</TD></TR><TR><TD CLASS="f"><A HREF="#59">executePostNotificationChanges (): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">23%  (7/31)</TD><TD CLASS="h">30%  (3/10)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#5a">clearReadOnly (int, int): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">27%  (13/48)</TD><TD CLASS="h">24%  (2.9/12)</TD></TR><TR><TD CLASS="f"><A HREF="#5b">get (int, int): String</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">40%  (24/60)</TD><TD CLASS="h">47%  (8/17)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#5c">getLineOfOffset (int): int</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">40%  (10/25)</TD><TD CLASS="h">43%  (3/7)</TD></TR><TR><TD CLASS="f"><A HREF="#5d">getReParser (): IStructuredTextReParser</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">40%  (6/15)</TD><TD CLASS="h">50%  (2/4)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#5e">removePrenotifiedDocumentListener (IDocumentListener): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">41%  (24/59)</TD><TD CLASS="h">42%  (5.8/14)</TD></TR><TR><TD CLASS="f"><A HREF="#5f">computePartitioning (String, int, int, boolean): ITypedRegion []</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">44%  (24/55)</TD><TD CLASS="h">50%  (5/10)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#60">addPrenotifiedDocumentListener (IDocumentListener): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">44%  (21/48)</TD><TD CLASS="h">48%  (4.8/10)</TD></TR><TR><TD CLASS="f"><A HREF="#61">getPartition (String, int, boolean): ITypedRegion</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">46%  (24/52)</TD><TD CLASS="h">58%  (7/12)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#62">internalReplaceText (Object, int, int, String, long, boolean): StructuredDocu...</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">47%  (82/173)</TD><TD CLASS="h">57%  (23.4/41)</TD></TR><TR><TD CLASS="f"><A HREF="#63">containsReadOnly (int, int): boolean</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">50%  (16/32)</TD><TD CLASS="h">39%  (3.9/10)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#64">getParser (): RegionParser</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">55%  (6/11)</TD><TD CLASS="h">67%  (2/3)</TD></TR><TR><TD CLASS="f"><A HREF="#65">updateDeletedFields (StructuredDocumentRegionsReplacedEvent): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">58%  (11/19)</TD><TD CLASS="h">51%  (2.6/5)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#66">getChar (int): char</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">59%  (10/17)</TD><TD CLASS="h">60%  (3/5)</TD></TR><TR><TD CLASS="f"><A HREF="#67">setDocumentPartitioner (String, IDocumentPartitioner): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">66%  (31/47)</TD><TD CLASS="h">67%  (8/12)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#68">getContentType (String, int, boolean): String</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">69%  (27/39)</TD><TD CLASS="h">70%  (7/10)</TD></TR><TR><TD CLASS="f"><A HREF="#69">resetParser (int, int): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">69%  (25/36)</TD><TD CLASS="h">75%  (6/8)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#6a">addDocumentChangingListener (IStructuredDocumentListener): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">72%  (38/53)</TD><TD>81%  (9.7/12)</TD></TR><TR><TD CLASS="f"><A HREF="#6b">setCachedDocumentRegion (IStructuredDocumentRegion): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">73%  (8/11)</TD><TD CLASS="h">75%  (3/4)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#6c">addDocumentAboutToChangeListener (IModelAboutToBeChangedListener): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">73%  (38/52)</TD><TD>82%  (9.8/12)</TD></TR><TR><TD CLASS="f"><A HREF="#6d">notifyDocumentPartitionersDocumentChanged (DocumentEvent): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">74%  (25/34)</TD><TD CLASS="h">70%  (7/10)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#6e">fireDocumentAboutToChanged (): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">77%  (20/26)</TD><TD>86%  (6/7)</TD></TR><TR><TD CLASS="f"><A HREF="#6f">getCachedDocumentRegion (): IStructuredDocumentRegion</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">79%  (11/14)</TD><TD>80%  (4/5)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#70">removeDocumentAboutToChangeListener (IModelAboutToBeChangedListener): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>81%  (48/59)</TD><TD>90%  (10.8/12)</TD></TR><TR><TD CLASS="f"><A HREF="#71">removeDocumentChangingListener (IStructuredDocumentListener): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>81%  (48/59)</TD><TD>90%  (10.8/12)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#72">getStructuredDocumentRegions (int, int): IStructuredDocumentRegion []</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>85%  (53/62)</TD><TD>90%  (15.4/17)</TD></TR><TR><TD CLASS="f"><A HREF="#73">removeDocumentPartitioningListener (IDocumentPartitioningListener): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>86%  (19/22)</TD><TD>96%  (4.8/5)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#74">removeDocumentRewriteSessionListener (IDocumentRewriteSessionListener): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>86%  (19/22)</TD><TD>96%  (4.8/5)</TD></TR><TR><TD CLASS="f"><A HREF="#75">notifyDocumentPartitionersAboutToChange (DocumentEvent): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>88%  (21/24)</TD><TD CLASS="h">75%  (6/8)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#76">getRegionAtCharacterOffset (int): IStructuredDocumentRegion</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>89%  (58/65)</TD><TD>87%  (20/23)</TD></TR><TR><TD CLASS="f"><A HREF="#77">addDocumentPartitioningListener (IDocumentPartitioningListener): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>91%  (30/33)</TD><TD>97%  (6.8/7)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#78">addDocumentRewriteSessionListener (IDocumentRewriteSessionListener): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>91%  (30/33)</TD><TD>97%  (6.8/7)</TD></TR><TR><TD CLASS="f"><A HREF="#79">updateDocumentData (int, int, String): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>94%  (44/47)</TD><TD>82%  (9/11)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#7a">addDocumentChangedListener (IStructuredDocumentListener): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>94%  (50/53)</TD><TD>98%  (11.8/12)</TD></TR><TR><TD CLASS="f"><A HREF="#7b">addDocumentListener (IDocumentListener): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>95%  (52/55)</TD><TD>99%  (12.8/13)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#7c">removeDocumentChangedListener (IStructuredDocumentListener): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>95%  (56/59)</TD><TD>98%  (11.8/12)</TD></TR><TR><TD CLASS="f"><A HREF="#7d">removeDocumentListener (IDocumentListener): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>95%  (56/59)</TD><TD>98%  (11.8/12)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#4">&lt;static initializer&gt;</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (3/3)</TD><TD>100% (2/2)</TD></TR><TR><TD CLASS="f"><A HREF="#7f">BasicStructuredDocument (): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (56/56)</TD><TD>100% (14/14)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#80">BasicStructuredDocument (RegionParser): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (9/9)</TD><TD>100% (4/4)</TD></TR><TR><TD CLASS="f"><A HREF="#81">_clearDocumentEvent (): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (4/4)</TD><TD>100% (2/2)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#82">addPositionCategory (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="f"><A HREF="#83">addPositionUpdater (IPositionUpdater): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (4/4)</TD><TD>100% (2/2)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#84">fireStructuredDocumentEvent (StructuredDocumentRegionsReplacedEvent): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (26/26)</TD><TD>100% (7/7)</TD></TR><TR><TD CLASS="f"><A HREF="#85">get (): String</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (7/7)</TD><TD>100% (1/1)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#86">getDocumentPartitioner (): IDocumentPartitioner</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (4/4)</TD><TD>100% (1/1)</TD></TR><TR><TD CLASS="f"><A HREF="#87">getDocumentPartitioner (String): IDocumentPartitioner</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (13/13)</TD><TD>100% (4/4)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#88">getFirstStructuredDocumentRegion (): IStructuredDocumentRegion</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="#89">getLength (): 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="#8a">getLineInformation (int): IRegion</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="#8b">getLineInformationOfOffset (int): IRegion</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (5/5)</TD><TD>100% (1/1)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#8c">getLineOffset (int): int</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="#8d">getModificationStamp (): long</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (3/3)</TD><TD>100% (1/1)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#8e">getNumberOfLines (): int</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (4/4)</TD><TD>100% (1/1)</TD></TR><TR><TD CLASS="f"><A HREF="#8f">getPositionManager (): GenericPositionManager</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (12/12)</TD><TD>100% (3/3)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#90">getPositions (String): Position []</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="#91">getRegionList (): IStructuredDocumentRegionList</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (19/19)</TD><TD>100% (5/5)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#92">getStore (): ITextStore</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="#93">getTracker (): ILineTracker</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (3/3)</TD><TD>100% (1/1)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#94">getUndoManager (): IStructuredTextUndoManager</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="#95">initializeFirstAndLastDocumentRegion (): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (22/22)</TD><TD>100% (8/8)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#96">internal_addPositionCategory (String): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (5/5)</TD><TD>100% (2/2)</TD></TR><TR><TD CLASS="f"><A HREF="#97">internal_addPositionUpdater (IPositionUpdater): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (5/5)</TD><TD>100% (2/2)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#98">internal_setParser (RegionParser): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (4/4)</TD><TD>100% (2/2)</TD></TR><TR><TD CLASS="f"><A HREF="#99">removePositionCategory (String): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (5/5)</TD><TD>100% (2/2)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#9a">removePositionUpdater (IPositionUpdater): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (5/5)</TD><TD>100% (2/2)</TD></TR><TR><TD CLASS="f"><A HREF="#9b">replaceText (Object, int, int, String, long, boolean): StructuredDocumentEvent</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (11/11)</TD><TD>100% (2/2)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#9c">resumePostNotificationProcessing (): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (15/15)</TD><TD>100% (4/4)</TD></TR><TR><TD CLASS="f"><A HREF="#9d">set (String, long): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (11/11)</TD><TD>100% (2/2)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#9e">setDocumentPartitioner (IDocumentPartitioner): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (5/5)</TD><TD>100% (2/2)</TD></TR><TR><TD CLASS="f"><A HREF="#9f">setEncodingMemento (EncodingMemento): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (4/4)</TD><TD>100% (2/2)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#a0">setLineTracker (ILineTracker): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (6/6)</TD><TD>100% (3/3)</TD></TR><TR><TD CLASS="f"><A HREF="#a1">setReParser (IStructuredTextReParser): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (11/11)</TD><TD>100% (4/4)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#a2">setTextStore (ITextStore): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (6/6)</TD><TD>100% (3/3)</TD></TR><TR><TD CLASS="f"><A HREF="#a3">stopPostNotificationProcessing (): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (7/7)</TD><TD>100% (2/2)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#a4">updateModel (Object, int, int, String): StructuredDocumentEvent</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (19/19)</TD><TD>100% (6/6)</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="#a5">BasicStructuredDocument$CurrentDocumentRegionCache</A></TD><TD>100% (1/1)</TD><TD>86%  (6/7)</TD><TD>80%  (111/138)</TD><TD CLASS="h">75%  (30/40)</TD></TR><TR><TD CLASS="f"><A HREF="#a6">set (int, IStructuredDocumentRegion): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/7)</TD><TD CLASS="h">0%   (0/2)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#a7">set (IStructuredDocumentRegion): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">61%  (11/18)</TD><TD CLASS="h">50%  (3/6)</TD></TR><TR><TD CLASS="f"><A HREF="#a8">get (): IStructuredDocumentRegion</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">70%  (23/33)</TD><TD CLASS="h">64%  (7/11)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#a9">reinitThreadLocalPosition (): int</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>90%  (27/30)</TD><TD>86%  (6/7)</TD></TR><TR><TD CLASS="f"><A HREF="#a5">BasicStructuredDocument$CurrentDocumentRegionCache (BasicStructuredDocument):...</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (23/23)</TD><TD>100% (5/5)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#ab">getThreadLocalPosition (): int</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (18/18)</TD><TD>100% (6/6)</TD></TR><TR><TD CLASS="f"><A HREF="#ac">resetToInitialState (): IStructuredDocumentRegion</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (9/9)</TD><TD>100% (3/3)</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="#ad">BasicStructuredDocument$NullDocumentEvent</A></TD><TD>100% (1/1)</TD><TD>100% (2/2)</TD><TD>100% (18/18)</TD><TD>100% (4/4)</TD></TR><TR><TD CLASS="f"><A HREF="#ad">BasicStructuredDocument$NullDocumentEvent (BasicStructuredDocument): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (8/8)</TD><TD>100% (2/2)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#af">BasicStructuredDocument$NullDocumentEvent (BasicStructuredDocument, IDocument...</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (10/10)</TD><TD>100% (2/2)</TD></TR></TABLE><P></P><TABLE CLASS="s" CELLSPACING="0" WIDTH="100%"><TR><TD CLASS="l">1</TD><TD>/*******************************************************************************</TD></TR><TR><TD CLASS="l">2</TD><TD> * Copyright (c) 2001, 2008 IBM Corporation and others.</TD></TR><TR><TD CLASS="l">3</TD><TD> * All rights reserved. This program and the accompanying materials</TD></TR><TR><TD CLASS="l">4</TD><TD> * are made available under the terms of the Eclipse Public License v1.0</TD></TR><TR><TD CLASS="l">5</TD><TD> * which accompanies this distribution, and is available at</TD></TR><TR><TD CLASS="l">6</TD><TD> * http://www.eclipse.org/legal/epl-v10.html</TD></TR><TR><TD CLASS="l">7</TD><TD> * </TD></TR><TR><TD CLASS="l">8</TD><TD> * Contributors:</TD></TR><TR><TD CLASS="l">9</TD><TD> *     IBM Corporation - initial API and implementation</TD></TR><TR><TD CLASS="l">10</TD><TD> *     Jens Lukowski/Innoopract - initial renaming/restructuring</TD></TR><TR><TD CLASS="l">11</TD><TD> *     Jesper Steen M�ller - initial IDocumentExtension4 support - #102822</TD></TR><TR><TD CLASS="l">12</TD><TD> *                           (see also #239115)</TD></TR><TR><TD CLASS="l">13</TD><TD> *     </TD></TR><TR><TD CLASS="l">14</TD><TD> *******************************************************************************/</TD></TR><TR><TD CLASS="l">15</TD><TD>package org.eclipse.wst.sse.core.internal.text;</TD></TR><TR><TD CLASS="l">16</TD><TD> </TD></TR><TR><TD CLASS="l">17</TD><TD>import java.io.Reader;</TD></TR><TR><TD CLASS="l">18</TD><TD>import java.util.ArrayList;</TD></TR><TR><TD CLASS="l">19</TD><TD>import java.util.Collections;</TD></TR><TR><TD CLASS="l">20</TD><TD>import java.util.HashMap;</TD></TR><TR><TD CLASS="l">21</TD><TD>import java.util.Iterator;</TD></TR><TR><TD CLASS="l">22</TD><TD>import java.util.List;</TD></TR><TR><TD CLASS="l">23</TD><TD>import java.util.Map;</TD></TR><TR><TD CLASS="l">24</TD><TD> </TD></TR><TR><TD CLASS="l">25</TD><TD>import org.eclipse.core.runtime.Platform;</TD></TR><TR><TD CLASS="l">26</TD><TD>import org.eclipse.core.runtime.preferences.IScopeContext;</TD></TR><TR><TD CLASS="l">27</TD><TD>import org.eclipse.core.runtime.preferences.InstanceScope;</TD></TR><TR><TD CLASS="l">28</TD><TD>import org.eclipse.jface.text.BadLocationException;</TD></TR><TR><TD CLASS="l">29</TD><TD>import org.eclipse.jface.text.BadPartitioningException;</TD></TR><TR><TD CLASS="l">30</TD><TD>import org.eclipse.jface.text.BadPositionCategoryException;</TD></TR><TR><TD CLASS="l">31</TD><TD>import org.eclipse.jface.text.DefaultLineTracker;</TD></TR><TR><TD CLASS="l">32</TD><TD>import org.eclipse.jface.text.DocumentEvent;</TD></TR><TR><TD CLASS="l">33</TD><TD>import org.eclipse.jface.text.DocumentPartitioningChangedEvent;</TD></TR><TR><TD CLASS="l">34</TD><TD>import org.eclipse.jface.text.DocumentRewriteSession;</TD></TR><TR><TD CLASS="l">35</TD><TD>import org.eclipse.jface.text.DocumentRewriteSessionEvent;</TD></TR><TR><TD CLASS="l">36</TD><TD>import org.eclipse.jface.text.DocumentRewriteSessionType;</TD></TR><TR><TD CLASS="l">37</TD><TD>import org.eclipse.jface.text.FindReplaceDocumentAdapter;</TD></TR><TR><TD CLASS="l">38</TD><TD>import org.eclipse.jface.text.IDocument;</TD></TR><TR><TD CLASS="l">39</TD><TD>import org.eclipse.jface.text.IDocumentExtension;</TD></TR><TR><TD CLASS="l">40</TD><TD>import org.eclipse.jface.text.IDocumentExtension3;</TD></TR><TR><TD CLASS="l">41</TD><TD>import org.eclipse.jface.text.IDocumentExtension4;</TD></TR><TR><TD CLASS="l">42</TD><TD>import org.eclipse.jface.text.IDocumentListener;</TD></TR><TR><TD CLASS="l">43</TD><TD>import org.eclipse.jface.text.IDocumentPartitioner;</TD></TR><TR><TD CLASS="l">44</TD><TD>import org.eclipse.jface.text.IDocumentPartitionerExtension;</TD></TR><TR><TD CLASS="l">45</TD><TD>import org.eclipse.jface.text.IDocumentPartitionerExtension2;</TD></TR><TR><TD CLASS="l">46</TD><TD>import org.eclipse.jface.text.IDocumentPartitionerExtension3;</TD></TR><TR><TD CLASS="l">47</TD><TD>import org.eclipse.jface.text.IDocumentPartitioningListener;</TD></TR><TR><TD CLASS="l">48</TD><TD>import org.eclipse.jface.text.IDocumentPartitioningListenerExtension;</TD></TR><TR><TD CLASS="l">49</TD><TD>import org.eclipse.jface.text.IDocumentPartitioningListenerExtension2;</TD></TR><TR><TD CLASS="l">50</TD><TD>import org.eclipse.jface.text.IDocumentRewriteSessionListener;</TD></TR><TR><TD CLASS="l">51</TD><TD>import org.eclipse.jface.text.ILineTracker;</TD></TR><TR><TD CLASS="l">52</TD><TD>import org.eclipse.jface.text.ILineTrackerExtension;</TD></TR><TR><TD CLASS="l">53</TD><TD>import org.eclipse.jface.text.IPositionUpdater;</TD></TR><TR><TD CLASS="l">54</TD><TD>import org.eclipse.jface.text.IRegion;</TD></TR><TR><TD CLASS="l">55</TD><TD>import org.eclipse.jface.text.ITextStore;</TD></TR><TR><TD CLASS="l">56</TD><TD>import org.eclipse.jface.text.ITypedRegion;</TD></TR><TR><TD CLASS="l">57</TD><TD>import org.eclipse.jface.text.Position;</TD></TR><TR><TD CLASS="l">58</TD><TD>import org.eclipse.jface.text.TypedRegion;</TD></TR><TR><TD CLASS="l">59</TD><TD>import org.eclipse.wst.sse.core.internal.Logger;</TD></TR><TR><TD CLASS="l">60</TD><TD>import org.eclipse.wst.sse.core.internal.document.StructuredDocumentFactory;</TD></TR><TR><TD CLASS="l">61</TD><TD>import org.eclipse.wst.sse.core.internal.encoding.EncodingMemento;</TD></TR><TR><TD CLASS="l">62</TD><TD>import org.eclipse.wst.sse.core.internal.ltk.parser.RegionParser;</TD></TR><TR><TD CLASS="l">63</TD><TD>import org.eclipse.wst.sse.core.internal.provisional.events.AboutToBeChangedEvent;</TD></TR><TR><TD CLASS="l">64</TD><TD>import org.eclipse.wst.sse.core.internal.provisional.events.IModelAboutToBeChangedListener;</TD></TR><TR><TD CLASS="l">65</TD><TD>import org.eclipse.wst.sse.core.internal.provisional.events.IStructuredDocumentListener;</TD></TR><TR><TD CLASS="l">66</TD><TD>import org.eclipse.wst.sse.core.internal.provisional.events.NoChangeEvent;</TD></TR><TR><TD CLASS="l">67</TD><TD>import org.eclipse.wst.sse.core.internal.provisional.events.RegionChangedEvent;</TD></TR><TR><TD CLASS="l">68</TD><TD>import org.eclipse.wst.sse.core.internal.provisional.events.RegionsReplacedEvent;</TD></TR><TR><TD CLASS="l">69</TD><TD>import org.eclipse.wst.sse.core.internal.provisional.events.StructuredDocumentEvent;</TD></TR><TR><TD CLASS="l">70</TD><TD>import org.eclipse.wst.sse.core.internal.provisional.events.StructuredDocumentRegionsReplacedEvent;</TD></TR><TR><TD CLASS="l">71</TD><TD>import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;</TD></TR><TR><TD CLASS="l">72</TD><TD>import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;</TD></TR><TR><TD CLASS="l">73</TD><TD>import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegionList;</TD></TR><TR><TD CLASS="l">74</TD><TD>import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredPartitioning;</TD></TR><TR><TD CLASS="l">75</TD><TD>import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredTextReParser;</TD></TR><TR><TD CLASS="l">76</TD><TD>import org.eclipse.wst.sse.core.internal.text.rules.StructuredTextPartitioner;</TD></TR><TR><TD CLASS="l">77</TD><TD>import org.eclipse.wst.sse.core.internal.undo.IStructuredTextUndoManager;</TD></TR><TR><TD CLASS="l">78</TD><TD>import org.eclipse.wst.sse.core.internal.undo.StructuredTextUndoManager;</TD></TR><TR><TD CLASS="l">79</TD><TD>import org.eclipse.wst.sse.core.internal.util.Assert;</TD></TR><TR><TD CLASS="l">80</TD><TD>import org.eclipse.wst.sse.core.internal.util.Debug;</TD></TR><TR><TD CLASS="l">81</TD><TD>import org.eclipse.wst.sse.core.internal.util.Utilities;</TD></TR><TR><TD CLASS="l">82</TD><TD> </TD></TR><TR><TD CLASS="l">83</TD><TD> </TD></TR><TR><TD CLASS="l">84</TD><TD>/**</TD></TR><TR><TD CLASS="l">85</TD><TD> * The standard implementation of structured document.</TD></TR><TR><TD CLASS="l">86</TD><TD> */</TD></TR><TR CLASS="c"><TD CLASS="l">87</TD><TD>public class BasicStructuredDocument implements IStructuredDocument, IDocumentExtension, IDocumentExtension3, IDocumentExtension4, CharSequence, IRegionComparible {</TD></TR><TR><TD CLASS="l">88</TD><TD> </TD></TR><TR><TD CLASS="l">89</TD><TD>        /**</TD></TR><TR><TD CLASS="l">90</TD><TD>         * This ThreadLocal construct is used so each thread can maintain its only</TD></TR><TR><TD CLASS="l">91</TD><TD>         * pointer to the double linked list that manages the documents regions.</TD></TR><TR><TD CLASS="l">92</TD><TD>         * The only thing we &#34;gaurd&#34; for is that a previously cached region has</TD></TR><TR><TD CLASS="l">93</TD><TD>         * been deleted.</TD></TR><TR><TD CLASS="l">94</TD><TD>         * </TD></TR><TR><TD CLASS="l"><A NAME="a5">95</A></TD><TD>         * The object that is kept in the thread local's map, is just a pointer to</TD></TR><TR><TD CLASS="l">96</TD><TD>         * an array position. That's because the object there needs to be &#34;free&#34;</TD></TR><TR><TD CLASS="l">97</TD><TD>         * from references to other objects, or it will not be garbage collected.</TD></TR><TR><TD CLASS="l">98</TD><TD>         */</TD></TR><TR CLASS="c"><TD CLASS="l">99</TD><TD>        private class CurrentDocumentRegionCache {</TD></TR><TR><TD CLASS="l">100</TD><TD>                // I'm assuming for now there would never be so many threads that</TD></TR><TR><TD CLASS="l">101</TD><TD>                // this arrayList needs to be bounded, or 'cleaned up'.</TD></TR><TR><TD CLASS="l">102</TD><TD>                // this assumption should be tested in practice and long running</TD></TR><TR><TD CLASS="l">103</TD><TD>                // jobs -- found not to be a good assumption. See below.</TD></TR><TR CLASS="c"><TD CLASS="l">104</TD><TD>                private List cachedRegionPositionArray = Collections.synchronizedList(new ArrayList());</TD></TR><TR CLASS="c"><TD CLASS="l">105</TD><TD>                private final boolean DEBUG = false;</TD></TR><TR CLASS="c"><TD CLASS="l">106</TD><TD>                private final int MAX_SIZE = 50;</TD></TR><TR><TD CLASS="l">107</TD><TD> </TD></TR><TR><TD CLASS="l"><A NAME="a8">108</A></TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">109</TD><TD>                private ThreadLocal threadLocalCachePosition = new ThreadLocal();</TD></TR><TR><TD CLASS="l">110</TD><TD> </TD></TR><TR><TD CLASS="l">111</TD><TD>                IStructuredDocumentRegion get() {</TD></TR><TR CLASS="c"><TD CLASS="l">112</TD><TD>                        IStructuredDocumentRegion region = null;</TD></TR><TR CLASS="c"><TD CLASS="l">113</TD><TD>                        int pos = getThreadLocalPosition();</TD></TR><TR><TD CLASS="l">114</TD><TD>                        try {</TD></TR><TR CLASS="c"><TD CLASS="l">115</TD><TD>                                region = (IStructuredDocumentRegion) cachedRegionPositionArray.get(pos);</TD></TR><TR><TD CLASS="l">116</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">117</TD><TD>                        catch (IndexOutOfBoundsException e) {</TD></TR><TR><TD CLASS="l">118</TD><TD>                                // even though the cachedRegionPosition is synchronized,</TD></TR><TR><TD CLASS="l">119</TD><TD>                                // that just means each access is syncronized, its</TD></TR><TR><TD CLASS="l">120</TD><TD>                                // still possible for another thread to cause it to</TD></TR><TR><TD CLASS="l">121</TD><TD>                                // be cleared, after this thread gets it position.</TD></TR><TR><TD CLASS="l">122</TD><TD>                                // So, if that happens, all we can do is reset to beginning.</TD></TR><TR><TD CLASS="l">123</TD><TD>                                // This should be extremely rare (in other words, probably</TD></TR><TR><TD CLASS="l">124</TD><TD>                                // not worth using synchronized blocks</TD></TR><TR><TD CLASS="l">125</TD><TD>                                // to access cachedRegionPositionArray.</TD></TR><TR CLASS="z"><TD CLASS="l">126</TD><TD>                                reinitThreadLocalPosition();</TD></TR><TR CLASS="z"><TD CLASS="l">127</TD><TD>                                resetToInitialState();</TD></TR><TR><TD CLASS="l">128</TD><TD>                        }</TD></TR><TR CLASS="c"><TD CLASS="l">129</TD><TD>                        if (region == null) {</TD></TR><TR CLASS="c"><TD CLASS="l">130</TD><TD>                                region = resetToInitialState();</TD></TR><TR><TD CLASS="l">131</TD><TD>                        }</TD></TR><TR><TD CLASS="l">132</TD><TD>                        else</TD></TR><TR><TD CLASS="l">133</TD><TD>                        // region not null</TD></TR><TR CLASS="c"><TD CLASS="l">134</TD><TD>                        if (region.isDeleted()) {</TD></TR><TR CLASS="z"><TD CLASS="l">135</TD><TD>                                region = resetToInitialState();</TD></TR><TR><TD CLASS="l">136</TD><TD>                        }</TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="ab">137</A></TD><TD>                        return region;</TD></TR><TR><TD CLASS="l">138</TD><TD>                }</TD></TR><TR><TD CLASS="l">139</TD><TD> </TD></TR><TR><TD CLASS="l">140</TD><TD>                private int getThreadLocalPosition() {</TD></TR><TR CLASS="c"><TD CLASS="l">141</TD><TD>                        Object threadLocalObject = threadLocalCachePosition.get();</TD></TR><TR CLASS="c"><TD CLASS="l">142</TD><TD>                        int pos = -1;</TD></TR><TR CLASS="c"><TD CLASS="l">143</TD><TD>                        if (threadLocalObject == null) {</TD></TR><TR><TD CLASS="l">144</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">145</TD><TD>                                pos = reinitThreadLocalPosition();</TD></TR><TR><TD CLASS="l">146</TD><TD>                        }</TD></TR><TR><TD CLASS="l">147</TD><TD>                        else {</TD></TR><TR CLASS="c"><TD CLASS="l">148</TD><TD>                                pos = ((Integer) threadLocalObject).intValue();</TD></TR><TR><TD CLASS="l">149</TD><TD>                        }</TD></TR><TR CLASS="c"><TD CLASS="l">150</TD><TD>                        return pos;</TD></TR><TR><TD CLASS="l">151</TD><TD>                }</TD></TR><TR><TD CLASS="l">152</TD><TD> </TD></TR><TR><TD CLASS="l">153</TD><TD>                /**</TD></TR><TR><TD CLASS="l">154</TD><TD>                 * @return</TD></TR><TR><TD CLASS="l">155</TD><TD>                 */</TD></TR><TR><TD CLASS="l">156</TD><TD>                private int reinitThreadLocalPosition() {</TD></TR><TR><TD CLASS="l">157</TD><TD>                        Integer position;</TD></TR><TR><TD CLASS="l">158</TD><TD>                        int pos;</TD></TR><TR><TD CLASS="l">159</TD><TD>                        // TODO_future: think of a better solution that doesn't</TD></TR><TR><TD CLASS="l">160</TD><TD>                        // require this kludge. This is especially required because</TD></TR><TR><TD CLASS="l">161</TD><TD>                        // some infrasture, such as reconciler, actually null out</TD></TR><TR><TD CLASS="l">162</TD><TD>                        // their thread object and recreate it, 500 msecs later</TD></TR><TR><TD CLASS="l"><A NAME="a9">163</A></TD><TD>                        // (approximately).</TD></TR><TR><TD CLASS="l">164</TD><TD>                        // Note: the likely solution in future is to clear after every</TD></TR><TR><TD CLASS="l">165</TD><TD>                        // heavy use of getCachedRegion, such as in creating node</TD></TR><TR><TD CLASS="l">166</TD><TD>                        // lists, or reparsing or partioning.</TD></TR><TR CLASS="c"><TD CLASS="l">167</TD><TD>                        if (cachedRegionPositionArray.size() &gt; MAX_SIZE) {</TD></TR><TR CLASS="z"><TD CLASS="l">168</TD><TD>                                cachedRegionPositionArray.clear();</TD></TR><TR><TD CLASS="l">169</TD><TD>                                if (DEBUG) {</TD></TR><TR><TD CLASS="l">170</TD><TD>                                        System.out.println(&#34;cachedRegionPositionArray cleared at size &#34; + MAX_SIZE); //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">171</TD><TD>                                }</TD></TR><TR><TD CLASS="l">172</TD><TD>                        }</TD></TR><TR CLASS="c"><TD CLASS="l">173</TD><TD>                        position = new Integer(cachedRegionPositionArray.size());</TD></TR><TR CLASS="c"><TD CLASS="l">174</TD><TD>                        threadLocalCachePosition.set(position);</TD></TR><TR CLASS="c"><TD CLASS="l">175</TD><TD>                        cachedRegionPositionArray.add(position.intValue(), null);</TD></TR><TR CLASS="c"><TD CLASS="l">176</TD><TD>                        pos = position.intValue();</TD></TR><TR CLASS="c"><TD CLASS="l">177</TD><TD>                        return pos;</TD></TR><TR><TD CLASS="l"><A NAME="ac">178</A></TD><TD>                }</TD></TR><TR><TD CLASS="l">179</TD><TD> </TD></TR><TR><TD CLASS="l">180</TD><TD>                private IStructuredDocumentRegion resetToInitialState() {</TD></TR><TR><TD CLASS="l">181</TD><TD>                        IStructuredDocumentRegion region;</TD></TR><TR CLASS="c"><TD CLASS="l">182</TD><TD>                        region = getFirstStructuredDocumentRegion();</TD></TR><TR CLASS="c"><TD CLASS="l">183</TD><TD>                        set(region);</TD></TR><TR CLASS="c"><TD CLASS="l">184</TD><TD>                        return region;</TD></TR><TR><TD CLASS="l"><A NAME="a6">185</A></TD><TD>                }</TD></TR><TR><TD CLASS="l">186</TD><TD> </TD></TR><TR><TD CLASS="l">187</TD><TD>                // TODO: make privite if used, else delete</TD></TR><TR><TD CLASS="l">188</TD><TD>                void set(int pos, IStructuredDocumentRegion region) {</TD></TR><TR CLASS="z"><TD CLASS="l">189</TD><TD>                        cachedRegionPositionArray.set(pos, region);</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="a7">190</A></TD><TD>                }</TD></TR><TR><TD CLASS="l">191</TD><TD> </TD></TR><TR><TD CLASS="l">192</TD><TD>                void set(IStructuredDocumentRegion region) {</TD></TR><TR><TD CLASS="l">193</TD><TD>                        try {</TD></TR><TR CLASS="c"><TD CLASS="l">194</TD><TD>                                int pos = getThreadLocalPosition();</TD></TR><TR CLASS="c"><TD CLASS="l">195</TD><TD>                                cachedRegionPositionArray.set(pos, region);</TD></TR><TR><TD CLASS="l">196</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">197</TD><TD>                        catch (IndexOutOfBoundsException e) {</TD></TR><TR><TD CLASS="l">198</TD><TD>                                // even though the cachedRegionPosition is synchronized,</TD></TR><TR><TD CLASS="l">199</TD><TD>                                // that just means each access is syncronized, its</TD></TR><TR><TD CLASS="l">200</TD><TD>                                // still possible for another thread to cause it to</TD></TR><TR><TD CLASS="l">201</TD><TD>                                // be cleared, after this thread gets it position.</TD></TR><TR><TD CLASS="l">202</TD><TD>                                // So, if that happens, all we can do is reset to beginning.</TD></TR><TR><TD CLASS="l">203</TD><TD>                                // This should be extremely rare (in other words, probably</TD></TR><TR><TD CLASS="l">204</TD><TD>                                // not worth using synchronized blocks</TD></TR><TR><TD CLASS="l">205</TD><TD>                                // to access cachedRegionPositionArray.</TD></TR><TR CLASS="z"><TD CLASS="l">206</TD><TD>                                reinitThreadLocalPosition();</TD></TR><TR CLASS="z"><TD CLASS="l">207</TD><TD>                                resetToInitialState();</TD></TR><TR><TD CLASS="l">208</TD><TD>                        }</TD></TR><TR CLASS="c"><TD CLASS="l">209</TD><TD>                }</TD></TR><TR><TD CLASS="l">210</TD><TD>        }</TD></TR><TR><TD CLASS="l">211</TD><TD> </TD></TR><TR><TD CLASS="l">212</TD><TD>        /**</TD></TR><TR><TD CLASS="l">213</TD><TD>         * This NullDocumentEvent is used to complete the &#34;aboutToChange&#34; and</TD></TR><TR><TD CLASS="l">214</TD><TD>         * &#34;changed&#34; cycle, when in fact the original change is no longer valid.</TD></TR><TR><TD CLASS="l">215</TD><TD>         * The only known (valid) case of this is when a model re-initialize takes</TD></TR><TR><TD CLASS="l">216</TD><TD>         * place, which causes setText to be called in the middle of some previous</TD></TR><TR><TD CLASS="l"><A NAME="ad">217</A></TD><TD>         * change. [This architecture will be improved in future].</TD></TR><TR><TD CLASS="l">218</TD><TD>         */</TD></TR><TR><TD CLASS="l">219</TD><TD>        public class NullDocumentEvent extends DocumentEvent {</TD></TR><TR><TD CLASS="l">220</TD><TD>                public NullDocumentEvent() {</TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="af">221</A></TD><TD>                        this(BasicStructuredDocument.this, 0, 0, &#34;&#34;); //$NON-NLS-1$</TD></TR><TR CLASS="c"><TD CLASS="l">222</TD><TD>                }</TD></TR><TR><TD CLASS="l">223</TD><TD> </TD></TR><TR><TD CLASS="l">224</TD><TD>                private NullDocumentEvent(IDocument doc, int offset, int length, String text) {</TD></TR><TR CLASS="c"><TD CLASS="l">225</TD><TD>                        super(doc, offset, length, text);</TD></TR><TR CLASS="c"><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>        class RegisteredReplace {</TD></TR><TR><TD CLASS="l">230</TD><TD>                /** The owner of this replace operation. */</TD></TR><TR><TD CLASS="l">231</TD><TD>                IDocumentListener fOwner;</TD></TR><TR><TD CLASS="l">232</TD><TD>                /** The replace operation */</TD></TR><TR><TD CLASS="l">233</TD><TD>                IDocumentExtension.IReplace fReplace;</TD></TR><TR><TD CLASS="l">234</TD><TD> </TD></TR><TR><TD CLASS="l">235</TD><TD>                /**</TD></TR><TR><TD CLASS="l">236</TD><TD>                 * Creates a new bundle object.</TD></TR><TR><TD CLASS="l">237</TD><TD>                 * </TD></TR><TR><TD CLASS="l">238</TD><TD>                 * @param owner</TD></TR><TR><TD CLASS="l"><A NAME="0">239</A></TD><TD>                 *            the document listener owning the replace operation</TD></TR><TR><TD CLASS="l">240</TD><TD>                 * @param replace</TD></TR><TR><TD CLASS="l">241</TD><TD>                 *            the replace operation</TD></TR><TR><TD CLASS="l">242</TD><TD>                 */</TD></TR><TR CLASS="z"><TD CLASS="l">243</TD><TD>                RegisteredReplace(IDocumentListener owner, IDocumentExtension.IReplace replace) {</TD></TR><TR CLASS="z"><TD CLASS="l">244</TD><TD>                        fOwner = owner;</TD></TR><TR CLASS="z"><TD CLASS="l">245</TD><TD>                        fReplace = replace;</TD></TR><TR CLASS="z"><TD CLASS="l">246</TD><TD>                }</TD></TR><TR><TD CLASS="l">247</TD><TD>        }</TD></TR><TR><TD CLASS="l">248</TD><TD> </TD></TR><TR><TD CLASS="l">249</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="4">250</A></TD><TD>         * these control variable isn't mark as 'final' since there's some unit</TD></TR><TR><TD CLASS="l">251</TD><TD>         * tests that manipulate it. For final product, it should be.</TD></TR><TR><TD CLASS="l">252</TD><TD>         */</TD></TR><TR><TD CLASS="l">253</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">254</TD><TD>        private static boolean USE_LOCAL_THREAD = true;</TD></TR><TR><TD CLASS="l">255</TD><TD> </TD></TR><TR><TD CLASS="l">256</TD><TD>        /**</TD></TR><TR><TD CLASS="l">257</TD><TD>         * purely for debugging/performance measurements In practice, would always</TD></TR><TR><TD CLASS="l">258</TD><TD>         * be 'true'. (and should never be called by called by clients). Its not</TD></TR><TR><TD CLASS="l">259</TD><TD>         * 'final' or private just so it can be varied during</TD></TR><TR><TD CLASS="l">260</TD><TD>         * debugging/performance measurement runs.</TD></TR><TR><TD CLASS="l"><A NAME="4b">261</A></TD><TD>         * </TD></TR><TR><TD CLASS="l">262</TD><TD>         * @param use_local_thread</TD></TR><TR><TD CLASS="l">263</TD><TD>         */</TD></TR><TR><TD CLASS="l">264</TD><TD>        public static void setUSE_LOCAL_THREAD(final boolean use_local_thread) {</TD></TR><TR CLASS="z"><TD CLASS="l">265</TD><TD>                USE_LOCAL_THREAD = use_local_thread;</TD></TR><TR CLASS="z"><TD CLASS="l">266</TD><TD>        }</TD></TR><TR><TD CLASS="l">267</TD><TD> </TD></TR><TR><TD CLASS="l">268</TD><TD>        private IStructuredDocumentRegion cachedDocumentRegion;</TD></TR><TR><TD CLASS="l">269</TD><TD>        private EncodingMemento encodingMemento;</TD></TR><TR CLASS="c"><TD CLASS="l">270</TD><TD>        private boolean fAcceptPostNotificationReplaces = true;</TD></TR><TR><TD CLASS="l">271</TD><TD>        private CurrentDocumentRegionCache fCurrentDocumnetRegionCache;</TD></TR><TR><TD CLASS="l">272</TD><TD>        private DocumentEvent fDocumentEvent;</TD></TR><TR><TD CLASS="l">273</TD><TD>        private IDocumentListener[] fDocumentListeners;</TD></TR><TR><TD CLASS="l">274</TD><TD> </TD></TR><TR><TD CLASS="l">275</TD><TD>        /**</TD></TR><TR><TD CLASS="l">276</TD><TD>         * The registered document partitioners.</TD></TR><TR><TD CLASS="l">277</TD><TD>         */</TD></TR><TR><TD CLASS="l">278</TD><TD>        private Map fDocumentPartitioners;</TD></TR><TR><TD CLASS="l">279</TD><TD>        /** The registered document partitioning listeners */</TD></TR><TR><TD CLASS="l">280</TD><TD>        private List fDocumentPartitioningListeners;</TD></TR><TR><TD CLASS="l">281</TD><TD>        private IStructuredDocumentRegion firstDocumentRegion;</TD></TR><TR><TD CLASS="l">282</TD><TD>        private RegionParser fParser;</TD></TR><TR><TD CLASS="l">283</TD><TD>        private GenericPositionManager fPositionManager;</TD></TR><TR><TD CLASS="l">284</TD><TD>        private List fPostNotificationChanges;</TD></TR><TR><TD CLASS="l">285</TD><TD>        private IDocumentListener[] fPrenotifiedDocumentListeners;</TD></TR><TR CLASS="c"><TD CLASS="l">286</TD><TD>        private int fReentranceCount = 0;</TD></TR><TR><TD CLASS="l">287</TD><TD>        private IStructuredTextReParser fReParser;</TD></TR><TR CLASS="c"><TD CLASS="l">288</TD><TD>        private int fStoppedCount = 0;</TD></TR><TR><TD CLASS="l">289</TD><TD> </TD></TR><TR><TD CLASS="l">290</TD><TD>        private ITextStore fStore;</TD></TR><TR><TD CLASS="l">291</TD><TD>        private Object[] fStructuredDocumentAboutToChangeListeners;</TD></TR><TR><TD CLASS="l">292</TD><TD>        private Object[] fStructuredDocumentChangedListeners;</TD></TR><TR><TD CLASS="l">293</TD><TD>        private Object[] fStructuredDocumentChangingListeners;</TD></TR><TR><TD CLASS="l">294</TD><TD> </TD></TR><TR><TD CLASS="l">295</TD><TD>        private List fDocumentRewriteSessionListeners;</TD></TR><TR><TD CLASS="l">296</TD><TD> </TD></TR><TR><TD CLASS="l">297</TD><TD>        private ILineTracker fTracker;</TD></TR><TR><TD CLASS="l">298</TD><TD>        private IStructuredTextUndoManager fUndoManager;</TD></TR><TR><TD CLASS="l">299</TD><TD>        private IStructuredDocumentRegion lastDocumentRegion;</TD></TR><TR><TD CLASS="l">300</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">301</TD><TD>        private byte[] listenerLock = new byte[0];</TD></TR><TR><TD CLASS="l">302</TD><TD>        private NullDocumentEvent NULL_DOCUMENT_EVENT;</TD></TR><TR><TD CLASS="l">303</TD><TD> </TD></TR><TR><TD CLASS="l">304</TD><TD>        /**</TD></TR><TR><TD CLASS="l">305</TD><TD>         * Theoretically, a document can contain mixed line delimiters, but the</TD></TR><TR><TD CLASS="l">306</TD><TD>         * user's preference is usually to be internally consistent.</TD></TR><TR><TD CLASS="l">307</TD><TD>         */</TD></TR><TR><TD CLASS="l">308</TD><TD>        private String fInitialLineDelimiter;</TD></TR><TR CLASS="c"><TD CLASS="l">309</TD><TD>        private final String READ_ONLY_REGIONS_CATEGORY = &#34;_READ_ONLY_REGIONS_CATEGORY_&#34;; //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">310</TD><TD>        /**</TD></TR><TR><TD CLASS="l">311</TD><TD>         * Current rewrite session, or none if not presently rewriting.</TD></TR><TR><TD CLASS="l">312</TD><TD>         */</TD></TR><TR><TD CLASS="l">313</TD><TD>        private DocumentRewriteSession fActiveRewriteSession;</TD></TR><TR><TD CLASS="l">314</TD><TD>        /**</TD></TR><TR><TD CLASS="l">315</TD><TD>         * Last modification stamp, automatically updated on change.</TD></TR><TR><TD CLASS="l">316</TD><TD>         */</TD></TR><TR><TD CLASS="l">317</TD><TD>        private long fModificationStamp;</TD></TR><TR><TD CLASS="l">318</TD><TD>        /**</TD></TR><TR><TD CLASS="l">319</TD><TD>         * Keeps track of next modification stamp.</TD></TR><TR><TD CLASS="l">320</TD><TD>         */</TD></TR><TR CLASS="c"><TD CLASS="l">321</TD><TD>        private long fNextModificationStamp= IDocumentExtension4.UNKNOWN_MODIFICATION_STAMP;</TD></TR><TR><TD CLASS="l">322</TD><TD>        /**</TD></TR><TR><TD CLASS="l">323</TD><TD>         * debug variable only</TD></TR><TR><TD CLASS="l">324</TD><TD>         * </TD></TR><TR><TD CLASS="l">325</TD><TD>         * @param parser</TD></TR><TR><TD CLASS="l">326</TD><TD>         */</TD></TR><TR><TD CLASS="l">327</TD><TD>        private long startStreamTime;</TD></TR><TR><TD CLASS="l">328</TD><TD>        /**</TD></TR><TR><TD CLASS="l">329</TD><TD>         * debug variable only</TD></TR><TR><TD CLASS="l">330</TD><TD>         * </TD></TR><TR><TD CLASS="l">331</TD><TD>         * @param parser</TD></TR><TR><TD CLASS="l"><A NAME="7f">332</A></TD><TD>         */</TD></TR><TR><TD CLASS="l">333</TD><TD>        private long startTime;</TD></TR><TR><TD CLASS="l">334</TD><TD> </TD></TR><TR><TD CLASS="l">335</TD><TD>        public BasicStructuredDocument() {</TD></TR><TR CLASS="c"><TD CLASS="l">336</TD><TD>                super();</TD></TR><TR CLASS="c"><TD CLASS="l">337</TD><TD>                fCurrentDocumnetRegionCache = new CurrentDocumentRegionCache();</TD></TR><TR CLASS="c"><TD CLASS="l">338</TD><TD>                setTextStore(new StructuredDocumentTextStore(50, 300));</TD></TR><TR CLASS="c"><TD CLASS="l">339</TD><TD>                setLineTracker(new DefaultLineTracker());</TD></TR><TR CLASS="c"><TD CLASS="l">340</TD><TD>                NULL_DOCUMENT_EVENT = new NullDocumentEvent();</TD></TR><TR><TD CLASS="l">341</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">342</TD><TD>                internal_addPositionCategory(READ_ONLY_REGIONS_CATEGORY);</TD></TR><TR CLASS="c"><TD CLASS="l">343</TD><TD>                internal_addPositionUpdater(new DeleteEqualPositionUpdater(READ_ONLY_REGIONS_CATEGORY));</TD></TR><TR><TD CLASS="l">344</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">345</TD><TD>        }</TD></TR><TR><TD CLASS="l">346</TD><TD> </TD></TR><TR><TD CLASS="l">347</TD><TD>        /**</TD></TR><TR><TD CLASS="l">348</TD><TD>         * This is the primary way to get a new structuredDocument. Its best to</TD></TR><TR><TD CLASS="l">349</TD><TD>         * use the factory methods in ModelManger to create a new</TD></TR><TR><TD CLASS="l"><A NAME="80">350</A></TD><TD>         * IStructuredDocument, since it will get and initialize the parser</TD></TR><TR><TD CLASS="l">351</TD><TD>         * according to the desired content type.</TD></TR><TR><TD CLASS="l">352</TD><TD>         */</TD></TR><TR><TD CLASS="l">353</TD><TD>        public BasicStructuredDocument(RegionParser parser) {</TD></TR><TR CLASS="c"><TD CLASS="l">354</TD><TD>                this();</TD></TR><TR CLASS="c"><TD CLASS="l">355</TD><TD>                Assert.isNotNull(parser, &#34;Program Error: IStructuredDocument can not be created with null parser&#34;); //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">356</TD><TD>                // go through setter in case there is side effects</TD></TR><TR CLASS="c"><TD CLASS="l">357</TD><TD>                internal_setParser(parser);</TD></TR><TR CLASS="c"><TD CLASS="l">358</TD><TD>        }</TD></TR><TR><TD CLASS="l"><A NAME="81">359</A></TD><TD> </TD></TR><TR><TD CLASS="l">360</TD><TD>        private void _clearDocumentEvent() {</TD></TR><TR><TD CLASS="l">361</TD><TD>                // no hard and fast requirement to null out ... just seems like</TD></TR><TR><TD CLASS="l">362</TD><TD>                // a good idea, since we are done with it.</TD></TR><TR CLASS="c"><TD CLASS="l">363</TD><TD>                fDocumentEvent = null;</TD></TR><TR CLASS="c"><TD CLASS="l">364</TD><TD>        }</TD></TR><TR><TD CLASS="l">365</TD><TD> </TD></TR><TR><TD CLASS="l"><A NAME="58">366</A></TD><TD>        private void _fireDocumentAboutToChange(Object[] listeners) {</TD></TR><TR><TD CLASS="l">367</TD><TD>                // most DocumentAboutToBeChanged listeners do not anticipate</TD></TR><TR><TD CLASS="l">368</TD><TD>                // DocumentEvent == null. So make sure documentEvent is not</TD></TR><TR><TD CLASS="l">369</TD><TD>                // null. (this should never happen, yet it does sometimes)</TD></TR><TR CLASS="c"><TD CLASS="l">370</TD><TD>                if (fDocumentEvent == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">371</TD><TD>                        fDocumentEvent = new NullDocumentEvent();</TD></TR><TR><TD CLASS="l">372</TD><TD>                }</TD></TR><TR><TD CLASS="l">373</TD><TD>                // we must assign listeners to local variable, since the add and</TD></TR><TR><TD CLASS="l">374</TD><TD>                // remove</TD></TR><TR><TD CLASS="l">375</TD><TD>                // listner</TD></TR><TR><TD CLASS="l">376</TD><TD>                // methods can change the actual instance of the listener array from</TD></TR><TR><TD CLASS="l">377</TD><TD>                // another thread</TD></TR><TR CLASS="c"><TD CLASS="l">378</TD><TD>                if (listeners != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">379</TD><TD>                        Object[] holdListeners = listeners;</TD></TR><TR><TD CLASS="l">380</TD><TD>                        // Note: the docEvent is created in replaceText API</TD></TR><TR><TD CLASS="l">381</TD><TD>                        // fire</TD></TR><TR CLASS="z"><TD CLASS="l">382</TD><TD>                        for (int i = 0; i &lt; holdListeners.length; i++) {</TD></TR><TR><TD CLASS="l">383</TD><TD>                                if (Debug.perfTest || Debug.perfTestStructuredDocumentEventOnly) {</TD></TR><TR><TD CLASS="l">384</TD><TD>                                        startTime = System.currentTimeMillis();</TD></TR><TR><TD CLASS="l">385</TD><TD>                                }</TD></TR><TR><TD CLASS="l">386</TD><TD>                                // safeguard from listeners that throw exceptions</TD></TR><TR><TD CLASS="l">387</TD><TD>                                try {</TD></TR><TR><TD CLASS="l">388</TD><TD>                                        // this is a safe cast, since addListners requires a</TD></TR><TR><TD CLASS="l">389</TD><TD>                                        // IStructuredDocumentListener</TD></TR><TR CLASS="z"><TD CLASS="l">390</TD><TD>                                        ((IDocumentListener) holdListeners[i]).documentAboutToBeChanged(fDocumentEvent);</TD></TR><TR><TD CLASS="l">391</TD><TD>                                }</TD></TR><TR CLASS="z"><TD CLASS="l">392</TD><TD>                                catch (Exception exception) {</TD></TR><TR CLASS="z"><TD CLASS="l">393</TD><TD>                                        Logger.logException(exception);</TD></TR><TR><TD CLASS="l">394</TD><TD>                                }</TD></TR><TR><TD CLASS="l">395</TD><TD>                                if (Debug.perfTest || Debug.perfTestStructuredDocumentEventOnly) {</TD></TR><TR><TD CLASS="l">396</TD><TD>                                        long stopTime = System.currentTimeMillis();</TD></TR><TR><TD CLASS="l">397</TD><TD>                                        System.out.println(&#34;\n\t\t\t\t IStructuredDocument::fireStructuredDocumentEvent. Time was &#34; + (stopTime - startTime) + &#34; msecs to fire NewModelEvent to instance of &#34; + holdListeners[i].getClass()); //$NON-NLS-2$//$NON-NLS-1$</TD></TR><TR><TD CLASS="l">398</TD><TD>                                }</TD></TR><TR><TD CLASS="l">399</TD><TD>                        }</TD></TR><TR><TD CLASS="l"><A NAME="75">400</A></TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">401</TD><TD>        }</TD></TR><TR><TD CLASS="l">402</TD><TD> </TD></TR><TR><TD CLASS="l">403</TD><TD>        private void notifyDocumentPartitionersAboutToChange(DocumentEvent documentEvent) {</TD></TR><TR CLASS="c"><TD CLASS="l">404</TD><TD>                if (fDocumentPartitioners != null) {</TD></TR><TR CLASS="c"><TD CLASS="l">405</TD><TD>                        Iterator e = fDocumentPartitioners.values().iterator();</TD></TR><TR CLASS="c"><TD CLASS="l">406</TD><TD>                        while (e.hasNext()) {</TD></TR><TR CLASS="c"><TD CLASS="l">407</TD><TD>                                IDocumentPartitioner p = (IDocumentPartitioner) e.next();</TD></TR><TR><TD CLASS="l">408</TD><TD>                                // safeguard from listeners that throw exceptions</TD></TR><TR><TD CLASS="l">409</TD><TD>                                try {</TD></TR><TR CLASS="c"><TD CLASS="l">410</TD><TD>                                        p.documentAboutToBeChanged(documentEvent);</TD></TR><TR><TD CLASS="l">411</TD><TD>                                }</TD></TR><TR CLASS="z"><TD CLASS="l">412</TD><TD>                                catch (Exception exception) {</TD></TR><TR CLASS="z"><TD CLASS="l">413</TD><TD>                                        Logger.logException(exception);</TD></TR><TR><TD CLASS="l">414</TD><TD>                                }</TD></TR><TR><TD CLASS="l">415</TD><TD>                        }</TD></TR><TR><TD CLASS="l">416</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">417</TD><TD>        }</TD></TR><TR><TD CLASS="l">418</TD><TD> </TD></TR><TR><TD CLASS="l">419</TD><TD>        private void _fireDocumentChanged(Object[] listeners, StructuredDocumentEvent event) {</TD></TR><TR><TD CLASS="l">420</TD><TD> </TD></TR><TR><TD CLASS="l">421</TD><TD>                // we must assign listeners to local variable, since the add and</TD></TR><TR><TD CLASS="l"><A NAME="56">422</A></TD><TD>                // remove</TD></TR><TR><TD CLASS="l">423</TD><TD>                // listner</TD></TR><TR><TD CLASS="l">424</TD><TD>                // methods can change the actual instance of the listener array from</TD></TR><TR><TD CLASS="l">425</TD><TD>                // another thread</TD></TR><TR CLASS="c"><TD CLASS="l">426</TD><TD>                if (listeners != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">427</TD><TD>                        Object[] holdListeners = listeners;</TD></TR><TR><TD CLASS="l">428</TD><TD>                        // NOTE: document event is created in replace Text API and setText</TD></TR><TR><TD CLASS="l">429</TD><TD>                        // API</TD></TR><TR><TD CLASS="l">430</TD><TD>                        // now fire</TD></TR><TR CLASS="z"><TD CLASS="l">431</TD><TD>                        for (int i = 0; i &lt; holdListeners.length; i++) {</TD></TR><TR><TD CLASS="l">432</TD><TD>                                if (Debug.perfTest || Debug.perfTestStructuredDocumentEventOnly) {</TD></TR><TR><TD CLASS="l">433</TD><TD>                                        startTime = System.currentTimeMillis();</TD></TR><TR><TD CLASS="l">434</TD><TD>                                }</TD></TR><TR><TD CLASS="l">435</TD><TD> </TD></TR><TR><TD CLASS="l">436</TD><TD>                                // safeguard from listeners that throw exceptions</TD></TR><TR><TD CLASS="l">437</TD><TD>                                try {</TD></TR><TR><TD CLASS="l">438</TD><TD>                                        // this is a safe cast, since addListners requires a</TD></TR><TR><TD CLASS="l">439</TD><TD>                                        // IStructuredDocumentListener</TD></TR><TR><TD CLASS="l">440</TD><TD>                                        // Notes: fDocumentEvent can be &#34;suddenly&#34; null, if one of</TD></TR><TR><TD CLASS="l">441</TD><TD>                                        // the</TD></TR><TR><TD CLASS="l">442</TD><TD>                                        // previous changes</TD></TR><TR><TD CLASS="l">443</TD><TD>                                        // caused a &#34;setText&#34; to be called. The only known case of</TD></TR><TR><TD CLASS="l">444</TD><TD>                                        // this</TD></TR><TR><TD CLASS="l">445</TD><TD>                                        // is a model reset</TD></TR><TR><TD CLASS="l">446</TD><TD>                                        // due to page directive changing. Eventually we should</TD></TR><TR><TD CLASS="l">447</TD><TD>                                        // change</TD></TR><TR><TD CLASS="l">448</TD><TD>                                        // archetecture to have</TD></TR><TR><TD CLASS="l">449</TD><TD>                                        // event que and be able to &#34;cancel&#34; pending events, but</TD></TR><TR><TD CLASS="l">450</TD><TD>                                        // for</TD></TR><TR><TD CLASS="l">451</TD><TD>                                        // now, we'll just pass a</TD></TR><TR><TD CLASS="l">452</TD><TD>                                        // NullDocumentEvent. By the way, it is important to send</TD></TR><TR><TD CLASS="l">453</TD><TD>                                        // something, since clients might</TD></TR><TR><TD CLASS="l">454</TD><TD>                                        // have indeterminant state due to &#34;aboutToChange&#34; being</TD></TR><TR><TD CLASS="l">455</TD><TD>                                        // sent</TD></TR><TR><TD CLASS="l">456</TD><TD>                                        // earlier.</TD></TR><TR CLASS="z"><TD CLASS="l">457</TD><TD>                                        if (fDocumentEvent == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">458</TD><TD>                                                ((IDocumentListener) holdListeners[i]).documentChanged(NULL_DOCUMENT_EVENT);</TD></TR><TR><TD CLASS="l">459</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">460</TD><TD>                                        else {</TD></TR><TR CLASS="z"><TD CLASS="l">461</TD><TD>                                                ((IDocumentListener) holdListeners[i]).documentChanged(fDocumentEvent);</TD></TR><TR><TD CLASS="l">462</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">463</TD><TD>                                }</TD></TR><TR CLASS="z"><TD CLASS="l">464</TD><TD>                                catch (Exception exception) {</TD></TR><TR CLASS="z"><TD CLASS="l">465</TD><TD>                                        Logger.logException(exception);</TD></TR><TR><TD CLASS="l">466</TD><TD>                                }</TD></TR><TR><TD CLASS="l">467</TD><TD>                                if (Debug.perfTest || Debug.perfTestStructuredDocumentEventOnly) {</TD></TR><TR><TD CLASS="l">468</TD><TD>                                        long stopTime = System.currentTimeMillis();</TD></TR><TR><TD CLASS="l">469</TD><TD>                                        System.out.println(&#34;\n\t\t\t\t IStructuredDocument::fireStructuredDocumentEvent. Time was &#34; + (stopTime - startTime) + &#34; msecs to fire NewModelEvent to instance of &#34; + holdListeners[i].getClass()); //$NON-NLS-2$//$NON-NLS-1$</TD></TR><TR><TD CLASS="l">470</TD><TD>                                }</TD></TR><TR><TD CLASS="l">471</TD><TD>                        }</TD></TR><TR><TD CLASS="l"><A NAME="6d">472</A></TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">473</TD><TD>        }</TD></TR><TR><TD CLASS="l">474</TD><TD> </TD></TR><TR><TD CLASS="l">475</TD><TD>        private void notifyDocumentPartitionersDocumentChanged(DocumentEvent documentEvent) {</TD></TR><TR CLASS="c"><TD CLASS="l">476</TD><TD>                if (fDocumentPartitioners != null) {</TD></TR><TR CLASS="c"><TD CLASS="l">477</TD><TD>                        Iterator e = fDocumentPartitioners.values().iterator();</TD></TR><TR CLASS="c"><TD CLASS="l">478</TD><TD>                        while (e.hasNext()) {</TD></TR><TR CLASS="c"><TD CLASS="l">479</TD><TD>                                IDocumentPartitioner p = (IDocumentPartitioner) e.next();</TD></TR><TR><TD CLASS="l">480</TD><TD>                                // safeguard from listeners that throw exceptions</TD></TR><TR><TD CLASS="l">481</TD><TD>                                try {</TD></TR><TR CLASS="c"><TD CLASS="l">482</TD><TD>                                        if (p instanceof IDocumentPartitionerExtension) {</TD></TR><TR><TD CLASS="l">483</TD><TD>                                                // IRegion changedPartion =</TD></TR><TR CLASS="z"><TD CLASS="l">484</TD><TD>                                                ((IDocumentPartitionerExtension) p).documentChanged2(documentEvent);</TD></TR><TR><TD CLASS="l">485</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">486</TD><TD>                                        else {</TD></TR><TR CLASS="c"><TD CLASS="l">487</TD><TD>                                                p.documentChanged(documentEvent);</TD></TR><TR><TD CLASS="l">488</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">489</TD><TD>                                }</TD></TR><TR CLASS="z"><TD CLASS="l">490</TD><TD>                                catch (Exception exception) {</TD></TR><TR CLASS="z"><TD CLASS="l">491</TD><TD>                                        Logger.logException(exception);</TD></TR><TR><TD CLASS="l">492</TD><TD>                                }</TD></TR><TR><TD CLASS="l">493</TD><TD>                        }</TD></TR><TR><TD CLASS="l">494</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">495</TD><TD>        }</TD></TR><TR><TD CLASS="l">496</TD><TD> </TD></TR><TR><TD CLASS="l">497</TD><TD> </TD></TR><TR><TD CLASS="l">498</TD><TD>        private void _fireEvent(Object[] listeners, NoChangeEvent event) {</TD></TR><TR><TD CLASS="l">499</TD><TD>                // we must assign listeners to local variable, since the add and</TD></TR><TR><TD CLASS="l"><A NAME="5">500</A></TD><TD>                // remove</TD></TR><TR><TD CLASS="l">501</TD><TD>                // listner</TD></TR><TR><TD CLASS="l">502</TD><TD>                // methods can change the actual instance of the listener array from</TD></TR><TR><TD CLASS="l">503</TD><TD>                // another thread</TD></TR><TR CLASS="z"><TD CLASS="l">504</TD><TD>                if (listeners != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">505</TD><TD>                        Object[] holdListeners = listeners;</TD></TR><TR CLASS="z"><TD CLASS="l">506</TD><TD>                        for (int i = 0; i &lt; holdListeners.length; i++) {</TD></TR><TR><TD CLASS="l">507</TD><TD>                                if (Debug.perfTest || Debug.perfTestStructuredDocumentEventOnly) {</TD></TR><TR><TD CLASS="l">508</TD><TD>                                        startTime = System.currentTimeMillis();</TD></TR><TR><TD CLASS="l">509</TD><TD>                                }</TD></TR><TR><TD CLASS="l">510</TD><TD>                                // safeguard from listeners that throw exceptions</TD></TR><TR><TD CLASS="l">511</TD><TD>                                try {</TD></TR><TR><TD CLASS="l">512</TD><TD>                                        // this is a safe cast, since addListners requires a</TD></TR><TR><TD CLASS="l">513</TD><TD>                                        // IStructuredDocumentListener</TD></TR><TR CLASS="z"><TD CLASS="l">514</TD><TD>                                        ((IStructuredDocumentListener) holdListeners[i]).noChange(event);</TD></TR><TR><TD CLASS="l">515</TD><TD>                                }</TD></TR><TR CLASS="z"><TD CLASS="l">516</TD><TD>                                catch (Exception exception) {</TD></TR><TR CLASS="z"><TD CLASS="l">517</TD><TD>                                        Logger.logException(exception);</TD></TR><TR><TD CLASS="l">518</TD><TD>                                }</TD></TR><TR><TD CLASS="l">519</TD><TD>                                if (Debug.perfTest || Debug.perfTestStructuredDocumentEventOnly) {</TD></TR><TR><TD CLASS="l">520</TD><TD>                                        long stopTime = System.currentTimeMillis();</TD></TR><TR><TD CLASS="l">521</TD><TD>                                        System.out.println(&#34;\n\t\t\t\t IStructuredDocument::fireStructuredDocumentEvent. Time was &#34; + (stopTime - startTime) + &#34; msecs to fire NewModelEvent to instance of &#34; + holdListeners[i].getClass()); //$NON-NLS-2$//$NON-NLS-1$</TD></TR><TR><TD CLASS="l">522</TD><TD>                                }</TD></TR><TR><TD CLASS="l">523</TD><TD>                        }</TD></TR><TR><TD CLASS="l">524</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">525</TD><TD>        }</TD></TR><TR><TD CLASS="l">526</TD><TD> </TD></TR><TR><TD CLASS="l">527</TD><TD>        private void _fireEvent(Object[] listeners, RegionChangedEvent event) {</TD></TR><TR><TD CLASS="l">528</TD><TD>                // we must assign listeners to local variable, since the add and</TD></TR><TR><TD CLASS="l"><A NAME="6">529</A></TD><TD>                // remove</TD></TR><TR><TD CLASS="l">530</TD><TD>                // listner</TD></TR><TR><TD CLASS="l">531</TD><TD>                // methods can change the actual instance of the listener array from</TD></TR><TR><TD CLASS="l">532</TD><TD>                // another thread</TD></TR><TR CLASS="z"><TD CLASS="l">533</TD><TD>                if (listeners != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">534</TD><TD>                        Object[] holdListeners = listeners;</TD></TR><TR CLASS="z"><TD CLASS="l">535</TD><TD>                        for (int i = 0; i &lt; holdListeners.length; i++) {</TD></TR><TR><TD CLASS="l">536</TD><TD>                                if (Debug.perfTest || Debug.perfTestStructuredDocumentEventOnly) {</TD></TR><TR><TD CLASS="l">537</TD><TD>                                        startTime = System.currentTimeMillis();</TD></TR><TR><TD CLASS="l">538</TD><TD>                                }</TD></TR><TR><TD CLASS="l">539</TD><TD>                                // safeguard from listeners that throw exceptions</TD></TR><TR><TD CLASS="l">540</TD><TD>                                try {</TD></TR><TR><TD CLASS="l">541</TD><TD>                                        // this is a safe cast, since addListners requires a</TD></TR><TR><TD CLASS="l">542</TD><TD>                                        // IStructuredDocumentListener</TD></TR><TR CLASS="z"><TD CLASS="l">543</TD><TD>                                        ((IStructuredDocumentListener) holdListeners[i]).regionChanged(event);</TD></TR><TR><TD CLASS="l">544</TD><TD>                                }</TD></TR><TR CLASS="z"><TD CLASS="l">545</TD><TD>                                catch (Exception exception) {</TD></TR><TR CLASS="z"><TD CLASS="l">546</TD><TD>                                        Logger.logException(exception);</TD></TR><TR><TD CLASS="l">547</TD><TD>                                }</TD></TR><TR><TD CLASS="l">548</TD><TD>                                if (Debug.perfTest || Debug.perfTestStructuredDocumentEventOnly) {</TD></TR><TR><TD CLASS="l">549</TD><TD>                                        long stopTime = System.currentTimeMillis();</TD></TR><TR><TD CLASS="l">550</TD><TD>                                        System.out.println(&#34;\n\t\t\t\t IStructuredDocument::fireStructuredDocumentEvent. Time was &#34; + (stopTime - startTime) + &#34; msecs to fire NewModelEvent to instance of &#34; + holdListeners[i].getClass()); //$NON-NLS-2$//$NON-NLS-1$</TD></TR><TR><TD CLASS="l">551</TD><TD>                                }</TD></TR><TR><TD CLASS="l">552</TD><TD>                        }</TD></TR><TR><TD CLASS="l">553</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">554</TD><TD>        }</TD></TR><TR><TD CLASS="l">555</TD><TD> </TD></TR><TR><TD CLASS="l">556</TD><TD>        private void _fireEvent(Object[] listeners, RegionsReplacedEvent event) {</TD></TR><TR><TD CLASS="l">557</TD><TD>                // we must assign listeners to local variable, since the add and</TD></TR><TR><TD CLASS="l"><A NAME="7">558</A></TD><TD>                // remove</TD></TR><TR><TD CLASS="l">559</TD><TD>                // listner</TD></TR><TR><TD CLASS="l">560</TD><TD>                // methods can change the actual instance of the listener array from</TD></TR><TR><TD CLASS="l">561</TD><TD>                // another thread</TD></TR><TR CLASS="z"><TD CLASS="l">562</TD><TD>                if (listeners != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">563</TD><TD>                        Object[] holdListeners = listeners;</TD></TR><TR CLASS="z"><TD CLASS="l">564</TD><TD>                        for (int i = 0; i &lt; holdListeners.length; i++) {</TD></TR><TR><TD CLASS="l">565</TD><TD>                                if (Debug.perfTest || Debug.perfTestStructuredDocumentEventOnly) {</TD></TR><TR><TD CLASS="l">566</TD><TD>                                        startTime = System.currentTimeMillis();</TD></TR><TR><TD CLASS="l">567</TD><TD>                                }</TD></TR><TR><TD CLASS="l">568</TD><TD>                                // safeguard from listeners that throw exceptions</TD></TR><TR><TD CLASS="l">569</TD><TD>                                try {</TD></TR><TR><TD CLASS="l">570</TD><TD>                                        // this is a safe cast, since addListners requires a</TD></TR><TR><TD CLASS="l">571</TD><TD>                                        // IStructuredDocumentListener</TD></TR><TR CLASS="z"><TD CLASS="l">572</TD><TD>                                        ((IStructuredDocumentListener) holdListeners[i]).regionsReplaced(event);</TD></TR><TR><TD CLASS="l">573</TD><TD>                                }</TD></TR><TR CLASS="z"><TD CLASS="l">574</TD><TD>                                catch (Exception exception) {</TD></TR><TR CLASS="z"><TD CLASS="l">575</TD><TD>                                        Logger.logException(exception);</TD></TR><TR><TD CLASS="l">576</TD><TD>                                }</TD></TR><TR><TD CLASS="l">577</TD><TD>                                if (Debug.perfTest || Debug.perfTestStructuredDocumentEventOnly) {</TD></TR><TR><TD CLASS="l">578</TD><TD>                                        long stopTime = System.currentTimeMillis();</TD></TR><TR><TD CLASS="l">579</TD><TD>                                        System.out.println(&#34;\n\t\t\t\t IStructuredDocument::fireStructuredDocumentEvent. Time was &#34; + (stopTime - startTime) + &#34; msecs to fire NewModelEvent to instance of &#34; + holdListeners[i].getClass()); //$NON-NLS-2$//$NON-NLS-1$</TD></TR><TR><TD CLASS="l">580</TD><TD>                                }</TD></TR><TR><TD CLASS="l">581</TD><TD>                        }</TD></TR><TR><TD CLASS="l">582</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">583</TD><TD>        }</TD></TR><TR><TD CLASS="l">584</TD><TD> </TD></TR><TR><TD CLASS="l">585</TD><TD>        private void _fireEvent(Object[] listeners, StructuredDocumentRegionsReplacedEvent event) {</TD></TR><TR><TD CLASS="l">586</TD><TD>                // we must assign listeners to local variable, since the add and</TD></TR><TR><TD CLASS="l"><A NAME="57">587</A></TD><TD>                // remove</TD></TR><TR><TD CLASS="l">588</TD><TD>                // listner</TD></TR><TR><TD CLASS="l">589</TD><TD>                // methods can change the actual instance of the listener array from</TD></TR><TR><TD CLASS="l">590</TD><TD>                // another thread</TD></TR><TR CLASS="c"><TD CLASS="l">591</TD><TD>                if (listeners != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">592</TD><TD>                        Object[] holdListeners = listeners;</TD></TR><TR CLASS="z"><TD CLASS="l">593</TD><TD>                        for (int i = 0; i &lt; holdListeners.length; i++) {</TD></TR><TR><TD CLASS="l">594</TD><TD>                                if (Debug.perfTest || Debug.perfTestStructuredDocumentEventOnly) {</TD></TR><TR><TD CLASS="l">595</TD><TD>                                        startTime = System.currentTimeMillis();</TD></TR><TR><TD CLASS="l">596</TD><TD>                                }</TD></TR><TR><TD CLASS="l">597</TD><TD>                                // safeguard from listeners that throw exceptions</TD></TR><TR><TD CLASS="l">598</TD><TD>                                try {</TD></TR><TR><TD CLASS="l">599</TD><TD>                                        // this is a safe cast, since addListners requires a</TD></TR><TR><TD CLASS="l">600</TD><TD>                                        // IStructuredDocumentListener</TD></TR><TR CLASS="z"><TD CLASS="l">601</TD><TD>                                        ((IStructuredDocumentListener) holdListeners[i]).nodesReplaced(event);</TD></TR><TR><TD CLASS="l">602</TD><TD>                                }</TD></TR><TR CLASS="z"><TD CLASS="l">603</TD><TD>                                catch (Exception exception) {</TD></TR><TR CLASS="z"><TD CLASS="l">604</TD><TD>                                        Logger.logException(exception);</TD></TR><TR><TD CLASS="l">605</TD><TD>                                }</TD></TR><TR><TD CLASS="l">606</TD><TD>                                if (Debug.perfTest || Debug.perfTestStructuredDocumentEventOnly) {</TD></TR><TR><TD CLASS="l">607</TD><TD>                                        long stopTime = System.currentTimeMillis();</TD></TR><TR><TD CLASS="l">608</TD><TD>                                        System.out.println(&#34;\n\t\t\t\t IStructuredDocument::fireStructuredDocumentEvent. Time was &#34; + (stopTime - startTime) + &#34; msecs to fire NewModelEvent to instance of &#34; + holdListeners[i].getClass()); //$NON-NLS-2$//$NON-NLS-1$</TD></TR><TR><TD CLASS="l">609</TD><TD>                                }</TD></TR><TR><TD CLASS="l">610</TD><TD>                        }</TD></TR><TR><TD CLASS="l">611</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">612</TD><TD>        }</TD></TR><TR><TD CLASS="l">613</TD><TD> </TD></TR><TR><TD CLASS="l">614</TD><TD>        private void _fireStructuredDocumentAboutToChange(Object[] listeners) {</TD></TR><TR><TD CLASS="l">615</TD><TD>                // we must assign listeners to local variable, since the add and</TD></TR><TR><TD CLASS="l"><A NAME="54">616</A></TD><TD>                // remove</TD></TR><TR><TD CLASS="l">617</TD><TD>                // listner</TD></TR><TR><TD CLASS="l">618</TD><TD>                // methods can change the actual instance of the listener array from</TD></TR><TR><TD CLASS="l">619</TD><TD>                // another thread</TD></TR><TR CLASS="c"><TD CLASS="l">620</TD><TD>                if (listeners != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">621</TD><TD>                        Object[] holdListeners = listeners;</TD></TR><TR><TD CLASS="l">622</TD><TD>                        // Note: the docEvent is created in replaceText API</TD></TR><TR><TD CLASS="l">623</TD><TD>                        // fire</TD></TR><TR CLASS="z"><TD CLASS="l">624</TD><TD>                        for (int i = 0; i &lt; holdListeners.length; i++) {</TD></TR><TR><TD CLASS="l">625</TD><TD>                                if (Debug.perfTest || Debug.perfTestStructuredDocumentEventOnly) {</TD></TR><TR><TD CLASS="l">626</TD><TD>                                        startTime = System.currentTimeMillis();</TD></TR><TR><TD CLASS="l">627</TD><TD>                                }</TD></TR><TR><TD CLASS="l">628</TD><TD>                                // safeguard from listeners that throw exceptions</TD></TR><TR><TD CLASS="l">629</TD><TD>                                try {</TD></TR><TR><TD CLASS="l">630</TD><TD>                                        // notice the AboutToBeChangedEvent is created from the</TD></TR><TR><TD CLASS="l">631</TD><TD>                                        // DocumentEvent, since it is (nearly)</TD></TR><TR><TD CLASS="l">632</TD><TD>                                        // the same information. ?What to do about</TD></TR><TR><TD CLASS="l">633</TD><TD>                                        // originalRequester?</TD></TR><TR CLASS="z"><TD CLASS="l">634</TD><TD>                                        if (fDocumentEvent == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">635</TD><TD>                                                fDocumentEvent = new NullDocumentEvent();</TD></TR><TR><TD CLASS="l">636</TD><TD>                                        }</TD></TR><TR CLASS="z"><TD CLASS="l">637</TD><TD>                                        AboutToBeChangedEvent aboutToBeChangedEvent = new AboutToBeChangedEvent(this, null, fDocumentEvent.getText(), fDocumentEvent.getOffset(), fDocumentEvent.getLength());</TD></TR><TR><TD CLASS="l">638</TD><TD>                                        // this is a safe cast, since addListners requires a</TD></TR><TR><TD CLASS="l">639</TD><TD>                                        // IStructuredDocumentListener</TD></TR><TR CLASS="z"><TD CLASS="l">640</TD><TD>                                        ((IModelAboutToBeChangedListener) holdListeners[i]).modelAboutToBeChanged(aboutToBeChangedEvent);</TD></TR><TR><TD CLASS="l">641</TD><TD>                                }</TD></TR><TR CLASS="z"><TD CLASS="l">642</TD><TD>                                catch (Exception exception) {</TD></TR><TR CLASS="z"><TD CLASS="l">643</TD><TD>                                        Logger.logException(exception);</TD></TR><TR><TD CLASS="l">644</TD><TD>                                }</TD></TR><TR><TD CLASS="l">645</TD><TD>                                if (Debug.perfTest || Debug.perfTestStructuredDocumentEventOnly) {</TD></TR><TR><TD CLASS="l">646</TD><TD>                                        long stopTime = System.currentTimeMillis();</TD></TR><TR><TD CLASS="l">647</TD><TD>                                        System.out.println(&#34;\n\t\t\t\t IStructuredDocument::fireStructuredDocumentEvent. Time was &#34; + (stopTime - startTime) + &#34; msecs to fire NewModelEvent to instance of &#34; + holdListeners[i].getClass()); //$NON-NLS-2$//$NON-NLS-1$</TD></TR><TR><TD CLASS="l">648</TD><TD>                                }</TD></TR><TR><TD CLASS="l">649</TD><TD>                        }</TD></TR><TR><TD CLASS="l">650</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="8">651</A></TD><TD>        }</TD></TR><TR><TD CLASS="l">652</TD><TD> </TD></TR><TR><TD CLASS="l">653</TD><TD>        protected void acquireLock() {</TD></TR><TR><TD CLASS="l">654</TD><TD>                // do nothing here in super class</TD></TR><TR CLASS="z"><TD CLASS="l">655</TD><TD>        }</TD></TR><TR><TD CLASS="l">656</TD><TD> </TD></TR><TR><TD CLASS="l"><A NAME="6c">657</A></TD><TD>        /**</TD></TR><TR><TD CLASS="l">658</TD><TD>         * addModelAboutToBeChangedListener method comment.</TD></TR><TR><TD CLASS="l">659</TD><TD>         */</TD></TR><TR><TD CLASS="l">660</TD><TD>        public void addDocumentAboutToChangeListener(IModelAboutToBeChangedListener listener) {</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="81% line coverage (13 out of 16 instructions)">661</TD><TD TITLE="81% line coverage (13 out of 16 instructions)">                synchronized (listenerLock) {</TD></TR><TR><TD CLASS="l">662</TD><TD> </TD></TR><TR><TD CLASS="l">663</TD><TD>                        // make sure listener is not already in listening</TD></TR><TR><TD CLASS="l">664</TD><TD>                        // (and if it is, print a warning to aid debugging, if needed)</TD></TR><TR CLASS="c"><TD CLASS="l">665</TD><TD>                        if (!Utilities.contains(fStructuredDocumentAboutToChangeListeners, listener)) {</TD></TR><TR CLASS="c"><TD CLASS="l">666</TD><TD>                                int oldSize = 0;</TD></TR><TR CLASS="c"><TD CLASS="l">667</TD><TD>                                if (fStructuredDocumentAboutToChangeListeners != null) {</TD></TR><TR><TD CLASS="l">668</TD><TD>                                        // normally won't be null, but we need to be sure, for</TD></TR><TR><TD CLASS="l">669</TD><TD>                                        // first</TD></TR><TR><TD CLASS="l">670</TD><TD>                                        // time through</TD></TR><TR CLASS="z"><TD CLASS="l">671</TD><TD>                                        oldSize = fStructuredDocumentAboutToChangeListeners.length;</TD></TR><TR><TD CLASS="l">672</TD><TD>                                }</TD></TR><TR CLASS="c"><TD CLASS="l">673</TD><TD>                                int newSize = oldSize + 1;</TD></TR><TR CLASS="c"><TD CLASS="l">674</TD><TD>                                Object[] newListeners = new Object[newSize];</TD></TR><TR CLASS="c"><TD CLASS="l">675</TD><TD>                                if (fStructuredDocumentAboutToChangeListeners != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">676</TD><TD>                                        System.arraycopy(fStructuredDocumentAboutToChangeListeners, 0, newListeners, 0, oldSize);</TD></TR><TR><TD CLASS="l">677</TD><TD>                                }</TD></TR><TR><TD CLASS="l">678</TD><TD>                                // add listener to last position</TD></TR><TR CLASS="c"><TD CLASS="l">679</TD><TD>                                newListeners[newSize - 1] = listener;</TD></TR><TR><TD CLASS="l">680</TD><TD>                                //</TD></TR><TR><TD CLASS="l">681</TD><TD>                                // now switch new for old</TD></TR><TR CLASS="c"><TD CLASS="l">682</TD><TD>                                fStructuredDocumentAboutToChangeListeners = newListeners;</TD></TR><TR><TD CLASS="l">683</TD><TD>                                //</TD></TR><TR><TD CLASS="l">684</TD><TD>                        }</TD></TR><TR><TD CLASS="l">685</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">686</TD><TD>        }</TD></TR><TR><TD CLASS="l">687</TD><TD> </TD></TR><TR><TD CLASS="l">688</TD><TD>        /**</TD></TR><TR><TD CLASS="l">689</TD><TD>         * The StructuredDocumentListners and ModelChagnedListeners are very</TD></TR><TR><TD CLASS="l">690</TD><TD>         * similar. They both receive identical events. The difference is the</TD></TR><TR><TD CLASS="l">691</TD><TD>         * timing. The &#34;pure&#34; StructuredDocumentListners are notified after the</TD></TR><TR><TD CLASS="l">692</TD><TD>         * structuredDocument has been changed, but before other, related models</TD></TR><TR><TD CLASS="l">693</TD><TD>         * may have been changed such as the Structural Model. The Structural</TD></TR><TR><TD CLASS="l">694</TD><TD>         * model is in fact itself a &#34;pure&#34; StructuredDocumentListner. The</TD></TR><TR><TD CLASS="l">695</TD><TD>         * ModelChangedListeners can rest assured that all models and data have</TD></TR><TR><TD CLASS="l">696</TD><TD>         * been updated from the change by the tiem they are notified. This is</TD></TR><TR><TD CLASS="l"><A NAME="7a">697</A></TD><TD>         * especially important for the text widget, for example, which may rely</TD></TR><TR><TD CLASS="l">698</TD><TD>         * on both structuredDocument and structural model information.</TD></TR><TR><TD CLASS="l">699</TD><TD>         */</TD></TR><TR><TD CLASS="l">700</TD><TD>        public void addDocumentChangedListener(IStructuredDocumentListener listener) {</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="81% line coverage (13 out of 16 instructions)">701</TD><TD TITLE="81% line coverage (13 out of 16 instructions)">                synchronized (listenerLock) {</TD></TR><TR><TD CLASS="l">702</TD><TD> </TD></TR><TR><TD CLASS="l">703</TD><TD>                        if (Debug.debugStructuredDocument) {</TD></TR><TR><TD CLASS="l">704</TD><TD>                                System.out.println(&#34;IStructuredDocument::addModelChangedListener. Request to add an instance of &#34; + listener.getClass() + &#34; as a listener on structuredDocument.&#34;); //$NON-NLS-2$//$NON-NLS-1$</TD></TR><TR><TD CLASS="l">705</TD><TD>                        }</TD></TR><TR><TD CLASS="l">706</TD><TD>                        // make sure listener is not already in listening</TD></TR><TR><TD CLASS="l">707</TD><TD>                        // (and if it is, print a warning to aid debugging, if needed)</TD></TR><TR CLASS="c"><TD CLASS="l">708</TD><TD>                        if (Utilities.contains(fStructuredDocumentChangedListeners, listener)) {</TD></TR><TR><TD CLASS="l">709</TD><TD>                                if (Debug.displayWarnings) {</TD></TR><TR><TD CLASS="l">710</TD><TD>                                        System.out.println(&#34;IStructuredDocument::addModelChangedListener. listener &#34; + listener + &#34; was addeded more than once. &#34;); //$NON-NLS-2$//$NON-NLS-1$</TD></TR><TR><TD CLASS="l">711</TD><TD>                                }</TD></TR><TR><TD CLASS="l">712</TD><TD>                        }</TD></TR><TR><TD CLASS="l">713</TD><TD>                        else {</TD></TR><TR><TD CLASS="l">714</TD><TD>                                if (Debug.debugStructuredDocument) {</TD></TR><TR><TD CLASS="l">715</TD><TD>                                        System.out.println(&#34;IStructuredDocument::addModelChangedListener. Adding an instance of &#34; + listener.getClass() + &#34; as a listener on structuredDocument.&#34;); //$NON-NLS-2$//$NON-NLS-1$</TD></TR><TR><TD CLASS="l">716</TD><TD>                                }</TD></TR><TR CLASS="c"><TD CLASS="l">717</TD><TD>                                int oldSize = 0;</TD></TR><TR CLASS="c"><TD CLASS="l">718</TD><TD>                                if (fStructuredDocumentChangedListeners != null) {</TD></TR><TR><TD CLASS="l">719</TD><TD>                                        // normally won't be null, but we need to be sure, for</TD></TR><TR><TD CLASS="l">720</TD><TD>                                        // first</TD></TR><TR><TD CLASS="l">721</TD><TD>                                        // time through</TD></TR><TR CLASS="c"><TD CLASS="l">722</TD><TD>                                        oldSize = fStructuredDocumentChangedListeners.length;</TD></TR><TR><TD CLASS="l">723</TD><TD>                                }</TD></TR><TR CLASS="c"><TD CLASS="l">724</TD><TD>                                int newSize = oldSize + 1;</TD></TR><TR CLASS="c"><TD CLASS="l">725</TD><TD>                                Object[] newListeners = new Object[newSize];</TD></TR><TR CLASS="c"><TD CLASS="l">726</TD><TD>                                if (fStructuredDocumentChangedListeners != null) {</TD></TR><TR CLASS="c"><TD CLASS="l">727</TD><TD>                                        System.arraycopy(fStructuredDocumentChangedListeners, 0, newListeners, 0, oldSize);</TD></TR><TR><TD CLASS="l">728</TD><TD>                                }</TD></TR><TR><TD CLASS="l">729</TD><TD>                                // add listener to last position</TD></TR><TR CLASS="c"><TD CLASS="l">730</TD><TD>                                newListeners[newSize - 1] = listener;</TD></TR><TR><TD CLASS="l">731</TD><TD>                                //</TD></TR><TR><TD CLASS="l">732</TD><TD>                                // now switch new for old</TD></TR><TR CLASS="c"><TD CLASS="l">733</TD><TD>                                fStructuredDocumentChangedListeners = newListeners;</TD></TR><TR><TD CLASS="l">734</TD><TD>                                //</TD></TR><TR><TD CLASS="l">735</TD><TD>                                // when a listener is added,</TD></TR><TR><TD CLASS="l">736</TD><TD>                                // send the new model event to that one particular listener,</TD></TR><TR><TD CLASS="l">737</TD><TD>                                // so it</TD></TR><TR><TD CLASS="l">738</TD><TD>                                // can initialize itself with the current state of the model</TD></TR><TR><TD CLASS="l">739</TD><TD>                                // listener.newModel(new NewModelEvent(this, listener));</TD></TR><TR><TD CLASS="l">740</TD><TD>                        }</TD></TR><TR><TD CLASS="l"><A NAME="6a">741</A></TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">742</TD><TD>        }</TD></TR><TR><TD CLASS="l">743</TD><TD> </TD></TR><TR><TD CLASS="l">744</TD><TD>        public void addDocumentChangingListener(IStructuredDocumentListener listener) {</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="81% line coverage (13 out of 16 instructions)">745</TD><TD TITLE="81% line coverage (13 out of 16 instructions)">                synchronized (listenerLock) {</TD></TR><TR><TD CLASS="l">746</TD><TD> </TD></TR><TR><TD CLASS="l">747</TD><TD>                        if (Debug.debugStructuredDocument) {</TD></TR><TR><TD CLASS="l">748</TD><TD>                                System.out.println(&#34;IStructuredDocument::addStructuredDocumentListener. Request to add an instance of &#34; + listener.getClass() + &#34; as a listener on structuredDocument.&#34;); //$NON-NLS-2$//$NON-NLS-1$</TD></TR><TR><TD CLASS="l">749</TD><TD>                        }</TD></TR><TR><TD CLASS="l">750</TD><TD>                        // make sure listener is not already in listening</TD></TR><TR><TD CLASS="l">751</TD><TD>                        // (and if it is, print a warning to aid debugging, if needed)</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="91% line coverage (10 out of 11 instructions)">752</TD><TD TITLE="91% line coverage (10 out of 11 instructions)">                        if (Utilities.contains(fStructuredDocumentChangingListeners, listener)) {</TD></TR><TR><TD CLASS="l">753</TD><TD>                                if (Debug.displayWarnings) {</TD></TR><TR><TD CLASS="l">754</TD><TD>                                        System.out.println(&#34;IStructuredDocument::addStructuredDocumentListener. listener &#34; + listener + &#34; was addeded more than once. &#34;); //$NON-NLS-2$//$NON-NLS-1$</TD></TR><TR><TD CLASS="l">755</TD><TD>                                }</TD></TR><TR><TD CLASS="l">756</TD><TD>                        }</TD></TR><TR><TD CLASS="l">757</TD><TD>                        else {</TD></TR><TR><TD CLASS="l">758</TD><TD>                                if (Debug.debugStructuredDocument) {</TD></TR><TR><TD CLASS="l">759</TD><TD>                                        System.out.println(&#34;IStructuredDocument::addStructuredDocumentListener. Adding an instance of &#34; + listener.getClass() + &#34; as a listener on structuredDocument.&#34;); //$NON-NLS-2$//$NON-NLS-1$</TD></TR><TR><TD CLASS="l">760</TD><TD>                                }</TD></TR><TR CLASS="c"><TD CLASS="l">761</TD><TD>                                int oldSize = 0;</TD></TR><TR CLASS="c"><TD CLASS="l">762</TD><TD>                                if (fStructuredDocumentChangingListeners != null) {</TD></TR><TR><TD CLASS="l">763</TD><TD>                                        // normally won't be null, but we need to be sure, for</TD></TR><TR><TD CLASS="l">764</TD><TD>                                        // first</TD></TR><TR><TD CLASS="l">765</TD><TD>                                        // time through</TD></TR><TR CLASS="z"><TD CLASS="l">766</TD><TD>                                        oldSize = fStructuredDocumentChangingListeners.length;</TD></TR><TR><TD CLASS="l">767</TD><TD>                                }</TD></TR><TR CLASS="c"><TD CLASS="l">768</TD><TD>                                int newSize = oldSize + 1;</TD></TR><TR CLASS="c"><TD CLASS="l">769</TD><TD>                                Object[] newListeners = new Object[newSize];</TD></TR><TR CLASS="c"><TD CLASS="l">770</TD><TD>                                if (fStructuredDocumentChangingListeners != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">771</TD><TD>                                        System.arraycopy(fStructuredDocumentChangingListeners, 0, newListeners, 0, oldSize);</TD></TR><TR><TD CLASS="l">772</TD><TD>                                }</TD></TR><TR><TD CLASS="l">773</TD><TD>                                // add listener to last position</TD></TR><TR CLASS="c"><TD CLASS="l">774</TD><TD>                                newListeners[newSize - 1] = listener;</TD></TR><TR><TD CLASS="l">775</TD><TD>                                //</TD></TR><TR><TD CLASS="l">776</TD><TD>                                // now switch new for old</TD></TR><TR CLASS="c"><TD CLASS="l">777</TD><TD>                                fStructuredDocumentChangingListeners = newListeners;</TD></TR><TR><TD CLASS="l">778</TD><TD>                                //</TD></TR><TR><TD CLASS="l">779</TD><TD>                                // when a listener is added,</TD></TR><TR><TD CLASS="l">780</TD><TD>                                // send the new model event to that one particular listener,</TD></TR><TR><TD CLASS="l">781</TD><TD>                                // so it</TD></TR><TR><TD CLASS="l">782</TD><TD>                                // can initialize itself with the current state of the model</TD></TR><TR><TD CLASS="l">783</TD><TD>                                // listener.newModel(new NewModelEvent(this, listener));</TD></TR><TR><TD CLASS="l">784</TD><TD>                        }</TD></TR><TR><TD CLASS="l">785</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">786</TD><TD>        }</TD></TR><TR><TD CLASS="l">787</TD><TD> </TD></TR><TR><TD CLASS="l">788</TD><TD>        /**</TD></TR><TR><TD CLASS="l">789</TD><TD>         * We manage our own document listners, instead of delegating to our</TD></TR><TR><TD CLASS="l">790</TD><TD>         * parentDocument, so we can fire at very end (and not when the</TD></TR><TR><TD CLASS="l"><A NAME="7b">791</A></TD><TD>         * parentDocument changes).</TD></TR><TR><TD CLASS="l">792</TD><TD>         * </TD></TR><TR><TD CLASS="l">793</TD><TD>         */</TD></TR><TR><TD CLASS="l">794</TD><TD>        public void addDocumentListener(IDocumentListener listener) {</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="81% line coverage (13 out of 16 instructions)">795</TD><TD TITLE="81% line coverage (13 out of 16 instructions)">                synchronized (listenerLock) {</TD></TR><TR><TD CLASS="l">796</TD><TD> </TD></TR><TR><TD CLASS="l">797</TD><TD>                        // make sure listener is not already in listening</TD></TR><TR><TD CLASS="l">798</TD><TD>                        // (and if it is, print a warning to aid debugging, if needed)</TD></TR><TR CLASS="c"><TD CLASS="l">799</TD><TD>                        if (!Utilities.contains(fDocumentListeners, listener)) {</TD></TR><TR CLASS="c"><TD CLASS="l">800</TD><TD>                                int oldSize = 0;</TD></TR><TR CLASS="c"><TD CLASS="l">801</TD><TD>                                if (fDocumentListeners != null) {</TD></TR><TR><TD CLASS="l">802</TD><TD>                                        // normally won't be null, but we need to be sure, for</TD></TR><TR><TD CLASS="l">803</TD><TD>                                        // first</TD></TR><TR><TD CLASS="l">804</TD><TD>                                        // time through</TD></TR><TR CLASS="c"><TD CLASS="l">805</TD><TD>                                        oldSize = fDocumentListeners.length;</TD></TR><TR><TD CLASS="l">806</TD><TD>                                }</TD></TR><TR CLASS="c"><TD CLASS="l">807</TD><TD>                                int newSize = oldSize + 1;</TD></TR><TR CLASS="c"><TD CLASS="l">808</TD><TD>                                IDocumentListener[] newListeners = null;</TD></TR><TR CLASS="c"><TD CLASS="l">809</TD><TD>                                newListeners = new IDocumentListener[newSize];</TD></TR><TR CLASS="c"><TD CLASS="l">810</TD><TD>                                if (fDocumentListeners != null) {</TD></TR><TR CLASS="c"><TD CLASS="l">811</TD><TD>                                        System.arraycopy(fDocumentListeners, 0, newListeners, 0, oldSize);</TD></TR><TR><TD CLASS="l">812</TD><TD>                                }</TD></TR><TR><TD CLASS="l">813</TD><TD>                                // add listener to last position</TD></TR><TR CLASS="c"><TD CLASS="l">814</TD><TD>                                newListeners[newSize - 1] = listener;</TD></TR><TR><TD CLASS="l">815</TD><TD>                                // now switch new for old</TD></TR><TR CLASS="c"><TD CLASS="l">816</TD><TD>                                fDocumentListeners = newListeners;</TD></TR><TR><TD CLASS="l">817</TD><TD>                        }</TD></TR><TR><TD CLASS="l">818</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">819</TD><TD>        }</TD></TR><TR><TD CLASS="l">820</TD><TD> </TD></TR><TR><TD CLASS="l">821</TD><TD>        /*</TD></TR><TR><TD CLASS="l">822</TD><TD>         * @see org.eclipse.jface.text.IDocument#addDocumentPartitioningListener(org.eclipse.jface.text.IDocumentPartitioningListener)</TD></TR><TR><TD CLASS="l">823</TD><TD>         * </TD></TR><TR><TD CLASS="l">824</TD><TD>         * Registers the document partitioning listener with the document. After</TD></TR><TR><TD CLASS="l">825</TD><TD>         * registration the IDocumentPartitioningListener is informed about each</TD></TR><TR><TD CLASS="l">826</TD><TD>         * partition change cause by a document manipulation. If a document</TD></TR><TR><TD CLASS="l">827</TD><TD>         * partitioning listener is also a document listener, the following</TD></TR><TR><TD CLASS="l">828</TD><TD>         * notification sequence is guaranteed if a document manipulation changes</TD></TR><TR><TD CLASS="l">829</TD><TD>         * the document partitioning: 1)</TD></TR><TR><TD CLASS="l">830</TD><TD>         * listener.documentAboutToBeChanged(DocumentEvent); 2)</TD></TR><TR><TD CLASS="l">831</TD><TD>         * listener.documentPartitioningChanged(); 3)</TD></TR><TR><TD CLASS="l">832</TD><TD>         * listener.documentChanged(DocumentEvent); If the listener is already</TD></TR><TR><TD CLASS="l">833</TD><TD>         * registered nothing happens.</TD></TR><TR><TD CLASS="l">834</TD><TD>         * </TD></TR><TR><TD CLASS="l"><A NAME="77">835</A></TD><TD>         * @see IDocumentPartitioningListener</TD></TR><TR><TD CLASS="l">836</TD><TD>         */</TD></TR><TR><TD CLASS="l">837</TD><TD> </TD></TR><TR><TD CLASS="l">838</TD><TD>        public void addDocumentPartitioningListener(IDocumentPartitioningListener listener) {</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="81% line coverage (13 out of 16 instructions)">839</TD><TD TITLE="81% line coverage (13 out of 16 instructions)">                synchronized (listenerLock) {</TD></TR><TR><TD CLASS="l">840</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">841</TD><TD>                        Assert.isNotNull(listener);</TD></TR><TR CLASS="c"><TD CLASS="l">842</TD><TD>                        if (fDocumentPartitioningListeners == null) {</TD></TR><TR CLASS="c"><TD CLASS="l">843</TD><TD>                                fDocumentPartitioningListeners = new ArrayList(1);</TD></TR><TR><TD CLASS="l">844</TD><TD>                        }</TD></TR><TR CLASS="c"><TD CLASS="l">845</TD><TD>                        if (!fDocumentPartitioningListeners.contains(listener))</TD></TR><TR CLASS="c"><TD CLASS="l">846</TD><TD>                                fDocumentPartitioningListeners.add(listener);</TD></TR><TR><TD CLASS="l">847</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">848</TD><TD>        }</TD></TR><TR><TD CLASS="l">849</TD><TD> </TD></TR><TR><TD CLASS="l">850</TD><TD>        /**</TD></TR><TR><TD CLASS="l">851</TD><TD>         * Adds the position to the document's default position category. The</TD></TR><TR><TD CLASS="l">852</TD><TD>         * default category must be specified by the implementer. A position that</TD></TR><TR><TD CLASS="l">853</TD><TD>         * has been added to a position category is updated at each change applied</TD></TR><TR><TD CLASS="l">854</TD><TD>         * to the document.</TD></TR><TR><TD CLASS="l">855</TD><TD>         * </TD></TR><TR><TD CLASS="l"><A NAME="9">856</A></TD><TD>         * @exception BadLocationException</TD></TR><TR><TD CLASS="l">857</TD><TD>         *                If position is not a valid range in the document</TD></TR><TR><TD CLASS="l">858</TD><TD>         */</TD></TR><TR><TD CLASS="l">859</TD><TD>        public void addPosition(Position position) throws BadLocationException {</TD></TR><TR CLASS="z"><TD CLASS="l">860</TD><TD>                getPositionManager().addPosition(position);</TD></TR><TR CLASS="z"><TD CLASS="l">861</TD><TD>        }</TD></TR><TR><TD CLASS="l">862</TD><TD> </TD></TR><TR><TD CLASS="l">863</TD><TD>        /**</TD></TR><TR><TD CLASS="l">864</TD><TD>         * @see IDocument#addPosition</TD></TR><TR><TD CLASS="l">865</TD><TD>         * @exception BadLocationException</TD></TR><TR><TD CLASS="l">866</TD><TD>         *                If position is not a valid range in the document</TD></TR><TR><TD CLASS="l"><A NAME="a">867</A></TD><TD>         * @exception BadPositionCategoryException</TD></TR><TR><TD CLASS="l">868</TD><TD>         *                If the category is not defined for the document</TD></TR><TR><TD CLASS="l">869</TD><TD>         */</TD></TR><TR><TD CLASS="l">870</TD><TD>        public void addPosition(String category, Position position) throws BadLocationException, BadPositionCategoryException {</TD></TR><TR CLASS="z"><TD CLASS="l">871</TD><TD>                getPositionManager().addPosition(category, position);</TD></TR><TR CLASS="z"><TD CLASS="l">872</TD><TD>        }</TD></TR><TR><TD CLASS="l">873</TD><TD> </TD></TR><TR><TD CLASS="l"><A NAME="82">874</A></TD><TD>        /**</TD></TR><TR><TD CLASS="l">875</TD><TD>         * @see IDocument#addPositionCategory</TD></TR><TR><TD CLASS="l">876</TD><TD>         */</TD></TR><TR><TD CLASS="l">877</TD><TD>        public void addPositionCategory(String category) {</TD></TR><TR CLASS="c"><TD CLASS="l">878</TD><TD>                internal_addPositionCategory(category);</TD></TR><TR CLASS="c"><TD CLASS="l">879</TD><TD>        }</TD></TR><TR><TD CLASS="l">880</TD><TD> </TD></TR><TR><TD CLASS="l"><A NAME="83">881</A></TD><TD>        /**</TD></TR><TR><TD CLASS="l">882</TD><TD>         * @see IDocument#addPositionUpdater</TD></TR><TR><TD CLASS="l">883</TD><TD>         */</TD></TR><TR><TD CLASS="l">884</TD><TD>        public void addPositionUpdater(IPositionUpdater updater) {</TD></TR><TR CLASS="c"><TD CLASS="l">885</TD><TD>                internal_addPositionUpdater(updater);</TD></TR><TR CLASS="c"><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><TD CLASS="l">889</TD><TD>         * Adds the given document listener as one which is notified before those</TD></TR><TR><TD CLASS="l">890</TD><TD>         * document listeners added with &lt;code&gt;addDocumentListener&lt;/code&gt; are</TD></TR><TR><TD CLASS="l">891</TD><TD>         * notified. If the given listener is also registered using</TD></TR><TR><TD CLASS="l">892</TD><TD>         * &lt;code&gt;addDocumentListener&lt;/code&gt; it will be notified twice. If the</TD></TR><TR><TD CLASS="l">893</TD><TD>         * listener is already registered nothing happens.</TD></TR><TR><TD CLASS="l">894</TD><TD>         * &lt;p&gt;</TD></TR><TR><TD CLASS="l">895</TD><TD>         * </TD></TR><TR><TD CLASS="l">896</TD><TD>         * This method is not for public use, it may only be called by</TD></TR><TR><TD CLASS="l">897</TD><TD>         * implementers of &lt;code&gt;IDocumentAdapter&lt;/code&gt; and only if those</TD></TR><TR><TD CLASS="l">898</TD><TD>         * implementers need to implement &lt;code&gt;IDocumentListener&lt;/code&gt;.</TD></TR><TR><TD CLASS="l">899</TD><TD>         * </TD></TR><TR><TD CLASS="l"><A NAME="60">900</A></TD><TD>         * @param documentAdapter</TD></TR><TR><TD CLASS="l">901</TD><TD>         *            the listener to be added as prenotified document listener</TD></TR><TR><TD CLASS="l">902</TD><TD>         */</TD></TR><TR><TD CLASS="l">903</TD><TD>        public void addPrenotifiedDocumentListener(IDocumentListener documentAdapter) {</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="79% line coverage (11 out of 14 instructions)">904</TD><TD TITLE="79% line coverage (11 out of 14 instructions)">                synchronized (listenerLock) {</TD></TR><TR><TD CLASS="l">905</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">906</TD><TD>                        if (fPrenotifiedDocumentListeners != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">907</TD><TD>                                int previousSize = fPrenotifiedDocumentListeners.length;</TD></TR><TR CLASS="z"><TD CLASS="l">908</TD><TD>                                IDocumentListener[] listeners = new IDocumentListener[previousSize + 1];</TD></TR><TR CLASS="z"><TD CLASS="l">909</TD><TD>                                System.arraycopy(fPrenotifiedDocumentListeners, 0, listeners, 0, previousSize);</TD></TR><TR CLASS="z"><TD CLASS="l">910</TD><TD>                                listeners[previousSize] = documentAdapter;</TD></TR><TR CLASS="z"><TD CLASS="l">911</TD><TD>                                fPrenotifiedDocumentListeners = listeners;</TD></TR><TR><TD CLASS="l">912</TD><TD>                        }</TD></TR><TR><TD CLASS="l">913</TD><TD>                        else {</TD></TR><TR CLASS="c"><TD CLASS="l">914</TD><TD>                                fPrenotifiedDocumentListeners = new IDocumentListener[1];</TD></TR><TR CLASS="c"><TD CLASS="l">915</TD><TD>                                fPrenotifiedDocumentListeners[0] = documentAdapter;</TD></TR><TR><TD CLASS="l">916</TD><TD>                        }</TD></TR><TR><TD CLASS="l">917</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">918</TD><TD>        }</TD></TR><TR><TD CLASS="l">919</TD><TD> </TD></TR><TR><TD CLASS="l">920</TD><TD>        /*</TD></TR><TR><TD CLASS="l">921</TD><TD>         * (non-Javadoc)</TD></TR><TR><TD CLASS="l">922</TD><TD>         * </TD></TR><TR><TD CLASS="l"><A NAME="b">923</A></TD><TD>         * @see java.lang.CharSequence#charAt(int)</TD></TR><TR><TD CLASS="l">924</TD><TD>         */</TD></TR><TR><TD CLASS="l">925</TD><TD>        public char charAt(int arg0) {</TD></TR><TR><TD CLASS="l">926</TD><TD>                try {</TD></TR><TR CLASS="z"><TD CLASS="l">927</TD><TD>                        return getChar(0);</TD></TR><TR><TD CLASS="l">928</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">929</TD><TD>                catch (BadLocationException e) {</TD></TR><TR CLASS="z"><TD CLASS="l">930</TD><TD>                        throw new IndexOutOfBoundsException();</TD></TR><TR><TD CLASS="l">931</TD><TD>                }</TD></TR><TR><TD CLASS="l">932</TD><TD>        }</TD></TR><TR><TD CLASS="l">933</TD><TD> </TD></TR><TR><TD CLASS="l">934</TD><TD>        /**</TD></TR><TR><TD CLASS="l">935</TD><TD>         * This form of the API removes all read only positions, as should be done</TD></TR><TR><TD CLASS="l">936</TD><TD>         * we 'setText' is called. Note: an alternative algorithm may simply</TD></TR><TR><TD CLASS="l"><A NAME="c">937</A></TD><TD>         * remove the category (and it would get added back in later, if/when</TD></TR><TR><TD CLASS="l">938</TD><TD>         * readonly regions added.</TD></TR><TR><TD CLASS="l">939</TD><TD>         */</TD></TR><TR><TD CLASS="l">940</TD><TD>        private void clearReadOnly() {</TD></TR><TR CLASS="z"><TD CLASS="l">941</TD><TD>                Position[] positions = null;</TD></TR><TR><TD CLASS="l">942</TD><TD>                try {</TD></TR><TR CLASS="z"><TD CLASS="l">943</TD><TD>                        positions = getPositions(READ_ONLY_REGIONS_CATEGORY);</TD></TR><TR><TD CLASS="l">944</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">945</TD><TD>                catch (BadPositionCategoryException e) {</TD></TR><TR CLASS="z"><TD CLASS="l">946</TD><TD>                        Logger.logException(&#34;program error: should never occur&#34;, e); //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">947</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">948</TD><TD>                for (int i = 0; i &lt; positions.length; i++) {</TD></TR><TR CLASS="z"><TD CLASS="l">949</TD><TD>                        Position position = positions[i];</TD></TR><TR><TD CLASS="l">950</TD><TD>                        // note we don't fire the &#34;about to change&#34; or &#34;changed&#34; events,</TD></TR><TR><TD CLASS="l">951</TD><TD>                        // since presumably, text is all going away and being replaced</TD></TR><TR><TD CLASS="l">952</TD><TD>                        // anyway.</TD></TR><TR CLASS="z"><TD CLASS="l">953</TD><TD>                        position.delete();</TD></TR><TR><TD CLASS="l">954</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">955</TD><TD>        }</TD></TR><TR><TD CLASS="l">956</TD><TD> </TD></TR><TR><TD CLASS="l">957</TD><TD> </TD></TR><TR><TD CLASS="l">958</TD><TD>        public void clearReadOnly(int startOffset, int length) {</TD></TR><TR><TD CLASS="l"><A NAME="5a">959</A></TD><TD>                // TODO DW I still need to implement smarter algorithm that</TD></TR><TR><TD CLASS="l">960</TD><TD>                // adust existing RO regions, if needed. For now, I'll just</TD></TR><TR><TD CLASS="l">961</TD><TD>                // remove any that overlap.</TD></TR><TR><TD CLASS="l">962</TD><TD>                try {</TD></TR><TR CLASS="c"><TD CLASS="l">963</TD><TD>                        Position[] positions = getPositions(READ_ONLY_REGIONS_CATEGORY);</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="92% line coverage (12 out of 13 instructions)">964</TD><TD TITLE="92% line coverage (12 out of 13 instructions)">                        for (int i = 0; i &lt; positions.length; i++) {</TD></TR><TR CLASS="z"><TD CLASS="l">965</TD><TD>                                Position position = positions[i];</TD></TR><TR CLASS="z"><TD CLASS="l">966</TD><TD>                                if (position.overlapsWith(startOffset, length)) {</TD></TR><TR CLASS="z"><TD CLASS="l">967</TD><TD>                                        String effectedText = this.get(startOffset, length);</TD></TR><TR><TD CLASS="l">968</TD><TD>                                        // fDocumentEvent = new DocumentEvent(this, startOffset,</TD></TR><TR><TD CLASS="l">969</TD><TD>                                        // length, effectedText);</TD></TR><TR CLASS="z"><TD CLASS="l">970</TD><TD>                                        fireReadOnlyAboutToBeChanged();</TD></TR><TR CLASS="z"><TD CLASS="l">971</TD><TD>                                        position.delete();</TD></TR><TR CLASS="z"><TD CLASS="l">972</TD><TD>                                        NoChangeEvent noChangeEvent = new NoChangeEvent(this, null, effectedText, startOffset, length);</TD></TR><TR CLASS="z"><TD CLASS="l">973</TD><TD>                                        noChangeEvent.reason = NoChangeEvent.READ_ONLY_STATE_CHANGE;</TD></TR><TR CLASS="z"><TD CLASS="l">974</TD><TD>                                        fireReadOnlyStructuredDocumentEvent(noChangeEvent);</TD></TR><TR><TD CLASS="l">975</TD><TD>                                }</TD></TR><TR><TD CLASS="l">976</TD><TD>                        }</TD></TR><TR><TD CLASS="l">977</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">978</TD><TD>                catch (BadPositionCategoryException e) {</TD></TR><TR><TD CLASS="l">979</TD><TD>                        // just means no readonly regions been defined yet</TD></TR><TR><TD CLASS="l">980</TD><TD>                        // so nothing to do.</TD></TR><TR><TD CLASS="l">981</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">982</TD><TD>        }</TD></TR><TR><TD CLASS="l">983</TD><TD> </TD></TR><TR><TD CLASS="l">984</TD><TD>        /**</TD></TR><TR><TD CLASS="l">985</TD><TD>         * Computes the index at which a &lt;code&gt;Position&lt;/code&gt; with the</TD></TR><TR><TD CLASS="l">986</TD><TD>         * specified offset would be inserted into the given category. As the</TD></TR><TR><TD CLASS="l">987</TD><TD>         * ordering inside a category only depends on the offset, the index must</TD></TR><TR><TD CLASS="l">988</TD><TD>         * be choosen to be the first of all positions with the same offset.</TD></TR><TR><TD CLASS="l">989</TD><TD>         * </TD></TR><TR><TD CLASS="l">990</TD><TD>         * @param category</TD></TR><TR><TD CLASS="l">991</TD><TD>         *            the category in which would be added</TD></TR><TR><TD CLASS="l">992</TD><TD>         * @param offset</TD></TR><TR><TD CLASS="l">993</TD><TD>         *            the position offset to be considered</TD></TR><TR><TD CLASS="l">994</TD><TD>         * @return the index into the category</TD></TR><TR><TD CLASS="l">995</TD><TD>         * @exception BadLocationException</TD></TR><TR><TD CLASS="l">996</TD><TD>         *                if offset is invalid in this document</TD></TR><TR><TD CLASS="l"><A NAME="d">997</A></TD><TD>         * @exception BadPositionCategoryException</TD></TR><TR><TD CLASS="l">998</TD><TD>         *                if category is undefined in this document</TD></TR><TR><TD CLASS="l">999</TD><TD>         */</TD></TR><TR><TD CLASS="l">1000</TD><TD>        public int computeIndexInCategory(String category, int offset) throws org.eclipse.jface.text.BadPositionCategoryException, org.eclipse.jface.text.BadLocationException {</TD></TR><TR CLASS="z"><TD CLASS="l">1001</TD><TD>                return getPositionManager().computeIndexInCategory(category, offset);</TD></TR><TR><TD CLASS="l">1002</TD><TD>        }</TD></TR><TR><TD CLASS="l">1003</TD><TD> </TD></TR><TR><TD CLASS="l">1004</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1005</TD><TD>         * Computes the number of lines in the given text. For a given implementer</TD></TR><TR><TD CLASS="l">1006</TD><TD>         * of this interface this method returns the same result as</TD></TR><TR><TD CLASS="l">1007</TD><TD>         * &lt;code&gt;set(text); getNumberOfLines()&lt;/code&gt;.</TD></TR><TR><TD CLASS="l">1008</TD><TD>         * </TD></TR><TR><TD CLASS="l">1009</TD><TD>         * @param text</TD></TR><TR><TD CLASS="l"><A NAME="e">1010</A></TD><TD>         *            the text whose number of lines should be computed</TD></TR><TR><TD CLASS="l">1011</TD><TD>         * @return the number of lines in the given text</TD></TR><TR><TD CLASS="l">1012</TD><TD>         */</TD></TR><TR><TD CLASS="l">1013</TD><TD>        public int computeNumberOfLines(String text) {</TD></TR><TR CLASS="z"><TD CLASS="l">1014</TD><TD>                return getTracker().computeNumberOfLines(text);</TD></TR><TR><TD CLASS="l">1015</TD><TD>        }</TD></TR><TR><TD CLASS="l">1016</TD><TD> </TD></TR><TR><TD CLASS="l">1017</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1018</TD><TD>         * Computes the partitioning of the given document range using the</TD></TR><TR><TD CLASS="l">1019</TD><TD>         * document's partitioner.</TD></TR><TR><TD CLASS="l">1020</TD><TD>         * </TD></TR><TR><TD CLASS="l">1021</TD><TD>         * @param offset</TD></TR><TR><TD CLASS="l">1022</TD><TD>         *            the document offset at which the range starts</TD></TR><TR><TD CLASS="l">1023</TD><TD>         * @param length</TD></TR><TR><TD CLASS="l">1024</TD><TD>         *            the length of the document range</TD></TR><TR><TD CLASS="l">1025</TD><TD>         * @return a specification of the range's partitioning</TD></TR><TR><TD CLASS="l"><A NAME="f">1026</A></TD><TD>         * @throws BadLocationException</TD></TR><TR><TD CLASS="l">1027</TD><TD>         * @throws BadPartitioningException</TD></TR><TR><TD CLASS="l">1028</TD><TD>         */</TD></TR><TR><TD CLASS="l">1029</TD><TD>        public ITypedRegion[] computePartitioning(int offset, int length) throws BadLocationException {</TD></TR><TR CLASS="z"><TD CLASS="l">1030</TD><TD>                ITypedRegion[] typedRegions = null;</TD></TR><TR><TD CLASS="l">1031</TD><TD>                try {</TD></TR><TR CLASS="z"><TD CLASS="l">1032</TD><TD>                        typedRegions = computePartitioning(IStructuredPartitioning.DEFAULT_STRUCTURED_PARTITIONING, offset, length, false);</TD></TR><TR><TD CLASS="l">1033</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1034</TD><TD>                catch (BadPartitioningException e) {</TD></TR><TR><TD CLASS="l">1035</TD><TD>                        // impossible in this context</TD></TR><TR CLASS="z"><TD CLASS="l">1036</TD><TD>                        throw new Error(e);</TD></TR><TR><TD CLASS="l">1037</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1038</TD><TD>                if (typedRegions == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1039</TD><TD>                        typedRegions = new ITypedRegion[0];</TD></TR><TR><TD CLASS="l">1040</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1041</TD><TD>                return typedRegions;</TD></TR><TR><TD CLASS="l"><A NAME="5f">1042</A></TD><TD>        }</TD></TR><TR><TD CLASS="l">1043</TD><TD> </TD></TR><TR><TD CLASS="l">1044</TD><TD> </TD></TR><TR><TD CLASS="l">1045</TD><TD>        public ITypedRegion[] computePartitioning(String partitioning, int offset, int length, boolean includeZeroLengthPartitions) throws BadLocationException, BadPartitioningException {</TD></TR><TR CLASS="c"><TD CLASS="l">1046</TD><TD>                if ((0 &gt; offset) || (0 &gt; length) || (offset + length &gt; getLength()))</TD></TR><TR CLASS="z"><TD CLASS="l">1047</TD><TD>                        throw new BadLocationException();</TD></TR><TR><TD CLASS="l">1048</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1049</TD><TD>                IDocumentPartitioner partitioner = getDocumentPartitioner(partitioning);</TD></TR><TR><TD CLASS="l">1050</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1051</TD><TD>                if (partitioner instanceof IDocumentPartitionerExtension2)</TD></TR><TR CLASS="z"><TD CLASS="l">1052</TD><TD>                        return ((IDocumentPartitionerExtension2) partitioner).computePartitioning(offset, length, includeZeroLengthPartitions);</TD></TR><TR CLASS="c"><TD CLASS="l">1053</TD><TD>                else if (partitioner != null)</TD></TR><TR CLASS="c"><TD CLASS="l">1054</TD><TD>                        return partitioner.computePartitioning(offset, length);</TD></TR><TR CLASS="z"><TD CLASS="l">1055</TD><TD>                else if (IStructuredPartitioning.DEFAULT_STRUCTURED_PARTITIONING.equals(partitioning))</TD></TR><TR CLASS="z"><TD CLASS="l">1056</TD><TD>                        return new TypedRegion[]{new TypedRegion(offset, length, DEFAULT_CONTENT_TYPE)};</TD></TR><TR><TD CLASS="l">1057</TD><TD>                else</TD></TR><TR CLASS="z"><TD CLASS="l">1058</TD><TD>                        throw new BadPartitioningException();</TD></TR><TR><TD CLASS="l">1059</TD><TD>        }</TD></TR><TR><TD CLASS="l">1060</TD><TD> </TD></TR><TR><TD CLASS="l"><A NAME="10">1061</A></TD><TD>        /**</TD></TR><TR><TD CLASS="l">1062</TD><TD>         * @see IDocument#containsPosition</TD></TR><TR><TD CLASS="l">1063</TD><TD>         */</TD></TR><TR><TD CLASS="l">1064</TD><TD>        public boolean containsPosition(String category, int offset, int length) {</TD></TR><TR CLASS="z"><TD CLASS="l">1065</TD><TD>                return getPositionManager().containsPosition(category, offset, length);</TD></TR><TR><TD CLASS="l">1066</TD><TD>        }</TD></TR><TR><TD CLASS="l">1067</TD><TD> </TD></TR><TR><TD CLASS="l"><A NAME="11">1068</A></TD><TD>        /**</TD></TR><TR><TD CLASS="l">1069</TD><TD>         * @see IDocument#containsPositionCategory</TD></TR><TR><TD CLASS="l">1070</TD><TD>         */</TD></TR><TR><TD CLASS="l">1071</TD><TD>        public boolean containsPositionCategory(String category) {</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="63">1072</A></TD><TD>                return getPositionManager().containsPositionCategory(category);</TD></TR><TR><TD CLASS="l">1073</TD><TD>        }</TD></TR><TR><TD CLASS="l">1074</TD><TD> </TD></TR><TR><TD CLASS="l">1075</TD><TD>        public boolean containsReadOnly(int startOffset, int length) {</TD></TR><TR CLASS="c"><TD CLASS="l">1076</TD><TD>                boolean result = false;</TD></TR><TR><TD CLASS="l">1077</TD><TD>                try {</TD></TR><TR CLASS="c"><TD CLASS="l">1078</TD><TD>                        Position[] positions = getPositions(READ_ONLY_REGIONS_CATEGORY);</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="93% line coverage (14 out of 15 instructions)">1079</TD><TD TITLE="93% line coverage (14 out of 15 instructions)">                        for (int i = 0; i &lt; positions.length; i++) {</TD></TR><TR CLASS="z"><TD CLASS="l">1080</TD><TD>                                Position position = positions[i];</TD></TR><TR CLASS="z"><TD CLASS="l">1081</TD><TD>                                if (position.overlapsWith(startOffset, length)) {</TD></TR><TR CLASS="z"><TD CLASS="l">1082</TD><TD>                                        result = true;</TD></TR><TR CLASS="z"><TD CLASS="l">1083</TD><TD>                                        break;</TD></TR><TR><TD CLASS="l">1084</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1085</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1086</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1087</TD><TD>                catch (BadPositionCategoryException e) {</TD></TR><TR><TD CLASS="l">1088</TD><TD>                        // just means no readonly regions been defined yet</TD></TR><TR><TD CLASS="l">1089</TD><TD>                        // so obviously false</TD></TR><TR CLASS="z"><TD CLASS="l">1090</TD><TD>                        result = false;</TD></TR><TR><TD CLASS="l">1091</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="59">1092</A></TD><TD>                return result;</TD></TR><TR><TD CLASS="l">1093</TD><TD>        }</TD></TR><TR><TD CLASS="l">1094</TD><TD> </TD></TR><TR><TD CLASS="l">1095</TD><TD>        private void executePostNotificationChanges() {</TD></TR><TR CLASS="c"><TD CLASS="l">1096</TD><TD>                if (fStoppedCount &gt; 0)</TD></TR><TR CLASS="z"><TD CLASS="l">1097</TD><TD>                        return;</TD></TR><TR CLASS="c"><TD CLASS="l">1098</TD><TD>                while (fPostNotificationChanges != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1099</TD><TD>                        List changes = fPostNotificationChanges;</TD></TR><TR CLASS="z"><TD CLASS="l">1100</TD><TD>                        fPostNotificationChanges = null;</TD></TR><TR CLASS="z"><TD CLASS="l">1101</TD><TD>                        Iterator e = changes.iterator();</TD></TR><TR CLASS="z"><TD CLASS="l">1102</TD><TD>                        while (e.hasNext()) {</TD></TR><TR CLASS="z"><TD CLASS="l">1103</TD><TD>                                RegisteredReplace replace = (RegisteredReplace) e.next();</TD></TR><TR CLASS="z"><TD CLASS="l">1104</TD><TD>                                replace.fReplace.perform(this, replace.fOwner);</TD></TR><TR><TD CLASS="l">1105</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1106</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">1107</TD><TD>        }</TD></TR><TR><TD CLASS="l">1108</TD><TD> </TD></TR><TR><TD CLASS="l"><A NAME="6e">1109</A></TD><TD>        private void fireDocumentAboutToChanged() {</TD></TR><TR><TD CLASS="l">1110</TD><TD>                // most DocumentAboutToBeChanged listeners do not anticipate</TD></TR><TR><TD CLASS="l">1111</TD><TD>                // DocumentEvent == null. So make sure documentEvent is not</TD></TR><TR><TD CLASS="l">1112</TD><TD>                // null. (this should never happen, yet it does sometimes)</TD></TR><TR CLASS="c"><TD CLASS="l">1113</TD><TD>                if (fDocumentEvent == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1114</TD><TD>                        fDocumentEvent = new NullDocumentEvent();</TD></TR><TR><TD CLASS="l">1115</TD><TD>                }</TD></TR><TR><TD CLASS="l">1116</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1117</TD><TD>                _fireStructuredDocumentAboutToChange(fStructuredDocumentAboutToChangeListeners);</TD></TR><TR><TD CLASS="l">1118</TD><TD>                // Note: the docEvent is created in replaceText API! (or set Text)</TD></TR><TR CLASS="c"><TD CLASS="l">1119</TD><TD>                _fireDocumentAboutToChange(fPrenotifiedDocumentListeners);</TD></TR><TR CLASS="c"><TD CLASS="l">1120</TD><TD>                notifyDocumentPartitionersAboutToChange(fDocumentEvent);</TD></TR><TR CLASS="c"><TD CLASS="l">1121</TD><TD>                _fireDocumentAboutToChange(fDocumentListeners);</TD></TR><TR CLASS="c"><TD CLASS="l">1122</TD><TD>        }</TD></TR><TR><TD CLASS="l">1123</TD><TD> </TD></TR><TR><TD CLASS="l">1124</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1125</TD><TD>         * Fires the document partitioning changed notification to all registered</TD></TR><TR><TD CLASS="l">1126</TD><TD>         * document partitioning listeners. Uses a robust iterator.</TD></TR><TR><TD CLASS="l">1127</TD><TD>         * </TD></TR><TR><TD CLASS="l">1128</TD><TD>         * @param event</TD></TR><TR><TD CLASS="l">1129</TD><TD>         *            the document partitioning changed event</TD></TR><TR><TD CLASS="l"><A NAME="55">1130</A></TD><TD>         * </TD></TR><TR><TD CLASS="l">1131</TD><TD>         * @see IDocumentPartitioningListenerExtension2</TD></TR><TR><TD CLASS="l">1132</TD><TD>         */</TD></TR><TR><TD CLASS="l">1133</TD><TD>        protected void fireDocumentPartitioningChanged(DocumentPartitioningChangedEvent event) {</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="43% line coverage (3 out of 7 instructions)">1134</TD><TD TITLE="43% line coverage (3 out of 7 instructions)">                if (fDocumentPartitioningListeners == null || fDocumentPartitioningListeners.size() == 0)</TD></TR><TR CLASS="c"><TD CLASS="l">1135</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">1136</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1137</TD><TD>                List list = new ArrayList(fDocumentPartitioningListeners);</TD></TR><TR CLASS="z"><TD CLASS="l">1138</TD><TD>                Iterator e = list.iterator();</TD></TR><TR CLASS="z"><TD CLASS="l">1139</TD><TD>                while (e.hasNext()) {</TD></TR><TR CLASS="z"><TD CLASS="l">1140</TD><TD>                        IDocumentPartitioningListener l = (IDocumentPartitioningListener) e.next();</TD></TR><TR CLASS="z"><TD CLASS="l">1141</TD><TD>                        if (l instanceof IDocumentPartitioningListenerExtension2) {</TD></TR><TR CLASS="z"><TD CLASS="l">1142</TD><TD>                                IDocumentPartitioningListenerExtension2 extension2 = (IDocumentPartitioningListenerExtension2) l;</TD></TR><TR CLASS="z"><TD CLASS="l">1143</TD><TD>                                extension2.documentPartitioningChanged(event);</TD></TR><TR><TD CLASS="l">1144</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">1145</TD><TD>                        else if (l instanceof IDocumentPartitioningListenerExtension) {</TD></TR><TR CLASS="z"><TD CLASS="l">1146</TD><TD>                                IDocumentPartitioningListenerExtension extension = (IDocumentPartitioningListenerExtension) l;</TD></TR><TR CLASS="z"><TD CLASS="l">1147</TD><TD>                                extension.documentPartitioningChanged(this, event.getCoverage());</TD></TR><TR><TD CLASS="l">1148</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1149</TD><TD>                        else {</TD></TR><TR CLASS="z"><TD CLASS="l">1150</TD><TD>                                l.documentPartitioningChanged(this);</TD></TR><TR><TD CLASS="l">1151</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1152</TD><TD>                }</TD></TR><TR><TD CLASS="l"><A NAME="13">1153</A></TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1154</TD><TD>        }</TD></TR><TR><TD CLASS="l">1155</TD><TD> </TD></TR><TR><TD CLASS="l">1156</TD><TD>        private void fireReadOnlyAboutToBeChanged() {</TD></TR><TR CLASS="z"><TD CLASS="l">1157</TD><TD>                _fireStructuredDocumentAboutToChange(fStructuredDocumentAboutToChangeListeners);</TD></TR><TR><TD CLASS="l">1158</TD><TD>                // Note: the docEvent is created in replaceText API! (or set Text)</TD></TR><TR><TD CLASS="l">1159</TD><TD>                // _fireDocumentAboutToChange(fPrenotifiedDocumentListeners);</TD></TR><TR><TD CLASS="l"><A NAME="14">1160</A></TD><TD>                // _fireDocumentAboutToChange(fDocumentListeners);</TD></TR><TR CLASS="z"><TD CLASS="l">1161</TD><TD>        }</TD></TR><TR><TD CLASS="l">1162</TD><TD> </TD></TR><TR><TD CLASS="l">1163</TD><TD>        private void fireReadOnlyStructuredDocumentEvent(NoChangeEvent event) {</TD></TR><TR CLASS="z"><TD CLASS="l">1164</TD><TD>                _fireEvent(fStructuredDocumentChangingListeners, event);</TD></TR><TR CLASS="z"><TD CLASS="l">1165</TD><TD>                _fireEvent(fStructuredDocumentChangedListeners, event);</TD></TR><TR><TD CLASS="l">1166</TD><TD>                // _fireDocumentChanged(fPrenotifiedDocumentListeners, event);</TD></TR><TR><TD CLASS="l">1167</TD><TD>                // _fireDocumentChanged(fDocumentListeners, event);</TD></TR><TR><TD CLASS="l"><A NAME="15">1168</A></TD><TD>                // _clearDocumentEvent();</TD></TR><TR CLASS="z"><TD CLASS="l">1169</TD><TD>        }</TD></TR><TR><TD CLASS="l">1170</TD><TD> </TD></TR><TR><TD CLASS="l">1171</TD><TD>        private void fireStructuredDocumentEvent(NoChangeEvent event) {</TD></TR><TR CLASS="z"><TD CLASS="l">1172</TD><TD>                _fireEvent(fStructuredDocumentChangingListeners, event);</TD></TR><TR CLASS="z"><TD CLASS="l">1173</TD><TD>                _fireEvent(fStructuredDocumentChangedListeners, event);</TD></TR><TR CLASS="z"><TD CLASS="l">1174</TD><TD>                _fireDocumentChanged(fPrenotifiedDocumentListeners, event);</TD></TR><TR CLASS="z"><TD CLASS="l">1175</TD><TD>                notifyDocumentPartitionersDocumentChanged(event);</TD></TR><TR CLASS="z"><TD CLASS="l">1176</TD><TD>                _fireDocumentChanged(fDocumentListeners, event);</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="16">1177</A></TD><TD>                _clearDocumentEvent();</TD></TR><TR CLASS="z"><TD CLASS="l">1178</TD><TD>        }</TD></TR><TR><TD CLASS="l">1179</TD><TD> </TD></TR><TR><TD CLASS="l">1180</TD><TD>        private void fireStructuredDocumentEvent(RegionChangedEvent event) {</TD></TR><TR CLASS="z"><TD CLASS="l">1181</TD><TD>                _fireEvent(fStructuredDocumentChangingListeners, event);</TD></TR><TR CLASS="z"><TD CLASS="l">1182</TD><TD>                _fireEvent(fStructuredDocumentChangedListeners, event);</TD></TR><TR CLASS="z"><TD CLASS="l">1183</TD><TD>                _fireDocumentChanged(fPrenotifiedDocumentListeners, event);</TD></TR><TR CLASS="z"><TD CLASS="l">1184</TD><TD>                notifyDocumentPartitionersDocumentChanged(event);</TD></TR><TR CLASS="z"><TD CLASS="l">1185</TD><TD>                _fireDocumentChanged(fDocumentListeners, event);</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="17">1186</A></TD><TD>                _clearDocumentEvent();</TD></TR><TR CLASS="z"><TD CLASS="l">1187</TD><TD>        }</TD></TR><TR><TD CLASS="l">1188</TD><TD> </TD></TR><TR><TD CLASS="l">1189</TD><TD>        private void fireStructuredDocumentEvent(RegionsReplacedEvent event) {</TD></TR><TR CLASS="z"><TD CLASS="l">1190</TD><TD>                _fireEvent(fStructuredDocumentChangingListeners, event);</TD></TR><TR CLASS="z"><TD CLASS="l">1191</TD><TD>                _fireEvent(fStructuredDocumentChangedListeners, event);</TD></TR><TR CLASS="z"><TD CLASS="l">1192</TD><TD>                _fireDocumentChanged(fPrenotifiedDocumentListeners, event);</TD></TR><TR CLASS="z"><TD CLASS="l">1193</TD><TD>                notifyDocumentPartitionersDocumentChanged(event);</TD></TR><TR CLASS="z"><TD CLASS="l">1194</TD><TD>                _fireDocumentChanged(fDocumentListeners, event);</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="84">1195</A></TD><TD>                _clearDocumentEvent();</TD></TR><TR CLASS="z"><TD CLASS="l">1196</TD><TD>        }</TD></TR><TR><TD CLASS="l">1197</TD><TD> </TD></TR><TR><TD CLASS="l">1198</TD><TD>        private void fireStructuredDocumentEvent(StructuredDocumentRegionsReplacedEvent event) {</TD></TR><TR CLASS="c"><TD CLASS="l">1199</TD><TD>                _fireEvent(fStructuredDocumentChangingListeners, event);</TD></TR><TR CLASS="c"><TD CLASS="l">1200</TD><TD>                _fireEvent(fStructuredDocumentChangedListeners, event);</TD></TR><TR CLASS="c"><TD CLASS="l">1201</TD><TD>                _fireDocumentChanged(fPrenotifiedDocumentListeners, event);</TD></TR><TR CLASS="c"><TD CLASS="l">1202</TD><TD>                notifyDocumentPartitionersDocumentChanged(event);</TD></TR><TR CLASS="c"><TD CLASS="l">1203</TD><TD>                _fireDocumentChanged(fDocumentListeners, event);</TD></TR><TR CLASS="c"><TD CLASS="l">1204</TD><TD>                _clearDocumentEvent();</TD></TR><TR CLASS="c"><TD CLASS="l">1205</TD><TD>        }</TD></TR><TR><TD CLASS="l">1206</TD><TD> </TD></TR><TR><TD CLASS="l"><A NAME="85">1207</A></TD><TD>        /**</TD></TR><TR><TD CLASS="l">1208</TD><TD>         * Returns the document's complete text.</TD></TR><TR><TD CLASS="l">1209</TD><TD>         */</TD></TR><TR><TD CLASS="l">1210</TD><TD>        public String get() {</TD></TR><TR CLASS="c"><TD CLASS="l">1211</TD><TD>                return getStore().get(0, getLength());</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>        /**</TD></TR><TR><TD CLASS="l">1215</TD><TD>         * Returns length characters from the document's text starting from the</TD></TR><TR><TD CLASS="l">1216</TD><TD>         * specified position.</TD></TR><TR><TD CLASS="l">1217</TD><TD>         * </TD></TR><TR><TD CLASS="l">1218</TD><TD>         * @throws BadLocationException</TD></TR><TR><TD CLASS="l">1219</TD><TD>         * </TD></TR><TR><TD CLASS="l"><A NAME="5b">1220</A></TD><TD>         * @exception BadLocationException</TD></TR><TR><TD CLASS="l">1221</TD><TD>         *                If the range is not valid in the document</TD></TR><TR><TD CLASS="l">1222</TD><TD>         */</TD></TR><TR><TD CLASS="l">1223</TD><TD>        public String get(int offset, int length) {</TD></TR><TR CLASS="c"><TD CLASS="l">1224</TD><TD>                String result = null;</TD></TR><TR CLASS="c"><TD CLASS="l">1225</TD><TD>                int myLength = getLength();</TD></TR><TR CLASS="c"><TD CLASS="l">1226</TD><TD>                if (0 &gt; offset)</TD></TR><TR CLASS="z"><TD CLASS="l">1227</TD><TD>                        offset = 0;</TD></TR><TR CLASS="c"><TD CLASS="l">1228</TD><TD>                if (0 &gt; length)</TD></TR><TR CLASS="z"><TD CLASS="l">1229</TD><TD>                        length = 0;</TD></TR><TR CLASS="c"><TD CLASS="l">1230</TD><TD>                if (offset + length &gt; myLength) {</TD></TR><TR><TD CLASS="l">1231</TD><TD>                        // first try adjusting length to fit</TD></TR><TR CLASS="z"><TD CLASS="l">1232</TD><TD>                        int lessLength = myLength - offset;</TD></TR><TR CLASS="z"><TD CLASS="l">1233</TD><TD>                        if ((lessLength &gt;= 0) &amp;&amp; (offset + lessLength == myLength)) {</TD></TR><TR CLASS="z"><TD CLASS="l">1234</TD><TD>                                length = lessLength;</TD></TR><TR><TD CLASS="l">1235</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1236</TD><TD>                        else {</TD></TR><TR><TD CLASS="l">1237</TD><TD>                                // second, try offset</TD></TR><TR CLASS="z"><TD CLASS="l">1238</TD><TD>                                int moreOffset = myLength - length;</TD></TR><TR CLASS="z"><TD CLASS="l">1239</TD><TD>                                if ((moreOffset &gt;= 0) &amp;&amp; (moreOffset + length == myLength)) {</TD></TR><TR CLASS="z"><TD CLASS="l">1240</TD><TD>                                        offset = moreOffset;</TD></TR><TR><TD CLASS="l">1241</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1242</TD><TD>                                else {</TD></TR><TR><TD CLASS="l">1243</TD><TD>                                        // can happen if myLength is 0.</TD></TR><TR><TD CLASS="l">1244</TD><TD>                                        // no adjustment possible.</TD></TR><TR CLASS="z"><TD CLASS="l">1245</TD><TD>                                        result = new String();</TD></TR><TR><TD CLASS="l">1246</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1247</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1248</TD><TD> </TD></TR><TR><TD CLASS="l">1249</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">1250</TD><TD>                if (result == null) {</TD></TR><TR CLASS="c"><TD CLASS="l">1251</TD><TD>                        result = getStore().get(offset, length);</TD></TR><TR><TD CLASS="l">1252</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="19">1253</A></TD><TD>                return result;</TD></TR><TR><TD CLASS="l">1254</TD><TD>        }</TD></TR><TR><TD CLASS="l">1255</TD><TD> </TD></TR><TR><TD CLASS="l">1256</TD><TD>        public Object getAdapter(Class adapter) {</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="6f">1257</A></TD><TD>                return Platform.getAdapterManager().getAdapter(this, adapter);</TD></TR><TR><TD CLASS="l">1258</TD><TD>        }</TD></TR><TR><TD CLASS="l">1259</TD><TD> </TD></TR><TR><TD CLASS="l">1260</TD><TD>        IStructuredDocumentRegion getCachedDocumentRegion() {</TD></TR><TR CLASS="c"><TD CLASS="l">1261</TD><TD>                IStructuredDocumentRegion result = null;</TD></TR><TR CLASS="c"><TD CLASS="l">1262</TD><TD>                if (USE_LOCAL_THREAD) {</TD></TR><TR CLASS="c"><TD CLASS="l">1263</TD><TD>                        result = fCurrentDocumnetRegionCache.get();</TD></TR><TR><TD CLASS="l">1264</TD><TD>                }</TD></TR><TR><TD CLASS="l">1265</TD><TD>                else {</TD></TR><TR CLASS="z"><TD CLASS="l">1266</TD><TD>                        result = cachedDocumentRegion;</TD></TR><TR><TD CLASS="l">1267</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">1268</TD><TD>                return result;</TD></TR><TR><TD CLASS="l">1269</TD><TD>        }</TD></TR><TR><TD CLASS="l">1270</TD><TD> </TD></TR><TR><TD CLASS="l">1271</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1272</TD><TD>         * @see IDocument#getChar</TD></TR><TR><TD CLASS="l"><A NAME="66">1273</A></TD><TD>         * @exception BadLocationException</TD></TR><TR><TD CLASS="l">1274</TD><TD>         *                If position is not a valid range in the document</TD></TR><TR><TD CLASS="l">1275</TD><TD>         */</TD></TR><TR><TD CLASS="l">1276</TD><TD>        public char getChar(int pos) throws BadLocationException {</TD></TR><TR CLASS="c"><TD CLASS="l">1277</TD><TD>                char result = 0x00;</TD></TR><TR><TD CLASS="l">1278</TD><TD>                try {</TD></TR><TR CLASS="c"><TD CLASS="l">1279</TD><TD>                        result = getStore().get(pos);</TD></TR><TR><TD CLASS="l">1280</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1281</TD><TD>                catch (IndexOutOfBoundsException e) {</TD></TR><TR CLASS="z"><TD CLASS="l">1282</TD><TD>                        throw new BadLocationException(e.getLocalizedMessage());</TD></TR><TR><TD CLASS="l">1283</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">1284</TD><TD>                return result;</TD></TR><TR><TD CLASS="l">1285</TD><TD>        }</TD></TR><TR><TD CLASS="l">1286</TD><TD> </TD></TR><TR><TD CLASS="l">1287</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="1a">1288</A></TD><TD>         * Returns the type of the document partition containing the given</TD></TR><TR><TD CLASS="l">1289</TD><TD>         * character position.</TD></TR><TR><TD CLASS="l">1290</TD><TD>         */</TD></TR><TR><TD CLASS="l">1291</TD><TD>        public String getContentType(int offset) throws BadLocationException {</TD></TR><TR CLASS="z"><TD CLASS="l">1292</TD><TD>                return getDocumentPartitioner().getContentType(offset);</TD></TR><TR><TD CLASS="l"><A NAME="68">1293</A></TD><TD>        }</TD></TR><TR><TD CLASS="l">1294</TD><TD> </TD></TR><TR><TD CLASS="l">1295</TD><TD> </TD></TR><TR><TD CLASS="l">1296</TD><TD>        public String getContentType(String partitioning, int offset, boolean preferOpenPartitions) throws BadLocationException, BadPartitioningException {</TD></TR><TR CLASS="c"><TD CLASS="l">1297</TD><TD>                if ((0 &gt; offset) || (offset &gt; getLength()))</TD></TR><TR CLASS="z"><TD CLASS="l">1298</TD><TD>                        throw new BadLocationException();</TD></TR><TR><TD CLASS="l">1299</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1300</TD><TD>                IDocumentPartitioner partitioner = getDocumentPartitioner(partitioning);</TD></TR><TR><TD CLASS="l">1301</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1302</TD><TD>                if (partitioner instanceof IDocumentPartitionerExtension2)</TD></TR><TR CLASS="z"><TD CLASS="l">1303</TD><TD>                        return ((IDocumentPartitionerExtension2) partitioner).getContentType(offset, preferOpenPartitions);</TD></TR><TR CLASS="c"><TD CLASS="l">1304</TD><TD>                else if (partitioner != null)</TD></TR><TR CLASS="c"><TD CLASS="l">1305</TD><TD>                        return partitioner.getContentType(offset);</TD></TR><TR CLASS="c"><TD CLASS="l">1306</TD><TD>                else if (IStructuredPartitioning.DEFAULT_STRUCTURED_PARTITIONING.equals(partitioning))</TD></TR><TR CLASS="z"><TD CLASS="l">1307</TD><TD>                        return DEFAULT_CONTENT_TYPE;</TD></TR><TR><TD CLASS="l">1308</TD><TD>                else</TD></TR><TR CLASS="c"><TD CLASS="l">1309</TD><TD>                        throw new BadPartitioningException();</TD></TR><TR><TD CLASS="l">1310</TD><TD>        }</TD></TR><TR><TD CLASS="l">1311</TD><TD> </TD></TR><TR><TD CLASS="l">1312</TD><TD>        /*</TD></TR><TR><TD CLASS="l">1313</TD><TD>         * (non-Javadoc)</TD></TR><TR><TD CLASS="l">1314</TD><TD>         * </TD></TR><TR><TD CLASS="l"><A NAME="1b">1315</A></TD><TD>         * @see org.eclipse.jface.text.IDocumentExtension4#getDefaultLineDelimiter()</TD></TR><TR><TD CLASS="l">1316</TD><TD>         */</TD></TR><TR><TD CLASS="l">1317</TD><TD>        public String getDefaultLineDelimiter() {</TD></TR><TR><TD CLASS="l">1318</TD><TD>                </TD></TR><TR CLASS="z"><TD CLASS="l">1319</TD><TD>                String lineDelimiter= null;</TD></TR><TR><TD CLASS="l">1320</TD><TD>                </TD></TR><TR><TD CLASS="l">1321</TD><TD>                try {</TD></TR><TR CLASS="z"><TD CLASS="l">1322</TD><TD>                        lineDelimiter= getLineDelimiter(0);</TD></TR><TR CLASS="z"><TD CLASS="l">1323</TD><TD>                } catch (BadLocationException x) {</TD></TR><TR><TD CLASS="l">1324</TD><TD>                }</TD></TR><TR><TD CLASS="l">1325</TD><TD>        </TD></TR><TR CLASS="z"><TD CLASS="l">1326</TD><TD>                if (lineDelimiter != null)</TD></TR><TR CLASS="z"><TD CLASS="l">1327</TD><TD>                        return lineDelimiter;</TD></TR><TR><TD CLASS="l">1328</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1329</TD><TD>                if (fInitialLineDelimiter != null)</TD></TR><TR CLASS="z"><TD CLASS="l">1330</TD><TD>                        return fInitialLineDelimiter;</TD></TR><TR><TD CLASS="l">1331</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1332</TD><TD>                String sysLineDelimiter= System.getProperty(&#34;line.separator&#34;); //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">1333</TD><TD>                String[] delimiters= getLegalLineDelimiters();</TD></TR><TR CLASS="z"><TD CLASS="l">1334</TD><TD>                Assert.isTrue(delimiters.length &gt; 0);</TD></TR><TR CLASS="z"><TD CLASS="l">1335</TD><TD>                for (int i= 0; i &lt; delimiters.length; i++) {</TD></TR><TR CLASS="z"><TD CLASS="l">1336</TD><TD>                        if (delimiters[i].equals(sysLineDelimiter)) {</TD></TR><TR CLASS="z"><TD CLASS="l">1337</TD><TD>                                lineDelimiter= sysLineDelimiter;</TD></TR><TR CLASS="z"><TD CLASS="l">1338</TD><TD>                                break;</TD></TR><TR><TD CLASS="l">1339</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1340</TD><TD>                }</TD></TR><TR><TD CLASS="l">1341</TD><TD>                </TD></TR><TR CLASS="z"><TD CLASS="l">1342</TD><TD>                if (lineDelimiter == null)</TD></TR><TR CLASS="z"><TD CLASS="l">1343</TD><TD>                        lineDelimiter= delimiters[0];</TD></TR><TR><TD CLASS="l">1344</TD><TD>        </TD></TR><TR CLASS="z"><TD CLASS="l">1345</TD><TD>                return lineDelimiter;</TD></TR><TR><TD CLASS="l">1346</TD><TD>                </TD></TR><TR><TD CLASS="l">1347</TD><TD>        }</TD></TR><TR><TD CLASS="l">1348</TD><TD> </TD></TR><TR><TD CLASS="l">1349</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1350</TD><TD>         * Returns the document's partitioner.</TD></TR><TR><TD CLASS="l"><A NAME="86">1351</A></TD><TD>         * </TD></TR><TR><TD CLASS="l">1352</TD><TD>         * @see IDocumentPartitioner</TD></TR><TR><TD CLASS="l">1353</TD><TD>         */</TD></TR><TR><TD CLASS="l">1354</TD><TD>        public IDocumentPartitioner getDocumentPartitioner() {</TD></TR><TR CLASS="c"><TD CLASS="l">1355</TD><TD>                return getDocumentPartitioner(IDocumentExtension3.DEFAULT_PARTITIONING);</TD></TR><TR><TD CLASS="l">1356</TD><TD>        }</TD></TR><TR><TD CLASS="l"><A NAME="87">1357</A></TD><TD> </TD></TR><TR><TD CLASS="l">1358</TD><TD> </TD></TR><TR><TD CLASS="l">1359</TD><TD>        public IDocumentPartitioner getDocumentPartitioner(String partitioning) {</TD></TR><TR><TD CLASS="l">1360</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1361</TD><TD>                IDocumentPartitioner documentPartitioner = null;</TD></TR><TR CLASS="c"><TD CLASS="l">1362</TD><TD>                if (fDocumentPartitioners != null) {</TD></TR><TR CLASS="c"><TD CLASS="l">1363</TD><TD>                        documentPartitioner = (IDocumentPartitioner) fDocumentPartitioners.get(partitioning);</TD></TR><TR><TD CLASS="l">1364</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="1c">1365</A></TD><TD>                return documentPartitioner;</TD></TR><TR><TD CLASS="l">1366</TD><TD>        }</TD></TR><TR><TD CLASS="l">1367</TD><TD> </TD></TR><TR><TD CLASS="l">1368</TD><TD>        public EncodingMemento getEncodingMemento() {</TD></TR><TR CLASS="z"><TD CLASS="l">1369</TD><TD>                return encodingMemento;</TD></TR><TR><TD CLASS="l">1370</TD><TD>        }</TD></TR><TR><TD CLASS="l">1371</TD><TD> </TD></TR><TR><TD CLASS="l">1372</TD><TD>        public IStructuredDocumentRegion getFirstStructuredDocumentRegion() {</TD></TR><TR><TD CLASS="l"><A NAME="88">1373</A></TD><TD>                // should we update cachedNode?</TD></TR><TR><TD CLASS="l">1374</TD><TD>                // We should to keep consistent philosophy of remembering last</TD></TR><TR><TD CLASS="l">1375</TD><TD>                // requested position,</TD></TR><TR><TD CLASS="l">1376</TD><TD>                // for efficiency.</TD></TR><TR CLASS="c"><TD CLASS="l">1377</TD><TD>                setCachedDocumentRegion(firstDocumentRegion);</TD></TR><TR CLASS="c"><TD CLASS="l">1378</TD><TD>                return firstDocumentRegion;</TD></TR><TR><TD CLASS="l">1379</TD><TD>        }</TD></TR><TR><TD CLASS="l">1380</TD><TD> </TD></TR><TR><TD CLASS="l">1381</TD><TD>        public IStructuredDocumentRegion getLastStructuredDocumentRegion() {</TD></TR><TR><TD CLASS="l"><A NAME="1d">1382</A></TD><TD>                // should we update cachedNode?</TD></TR><TR><TD CLASS="l">1383</TD><TD>                // We should to keep consistent philosophy of remembering last</TD></TR><TR><TD CLASS="l">1384</TD><TD>                // requested position,</TD></TR><TR><TD CLASS="l">1385</TD><TD>                // for efficiency.</TD></TR><TR CLASS="z"><TD CLASS="l">1386</TD><TD>                setCachedDocumentRegion(lastDocumentRegion);</TD></TR><TR CLASS="z"><TD CLASS="l">1387</TD><TD>                return lastDocumentRegion;</TD></TR><TR><TD CLASS="l">1388</TD><TD>        }</TD></TR><TR><TD CLASS="l">1389</TD><TD> </TD></TR><TR><TD CLASS="l">1390</TD><TD>        /*</TD></TR><TR><TD CLASS="l"><A NAME="1e">1391</A></TD><TD>         * -------------------------- partitions</TD></TR><TR><TD CLASS="l">1392</TD><TD>         * ----------------------------------</TD></TR><TR><TD CLASS="l">1393</TD><TD>         */</TD></TR><TR><TD CLASS="l">1394</TD><TD>        public String[] getLegalContentTypes() {</TD></TR><TR CLASS="z"><TD CLASS="l">1395</TD><TD>                String[] result = null;</TD></TR><TR><TD CLASS="l">1396</TD><TD>                try {</TD></TR><TR CLASS="z"><TD CLASS="l">1397</TD><TD>                        result = getLegalContentTypes(IStructuredPartitioning.DEFAULT_STRUCTURED_PARTITIONING);</TD></TR><TR><TD CLASS="l">1398</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1399</TD><TD>                catch (BadPartitioningException e) {</TD></TR><TR><TD CLASS="l">1400</TD><TD>                        // impossible in this context</TD></TR><TR CLASS="z"><TD CLASS="l">1401</TD><TD>                        throw new Error(e);</TD></TR><TR><TD CLASS="l">1402</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="1f">1403</A></TD><TD>                return result;</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>        public String[] getLegalContentTypes(String partitioning) throws BadPartitioningException {</TD></TR><TR CLASS="z"><TD CLASS="l">1407</TD><TD>                IDocumentPartitioner partitioner = getDocumentPartitioner(partitioning);</TD></TR><TR CLASS="z"><TD CLASS="l">1408</TD><TD>                if (partitioner != null)</TD></TR><TR CLASS="z"><TD CLASS="l">1409</TD><TD>                        return partitioner.getLegalContentTypes();</TD></TR><TR CLASS="z"><TD CLASS="l">1410</TD><TD>                if (IStructuredPartitioning.DEFAULT_STRUCTURED_PARTITIONING.equals(partitioning))</TD></TR><TR CLASS="z"><TD CLASS="l">1411</TD><TD>                        return new String[]{DEFAULT_CONTENT_TYPE};</TD></TR><TR CLASS="z"><TD CLASS="l">1412</TD><TD>                throw new BadPartitioningException();</TD></TR><TR><TD CLASS="l">1413</TD><TD>        }</TD></TR><TR><TD CLASS="l">1414</TD><TD> </TD></TR><TR><TD CLASS="l">1415</TD><TD>        /*</TD></TR><TR><TD CLASS="l"><A NAME="20">1416</A></TD><TD>         * ------------------ line delimiter conversion</TD></TR><TR><TD CLASS="l">1417</TD><TD>         * ---------------------------</TD></TR><TR><TD CLASS="l">1418</TD><TD>         */</TD></TR><TR><TD CLASS="l">1419</TD><TD>        public String[] getLegalLineDelimiters() {</TD></TR><TR CLASS="z"><TD CLASS="l">1420</TD><TD>                return getTracker().getLegalLineDelimiters();</TD></TR><TR><TD CLASS="l">1421</TD><TD>        }</TD></TR><TR><TD CLASS="l">1422</TD><TD> </TD></TR><TR><TD CLASS="l"><A NAME="89">1423</A></TD><TD>        /**</TD></TR><TR><TD CLASS="l">1424</TD><TD>         * @see IDocument#getLength</TD></TR><TR><TD CLASS="l">1425</TD><TD>         */</TD></TR><TR><TD CLASS="l">1426</TD><TD>        public int getLength() {</TD></TR><TR CLASS="c"><TD CLASS="l">1427</TD><TD>                return getStore().getLength();</TD></TR><TR><TD CLASS="l">1428</TD><TD>        }</TD></TR><TR><TD CLASS="l">1429</TD><TD> </TD></TR><TR><TD CLASS="l">1430</TD><TD>        /*</TD></TR><TR><TD CLASS="l">1431</TD><TD>         * (non-Javadoc)</TD></TR><TR><TD CLASS="l"><A NAME="21">1432</A></TD><TD>         * </TD></TR><TR><TD CLASS="l">1433</TD><TD>         * @see org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument#getLineDelimiter()</TD></TR><TR><TD CLASS="l">1434</TD><TD>         */</TD></TR><TR><TD CLASS="l">1435</TD><TD>        public String getLineDelimiter() {</TD></TR><TR CLASS="z"><TD CLASS="l">1436</TD><TD>                return getDefaultLineDelimiter();</TD></TR><TR><TD CLASS="l">1437</TD><TD>        }</TD></TR><TR><TD CLASS="l">1438</TD><TD> </TD></TR><TR><TD CLASS="l">1439</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1440</TD><TD>         * Returns the line delimiter of that line</TD></TR><TR><TD CLASS="l">1441</TD><TD>         * </TD></TR><TR><TD CLASS="l"><A NAME="22">1442</A></TD><TD>         * @exception BadLocationException</TD></TR><TR><TD CLASS="l">1443</TD><TD>         *                If the line number is invalid in the document</TD></TR><TR><TD CLASS="l">1444</TD><TD>         */</TD></TR><TR><TD CLASS="l">1445</TD><TD>        public String getLineDelimiter(int line) throws org.eclipse.jface.text.BadLocationException {</TD></TR><TR CLASS="z"><TD CLASS="l">1446</TD><TD>                return getTracker().getLineDelimiter(line);</TD></TR><TR><TD CLASS="l">1447</TD><TD>        }</TD></TR><TR><TD CLASS="l">1448</TD><TD> </TD></TR><TR><TD CLASS="l">1449</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1450</TD><TD>         * Returns a description of the specified line. The line is described by</TD></TR><TR><TD CLASS="l">1451</TD><TD>         * its offset and its length excluding the line's delimiter.</TD></TR><TR><TD CLASS="l">1452</TD><TD>         * </TD></TR><TR><TD CLASS="l">1453</TD><TD>         * @param line</TD></TR><TR><TD CLASS="l">1454</TD><TD>         *            the line of interest</TD></TR><TR><TD CLASS="l">1455</TD><TD>         * @return a line description</TD></TR><TR><TD CLASS="l"><A NAME="8a">1456</A></TD><TD>         * @exception BadLocationException</TD></TR><TR><TD CLASS="l">1457</TD><TD>         *                if the line number is invalid in this document</TD></TR><TR><TD CLASS="l">1458</TD><TD>         */</TD></TR><TR><TD CLASS="l">1459</TD><TD>        public org.eclipse.jface.text.IRegion getLineInformation(int line) throws org.eclipse.jface.text.BadLocationException {</TD></TR><TR CLASS="c"><TD CLASS="l">1460</TD><TD>                return getTracker().getLineInformation(line);</TD></TR><TR><TD CLASS="l">1461</TD><TD>        }</TD></TR><TR><TD CLASS="l">1462</TD><TD> </TD></TR><TR><TD CLASS="l">1463</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1464</TD><TD>         * Returns a description of the line at the given offset. The description</TD></TR><TR><TD CLASS="l">1465</TD><TD>         * contains the offset and the length of the line excluding the line's</TD></TR><TR><TD CLASS="l">1466</TD><TD>         * delimiter.</TD></TR><TR><TD CLASS="l">1467</TD><TD>         * </TD></TR><TR><TD CLASS="l">1468</TD><TD>         * @param offset</TD></TR><TR><TD CLASS="l">1469</TD><TD>         *            the offset whose line should be described</TD></TR><TR><TD CLASS="l">1470</TD><TD>         * @return a region describing the line</TD></TR><TR><TD CLASS="l"><A NAME="8b">1471</A></TD><TD>         * @exception BadLocationException</TD></TR><TR><TD CLASS="l">1472</TD><TD>         *                if offset is invalid in this document</TD></TR><TR><TD CLASS="l">1473</TD><TD>         */</TD></TR><TR><TD CLASS="l">1474</TD><TD>        public org.eclipse.jface.text.IRegion getLineInformationOfOffset(int offset) throws org.eclipse.jface.text.BadLocationException {</TD></TR><TR CLASS="c"><TD CLASS="l">1475</TD><TD>                return getTracker().getLineInformationOfOffset(offset);</TD></TR><TR><TD CLASS="l">1476</TD><TD>        }</TD></TR><TR><TD CLASS="l">1477</TD><TD> </TD></TR><TR><TD CLASS="l">1478</TD><TD>        /*</TD></TR><TR><TD CLASS="l"><A NAME="23">1479</A></TD><TD>         * ---------------------- line information</TD></TR><TR><TD CLASS="l">1480</TD><TD>         * --------------------------------</TD></TR><TR><TD CLASS="l">1481</TD><TD>         */</TD></TR><TR><TD CLASS="l">1482</TD><TD>        public int getLineLength(int line) throws org.eclipse.jface.text.BadLocationException {</TD></TR><TR CLASS="z"><TD CLASS="l">1483</TD><TD>                return getTracker().getLineLength(line);</TD></TR><TR><TD CLASS="l">1484</TD><TD>        }</TD></TR><TR><TD CLASS="l">1485</TD><TD> </TD></TR><TR><TD CLASS="l">1486</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1487</TD><TD>         * Determines the offset of the first character of the given line.</TD></TR><TR><TD CLASS="l">1488</TD><TD>         * </TD></TR><TR><TD CLASS="l">1489</TD><TD>         * @param line</TD></TR><TR><TD CLASS="l">1490</TD><TD>         *            the line of interest</TD></TR><TR><TD CLASS="l">1491</TD><TD>         * @return the document offset</TD></TR><TR><TD CLASS="l"><A NAME="8c">1492</A></TD><TD>         * @exception BadLocationException</TD></TR><TR><TD CLASS="l">1493</TD><TD>         *                if the line number is invalid in this document</TD></TR><TR><TD CLASS="l">1494</TD><TD>         */</TD></TR><TR><TD CLASS="l">1495</TD><TD>        public int getLineOffset(int line) throws org.eclipse.jface.text.BadLocationException {</TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="5c">1496</A></TD><TD>                return getTracker().getLineOffset(line);</TD></TR><TR><TD CLASS="l">1497</TD><TD>        }</TD></TR><TR><TD CLASS="l">1498</TD><TD> </TD></TR><TR><TD CLASS="l">1499</TD><TD>        public int getLineOfOffset(int offset) {</TD></TR><TR CLASS="c"><TD CLASS="l">1500</TD><TD>                int result = -1;</TD></TR><TR><TD CLASS="l">1501</TD><TD>                try {</TD></TR><TR CLASS="c"><TD CLASS="l">1502</TD><TD>                        result = getTracker().getLineNumberOfOffset(offset);</TD></TR><TR><TD CLASS="l">1503</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1504</TD><TD>                catch (BadLocationException e) {</TD></TR><TR CLASS="z"><TD CLASS="l">1505</TD><TD>                        if (Logger.DEBUG_DOCUMENT)</TD></TR><TR CLASS="z"><TD CLASS="l">1506</TD><TD>                                Logger.log(Logger.INFO, &#34;Dev. Program Info Only: IStructuredDocument::getLineOfOffset: offset out of range, zero assumed. offset = &#34; + offset, e); //$NON-NLS-1$ //$NON-NLS-2$</TD></TR><TR CLASS="z"><TD CLASS="l">1507</TD><TD>                        result = 0;</TD></TR><TR><TD CLASS="l">1508</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">1509</TD><TD>                return result;</TD></TR><TR><TD CLASS="l">1510</TD><TD>        }</TD></TR><TR><TD CLASS="l">1511</TD><TD> </TD></TR><TR><TD CLASS="l">1512</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1513</TD><TD>         * Returns the number of lines in this document</TD></TR><TR><TD CLASS="l"><A NAME="8e">1514</A></TD><TD>         * </TD></TR><TR><TD CLASS="l">1515</TD><TD>         * @return the number of lines in this document</TD></TR><TR><TD CLASS="l">1516</TD><TD>         */</TD></TR><TR><TD CLASS="l">1517</TD><TD>        public int getNumberOfLines() {</TD></TR><TR CLASS="c"><TD CLASS="l">1518</TD><TD>                return getTracker().getNumberOfLines();</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>         * Returns the number of lines which are occupied by a given text range.</TD></TR><TR><TD CLASS="l">1523</TD><TD>         * </TD></TR><TR><TD CLASS="l">1524</TD><TD>         * @param offset</TD></TR><TR><TD CLASS="l">1525</TD><TD>         *            the offset of the specified text range</TD></TR><TR><TD CLASS="l">1526</TD><TD>         * @param length</TD></TR><TR><TD CLASS="l">1527</TD><TD>         *            the length of the specified text range</TD></TR><TR><TD CLASS="l">1528</TD><TD>         * @return the number of lines occupied by the specified range</TD></TR><TR><TD CLASS="l"><A NAME="25">1529</A></TD><TD>         * @exception BadLocationException</TD></TR><TR><TD CLASS="l">1530</TD><TD>         *                if specified range is invalid in this tracker</TD></TR><TR><TD CLASS="l">1531</TD><TD>         */</TD></TR><TR><TD CLASS="l">1532</TD><TD>        public int getNumberOfLines(int offset, int length) throws org.eclipse.jface.text.BadLocationException {</TD></TR><TR CLASS="z"><TD CLASS="l">1533</TD><TD>                return getTracker().getNumberOfLines(offset, length);</TD></TR><TR><TD CLASS="l">1534</TD><TD>        }</TD></TR><TR><TD CLASS="l">1535</TD><TD> </TD></TR><TR><TD CLASS="l"><A NAME="64">1536</A></TD><TD>        /**</TD></TR><TR><TD CLASS="l">1537</TD><TD>         * This is public, temporarily, for use by tag lib classes.</TD></TR><TR><TD CLASS="l">1538</TD><TD>         */</TD></TR><TR><TD CLASS="l">1539</TD><TD>        public RegionParser getParser() {</TD></TR><TR CLASS="c"><TD CLASS="l">1540</TD><TD>                if (fParser == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1541</TD><TD>                        throw new IllegalStateException(&#34;IStructuredDocument::getParser. Parser needs to be set before use&#34;); //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">1542</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">1543</TD><TD>                return fParser;</TD></TR><TR><TD CLASS="l">1544</TD><TD>        }</TD></TR><TR><TD CLASS="l">1545</TD><TD> </TD></TR><TR><TD CLASS="l">1546</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="26">1547</A></TD><TD>         * Returns the document partition in which the position is located. The</TD></TR><TR><TD CLASS="l">1548</TD><TD>         * partition is specified as typed region.</TD></TR><TR><TD CLASS="l">1549</TD><TD>         */</TD></TR><TR><TD CLASS="l">1550</TD><TD>        public ITypedRegion getPartition(int offset) throws BadLocationException {</TD></TR><TR CLASS="z"><TD CLASS="l">1551</TD><TD>                ITypedRegion partition = null;</TD></TR><TR><TD CLASS="l">1552</TD><TD>                try {</TD></TR><TR CLASS="z"><TD CLASS="l">1553</TD><TD>                        partition = getPartition(IStructuredPartitioning.DEFAULT_STRUCTURED_PARTITIONING, offset, false);</TD></TR><TR><TD CLASS="l">1554</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1555</TD><TD>                catch (BadPartitioningException e) {</TD></TR><TR CLASS="z"><TD CLASS="l">1556</TD><TD>                        throw new Error(e);</TD></TR><TR><TD CLASS="l">1557</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1558</TD><TD>                if (partition == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1559</TD><TD>                        throw new Error();</TD></TR><TR><TD CLASS="l">1560</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1561</TD><TD>                return partition;</TD></TR><TR><TD CLASS="l"><A NAME="61">1562</A></TD><TD>        }</TD></TR><TR><TD CLASS="l">1563</TD><TD> </TD></TR><TR><TD CLASS="l">1564</TD><TD> </TD></TR><TR><TD CLASS="l">1565</TD><TD>        public ITypedRegion getPartition(String partitioning, int offset, boolean preferOpenPartitions) throws BadLocationException, BadPartitioningException {</TD></TR><TR CLASS="c"><TD CLASS="l">1566</TD><TD>                if ((0 &gt; offset) || (offset &gt; getLength()))</TD></TR><TR CLASS="z"><TD CLASS="l">1567</TD><TD>                        throw new BadLocationException();</TD></TR><TR CLASS="c"><TD CLASS="l">1568</TD><TD>                ITypedRegion result = null;</TD></TR><TR><TD CLASS="l">1569</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1570</TD><TD>                IDocumentPartitioner partitioner = getDocumentPartitioner(partitioning);</TD></TR><TR><TD CLASS="l">1571</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1572</TD><TD>                if (partitioner instanceof IDocumentPartitionerExtension2) {</TD></TR><TR CLASS="z"><TD CLASS="l">1573</TD><TD>                        result = ((IDocumentPartitionerExtension2) partitioner).getPartition(offset, preferOpenPartitions);</TD></TR><TR><TD CLASS="l">1574</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">1575</TD><TD>                else if (partitioner != null) {</TD></TR><TR CLASS="c"><TD CLASS="l">1576</TD><TD>                        result = partitioner.getPartition(offset);</TD></TR><TR><TD CLASS="l">1577</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1578</TD><TD>                else if (IStructuredPartitioning.DEFAULT_STRUCTURED_PARTITIONING.equals(partitioning)) {</TD></TR><TR CLASS="z"><TD CLASS="l">1579</TD><TD>                        result = new TypedRegion(0, getLength(), DEFAULT_CONTENT_TYPE);</TD></TR><TR><TD CLASS="l">1580</TD><TD>                }</TD></TR><TR><TD CLASS="l">1581</TD><TD>                else</TD></TR><TR CLASS="z"><TD CLASS="l">1582</TD><TD>                        throw new BadPartitioningException();</TD></TR><TR CLASS="c"><TD CLASS="l">1583</TD><TD>                return result;</TD></TR><TR><TD CLASS="l"><A NAME="27">1584</A></TD><TD>        }</TD></TR><TR><TD CLASS="l">1585</TD><TD> </TD></TR><TR><TD CLASS="l">1586</TD><TD> </TD></TR><TR><TD CLASS="l">1587</TD><TD>        public String[] getPartitionings() {</TD></TR><TR CLASS="z"><TD CLASS="l">1588</TD><TD>                if (fDocumentPartitioners == null)</TD></TR><TR CLASS="z"><TD CLASS="l">1589</TD><TD>                        return new String[0];</TD></TR><TR CLASS="z"><TD CLASS="l">1590</TD><TD>                String[] partitionings = new String[fDocumentPartitioners.size()];</TD></TR><TR CLASS="z"><TD CLASS="l">1591</TD><TD>                fDocumentPartitioners.keySet().toArray(partitionings);</TD></TR><TR CLASS="z"><TD CLASS="l">1592</TD><TD>                return partitionings;</TD></TR><TR><TD CLASS="l">1593</TD><TD>        }</TD></TR><TR><TD CLASS="l">1594</TD><TD> </TD></TR><TR><TD CLASS="l"><A NAME="28">1595</A></TD><TD>        /**</TD></TR><TR><TD CLASS="l">1596</TD><TD>         * Returns all position categories added to this document.</TD></TR><TR><TD CLASS="l">1597</TD><TD>         */</TD></TR><TR><TD CLASS="l">1598</TD><TD>        public String[] getPositionCategories() {</TD></TR><TR CLASS="z"><TD CLASS="l">1599</TD><TD>                return getPositionManager().getPositionCategories();</TD></TR><TR><TD CLASS="l">1600</TD><TD>        }</TD></TR><TR><TD CLASS="l">1601</TD><TD> </TD></TR><TR><TD CLASS="l"><A NAME="8f">1602</A></TD><TD>        /**</TD></TR><TR><TD CLASS="l">1603</TD><TD>         * @return Returns the positionManager.</TD></TR><TR><TD CLASS="l">1604</TD><TD>         */</TD></TR><TR><TD CLASS="l">1605</TD><TD>        private GenericPositionManager getPositionManager() {</TD></TR><TR CLASS="c"><TD CLASS="l">1606</TD><TD>                if (fPositionManager == null) {</TD></TR><TR CLASS="c"><TD CLASS="l">1607</TD><TD>                        fPositionManager = new GenericPositionManager(this);</TD></TR><TR><TD CLASS="l">1608</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">1609</TD><TD>                return fPositionManager;</TD></TR><TR><TD CLASS="l">1610</TD><TD>        }</TD></TR><TR><TD CLASS="l">1611</TD><TD> </TD></TR><TR><TD CLASS="l">1612</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1613</TD><TD>         * Returns all Positions of the given position category.</TD></TR><TR><TD CLASS="l">1614</TD><TD>         * </TD></TR><TR><TD CLASS="l"><A NAME="90">1615</A></TD><TD>         * @exception BadPositionCategoryException</TD></TR><TR><TD CLASS="l">1616</TD><TD>         *                If category is not defined for the document</TD></TR><TR><TD CLASS="l">1617</TD><TD>         */</TD></TR><TR><TD CLASS="l">1618</TD><TD>        public Position[] getPositions(String category) throws org.eclipse.jface.text.BadPositionCategoryException {</TD></TR><TR CLASS="c"><TD CLASS="l">1619</TD><TD>                return getPositionManager().getPositions(category);</TD></TR><TR><TD CLASS="l">1620</TD><TD>        }</TD></TR><TR><TD CLASS="l">1621</TD><TD> </TD></TR><TR><TD CLASS="l"><A NAME="29">1622</A></TD><TD>        /**</TD></TR><TR><TD CLASS="l">1623</TD><TD>         * @see IDocument#getPositionUpdaters</TD></TR><TR><TD CLASS="l">1624</TD><TD>         */</TD></TR><TR><TD CLASS="l">1625</TD><TD>        public IPositionUpdater[] getPositionUpdaters() {</TD></TR><TR CLASS="z"><TD CLASS="l">1626</TD><TD>                return getPositionManager().getPositionUpdaters();</TD></TR><TR><TD CLASS="l">1627</TD><TD>        }</TD></TR><TR><TD CLASS="l">1628</TD><TD> </TD></TR><TR><TD CLASS="l">1629</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1630</TD><TD>         * This method can return null, which is the case if the offset is just</TD></TR><TR><TD CLASS="l"><A NAME="76">1631</A></TD><TD>         * before or just after the existing text. Compare with</TD></TR><TR><TD CLASS="l">1632</TD><TD>         * getNodeAtCharacterOffset.</TD></TR><TR><TD CLASS="l">1633</TD><TD>         */</TD></TR><TR><TD CLASS="l">1634</TD><TD>        public IStructuredDocumentRegion getRegionAtCharacterOffset(int offset) {</TD></TR><TR CLASS="c"><TD CLASS="l">1635</TD><TD>                IStructuredDocumentRegion result = null;</TD></TR><TR><TD CLASS="l">1636</TD><TD> </TD></TR><TR><TD CLASS="l">1637</TD><TD>                // FIXME: need to synch on 'cachedRegion' (but since that's a</TD></TR><TR><TD CLASS="l">1638</TD><TD>                // constantly changing object, we</TD></TR><TR><TD CLASS="l">1639</TD><TD>                // can't, so need to add a &#34;region_lock&#34; object, and use it here, and</TD></TR><TR><TD CLASS="l">1640</TD><TD>                // in re-parser.</TD></TR><TR><TD CLASS="l">1641</TD><TD>                // Oh, and need to make sure, after synch, that the region is not</TD></TR><TR><TD CLASS="l">1642</TD><TD>                // deleted, and if so, I guess go back</TD></TR><TR><TD CLASS="l">1643</TD><TD>                // to the beginning!</TD></TR><TR><TD CLASS="l">1644</TD><TD> </TD></TR><TR><TD CLASS="l">1645</TD><TD>                // cached node can be null when document is empty</TD></TR><TR CLASS="c"><TD CLASS="l">1646</TD><TD>                IStructuredDocumentRegion potentialCachedRegion = getCachedDocumentRegion();</TD></TR><TR CLASS="c"><TD CLASS="l">1647</TD><TD>                if (potentialCachedRegion != null) {</TD></TR><TR><TD CLASS="l">1648</TD><TD> </TD></TR><TR><TD CLASS="l">1649</TD><TD>                        // </TD></TR><TR><TD CLASS="l">1650</TD><TD> </TD></TR><TR><TD CLASS="l">1651</TD><TD>                        // if we already have the right node, return that.</TD></TR><TR CLASS="c"><TD CLASS="l">1652</TD><TD>                        if (potentialCachedRegion.containsOffset(offset)) {</TD></TR><TR CLASS="c"><TD CLASS="l">1653</TD><TD>                                result = potentialCachedRegion;</TD></TR><TR><TD CLASS="l">1654</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1655</TD><TD>                        else {</TD></TR><TR><TD CLASS="l">1656</TD><TD>                                // first, find out what direction to go, relative to</TD></TR><TR><TD CLASS="l">1657</TD><TD>                                // cachedNode.</TD></TR><TR><TD CLASS="l">1658</TD><TD>                                // negative means &#34;towards the front&#34; of the file,</TD></TR><TR><TD CLASS="l">1659</TD><TD>                                // postitive</TD></TR><TR><TD CLASS="l">1660</TD><TD>                                // means</TD></TR><TR><TD CLASS="l">1661</TD><TD>                                // towards the end.</TD></TR><TR CLASS="c"><TD CLASS="l">1662</TD><TD>                                int direction = offset - potentialCachedRegion.getStart();</TD></TR><TR CLASS="c"><TD CLASS="l">1663</TD><TD>                                if (direction &lt; 0) {</TD></TR><TR><TD CLASS="l">1664</TD><TD>                                        // search towards beginning</TD></TR><TR CLASS="c"><TD CLASS="l">1665</TD><TD>                                        while (!potentialCachedRegion.containsOffset(offset)) {</TD></TR><TR CLASS="c"><TD CLASS="l">1666</TD><TD>                                                IStructuredDocumentRegion tempNode = potentialCachedRegion.getPrevious();</TD></TR><TR CLASS="c"><TD CLASS="l">1667</TD><TD>                                                if (tempNode == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1668</TD><TD>                                                        break;</TD></TR><TR><TD CLASS="l">1669</TD><TD>                                                }</TD></TR><TR><TD CLASS="l">1670</TD><TD>                                                else {</TD></TR><TR CLASS="c"><TD CLASS="l">1671</TD><TD>                                                        potentialCachedRegion = tempNode;</TD></TR><TR><TD CLASS="l">1672</TD><TD>                                                }</TD></TR><TR><TD CLASS="l">1673</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">1674</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1675</TD><TD>                                else {</TD></TR><TR><TD CLASS="l">1676</TD><TD>                                        // search towards end</TD></TR><TR><TD CLASS="l">1677</TD><TD>                                        // There is a legitamat condition where the</TD></TR><TR><TD CLASS="l">1678</TD><TD>                                        // offset will not be contained in any node,</TD></TR><TR><TD CLASS="l">1679</TD><TD>                                        // which is if the offset is just past the last</TD></TR><TR><TD CLASS="l">1680</TD><TD>                                        // character of text.</TD></TR><TR><TD CLASS="l">1681</TD><TD>                                        // And, we must gaurd against setting cachedNode to</TD></TR><TR><TD CLASS="l">1682</TD><TD>                                        // null!</TD></TR><TR CLASS="c"><TD CLASS="l">1683</TD><TD>                                        while (!potentialCachedRegion.containsOffset(offset)) {</TD></TR><TR CLASS="c"><TD CLASS="l">1684</TD><TD>                                                IStructuredDocumentRegion tempNode = potentialCachedRegion.getNext();</TD></TR><TR CLASS="c"><TD CLASS="l">1685</TD><TD>                                                if (tempNode == null)</TD></TR><TR CLASS="z"><TD CLASS="l">1686</TD><TD>                                                        break;</TD></TR><TR><TD CLASS="l">1687</TD><TD>                                                else</TD></TR><TR CLASS="c"><TD CLASS="l">1688</TD><TD>                                                        potentialCachedRegion = tempNode;</TD></TR><TR><TD CLASS="l">1689</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">1690</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1691</TD><TD>                        }</TD></TR><TR CLASS="c"><TD CLASS="l">1692</TD><TD>                        result = potentialCachedRegion;</TD></TR><TR><TD CLASS="l">1693</TD><TD>                }</TD></TR><TR><TD CLASS="l">1694</TD><TD>                // just to be doubly sure we never assign null to an already valid</TD></TR><TR><TD CLASS="l">1695</TD><TD>                // cachedRegion.</TD></TR><TR><TD CLASS="l">1696</TD><TD>                // I believe any time 'result' is null at this point, that just means</TD></TR><TR><TD CLASS="l">1697</TD><TD>                // we have an</TD></TR><TR><TD CLASS="l">1698</TD><TD>                // empty document, and the cachedRegion is already null, but we check</TD></TR><TR><TD CLASS="l">1699</TD><TD>                // and print</TD></TR><TR><TD CLASS="l">1700</TD><TD>                // warning, just so during development we be sure we never accidently</TD></TR><TR><TD CLASS="l">1701</TD><TD>                // break this assumption.</TD></TR><TR CLASS="c"><TD CLASS="l">1702</TD><TD>                if (result != null)</TD></TR><TR CLASS="c"><TD CLASS="l">1703</TD><TD>                        setCachedDocumentRegion(result);</TD></TR><TR CLASS="c"><TD CLASS="l">1704</TD><TD>                else if (getCachedDocumentRegion() != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1705</TD><TD>                        throw new IllegalStateException(&#34;Program Error: no region could be found to cache, but cache was non null. Indicates corrupted model or region list&#34;); //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">1706</TD><TD>                }</TD></TR><TR><TD CLASS="l">1707</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="91">1708</A></TD><TD>                return result;</TD></TR><TR><TD CLASS="l">1709</TD><TD>        }</TD></TR><TR><TD CLASS="l">1710</TD><TD> </TD></TR><TR><TD CLASS="l">1711</TD><TD>        public IStructuredDocumentRegionList getRegionList() {</TD></TR><TR CLASS="c"><TD CLASS="l">1712</TD><TD>                CoreNodeList result = null;</TD></TR><TR CLASS="c"><TD CLASS="l">1713</TD><TD>                if (getCachedDocumentRegion() == null)</TD></TR><TR CLASS="c"><TD CLASS="l">1714</TD><TD>                        result = new CoreNodeList(null);</TD></TR><TR><TD CLASS="l">1715</TD><TD>                else</TD></TR><TR CLASS="c"><TD CLASS="l">1716</TD><TD>                        result = new CoreNodeList(getFirstStructuredDocumentRegion());</TD></TR><TR><TD CLASS="l">1717</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1718</TD><TD>                return result;</TD></TR><TR><TD CLASS="l"><A NAME="2b">1719</A></TD><TD>        }</TD></TR><TR><TD CLASS="l">1720</TD><TD> </TD></TR><TR><TD CLASS="l">1721</TD><TD> </TD></TR><TR><TD CLASS="l">1722</TD><TD>        public IStructuredDocumentRegion[] getStructuredDocumentRegions() {</TD></TR><TR CLASS="z"><TD CLASS="l">1723</TD><TD>                return getStructuredDocumentRegions(0, getLength());</TD></TR><TR><TD CLASS="l">1724</TD><TD>        }</TD></TR><TR><TD CLASS="l">1725</TD><TD> </TD></TR><TR><TD CLASS="l">1726</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1727</TD><TD>         * &lt;p&gt;</TD></TR><TR><TD CLASS="l">1728</TD><TD>         * In the case of 0 length, the &lt;code&gt;IStructuredDocumentRegion&lt;/code&gt;</TD></TR><TR><TD CLASS="l">1729</TD><TD>         * at the character offset is returened. In other words, the region to the</TD></TR><TR><TD CLASS="l">1730</TD><TD>         * right of the caret is returned. except for at the end of the document,</TD></TR><TR><TD CLASS="l">1731</TD><TD>         * then the last region is returned.</TD></TR><TR><TD CLASS="l">1732</TD><TD>         * &lt;/p&gt;</TD></TR><TR><TD CLASS="l">1733</TD><TD>         * &lt;p&gt;</TD></TR><TR><TD CLASS="l">1734</TD><TD>         * Otherwise all the regions &#34;inbetween&#34; the indicated range are returned,</TD></TR><TR><TD CLASS="l">1735</TD><TD>         * including the regions which overlap the region.</TD></TR><TR><TD CLASS="l">1736</TD><TD>         * &lt;/p&gt;</TD></TR><TR><TD CLASS="l">1737</TD><TD>         * </TD></TR><TR><TD CLASS="l">1738</TD><TD>         * &lt;br&gt;</TD></TR><TR><TD CLASS="l">1739</TD><TD>         * eg.</TD></TR><TR><TD CLASS="l">1740</TD><TD>         * &lt;p&gt;</TD></TR><TR><TD CLASS="l">1741</TD><TD>         * &lt;br&gt;</TD></TR><TR><TD CLASS="l">1742</TD><TD>         * eg.</TD></TR><TR><TD CLASS="l">1743</TD><TD>         * </TD></TR><TR><TD CLASS="l">1744</TD><TD>         * &lt;pre&gt;</TD></TR><TR><TD CLASS="l">1745</TD><TD>         *                        &amp;lt;html&amp;gt;[&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;]&amp;lt;/html&amp;gt; returns &amp;lt;head&amp;gt;,&amp;lt;/head&amp;gt;</TD></TR><TR><TD CLASS="l">1746</TD><TD>         * &lt;/pre&gt;</TD></TR><TR><TD CLASS="l">1747</TD><TD>         *    &lt;pre&gt;</TD></TR><TR><TD CLASS="l">1748</TD><TD>         *                        &amp;lt;ht[ml&amp;gt;&amp;lt;head&amp;gt;&amp;lt;/he]ad&amp;gt;&amp;lt;/html&amp;gt; returns &amp;lt;html&amp;gt;,&amp;lt;head&amp;gt;,&amp;lt;/head&amp;gt;</TD></TR><TR><TD CLASS="l">1749</TD><TD>         * &lt;/pre&gt;</TD></TR><TR><TD CLASS="l">1750</TD><TD>         * </TD></TR><TR><TD CLASS="l">1751</TD><TD>         * &lt;pre&gt;</TD></TR><TR><TD CLASS="l">1752</TD><TD>         *                          &amp;lt;html&amp;gt;[&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;]&amp;lt;/html&amp;gt; returns &amp;lt;head&amp;gt;,&amp;lt;/head&amp;gt;</TD></TR><TR><TD CLASS="l">1753</TD><TD>         * &lt;/pre&gt;</TD></TR><TR><TD CLASS="l">1754</TD><TD>         *    &lt;pre&gt;</TD></TR><TR><TD CLASS="l">1755</TD><TD>         *                          &amp;lt;ht[ml&amp;gt;&amp;lt;head&amp;gt;&amp;lt;/he]ad&amp;gt;&amp;lt;/html&amp;gt; returns &amp;lt;html&amp;gt;,&amp;lt;head&amp;gt;,&amp;lt;/head&amp;gt;</TD></TR><TR><TD CLASS="l">1756</TD><TD>         * &lt;/pre&gt;</TD></TR><TR><TD CLASS="l">1757</TD><TD>         * </TD></TR><TR><TD CLASS="l"><A NAME="72">1758</A></TD><TD>         * &lt;/p&gt;</TD></TR><TR><TD CLASS="l">1759</TD><TD>         */</TD></TR><TR><TD CLASS="l">1760</TD><TD>        public IStructuredDocumentRegion[] getStructuredDocumentRegions(int start, int length) {</TD></TR><TR><TD CLASS="l">1761</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1762</TD><TD>                if (length &lt; 0)</TD></TR><TR CLASS="z"><TD CLASS="l">1763</TD><TD>                        throw new IllegalArgumentException(&#34;can't have negative length&#34;); //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">1764</TD><TD> </TD></TR><TR><TD CLASS="l">1765</TD><TD>                // this will make the right edge of the range point into the selection</TD></TR><TR><TD CLASS="l">1766</TD><TD>                // eg. &lt;html&gt;[&lt;head&gt;&lt;/head&gt;]&lt;/html&gt;</TD></TR><TR><TD CLASS="l">1767</TD><TD>                // will return &lt;head&gt;,&lt;/head&gt; instead of &lt;head&gt;,&lt;/head&gt;,&lt;/html&gt;</TD></TR><TR CLASS="c"><TD CLASS="l">1768</TD><TD>                if (length &gt; 0)</TD></TR><TR CLASS="c"><TD CLASS="l">1769</TD><TD>                        length--;</TD></TR><TR><TD CLASS="l">1770</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1771</TD><TD>                List results = new ArrayList();</TD></TR><TR><TD CLASS="l">1772</TD><TD> </TD></TR><TR><TD CLASS="l">1773</TD><TD>                // start thread safe block</TD></TR><TR><TD CLASS="l">1774</TD><TD>                try {</TD></TR><TR CLASS="c"><TD CLASS="l">1775</TD><TD>                        acquireLock();</TD></TR><TR><TD CLASS="l">1776</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1777</TD><TD>                        IStructuredDocumentRegion currentRegion = getRegionAtCharacterOffset(start);</TD></TR><TR CLASS="c"><TD CLASS="l">1778</TD><TD>                        IStructuredDocumentRegion endRegion = getRegionAtCharacterOffset(start + length);</TD></TR><TR CLASS="c"><TD CLASS="l">1779</TD><TD>                        while (currentRegion != endRegion &amp;&amp; currentRegion != null) {</TD></TR><TR CLASS="c"><TD CLASS="l">1780</TD><TD>                                results.add(currentRegion);</TD></TR><TR CLASS="c"><TD CLASS="l">1781</TD><TD>                                currentRegion = currentRegion.getNext();</TD></TR><TR><TD CLASS="l">1782</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1783</TD><TD>                        // need to add that last end region</TD></TR><TR><TD CLASS="l">1784</TD><TD>                        // can be null in the case of an empty document</TD></TR><TR CLASS="c"><TD CLASS="l">1785</TD><TD>                        if (endRegion != null)</TD></TR><TR CLASS="c"><TD CLASS="l">1786</TD><TD>                                results.add(endRegion);</TD></TR><TR><TD CLASS="l">1787</TD><TD>                }</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="67% line coverage (4 out of 6 instructions)">1788</TD><TD TITLE="67% line coverage (4 out of 6 instructions)">                finally {</TD></TR><TR CLASS="c"><TD CLASS="l">1789</TD><TD>                        releaseLock();</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="71% line coverage (5 out of 7 instructions)">1790</TD><TD TITLE="71% line coverage (5 out of 7 instructions)">                }</TD></TR><TR><TD CLASS="l">1791</TD><TD>                // end thread safe block</TD></TR><TR><TD CLASS="l">1792</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1793</TD><TD>                return (IStructuredDocumentRegion[]) results.toArray(new IStructuredDocumentRegion[results.size()]);</TD></TR><TR><TD CLASS="l">1794</TD><TD>        }</TD></TR><TR><TD CLASS="l">1795</TD><TD> </TD></TR><TR><TD CLASS="l">1796</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="5d">1797</A></TD><TD>         * was made public for easier testing. Normally should never be used by</TD></TR><TR><TD CLASS="l">1798</TD><TD>         * client codes.</TD></TR><TR><TD CLASS="l">1799</TD><TD>         */</TD></TR><TR><TD CLASS="l">1800</TD><TD>        public IStructuredTextReParser getReParser() {</TD></TR><TR CLASS="c"><TD CLASS="l">1801</TD><TD>                if (fReParser == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1802</TD><TD>                        fReParser = new StructuredDocumentReParser();</TD></TR><TR CLASS="z"><TD CLASS="l">1803</TD><TD>                        fReParser.setStructuredDocument(this);</TD></TR><TR><TD CLASS="l">1804</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="92">1805</A></TD><TD>                return fReParser;</TD></TR><TR><TD CLASS="l">1806</TD><TD>        }</TD></TR><TR><TD CLASS="l">1807</TD><TD> </TD></TR><TR><TD CLASS="l">1808</TD><TD>        private ITextStore getStore() {</TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="2c">1809</A></TD><TD>                return fStore;</TD></TR><TR><TD CLASS="l">1810</TD><TD>        }</TD></TR><TR><TD CLASS="l">1811</TD><TD> </TD></TR><TR><TD CLASS="l">1812</TD><TD>        public String getText() {</TD></TR><TR CLASS="z"><TD CLASS="l">1813</TD><TD>                String result = get();</TD></TR><TR CLASS="z"><TD CLASS="l">1814</TD><TD>                return result;</TD></TR><TR><TD CLASS="l">1815</TD><TD>        }</TD></TR><TR><TD CLASS="l">1816</TD><TD> </TD></TR><TR><TD CLASS="l">1817</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1818</TD><TD>         * Returns the document's line tracker. Assumes that the document has been</TD></TR><TR><TD CLASS="l">1819</TD><TD>         * initialized with a line tracker.</TD></TR><TR><TD CLASS="l"><A NAME="93">1820</A></TD><TD>         * </TD></TR><TR><TD CLASS="l">1821</TD><TD>         * @return the document's line tracker</TD></TR><TR><TD CLASS="l">1822</TD><TD>         */</TD></TR><TR><TD CLASS="l">1823</TD><TD>        private ILineTracker getTracker() {</TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="94">1824</A></TD><TD>                return fTracker;</TD></TR><TR><TD CLASS="l">1825</TD><TD>        }</TD></TR><TR><TD CLASS="l">1826</TD><TD> </TD></TR><TR><TD CLASS="l">1827</TD><TD>        public IStructuredTextUndoManager getUndoManager() {</TD></TR><TR CLASS="c"><TD CLASS="l">1828</TD><TD>                if (fUndoManager == null) {</TD></TR><TR CLASS="c"><TD CLASS="l">1829</TD><TD>                        fUndoManager = new StructuredTextUndoManager();</TD></TR><TR><TD CLASS="l">1830</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">1831</TD><TD>                return fUndoManager;</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>        void initializeFirstAndLastDocumentRegion() {</TD></TR><TR><TD CLASS="l">1835</TD><TD>                // cached Node must also be first, at the initial point. Only</TD></TR><TR><TD CLASS="l">1836</TD><TD>                // valid</TD></TR><TR><TD CLASS="l"><A NAME="95">1837</A></TD><TD>                // to call this method right after the first parse.</TD></TR><TR><TD CLASS="l">1838</TD><TD>                // </TD></TR><TR><TD CLASS="l">1839</TD><TD>                // when starting afresh, our cachedNode should be our firstNode,</TD></TR><TR><TD CLASS="l">1840</TD><TD>                // so be sure to initialize the firstNode</TD></TR><TR CLASS="c"><TD CLASS="l">1841</TD><TD>                firstDocumentRegion = getCachedDocumentRegion();</TD></TR><TR><TD CLASS="l">1842</TD><TD>                // be sure to use 'getNext' for this initial finding of the last</TD></TR><TR><TD CLASS="l">1843</TD><TD>                // node,</TD></TR><TR><TD CLASS="l">1844</TD><TD>                // since the implementation of node.getLastNode may simply call</TD></TR><TR><TD CLASS="l">1845</TD><TD>                // structuredDocument.getLastStructuredDocumentRegion!</TD></TR><TR CLASS="c"><TD CLASS="l">1846</TD><TD>                IStructuredDocumentRegion aNode = firstDocumentRegion;</TD></TR><TR CLASS="c"><TD CLASS="l">1847</TD><TD>                if (aNode == null) {</TD></TR><TR><TD CLASS="l">1848</TD><TD>                        // defect 254607: to handle empty documents right, if</TD></TR><TR><TD CLASS="l">1849</TD><TD>                        // firstnode is</TD></TR><TR><TD CLASS="l">1850</TD><TD>                        // null, make sure last node is null too</TD></TR><TR CLASS="c"><TD CLASS="l">1851</TD><TD>                        lastDocumentRegion = null;</TD></TR><TR><TD CLASS="l">1852</TD><TD>                }</TD></TR><TR><TD CLASS="l">1853</TD><TD>                else {</TD></TR><TR CLASS="c"><TD CLASS="l">1854</TD><TD>                        while (aNode != null) {</TD></TR><TR CLASS="c"><TD CLASS="l">1855</TD><TD>                                lastDocumentRegion = aNode;</TD></TR><TR CLASS="c"><TD CLASS="l">1856</TD><TD>                                aNode = aNode.getNext();</TD></TR><TR><TD CLASS="l">1857</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1858</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">1859</TD><TD>        }</TD></TR><TR><TD CLASS="l">1860</TD><TD> </TD></TR><TR><TD CLASS="l"><A NAME="2d">1861</A></TD><TD>        /**</TD></TR><TR><TD CLASS="l">1862</TD><TD>         * @see IDocument#insertPositionUpdater</TD></TR><TR><TD CLASS="l">1863</TD><TD>         */</TD></TR><TR><TD CLASS="l">1864</TD><TD>        public void insertPositionUpdater(IPositionUpdater updater, int index) {</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="96">1865</A></TD><TD>                getPositionManager().insertPositionUpdater(updater, index);</TD></TR><TR CLASS="z"><TD CLASS="l">1866</TD><TD>        }</TD></TR><TR><TD CLASS="l">1867</TD><TD> </TD></TR><TR><TD CLASS="l">1868</TD><TD>        private void internal_addPositionCategory(String category) {</TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="97">1869</A></TD><TD>                getPositionManager().addPositionCategory(category);</TD></TR><TR CLASS="c"><TD CLASS="l">1870</TD><TD>        }</TD></TR><TR><TD CLASS="l">1871</TD><TD> </TD></TR><TR><TD CLASS="l">1872</TD><TD>        private void internal_addPositionUpdater(IPositionUpdater updater) {</TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="98">1873</A></TD><TD>                getPositionManager().addPositionUpdater(updater);</TD></TR><TR CLASS="c"><TD CLASS="l">1874</TD><TD>        }</TD></TR><TR><TD CLASS="l">1875</TD><TD> </TD></TR><TR><TD CLASS="l">1876</TD><TD>        private void internal_setParser(RegionParser newParser) {</TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="2e">1877</A></TD><TD>                fParser = newParser;</TD></TR><TR CLASS="c"><TD CLASS="l">1878</TD><TD>        }</TD></TR><TR><TD CLASS="l">1879</TD><TD> </TD></TR><TR><TD CLASS="l">1880</TD><TD>        String internalGet(int offset, int length) {</TD></TR><TR CLASS="z"><TD CLASS="l">1881</TD><TD>                String result = null;</TD></TR><TR><TD CLASS="l">1882</TD><TD>                // int myLength = getLength();</TD></TR><TR><TD CLASS="l">1883</TD><TD>                // if ((0 &gt; offset) || (0 &gt; length) || (offset + length &gt; myLength))</TD></TR><TR><TD CLASS="l">1884</TD><TD>                // throw new BadLocationException();</TD></TR><TR CLASS="z"><TD CLASS="l">1885</TD><TD>                result = getStore().get(offset, length);</TD></TR><TR CLASS="z"><TD CLASS="l">1886</TD><TD>                return result;</TD></TR><TR><TD CLASS="l">1887</TD><TD>        }</TD></TR><TR><TD CLASS="l">1888</TD><TD> </TD></TR><TR><TD CLASS="l">1889</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1890</TD><TD>         * @param requester</TD></TR><TR><TD CLASS="l">1891</TD><TD>         * @param start</TD></TR><TR><TD CLASS="l">1892</TD><TD>         * @param replacementLength</TD></TR><TR><TD CLASS="l">1893</TD><TD>         * @param changes</TD></TR><TR><TD CLASS="l">1894</TD><TD>         * @param modificationStamp</TD></TR><TR><TD CLASS="l"><A NAME="62">1895</A></TD><TD>         * @param ignoreReadOnlySettings</TD></TR><TR><TD CLASS="l">1896</TD><TD>         * @return</TD></TR><TR><TD CLASS="l">1897</TD><TD>         */</TD></TR><TR><TD CLASS="l">1898</TD><TD>        private StructuredDocumentEvent internalReplaceText(Object requester, int start, int replacementLength, String changes, long modificationStamp, boolean ignoreReadOnlySettings) {</TD></TR><TR CLASS="c"><TD CLASS="l">1899</TD><TD>                StructuredDocumentEvent result = null;</TD></TR><TR><TD CLASS="l">1900</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1901</TD><TD>                stopPostNotificationProcessing();</TD></TR><TR CLASS="c"><TD CLASS="l">1902</TD><TD>                if (changes == null)</TD></TR><TR CLASS="z"><TD CLASS="l">1903</TD><TD>                        changes = &#34;&#34;; //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">1904</TD><TD>                // </TD></TR><TR><TD CLASS="l">1905</TD><TD>                if (Debug.debugStructuredDocument)</TD></TR><TR><TD CLASS="l">1906</TD><TD>                        System.out.println(getClass().getName() + &#34;::replaceText(&#34; + start + &#34;,&#34; + replacementLength + &#34;,&#34; + changes + &#34;)&#34;); //$NON-NLS-4$//$NON-NLS-3$//$NON-NLS-2$//$NON-NLS-1$</TD></TR><TR><TD CLASS="l">1907</TD><TD>                if (Debug.perfTestStructuredDocumentOnly || Debug.perfTest || Debug.perfTestRawStructuredDocumentOnly) {</TD></TR><TR><TD CLASS="l">1908</TD><TD>                        startStreamTime = System.currentTimeMillis();</TD></TR><TR><TD CLASS="l">1909</TD><TD>                }</TD></TR><TR><TD CLASS="l">1910</TD><TD>                try {</TD></TR><TR><TD CLASS="l">1911</TD><TD>                        // Note: event must be computed before 'fire' method called</TD></TR><TR CLASS="c"><TD CLASS="l">1912</TD><TD>                        fDocumentEvent = new DocumentEvent(this, start, replacementLength, changes);</TD></TR><TR CLASS="c"><TD CLASS="l">1913</TD><TD>                        fireDocumentAboutToChanged();</TD></TR><TR><TD CLASS="l">1914</TD><TD> </TD></TR><TR><TD CLASS="l">1915</TD><TD>                        try {</TD></TR><TR CLASS="c"><TD CLASS="l">1916</TD><TD>                                acquireLock();</TD></TR><TR><TD CLASS="l">1917</TD><TD> </TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="75% line coverage (15 out of 20 instructions)">1918</TD><TD TITLE="75% line coverage (15 out of 20 instructions)">                                if (!ignoreReadOnlySettings &amp;&amp; (containsReadOnly(start, replacementLength))) {</TD></TR><TR CLASS="z"><TD CLASS="l">1919</TD><TD>                                        NoChangeEvent noChangeEvent = new NoChangeEvent(this, requester, changes, start, replacementLength);</TD></TR><TR CLASS="z"><TD CLASS="l">1920</TD><TD>                                        noChangeEvent.reason = NoChangeEvent.READ_ONLY_STATE_CHANGE;</TD></TR><TR CLASS="z"><TD CLASS="l">1921</TD><TD>                                        result = noChangeEvent;</TD></TR><TR><TD CLASS="l">1922</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1923</TD><TD>                                else {</TD></TR><TR CLASS="c"><TD CLASS="l">1924</TD><TD>                                        result = updateModel(requester, start, replacementLength, changes);</TD></TR><TR><TD CLASS="l">1925</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1926</TD><TD>                        }</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="67% line coverage (4 out of 6 instructions)">1927</TD><TD TITLE="67% line coverage (4 out of 6 instructions)">                        finally {</TD></TR><TR CLASS="c"><TD CLASS="l">1928</TD><TD>                                releaseLock();</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="75% line coverage (6 out of 8 instructions)">1929</TD><TD TITLE="75% line coverage (6 out of 8 instructions)">                        }</TD></TR><TR><TD CLASS="l">1930</TD><TD> </TD></TR><TR><TD CLASS="l">1931</TD><TD> </TD></TR><TR><TD CLASS="l">1932</TD><TD>                        if (Debug.perfTestRawStructuredDocumentOnly || Debug.perfTest) {</TD></TR><TR><TD CLASS="l">1933</TD><TD>                                long stopStreamTime = System.currentTimeMillis();</TD></TR><TR><TD CLASS="l">1934</TD><TD>                                System.out.println(&#34;\n\t\t\t\t Time for IStructuredDocument raw replaceText: &#34; + (stopStreamTime - startStreamTime)); //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">1935</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1936</TD><TD>                        if (Debug.debugStructuredDocument) {</TD></TR><TR><TD CLASS="l">1937</TD><TD>                                System.out.println(&#34;event type returned by replaceTextWithNoDebuggingThread: &#34; + result); //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">1938</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1939</TD><TD>                }</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="60% line coverage (3 out of 5 instructions)">1940</TD><TD TITLE="60% line coverage (3 out of 5 instructions)">                finally {</TD></TR><TR><TD CLASS="l">1941</TD><TD>                        // FUTURE_TO_DO: implement callback mechanism? to avoid instanceof</TD></TR><TR><TD CLASS="l">1942</TD><TD>                        // and casting</TD></TR><TR><TD CLASS="l">1943</TD><TD>                        // fireStructuredDocumentEvent must be called in order to end</TD></TR><TR><TD CLASS="l">1944</TD><TD>                        // documentAboutToBeChanged state</TD></TR><TR><TD CLASS="l">1945</TD><TD> </TD></TR><TR><TD CLASS="l">1946</TD><TD> </TD></TR><TR><TD CLASS="l">1947</TD><TD>                        // increment modification stamp if modifications were made</TD></TR><TR CLASS="c"><TD CLASS="l">1948</TD><TD>                        if (result != null &amp;&amp; !(result instanceof NoChangeEvent)) {</TD></TR><TR CLASS="c"><TD CLASS="l">1949</TD><TD>                                fModificationStamp= modificationStamp;</TD></TR><TR CLASS="c"><TD CLASS="l">1950</TD><TD>                                fNextModificationStamp= Math.max(fModificationStamp, fNextModificationStamp);</TD></TR><TR CLASS="c"><TD CLASS="l">1951</TD><TD>                                fDocumentEvent.fModificationStamp = fModificationStamp;</TD></TR><TR><TD CLASS="l">1952</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1953</TD><TD>                                </TD></TR><TR CLASS="c"><TD CLASS="l">1954</TD><TD>                        if (result == null) {</TD></TR><TR><TD CLASS="l">1955</TD><TD>                                // result should not be null, but if an exception was thrown,</TD></TR><TR><TD CLASS="l">1956</TD><TD>                                // it will be</TD></TR><TR><TD CLASS="l">1957</TD><TD>                                // so send a noChangeEvent and log the problem</TD></TR><TR CLASS="z"><TD CLASS="l">1958</TD><TD>                                NoChangeEvent noChangeEvent = new NoChangeEvent(this, requester, changes, start, replacementLength);</TD></TR><TR CLASS="z"><TD CLASS="l">1959</TD><TD>                                noChangeEvent.reason = NoChangeEvent.NO_EVENT;</TD></TR><TR CLASS="z"><TD CLASS="l">1960</TD><TD>                                fireStructuredDocumentEvent(noChangeEvent);</TD></TR><TR CLASS="z"><TD CLASS="l">1961</TD><TD>                                Logger.log(Logger.ERROR, &#34;Program Error: invalid structured document event&#34;); //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">1962</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1963</TD><TD>                        else {</TD></TR><TR CLASS="c"><TD CLASS="l">1964</TD><TD>                                if (result instanceof RegionChangedEvent) {</TD></TR><TR CLASS="z"><TD CLASS="l">1965</TD><TD>                                        fireStructuredDocumentEvent((RegionChangedEvent) result);</TD></TR><TR><TD CLASS="l">1966</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1967</TD><TD>                                else {</TD></TR><TR CLASS="c"><TD CLASS="l">1968</TD><TD>                                        if (result instanceof RegionsReplacedEvent) {</TD></TR><TR CLASS="z"><TD CLASS="l">1969</TD><TD>                                                fireStructuredDocumentEvent((RegionsReplacedEvent) result);</TD></TR><TR><TD CLASS="l">1970</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">1971</TD><TD>                                        else {</TD></TR><TR CLASS="c"><TD CLASS="l">1972</TD><TD>                                                if (result instanceof StructuredDocumentRegionsReplacedEvent) {</TD></TR><TR><TD CLASS="l">1973</TD><TD>                                                        // probably more efficient to mark old regions as</TD></TR><TR><TD CLASS="l">1974</TD><TD>                                                        // 'deleted' at the time</TD></TR><TR><TD CLASS="l">1975</TD><TD>                                                        // that are determined to be deleted, but I'll do</TD></TR><TR><TD CLASS="l">1976</TD><TD>                                                        // here</TD></TR><TR><TD CLASS="l">1977</TD><TD>                                                        // in then central spot</TD></TR><TR><TD CLASS="l">1978</TD><TD>                                                        // for programming ease.</TD></TR><TR CLASS="c"><TD CLASS="l">1979</TD><TD>                                                        updateDeletedFields((StructuredDocumentRegionsReplacedEvent) result);</TD></TR><TR CLASS="c"><TD CLASS="l">1980</TD><TD>                                                        fireStructuredDocumentEvent((StructuredDocumentRegionsReplacedEvent) result);</TD></TR><TR><TD CLASS="l">1981</TD><TD>                                                }</TD></TR><TR><TD CLASS="l">1982</TD><TD>                                                else {</TD></TR><TR CLASS="z"><TD CLASS="l">1983</TD><TD>                                                        if (result instanceof NoChangeEvent) {</TD></TR><TR CLASS="z"><TD CLASS="l">1984</TD><TD>                                                                fireStructuredDocumentEvent((NoChangeEvent) result);</TD></TR><TR><TD CLASS="l">1985</TD><TD>                                                        }</TD></TR><TR><TD CLASS="l">1986</TD><TD>                                                        else {</TD></TR><TR><TD CLASS="l">1987</TD><TD>                                                                // if here, this means a new event was created</TD></TR><TR><TD CLASS="l">1988</TD><TD>                                                                // and not handled here</TD></TR><TR><TD CLASS="l">1989</TD><TD>                                                                // just send a no event until this issue is</TD></TR><TR><TD CLASS="l">1990</TD><TD>                                                                // resolved.</TD></TR><TR CLASS="z"><TD CLASS="l">1991</TD><TD>                                                                NoChangeEvent noChangeEvent = new NoChangeEvent(this, requester, changes, start, replacementLength);</TD></TR><TR CLASS="z"><TD CLASS="l">1992</TD><TD>                                                                noChangeEvent.reason = NoChangeEvent.NO_EVENT;</TD></TR><TR CLASS="z"><TD CLASS="l">1993</TD><TD>                                                                fireStructuredDocumentEvent(noChangeEvent);</TD></TR><TR CLASS="z"><TD CLASS="l">1994</TD><TD>                                                                Logger.log(Logger.INFO, &#34;Program Error: unexpected structured document event: &#34; + result); //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">1995</TD><TD>                                                        }</TD></TR><TR><TD CLASS="l">1996</TD><TD>                                                }</TD></TR><TR><TD CLASS="l">1997</TD><TD>                                        }</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> </TD></TR><TR><TD CLASS="l">2001</TD><TD>                        if (Debug.perfTest || Debug.perfTestStructuredDocumentOnly) {</TD></TR><TR><TD CLASS="l">2002</TD><TD>                                long stopStreamTime = System.currentTimeMillis();</TD></TR><TR><TD CLASS="l">2003</TD><TD>                                System.out.println(&#34;\n\t\t\t\t Total Time for IStructuredDocument event signaling/processing in replaceText: &#34; + (stopStreamTime - startStreamTime)); //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">2004</TD><TD>                        }</TD></TR><TR CLASS="c"><TD CLASS="l">2005</TD><TD>                        resumePostNotificationProcessing();</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="67% line coverage (4 out of 6 instructions)">2006</TD><TD TITLE="67% line coverage (4 out of 6 instructions)">                }</TD></TR><TR CLASS="c"><TD CLASS="l">2007</TD><TD>                return result;</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>         * (non-Javadoc)</TD></TR><TR><TD CLASS="l">2012</TD><TD>         * </TD></TR><TR><TD CLASS="l"><A NAME="31">2013</A></TD><TD>         * @see java.lang.CharSequence#length()</TD></TR><TR><TD CLASS="l">2014</TD><TD>         */</TD></TR><TR><TD CLASS="l">2015</TD><TD>        public int length() {</TD></TR><TR><TD CLASS="l">2016</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="32">2017</A></TD><TD>                return getLength();</TD></TR><TR><TD CLASS="l">2018</TD><TD>        }</TD></TR><TR><TD CLASS="l">2019</TD><TD>        </TD></TR><TR><TD CLASS="l">2020</TD><TD>        public void makeReadOnly(int startOffset, int length) {</TD></TR><TR CLASS="z"><TD CLASS="l">2021</TD><TD>                makeReadOnly(startOffset, length, false, false);</TD></TR><TR CLASS="z"><TD CLASS="l">2022</TD><TD>        }</TD></TR><TR><TD CLASS="l"><A NAME="33">2023</A></TD><TD> </TD></TR><TR><TD CLASS="l">2024</TD><TD>        public void makeReadOnly(int startOffset, int length, boolean canInsertBefore, boolean canInsertAfter) {        </TD></TR><TR><TD CLASS="l">2025</TD><TD>                // doesn't make sense to have a readonly region of 0 length,</TD></TR><TR><TD CLASS="l">2026</TD><TD>                // so we'll ignore those requests</TD></TR><TR CLASS="z"><TD CLASS="l">2027</TD><TD>                if (length &lt;= 0)</TD></TR><TR CLASS="z"><TD CLASS="l">2028</TD><TD>                        return;</TD></TR><TR CLASS="z"><TD CLASS="l">2029</TD><TD>                String affectedText = this.get(startOffset, length);</TD></TR><TR><TD CLASS="l">2030</TD><TD>                // a document event for &#34;read only&#34; change ... must</TD></TR><TR><TD CLASS="l">2031</TD><TD>                // be followed by &#34;no change&#34; structuredDocument event</TD></TR><TR><TD CLASS="l">2032</TD><TD>                // fDocumentEvent = new DocumentEvent(this, startOffset, length,</TD></TR><TR><TD CLASS="l">2033</TD><TD>                // affectedText);</TD></TR><TR CLASS="z"><TD CLASS="l">2034</TD><TD>                fireReadOnlyAboutToBeChanged();</TD></TR><TR><TD CLASS="l">2035</TD><TD>                // if (containsReadOnly(startOffset, length)) {</TD></TR><TR><TD CLASS="l">2036</TD><TD>                // adjustReadOnlyRegions(startOffset, length);</TD></TR><TR><TD CLASS="l">2037</TD><TD>                // } else {</TD></TR><TR><TD CLASS="l">2038</TD><TD>                // we can blindly add category, since no harm done if already</TD></TR><TR><TD CLASS="l">2039</TD><TD>                // exists.</TD></TR><TR CLASS="z"><TD CLASS="l">2040</TD><TD>                addPositionCategory(READ_ONLY_REGIONS_CATEGORY);</TD></TR><TR CLASS="z"><TD CLASS="l">2041</TD><TD>                Position newPosition = new ReadOnlyPosition(startOffset, length, canInsertBefore);</TD></TR><TR><TD CLASS="l">2042</TD><TD>                try {</TD></TR><TR CLASS="z"><TD CLASS="l">2043</TD><TD>                        addPosition(READ_ONLY_REGIONS_CATEGORY, newPosition);</TD></TR><TR><TD CLASS="l">2044</TD><TD>                        // FIXME: need to change API to pass in requester, so this event</TD></TR><TR><TD CLASS="l">2045</TD><TD>                        // can be</TD></TR><TR><TD CLASS="l">2046</TD><TD>                        // created correctly, instead of using null.</TD></TR><TR CLASS="z"><TD CLASS="l">2047</TD><TD>                        NoChangeEvent noChangeEvent = new NoChangeEvent(this, null, affectedText, startOffset, length);</TD></TR><TR CLASS="z"><TD CLASS="l">2048</TD><TD>                        noChangeEvent.reason = NoChangeEvent.READ_ONLY_STATE_CHANGE;</TD></TR><TR CLASS="z"><TD CLASS="l">2049</TD><TD>                        fireReadOnlyStructuredDocumentEvent(noChangeEvent);</TD></TR><TR><TD CLASS="l">2050</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">2051</TD><TD>                catch (BadLocationException e) {</TD></TR><TR><TD CLASS="l">2052</TD><TD>                        // for now, log and ignore. Perhaps later we</TD></TR><TR><TD CLASS="l">2053</TD><TD>                        // could adjust to handle some cases?</TD></TR><TR CLASS="z"><TD CLASS="l">2054</TD><TD>                        Logger.logException((&#34;could not create readonly region at &#34; + startOffset + &#34; to &#34; + length), e); //$NON-NLS-1$ //$NON-NLS-2$</TD></TR><TR><TD CLASS="l">2055</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">2056</TD><TD>                catch (BadPositionCategoryException e) {</TD></TR><TR><TD CLASS="l">2057</TD><TD>                        // should never occur, since we add category</TD></TR><TR CLASS="z"><TD CLASS="l">2058</TD><TD>                        Logger.logException(e);</TD></TR><TR><TD CLASS="l"><A NAME="34">2059</A></TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">2060</TD><TD>        }</TD></TR><TR><TD CLASS="l">2061</TD><TD> </TD></TR><TR><TD CLASS="l">2062</TD><TD>        public IStructuredDocument newInstance() {</TD></TR><TR CLASS="z"><TD CLASS="l">2063</TD><TD>                IStructuredDocument newInstance = StructuredDocumentFactory.getNewStructuredDocumentInstance(getParser().newInstance());</TD></TR><TR CLASS="z"><TD CLASS="l">2064</TD><TD>                ((BasicStructuredDocument) newInstance).setReParser(getReParser().newInstance());</TD></TR><TR CLASS="z"><TD CLASS="l">2065</TD><TD>                if (getDocumentPartitioner() instanceof StructuredTextPartitioner) {</TD></TR><TR CLASS="z"><TD CLASS="l">2066</TD><TD>                        newInstance.setDocumentPartitioner(((StructuredTextPartitioner) getDocumentPartitioner()).newInstance());</TD></TR><TR CLASS="z"><TD CLASS="l">2067</TD><TD>                        newInstance.getDocumentPartitioner().connect(newInstance);</TD></TR><TR><TD CLASS="l">2068</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">2069</TD><TD>                newInstance.setLineDelimiter(getLineDelimiter());</TD></TR><TR CLASS="z"><TD CLASS="l">2070</TD><TD>                if (getEncodingMemento() != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">2071</TD><TD>                        newInstance.setEncodingMemento((EncodingMemento) getEncodingMemento().clone());</TD></TR><TR><TD CLASS="l">2072</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">2073</TD><TD>                return newInstance;</TD></TR><TR><TD CLASS="l">2074</TD><TD>        }</TD></TR><TR><TD CLASS="l">2075</TD><TD> </TD></TR><TR><TD CLASS="l">2076</TD><TD>        /*</TD></TR><TR><TD CLASS="l">2077</TD><TD>         * (non-Javadoc)</TD></TR><TR><TD CLASS="l">2078</TD><TD>         * </TD></TR><TR><TD CLASS="l"><A NAME="35">2079</A></TD><TD>         * @see org.eclipse.wst.sse.core.internal.text.IRegionComparible#regionMatches(int,</TD></TR><TR><TD CLASS="l">2080</TD><TD>         *      int, java.lang.String)</TD></TR><TR><TD CLASS="l">2081</TD><TD>         */</TD></TR><TR><TD CLASS="l">2082</TD><TD>        public boolean regionMatches(int offset, int length, String stringToCompare) {</TD></TR><TR CLASS="z"><TD CLASS="l">2083</TD><TD>                boolean result = false;</TD></TR><TR CLASS="z"><TD CLASS="l">2084</TD><TD>                ITextStore store = getStore();</TD></TR><TR CLASS="z"><TD CLASS="l">2085</TD><TD>                if (store instanceof IRegionComparible) {</TD></TR><TR CLASS="z"><TD CLASS="l">2086</TD><TD>                        result = ((IRegionComparible) store).regionMatches(offset, length, stringToCompare);</TD></TR><TR><TD CLASS="l">2087</TD><TD>                }</TD></TR><TR><TD CLASS="l">2088</TD><TD>                else {</TD></TR><TR CLASS="z"><TD CLASS="l">2089</TD><TD>                        result = get(offset, length).equals(stringToCompare);</TD></TR><TR><TD CLASS="l">2090</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="36">2091</A></TD><TD>                return result;</TD></TR><TR><TD CLASS="l">2092</TD><TD>        }</TD></TR><TR><TD CLASS="l">2093</TD><TD> </TD></TR><TR><TD CLASS="l">2094</TD><TD>        public boolean regionMatchesIgnoreCase(int offset, int length, String stringToCompare) {</TD></TR><TR CLASS="z"><TD CLASS="l">2095</TD><TD>                boolean result = false;</TD></TR><TR CLASS="z"><TD CLASS="l">2096</TD><TD>                ITextStore store = getStore();</TD></TR><TR CLASS="z"><TD CLASS="l">2097</TD><TD>                if (store instanceof IRegionComparible) {</TD></TR><TR CLASS="z"><TD CLASS="l">2098</TD><TD>                        result = ((IRegionComparible) store).regionMatchesIgnoreCase(offset, length, stringToCompare);</TD></TR><TR><TD CLASS="l">2099</TD><TD>                }</TD></TR><TR><TD CLASS="l">2100</TD><TD>                else {</TD></TR><TR CLASS="z"><TD CLASS="l">2101</TD><TD>                        result = get(offset, length).equalsIgnoreCase(stringToCompare);</TD></TR><TR><TD CLASS="l">2102</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">2103</TD><TD>                return result;</TD></TR><TR><TD CLASS="l">2104</TD><TD>        }</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>         * (non-Javadoc)</TD></TR><TR><TD CLASS="l">2108</TD><TD>         * </TD></TR><TR><TD CLASS="l"><A NAME="37">2109</A></TD><TD>         * @see org.eclipse.jface.text.IDocumentExtension#registerPostNotificationReplace(org.eclipse.jface.text.IDocumentListener,</TD></TR><TR><TD CLASS="l">2110</TD><TD>         *      org.eclipse.jface.text.IDocumentExtension.IReplace)</TD></TR><TR><TD CLASS="l">2111</TD><TD>         */</TD></TR><TR><TD CLASS="l">2112</TD><TD>        public void registerPostNotificationReplace(IDocumentListener owner, IDocumentExtension.IReplace replace) {</TD></TR><TR CLASS="z"><TD CLASS="l">2113</TD><TD>                if (fAcceptPostNotificationReplaces) {</TD></TR><TR CLASS="z"><TD CLASS="l">2114</TD><TD>                        if (fPostNotificationChanges == null)</TD></TR><TR CLASS="z"><TD CLASS="l">2115</TD><TD>                                fPostNotificationChanges = new ArrayList(1);</TD></TR><TR CLASS="z"><TD CLASS="l">2116</TD><TD>                        fPostNotificationChanges.add(new RegisteredReplace(owner, replace));</TD></TR><TR><TD CLASS="l">2117</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="38">2118</A></TD><TD>        }</TD></TR><TR><TD CLASS="l">2119</TD><TD> </TD></TR><TR><TD CLASS="l">2120</TD><TD>        protected void releaseLock() {</TD></TR><TR><TD CLASS="l"><A NAME="70">2121</A></TD><TD>                // do nothing here in super class</TD></TR><TR CLASS="z"><TD CLASS="l">2122</TD><TD>        }</TD></TR><TR><TD CLASS="l">2123</TD><TD> </TD></TR><TR><TD CLASS="l">2124</TD><TD>        public void removeDocumentAboutToChangeListener(IModelAboutToBeChangedListener listener) {</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="79% line coverage (11 out of 14 instructions)">2125</TD><TD TITLE="79% line coverage (11 out of 14 instructions)">                synchronized (listenerLock) {</TD></TR><TR><TD CLASS="l">2126</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">2127</TD><TD>                        if ((fStructuredDocumentAboutToChangeListeners != null) &amp;&amp; (listener != null)) {</TD></TR><TR><TD CLASS="l">2128</TD><TD>                                // if its not in the listeners, we'll ignore the request</TD></TR><TR CLASS="c"><TD CLASS="l">2129</TD><TD>                                if (Utilities.contains(fStructuredDocumentAboutToChangeListeners, listener)) {</TD></TR><TR CLASS="c"><TD CLASS="l">2130</TD><TD>                                        int oldSize = fStructuredDocumentAboutToChangeListeners.length;</TD></TR><TR CLASS="c"><TD CLASS="l">2131</TD><TD>                                        int newSize = oldSize - 1;</TD></TR><TR CLASS="c"><TD CLASS="l">2132</TD><TD>                                        Object[] newListeners = new Object[newSize];</TD></TR><TR CLASS="c"><TD CLASS="l">2133</TD><TD>                                        int index = 0;</TD></TR><TR CLASS="c"><TD CLASS="l">2134</TD><TD>                                        for (int i = 0; i &lt; oldSize; i++) {</TD></TR><TR CLASS="c"><TD CLASS="l">2135</TD><TD>                                                if (fStructuredDocumentAboutToChangeListeners[i] == listener) { // ignore</TD></TR><TR><TD CLASS="l">2136</TD><TD>                                                }</TD></TR><TR><TD CLASS="l">2137</TD><TD>                                                else {</TD></TR><TR><TD CLASS="l">2138</TD><TD>                                                        // copy old to new if its not the one we are</TD></TR><TR><TD CLASS="l">2139</TD><TD>                                                        // removing</TD></TR><TR CLASS="z"><TD CLASS="l">2140</TD><TD>                                                        newListeners[index++] = fStructuredDocumentAboutToChangeListeners[i];</TD></TR><TR><TD CLASS="l">2141</TD><TD>                                                }</TD></TR><TR><TD CLASS="l">2142</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">2143</TD><TD>                                        // now that we have a new array, let's switch it for the</TD></TR><TR><TD CLASS="l">2144</TD><TD>                                        // old</TD></TR><TR><TD CLASS="l">2145</TD><TD>                                        // one</TD></TR><TR CLASS="c"><TD CLASS="l">2146</TD><TD>                                        fStructuredDocumentAboutToChangeListeners = newListeners;</TD></TR><TR><TD CLASS="l">2147</TD><TD>                                }</TD></TR><TR><TD CLASS="l">2148</TD><TD>                        }</TD></TR><TR><TD CLASS="l">2149</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">2150</TD><TD>        }</TD></TR><TR><TD CLASS="l">2151</TD><TD> </TD></TR><TR><TD CLASS="l"><A NAME="7c">2152</A></TD><TD>        /**</TD></TR><TR><TD CLASS="l">2153</TD><TD>         * removeModelChangedListener method comment.</TD></TR><TR><TD CLASS="l">2154</TD><TD>         */</TD></TR><TR><TD CLASS="l">2155</TD><TD>        public void removeDocumentChangedListener(IStructuredDocumentListener listener) {</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="79% line coverage (11 out of 14 instructions)">2156</TD><TD TITLE="79% line coverage (11 out of 14 instructions)">                synchronized (listenerLock) {</TD></TR><TR><TD CLASS="l">2157</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">2158</TD><TD>                        if ((fStructuredDocumentChangedListeners != null) &amp;&amp; (listener != null)) {</TD></TR><TR><TD CLASS="l">2159</TD><TD>                                // if its not in the listeners, we'll ignore the request</TD></TR><TR CLASS="c"><TD CLASS="l">2160</TD><TD>                                if (Utilities.contains(fStructuredDocumentChangedListeners, listener)) {</TD></TR><TR CLASS="c"><TD CLASS="l">2161</TD><TD>                                        int oldSize = fStructuredDocumentChangedListeners.length;</TD></TR><TR CLASS="c"><TD CLASS="l">2162</TD><TD>                                        int newSize = oldSize - 1;</TD></TR><TR CLASS="c"><TD CLASS="l">2163</TD><TD>                                        Object[] newListeners = new Object[newSize];</TD></TR><TR CLASS="c"><TD CLASS="l">2164</TD><TD>                                        int index = 0;</TD></TR><TR CLASS="c"><TD CLASS="l">2165</TD><TD>                                        for (int i = 0; i &lt; oldSize; i++) {</TD></TR><TR CLASS="c"><TD CLASS="l">2166</TD><TD>                                                if (fStructuredDocumentChangedListeners[i] == listener) { // ignore</TD></TR><TR><TD CLASS="l">2167</TD><TD>                                                }</TD></TR><TR><TD CLASS="l">2168</TD><TD>                                                else {</TD></TR><TR><TD CLASS="l">2169</TD><TD>                                                        // copy old to new if its not the one we are</TD></TR><TR><TD CLASS="l">2170</TD><TD>                                                        // removing</TD></TR><TR CLASS="c"><TD CLASS="l">2171</TD><TD>                                                        newListeners[index++] = fStructuredDocumentChangedListeners[i];</TD></TR><TR><TD CLASS="l">2172</TD><TD>                                                }</TD></TR><TR><TD CLASS="l">2173</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">2174</TD><TD>                                        // now that we have a new array, let's switch it for the</TD></TR><TR><TD CLASS="l">2175</TD><TD>                                        // old</TD></TR><TR><TD CLASS="l">2176</TD><TD>                                        // one</TD></TR><TR CLASS="c"><TD CLASS="l">2177</TD><TD>                                        fStructuredDocumentChangedListeners = newListeners;</TD></TR><TR><TD CLASS="l">2178</TD><TD>                                }</TD></TR><TR><TD CLASS="l">2179</TD><TD>                        }</TD></TR><TR><TD CLASS="l"><A NAME="71">2180</A></TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">2181</TD><TD>        }</TD></TR><TR><TD CLASS="l">2182</TD><TD> </TD></TR><TR><TD CLASS="l">2183</TD><TD>        public void removeDocumentChangingListener(IStructuredDocumentListener listener) {</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="79% line coverage (11 out of 14 instructions)">2184</TD><TD TITLE="79% line coverage (11 out of 14 instructions)">                synchronized (listenerLock) {</TD></TR><TR><TD CLASS="l">2185</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">2186</TD><TD>                        if ((fStructuredDocumentChangingListeners != null) &amp;&amp; (listener != null)) {</TD></TR><TR><TD CLASS="l">2187</TD><TD>                                // if its not in the listeners, we'll ignore the request</TD></TR><TR CLASS="c"><TD CLASS="l">2188</TD><TD>                                if (Utilities.contains(fStructuredDocumentChangingListeners, listener)) {</TD></TR><TR CLASS="c"><TD CLASS="l">2189</TD><TD>                                        int oldSize = fStructuredDocumentChangingListeners.length;</TD></TR><TR CLASS="c"><TD CLASS="l">2190</TD><TD>                                        int newSize = oldSize - 1;</TD></TR><TR CLASS="c"><TD CLASS="l">2191</TD><TD>                                        Object[] newListeners = new Object[newSize];</TD></TR><TR CLASS="c"><TD CLASS="l">2192</TD><TD>                                        int index = 0;</TD></TR><TR CLASS="c"><TD CLASS="l">2193</TD><TD>                                        for (int i = 0; i &lt; oldSize; i++) {</TD></TR><TR CLASS="c"><TD CLASS="l">2194</TD><TD>                                                if (fStructuredDocumentChangingListeners[i] == listener) { // ignore</TD></TR><TR><TD CLASS="l">2195</TD><TD>                                                }</TD></TR><TR><TD CLASS="l">2196</TD><TD>                                                else {</TD></TR><TR><TD CLASS="l">2197</TD><TD>                                                        // copy old to new if its not the one we are</TD></TR><TR><TD CLASS="l">2198</TD><TD>                                                        // removing</TD></TR><TR CLASS="z"><TD CLASS="l">2199</TD><TD>                                                        newListeners[index++] = fStructuredDocumentChangingListeners[i];</TD></TR><TR><TD CLASS="l">2200</TD><TD>                                                }</TD></TR><TR><TD CLASS="l">2201</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">2202</TD><TD>                                        // now that we have a new array, let's switch it for the</TD></TR><TR><TD CLASS="l">2203</TD><TD>                                        // old</TD></TR><TR><TD CLASS="l">2204</TD><TD>                                        // one</TD></TR><TR CLASS="c"><TD CLASS="l">2205</TD><TD>                                        fStructuredDocumentChangingListeners = newListeners;</TD></TR><TR><TD CLASS="l">2206</TD><TD>                                }</TD></TR><TR><TD CLASS="l">2207</TD><TD>                        }</TD></TR><TR><TD CLASS="l"><A NAME="7d">2208</A></TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">2209</TD><TD>        }</TD></TR><TR><TD CLASS="l">2210</TD><TD> </TD></TR><TR><TD CLASS="l">2211</TD><TD>        public void removeDocumentListener(IDocumentListener listener) {</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="79% line coverage (11 out of 14 instructions)">2212</TD><TD TITLE="79% line coverage (11 out of 14 instructions)">                synchronized (listenerLock) {</TD></TR><TR><TD CLASS="l">2213</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">2214</TD><TD>                        if ((fDocumentListeners != null) &amp;&amp; (listener != null)) {</TD></TR><TR><TD CLASS="l">2215</TD><TD>                                // if its not in the listeners, we'll ignore the request</TD></TR><TR CLASS="c"><TD CLASS="l">2216</TD><TD>                                if (Utilities.contains(fDocumentListeners, listener)) {</TD></TR><TR CLASS="c"><TD CLASS="l">2217</TD><TD>                                        int oldSize = fDocumentListeners.length;</TD></TR><TR CLASS="c"><TD CLASS="l">2218</TD><TD>                                        int newSize = oldSize - 1;</TD></TR><TR CLASS="c"><TD CLASS="l">2219</TD><TD>                                        IDocumentListener[] newListeners = new IDocumentListener[newSize];</TD></TR><TR CLASS="c"><TD CLASS="l">2220</TD><TD>                                        int index = 0;</TD></TR><TR CLASS="c"><TD CLASS="l">2221</TD><TD>                                        for (int i = 0; i &lt; oldSize; i++) {</TD></TR><TR CLASS="c"><TD CLASS="l">2222</TD><TD>                                                if (fDocumentListeners[i] == listener) { // ignore</TD></TR><TR><TD CLASS="l">2223</TD><TD>                                                }</TD></TR><TR><TD CLASS="l">2224</TD><TD>                                                else {</TD></TR><TR><TD CLASS="l">2225</TD><TD>                                                        // copy old to new if its not the one we are</TD></TR><TR><TD CLASS="l">2226</TD><TD>                                                        // removing</TD></TR><TR CLASS="c"><TD CLASS="l">2227</TD><TD>                                                        newListeners[index++] = fDocumentListeners[i];</TD></TR><TR><TD CLASS="l">2228</TD><TD>                                                }</TD></TR><TR><TD CLASS="l">2229</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">2230</TD><TD>                                        // now that we have a new array, let's switch it for the</TD></TR><TR><TD CLASS="l">2231</TD><TD>                                        // old</TD></TR><TR><TD CLASS="l">2232</TD><TD>                                        // one</TD></TR><TR CLASS="c"><TD CLASS="l">2233</TD><TD>                                        fDocumentListeners = newListeners;</TD></TR><TR><TD CLASS="l">2234</TD><TD>                                }</TD></TR><TR><TD CLASS="l">2235</TD><TD>                        }</TD></TR><TR><TD CLASS="l">2236</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">2237</TD><TD>        }</TD></TR><TR><TD CLASS="l">2238</TD><TD> </TD></TR><TR><TD CLASS="l"><A NAME="73">2239</A></TD><TD>        /*</TD></TR><TR><TD CLASS="l">2240</TD><TD>         * @see org.eclipse.jface.text.IDocument#removeDocumentPartitioningListener(org.eclipse.jface.text.IDocumentPartitioningListener)</TD></TR><TR><TD CLASS="l">2241</TD><TD>         */</TD></TR><TR><TD CLASS="l">2242</TD><TD>        public void removeDocumentPartitioningListener(IDocumentPartitioningListener listener) {</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="81% line coverage (13 out of 16 instructions)">2243</TD><TD TITLE="81% line coverage (13 out of 16 instructions)">                synchronized (listenerLock) {</TD></TR><TR><TD CLASS="l">2244</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">2245</TD><TD>                        Assert.isNotNull(listener);</TD></TR><TR CLASS="c"><TD CLASS="l">2246</TD><TD>                        if (fDocumentPartitioningListeners != null)</TD></TR><TR CLASS="c"><TD CLASS="l">2247</TD><TD>                                fDocumentPartitioningListeners.remove(listener);</TD></TR><TR><TD CLASS="l">2248</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">2249</TD><TD>        }</TD></TR><TR><TD CLASS="l">2250</TD><TD> </TD></TR><TR><TD CLASS="l">2251</TD><TD>        /**</TD></TR><TR><TD CLASS="l">2252</TD><TD>         * Removes the given &lt;code&gt;Position&lt;/code&gt; from the document's default</TD></TR><TR><TD CLASS="l">2253</TD><TD>         * position category. The default position category is to be defined by</TD></TR><TR><TD CLASS="l"><A NAME="39">2254</A></TD><TD>         * the implementers. If the position is not part of the document's default</TD></TR><TR><TD CLASS="l">2255</TD><TD>         * category nothing happens.</TD></TR><TR><TD CLASS="l">2256</TD><TD>         */</TD></TR><TR><TD CLASS="l">2257</TD><TD>        public void removePosition(Position position) {</TD></TR><TR CLASS="z"><TD CLASS="l">2258</TD><TD>                getPositionManager().removePosition(position);</TD></TR><TR CLASS="z"><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><TD CLASS="l">2262</TD><TD>         * @see IDocument#removePosition</TD></TR><TR><TD CLASS="l"><A NAME="3a">2263</A></TD><TD>         * @exception BadPositionCategoryException</TD></TR><TR><TD CLASS="l">2264</TD><TD>         *                If the category is not defined for the document</TD></TR><TR><TD CLASS="l">2265</TD><TD>         */</TD></TR><TR><TD CLASS="l">2266</TD><TD>        public void removePosition(String category, Position position) throws BadPositionCategoryException {</TD></TR><TR CLASS="z"><TD CLASS="l">2267</TD><TD>                getPositionManager().removePosition(category, position);</TD></TR><TR CLASS="z"><TD CLASS="l">2268</TD><TD>        }</TD></TR><TR><TD CLASS="l">2269</TD><TD> </TD></TR><TR><TD CLASS="l">2270</TD><TD>        /**</TD></TR><TR><TD CLASS="l">2271</TD><TD>         * @see IDocument#removePositionCategory</TD></TR><TR><TD CLASS="l"><A NAME="99">2272</A></TD><TD>         * @exception BadPositionCategoryException</TD></TR><TR><TD CLASS="l">2273</TD><TD>         *                If the category is not defined for the document</TD></TR><TR><TD CLASS="l">2274</TD><TD>         */</TD></TR><TR><TD CLASS="l">2275</TD><TD>        public void removePositionCategory(String category) throws BadPositionCategoryException {</TD></TR><TR CLASS="c"><TD CLASS="l">2276</TD><TD>                getPositionManager().removePositionCategory(category);</TD></TR><TR CLASS="c"><TD CLASS="l">2277</TD><TD>        }</TD></TR><TR><TD CLASS="l">2278</TD><TD> </TD></TR><TR><TD CLASS="l"><A NAME="9a">2279</A></TD><TD>        /**</TD></TR><TR><TD CLASS="l">2280</TD><TD>         * @see IDocument#removePositionUpdater</TD></TR><TR><TD CLASS="l">2281</TD><TD>         */</TD></TR><TR><TD CLASS="l">2282</TD><TD>        public void removePositionUpdater(IPositionUpdater updater) {</TD></TR><TR CLASS="c"><TD CLASS="l">2283</TD><TD>                getPositionManager().removePositionUpdater(updater);</TD></TR><TR CLASS="c"><TD CLASS="l">2284</TD><TD>        }</TD></TR><TR><TD CLASS="l">2285</TD><TD> </TD></TR><TR><TD CLASS="l">2286</TD><TD>        /**</TD></TR><TR><TD CLASS="l">2287</TD><TD>         * Removes the given document listener from teh document's list of</TD></TR><TR><TD CLASS="l">2288</TD><TD>         * prenotified document listeners. If the listener is not registered with</TD></TR><TR><TD CLASS="l">2289</TD><TD>         * the document nothing happens.</TD></TR><TR><TD CLASS="l">2290</TD><TD>         * &lt;p&gt;</TD></TR><TR><TD CLASS="l">2291</TD><TD>         * </TD></TR><TR><TD CLASS="l">2292</TD><TD>         * This method is not for public use, it may only be called by</TD></TR><TR><TD CLASS="l">2293</TD><TD>         * implementers of &lt;code&gt;IDocumentAdapter&lt;/code&gt; and only if those</TD></TR><TR><TD CLASS="l">2294</TD><TD>         * implementers need to implement &lt;code&gt;IDocumentListener&lt;/code&gt;.</TD></TR><TR><TD CLASS="l">2295</TD><TD>         * </TD></TR><TR><TD CLASS="l">2296</TD><TD>         * @param documentAdapter</TD></TR><TR><TD CLASS="l">2297</TD><TD>         *            the listener to be removed</TD></TR><TR><TD CLASS="l"><A NAME="5e">2298</A></TD><TD>         * </TD></TR><TR><TD CLASS="l">2299</TD><TD>         * @see #addPrenotifiedDocumentListener(IDocumentListener)</TD></TR><TR><TD CLASS="l">2300</TD><TD>         */</TD></TR><TR><TD CLASS="l">2301</TD><TD>        public void removePrenotifiedDocumentListener(org.eclipse.jface.text.IDocumentListener documentAdapter) {</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="81% line coverage (13 out of 16 instructions)">2302</TD><TD TITLE="81% line coverage (13 out of 16 instructions)">                synchronized (listenerLock) {</TD></TR><TR><TD CLASS="l">2303</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">2304</TD><TD>                        if (Utilities.contains(fPrenotifiedDocumentListeners, documentAdapter)) {</TD></TR><TR CLASS="c"><TD CLASS="l">2305</TD><TD>                                int previousSize = fPrenotifiedDocumentListeners.length;</TD></TR><TR CLASS="c"><TD CLASS="l">2306</TD><TD>                                if (previousSize &gt; 1) {</TD></TR><TR CLASS="z"><TD CLASS="l">2307</TD><TD>                                        IDocumentListener[] listeners = new IDocumentListener[previousSize - 1];</TD></TR><TR CLASS="z"><TD CLASS="l">2308</TD><TD>                                        int previousIndex = 0;</TD></TR><TR CLASS="z"><TD CLASS="l">2309</TD><TD>                                        int newIndex = 0;</TD></TR><TR CLASS="z"><TD CLASS="l">2310</TD><TD>                                        while (previousIndex &lt; previousSize) {</TD></TR><TR CLASS="z"><TD CLASS="l">2311</TD><TD>                                                if (fPrenotifiedDocumentListeners[previousIndex] != documentAdapter)</TD></TR><TR CLASS="z"><TD CLASS="l">2312</TD><TD>                                                        listeners[newIndex++] = fPrenotifiedDocumentListeners[previousIndex];</TD></TR><TR CLASS="z"><TD CLASS="l">2313</TD><TD>                                                previousIndex++;</TD></TR><TR><TD CLASS="l">2314</TD><TD>                                        }</TD></TR><TR CLASS="z"><TD CLASS="l">2315</TD><TD>                                        fPrenotifiedDocumentListeners = listeners;</TD></TR><TR><TD CLASS="l">2316</TD><TD>                                }</TD></TR><TR><TD CLASS="l">2317</TD><TD>                                else {</TD></TR><TR CLASS="c"><TD CLASS="l">2318</TD><TD>                                        fPrenotifiedDocumentListeners = null;</TD></TR><TR><TD CLASS="l">2319</TD><TD>                                }</TD></TR><TR><TD CLASS="l">2320</TD><TD>                        }</TD></TR><TR><TD CLASS="l">2321</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">2322</TD><TD>        }</TD></TR><TR><TD CLASS="l">2323</TD><TD> </TD></TR><TR><TD CLASS="l">2324</TD><TD>        /**</TD></TR><TR><TD CLASS="l">2325</TD><TD>         * This method is for INTERNAL USE ONLY and is NOT API.</TD></TR><TR><TD CLASS="l">2326</TD><TD>         * </TD></TR><TR><TD CLASS="l">2327</TD><TD>         * Rebuilds the StructuredDocumentRegion chain from the existing text.</TD></TR><TR><TD CLASS="l">2328</TD><TD>         * FileBuffer support does not allow clients to know the document's</TD></TR><TR><TD CLASS="l">2329</TD><TD>         * location before the text contents are set.</TD></TR><TR><TD CLASS="l"><A NAME="3b">2330</A></TD><TD>         * </TD></TR><TR><TD CLASS="l">2331</TD><TD>         * @see set(String)</TD></TR><TR><TD CLASS="l">2332</TD><TD>         */</TD></TR><TR><TD CLASS="l">2333</TD><TD>        public void reparse(Object requester) {</TD></TR><TR CLASS="z"><TD CLASS="l">2334</TD><TD>                stopPostNotificationProcessing();</TD></TR><TR CLASS="z"><TD CLASS="l">2335</TD><TD>                clearReadOnly();</TD></TR><TR><TD CLASS="l">2336</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">2337</TD><TD>                acquireLock();</TD></TR><TR><TD CLASS="l">2338</TD><TD>                try {</TD></TR><TR CLASS="z"><TD CLASS="l">2339</TD><TD>                        CharSequenceReader subSetTextStoreReader = new CharSequenceReader((CharSequence) getStore(), 0, getStore().getLength());</TD></TR><TR CLASS="z"><TD CLASS="l">2340</TD><TD>                        resetParser(subSetTextStoreReader, 0);</TD></TR><TR><TD CLASS="l">2341</TD><TD>                        //</TD></TR><TR CLASS="z"><TD CLASS="l">2342</TD><TD>                        setCachedDocumentRegion(getParser().getDocumentRegions());</TD></TR><TR><TD CLASS="l">2343</TD><TD>                        // when starting afresh, our cachedNode should be our firstNode,</TD></TR><TR><TD CLASS="l">2344</TD><TD>                        // so be sure to initialize the firstNode and lastNode</TD></TR><TR CLASS="z"><TD CLASS="l">2345</TD><TD>                        initializeFirstAndLastDocumentRegion();</TD></TR><TR CLASS="z"><TD CLASS="l">2346</TD><TD>                        StructuredDocumentRegionIterator.setParentDocument(getCachedDocumentRegion(), this);</TD></TR><TR><TD CLASS="l">2347</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">2348</TD><TD>                finally {</TD></TR><TR CLASS="z"><TD CLASS="l">2349</TD><TD>                        releaseLock();</TD></TR><TR CLASS="z"><TD CLASS="l">2350</TD><TD>                }</TD></TR><TR><TD CLASS="l">2351</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">2352</TD><TD>                resumePostNotificationProcessing();</TD></TR><TR CLASS="z"><TD CLASS="l">2353</TD><TD>        }</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>         * @see IDocument#replace</TD></TR><TR><TD CLASS="l">2357</TD><TD>         * @exception BadLocationException</TD></TR><TR><TD CLASS="l">2358</TD><TD>         *                If position is not a valid range in the document</TD></TR><TR><TD CLASS="l">2359</TD><TD>         */</TD></TR><TR><TD CLASS="l"><A NAME="3c">2360</A></TD><TD>        public void replace(int offset, int length, String text) throws BadLocationException {</TD></TR><TR><TD CLASS="l">2361</TD><TD>                if (Debug.displayWarnings) {</TD></TR><TR><TD CLASS="l">2362</TD><TD>                        System.out.println(&#34;Note: IStructuredDocument::replace(int, int, String) .... its better to use replaceText(source, string, int, int) API for structuredDocument updates&#34;); //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">2363</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">2364</TD><TD>                replaceText(this, offset, length, text);</TD></TR><TR CLASS="z"><TD CLASS="l">2365</TD><TD>        }</TD></TR><TR><TD CLASS="l">2366</TD><TD> </TD></TR><TR><TD CLASS="l">2367</TD><TD>        /**</TD></TR><TR><TD CLASS="l">2368</TD><TD>         * Replace the text with &#34;newText&#34; starting at position &#34;start&#34; for a</TD></TR><TR><TD CLASS="l">2369</TD><TD>         * length of &#34;replaceLength&#34;.</TD></TR><TR><TD CLASS="l">2370</TD><TD>         * &lt;p&gt;</TD></TR><TR><TD CLASS="l">2371</TD><TD>         * </TD></TR><TR><TD CLASS="l">2372</TD><TD>         * @param pos</TD></TR><TR><TD CLASS="l">2373</TD><TD>         *            start offset of text to replace None of the offsets include</TD></TR><TR><TD CLASS="l">2374</TD><TD>         *            delimiters of preceeding lines. Offset 0 is the first</TD></TR><TR><TD CLASS="l">2375</TD><TD>         *            character of the document.</TD></TR><TR><TD CLASS="l">2376</TD><TD>         * @param length</TD></TR><TR><TD CLASS="l">2377</TD><TD>         *            start offset of text to replace</TD></TR><TR><TD CLASS="l">2378</TD><TD>         * @param text</TD></TR><TR><TD CLASS="l">2379</TD><TD>         *            start offset of text to replace</TD></TR><TR><TD CLASS="l">2380</TD><TD>         *            &lt;p&gt;</TD></TR><TR><TD CLASS="l">2381</TD><TD>         *            Implementors have to notify TextChanged listeners after the</TD></TR><TR><TD CLASS="l">2382</TD><TD>         *            content has been updated. The TextChangedEvent should be set</TD></TR><TR><TD CLASS="l">2383</TD><TD>         *            as follows:</TD></TR><TR><TD CLASS="l">2384</TD><TD>         * </TD></TR><TR><TD CLASS="l">2385</TD><TD>         * event.type = SWT.TextReplaced event.start = start of the replaced text</TD></TR><TR><TD CLASS="l">2386</TD><TD>         * event.numReplacedLines = number of replaced lines event.numNewLines =</TD></TR><TR><TD CLASS="l">2387</TD><TD>         * number of new lines event.replacedLength = length of the replaced text</TD></TR><TR><TD CLASS="l">2388</TD><TD>         * event.newLength = length of the new text</TD></TR><TR><TD CLASS="l">2389</TD><TD>         * </TD></TR><TR><TD CLASS="l">2390</TD><TD>         * NOTE: numNewLines is the number of inserted lines and numReplacedLines</TD></TR><TR><TD CLASS="l">2391</TD><TD>         * is the number of deleted lines based on the change that occurs</TD></TR><TR><TD CLASS="l">2392</TD><TD>         * visually. For example:</TD></TR><TR><TD CLASS="l">2393</TD><TD>         * </TD></TR><TR><TD CLASS="l">2394</TD><TD>         * replacedText newText numReplacedLines numNewLines &#34;&#34; &#34;\n&#34; 0 1 &#34;\n\n&#34;</TD></TR><TR><TD CLASS="l">2395</TD><TD>         * &#34;a&#34; 2 0 &#34;a&#34; &#34;\n\n&#34; 0 2</TD></TR><TR><TD CLASS="l">2396</TD><TD>         */</TD></TR><TR><TD CLASS="l"><A NAME="3e">2397</A></TD><TD>        /**</TD></TR><TR><TD CLASS="l">2398</TD><TD>         * One of the APIs to manipulate the IStructuredDocument in terms of text.</TD></TR><TR><TD CLASS="l">2399</TD><TD>         */</TD></TR><TR><TD CLASS="l">2400</TD><TD>        public StructuredDocumentEvent replaceText(Object requester, int pos, int length, String text) {</TD></TR><TR CLASS="z"><TD CLASS="l">2401</TD><TD>                if (length == 0 &amp;&amp; (text == null || text.length() == 0))</TD></TR><TR CLASS="z"><TD CLASS="l">2402</TD><TD>                        return replaceText(requester, pos, length, text, getModificationStamp(), true);</TD></TR><TR><TD CLASS="l">2403</TD><TD>                else</TD></TR><TR CLASS="z"><TD CLASS="l">2404</TD><TD>                        return replaceText(requester, pos, length, text, getNextModificationStamp(), true);</TD></TR><TR><TD CLASS="l">2405</TD><TD>        }</TD></TR><TR><TD CLASS="l"><A NAME="3f">2406</A></TD><TD> </TD></TR><TR><TD CLASS="l">2407</TD><TD>        public StructuredDocumentEvent replaceText(Object requester, int start, int replacementLength, String changes, boolean ignoreReadOnlySettings) {</TD></TR><TR><TD CLASS="l">2408</TD><TD>                long modificationStamp;</TD></TR><TR><TD CLASS="l">2409</TD><TD>                </TD></TR><TR CLASS="z"><TD CLASS="l">2410</TD><TD>                if (replacementLength == 0 &amp;&amp; (changes == null || changes.length() == 0))</TD></TR><TR CLASS="z"><TD CLASS="l">2411</TD><TD>                        modificationStamp = getModificationStamp();</TD></TR><TR><TD CLASS="l">2412</TD><TD>                else</TD></TR><TR CLASS="z"><TD CLASS="l">2413</TD><TD>                        modificationStamp = getNextModificationStamp();</TD></TR><TR><TD CLASS="l">2414</TD><TD>                </TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="9b">2415</A></TD><TD>                return replaceText(requester, start, replacementLength, changes, modificationStamp, ignoreReadOnlySettings);</TD></TR><TR><TD CLASS="l">2416</TD><TD>        }</TD></TR><TR><TD CLASS="l">2417</TD><TD>        </TD></TR><TR><TD CLASS="l">2418</TD><TD>        private StructuredDocumentEvent replaceText(Object requester, int start, int replacementLength, String changes, long modificationStamp, boolean ignoreReadOnlySettings) {</TD></TR><TR CLASS="c"><TD CLASS="l">2419</TD><TD>                StructuredDocumentEvent event = internalReplaceText(requester, start, replacementLength, changes, modificationStamp, ignoreReadOnlySettings);</TD></TR><TR CLASS="c"><TD CLASS="l">2420</TD><TD>                return event;</TD></TR><TR><TD CLASS="l"><A NAME="69">2421</A></TD><TD>        }</TD></TR><TR><TD CLASS="l">2422</TD><TD> </TD></TR><TR><TD CLASS="l">2423</TD><TD>        void resetParser(int startOffset, int endOffset) {</TD></TR><TR><TD CLASS="l">2424</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">2425</TD><TD>                RegionParser parser = getParser();</TD></TR><TR CLASS="c"><TD CLASS="l">2426</TD><TD>                ITextStore textStore = getStore();</TD></TR><TR CLASS="c"><TD CLASS="l">2427</TD><TD>                if (textStore instanceof CharSequence) {</TD></TR><TR CLASS="c"><TD CLASS="l">2428</TD><TD>                        CharSequenceReader subSetTextStoreReader = new CharSequenceReader((CharSequence) textStore, startOffset, endOffset - startOffset);</TD></TR><TR CLASS="c"><TD CLASS="l">2429</TD><TD>                        parser.reset(subSetTextStoreReader, startOffset);</TD></TR><TR><TD CLASS="l">2430</TD><TD>                }</TD></TR><TR><TD CLASS="l">2431</TD><TD>                else {</TD></TR><TR CLASS="z"><TD CLASS="l">2432</TD><TD>                        String newNodeText = get(startOffset, endOffset - startOffset);</TD></TR><TR CLASS="z"><TD CLASS="l">2433</TD><TD>                        parser.reset(newNodeText, startOffset);</TD></TR><TR><TD CLASS="l">2434</TD><TD> </TD></TR><TR><TD CLASS="l">2435</TD><TD>                }</TD></TR><TR><TD CLASS="l"><A NAME="40">2436</A></TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">2437</TD><TD>        }</TD></TR><TR><TD CLASS="l">2438</TD><TD> </TD></TR><TR><TD CLASS="l">2439</TD><TD>        void resetParser(Reader reader, int startOffset) {</TD></TR><TR CLASS="z"><TD CLASS="l">2440</TD><TD>                RegionParser parser = getParser();</TD></TR><TR CLASS="z"><TD CLASS="l">2441</TD><TD>                parser.reset(reader, startOffset);</TD></TR><TR CLASS="z"><TD CLASS="l">2442</TD><TD>        }</TD></TR><TR><TD CLASS="l">2443</TD><TD> </TD></TR><TR><TD CLASS="l">2444</TD><TD>        /*</TD></TR><TR><TD CLASS="l">2445</TD><TD>         * (non-Javadoc)</TD></TR><TR><TD CLASS="l"><A NAME="9c">2446</A></TD><TD>         * </TD></TR><TR><TD CLASS="l">2447</TD><TD>         * @see org.eclipse.jface.text.IDocumentExtension#resumePostNotificationProcessing()</TD></TR><TR><TD CLASS="l">2448</TD><TD>         */</TD></TR><TR><TD CLASS="l">2449</TD><TD>        public void resumePostNotificationProcessing() {</TD></TR><TR CLASS="c"><TD CLASS="l">2450</TD><TD>                --fStoppedCount;</TD></TR><TR CLASS="c"><TD CLASS="l">2451</TD><TD>                if (fStoppedCount == 0 &amp;&amp; fReentranceCount == 0)</TD></TR><TR CLASS="c"><TD CLASS="l">2452</TD><TD>                        executePostNotificationChanges();</TD></TR><TR CLASS="c"><TD CLASS="l">2453</TD><TD>        }</TD></TR><TR><TD CLASS="l">2454</TD><TD> </TD></TR><TR><TD CLASS="l">2455</TD><TD>        /**</TD></TR><TR><TD CLASS="l">2456</TD><TD>         * @deprecated in superclass in 3.0 - use a FindReplaceDocumentAdapter</TD></TR><TR><TD CLASS="l">2457</TD><TD>         *             directly</TD></TR><TR><TD CLASS="l">2458</TD><TD>         * @see IDocument#search</TD></TR><TR><TD CLASS="l">2459</TD><TD>         */</TD></TR><TR><TD CLASS="l">2460</TD><TD>        public int search(int startPosition, String findString, boolean forwardSearch, boolean caseSensitive, boolean wholeWord) throws BadLocationException {</TD></TR><TR><TD CLASS="l"><A NAME="41">2461</A></TD><TD>                // (dmw) I added this warning, to know if still being used. I'm not</TD></TR><TR><TD CLASS="l">2462</TD><TD>                // sure it</TD></TR><TR><TD CLASS="l">2463</TD><TD>                // works as expected any longer.</TD></TR><TR><TD CLASS="l">2464</TD><TD>                // but the warning should be removed, once know.</TD></TR><TR CLASS="z"><TD CLASS="l">2465</TD><TD>                Logger.log(Logger.INFO, &#34;WARNING: using unsupported deprecated method 'search'&#34;); //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">2466</TD><TD>                int offset = -1;</TD></TR><TR CLASS="z"><TD CLASS="l">2467</TD><TD>                IRegion match = new FindReplaceDocumentAdapter(this).find(startPosition, findString, forwardSearch, caseSensitive, wholeWord, false);</TD></TR><TR CLASS="z"><TD CLASS="l">2468</TD><TD>                if (match != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">2469</TD><TD>                        offset = match.getOffset();</TD></TR><TR><TD CLASS="l">2470</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">2471</TD><TD>                return offset;</TD></TR><TR><TD CLASS="l">2472</TD><TD>        }</TD></TR><TR><TD CLASS="l">2473</TD><TD> </TD></TR><TR><TD CLASS="l">2474</TD><TD>        /**</TD></TR><TR><TD CLASS="l">2475</TD><TD>         * @see IDocument#setText</TD></TR><TR><TD CLASS="l">2476</TD><TD>         */</TD></TR><TR><TD CLASS="l"><A NAME="42">2477</A></TD><TD>        public void set(String string) {</TD></TR><TR><TD CLASS="l">2478</TD><TD>                if (Debug.displayInfo) {</TD></TR><TR><TD CLASS="l">2479</TD><TD>                        System.out.println(&#34;Note: IStructuredDocument::setText(String) .... its better to use setText(source, string) API for structuredDocument updates&#34;); //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">2480</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">2481</TD><TD>                setText(null, string);</TD></TR><TR CLASS="z"><TD CLASS="l">2482</TD><TD>        }</TD></TR><TR><TD CLASS="l">2483</TD><TD> </TD></TR><TR><TD CLASS="l">2484</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="6b">2485</A></TD><TD>         * This may be marked public, but should be packaged protected, once</TD></TR><TR><TD CLASS="l">2486</TD><TD>         * refactoring is complete (in other words, not for client use).</TD></TR><TR><TD CLASS="l">2487</TD><TD>         */</TD></TR><TR><TD CLASS="l">2488</TD><TD>        public void setCachedDocumentRegion(IStructuredDocumentRegion structuredRegion) {</TD></TR><TR CLASS="c"><TD CLASS="l">2489</TD><TD>                if (USE_LOCAL_THREAD) {</TD></TR><TR CLASS="c"><TD CLASS="l">2490</TD><TD>                        fCurrentDocumnetRegionCache.set(structuredRegion);</TD></TR><TR><TD CLASS="l">2491</TD><TD>                }</TD></TR><TR><TD CLASS="l">2492</TD><TD>                else {</TD></TR><TR CLASS="z"><TD CLASS="l">2493</TD><TD>                        cachedDocumentRegion = structuredRegion;</TD></TR><TR><TD CLASS="l">2494</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">2495</TD><TD>        }</TD></TR><TR><TD CLASS="l">2496</TD><TD> </TD></TR><TR><TD CLASS="l">2497</TD><TD>        /**</TD></TR><TR><TD CLASS="l">2498</TD><TD>         * Sets the document's partitioner.</TD></TR><TR><TD CLASS="l"><A NAME="9e">2499</A></TD><TD>         * </TD></TR><TR><TD CLASS="l">2500</TD><TD>         * @see IDocumentPartitioner</TD></TR><TR><TD CLASS="l">2501</TD><TD>         */</TD></TR><TR><TD CLASS="l">2502</TD><TD>        public void setDocumentPartitioner(IDocumentPartitioner partitioner) {</TD></TR><TR CLASS="c"><TD CLASS="l">2503</TD><TD>                setDocumentPartitioner(IDocumentExtension3.DEFAULT_PARTITIONING, partitioner);</TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="67">2504</A></TD><TD>        }</TD></TR><TR><TD CLASS="l">2505</TD><TD> </TD></TR><TR><TD CLASS="l">2506</TD><TD> </TD></TR><TR><TD CLASS="l">2507</TD><TD>        public void setDocumentPartitioner(String partitioning, IDocumentPartitioner partitioner) {</TD></TR><TR CLASS="c"><TD CLASS="l">2508</TD><TD>                if (partitioner == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">2509</TD><TD>                        if (fDocumentPartitioners != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">2510</TD><TD>                                fDocumentPartitioners.remove(partitioning);</TD></TR><TR CLASS="z"><TD CLASS="l">2511</TD><TD>                                if (fDocumentPartitioners.size() == 0)</TD></TR><TR CLASS="z"><TD CLASS="l">2512</TD><TD>                                        fDocumentPartitioners = null;</TD></TR><TR><TD CLASS="l">2513</TD><TD>                        }</TD></TR><TR><TD CLASS="l">2514</TD><TD>                }</TD></TR><TR><TD CLASS="l">2515</TD><TD>                else {</TD></TR><TR CLASS="c"><TD CLASS="l">2516</TD><TD>                        if (fDocumentPartitioners == null)</TD></TR><TR CLASS="c"><TD CLASS="l">2517</TD><TD>                                fDocumentPartitioners = new HashMap();</TD></TR><TR CLASS="c"><TD CLASS="l">2518</TD><TD>                        fDocumentPartitioners.put(partitioning, partitioner);</TD></TR><TR><TD CLASS="l">2519</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">2520</TD><TD>                DocumentPartitioningChangedEvent event = new DocumentPartitioningChangedEvent(this);</TD></TR><TR CLASS="c"><TD CLASS="l">2521</TD><TD>                event.setPartitionChange(partitioning, 0, getLength());</TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="9f">2522</A></TD><TD>                fireDocumentPartitioningChanged(event);</TD></TR><TR CLASS="c"><TD CLASS="l">2523</TD><TD>        }</TD></TR><TR><TD CLASS="l">2524</TD><TD> </TD></TR><TR><TD CLASS="l">2525</TD><TD>        public void setEncodingMemento(EncodingMemento encodingMemento) {</TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="43">2526</A></TD><TD>                this.encodingMemento = encodingMemento;</TD></TR><TR CLASS="c"><TD CLASS="l">2527</TD><TD>        }</TD></TR><TR><TD CLASS="l">2528</TD><TD> </TD></TR><TR><TD CLASS="l">2529</TD><TD>        void setFirstDocumentRegion(IStructuredDocumentRegion region) {</TD></TR><TR CLASS="z"><TD CLASS="l">2530</TD><TD>                firstDocumentRegion = region;</TD></TR><TR><TD CLASS="l">2531</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">2532</TD><TD>        }</TD></TR><TR><TD CLASS="l">2533</TD><TD> </TD></TR><TR><TD CLASS="l">2534</TD><TD>        /*</TD></TR><TR><TD CLASS="l">2535</TD><TD>         * (non-Javadoc)</TD></TR><TR><TD CLASS="l">2536</TD><TD>         * </TD></TR><TR><TD CLASS="l">2537</TD><TD>         * @see org.eclipse.jface.text.IDocumentExtension4#setInitialLineDelimiter(java.lang.String)</TD></TR><TR><TD CLASS="l"><A NAME="44">2538</A></TD><TD>         */</TD></TR><TR><TD CLASS="l">2539</TD><TD>        public void setInitialLineDelimiter(String lineDelimiter) {</TD></TR><TR><TD CLASS="l">2540</TD><TD>                // make sure our preferred delimiter is</TD></TR><TR><TD CLASS="l">2541</TD><TD>                // one of the legal ones</TD></TR><TR CLASS="z"><TD CLASS="l">2542</TD><TD>                if (Utilities.containsString(getLegalLineDelimiters(), lineDelimiter)) {</TD></TR><TR CLASS="z"><TD CLASS="l">2543</TD><TD>                        fInitialLineDelimiter= lineDelimiter;</TD></TR><TR><TD CLASS="l">2544</TD><TD>                }</TD></TR><TR><TD CLASS="l">2545</TD><TD>                else {</TD></TR><TR CLASS="z"><TD CLASS="l">2546</TD><TD>                        if (Logger.DEBUG_DOCUMENT)</TD></TR><TR CLASS="z"><TD CLASS="l">2547</TD><TD>                                Logger.log(Logger.INFO, &#34;Attempt to set linedelimiter to non-legal delimiter&#34;); //$NON-NLS-1$ //$NON-NLS-2$</TD></TR><TR CLASS="z"><TD CLASS="l">2548</TD><TD>                        fInitialLineDelimiter = Platform.getPreferencesService().getString(Platform.PI_RUNTIME, Platform.PREF_LINE_SEPARATOR, System.getProperty(&#34;line.separator&#34;), new IScopeContext[] { new InstanceScope() });//$NON-NLS-1$</TD></TR><TR><TD CLASS="l"><A NAME="45">2549</A></TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">2550</TD><TD>        }</TD></TR><TR><TD CLASS="l">2551</TD><TD> </TD></TR><TR><TD CLASS="l">2552</TD><TD>        void setLastDocumentRegion(IStructuredDocumentRegion region) {</TD></TR><TR CLASS="z"><TD CLASS="l">2553</TD><TD>                lastDocumentRegion = region;</TD></TR><TR><TD CLASS="l">2554</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">2555</TD><TD>        }</TD></TR><TR><TD CLASS="l">2556</TD><TD> </TD></TR><TR><TD CLASS="l">2557</TD><TD>        /*</TD></TR><TR><TD CLASS="l">2558</TD><TD>         * (non-Javadoc)</TD></TR><TR><TD CLASS="l"><A NAME="46">2559</A></TD><TD>         * </TD></TR><TR><TD CLASS="l">2560</TD><TD>         * @see org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument#setLineDelimiter(java.lang.String)</TD></TR><TR><TD CLASS="l">2561</TD><TD>         */</TD></TR><TR><TD CLASS="l">2562</TD><TD>        public void setLineDelimiter(String delimiter) {</TD></TR><TR CLASS="z"><TD CLASS="l">2563</TD><TD>                setInitialLineDelimiter(delimiter);</TD></TR><TR CLASS="z"><TD CLASS="l">2564</TD><TD>        }</TD></TR><TR><TD CLASS="l">2565</TD><TD> </TD></TR><TR><TD CLASS="l">2566</TD><TD>        /**</TD></TR><TR><TD CLASS="l">2567</TD><TD>         * Sets the document's line tracker. Must be called at the beginning of</TD></TR><TR><TD CLASS="l">2568</TD><TD>         * the constructor.</TD></TR><TR><TD CLASS="l">2569</TD><TD>         * </TD></TR><TR><TD CLASS="l"><A NAME="a0">2570</A></TD><TD>         * @param tracker</TD></TR><TR><TD CLASS="l">2571</TD><TD>         *            the document's line tracker</TD></TR><TR><TD CLASS="l">2572</TD><TD>         */</TD></TR><TR><TD CLASS="l">2573</TD><TD>        private void setLineTracker(ILineTracker tracker) {</TD></TR><TR CLASS="c"><TD CLASS="l">2574</TD><TD>                Assert.isNotNull(tracker);</TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="47">2575</A></TD><TD>                fTracker = tracker;</TD></TR><TR CLASS="c"><TD CLASS="l">2576</TD><TD>        }</TD></TR><TR><TD CLASS="l">2577</TD><TD> </TD></TR><TR><TD CLASS="l">2578</TD><TD>        public void setParser(RegionParser newParser) {</TD></TR><TR CLASS="z"><TD CLASS="l">2579</TD><TD>                internal_setParser(newParser);</TD></TR><TR CLASS="z"><TD CLASS="l">2580</TD><TD>        }</TD></TR><TR><TD CLASS="l">2581</TD><TD> </TD></TR><TR><TD CLASS="l">2582</TD><TD>        /**</TD></TR><TR><TD CLASS="l">2583</TD><TD>         * @param positionManager</TD></TR><TR><TD CLASS="l"><A NAME="48">2584</A></TD><TD>         *            The positionManager to set.</TD></TR><TR><TD CLASS="l">2585</TD><TD>         */</TD></TR><TR><TD CLASS="l">2586</TD><TD>        // TODO: make private is needed, else remove</TD></TR><TR><TD CLASS="l">2587</TD><TD>        void setPositionManager(GenericPositionManager positionManager) {</TD></TR><TR CLASS="z"><TD CLASS="l">2588</TD><TD>                fPositionManager = positionManager;</TD></TR><TR CLASS="z"><TD CLASS="l">2589</TD><TD>        }</TD></TR><TR><TD CLASS="l">2590</TD><TD> </TD></TR><TR><TD CLASS="l"><A NAME="a1">2591</A></TD><TD>        /**</TD></TR><TR><TD CLASS="l">2592</TD><TD>         * </TD></TR><TR><TD CLASS="l">2593</TD><TD>         */</TD></TR><TR><TD CLASS="l">2594</TD><TD>        public void setReParser(IStructuredTextReParser newReParser) {</TD></TR><TR CLASS="c"><TD CLASS="l">2595</TD><TD>                fReParser = newReParser;</TD></TR><TR CLASS="c"><TD CLASS="l">2596</TD><TD>                if (fReParser != null) {</TD></TR><TR CLASS="c"><TD CLASS="l">2597</TD><TD>                        fReParser.setStructuredDocument(this);</TD></TR><TR><TD CLASS="l">2598</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">2599</TD><TD>        }</TD></TR><TR><TD CLASS="l">2600</TD><TD> </TD></TR><TR><TD CLASS="l"><A NAME="4a">2601</A></TD><TD>        /**</TD></TR><TR><TD CLASS="l">2602</TD><TD>         * One of the APIs to manipulate the IStructuredDocument in terms of text.</TD></TR><TR><TD CLASS="l">2603</TD><TD>         */</TD></TR><TR><TD CLASS="l">2604</TD><TD>        public StructuredDocumentEvent setText(Object requester, String theString) {</TD></TR><TR CLASS="z"><TD CLASS="l">2605</TD><TD>                StructuredDocumentEvent result = null;</TD></TR><TR CLASS="z"><TD CLASS="l">2606</TD><TD>                result = replaceText(requester, 0, getLength(), theString, getNextModificationStamp(), true);</TD></TR><TR CLASS="z"><TD CLASS="l">2607</TD><TD>                return result;</TD></TR><TR><TD CLASS="l">2608</TD><TD>        }</TD></TR><TR><TD CLASS="l">2609</TD><TD> </TD></TR><TR><TD CLASS="l">2610</TD><TD>        /**</TD></TR><TR><TD CLASS="l">2611</TD><TD>         * Sets the document's text store. Must be called at the beginning of the</TD></TR><TR><TD CLASS="l">2612</TD><TD>         * constructor.</TD></TR><TR><TD CLASS="l">2613</TD><TD>         * </TD></TR><TR><TD CLASS="l"><A NAME="a2">2614</A></TD><TD>         * @param store</TD></TR><TR><TD CLASS="l">2615</TD><TD>         *            the document's text store</TD></TR><TR><TD CLASS="l">2616</TD><TD>         */</TD></TR><TR><TD CLASS="l">2617</TD><TD>        private void setTextStore(ITextStore store) {</TD></TR><TR CLASS="c"><TD CLASS="l">2618</TD><TD>                Assert.isNotNull(store);</TD></TR><TR CLASS="c"><TD CLASS="l">2619</TD><TD>                fStore = store;</TD></TR><TR CLASS="c"><TD CLASS="l">2620</TD><TD>        }</TD></TR><TR><TD CLASS="l">2621</TD><TD> </TD></TR><TR><TD CLASS="l">2622</TD><TD>        public void setUndoManager(IStructuredTextUndoManager undoManager) {</TD></TR><TR><TD CLASS="l"><A NAME="4c">2623</A></TD><TD> </TD></TR><TR><TD CLASS="l">2624</TD><TD>                // if the undo manager has already been set, then</TD></TR><TR><TD CLASS="l">2625</TD><TD>                // fail fast, since changing the undo manager will lead</TD></TR><TR><TD CLASS="l">2626</TD><TD>                // to unusual results (or at least loss of undo stack).</TD></TR><TR CLASS="z"><TD CLASS="l">2627</TD><TD>                if (fUndoManager != null &amp;&amp; fUndoManager != undoManager) {</TD></TR><TR CLASS="z"><TD CLASS="l">2628</TD><TD>                        throw new IllegalArgumentException(&#34;can not change undo manager once its been set&#34;); //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">2629</TD><TD>                }</TD></TR><TR><TD CLASS="l">2630</TD><TD>                else {</TD></TR><TR CLASS="z"><TD CLASS="l">2631</TD><TD>                        fUndoManager = undoManager;</TD></TR><TR><TD CLASS="l">2632</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">2633</TD><TD>        }</TD></TR><TR><TD CLASS="l">2634</TD><TD> </TD></TR><TR><TD CLASS="l">2635</TD><TD> </TD></TR><TR><TD CLASS="l"><A NAME="4f">2636</A></TD><TD>        /*</TD></TR><TR><TD CLASS="l">2637</TD><TD>         * {@inheritDoc}</TD></TR><TR><TD CLASS="l">2638</TD><TD>         */</TD></TR><TR><TD CLASS="l">2639</TD><TD>        public void startSequentialRewrite(boolean normalized) {</TD></TR><TR CLASS="z"><TD CLASS="l">2640</TD><TD>        }</TD></TR><TR><TD CLASS="l">2641</TD><TD> </TD></TR><TR><TD CLASS="l">2642</TD><TD>        /*</TD></TR><TR><TD CLASS="l">2643</TD><TD>         * (non-Javadoc)</TD></TR><TR><TD CLASS="l"><A NAME="a3">2644</A></TD><TD>         * </TD></TR><TR><TD CLASS="l">2645</TD><TD>         * @see org.eclipse.jface.text.IDocumentExtension#stopPostNotificationProcessing()</TD></TR><TR><TD CLASS="l">2646</TD><TD>         */</TD></TR><TR><TD CLASS="l">2647</TD><TD>        public void stopPostNotificationProcessing() {</TD></TR><TR CLASS="c"><TD CLASS="l">2648</TD><TD>                ++fStoppedCount;</TD></TR><TR CLASS="c"><TD CLASS="l">2649</TD><TD>        }</TD></TR><TR><TD CLASS="l">2650</TD><TD> </TD></TR><TR><TD CLASS="l">2651</TD><TD> </TD></TR><TR><TD CLASS="l"><A NAME="52">2652</A></TD><TD>        /*</TD></TR><TR><TD CLASS="l">2653</TD><TD>         * {@inheritDoc}</TD></TR><TR><TD CLASS="l">2654</TD><TD>         */</TD></TR><TR><TD CLASS="l">2655</TD><TD>        public void stopSequentialRewrite() {</TD></TR><TR CLASS="z"><TD CLASS="l">2656</TD><TD>        }</TD></TR><TR><TD CLASS="l">2657</TD><TD> </TD></TR><TR><TD CLASS="l">2658</TD><TD>        /*</TD></TR><TR><TD CLASS="l">2659</TD><TD>         * (non-Javadoc)</TD></TR><TR><TD CLASS="l"><A NAME="53">2660</A></TD><TD>         * </TD></TR><TR><TD CLASS="l">2661</TD><TD>         * @see java.lang.CharSequence#subSequence(int, int)</TD></TR><TR><TD CLASS="l">2662</TD><TD>         */</TD></TR><TR><TD CLASS="l">2663</TD><TD>        public CharSequence subSequence(int arg0, int arg1) {</TD></TR><TR CLASS="z"><TD CLASS="l">2664</TD><TD>                return get(arg0, arg1);</TD></TR><TR><TD CLASS="l">2665</TD><TD>        }</TD></TR><TR><TD CLASS="l">2666</TD><TD> </TD></TR><TR><TD CLASS="l"><A NAME="65">2667</A></TD><TD>        /**</TD></TR><TR><TD CLASS="l">2668</TD><TD>         * @param result</TD></TR><TR><TD CLASS="l">2669</TD><TD>         */</TD></TR><TR><TD CLASS="l">2670</TD><TD>        private void updateDeletedFields(StructuredDocumentRegionsReplacedEvent event) {</TD></TR><TR CLASS="c"><TD CLASS="l">2671</TD><TD>                IStructuredDocumentRegionList oldRegions = event.getOldStructuredDocumentRegions();</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="56% line coverage (10 out of 18 instructions)">2672</TD><TD TITLE="56% line coverage (10 out of 18 instructions)">                for (int i = 0; i &lt; oldRegions.getLength(); i++) {</TD></TR><TR CLASS="z"><TD CLASS="l">2673</TD><TD>                        IStructuredDocumentRegion structuredDocumentRegion = oldRegions.item(i);</TD></TR><TR CLASS="z"><TD CLASS="l">2674</TD><TD>                        structuredDocumentRegion.setDeleted(true);</TD></TR><TR><TD CLASS="l">2675</TD><TD>                }</TD></TR><TR><TD CLASS="l">2676</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">2677</TD><TD>        }</TD></TR><TR><TD CLASS="l">2678</TD><TD> </TD></TR><TR><TD CLASS="l">2679</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="79">2680</A></TD><TD>         * Called by re-parser. Note: this method may be &#34;public&#34; but should only</TD></TR><TR><TD CLASS="l">2681</TD><TD>         * be called by re-parsers in the right circumstances.</TD></TR><TR><TD CLASS="l">2682</TD><TD>         */</TD></TR><TR><TD CLASS="l">2683</TD><TD>        public void updateDocumentData(int start, int lengthToReplace, String changes) {</TD></TR><TR CLASS="c"><TD CLASS="l">2684</TD><TD>                stopPostNotificationProcessing();</TD></TR><TR CLASS="c"><TD CLASS="l">2685</TD><TD>                getStore().replace(start, lengthToReplace, changes);</TD></TR><TR><TD CLASS="l">2686</TD><TD>                try {</TD></TR><TR CLASS="c"><TD CLASS="l">2687</TD><TD>                        getTracker().replace(start, lengthToReplace, changes);</TD></TR><TR><TD CLASS="l">2688</TD><TD>                }</TD></TR><TR><TD CLASS="l">2689</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">2690</TD><TD>                catch (BadLocationException e) {</TD></TR><TR><TD CLASS="l">2691</TD><TD>                        // should be impossible here, but will log for now</TD></TR><TR CLASS="z"><TD CLASS="l">2692</TD><TD>                        Logger.logException(e);</TD></TR><TR><TD CLASS="l">2693</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">2694</TD><TD>                if (fPositionManager != null) {</TD></TR><TR CLASS="c"><TD CLASS="l">2695</TD><TD>                        fPositionManager.updatePositions(new DocumentEvent(this, start, lengthToReplace, changes));</TD></TR><TR><TD CLASS="l">2696</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">2697</TD><TD>                fModificationStamp++;</TD></TR><TR CLASS="c"><TD CLASS="l">2698</TD><TD>                fNextModificationStamp= Math.max(fModificationStamp, fNextModificationStamp);</TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="a4">2699</A></TD><TD>                resumePostNotificationProcessing();</TD></TR><TR CLASS="c"><TD CLASS="l">2700</TD><TD>        }</TD></TR><TR><TD CLASS="l">2701</TD><TD> </TD></TR><TR><TD CLASS="l">2702</TD><TD>        private StructuredDocumentEvent updateModel(Object requester, int start, int lengthToReplace, String changes) {</TD></TR><TR CLASS="c"><TD CLASS="l">2703</TD><TD>                StructuredDocumentEvent result = null;</TD></TR><TR CLASS="c"><TD CLASS="l">2704</TD><TD>                IStructuredTextReParser reParser = getReParser();</TD></TR><TR><TD CLASS="l">2705</TD><TD>                // initialize the IStructuredTextReParser with the standard data</TD></TR><TR><TD CLASS="l">2706</TD><TD>                // that's</TD></TR><TR><TD CLASS="l">2707</TD><TD>                // always needed</TD></TR><TR CLASS="c"><TD CLASS="l">2708</TD><TD>                reParser.initialize(requester, start, lengthToReplace, changes);</TD></TR><TR CLASS="c"><TD CLASS="l">2709</TD><TD>                result = reParser.reparse();</TD></TR><TR><TD CLASS="l">2710</TD><TD>                // if result is null at this point, then there must be an error, since</TD></TR><TR><TD CLASS="l">2711</TD><TD>                // even if there</TD></TR><TR><TD CLASS="l">2712</TD><TD>                // was no change (either disallow due to readonly, or a person pasted</TD></TR><TR><TD CLASS="l">2713</TD><TD>                // the same thing</TD></TR><TR><TD CLASS="l">2714</TD><TD>                // they had selected) then a &#34;NoChange&#34; event should have been fired.</TD></TR><TR CLASS="c"><TD CLASS="l">2715</TD><TD>                Assert.isNotNull(result, &#34;no structuredDocument event was created in IStructuredDocument::updateStructuredDocument&#34;); //$NON-NLS-1$</TD></TR><TR CLASS="c"><TD CLASS="l">2716</TD><TD>                return result;</TD></TR><TR><TD CLASS="l">2717</TD><TD>        }</TD></TR><TR><TD CLASS="l">2718</TD><TD> </TD></TR><TR><TD CLASS="l">2719</TD><TD>        /*</TD></TR><TR><TD CLASS="l">2720</TD><TD>         * (non-Javadoc)</TD></TR><TR><TD CLASS="l"><A NAME="2a">2721</A></TD><TD>         * </TD></TR><TR><TD CLASS="l">2722</TD><TD>         * @see org.eclipse.wst.sse.core.internal.provisional.document.IEncodedDocument#getPreferredLineDelimiter()</TD></TR><TR><TD CLASS="l">2723</TD><TD>         */</TD></TR><TR><TD CLASS="l">2724</TD><TD>        public String getPreferredLineDelimiter() {</TD></TR><TR CLASS="z"><TD CLASS="l">2725</TD><TD>                return getDefaultLineDelimiter();</TD></TR><TR><TD CLASS="l">2726</TD><TD>        }</TD></TR><TR><TD CLASS="l">2727</TD><TD> </TD></TR><TR><TD CLASS="l">2728</TD><TD>        /*</TD></TR><TR><TD CLASS="l">2729</TD><TD>         * (non-Javadoc)</TD></TR><TR><TD CLASS="l"><A NAME="49">2730</A></TD><TD>         * </TD></TR><TR><TD CLASS="l">2731</TD><TD>         * @see org.eclipse.wst.sse.core.internal.provisional.document.IEncodedDocument#setPreferredLineDelimiter(java.lang.String)</TD></TR><TR><TD CLASS="l">2732</TD><TD>         */</TD></TR><TR><TD CLASS="l">2733</TD><TD>        public void setPreferredLineDelimiter(String probableLineDelimiter) {</TD></TR><TR CLASS="z"><TD CLASS="l">2734</TD><TD>                setInitialLineDelimiter(probableLineDelimiter);</TD></TR><TR><TD CLASS="l">2735</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">2736</TD><TD>        }</TD></TR><TR><TD CLASS="l">2737</TD><TD> </TD></TR><TR><TD CLASS="l">2738</TD><TD> </TD></TR><TR><TD CLASS="l">2739</TD><TD>        /**</TD></TR><TR><TD CLASS="l">2740</TD><TD>         * Class which implements the rewritable session for the SSE.</TD></TR><TR><TD CLASS="l">2741</TD><TD>         * </TD></TR><TR><TD CLASS="l">2742</TD><TD>         */</TD></TR><TR><TD CLASS="l">2743</TD><TD>        class StructuredDocumentRewriteSession extends DocumentRewriteSession {</TD></TR><TR><TD CLASS="l">2744</TD><TD> </TD></TR><TR><TD CLASS="l">2745</TD><TD>                /**</TD></TR><TR><TD CLASS="l">2746</TD><TD>                 * Creates a new session.</TD></TR><TR><TD CLASS="l">2747</TD><TD>                 * </TD></TR><TR><TD CLASS="l"><A NAME="2">2748</A></TD><TD>                 * @param sessionType</TD></TR><TR><TD CLASS="l">2749</TD><TD>                 *            the type of this session</TD></TR><TR><TD CLASS="l">2750</TD><TD>                 */</TD></TR><TR><TD CLASS="l">2751</TD><TD>                protected StructuredDocumentRewriteSession(DocumentRewriteSessionType sessionType) {</TD></TR><TR CLASS="z"><TD CLASS="l">2752</TD><TD>                        super(sessionType);</TD></TR><TR CLASS="z"><TD CLASS="l">2753</TD><TD>                }</TD></TR><TR><TD CLASS="l">2754</TD><TD>        }</TD></TR><TR><TD CLASS="l">2755</TD><TD> </TD></TR><TR><TD CLASS="l">2756</TD><TD>        /*</TD></TR><TR><TD CLASS="l">2757</TD><TD>         * (non-Javadoc)</TD></TR><TR><TD CLASS="l">2758</TD><TD>         * </TD></TR><TR><TD CLASS="l"><A NAME="4d">2759</A></TD><TD>         * @see org.eclipse.jface.text.IDocumentExtension4#startRewriteSession(org.eclipse.jface.text.DocumentRewriteSessionType)</TD></TR><TR><TD CLASS="l">2760</TD><TD>         */</TD></TR><TR><TD CLASS="l">2761</TD><TD>        public DocumentRewriteSession startRewriteSession(DocumentRewriteSessionType sessionType) throws IllegalStateException {</TD></TR><TR><TD CLASS="l">2762</TD><TD>                // delegate to sub-class, so UI threading is handled correctly</TD></TR><TR CLASS="z"><TD CLASS="l">2763</TD><TD>                return internalStartRewriteSession(sessionType);</TD></TR><TR><TD CLASS="l">2764</TD><TD>        }</TD></TR><TR><TD CLASS="l">2765</TD><TD> </TD></TR><TR><TD CLASS="l">2766</TD><TD>        /**</TD></TR><TR><TD CLASS="l">2767</TD><TD>         * NOT-API. Final protected so clients may call this method if needed, but</TD></TR><TR><TD CLASS="l">2768</TD><TD>         * cannot override.</TD></TR><TR><TD CLASS="l">2769</TD><TD>         * </TD></TR><TR><TD CLASS="l">2770</TD><TD>         * @param sessionType</TD></TR><TR><TD CLASS="l"><A NAME="2f">2771</A></TD><TD>         * @return</TD></TR><TR><TD CLASS="l">2772</TD><TD>         * @throws IllegalStateException</TD></TR><TR><TD CLASS="l">2773</TD><TD>         */</TD></TR><TR><TD CLASS="l">2774</TD><TD>        final protected DocumentRewriteSession internalStartRewriteSession(DocumentRewriteSessionType sessionType) throws IllegalStateException {</TD></TR><TR CLASS="z"><TD CLASS="l">2775</TD><TD>                if (getActiveRewriteSession() != null)</TD></TR><TR CLASS="z"><TD CLASS="l">2776</TD><TD>                        throw new IllegalStateException(&#34;already in a rewrite session&#34;);</TD></TR><TR><TD CLASS="l">2777</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">2778</TD><TD>                DocumentRewriteSession session = new StructuredDocumentRewriteSession(sessionType);</TD></TR><TR CLASS="z"><TD CLASS="l">2779</TD><TD>                DocumentRewriteSessionEvent event = new DocumentRewriteSessionEvent(this, session, DocumentRewriteSessionEvent.SESSION_START);</TD></TR><TR CLASS="z"><TD CLASS="l">2780</TD><TD>                fireDocumentRewriteSessionEvent(event);</TD></TR><TR><TD CLASS="l">2781</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">2782</TD><TD>                ILineTracker tracker = getTracker();</TD></TR><TR CLASS="z"><TD CLASS="l">2783</TD><TD>                if (tracker instanceof ILineTrackerExtension) {</TD></TR><TR CLASS="z"><TD CLASS="l">2784</TD><TD>                        ILineTrackerExtension extension = (ILineTrackerExtension) tracker;</TD></TR><TR CLASS="z"><TD CLASS="l">2785</TD><TD>                        extension.startRewriteSession(session);</TD></TR><TR><TD CLASS="l">2786</TD><TD>                }</TD></TR><TR><TD CLASS="l">2787</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">2788</TD><TD>                startRewriteSessionOnPartitioners(session);</TD></TR><TR><TD CLASS="l">2789</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">2790</TD><TD>                if (DocumentRewriteSessionType.SEQUENTIAL == sessionType)</TD></TR><TR CLASS="z"><TD CLASS="l">2791</TD><TD>                        startSequentialRewrite(false);</TD></TR><TR CLASS="z"><TD CLASS="l">2792</TD><TD>                else if (DocumentRewriteSessionType.STRICTLY_SEQUENTIAL == sessionType)</TD></TR><TR CLASS="z"><TD CLASS="l">2793</TD><TD>                        startSequentialRewrite(true);</TD></TR><TR><TD CLASS="l">2794</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">2795</TD><TD>                fActiveRewriteSession = session;</TD></TR><TR CLASS="z"><TD CLASS="l">2796</TD><TD>                return session;</TD></TR><TR><TD CLASS="l">2797</TD><TD>        }</TD></TR><TR><TD CLASS="l">2798</TD><TD> </TD></TR><TR><TD CLASS="l">2799</TD><TD>        /**</TD></TR><TR><TD CLASS="l">2800</TD><TD>         * Starts the given rewrite session.</TD></TR><TR><TD CLASS="l">2801</TD><TD>         *</TD></TR><TR><TD CLASS="l"><A NAME="4e">2802</A></TD><TD>         * @param session the rewrite session</TD></TR><TR><TD CLASS="l">2803</TD><TD>         * @since 2.0</TD></TR><TR><TD CLASS="l">2804</TD><TD>         */</TD></TR><TR><TD CLASS="l">2805</TD><TD>        final void startRewriteSessionOnPartitioners(DocumentRewriteSession session) {</TD></TR><TR CLASS="z"><TD CLASS="l">2806</TD><TD>                if (fDocumentPartitioners != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">2807</TD><TD>                        Iterator e= fDocumentPartitioners.values().iterator();</TD></TR><TR CLASS="z"><TD CLASS="l">2808</TD><TD>                        while (e.hasNext()) {</TD></TR><TR CLASS="z"><TD CLASS="l">2809</TD><TD>                                Object partitioner= e.next();</TD></TR><TR CLASS="z"><TD CLASS="l">2810</TD><TD>                                if (partitioner instanceof IDocumentPartitionerExtension3) {</TD></TR><TR CLASS="z"><TD CLASS="l">2811</TD><TD>                                        IDocumentPartitionerExtension3 extension= (IDocumentPartitionerExtension3) partitioner;</TD></TR><TR CLASS="z"><TD CLASS="l">2812</TD><TD>                                        extension.startRewriteSession(session);</TD></TR><TR><TD CLASS="l">2813</TD><TD>                                }</TD></TR><TR><TD CLASS="l">2814</TD><TD>                        }</TD></TR><TR><TD CLASS="l">2815</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">2816</TD><TD>        }</TD></TR><TR><TD CLASS="l"><A NAME="50">2817</A></TD><TD> </TD></TR><TR><TD CLASS="l">2818</TD><TD> </TD></TR><TR><TD CLASS="l">2819</TD><TD>        public void stopRewriteSession(DocumentRewriteSession session) {</TD></TR><TR><TD CLASS="l">2820</TD><TD>                // delegate to sub-class, so UI threading is handled correctly</TD></TR><TR CLASS="z"><TD CLASS="l">2821</TD><TD>                internalStopRewriteSession(session);</TD></TR><TR CLASS="z"><TD CLASS="l">2822</TD><TD>        }</TD></TR><TR><TD CLASS="l">2823</TD><TD> </TD></TR><TR><TD CLASS="l">2824</TD><TD>        /**</TD></TR><TR><TD CLASS="l">2825</TD><TD>         * NOT-API. Final protected so clients may call this method if needed, but</TD></TR><TR><TD CLASS="l">2826</TD><TD>         * cannot override.</TD></TR><TR><TD CLASS="l"><A NAME="30">2827</A></TD><TD>         * </TD></TR><TR><TD CLASS="l">2828</TD><TD>         * @param session</TD></TR><TR><TD CLASS="l">2829</TD><TD>         */</TD></TR><TR><TD CLASS="l">2830</TD><TD>        final protected void internalStopRewriteSession(DocumentRewriteSession session) {</TD></TR><TR CLASS="z"><TD CLASS="l">2831</TD><TD>                if (fActiveRewriteSession == session) {</TD></TR><TR CLASS="z"><TD CLASS="l">2832</TD><TD>                        DocumentRewriteSessionType sessionType = session.getSessionType();</TD></TR><TR CLASS="z"><TD CLASS="l">2833</TD><TD>                        if (DocumentRewriteSessionType.SEQUENTIAL == sessionType || DocumentRewriteSessionType.STRICTLY_SEQUENTIAL == sessionType)</TD></TR><TR CLASS="z"><TD CLASS="l">2834</TD><TD>                                stopSequentialRewrite();</TD></TR><TR><TD CLASS="l">2835</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">2836</TD><TD>                        stopRewriteSessionOnPartitioners(session);</TD></TR><TR><TD CLASS="l">2837</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">2838</TD><TD>                        ILineTracker tracker = getTracker();</TD></TR><TR CLASS="z"><TD CLASS="l">2839</TD><TD>                        if (tracker instanceof ILineTrackerExtension) {</TD></TR><TR CLASS="z"><TD CLASS="l">2840</TD><TD>                                ILineTrackerExtension extension = (ILineTrackerExtension) tracker;</TD></TR><TR CLASS="z"><TD CLASS="l">2841</TD><TD>                                extension.stopRewriteSession(session, get());</TD></TR><TR><TD CLASS="l">2842</TD><TD>                        }</TD></TR><TR><TD CLASS="l">2843</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">2844</TD><TD>                        DocumentRewriteSessionEvent event = new DocumentRewriteSessionEvent(this, session, DocumentRewriteSessionEvent.SESSION_STOP);</TD></TR><TR CLASS="z"><TD CLASS="l">2845</TD><TD>                        fireDocumentRewriteSessionEvent(event);</TD></TR><TR CLASS="z"><TD CLASS="l">2846</TD><TD>                        fActiveRewriteSession = null;</TD></TR><TR><TD CLASS="l">2847</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">2848</TD><TD>        }</TD></TR><TR><TD CLASS="l">2849</TD><TD> </TD></TR><TR><TD CLASS="l">2850</TD><TD>        /**</TD></TR><TR><TD CLASS="l">2851</TD><TD>         * Stops the given rewrite session.</TD></TR><TR><TD CLASS="l">2852</TD><TD>         *</TD></TR><TR><TD CLASS="l"><A NAME="51">2853</A></TD><TD>         * @param session the rewrite session</TD></TR><TR><TD CLASS="l">2854</TD><TD>         * @since 2.0</TD></TR><TR><TD CLASS="l">2855</TD><TD>         */</TD></TR><TR><TD CLASS="l">2856</TD><TD>        final void stopRewriteSessionOnPartitioners(DocumentRewriteSession session) {</TD></TR><TR CLASS="z"><TD CLASS="l">2857</TD><TD>                if (fDocumentPartitioners != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">2858</TD><TD>                        DocumentPartitioningChangedEvent event= new DocumentPartitioningChangedEvent(this);</TD></TR><TR CLASS="z"><TD CLASS="l">2859</TD><TD>                        Iterator e= fDocumentPartitioners.keySet().iterator();</TD></TR><TR CLASS="z"><TD CLASS="l">2860</TD><TD>                        while (e.hasNext()) {</TD></TR><TR CLASS="z"><TD CLASS="l">2861</TD><TD>                                String partitioning= (String) e.next();</TD></TR><TR CLASS="z"><TD CLASS="l">2862</TD><TD>                                IDocumentPartitioner partitioner= (IDocumentPartitioner) fDocumentPartitioners.get(partitioning);</TD></TR><TR CLASS="z"><TD CLASS="l">2863</TD><TD>                                if (partitioner instanceof IDocumentPartitionerExtension3) {</TD></TR><TR CLASS="z"><TD CLASS="l">2864</TD><TD>                                        IDocumentPartitionerExtension3 extension= (IDocumentPartitionerExtension3) partitioner;</TD></TR><TR CLASS="z"><TD CLASS="l">2865</TD><TD>                                        extension.stopRewriteSession(session);</TD></TR><TR CLASS="z"><TD CLASS="l">2866</TD><TD>                                        event.setPartitionChange(partitioning, 0, getLength());</TD></TR><TR><TD CLASS="l">2867</TD><TD>                                }</TD></TR><TR><TD CLASS="l">2868</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">2869</TD><TD>                        if (!event.isEmpty())</TD></TR><TR CLASS="z"><TD CLASS="l">2870</TD><TD>                                fireDocumentPartitioningChanged(event);</TD></TR><TR><TD CLASS="l">2871</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">2872</TD><TD>        }</TD></TR><TR><TD CLASS="l">2873</TD><TD> </TD></TR><TR><TD CLASS="l">2874</TD><TD>        /*</TD></TR><TR><TD CLASS="l">2875</TD><TD>         * (non-Javadoc)</TD></TR><TR><TD CLASS="l"><A NAME="18">2876</A></TD><TD>         * </TD></TR><TR><TD CLASS="l">2877</TD><TD>         * @see org.eclipse.jface.text.IDocumentExtension4#getActiveRewriteSession()</TD></TR><TR><TD CLASS="l">2878</TD><TD>         */</TD></TR><TR><TD CLASS="l">2879</TD><TD>        public DocumentRewriteSession getActiveRewriteSession() {</TD></TR><TR CLASS="z"><TD CLASS="l">2880</TD><TD>                return fActiveRewriteSession;</TD></TR><TR><TD CLASS="l">2881</TD><TD>        }</TD></TR><TR><TD CLASS="l">2882</TD><TD> </TD></TR><TR><TD CLASS="l">2883</TD><TD>        /*</TD></TR><TR><TD CLASS="l">2884</TD><TD>         * (non-Javadoc)</TD></TR><TR><TD CLASS="l"><A NAME="78">2885</A></TD><TD>         * </TD></TR><TR><TD CLASS="l">2886</TD><TD>         * @see org.eclipse.jface.text.IDocumentExtension4#addDocumentRewriteSessionListener(org.eclipse.jface.text.IDocumentRewriteSessionListener)</TD></TR><TR><TD CLASS="l">2887</TD><TD>         */</TD></TR><TR><TD CLASS="l">2888</TD><TD>        public void addDocumentRewriteSessionListener(IDocumentRewriteSessionListener listener) {</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="81% line coverage (13 out of 16 instructions)">2889</TD><TD TITLE="81% line coverage (13 out of 16 instructions)">                synchronized (listenerLock) {</TD></TR><TR CLASS="c"><TD CLASS="l">2890</TD><TD>                        Assert.isNotNull(listener);</TD></TR><TR CLASS="c"><TD CLASS="l">2891</TD><TD>                        if (fDocumentRewriteSessionListeners == null) {</TD></TR><TR CLASS="c"><TD CLASS="l">2892</TD><TD>                                fDocumentRewriteSessionListeners = new ArrayList(1);</TD></TR><TR><TD CLASS="l">2893</TD><TD>                        }</TD></TR><TR CLASS="c"><TD CLASS="l">2894</TD><TD>                        if (!fDocumentRewriteSessionListeners.contains(listener))</TD></TR><TR CLASS="c"><TD CLASS="l">2895</TD><TD>                                fDocumentRewriteSessionListeners.add(listener);</TD></TR><TR><TD CLASS="l">2896</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">2897</TD><TD>        }</TD></TR><TR><TD CLASS="l">2898</TD><TD> </TD></TR><TR><TD CLASS="l">2899</TD><TD>        /*</TD></TR><TR><TD CLASS="l">2900</TD><TD>         * (non-Javadoc)</TD></TR><TR><TD CLASS="l"><A NAME="74">2901</A></TD><TD>         * </TD></TR><TR><TD CLASS="l">2902</TD><TD>         * @see org.eclipse.jface.text.IDocumentExtension4#removeDocumentRewriteSessionListener(org.eclipse.jface.text.IDocumentRewriteSessionListener)</TD></TR><TR><TD CLASS="l">2903</TD><TD>         */</TD></TR><TR><TD CLASS="l">2904</TD><TD>        public void removeDocumentRewriteSessionListener(IDocumentRewriteSessionListener listener) {</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="81% line coverage (13 out of 16 instructions)">2905</TD><TD TITLE="81% line coverage (13 out of 16 instructions)">                synchronized (listenerLock) {</TD></TR><TR><TD CLASS="l">2906</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">2907</TD><TD>                        Assert.isNotNull(listener);</TD></TR><TR CLASS="c"><TD CLASS="l">2908</TD><TD>                        if (fDocumentRewriteSessionListeners != null)</TD></TR><TR CLASS="c"><TD CLASS="l">2909</TD><TD>                                fDocumentRewriteSessionListeners.remove(listener);</TD></TR><TR><TD CLASS="l">2910</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">2911</TD><TD>        }</TD></TR><TR><TD CLASS="l">2912</TD><TD> </TD></TR><TR><TD CLASS="l">2913</TD><TD>        /*</TD></TR><TR><TD CLASS="l">2914</TD><TD>         * (non-Javadoc)</TD></TR><TR><TD CLASS="l">2915</TD><TD>         * </TD></TR><TR><TD CLASS="l"><A NAME="3d">2916</A></TD><TD>         * @see org.eclipse.jface.text.IDocumentExtension4#replace(int, int,</TD></TR><TR><TD CLASS="l">2917</TD><TD>         *      java.lang.String, long)</TD></TR><TR><TD CLASS="l">2918</TD><TD>         */</TD></TR><TR><TD CLASS="l">2919</TD><TD>        public void replace(int offset, int length, String text, long modificationStamp) throws BadLocationException {</TD></TR><TR CLASS="z"><TD CLASS="l">2920</TD><TD>                replaceText(this, offset, length, text, modificationStamp, true);</TD></TR><TR CLASS="z"><TD CLASS="l">2921</TD><TD>        }</TD></TR><TR><TD CLASS="l">2922</TD><TD> </TD></TR><TR><TD CLASS="l">2923</TD><TD>        /*</TD></TR><TR><TD CLASS="l">2924</TD><TD>         * (non-Javadoc)</TD></TR><TR><TD CLASS="l">2925</TD><TD>         * </TD></TR><TR><TD CLASS="l">2926</TD><TD>         * @see org.eclipse.jface.text.IDocumentExtension4#set(java.lang.String,</TD></TR><TR><TD CLASS="l"><A NAME="9d">2927</A></TD><TD>         *      long)</TD></TR><TR><TD CLASS="l">2928</TD><TD>         */</TD></TR><TR><TD CLASS="l">2929</TD><TD>        public void set(String text, long modificationStamp) {</TD></TR><TR><TD CLASS="l">2930</TD><TD>                // bug 151069 - overwrite read only regions when setting entire document</TD></TR><TR CLASS="c"><TD CLASS="l">2931</TD><TD>                 replaceText(null, 0, getLength(), text, modificationStamp, true);</TD></TR><TR CLASS="c"><TD CLASS="l">2932</TD><TD>        }</TD></TR><TR><TD CLASS="l">2933</TD><TD> </TD></TR><TR><TD CLASS="l">2934</TD><TD>        /*</TD></TR><TR><TD CLASS="l">2935</TD><TD>         * (non-Javadoc)</TD></TR><TR><TD CLASS="l"><A NAME="8d">2936</A></TD><TD>         * </TD></TR><TR><TD CLASS="l">2937</TD><TD>         * @see org.eclipse.jface.text.IDocumentExtension4#getModificationStamp()</TD></TR><TR><TD CLASS="l">2938</TD><TD>         */</TD></TR><TR><TD CLASS="l">2939</TD><TD>        public long getModificationStamp() {</TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="24">2940</A></TD><TD>                return fModificationStamp;</TD></TR><TR><TD CLASS="l">2941</TD><TD>        }</TD></TR><TR><TD CLASS="l">2942</TD><TD>        </TD></TR><TR><TD CLASS="l">2943</TD><TD>        private long getNextModificationStamp() {</TD></TR><TR CLASS="z"><TD CLASS="l">2944</TD><TD>                if (fNextModificationStamp == Long.MAX_VALUE || fNextModificationStamp == IDocumentExtension4.UNKNOWN_MODIFICATION_STAMP)</TD></TR><TR CLASS="z"><TD CLASS="l">2945</TD><TD>                        fNextModificationStamp= 0;</TD></TR><TR><TD CLASS="l">2946</TD><TD>                else</TD></TR><TR CLASS="z"><TD CLASS="l">2947</TD><TD>                        fNextModificationStamp= fNextModificationStamp + 1;</TD></TR><TR><TD CLASS="l">2948</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">2949</TD><TD>                return fNextModificationStamp;</TD></TR><TR><TD CLASS="l">2950</TD><TD>        }</TD></TR><TR><TD CLASS="l">2951</TD><TD> </TD></TR><TR><TD CLASS="l">2952</TD><TD>        /**</TD></TR><TR><TD CLASS="l">2953</TD><TD>         * Fires an event, as specified, to the associated listeners.</TD></TR><TR><TD CLASS="l">2954</TD><TD>         * </TD></TR><TR><TD CLASS="l"><A NAME="12">2955</A></TD><TD>         * @param event</TD></TR><TR><TD CLASS="l">2956</TD><TD>         *            The event to fire, either a start or stop event.</TD></TR><TR><TD CLASS="l">2957</TD><TD>         */</TD></TR><TR><TD CLASS="l">2958</TD><TD>        private void fireDocumentRewriteSessionEvent(DocumentRewriteSessionEvent event) {</TD></TR><TR CLASS="z"><TD CLASS="l">2959</TD><TD>                if (fDocumentRewriteSessionListeners == null || fDocumentRewriteSessionListeners.size() == 0)</TD></TR><TR CLASS="z"><TD CLASS="l">2960</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">2961</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">2962</TD><TD>                List list = new ArrayList(fDocumentRewriteSessionListeners);</TD></TR><TR CLASS="z"><TD CLASS="l">2963</TD><TD>                Iterator e = list.iterator();</TD></TR><TR CLASS="z"><TD CLASS="l">2964</TD><TD>                while (e.hasNext()) {</TD></TR><TR CLASS="z"><TD CLASS="l">2965</TD><TD>                        IDocumentRewriteSessionListener l = (IDocumentRewriteSessionListener) e.next();</TD></TR><TR CLASS="z"><TD CLASS="l">2966</TD><TD>                        l.documentRewriteSessionChanged(event);</TD></TR><TR><TD CLASS="l">2967</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">2968</TD><TD>        }</TD></TR><TR><TD CLASS="l">2969</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="98.html">org.eclipse.wst.sse.core.internal.text</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>