package org.python.pydev.editor.actions;
import java.util.Arrays;
import java.util.Comparator;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.text.BadPositionCategoryException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.Position;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.ui.IEditorActionDelegate;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.console.IConsole;
import org.eclipse.ui.console.IConsoleView;
import org.eclipse.ui.console.IHyperlink;
import org.eclipse.ui.console.IOConsole;
import org.eclipse.ui.internal.console.ConsoleHyperlinkPosition;
import org.python.pydev.core.log.Log;
import org.python.pydev.shared_interactive_console.console.ui.ScriptConsole;
public class PyOpenLastConsoleHyperlink implements IEditorActionDelegate {
@Override
public void run(IAction action) {
for (IConsoleView c : ScriptConsole.iterConsoles()) {
IConsole console = c.getConsole();
if (console instanceof IOConsole) {
IOConsole ioConsole = (IOConsole) console;
processIOConsole(ioConsole);
break;
}
}
}
@SuppressWarnings("restriction")
private void processIOConsole(IOConsole ioConsole) {
IDocument document = ioConsole.getDocument();
try {
Position[] positions = document.getPositions(ConsoleHyperlinkPosition.HYPER_LINK_CATEGORY);
Arrays.sort(positions, new Comparator<Position>() {
@Override
public int compare(Position o1, Position o2) {
return Integer.compare(o1.getOffset(), o2.getOffset());
}
});
if (positions.length > 0) {
Position p = positions[positions.length - 1];
if (p instanceof ConsoleHyperlinkPosition) {
ConsoleHyperlinkPosition consoleHyperlinkPosition = (ConsoleHyperlinkPosition) p;
IHyperlink hyperLink = consoleHyperlinkPosition.getHyperLink();
hyperLink.linkActivated();
}
}
} catch (BadPositionCategoryException e) {
Log.log(e);
}
}
@Override
public void selectionChanged(IAction action, ISelection selection) {
}
@Override
public void setActiveEditor(IAction action, IEditorPart targetEditor) {
}
}