/*******************************************************************************
* Copyright (c) 2007, 2008 Edgar Espina.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
*******************************************************************************/
package org.deved.antlride.internal.ui;
import org.deved.antlride.common.ui.AntlrImages;
import org.deved.antlride.core.build.AntlrProblem;
import org.deved.antlride.ui.AntlrUIConstants;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.debug.ui.console.FileLink;
import org.eclipse.jface.text.IDocument;
import org.eclipse.ui.console.ConsolePlugin;
import org.eclipse.ui.console.IConsole;
import org.eclipse.ui.console.IConsoleFactory;
import org.eclipse.ui.console.IConsoleManager;
import org.eclipse.ui.console.IOConsole;
import org.eclipse.ui.console.IPatternMatchListener;
import org.eclipse.ui.console.PatternMatchEvent;
import org.eclipse.ui.console.TextConsole;
public class AntlrConsoleFactory implements IConsoleFactory {
public static final String ANTLR_CONSOLE = "ANTLR Console";
public void openConsole() {
showConsole();
}
public static IOConsole getConsole() {
IConsoleManager manager = ConsolePlugin.getDefault()
.getConsoleManager();
IConsole[] existing = manager.getConsoles();
IOConsole console = null;
for (int i = 0; i < existing.length; i++) {
if (ANTLR_CONSOLE.equals(existing[i].getName()))
console = (IOConsole) existing[i];
}
if (console == null) {
console = new IOConsole(ANTLR_CONSOLE, AntlrImages
.getDescriptor(AntlrImages.CONSOLE));
console.addPatternMatchListener(new AntlrProblemPatternMatcher());
manager.addConsoles(new IConsole[] { console });
}
return console;
}
public static void showConsole() {
IConsoleManager manager = ConsolePlugin.getDefault()
.getConsoleManager();
manager.showConsoleView(getConsole());
}
// public static void main(String[] args) {
// Pattern pattern = Pattern.compile("/.*(/.*)*\\.g");
// String input =
// "warning(200): /antlride/antlr/ANTLRv3.g:451:5: Decision can match input such as \"' ''$''A''N''T''L''R'' ''s''r''c'' ''\"''\\''\'''\"'' ''0'..'9'\" using multiple alternatives: 1, 2\nAs a result, alternative(s) 2 were disabled for that input";
// Matcher matcher = pattern.matcher(input);
// if (matcher.find()) {
// System.out.println(matcher.group());
// }
// }
private static class AntlrProblemPatternMatcher implements
IPatternMatchListener {
public int getCompilerFlags() {
return 0;
}
public String getLineQualifier() {
return null;
}
public String getPattern() {
return "(warning|error)\\(\\d+\\).*";
}
public void connect(TextConsole console) {
}
public void disconnect() {
}
public void matchFound(PatternMatchEvent event) {
try {
IOConsole console = (IOConsole) event.getSource();
IDocument document = console.getDocument();
int offset = event.getOffset();
int length = event.getLength();
String message = document.get(offset, length);
// message format warning|error(id):
// find the ':'
length = message.indexOf(':');
AntlrProblem problem = (AntlrProblem) console
.getAttribute(message);
if (problem == null) {
return;
}
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
IFile file = root.getFile(problem.getFilepath());
if (!file.exists()) {
// standalone version
IFile[] files = root.findFilesForLocationURI(problem
.getFilepath().toFile().toURI());
file = files[0];
}
if (file != null && file.exists()) {
FileLink link = new FileLink(file,
AntlrUIConstants.EDITOR_ID, problem
.getSourceStart(), problem.getSourceEnd()
- problem.getSourceStart(), problem
.getLine());
console.addHyperlink(link, offset, length);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}