package org.eclipse.jdt.ui.tests.refactoring.infra;

import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.ISourceRange;

import org.eclipse.jdt.internal.corext.SourceRange;
import org.eclipse.jdt.internal.corext.textmanipulation.TextBuffer;

public class TextRangeUtil {

	//no instances
	private TextRangeUtil(){}
	
	public static ISourceRange getSelection(ICompilationUnit cu, int startLine, int startColumn, int endLine, int endColumn) throws Exception{
		int offset= getOffset(cu, startLine, startColumn);
		int end= getOffset(cu, endLine, endColumn);
		return new SourceRange(offset, end - offset);
	}

	public static int getOffset(ICompilationUnit cu, int line, int column) throws Exception{
		TextBuffer tb= TextBuffer.create(cu.getSource());
		int r= tb.getLineInformation(line - 1).getOffset();
		
		int lineTabCount= calculateTabCountInLine(tb.getLineContent(line - 1), column);		
		r += (column - 1) - (lineTabCount * getTabWidth()) + lineTabCount;
		return r ;
	}
	
	private static final int getTabWidth(){
		return 4;
	}
	
	public static int calculateTabCountInLine(String lineSource, int lastCharOffset){
		int acc= 0;
		int charCount= 0;
		for(int i= 0; charCount < lastCharOffset - 1; i++){
			if ('\t' == lineSource.charAt(i)){
				acc++;
				charCount += getTabWidth();
			}	else
				charCount += 1;
		}
		return acc;
	}

}
