diff options
author | spingel | 2008-10-12 05:08:47 +0000 |
---|---|---|
committer | spingel | 2008-10-12 05:08:47 +0000 |
commit | 6055ae0057839ca6f12637bad029e518484a0531 (patch) | |
tree | 6f6ca89e4c4d31832b5223cd7919ebcf876cb0bd | |
parent | e1a393760cd47d1918fb922571b5ba6d244501a6 (diff) | |
download | org.eclipse.mylyn.tasks-6055ae0057839ca6f12637bad029e518484a0531.tar.gz org.eclipse.mylyn.tasks-6055ae0057839ca6f12637bad029e518484a0531.tar.xz org.eclipse.mylyn.tasks-6055ae0057839ca6f12637bad029e518484a0531.zip |
NEW - bug 248798: implement new hyperlink detection API for Trac
https://bugs.eclipse.org/bugs/show_bug.cgi?id=248798
9 files changed, 294 insertions, 255 deletions
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/ui/TaskHyperlinkDetectorTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/ui/TaskHyperlinkDetectorTest.java index 107a2b6c3..0666da543 100644 --- a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/ui/TaskHyperlinkDetectorTest.java +++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/ui/TaskHyperlinkDetectorTest.java @@ -24,6 +24,7 @@ import org.eclipse.mylyn.tasks.core.TaskRepository; import org.eclipse.mylyn.tasks.tests.TaskTestUtil; import org.eclipse.mylyn.tasks.tests.connector.MockRepositoryConnectorUi; import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi; +import org.eclipse.mylyn.tasks.ui.AbstractTaskHyperlinkDetector; /** * @author Steffen Pingel @@ -41,7 +42,7 @@ public class TaskHyperlinkDetectorTest extends TestCase { } protected IHyperlink[] detect(final String text, int start, int length) { - TaskHyperlinkDetector detector = createHyperlinkDetector(); + AbstractTaskHyperlinkDetector detector = createHyperlinkDetector(); return detector.detectHyperlinks(new TextViewer() { @Override public IDocument getDocument() { @@ -50,7 +51,7 @@ public class TaskHyperlinkDetectorTest extends TestCase { }, new Region(start, length), true); } - protected TaskHyperlinkDetector createHyperlinkDetector() { + protected AbstractTaskHyperlinkDetector createHyperlinkDetector() { TaskHyperlinkDetector detector = new TaskHyperlinkDetector() { @Override protected TaskRepository getTaskRepository(ITextViewer textViewer) { diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/ui/TaskRelationHyperlinkDetectorTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/ui/TaskRelationHyperlinkDetectorTest.java index de2cc5f19..fb18b6340 100644 --- a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/ui/TaskRelationHyperlinkDetectorTest.java +++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/ui/TaskRelationHyperlinkDetectorTest.java @@ -12,10 +12,9 @@ package org.eclipse.mylyn.tasks.tests.ui; import org.eclipse.jface.text.ITextViewer; -import org.eclipse.mylyn.internal.tasks.ui.editors.TaskHyperlinkDetector; import org.eclipse.mylyn.internal.tasks.ui.editors.TaskRelationHyperlinkDetector; import org.eclipse.mylyn.tasks.core.TaskRepository; -import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi; +import org.eclipse.mylyn.tasks.ui.AbstractTaskHyperlinkDetector; /** * @author Steffen Pingel @@ -23,17 +22,12 @@ import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi; public class TaskRelationHyperlinkDetectorTest extends TaskHyperlinkDetectorTest { @Override - protected TaskHyperlinkDetector createHyperlinkDetector() { + protected AbstractTaskHyperlinkDetector createHyperlinkDetector() { TaskRelationHyperlinkDetector detector = new TaskRelationHyperlinkDetector() { @Override protected TaskRepository getTaskRepository(ITextViewer textViewer) { return repository; } - - @Override - protected AbstractRepositoryConnectorUi getConnectorUi(TaskRepository repository) { - return connectorUi; - } }; return detector; } diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskHyperlinkDetector.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskHyperlinkDetector.java index 105f9bfcd..d3d7cfd06 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskHyperlinkDetector.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskHyperlinkDetector.java @@ -7,120 +7,35 @@ * * Contributors: * Tasktop Technologies - initial API and implementation - * Eugene Kuleshov - improvements *******************************************************************************/ package org.eclipse.mylyn.internal.tasks.ui.editors; import java.util.ArrayList; import java.util.Arrays; -import java.util.Iterator; import java.util.List; -import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.ISafeRunnable; -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.jface.util.SafeRunnable; import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin; import org.eclipse.mylyn.tasks.core.TaskRepository; import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi; -import org.eclipse.mylyn.tasks.ui.TasksUi; -import org.eclipse.ui.IEditorInput; -import org.eclipse.ui.IEditorPart; -import org.eclipse.ui.IWorkbenchPage; -import org.eclipse.ui.IWorkbenchPart; -import org.eclipse.ui.IWorkbenchWindow; -import org.eclipse.ui.PlatformUI; +import org.eclipse.mylyn.tasks.ui.AbstractTaskHyperlinkDetector; /** - * @author Rob Elves + * Delegates to {@link AbstractRepositoryConnectorUi} for detecting hyperlinks. + * * @author Steffen Pingel - * @author Eugene Kuleshov - * @author Terry Hon */ -public class TaskHyperlinkDetector extends AbstractHyperlinkDetector { +public class TaskHyperlinkDetector extends AbstractTaskHyperlinkDetector { - public IHyperlink[] detectHyperlinks(ITextViewer textViewer, final IRegion region, boolean canShowMultipleHyperlinks) { - if (region == null || textViewer == null) { - return null; - } - - IDocument document = textViewer.getDocument(); - if (document == null || document.getLength() == 0) { - return null; - } - - String content; - int contentOffset; - int index; - try { - if (region.getLength() == 0) { - // expand the region to include the whole line - IRegion lineInfo = document.getLineInformationOfOffset(region.getOffset()); - int lineLength = lineInfo.getLength(); - int lineOffset = lineInfo.getOffset(); - int lineEnd = lineOffset + lineLength; - int regionEnd = region.getOffset() + region.getLength(); - if (lineOffset < region.getOffset()) { - int regionLength = Math.max(regionEnd, lineEnd) - lineOffset; - contentOffset = lineOffset; - content = document.get(lineOffset, regionLength); - index = region.getOffset() - lineOffset; - } else { - // the line starts after region, may never happen - int regionLength = Math.max(regionEnd, lineEnd) - region.getOffset(); - contentOffset = region.getOffset(); - content = document.get(contentOffset, regionLength); - index = 0; - } - } else { - content = document.get(region.getOffset(), region.getLength()); - contentOffset = region.getOffset(); - index = -1; - } - } catch (BadLocationException ex) { - return null; - } - - List<TaskRepository> repositories = new ArrayList<TaskRepository>(); - TaskRepository selectedRepository = getTaskRepository(textViewer); - if (selectedRepository != null) { - repositories.add(selectedRepository); - } else { - repositories.addAll(TasksUi.getRepositoryManager().getAllRepositories()); - } - - List<IHyperlink> hyperlinks = detectHyperlinks(content, index, contentOffset, repositories); - if (hyperlinks == null) { - return null; - } - - // filter hyperlinks that do not match original region - if (region.getLength() == 0) { - for (Iterator<IHyperlink> it = hyperlinks.iterator(); it.hasNext();) { - IHyperlink hyperlink = it.next(); - IRegion hyperlinkRegion = hyperlink.getHyperlinkRegion(); - if (!isInRegion(region, hyperlinkRegion)) { - it.remove(); - } - } - } - if (hyperlinks.isEmpty()) { - return null; - } - - return hyperlinks.toArray(new IHyperlink[hyperlinks.size()]); - } - - protected List<IHyperlink> detectHyperlinks(final String content, final int index, final int contentOffset, - List<TaskRepository> repositories) { + @Override + protected List<IHyperlink> detectHyperlinks(ITextViewer textViewer, final String content, final int index, + final int contentOffset) { List<IHyperlink> result = null; - for (final TaskRepository repository : repositories) { + for (final TaskRepository repository : getTaskRepositories(textViewer)) { final AbstractRepositoryConnectorUi connectorUi = getConnectorUi(repository); if (connectorUi == null) { continue; @@ -150,43 +65,4 @@ public class TaskHyperlinkDetector extends AbstractHyperlinkDetector { return TasksUiPlugin.getConnectorUi(repository.getConnectorKind()); } - private boolean isInRegion(IRegion matchRegion, IRegion hyperlinkRegion) { - return matchRegion.getOffset() >= hyperlinkRegion.getOffset() - && matchRegion.getOffset() <= hyperlinkRegion.getOffset() + hyperlinkRegion.getLength(); - } - - protected TaskRepository getTaskRepository(ITextViewer textViewer) { - TaskRepository repository = (TaskRepository) getAdapter(TaskRepository.class); - if (repository != null) { - return repository; - } - - IResource resource = (IResource) getAdapter(IResource.class); - if (resource == null) { - if (textViewer instanceof RepositoryTextViewer) { - RepositoryTextViewer viewer = (RepositoryTextViewer) textViewer; - return viewer.getRepository(); - } - - // use currently active editor (if any) - IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); - if (window != null) { - IWorkbenchPage activePage = window.getActivePage(); - if (activePage != null) { - IWorkbenchPart part = activePage.getActivePart(); - if (part instanceof IEditorPart) { - IEditorInput input = ((IEditorPart) part).getEditorInput(); - if (input != null) { - resource = (IResource) input.getAdapter(IResource.class); - } - } - } - } - } - if (resource != null) { - return TasksUiPlugin.getDefault().getRepositoryForResource(resource); - } - return null; - } - } diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskRelationHyperlinkDetector.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskRelationHyperlinkDetector.java index d7a7d0dec..4e05efabb 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskRelationHyperlinkDetector.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskRelationHyperlinkDetector.java @@ -23,24 +23,25 @@ import org.eclipse.jface.text.ITextViewer; import org.eclipse.jface.text.Region; import org.eclipse.jface.text.hyperlink.IHyperlink; import org.eclipse.mylyn.tasks.core.TaskRepository; +import org.eclipse.mylyn.tasks.ui.AbstractTaskHyperlinkDetector; import org.eclipse.mylyn.tasks.ui.TaskHyperlink; /** * @author Steffen Pingel */ -public class TaskRelationHyperlinkDetector extends TaskHyperlinkDetector { +public class TaskRelationHyperlinkDetector extends AbstractTaskHyperlinkDetector { private static Pattern HYPERLINK_PATTERN = Pattern.compile("([^\\s,]+)"); @Override public IHyperlink[] detectHyperlinks(ITextViewer textViewer, IRegion region, boolean canShowMultipleHyperlinks) { - if (region == null || textViewer == null || textViewer.getDocument() == null) { - return null; - } - if (region.getLength() > 0) { return super.detectHyperlinks(textViewer, region, canShowMultipleHyperlinks); } else { + if (textViewer.getDocument() == null) { + return null; + } + TaskRepository taskRepository = getTaskRepository(textViewer); if (taskRepository != null) { String prefix = extractPrefix(textViewer, region.getOffset()); @@ -56,10 +57,9 @@ public class TaskRelationHyperlinkDetector extends TaskHyperlinkDetector { } @Override - protected List<IHyperlink> detectHyperlinks(String content, int index, int contentOffset, - List<TaskRepository> repositories) { + protected List<IHyperlink> detectHyperlinks(ITextViewer textViewer, String content, int index, int contentOffset) { List<IHyperlink> links = null; - for (TaskRepository repository : repositories) { + for (TaskRepository repository : getTaskRepositories(textViewer)) { Matcher m = HYPERLINK_PATTERN.matcher(content); while (m.find()) { if (links == null) { diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskUrlHyperlinkDetector.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskUrlHyperlinkDetector.java index 24815ce2e..4971dee19 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskUrlHyperlinkDetector.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskUrlHyperlinkDetector.java @@ -1,5 +1,5 @@ /******************************************************************************* -* Copyright (c) 2004, 2008 Tasktop Technologies and others. + * Copyright (c) 2004, 2008 Tasktop Technologies 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 @@ -22,9 +22,11 @@ import org.eclipse.jface.text.ITextViewer; import org.eclipse.jface.text.Region; import org.eclipse.jface.text.hyperlink.AbstractHyperlinkDetector; import org.eclipse.jface.text.hyperlink.IHyperlink; +import org.eclipse.mylyn.tasks.ui.TasksUiUtil; /** - * Source from {@link org.eclipse.jface.text.hyperlink.URLHyperlinkDetector} + * Source from {@link org.eclipse.jface.text.hyperlink.URLHyperlinkDetector}. Returns hyperlinks that use + * {@link TasksUiUtil} to open urls. * * @author Rob Elves */ @@ -153,4 +155,5 @@ public class TaskUrlHyperlinkDetector extends AbstractHyperlinkDetector { IRegion urlRegion = new Region(offset + urlOffsetInLine, urlLength); return new IHyperlink[] { new TaskUrlHyperlink(urlRegion, urlString) }; } + } diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/AbstractTaskHyperlinkDetector.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/AbstractTaskHyperlinkDetector.java new file mode 100644 index 000000000..1210f23de --- /dev/null +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/AbstractTaskHyperlinkDetector.java @@ -0,0 +1,177 @@ +/******************************************************************************* + * Copyright (c) 2004, 2008 Tasktop Technologies 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: + * Tasktop Technologies - initial API and implementation + * Eugene Kuleshov - improvements + *******************************************************************************/ + +package org.eclipse.mylyn.tasks.ui; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import org.eclipse.core.resources.IResource; +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.mylyn.internal.tasks.ui.TasksUiPlugin; +import org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTextViewer; +import org.eclipse.mylyn.tasks.core.TaskRepository; +import org.eclipse.ui.IEditorInput; +import org.eclipse.ui.IEditorPart; +import org.eclipse.ui.IWorkbenchPage; +import org.eclipse.ui.IWorkbenchPart; +import org.eclipse.ui.IWorkbenchWindow; +import org.eclipse.ui.PlatformUI; + +/** + * Base class for hyperlink detectors that provides methods for extracting text from an {@link ITextViewer}. + * + * @author Rob Elves + * @author Steffen Pingel + * @author Eugene Kuleshov + * @author Terry Hon + * @since 3.1 + */ +public abstract class AbstractTaskHyperlinkDetector extends AbstractHyperlinkDetector { + + /** + * @since 3.1 + */ + public AbstractTaskHyperlinkDetector() { + } + + /** + * @since 3.1 + */ + public IHyperlink[] detectHyperlinks(ITextViewer textViewer, final IRegion region, boolean canShowMultipleHyperlinks) { + IDocument document = textViewer.getDocument(); + if (document == null || document.getLength() == 0) { + return null; + } + + String content; + int contentOffset; + int index; + try { + if (region.getLength() == 0) { + // expand the region to include the whole line + IRegion lineInfo = document.getLineInformationOfOffset(region.getOffset()); + int lineLength = lineInfo.getLength(); + int lineOffset = lineInfo.getOffset(); + int lineEnd = lineOffset + lineLength; + int regionEnd = region.getOffset() + region.getLength(); + if (lineOffset < region.getOffset()) { + int regionLength = Math.max(regionEnd, lineEnd) - lineOffset; + contentOffset = lineOffset; + content = document.get(lineOffset, regionLength); + index = region.getOffset() - lineOffset; + } else { + // the line starts after region, may never happen + int regionLength = Math.max(regionEnd, lineEnd) - region.getOffset(); + contentOffset = region.getOffset(); + content = document.get(contentOffset, regionLength); + index = 0; + } + } else { + content = document.get(region.getOffset(), region.getLength()); + contentOffset = region.getOffset(); + index = -1; + } + } catch (BadLocationException ex) { + return null; + } + + List<IHyperlink> hyperlinks = detectHyperlinks(textViewer, content, contentOffset, index); + if (hyperlinks == null) { + return null; + } + + // filter hyperlinks that do not match original region + if (region.getLength() == 0) { + for (Iterator<IHyperlink> it = hyperlinks.iterator(); it.hasNext();) { + IHyperlink hyperlink = it.next(); + IRegion hyperlinkRegion = hyperlink.getHyperlinkRegion(); + if (!isInRegion(region, hyperlinkRegion)) { + it.remove(); + } + } + } + if (hyperlinks.isEmpty()) { + return null; + } + return hyperlinks.toArray(new IHyperlink[hyperlinks.size()]); + } + + /** + * @since 3.1 + */ + protected abstract List<IHyperlink> detectHyperlinks(ITextViewer textViewer, String content, int contentOffset, + int index); + + private boolean isInRegion(IRegion detectInRegion, IRegion hyperlinkRegion) { + return detectInRegion.getOffset() >= hyperlinkRegion.getOffset() + && detectInRegion.getOffset() <= hyperlinkRegion.getOffset() + hyperlinkRegion.getLength(); + } + + /** + * @since 3.1 + */ + protected List<TaskRepository> getTaskRepositories(ITextViewer textViewer) { + List<TaskRepository> repositories = new ArrayList<TaskRepository>(); + TaskRepository selectedRepository = getTaskRepository(textViewer); + if (selectedRepository != null) { + repositories.add(selectedRepository); + } else { + repositories.addAll(TasksUi.getRepositoryManager().getAllRepositories()); + } + return repositories; + } + + /** + * @since 3.1 + */ + protected TaskRepository getTaskRepository(ITextViewer textViewer) { + TaskRepository repository = (TaskRepository) getAdapter(TaskRepository.class); + if (repository != null) { + return repository; + } + + IResource resource = (IResource) getAdapter(IResource.class); + if (resource == null) { + if (textViewer instanceof RepositoryTextViewer) { + RepositoryTextViewer viewer = (RepositoryTextViewer) textViewer; + return viewer.getRepository(); + } + + // use currently active editor (if any) + IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); + if (window != null) { + IWorkbenchPage activePage = window.getActivePage(); + if (activePage != null) { + IWorkbenchPart part = activePage.getActivePart(); + if (part instanceof IEditorPart) { + IEditorInput input = ((IEditorPart) part).getEditorInput(); + if (input != null) { + resource = (IResource) input.getAdapter(IResource.class); + } + } + } + } + } + if (resource != null) { + return TasksUiPlugin.getDefault().getRepositoryForResource(resource); + } + return null; + } + +}
\ No newline at end of file diff --git a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracHyperlinkUtilTest.java b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracHyperlinkUtilTest.java index adf6a452e..b113b6b0b 100644 --- a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracHyperlinkUtilTest.java +++ b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracHyperlinkUtilTest.java @@ -1,5 +1,5 @@ /******************************************************************************* -* Copyright (c) 2006, 2008 Steffen Pingel and others. + * Copyright (c) 2006, 2008 Steffen Pingel 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 @@ -12,6 +12,8 @@ package org.eclipse.mylyn.trac.tests; +import java.util.List; + import junit.framework.TestCase; import org.eclipse.jface.text.Region; @@ -33,13 +35,11 @@ public class TracHyperlinkUtilTest extends TestCase { @Override protected void setUp() throws Exception { - super.setUp(); - repository = new TaskRepository(TracCorePlugin.CONNECTOR_KIND, "http://localhost"); } public void testFindHyperlinksComment() { - IHyperlink[] links = TracHyperlinkUtil.findTracHyperlinks(repository, "comment:ticket:12:34", 0, 0); + IHyperlink[] links = findTracHyperlinks(repository, "comment:ticket:12:34", 0, 0); assertNotNull(links); assertEquals(1, links.length); assertEquals(new Region(0, 20), links[0].getHyperlinkRegion()); @@ -66,88 +66,86 @@ public class TracHyperlinkUtilTest extends TestCase { } public void testFindHyperlinksReport() { - IHyperlink[] links = TracHyperlinkUtil.findTracHyperlinks(repository, "report:123", 0, 0); + IHyperlink[] links = findTracHyperlinks(repository, "report:123", 0, 0); assertEquals(1, links.length); assertEquals(new Region(0, 10), links[0].getHyperlinkRegion()); assertEquals("http://localhost/report/123", ((WebHyperlink) links[0]).getURLString()); - links = TracHyperlinkUtil.findTracHyperlinks(repository, "{123}", 0, 0); + links = findTracHyperlinks(repository, "{123}", 0, 0); assertEquals(1, links.length); assertEquals(new Region(0, 5), links[0].getHyperlinkRegion()); assertEquals("http://localhost/report/123", ((WebHyperlink) links[0]).getURLString()); } public void testFindHyperlinksChangeset() { - IHyperlink[] links = TracHyperlinkUtil.findTracHyperlinks(repository, "r123", 0, 0); + IHyperlink[] links = findTracHyperlinks(repository, "r123", 0, 0); assertEquals(1, links.length); assertEquals(new Region(0, 4), links[0].getHyperlinkRegion()); assertEquals("http://localhost/changeset/123", ((WebHyperlink) links[0]).getURLString()); - links = TracHyperlinkUtil.findTracHyperlinks(repository, "[123]", 0, 0); + links = findTracHyperlinks(repository, "[123]", 0, 0); assertEquals(1, links.length); assertEquals(new Region(0, 5), links[0].getHyperlinkRegion()); assertEquals("http://localhost/changeset/123", ((WebHyperlink) links[0]).getURLString()); - links = TracHyperlinkUtil.findTracHyperlinks(repository, "![123]", 0, 0); + links = findTracHyperlinks(repository, "![123]", 0, 0); assertNull(links); - links = TracHyperlinkUtil.findTracHyperlinks(repository, "![123]", 1, 0); + links = findTracHyperlinks(repository, "![123]", 1, 0); assertNull(links); - links = TracHyperlinkUtil.findTracHyperlinks(repository, "changeset:123", 0, 0); + links = findTracHyperlinks(repository, "changeset:123", 0, 0); assertEquals(1, links.length); assertEquals(new Region(0, 13), links[0].getHyperlinkRegion()); assertEquals("http://localhost/changeset/123", ((WebHyperlink) links[0]).getURLString()); - links = TracHyperlinkUtil.findTracHyperlinks(repository, "[123/trunk]", 0, 0); + links = findTracHyperlinks(repository, "[123/trunk]", 0, 0); assertEquals(1, links.length); assertEquals(new Region(0, 11), links[0].getHyperlinkRegion()); assertEquals("http://localhost/changeset/123/trunk", ((WebHyperlink) links[0]).getURLString()); - links = TracHyperlinkUtil.findTracHyperlinks(repository, "changeset:123/trunk", 0, 0); + links = findTracHyperlinks(repository, "changeset:123/trunk", 0, 0); assertEquals(1, links.length); assertEquals(new Region(0, 19), links[0].getHyperlinkRegion()); assertEquals("http://localhost/changeset/123/trunk", ((WebHyperlink) links[0]).getURLString()); } public void testFindHyperlinksRevisionLog() { - IHyperlink[] links = TracHyperlinkUtil.findTracHyperlinks(repository, "r123:456", 0, 0); + IHyperlink[] links = findTracHyperlinks(repository, "r123:456", 0, 0); assertEquals(2, links.length); assertEquals("http://localhost/log/?rev=123&stop_rev=456", ((WebHyperlink) links[0]).getURLString()); assertEquals(new Region(0, 8), links[0].getHyperlinkRegion()); - links = TracHyperlinkUtil.findTracHyperlinks(repository, "[123:456]", 0, 0); + links = findTracHyperlinks(repository, "[123:456]", 0, 0); assertEquals(1, links.length); assertEquals("http://localhost/log/?rev=123&stop_rev=456", ((WebHyperlink) links[0]).getURLString()); assertEquals(new Region(0, 9), links[0].getHyperlinkRegion()); - links = TracHyperlinkUtil.findTracHyperlinks(repository, "log:@123:456", 0, 0); + links = findTracHyperlinks(repository, "log:@123:456", 0, 0); assertEquals(1, links.length); assertEquals("http://localhost/log/?rev=123&stop_rev=456", ((WebHyperlink) links[0]).getURLString()); assertEquals(new Region(0, 12), links[0].getHyperlinkRegion()); - links = TracHyperlinkUtil.findTracHyperlinks(repository, "log:trunk@123:456", 0, 0); + links = findTracHyperlinks(repository, "log:trunk@123:456", 0, 0); assertEquals(1, links.length); assertEquals("http://localhost/log/trunk?rev=123&stop_rev=456", ((WebHyperlink) links[0]).getURLString()); assertEquals(new Region(0, 17), links[0].getHyperlinkRegion()); } public void testFindHyperlinksDiff() { - IHyperlink[] links = TracHyperlinkUtil.findTracHyperlinks(repository, "diff:@123:456", 0, 0); + IHyperlink[] links = findTracHyperlinks(repository, "diff:@123:456", 0, 0); assertNotNull(links); assertEquals(1, links.length); assertEquals("http://localhost/changeset/?new=456&old=123", ((WebHyperlink) links[0]).getURLString()); - links = TracHyperlinkUtil.findTracHyperlinks(repository, - "diff:trunk/trac@3538//sandbox/vc-refactoring/trac@3539", 0, 0); + links = findTracHyperlinks(repository, "diff:trunk/trac@3538//sandbox/vc-refactoring/trac@3539", 0, 0); assertNotNull(links); assertEquals(1, links.length); assertEquals( "http://localhost/changeset/?new_path=sandbox%2Fvc-refactoring%2Ftrac&old_path=trunk%2Ftrac&new=3539&old=3538", ((WebHyperlink) links[0]).getURLString()); - links = TracHyperlinkUtil.findTracHyperlinks(repository, - "diff:tags/trac-0.9.2/wiki-default//tags/trac-0.9.3/wiki-default", 0, 0); + links = findTracHyperlinks(repository, "diff:tags/trac-0.9.2/wiki-default//tags/trac-0.9.3/wiki-default", 0, 0); assertNotNull(links); assertEquals(1, links.length); assertEquals( @@ -156,83 +154,88 @@ public class TracHyperlinkUtilTest extends TestCase { } public void testFindHyperlinksWiki() { - IHyperlink[] links = TracHyperlinkUtil.findTracHyperlinks(repository, "[wiki:page]", 1, 0); + IHyperlink[] links = findTracHyperlinks(repository, "[wiki:page]", 1, 0); assertNotNull(links); assertEquals(1, links.length); assertEquals("http://localhost/wiki/page", ((WebHyperlink) links[0]).getURLString()); - links = TracHyperlinkUtil.findTracHyperlinks(repository, "wiki:page", 0, 0); + links = findTracHyperlinks(repository, "wiki:page", 0, 0); assertNotNull(links); assertEquals(1, links.length); assertEquals("http://localhost/wiki/page", ((WebHyperlink) links[0]).getURLString()); - links = TracHyperlinkUtil.findTracHyperlinks(repository, "Page", 0, 0); + links = findTracHyperlinks(repository, "Page", 0, 0); assertNull(links); - links = TracHyperlinkUtil.findTracHyperlinks(repository, "!Page", 0, 0); + links = findTracHyperlinks(repository, "!Page", 0, 0); assertNull(links); - links = TracHyperlinkUtil.findTracHyperlinks(repository, "ab Page dc", 0, 0); + links = findTracHyperlinks(repository, "ab Page dc", 0, 0); assertNull(links); - links = TracHyperlinkUtil.findTracHyperlinks(repository, "paGe", 0, 0); + links = findTracHyperlinks(repository, "paGe", 0, 0); assertNull(links); - links = TracHyperlinkUtil.findTracHyperlinks(repository, "WikiPage", 0, 0); + links = findTracHyperlinks(repository, "WikiPage", 0, 0); assertNotNull(links); assertEquals(1, links.length); assertEquals("http://localhost/wiki/WikiPage", ((WebHyperlink) links[0]).getURLString()); assertEquals(new Region(0, 8), links[0].getHyperlinkRegion()); - links = TracHyperlinkUtil.findTracHyperlinks(repository, "!WikiPage", 0, 0); + links = findTracHyperlinks(repository, "!WikiPage", 0, 0); assertNull(links); - links = TracHyperlinkUtil.findTracHyperlinks(repository, "!WikiPage", 1, 0); + links = findTracHyperlinks(repository, "!WikiPage", 1, 0); assertNull(links); - links = TracHyperlinkUtil.findTracHyperlinks(repository, "a WikiPage is here", 4, 0); + links = findTracHyperlinks(repository, "a WikiPage is here", 4, 0); assertNotNull(links); assertEquals(1, links.length); assertEquals("http://localhost/wiki/WikiPage", ((WebHyperlink) links[0]).getURLString()); assertEquals(new Region(2, 8), links[0].getHyperlinkRegion()); - links = TracHyperlinkUtil.findTracHyperlinks(repository, "a !WikiPage is here", 4, 0); + links = findTracHyperlinks(repository, "a !WikiPage is here", 4, 0); assertNull(links); } public void testFindHyperlinksMilestone() { - IHyperlink[] links = TracHyperlinkUtil.findTracHyperlinks(repository, "milestone:1.0", 1, 0); + IHyperlink[] links = findTracHyperlinks(repository, "milestone:1.0", 1, 0); assertNotNull(links); assertEquals(1, links.length); assertEquals("http://localhost/milestone/1.0", ((WebHyperlink) links[0]).getURLString()); } public void testFindHyperlinksAttachment() { - IHyperlink[] links = TracHyperlinkUtil.findTracHyperlinks(repository, "attachment:ticket:123:foo.bar", 1, 0); + IHyperlink[] links = findTracHyperlinks(repository, "attachment:ticket:123:foo.bar", 1, 0); assertNotNull(links); assertEquals("123", ((TaskHyperlink) links[0]).getTaskId()); } public void testFindHyperlinksFiles() { - IHyperlink[] links = TracHyperlinkUtil.findTracHyperlinks(repository, "source:trunk/foo", 1, 0); + IHyperlink[] links = findTracHyperlinks(repository, "source:trunk/foo", 1, 0); assertNotNull(links); assertEquals(1, links.length); assertEquals("http://localhost/browser/trunk/foo", ((WebHyperlink) links[0]).getURLString()); - links = TracHyperlinkUtil.findTracHyperlinks(repository, "source:trunk/foo@123", 1, 0); + links = findTracHyperlinks(repository, "source:trunk/foo@123", 1, 0); assertNotNull(links); assertEquals(1, links.length); assertEquals("http://localhost/browser/trunk/foo?rev=123", ((WebHyperlink) links[0]).getURLString()); - links = TracHyperlinkUtil.findTracHyperlinks(repository, "source:trunk/foo@123#L456", 1, 0); + links = findTracHyperlinks(repository, "source:trunk/foo@123#L456", 1, 0); assertNotNull(links); assertEquals(1, links.length); assertEquals("http://localhost/browser/trunk/foo?rev=123#L456", ((WebHyperlink) links[0]).getURLString()); - links = TracHyperlinkUtil.findTracHyperlinks(repository, "source:/tags/foo_bar-1.1", 1, 0); + links = findTracHyperlinks(repository, "source:/tags/foo_bar-1.1", 1, 0); assertNotNull(links); assertEquals(1, links.length); assertEquals("http://localhost/browser/tags/foo_bar-1.1", ((WebHyperlink) links[0]).getURLString()); } + private IHyperlink[] findTracHyperlinks(TaskRepository repository, String text, int offsetInText, int textOffset) { + List<IHyperlink> links = TracHyperlinkUtil.findTracHyperlinks(repository, text, offsetInText, textOffset); + return (links.isEmpty()) ? null : links.toArray(new IHyperlink[0]); + } + } diff --git a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/TracHyperlinkDetector.java b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/TracHyperlinkDetector.java index 529838bc4..30787dd7b 100644 --- a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/TracHyperlinkDetector.java +++ b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/TracHyperlinkDetector.java @@ -1,5 +1,5 @@ /******************************************************************************* -* Copyright (c) 2006, 2008 Steffen Pingel and others. + * Copyright (c) 2006, 2008 Steffen Pingel 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 @@ -11,42 +11,27 @@ package org.eclipse.mylyn.internal.trac.ui; -import org.eclipse.jface.text.BadLocationException; -import org.eclipse.jface.text.IDocument; -import org.eclipse.jface.text.IRegion; +import java.util.List; + import org.eclipse.jface.text.ITextViewer; -import org.eclipse.jface.text.hyperlink.AbstractHyperlinkDetector; import org.eclipse.jface.text.hyperlink.IHyperlink; import org.eclipse.mylyn.internal.trac.core.TracCorePlugin; import org.eclipse.mylyn.tasks.core.TaskRepository; +import org.eclipse.mylyn.tasks.ui.AbstractTaskHyperlinkDetector; /** * @author Steffen Pingel */ -public class TracHyperlinkDetector extends AbstractHyperlinkDetector { +public class TracHyperlinkDetector extends AbstractTaskHyperlinkDetector { public TracHyperlinkDetector() { } - public IHyperlink[] detectHyperlinks(ITextViewer textViewer, IRegion region, boolean canShowMultipleHyperlinks) { - TaskRepository taskRepository = (TaskRepository) getAdapter(TaskRepository.class); + @Override + protected List<IHyperlink> detectHyperlinks(ITextViewer textViewer, String content, int contentOffset, int index) { + TaskRepository taskRepository = getTaskRepository(textViewer); if (taskRepository != null && TracCorePlugin.CONNECTOR_KIND.equals(taskRepository.getConnectorKind())) { - 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; - } - - return TracHyperlinkUtil.findTracHyperlinks(taskRepository, line, - region.getOffset() - lineInfo.getOffset(), lineInfo.getOffset()); + return TracHyperlinkUtil.findTracHyperlinks(taskRepository, content, index, contentOffset); } return null; } diff --git a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/TracHyperlinkUtil.java b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/TracHyperlinkUtil.java index 076a9a25e..665ca61df 100644 --- a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/TracHyperlinkUtil.java +++ b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/TracHyperlinkUtil.java @@ -1,5 +1,5 @@ /******************************************************************************* -* Copyright (c) 2006, 2008 Steffen Pingel and others. + * Copyright (c) 2006, 2008 Steffen Pingel 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 @@ -112,70 +112,70 @@ public class TracHyperlinkUtil { * * @see http://trac.edgewall.org/wiki/TracLinks */ - public static IHyperlink[] findTracHyperlinks(TaskRepository repository, String text, int lineOffset, - int regionOffset) { + public static List<IHyperlink> findTracHyperlinks(TaskRepository repository, String text, int offsetInText, + int textOffset) { List<IHyperlink> links = new ArrayList<IHyperlink>(); Matcher m = ticketPattern.matcher(text); while (m.find()) { - if (isInRegion(lineOffset, m)) { + if (isInRegion(offsetInText, m)) { String id = m.group(2); - links.add(new TaskHyperlink(determineRegion(regionOffset, m), repository, id)); + links.add(new TaskHyperlink(determineRegion(textOffset, m), repository, id)); } } m = commentPattern.matcher(text); while (m.find()) { - if (isInRegion(lineOffset, m)) { + if (isInRegion(offsetInText, m)) { String id = m.group(1); // String comment = m.group(2); - links.add(new TaskHyperlink(determineRegion(regionOffset, m), repository, id)); + links.add(new TaskHyperlink(determineRegion(textOffset, m), repository, id)); } } m = reportPattern1.matcher(text); while (m.find()) { - if (isInRegion(lineOffset, m)) { + if (isInRegion(offsetInText, m)) { String id = m.group(1); - links.add(new WebHyperlink(determineRegion(regionOffset, m), repository.getRepositoryUrl() + links.add(new WebHyperlink(determineRegion(textOffset, m), repository.getRepositoryUrl() + ITracClient.REPORT_URL + id)); } } m = reportPattern2.matcher(text); while (m.find()) { - if (isInRegion(lineOffset, m)) { + if (isInRegion(offsetInText, m)) { String id = m.group(1); - links.add(new WebHyperlink(determineRegion(regionOffset, m), repository.getRepositoryUrl() + links.add(new WebHyperlink(determineRegion(textOffset, m), repository.getRepositoryUrl() + ITracClient.REPORT_URL + id)); } } m = revisionLogPattern1.matcher(text); while (m.find()) { - if (isInRegion(lineOffset, m)) { + if (isInRegion(offsetInText, m)) { String rev = m.group(1); String stopRev = m.group(2); String url = repository.getRepositoryUrl() + ITracClient.REVISION_LOG_URL + "?rev=" + rev + "&stop_rev=" + stopRev; - links.add(new WebHyperlink(determineRegion(regionOffset, m), url)); + links.add(new WebHyperlink(determineRegion(textOffset, m), url)); } } m = revisionLogPattern2.matcher(text); while (m.find()) { - if (isInRegion(lineOffset, m)) { + if (isInRegion(offsetInText, m)) { String rev = m.group(1); String stopRev = m.group(2); String url = repository.getRepositoryUrl() + ITracClient.REVISION_LOG_URL + "?rev=" + rev + "&stop_rev=" + stopRev; - links.add(new WebHyperlink(determineRegion(regionOffset, m), url)); + links.add(new WebHyperlink(determineRegion(textOffset, m), url)); } } m = revisionLogPattern3.matcher(text); while (m.find()) { - if (isInRegion(lineOffset, m)) { + if (isInRegion(offsetInText, m)) { String branch = m.group(1); String rev = m.group(2); String stopRev = m.group(3); @@ -184,50 +184,50 @@ public class TracHyperlinkUtil { url += branch; } url += "?rev=" + rev + "&stop_rev=" + stopRev; - links.add(new WebHyperlink(determineRegion(regionOffset, m), url)); + links.add(new WebHyperlink(determineRegion(textOffset, m), url)); } } m = changesetPattern1.matcher(text); while (m.find()) { - if (isInRegion(lineOffset, m)) { + if (isInRegion(offsetInText, m)) { String rev = m.group(2); String branch = m.group(3); String url = repository.getRepositoryUrl() + ITracClient.CHANGESET_URL + rev; if (branch != null) { url += branch; } - links.add(new WebHyperlink(determineRegion(regionOffset, m), url)); + links.add(new WebHyperlink(determineRegion(textOffset, m), url)); } } m = changesetPattern2.matcher(text); while (m.find()) { - if (isInRegion(lineOffset, m)) { + if (isInRegion(offsetInText, m)) { String rev = m.group(1); String branch = m.group(2); String url = repository.getRepositoryUrl() + ITracClient.CHANGESET_URL + rev; if (branch != null) { url += branch; } - links.add(new WebHyperlink(determineRegion(regionOffset, m), url)); + links.add(new WebHyperlink(determineRegion(textOffset, m), url)); } } m = diffPattern1.matcher(text); while (m.find()) { - if (isInRegion(lineOffset, m)) { + if (isInRegion(offsetInText, m)) { String old_rev = m.group(1); String new_rev = m.group(2); String url = repository.getRepositoryUrl() + ITracClient.CHANGESET_URL; url += "?new=" + new_rev + "&old=" + old_rev; - links.add(new WebHyperlink(determineRegion(regionOffset, m), url)); + links.add(new WebHyperlink(determineRegion(textOffset, m), url)); } } m = diffPattern2.matcher(text); while (m.find()) { - if (isInRegion(lineOffset, m)) { + if (isInRegion(offsetInText, m)) { String old_path = m.group(1); String old_rev = m.group(3); String new_path = m.group(4); @@ -246,49 +246,49 @@ public class TracHyperlinkUtil { if (old_rev != null) { url += "&old=" + old_rev; } - links.add(new WebHyperlink(determineRegion(regionOffset, m), url)); + links.add(new WebHyperlink(determineRegion(textOffset, m), url)); } } m = wikiPattern1.matcher(text); while (m.find()) { - if (isInRegion(lineOffset, m)) { + if (isInRegion(offsetInText, m)) { String page = m.group(1); - links.add(new WebHyperlink(determineRegion(regionOffset, m), repository.getRepositoryUrl() + links.add(new WebHyperlink(determineRegion(textOffset, m), repository.getRepositoryUrl() + ITracClient.WIKI_URL + page)); } } m = wikiPattern2.matcher(text); while (m.find()) { - if (isInRegion(lineOffset, m)) { + if (isInRegion(offsetInText, m)) { String page = m.group(0); - links.add(new WebHyperlink(determineRegion(regionOffset, m), repository.getRepositoryUrl() + links.add(new WebHyperlink(determineRegion(textOffset, m), repository.getRepositoryUrl() + ITracClient.WIKI_URL + page)); } } m = milestonePattern.matcher(text); while (m.find()) { - if (isInRegion(lineOffset, m)) { + if (isInRegion(offsetInText, m)) { String milestone = m.group(1); - links.add(new WebHyperlink(determineRegion(regionOffset, m), repository.getRepositoryUrl() + links.add(new WebHyperlink(determineRegion(textOffset, m), repository.getRepositoryUrl() + ITracClient.MILESTONE_URL + milestone)); } } m = attachmentPattern.matcher(text); while (m.find()) { - if (isInRegion(lineOffset, m)) { + if (isInRegion(offsetInText, m)) { String id = m.group(1); // String attachment = m.group(2); - links.add(new TaskHyperlink(determineRegion(regionOffset, m), repository, id)); + links.add(new TaskHyperlink(determineRegion(textOffset, m), repository, id)); } } m = filesPattern.matcher(text); while (m.find()) { - if (isInRegion(lineOffset, m)) { + if (isInRegion(offsetInText, m)) { String filename = m.group(1); String rev = m.group(3); String line = m.group(5); @@ -299,19 +299,19 @@ public class TracHyperlinkUtil { url += "#L" + line; } } - links.add(new WebHyperlink(determineRegion(regionOffset, m), url)); + links.add(new WebHyperlink(determineRegion(textOffset, m), url)); } } - return links.isEmpty() ? null : links.toArray(new IHyperlink[0]); + return links; } - private static boolean isInRegion(int lineOffset, Matcher m) { - return (lineOffset >= m.start() && lineOffset <= m.end()); + private static boolean isInRegion(int offsetInText, Matcher m) { + return (offsetInText == -1) || (offsetInText >= m.start() && offsetInText <= m.end()); } - private static IRegion determineRegion(int regionOffset, Matcher m) { - return new Region(regionOffset + m.start(), m.end() - m.start()); + private static IRegion determineRegion(int textOffset, Matcher m) { + return new Region(textOffset + m.start(), m.end() - m.start()); } } |