<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"><static initializer></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 "gaurd" 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 "free"</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() > 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("cachedRegionPositionArray cleared at size " + 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 "aboutToChange" and</TD></TR><TR><TD CLASS="l">214</TD><TD> * "changed" 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, ""); //$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 = "_READ_ONLY_REGIONS_CATEGORY_"; //$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, "Program Error: IStructuredDocument can not be created with null parser"); //$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 < 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("\n\t\t\t\t IStructuredDocument::fireStructuredDocumentEvent. Time was " + (stopTime - startTime) + " msecs to fire NewModelEvent to instance of " + 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 < 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 "suddenly" 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 "setText" 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 "cancel" 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 "aboutToChange" 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("\n\t\t\t\t IStructuredDocument::fireStructuredDocumentEvent. Time was " + (stopTime - startTime) + " msecs to fire NewModelEvent to instance of " + 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 < 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("\n\t\t\t\t IStructuredDocument::fireStructuredDocumentEvent. Time was " + (stopTime - startTime) + " msecs to fire NewModelEvent to instance of " + 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 < 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("\n\t\t\t\t IStructuredDocument::fireStructuredDocumentEvent. Time was " + (stopTime - startTime) + " msecs to fire NewModelEvent to instance of " + 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 < 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("\n\t\t\t\t IStructuredDocument::fireStructuredDocumentEvent. Time was " + (stopTime - startTime) + " msecs to fire NewModelEvent to instance of " + 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 < 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("\n\t\t\t\t IStructuredDocument::fireStructuredDocumentEvent. Time was " + (stopTime - startTime) + " msecs to fire NewModelEvent to instance of " + 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 < 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("\n\t\t\t\t IStructuredDocument::fireStructuredDocumentEvent. Time was " + (stopTime - startTime) + " msecs to fire NewModelEvent to instance of " + 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 "pure" 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 "pure" 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("IStructuredDocument::addModelChangedListener. Request to add an instance of " + listener.getClass() + " as a listener on structuredDocument."); //$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("IStructuredDocument::addModelChangedListener. listener " + listener + " was addeded more than once. "); //$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("IStructuredDocument::addModelChangedListener. Adding an instance of " + listener.getClass() + " as a listener on structuredDocument."); //$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("IStructuredDocument::addStructuredDocumentListener. Request to add an instance of " + listener.getClass() + " as a listener on structuredDocument."); //$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("IStructuredDocument::addStructuredDocumentListener. listener " + listener + " was addeded more than once. "); //$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("IStructuredDocument::addStructuredDocumentListener. Adding an instance of " + listener.getClass() + " as a listener on structuredDocument."); //$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 <code>addDocumentListener</code> 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> * <code>addDocumentListener</code> 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> * <p></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 <code>IDocumentAdapter</code> and only if those</TD></TR><TR><TD CLASS="l">898</TD><TD> * implementers need to implement <code>IDocumentListener</code>.</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("program error: should never occur", 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 < 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 "about to change" or "changed" 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 < 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 <code>Position</code> 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> * <code>set(text); getNumberOfLines()</code>.</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 > offset) || (0 > length) || (offset + length > 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 < 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 > 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 > 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 > 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 > 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 >= 0) && (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 >= 0) && (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 > offset) || (offset > 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("line.separator"); //$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 > 0);</TD></TR><TR CLASS="z"><TD CLASS="l">1335</TD><TD> for (int i= 0; i < 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, "Dev. Program Info Only: IStructuredDocument::getLineOfOffset: offset out of range, zero assumed. offset = " + 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("IStructuredDocument::getParser. Parser needs to be set before use"); //$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 > offset) || (offset > 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 "region_lock" 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 "towards the front" 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 < 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("Program Error: no region could be found to cache, but cache was non null. Indicates corrupted model or region list"); //$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> * <p></TD></TR><TR><TD CLASS="l">1728</TD><TD> * In the case of 0 length, the <code>IStructuredDocumentRegion</code></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> * </p></TD></TR><TR><TD CLASS="l">1733</TD><TD> * <p></TD></TR><TR><TD CLASS="l">1734</TD><TD> * Otherwise all the regions "inbetween" 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> * </p></TD></TR><TR><TD CLASS="l">1737</TD><TD> * </TD></TR><TR><TD CLASS="l">1738</TD><TD> * <br></TD></TR><TR><TD CLASS="l">1739</TD><TD> * eg.</TD></TR><TR><TD CLASS="l">1740</TD><TD> * <p></TD></TR><TR><TD CLASS="l">1741</TD><TD> * <br></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> * <pre></TD></TR><TR><TD CLASS="l">1745</TD><TD> * &lt;html&gt;[&lt;head&gt;&lt;/head&gt;]&lt;/html&gt; returns &lt;head&gt;,&lt;/head&gt;</TD></TR><TR><TD CLASS="l">1746</TD><TD> * </pre></TD></TR><TR><TD CLASS="l">1747</TD><TD> * <pre></TD></TR><TR><TD CLASS="l">1748</TD><TD> * &lt;ht[ml&gt;&lt;head&gt;&lt;/he]ad&gt;&lt;/html&gt; returns &lt;html&gt;,&lt;head&gt;,&lt;/head&gt;</TD></TR><TR><TD CLASS="l">1749</TD><TD> * </pre></TD></TR><TR><TD CLASS="l">1750</TD><TD> * </TD></TR><TR><TD CLASS="l">1751</TD><TD> * <pre></TD></TR><TR><TD CLASS="l">1752</TD><TD> * &lt;html&gt;[&lt;head&gt;&lt;/head&gt;]&lt;/html&gt; returns &lt;head&gt;,&lt;/head&gt;</TD></TR><TR><TD CLASS="l">1753</TD><TD> * </pre></TD></TR><TR><TD CLASS="l">1754</TD><TD> * <pre></TD></TR><TR><TD CLASS="l">1755</TD><TD> * &lt;ht[ml&gt;&lt;head&gt;&lt;/he]ad&gt;&lt;/html&gt; returns &lt;html&gt;,&lt;head&gt;,&lt;/head&gt;</TD></TR><TR><TD CLASS="l">1756</TD><TD> * </pre></TD></TR><TR><TD CLASS="l">1757</TD><TD> * </TD></TR><TR><TD CLASS="l"><A NAME="72">1758</A></TD><TD> * </p></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 < 0)</TD></TR><TR CLASS="z"><TD CLASS="l">1763</TD><TD> throw new IllegalArgumentException("can't have negative length"); //$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. <html>[<head></head>]</html></TD></TR><TR><TD CLASS="l">1767</TD><TD> // will return <head>,</head> instead of <head>,</head>,</html></TD></TR><TR CLASS="c"><TD CLASS="l">1768</TD><TD> if (length > 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 && 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 > offset) || (0 > length) || (offset + length > 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 = ""; //$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() + "::replaceText(" + start + "," + replacementLength + "," + changes + ")"); //$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 && (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("\n\t\t\t\t Time for IStructuredDocument raw replaceText: " + (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("event type returned by replaceTextWithNoDebuggingThread: " + 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 && !(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, "Program Error: invalid structured document event"); //$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, "Program Error: unexpected structured document event: " + 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("\n\t\t\t\t Total Time for IStructuredDocument event signaling/processing in replaceText: " + (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 <= 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 "read only" change ... must</TD></TR><TR><TD CLASS="l">2031</TD><TD> // be followed by "no change" 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(("could not create readonly region at " + startOffset + " to " + 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) && (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 < 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) && (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 < 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) && (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 < 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) && (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 < 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 <code>Position</code> 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> * <p></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 <code>IDocumentAdapter</code> and only if those</TD></TR><TR><TD CLASS="l">2294</TD><TD> * implementers need to implement <code>IDocumentListener</code>.</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 > 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 < 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("Note: IStructuredDocument::replace(int, int, String) .... its better to use replaceText(source, string, int, int) API for structuredDocument updates"); //$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 "newText" starting at position "start" for a</TD></TR><TR><TD CLASS="l">2369</TD><TD> * length of "replaceLength".</TD></TR><TR><TD CLASS="l">2370</TD><TD> * <p></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> * <p></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 "" "\n" 0 1 "\n\n"</TD></TR><TR><TD CLASS="l">2395</TD><TD> * "a" 2 0 "a" "\n\n" 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 && (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 && (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 && 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, "WARNING: using unsupported deprecated method 'search'"); //$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("Note: IStructuredDocument::setText(String) .... its better to use setText(source, string) API for structuredDocument updates"); //$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, "Attempt to set linedelimiter to non-legal delimiter"); //$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("line.separator"), 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 && fUndoManager != undoManager) {</TD></TR><TR CLASS="z"><TD CLASS="l">2628</TD><TD> throw new IllegalArgumentException("can not change undo manager once its been set"); //$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 < 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 "public" 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 "NoChange" event should have been fired.</TD></TR><TR CLASS="c"><TD CLASS="l">2715</TD><TD> Assert.isNotNull(result, "no structuredDocument event was created in IStructuredDocument::updateStructuredDocument"); //$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("already in a rewrite session");</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> |