package org.eclipse.util; import org.eclipse.core.filebuffers.FileBuffers; import org.eclipse.core.filebuffers.ITextFileBuffer; import org.eclipse.core.filebuffers.ITextFileBufferManager; import org.eclipse.core.filebuffers.LocationKind; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IDocument; public class DocumentUtils { private DocumentUtils() { } /** * Calculates the offset of the position specified by a line and a column * number, taking the given tab width into account, if it is greater than 1. * Line and column numbering starts from 0. */ public static int getOffsetOfPosition(IDocument document, int lineNumber, int columnNumber, int tabWidth) throws BadLocationException { int offset = document.getLineOffset(lineNumber) + columnNumber; if (tabWidth > 1) { // Correct by tab width int decrement = tabWidth - 1; int lineOffset = document.getLineOffset(lineNumber); int correctedColumnNumber = columnNumber; int spaceRegionSize = 0; for (int currentOffset = lineOffset; currentOffset < lineOffset + correctedColumnNumber; currentOffset++) { switch (document.getChar(currentOffset)) { case '\t': int correctedDecrement = decrement - spaceRegionSize; offset -= correctedDecrement; correctedColumnNumber -= correctedDecrement; spaceRegionSize = 0; break; case ' ': spaceRegionSize++; break; default: spaceRegionSize = 0; } } } return offset; } /** * Returns a document with the initial contents of a file. */ public static IDocument getDocumentFromFile(IFile file) throws CoreException { ITextFileBufferManager bufferManager = FileBuffers.getTextFileBufferManager(); bufferManager.connect(file.getFullPath(), LocationKind.IFILE, new NullProgressMonitor()); ITextFileBuffer textFileBuffer = bufferManager.getTextFileBuffer(file.getFullPath(), LocationKind.IFILE); return textFileBuffer.getDocument(); } }