package org.jbehave.eclipse.editor.story;
import java.util.List;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.Region;
import org.jbehave.eclipse.editor.step.LocalizedStepSupport;
import org.jbehave.eclipse.parser.VisitingStoryParser;
import org.jbehave.eclipse.parser.StoryElement;
import org.jbehave.eclipse.parser.VisitingCollector;
import org.jbehave.eclipse.parser.StoryVisitor;
import org.jbehave.eclipse.util.Ref;
public class StoryDocumentUtils {
private LocalizedStepSupport localizedStepSupport;
public StoryDocumentUtils(LocalizedStepSupport localizedStepSupport) {
this.localizedStepSupport = localizedStepSupport;
}
public List<StoryElement> getStoryElements(IDocument document) {
VisitingCollector collector = new VisitingCollector();
traverseStory(document, collector);
return collector.getElements();
}
public void traverseStory(IDocument document, StoryVisitor visitor) {
if(document instanceof StoryDocument) {
((StoryDocument)document).traverseStory(visitor);
}
else {
new VisitingStoryParser(localizedStepSupport).parse(document.get(), visitor);
}
}
public Ref<StoryElement> findStoryElementAtOffset(IDocument document, int offset) {
if(offset>0){
offset--; // one search from the character just behind the caret not after
}
return findStoryElementAtRegion(document, new Region(offset, 1));
}
public Ref<StoryElement> findStoryElementAtRegion(IDocument document, final IRegion region) {
final Ref<StoryElement> ref = Ref.create();
StoryVisitor visitor = new StoryVisitor() {
@Override
public void visit(StoryElement element) {
if(element.intersects(region.getOffset(), region.getLength())) {
ref.set(element);
done();
}
}
};
traverseStory(document, visitor);
return ref;
}
}