package org.bundlemaker.core.ui.editor.sourceviewer;
import java.util.LinkedList;
import java.util.List;
import java.util.Map.Entry;
import org.bundlemaker.core.analysis.AnalysisModelQueries;
import org.bundlemaker.core.analysis.IBundleMakerArtifact;
import org.bundlemaker.core.analysis.IResourceArtifact;
import org.bundlemaker.core.spi.parser.IReferenceDetailParser.IPosition;
import org.eclipse.core.runtime.Assert;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.ITextViewer;
import org.eclipse.jface.text.Position;
import org.eclipse.jface.text.hyperlink.IHyperlink;
import org.eclipse.jface.text.hyperlink.IHyperlinkDetector;
/**
* <p>
* </p>
*
* @author Gerd Wütherich (gerd@gerd-wuetherich.de)
*/
public class ReferenceHyperlinkDetector implements IHyperlinkDetector {
/** - */
private SourceViewerEditor _editor;
/**
* <p>
* Creates a new instance of type {@link ReferenceHyperlinkDetector}.
* </p>
*
* @param editor
*/
public ReferenceHyperlinkDetector(SourceViewerEditor editor) {
//
Assert.isNotNull(editor);
//
_editor = editor;
}
/**
* {@inheritDoc}
*/
public IHyperlink[] detectHyperlinks(ITextViewer textViewer, IRegion region, boolean canShowMultipleHyperlinks) {
//
List<IHyperlink> hyperlinks = new LinkedList<IHyperlink>();
//
for (Entry<String, List<IPosition>> entry : _editor.getPositions().entrySet()) {
//
IBundleMakerArtifact referencedArtifact = AnalysisModelQueries.getReferencedArtifact(
_editor.getResourceArtifact(), entry.getKey());
//
IResourceArtifact referencedResourceArtifact = referencedArtifact != null
&& !(referencedArtifact instanceof IResourceArtifact) ? referencedArtifact.getParent(IResourceArtifact.class)
: (IResourceArtifact) referencedArtifact;
//
if (referencedResourceArtifact != null) {
//
for (IPosition position : entry.getValue()) {
//
if (region.getOffset() >= position.getOffset()
&& region.getOffset() <= position.getOffset() + position.getLength()) {
//
hyperlinks.add(new ReferenceHyperlink(new ResourceArtifactReferenceRegion(position.getOffset(), position
.getLength(), entry.getKey(), referencedResourceArtifact)));
}
}
}
}
//
return hyperlinks.isEmpty() ? null : hyperlinks.toArray(new IHyperlink[0]);
}
}