/*******************************************************************************
 * 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
 *     Viacheslav Kabanovich/Exadel 97817 Wrong algoritm in class StructuredDocumentTextStore
 *     			https://bugs.eclipse.org/bugs/show_bug.cgi?id=97817
 *     
 *******************************************************************************/
package org.eclipse.wst.sse.core.internal.text;

import org.eclipse.jface.text.GapTextStore;
import org.eclipse.jface.text.ITextStore;

public class StructuredDocumentTextStore implements ITextStore, CharSequence, IRegionComparible {

	private GapTextStore fInternalStore;

	/**
	 *  
	 */
	public StructuredDocumentTextStore() {
		this(50, 300);
	}

	/**
	 * @param lowWatermark
	 * @param highWatermark
	 */
	public StructuredDocumentTextStore(int lowWatermark, int highWatermark) {
		super();
		fInternalStore = new GapTextStore(lowWatermark, highWatermark);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.CharSequence#charAt(int)
	 */
	public char charAt(int index) {
		return fInternalStore.get(index);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jface.text.ITextStore#get(int)
	 */
	public char get(int offset) {

		return fInternalStore.get(offset);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jface.text.ITextStore#get(int, int)
	 */
	public String get(int offset, int length) {

		return fInternalStore.get(offset, length);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jface.text.ITextStore#getLength()
	 */
	public int getLength() {

		return fInternalStore.getLength();
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.CharSequence#length()
	 */
	public int length() {

		return fInternalStore.getLength();
	}

	private boolean matchesIgnoreCase(char c1, char c2) {
		// we check both case conversions to handle those few cases,
		// in languages such as Turkish, which have some characters
		// which sort of have 3 cases.
		boolean result = false;
		if (Character.toUpperCase(c1) == Character.toUpperCase(c2))
			result = true;
		else if (Character.toLowerCase(c1) == Character.toLowerCase(c2))
			result = true;
		return result;
	}

	public boolean regionMatches(int offset, int length, String stringToCompare) {
		boolean result = false;
		int compareLength = stringToCompare.length();
		if (compareLength == length) {
			int endOffset = offset + length;
			if (endOffset <= length()) {
				result = regionMatches(offset, stringToCompare);
			}
		}

		return result;
	}

	/**
	 * This method assumes all lengths have been checked and fall withint
	 * exceptable limits
	 * 
	 * @param offset
	 * @param stringToCompare
	 * @return
	 */
	private boolean regionMatches(int offset, String stringToCompare) {
		boolean result = true;
		int stringOffset = 0;
		int len = offset + stringToCompare.length();
		for (int i = offset; i < len; i++) {
			if (charAt(i) != stringToCompare.charAt(stringOffset++)) {
				result = false;
				break;
			}
		}
		return result;
	}

	public boolean regionMatchesIgnoreCase(int offset, int length, String stringToCompare) {
		boolean result = false;
		int compareLength = stringToCompare.length();
		if (compareLength == length) {
			int endOffset = offset + length;
			if (endOffset <= length()) {
				result = regionMatchesIgnoreCase(offset, stringToCompare);
			}
		}

		return result;
	}

	private boolean regionMatchesIgnoreCase(int offset, String stringToCompare) {
		boolean result = true;
		int stringOffset = 0;
		int len = stringToCompare.length();
		for (int i = offset; i < len; i++) {
			if (!matchesIgnoreCase(charAt(i), stringToCompare.charAt(stringOffset++))) {
				result = false;
				break;
			}
		}
		return result;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jface.text.ITextStore#replace(int, int,
	 *      java.lang.String)
	 */
	public void replace(int offset, int length, String text) {
		fInternalStore.replace(offset, length, text);

	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jface.text.ITextStore#set(java.lang.String)
	 */
	public void set(String text) {
		fInternalStore.set(text);

	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.CharSequence#subSequence(int, int)
	 */
	public CharSequence subSequence(int start, int end) {
		// convert 'end' to 'length'
		return fInternalStore.get(start, end - start);
	}
}
