diff options
author | Sam Davis | 2012-01-09 18:05:59 +0000 |
---|---|---|
committer | Steffen Pingel | 2012-01-11 12:33:53 +0000 |
commit | 336f105831d7b57aca93db036ad906ea45e38216 (patch) | |
tree | 3e1765d3daf4f976baef732530ddc8144e301c1f /org.eclipse.mylyn.tasks.ui | |
parent | 53dd145cc529445f0ba9e3ef3a59d241d840469e (diff) | |
download | org.eclipse.mylyn.tasks-336f105831d7b57aca93db036ad906ea45e38216.tar.gz org.eclipse.mylyn.tasks-336f105831d7b57aca93db036ad906ea45e38216.tar.xz org.eclipse.mylyn.tasks-336f105831d7b57aca93db036ad906ea45e38216.zip |
NEW - bug 364999: [patch] User can select repository when clicking a
task hyperlinks in the task editor
https://bugs.eclipse.org/bugs/show_bug.cgi?id=364999
Change-Id: I08ace7988d16a40d2b4bb57fdb5b3509b635a78b
Diffstat (limited to 'org.eclipse.mylyn.tasks.ui')
3 files changed, 107 insertions, 21 deletions
diff --git a/org.eclipse.mylyn.tasks.ui/plugin.xml b/org.eclipse.mylyn.tasks.ui/plugin.xml index 0e69c4667..0b0dfdae6 100644 --- a/org.eclipse.mylyn.tasks.ui/plugin.xml +++ b/org.eclipse.mylyn.tasks.ui/plugin.xml @@ -1078,6 +1078,13 @@ name="%TaskHyperlinkDetector.name" targetId="org.eclipse.ui.DefaultTextEditor"> </hyperlinkDetector> + <hyperlinkDetector + class="org.eclipse.mylyn.internal.tasks.ui.editors.MultipleTaskHyperlinkDetector" + id="org.eclipse.mylyn.tasks.ui.hyperlinks.detectors.task.multiple" + name="%TaskHyperlinkDetector.name" + modifierKeys="Ctrl" + targetId="org.eclipse.mylyn.tasks.ui.TaskEditor"> + </hyperlinkDetector> <hyperlinkDetector class="org.eclipse.mylyn.internal.tasks.ui.editors.TaskUrlHyperlinkDetector" description="%TaskUrlHyperlinkDetector.description" diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/MultipleTaskHyperlinkDetector.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/MultipleTaskHyperlinkDetector.java new file mode 100644 index 000000000..39011475c --- /dev/null +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/MultipleTaskHyperlinkDetector.java @@ -0,0 +1,75 @@ +/******************************************************************************* + * Copyright (c) 2012 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 + *******************************************************************************/ + +package org.eclipse.mylyn.internal.tasks.ui.editors; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +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.TasksUi; + +/** + * @author Sam Davis + */ +public class MultipleTaskHyperlinkDetector extends TaskHyperlinkDetector { + + @Override + protected List<IHyperlink> detectHyperlinks(ITextViewer textViewer, String content, int index, int contentOffset) { + List<IHyperlink> result = new ArrayList<IHyperlink>(); + TaskRepository currentRepository = getTaskRepository(textViewer); + final IHyperlink[] currentRepositoryLinks = detectHyperlinks(currentRepository, content, index, contentOffset); + if (currentRepositoryLinks != null && currentRepositoryLinks.length > 0) { + result.addAll(Arrays.asList(currentRepositoryLinks)); + Set<Region> currentRepositoryRegions = new HashSet<Region>(); + for (IHyperlink link : currentRepositoryLinks) { + currentRepositoryRegions.add(getRegion(link)); + } + List<TaskRepository> otherRepositories = getTaskRepositories(textViewer); + otherRepositories.remove(currentRepository); + for (final TaskRepository repository : otherRepositories) { + final IHyperlink[] links = detectHyperlinks(repository, content, index, contentOffset); + if (links != null) { + for (IHyperlink link : links) { + // prevent highlighting text that is not already a link for the current repository + if (currentRepositoryRegions.contains(getRegion(link))) { + result.add(link); + } + } + } + } + } + if (result.isEmpty()) { + return null; + } + return result; + } + + protected Region getRegion(IHyperlink link) { + if (link.getHyperlinkRegion() instanceof Region) { + return (Region) link.getHyperlinkRegion(); + } else { + return new Region(link.getHyperlinkRegion().getOffset(), link.getHyperlinkRegion().getLength()); + } + } + + @Override + protected List<TaskRepository> getTaskRepositories(ITextViewer textViewer) { + return TasksUi.getRepositoryManager().getAllRepositories(); + } + +} 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 849a3459e..d971b5843 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 @@ -35,32 +35,36 @@ public class TaskHyperlinkDetector extends AbstractTaskHyperlinkDetector { @Override protected List<IHyperlink> detectHyperlinks(ITextViewer textViewer, final String content, final int index, final int contentOffset) { - List<IHyperlink> result = null; + List<IHyperlink> result = new ArrayList<IHyperlink>(); for (final TaskRepository repository : getTaskRepositories(textViewer)) { - final AbstractRepositoryConnectorUi connectorUi = getConnectorUi(repository); - if (connectorUi == null) { - continue; + final IHyperlink[] links = detectHyperlinks(repository, content, index, contentOffset); + if (links != null && links.length > 0) { + result.addAll(Arrays.asList(links)); } - final IHyperlink[][] links = new IHyperlink[1][]; - SafeRunnable.run(new ISafeRunnable() { - - public void handleException(Throwable exception) { - } + } + if (result.isEmpty()) { + return null; + } + return result; + } - public void run() throws Exception { - final ITask task = (ITask) getAdapter(ITask.class); - links[0] = connectorUi.findHyperlinks(repository, task, content, index, contentOffset); - } + protected IHyperlink[] detectHyperlinks(final TaskRepository repository, final String content, final int index, + final int contentOffset) { + final AbstractRepositoryConnectorUi connectorUi = getConnectorUi(repository); + if (connectorUi == null) { + return null; + } + final IHyperlink[][] links = new IHyperlink[1][]; + SafeRunnable.run(new ISafeRunnable() { + public void handleException(Throwable exception) { + } - }); - if (links[0] != null && links[0].length > 0) { - if (result == null) { - result = new ArrayList<IHyperlink>(); - } - result.addAll(Arrays.asList(links[0])); + public void run() throws Exception { + final ITask task = (ITask) getAdapter(ITask.class); + links[0] = connectorUi.findHyperlinks(repository, task, content, index, contentOffset); } - } - return result; + }); + return links[0]; } protected AbstractRepositoryConnectorUi getConnectorUi(TaskRepository repository) { |