Adapt to improved SourceContent

Change-Id: Icbf240ce86e4abeb5f3e6f490dd2d9a49c01f5c1
diff --git a/r/org.eclipse.statet.r.core-tests/src/org/eclipse/statet/internal/r/core/sourcemodel/SyntaxProblemReporterTest.java b/r/org.eclipse.statet.r.core-tests/src/org/eclipse/statet/internal/r/core/sourcemodel/SyntaxProblemReporterTest.java
index f7b150d..b197e39 100644
--- a/r/org.eclipse.statet.r.core-tests/src/org/eclipse/statet/internal/r/core/sourcemodel/SyntaxProblemReporterTest.java
+++ b/r/org.eclipse.statet.r.core-tests/src/org/eclipse/statet/internal/r/core/sourcemodel/SyntaxProblemReporterTest.java
@@ -70,7 +70,7 @@
 		final RSourceUnit su= createSourceUnit(source);
 		final SourceContent sourceContent= su.getContent(new NullProgressMonitor());
 		final SourceComponent sourceComponent= this.rParser.scanSourceUnit(
-				new StringParserInput(sourceContent.getText()).init() );
+				new StringParserInput(sourceContent.getString()).init() );
 		final List<Problem> collectedProblems= new ArrayList<>();
 		this.problemReporter.run(su, sourceContent, sourceComponent, new ProblemRequestor() {
 			@Override
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/builder/RBuildReconciler.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/builder/RBuildReconciler.java
index 05d8c09..7c3ac38 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/builder/RBuildReconciler.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/builder/RBuildReconciler.java
@@ -24,8 +24,6 @@
 import org.eclipse.core.runtime.OperationCanceledException;
 import org.eclipse.core.runtime.Status;
 
-import org.eclipse.statet.jcommons.text.core.TextLineInformation;
-
 import org.eclipse.statet.internal.r.core.sourcemodel.RModelManagerImpl;
 import org.eclipse.statet.internal.r.core.sourcemodel.RReconciler;
 import org.eclipse.statet.r.core.RCore;
@@ -97,12 +95,10 @@
 //			problemRequestor.beginReportingSequence();
 			try {
 				final List<RAstNode> comments= ((SourceComponent) data.ast.getRoot()).getComments();
-				this.taskScanner.setup((IResource) su.getResource());
-				final TextLineInformation lines= data.content.getLines();
+				this.taskScanner.setup(data.content, (IResource)su.getResource());
 				for (final RAstNode comment : comments) {
-						final int offset= comment.getStartOffset() + 1;
-						this.taskScanner.checkForTasks(data.content.getText().substring(
-								offset, offset + comment.getLength() - 1 ), offset, lines );
+						this.taskScanner.checkForTasks(
+								comment.getStartOffset() + 1, comment.getEndOffset() );
 				}
 			}
 			catch (final Exception e) {
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/builder/RBuilder.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/builder/RBuilder.java
index 324c137..08cd2e0 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/builder/RBuilder.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/builder/RBuilder.java
@@ -50,6 +50,7 @@
 import org.eclipse.statet.ltk.buildpath.core.BuildpathElement;
 import org.eclipse.statet.ltk.buildpath.core.BuildpathUtils;
 import org.eclipse.statet.ltk.core.Ltk;
+import org.eclipse.statet.ltk.core.SourceContent;
 import org.eclipse.statet.ltk.model.core.LtkModels;
 import org.eclipse.statet.ltk.model.core.SourceUnitManager;
 import org.eclipse.statet.r.core.RBuildpaths;
@@ -453,8 +454,9 @@
 	
 	protected void doParseRd(final IFile file) throws CoreException {
 		try {
-			this.taskMarkerHandler.setup(file);
-			new RdParser(readFile(file), this.taskMarkerHandler).check();
+			final SourceContent sourceContent= new SourceContent(0, readFile(file));
+			this.taskMarkerHandler.setup(sourceContent, file);
+			new RdParser(sourceContent, this.taskMarkerHandler).check();
 		}
 		catch (final CoreException e) {
 			this.statusCollector.add(new Status(IStatus.ERROR, RCore.BUNDLE_ID, 0,
@@ -463,7 +465,7 @@
 		}
 	}
 	
-	protected char[] readFile(final IFile file) throws CoreException {
+	protected String readFile(final IFile file) throws CoreException {
 		String charset= null;
 		InputStream input= null;
 		try {
@@ -478,9 +480,7 @@
 				text.append(readBuffer, 0, n);
 			}
 			
-			final char[] chars= new char[text.length()];
-			text.getChars(0, chars.length, chars, 0);
-			return chars;
+			return text.toString();
 		}
 		catch (final UnsupportedEncodingException e) {
 			throw new CoreException(new Status(
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/builder/RdParser.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/builder/RdParser.java
index 457e167..08c74bd 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/builder/RdParser.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/builder/RdParser.java
@@ -17,109 +17,33 @@
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.jface.text.BadLocationException;
 
-import org.eclipse.statet.jcommons.collections.IntArrayList;
-import org.eclipse.statet.jcommons.collections.IntList;
-import org.eclipse.statet.jcommons.text.core.TextLineInformation;
-import org.eclipse.statet.jcommons.text.core.TextRegion;
-
-import org.eclipse.statet.ecommons.text.core.JFaceTextRegion;
+import org.eclipse.statet.ltk.core.SourceContent;
 
 
 public class RdParser {
 	
-	public class LineInformation implements TextLineInformation {
-		
-		
-		private final IntList offsets;
-		
-		
-		public LineInformation() {
-			this.offsets= new IntArrayList();
-		}
-		
-		public void addLine(final int offset) {
-			this.offsets.add(offset);
-		}
-		
-		@Override
-		public int getNumberOfLines() {
-			return this.offsets.size();
-		}
-		
-		@Override
-		public int getLineOfOffset(final int offset) {
-			if (this.offsets.size() == 0) {
-				return -1;
-			}
-			int low= 0;
-			int high= this.offsets.size() - 1;
-			
-			while (low <= high) {
-				final int mid= (low + high) >> 1;
-				final int lineOffset= this.offsets.getAt(mid);
-				
-				if (lineOffset < offset) {
-					low= mid + 1;
-				}
-				else if (lineOffset > offset) {
-					high= mid - 1;
-				}
-				else {
-					return mid;
-				}
-			}
-			return low - 1;
-		}
-		
-		@Override
-		public int getStartOffset(final int line) {
-			if (line < 0 || line >= this.offsets.size()) {
-				return -1;
-			}
-			return this.offsets.getAt(line);
-		}
-		
-		@Override
-		public int getEndOffset(final int line) {
-			return (line + 1 == this.offsets.size()) ? RdParser.this.content.length : this.offsets.getAt(line + 1);
-		}
-		
-		@Override
-		public int getLength(final int line) {
-			return (line + 1 == this.offsets.size()) ?
-					(RdParser.this.content.length - this.offsets.getAt(line)) :
-					(this.offsets.getAt(line + 1) - this.offsets.getAt(line) );
-		}
-		
-		@Override
-		public TextRegion getRegion(final int line) {
-			return JFaceTextRegion.newByStartEnd(this.offsets.getAt(line),
-					(line + 1 == this.offsets.size()) ?
-							RdParser.this.content.length :
-							this.offsets.getAt(line + 1) );
-		}
-		
-	}
-	
-	
-	private static final char[][] PLATFORM_KEYWORDS= {			// without '#'
-		"ifdef".toCharArray(), "ifndef".toCharArray(), "endif".toCharArray() }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+	private static final char[][] PLATFORM_KEYWORDS= { // without '#'
+		"ifdef".toCharArray(), //$NON-NLS-1$
+		"ifndef".toCharArray(), //$NON-NLS-1$
+		"endif".toCharArray() }; //$NON-NLS-1$
 	
 	private enum Last { NONE, NEWLINE, BACKSLASH }
 	
-	private final RTaskMarkerHandler markers;
+	
+	private final SourceContent sourceContent;
 	private final char[] content;
 	
+	private final RTaskMarkerHandler markers;
+	
 	private int currentOffset= 0;
 	private final int currentLine= 1;
 	private Last lastChar= Last.NONE;
-	private final LineInformation lineStructure;
 	
 	
-	public RdParser(final char[] content, final RTaskMarkerHandler markers) {
-		this.content= content;
+	public RdParser(final SourceContent sourceContent, final RTaskMarkerHandler markers) {
+		this.sourceContent= sourceContent;
+		this.content= sourceContent.getString().toCharArray();
 		this.markers= markers;
-		this.lineStructure= new LineInformation();
 	}
 	
 	public void check() throws CoreException {
@@ -182,7 +106,7 @@
 			}
 		}
 		try {
-			this.markers.checkForTasks(new String(this.content, start, end - start + 1), start, this.lineStructure);
+			this.markers.checkForTasks(start, end);
 		}
 		catch (final BadLocationException e) {
 		}
@@ -197,7 +121,6 @@
 				this.currentOffset++;
 			}
 			
-			this.lineStructure.addLine(this.currentOffset);
 			this.lastChar= Last.NEWLINE;
 			return true;
 		}
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/sourcemodel/RReconciler.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/sourcemodel/RReconciler.java
index fc214d6..1e65300 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/sourcemodel/RReconciler.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/sourcemodel/RReconciler.java
@@ -181,10 +181,10 @@
 			
 			final TextParserInput input;
 			if (data.content.getStartOffset() != 0) {
-				input= new OffsetStringParserInput(data.content.getText(), data.content.getStartOffset());
+				input= new OffsetStringParserInput(data.content.getString(), data.content.getStartOffset());
 			}
 			else {
-				input= this.raInput.reset(data.content.getText());
+				input= this.raInput.reset(data.content.getString());
 			}
 			
 			final RParser rParser= new RParser(AstInfo.LEVEL_MODEL_DEFAULT,
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/sourcemodel/SyntaxProblemReporter.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/sourcemodel/SyntaxProblemReporter.java
index a13d6b8..8355fe1 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/sourcemodel/SyntaxProblemReporter.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/sourcemodel/SyntaxProblemReporter.java
@@ -14,6 +14,8 @@
 
 package org.eclipse.statet.internal.r.core.sourcemodel;
 
+import static org.eclipse.statet.jcommons.lang.ObjectUtils.nonNullLateInit;
+
 import static org.eclipse.statet.ltk.ast.core.AstNode.NA_OFFSET;
 import static org.eclipse.statet.r.core.rsource.RSourceConstants.STATUS123_SYNTAX_NUMBER_EXP_DIGIT_MISSING;
 import static org.eclipse.statet.r.core.rsource.RSourceConstants.STATUS123_SYNTAX_NUMBER_HEX_DIGIT_MISSING;
@@ -133,16 +135,14 @@
 	
 	private final boolean reportSubsequent= false;
 	
-	private SourceUnit sourceUnit;
-	private SourceContent sourceContent;
-	private String currentText;
-	private ProblemRequestor currentRequestor;
+	private SourceUnit sourceUnit= nonNullLateInit();
+	private SourceContent sourceContent= nonNullLateInit();
+	private ProblemRequestor currentRequestor= nonNullLateInit();
 	
 	private final StringBuilder tmpBuilder= new StringBuilder();
 	private final MessageBuilder messageBuilder= new MessageBuilder();
 	private final List<Problem> problemBuffer= new ArrayList<>(BUFFER_SIZE);
 	private final RValueFormatter valueFormatter= new RValueFormatter();
-//	private int maxOffset;
 	
 	
 	public SyntaxProblemReporter() {
@@ -154,9 +154,6 @@
 		try {
 			this.sourceUnit= su;
 			this.sourceContent= content;
-			this.currentText= content.getText();
-//			this.currentDoc= su.getDocument(null);
-//			this.maxOffset= this.currentDoc.getLength();
 			this.currentRequestor= problemRequestor;
 			node.acceptInR(this);
 			if (this.problemBuffer.size() > 0) {
@@ -167,7 +164,6 @@
 		finally {
 			this.problemBuffer.clear();
 			this.sourceUnit= null;
-//			this.currentDoc= null;
 			this.currentRequestor= null;
 		}
 	}
@@ -222,14 +218,16 @@
 		else {
 			if (node.getLength() - offset > START_TEXT_LIMIT) {
 				final StringBuilder sb= getStringBuilder();
-				sb.append(this.sourceContent.getText(),
-						node.getStartOffset() + offset, node.getStartOffset() + offset + START_TEXT_LIMIT);
+				this.sourceContent.appendStringTo(sb,
+						node.getStartOffset() + offset,
+						node.getStartOffset() + offset + START_TEXT_LIMIT );
 				sb.append('…');
 				return sb.toString();
 			}
 			else {
-				return this.sourceContent.getText().substring(
-						node.getStartOffset() + offset, node.getEndOffset() + offset );
+				return this.sourceContent.getString(
+						node.getStartOffset() + offset,
+						node.getEndOffset() );
 			}
 		}
 	}
@@ -238,7 +236,10 @@
 		final String text= node.getText();
 		if (text != null) {
 			if (text.length() > FULL_TEXT_LIMIT) {
-				return text.substring(0, FULL_TEXT_LIMIT) + '…';
+				final StringBuilder sb= getStringBuilder();
+				sb.append(text, 0, FULL_TEXT_LIMIT);
+				sb.append('…');
+				return sb.toString();
 			}
 			else {
 				return text;
@@ -246,11 +247,17 @@
 		}
 		else {
 			if (node.getLength() > FULL_TEXT_LIMIT) {
-				return this.currentText.substring(node.getStartOffset(),
-						node.getStartOffset() + FULL_TEXT_LIMIT ) + '…';
+				final StringBuilder sb= getStringBuilder();
+				this.sourceContent.appendStringTo(sb,
+						node.getStartOffset(),
+						node.getStartOffset() + FULL_TEXT_LIMIT );
+				sb.append('…');
+				return sb.toString();
 			}
 			else {
-				return this.currentText.substring(node.getStartOffset(), node.getEndOffset());
+				return this.sourceContent.getString(
+						node.getStartOffset(),
+						node.getEndOffset() );
 			}
 		}
 	}
@@ -263,8 +270,9 @@
 			return text.substring(begin, begin + detail.getLength());
 		}
 		else {
-			return this.sourceContent.getText().substring(
-					detail.getStartOffset(), detail.getEndOffset() );
+			return this.sourceContent.getString(
+					detail.getStartOffset(),
+					detail.getEndOffset() );
 		}
 	}
 	
@@ -279,8 +287,9 @@
 							null)));
 		
 		case STATUS12_SYNTAX_TOKEN_UNEXPECTED:
-			addProblem(Problem.SEVERITY_ERROR, code,
-					this.messageBuilder.bind(ProblemMessages.Syntax_TokenUnexpected_message, getFullText(node)),
+			addProblem(Problem.SEVERITY_ERROR, code, this.messageBuilder.bind(
+					ProblemMessages.Syntax_TokenUnexpected_message,
+					getFullText(node) ),
 					node.getStartOffset(), node.getEndOffset() );
 			break STATUS;
 			
@@ -301,16 +310,18 @@
 		sb.append(" (").append(node.getStartOffset()).append(", ").append(node.getLength()).append(')'); //$NON-NLS-1$ //$NON-NLS-2$
 		sb.append('\n');
 		if (this.sourceContent != null) {
-			final TextLineInformation lines= this.sourceContent.getLines();
-			final int line= lines.getLineOfOffset(node.getStartOffset());
-			sb.append("  Line ").append((line + 1)).append(" (offset )").append(lines.getStartOffset(line)); //$NON-NLS-1$ //$NON-NLS-2$
+			final TextLineInformation lines= this.sourceContent.getStringLines();
+			final int line= lines.getLineOfOffset(node.getStartOffset() - this.sourceContent.getStartOffset());
+			sb.append("  Line ").append((line + 1)); //$NON-NLS-1$ //$NON-NLS-2$
 			sb.append('\n');
 			
 			final int firstLine= Math.max(0, line - 2);
-			final int lastLine= Math.min(lines.getNumberOfLines() - 1, lines.getLineOfOffset(line) + 2);
-			sb.append("  Source (line ").append((firstLine + 1)).append('-').append((lastLine)).append("): \n"); //$NON-NLS-1$ //$NON-NLS-2$
-			sb.append(this.currentText.substring(lines.getStartOffset(firstLine),
-					lines.getStartOffset(lastLine) ));
+			final int lastLine= Math.min(lines.getNumberOfLines() - 1,
+					lines.getLineOfOffset(node.getEndOffset() - this.sourceContent.getStartOffset()) + 2 );
+			sb.append("  Source (line ").append((firstLine + 1)).append('-').append((lastLine + 1)).append("): \n"); //$NON-NLS-1$ //$NON-NLS-2$
+			sb.append(this.sourceContent.getString(),
+					lines.getStartOffset(firstLine),
+					lines.getEndOffset(lastLine) );
 		}
 		RCorePlugin.log(new Status(IStatus.WARNING, RCore.BUNDLE_ID, sb.toString()));
 	}
diff --git a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/search/RElementSearch.java b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/search/RElementSearch.java
index 192e0b6..a71376a 100644
--- a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/search/RElementSearch.java
+++ b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/search/RElementSearch.java
@@ -96,7 +96,7 @@
 			
 			final RSourceUnitModelInfo modelInfo= (RSourceUnitModelInfo)sourceUnit.getModelInfo(RModel.R_TYPE_ID,
 					RModelManager.MODEL_FILE, progress.newChild(1) );
-			final SourceContent content= sourceUnit.getContent(progress.newChild(1));
+			final SourceContent sourceContent= sourceUnit.getContent(progress.newChild(1));
 			
 			final List<List<? extends RElementAccess>> allFrameAccess= new ArrayList<>();
 			for (final String frameId : this.definitionFrameIds) {
@@ -116,8 +116,7 @@
 				}
 			}
 			
-			final String contentText= content.getText();
-			final TextLineInformation lineInformation= content.getLines();
+			final TextLineInformation lines= sourceContent.getStringLines();
 			final Map<Integer, LineElement<RSourceUnit>> lineElements= new HashMap<>();
 			
 			for (final List<? extends RElementAccess> allAccess : allFrameAccess) {
@@ -127,12 +126,12 @@
 						final TextRegion region= RModelUtils.getNameSourceRegion(access);
 						
 						final Integer lineNumber= Integer.valueOf(
-								lineInformation.getLineOfOffset(region.getStartOffset()) );
+								lines.getLineOfOffset(region.getStartOffset()) );
 						LineElement<RSourceUnit> lineElement= lineElements.get(lineNumber);
 						if (lineElement == null) {
-							final int lineOffset= lineInformation.getStartOffset(lineNumber);
+							final int lineOffset= lines.getStartOffset(lineNumber);
 							lineElement= new LineElement<>(bestUnit, lineNumber, lineOffset,
-									getContent(contentText, lineOffset, lineOffset + lineInformation.getLength(lineNumber)) );
+									getContent(sourceContent, lineOffset, lines.getEndOffset(lineNumber)) );
 							lineElements.put(lineNumber, lineElement);
 						}
 						
@@ -156,13 +155,17 @@
 				access : null;
 	}
 	
-	private String getContent(final String text, final int start, final int end) {
+	private String getContent(final SourceContent sourceContent,
+			final int startOffset, final int endOffset) {
+		final String s= sourceContent.getString();
 		this.sb.setLength(0);
-		for (int idx= start; idx < end; idx++) {
-			final char c= text.charAt(idx);
+		final int end= endOffset - sourceContent.getStartOffset();
+		for (int idx= startOffset - sourceContent.getStartOffset(); idx < end; idx++) {
+			final char c= s.charAt(idx);
 			if (Character.isWhitespace(c) || Character.isISOControl(c)) {
 				this.sb.append(' ');
-			} else {
+			}
+			else {
 				this.sb.append(c);
 			}
 		}
diff --git a/redocs/org.eclipse.statet.redocs.r/src/org/eclipse/statet/redocs/r/core/model/RChunkReconciler.java b/redocs/org.eclipse.statet.redocs.r/src/org/eclipse/statet/redocs/r/core/model/RChunkReconciler.java
index 5b22a2c..9e206b2 100644
--- a/redocs/org.eclipse.statet.redocs.r/src/org/eclipse/statet/redocs/r/core/model/RChunkReconciler.java
+++ b/redocs/org.eclipse.statet.redocs.r/src/org/eclipse/statet/redocs/r/core/model/RChunkReconciler.java
@@ -101,10 +101,14 @@
 	}
 	
 	public void reconcileAst(final TModelContainer adapter,
-			final SourceContent content, final List<? extends EmbeddingAstNode> list,
+			final SourceContent sourceContent, final List<? extends EmbeddingAstNode> list,
 			final IProgressMonitor monitor) {
-		final String source= content.getText();
-		final TextLineInformation lines= content.getLines();
+		if (sourceContent.getStartOffset() != 0) {
+			throw new UnsupportedOperationException();
+		}
+		
+		final String source= sourceContent.getString();
+		final TextLineInformation lines= sourceContent.getStringLines();
 		
 		this.raChunkStartLineMatcher.reset(source);
 		if (this.raChunkRefLineMatcher != null) {
@@ -250,8 +254,8 @@
 							label= labelNode.getText();
 						}
 						else {
-							label= new String(content.getText().substring(
-								labelNode.getStartOffset(), labelNode.getEndOffset() ));
+							label= content.getString(
+									labelNode.getStartOffset(), labelNode.getEndOffset() );
 						}
 						name= RElementName.create(RElementName.MAIN_OTHER, label);
 						nameRegion= labelNode;
diff --git a/redocs/org.eclipse.statet.redocs.wikitext.r.textile/src/org/eclipse/statet/internal/redocs/wikitext/r/textile/core/TextileValidator.java b/redocs/org.eclipse.statet.redocs.wikitext.r.textile/src/org/eclipse/statet/internal/redocs/wikitext/r/textile/core/TextileValidator.java
index b527282..9344807 100644
--- a/redocs/org.eclipse.statet.redocs.wikitext.r.textile/src/org/eclipse/statet/internal/redocs/wikitext/r/textile/core/TextileValidator.java
+++ b/redocs/org.eclipse.statet.redocs.wikitext.r.textile/src/org/eclipse/statet/internal/redocs/wikitext/r/textile/core/TextileValidator.java
@@ -46,18 +46,20 @@
 	
 	
 	@Override
-	public void run(final WikitextSourceUnit su, final SourceContent content,
+	public void run(final WikitextSourceUnit su, final SourceContent sourceContent,
 			final WikidocSourceUnitModelInfo model,
 			final ProblemRequestor requestor, final int level, final IProgressMonitor monitor) {
+		if (sourceContent.getStartOffset() != 0) {
+			throw new UnsupportedOperationException();
+		}
 		
-		final Matcher matcher= BLOCK_START_PATTERN.matcher(content.getText());
+		final Matcher matcher= BLOCK_START_PATTERN.matcher(sourceContent.getString());
 		
-		final TextLineInformation lines= content.getLines();
-		final int numLines= lines.getNumberOfLines();
-		int start= 0;
-		for (int line= 0; line < numLines; line++) {
-			final int end= lines.getEndOffset(line);
-			matcher.region(start, end);
+		final TextLineInformation lines= sourceContent.getStringLines();
+		int startOffset= 0;
+		for (int line= 0; line < lines.getNumberOfLines(); line++) {
+			final int endOffset= lines.getEndOffset(line);
+			matcher.region(startOffset, endOffset);
 			if (matcher.find()) {
 				final String followingCharacter= matcher.group(2);
 				if (followingCharacter == null || !followingCharacter.equals(" ")) { //$NON-NLS-1$
@@ -65,10 +67,10 @@
 					requestor.acceptProblems(new BasicProblem(WikitextModel.WIKIDOC_TYPE_ID,
 							Problem.SEVERITY_WARNING, 0,
 							NLS.bind(Messages.Validation_BlockWhitespace_message, matched),
-							line, start, matcher.end(1) ));
+							line, startOffset, matcher.end(1) ));
 				}
 			}
-			start= end;
+			startOffset= endOffset;
 		}
 	}
 	
diff --git a/redocs/org.eclipse.statet.redocs.wikitext.r/src/org/eclipse/statet/internal/redocs/wikitext/r/ui/processing/YamlFormatDetector.java b/redocs/org.eclipse.statet.redocs.wikitext.r/src/org/eclipse/statet/internal/redocs/wikitext/r/ui/processing/YamlFormatDetector.java
index 9268787..9936765 100644
--- a/redocs/org.eclipse.statet.redocs.wikitext.r/src/org/eclipse/statet/internal/redocs/wikitext/r/ui/processing/YamlFormatDetector.java
+++ b/redocs/org.eclipse.statet.redocs.wikitext.r/src/org/eclipse/statet/internal/redocs/wikitext/r/ui/processing/YamlFormatDetector.java
@@ -23,11 +23,11 @@
 import org.eclipse.core.runtime.Status;
 import org.eclipse.core.runtime.SubMonitor;
 import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.Region;
 import org.eclipse.osgi.util.NLS;
 
+import org.eclipse.statet.jcommons.text.core.BasicTextRegion;
 import org.eclipse.statet.jcommons.text.core.TextLineInformation;
+import org.eclipse.statet.jcommons.text.core.TextRegion;
 
 import org.eclipse.statet.docmlet.base.ui.DocmlBaseUI;
 import org.eclipse.statet.docmlet.base.ui.processing.DocProcessingConfig;
@@ -71,15 +71,14 @@
 		try {
 			final SourceContent content= unit.getContent(m.newChild(1));
 			m.worked(0);
-			final IRegion yamlRegion= getYamlBlockRegion(content);
+			final TextRegion yamlRegion= getYamlBlockRegion(content);
 			m.worked(1);
 			
 			final YamlParser yamlParser= new YamlParser();
 			yamlParser.setScalarText(true);
 			
-			final String code= content.getText().substring(
-					yamlRegion.getOffset(), yamlRegion.getOffset() + yamlRegion.getLength());
-			final SourceComponent block= yamlParser.parse(code, null, yamlRegion.getOffset());
+			final String code= content.getString(yamlRegion);
+			final SourceComponent block= yamlParser.parse(code, null, yamlRegion.getStartOffset());
 			
 			final String format= searchOutputInfo(block, code);
 			final String ext= toExtension(format);
@@ -104,11 +103,11 @@
 	}
 	
 	
-	private IRegion getYamlBlockRegion(final SourceContent content)
+	private TextRegion getYamlBlockRegion(final SourceContent sourceContent)
 			throws BadLocationException, CoreException {
-		final TextLineInformation lines= content.getLines();
+		final TextLineInformation lines= sourceContent.getStringLines();
 		final YamlBlockWeaveParticipant part= new YamlBlockWeaveParticipant();
-		part.reset(content);
+		part.reset(sourceContent);
 		
 		int lineEndOffset= lines.getStartOffset(0);
 		final int numLines= lines.getNumberOfLines();
@@ -120,13 +119,15 @@
 					lineOffset= lineEndOffset;
 					lineEndOffset= lines.getEndOffset(line);
 					if (part.checkEndLine(lineOffset, lineEndOffset)) {
-						return new Region(part.getStartOffset(), lineEndOffset);
+						return new BasicTextRegion(
+								sourceContent.getStartOffset() + part.getStartOffset(),
+								sourceContent.getStartOffset() + lineEndOffset );
 					}
 				}
 			}
 		}
 		throw new CoreException(new Status(IStatus.ERROR, WikitextRweaveCore.BUNDLE_ID,
-				"No YAML metadata block found."));
+				"No YAML metadata block found." ));
 	}
 	
 	
diff --git a/rhelp/org.eclipse.statet.rhelp.core/src/org/eclipse/statet/rhelp/core/update/REnvIndexUpdater.java b/rhelp/org.eclipse.statet.rhelp.core/src/org/eclipse/statet/rhelp/core/update/REnvIndexUpdater.java
index 516d523..8454e04 100644
--- a/rhelp/org.eclipse.statet.rhelp.core/src/org/eclipse/statet/rhelp/core/update/REnvIndexUpdater.java
+++ b/rhelp/org.eclipse.statet.rhelp.core/src/org/eclipse/statet/rhelp/core/update/REnvIndexUpdater.java
@@ -384,7 +384,7 @@
 				if (idx < 0) {
 					continue;
 				}
-				final String descr= new String(line.substring(idx + 1).trim());
+				final String descr= line.substring(idx + 1).trim();
 				line= line.substring(0, idx);
 				this.index.addDefaultKeyword(line.split("\\|"), descr); //$NON-NLS-1$
 			}