/******************************************************************************* * Copyright (c) 2001, 2004 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation * Jens Lukowski/Innoopract - initial renaming/restructuring * *******************************************************************************/ package org.eclipse.wst.sse.core.internal.text; /** * This is a convience or utility class that allows you to make a copy of a * part of a larger text store, but have the copy behave as if it was the * larger text store. * * In other words, it provides a subset of a larger document, that "looks like" * the orginal document. That is, "looks like" in terms of offsets and lengths. * Valid access can only be made to data between the orignal offsets, even * though those offsets are in the same units at the original, and even though * the length appears to be long. * * For example, if a subsettext store is created for the def part of abcdefgh, * then get(3,5) is valid, getLength is 8. Any other access, such as * getChar(2), would be invalid. */ import org.eclipse.jface.text.ITextStore; /** * Similar to basics of IDocument, but the offsets are mapped from coordinates * of underlying storage to a "virtual" document. */ public class SubSetTextStore implements ITextStore { private int pseudoBeginOffset; // maps to "zero" postion of new text //private int pseudoEndOffset; private int pseudoLength; // length of old/original document private StringBuffer stringBuffer = new StringBuffer(); /** * SubSetTextStore constructor comment. * * @param initialContent * java.lang.String */ public SubSetTextStore(String initialContent, int beginOffset, int endOffset, int originalDocumentLength) { super(); pseudoBeginOffset = beginOffset; //pseudoEndOffset = endOffset; // used to be originalDocument.getLength ... not sure if used, or // which // is right pseudoLength = originalDocumentLength; stringBuffer = new StringBuffer(initialContent); //set(initialContent); } // this is our "private" get, which methods in this class should // use to get using "real" coordinates of underlying representation. private String _get(int begin, int length) { char[] chars = new char[length]; int srcEnd = begin + length; stringBuffer.getChars(begin, srcEnd, chars, 0); return new String(chars); } public char get(int offset) { return stringBuffer.charAt(offset - pseudoBeginOffset); } /** * @return java.lang.String * @param begin * int * @param end * int */ public String get(int begin, int length) { // remap the begin and end to "appear" to be in the // same coordinates of the original parentDocument return _get(begin - pseudoBeginOffset, length); } /** * @return java.lang.String * @param begin * int * @param end * int */ public char getChar(int pos) { // remap the begin and end to "appear" to be in the // same coordinates of the original parentDocument return get(pos - pseudoBeginOffset); } /** * We redefine getLength so its not the true length of this sub-set * document, but the length of the original. This is needed, as a simple * example, if you want to see if the pseudo end is equal the last * position of the original document. */ public int getLength() { return pseudoLength; } /** * Returns the length as if considered a true, standalone document */ public int getTrueLength() { return stringBuffer.length(); } public void replace(int begin, int length, String changes) { // remap the begin and end to "appear" to be in the // same coordinates of the original parentDocument int end = begin + length; stringBuffer.replace(begin - pseudoBeginOffset, end, changes); } public void set(String text) { stringBuffer.setLength(0); stringBuffer.append(text); } }