package net.sourceforge.tagsea.mylyn.core; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.ITextViewer; import org.eclipse.jface.text.hyperlink.AbstractHyperlinkDetector; import org.eclipse.jface.text.hyperlink.IHyperlink; import org.eclipse.swt.custom.StyleRange; import org.eclipse.swt.custom.StyledText; public abstract class HyperLinkDetector extends AbstractHyperlinkDetector { protected abstract IHyperlink extractHyperlink(ITextViewer viewer, int regionOffset, Matcher m); protected abstract Pattern getPattern(); @Override public IHyperlink[] detectHyperlinks(ITextViewer textViewer, IRegion region, boolean canShowMultipleHyperlinks) { if (region == null || textViewer == null) return null; IDocument document = textViewer.getDocument(); if (document == null) { return null; } IRegion lineInfo; String line; try { lineInfo = document.getLineInformationOfOffset(region.getOffset()); line = document.get(lineInfo.getOffset(), lineInfo.getLength()); } catch (BadLocationException ex) { return null; } List<IHyperlink> links = findHyperlinks(textViewer, region, lineInfo, line); if (!links.isEmpty()) { return links.toArray(new IHyperlink[1]); } return null; } private List<IHyperlink> findHyperlinks(ITextViewer viewer, IRegion region, IRegion lineInfo, String line) { int lineOffset = region.getOffset() - lineInfo.getOffset(); int regionOffset = lineInfo.getOffset(); List<IHyperlink> links = new ArrayList<IHyperlink>(); Matcher m = getPattern().matcher(line); while (m.find()) { IHyperlink link = extractHyperlink(viewer, regionOffset, m); if (link != null) links.add(link); } return links; } protected void strikeoutText(ITextViewer viewer, IRegion sregion) { // Strike through text StyledText styledText = viewer.getTextWidget(); StyleRange[] ranges = styledText.getStyleRanges(sregion.getOffset(), sregion.getLength()); for (StyleRange style : ranges) { style.strikeout = true; styledText.setStyleRange(style); } } }