package com.github.fabeclipse.textedgrep.internal.ui; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.DocumentEvent; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IDocumentListener; import org.eclipse.jface.text.IRegion; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.texteditor.AbstractTextEditor; import com.github.fabeclipse.textedgrep.IGrepTarget; /** * Bridge between a grep target and an IDocument object. * Used to grep text editors. * * @author Fabrizio Iannetti * @since 3.0 * */ public class DocumentGrepTarget implements IGrepTarget { private final IDocument document; int lineIndex = -1; private AbstractTextEditor editor; public DocumentGrepTarget(AbstractTextEditor textEd) { this(textEd.getDocumentProvider().getDocument(textEd.getEditorInput())); editor = textEd; } public DocumentGrepTarget(IDocument document) { this.document = document; // TODO: add a document listener, this should update // grep results document.addDocumentListener(new IDocumentListener() { @Override public void documentChanged(DocumentEvent event) { } @Override public void documentAboutToBeChanged(DocumentEvent event) { } }); } @Override public void start() { lineIndex = 0; } @Override public void stop() { lineIndex = -1; } @Override public boolean hasNextLine() { return lineIndex < document.getNumberOfLines(); } @Override public String nextLine() { try { IRegion information = document.getLineInformation(lineIndex); lineIndex++; return document.get(information.getOffset(), information.getLength()); } catch (BadLocationException e) { return null; } } @Override public int getLineOffset(int line) { int offset = -1; try { offset = document.getLineOffset(line); } catch (BadLocationException e) { // just return -1 as bad location } return offset; } @Override public void select(int start, int length) { editor.selectAndReveal(start, length); } @Override public boolean isSame(IWorkbenchPart part) { return part == editor; } @Override public String getTitle() { return editor.getTitle(); } @Override public long getLength() { return document.getLength(); } @Override public String getTextBetweenLines(int origStartLine, int origEndLine, int startDelta, int endDelta) { String text = ""; try { // include end lines if (origEndLine < document.getNumberOfLines()) origEndLine++; int start = document.getLineOffset(origStartLine) + startDelta; int end = document.getLineOffset(origEndLine) - endDelta; text = document.get(start, end - start); } catch (BadLocationException e) { // TODO: log } return text; } }