public static void reveal(IEditorPart editorPart, ITextSelection selection) {
if (!Saros.isWorkbenchAvailable()) {
return;
}
ITextViewer viewer = EditorAPI.getViewer(editorPart);
IRegion visible = new Region(viewer.getTopIndexStartOffset(),
viewer.getBottomIndexEndOffset() - viewer.getTopIndexStartOffset());
IRegion newSelection = new Region(selection.getOffset(),
selection.getLength());
/*
* log.debug("Visible: " + visible + " - Selected: " + newSelection);
*/
if (!TextUtilities.overlaps(visible, newSelection)) {
viewer.revealRange(selection.getOffset(), selection.getLength());
return;
}
if (!(viewer instanceof ITextViewerExtension5))
return;
ITextViewerExtension5 viewer5 = (ITextViewerExtension5) viewer;
// Make sure that we show as much of the selection
// as possible with as little moving as possible
if (newSelection.getOffset() > visible.getOffset()) {
// newSelection is below viewport
if (newSelection.getOffset() + newSelection.getLength() > visible
.getOffset() + visible.getLength()) {
// there is space to go down
int visibleStartLine = getLine(viewer5, visible.getOffset());
int selectionStartLine = getLine(viewer5,
newSelection.getOffset());
int visibleEndLine = getLine(viewer5, visible.getOffset()
+ visible.getLength());
int targetLine = visibleEndLine
+ (selectionStartLine - visibleStartLine);
targetLine = Math.min(targetLine,
getLine(viewer5, viewer.getDocument().getLength()));
int targetOffset = visible.getOffset() + visible.getLength();
while (getLine(viewer5, targetOffset) < targetLine) {
targetOffset++;
}
viewer.revealRange(newSelection.getOffset(), targetOffset
- newSelection.getOffset());
}
} else {
if (newSelection.getOffset() < visible.getOffset()) {
// newSelection is above viewport
if (newSelection.getOffset() + newSelection.getLength() < visible
.getOffset() + visible.getLength()) {
// there is space to go up
int visibleStartLine = getLine(viewer5, visible.getOffset());
int selectionEndLine = getLine(viewer5,
newSelection.getOffset() + newSelection.getLength());
int visibleEndLine = getLine(viewer5, visible.getOffset()
+ visible.getLength());
int targetLine = visibleStartLine
+ (selectionEndLine - visibleEndLine);
targetLine = Math.max(0, targetLine);
int targetOffset = visible.getOffset();
while (getLine(viewer5, targetOffset) > targetLine) {
targetOffset--;
}
viewer.revealRange(newSelection.getOffset(), targetOffset
- newSelection.getOffset());
}
}
}
}