/*******************************************************************************
* Copyright (c) 2008 Vlad Dumitrescu and others.
* 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
*
* Contributors:
* Vlad Dumitrescu
*******************************************************************************/
package org.erlide.ui.views;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.ui.console.FileLink;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.ui.console.IHyperlink;
import org.eclipse.ui.console.IPatternMatchListenerDelegate;
import org.eclipse.ui.console.PatternMatchEvent;
import org.eclipse.ui.console.TextConsole;
import org.erlide.util.ErlLogger;
public class ErlPatternMatchListenerDelegate implements IPatternMatchListenerDelegate {
private TextConsole fConsole;
@Override
public void connect(final TextConsole console) {
fConsole = console;
}
@Override
public void disconnect() {
fConsole = null;
}
@Override
public void matchFound(final PatternMatchEvent event) {
if (fConsole == null) {
return;
}
try {
final String txt = fConsole.getDocument().get(event.getOffset(),
event.getLength());
final String[] v = txt.split(":");
final IProject[] projects = ResourcesPlugin.getWorkspace().getRoot()
.getProjects();
IResource res = null;
for (final IProject prj : projects) {
if (!prj.isOpen()) {
continue;
}
try {
res = recursiveFindNamedResourceWithReferences(prj, v[0]);
if (res != null) {
break;
}
} catch (final CoreException e) {
ErlLogger.warn(e);
}
}
IFile file = null;
if (res instanceof IFile) {
file = (IFile) res;
}
final IHyperlink link = new FileLink(file, null, -1, -1,
Integer.parseInt(v[1]));
fConsole.addHyperlink(link, event.getOffset(), event.getLength());
} catch (final BadLocationException e) {
ErlLogger.warn(e);
}
}
private static IResource recursiveFindNamedResourceWithReferences(
final IContainer container, final String name) throws CoreException {
final IResource r = recursiveFindNamedResource(container, name);
if (r != null) {
return r;
}
final IProject project = container.getProject();
for (final IProject p : project.getReferencedProjects()) {
final IResource r1 = recursiveFindNamedResource(p, name);
if (r1 != null) {
return r1;
}
}
return null;
}
private static IResource recursiveFindNamedResource(final IContainer container,
final String name) throws CoreException {
if (!container.isAccessible()) {
return null;
}
IResource r = container.findMember(name);
if (r != null) {
return r;
}
final IResource[] members = container.members();
for (final IResource element : members) {
r = element;
if (r instanceof IContainer) {
r = recursiveFindNamedResource((IContainer) r, name);
if (r != null) {
return r;
}
}
}
return null;
}
}