package monolipse.ui.debug; import java.util.regex.Matcher; import java.util.regex.Pattern; import monolipse.core.foundation.WorkspaceUtilities; import monolipse.ui.BooUI; import org.eclipse.core.resources.IFile; import org.eclipse.debug.ui.console.FileLink; import org.eclipse.jface.text.BadLocationException; import org.eclipse.ui.console.IPatternMatchListenerDelegate; import org.eclipse.ui.console.PatternMatchEvent; import org.eclipse.ui.console.TextConsole; public class CompilerOutputPatternMatchListener implements IPatternMatchListenerDelegate { private TextConsole _console; public void connect(TextConsole console) { _console = console; } public void disconnect() { _console = null; } public void matchFound(PatternMatchEvent event) { final int offset = event.getOffset(); final int length = event.getLength(); String match = null; try { match = _console.getDocument().get(offset, length); } catch (BadLocationException e) { BooUI.logException(e); return; } int position = match.lastIndexOf('('); String fname = match.substring(0, position); final IFile file = WorkspaceUtilities.getFileForLocation(fname); if (null != file) { try { FileLink link = new FileLink(file, null, -1, -1, getLineNumber(match)); _console.addHyperlink(link, offset, length); } catch (BadLocationException e) { BooUI.logException(e); } } } private int getLineNumber(String match) { Matcher matcher = Pattern.compile("\\((\\d+)").matcher(match); return matcher.find() ? Integer.parseInt(matcher.group(1)) : -1; } }