### Eclipse Workspace Patch 1.0 #P org.eclipse.mylyn.bugzilla.tests Index: src/org/eclipse/mylyn/bugzilla/tests/ui/BugzillaTaskHyperlinkDetectorTest.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/ui/BugzillaTaskHyperlinkDetectorTest.java,v retrieving revision 1.6 diff -u -r1.6 BugzillaTaskHyperlinkDetectorTest.java --- src/org/eclipse/mylyn/bugzilla/tests/ui/BugzillaTaskHyperlinkDetectorTest.java 3 Mar 2010 21:32:08 -0000 1.6 +++ src/org/eclipse/mylyn/bugzilla/tests/ui/BugzillaTaskHyperlinkDetectorTest.java 20 May 2010 04:16:01 -0000 @@ -19,12 +19,14 @@ import org.eclipse.jface.text.TextViewer; import org.eclipse.jface.text.hyperlink.IHyperlink; import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin; +import org.eclipse.mylyn.internal.tasks.core.AbstractTask; import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager; import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin; import org.eclipse.mylyn.internal.tasks.ui.editors.TaskHyperlinkDetector; import org.eclipse.mylyn.tasks.core.TaskRepository; import org.eclipse.mylyn.tasks.core.data.TaskAttribute; import org.eclipse.mylyn.tasks.ui.TaskHyperlink; +import org.eclipse.mylyn.tasks.ui.TasksUi; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Shell; @@ -44,73 +46,98 @@ private static final String ATTACHMENT_NEW = "Created attachment" + ATTACHMENT_NUMBER; - private final String TASK_FORMAT_1 = "task#1"; + private final String TASK_FORMAT_1 = "task#123"; - private final String TASK_FORMAT_2 = "task# 1"; + private final String TASK_FORMAT_2 = "task# 123"; - private final String TASK_FORMAT_3 = "task1"; + private final String TASK_FORMAT_3 = "task123"; - private final String TASK_FORMAT_4 = "task #1"; + private final String TASK_FORMAT_4 = "task #123"; - private final String BUG_FORMAT_1 = "bug# 1"; + private final String BUG_FORMAT_1 = "bug# 123"; - private final String BUG_FORMAT_2 = "bug # 1"; + private final String BUG_FORMAT_2 = "bug # 123"; - private final String BUG_FORMAT_3 = "bug1"; + private final String BUG_FORMAT_3 = "bug123"; - private final String BUG_FORMAT_4 = "bug #1"; + private final String BUG_FORMAT_4 = "bug #123"; private final String BUG_FORMAT_1_2 = "bug# 2"; private final String TASK_FORMAT_1_COMMENT_1 = "task#123c#44556677"; - private final String TASK_FORMAT_2_COMMENT_1 = "task# 1c#44556677"; + private final String TASK_FORMAT_2_COMMENT_1 = "task# 123c#44556677"; - private final String TASK_FORMAT_3_COMMENT_1 = "task1c#44556677"; + private final String TASK_FORMAT_3_COMMENT_1 = "task123c#44556677"; - private final String TASK_FORMAT_4_COMMENT_1 = "task #1c#44556677"; + private final String TASK_FORMAT_4_COMMENT_1 = "task #123c#44556677"; - private final String BUG_FORMAT_1_COMMENT_1 = "bug# 1c#44556677"; + private final String BUG_FORMAT_1_COMMENT_1 = "bug# 123c#44556677"; - private final String BUG_FORMAT_2_COMMENT_1 = "bug # 1c#44556677"; + private final String BUG_FORMAT_2_COMMENT_1 = "bug # 123c#44556677"; - private final String BUG_FORMAT_3_COMMENT_1 = "bug1c#44556677"; + private final String BUG_FORMAT_3_COMMENT_1 = "bug123c#44556677"; - private final String BUG_FORMAT_4_COMMENT_1 = "bug #1c#44556677"; + private final String BUG_FORMAT_4_COMMENT_1 = "bug #123c#44556677"; private final String TASK_FORMAT_1_COMMENT_2 = "task#123 comment #44556677"; - private final String TASK_FORMAT_2_COMMENT_2 = "task# 1 comment #44556677"; + private final String TASK_FORMAT_2_COMMENT_2 = "task# 123 comment #44556677"; - private final String TASK_FORMAT_3_COMMENT_2 = "task1 comment #44556677"; + private final String TASK_FORMAT_3_COMMENT_2 = "task123 comment #44556677"; - private final String TASK_FORMAT_4_COMMENT_2 = "task #1 comment #44556677"; + private final String TASK_FORMAT_4_COMMENT_2 = "task #123 comment #44556677"; - private final String BUG_FORMAT_1_COMMENT_2 = "bug# 1 comment #44556677"; + private final String BUG_FORMAT_1_COMMENT_2 = "bug# 123 comment #44556677"; - private final String BUG_FORMAT_2_COMMENT_2 = "bug # 1 comment #44556677"; + private final String BUG_FORMAT_2_COMMENT_2 = "bug # 123 comment #44556677"; - private final String BUG_FORMAT_3_COMMENT_2 = "bug1 comment #44556677"; + private final String BUG_FORMAT_3_COMMENT_2 = "bug123 comment #44556677"; - private final String BUG_FORMAT_4_COMMENT_2 = "bug #1 comment #44556677"; + private final String BUG_FORMAT_4_COMMENT_2 = "bug #123 comment #44556677"; private final String TASK_FORMAT_1_COMMENT_3 = "task#123 comment#44556677"; - private final String TASK_FORMAT_2_COMMENT_3 = "task# 1 comment#44556677"; + private final String TASK_FORMAT_2_COMMENT_3 = "task# 123 comment#44556677"; - private final String TASK_FORMAT_3_COMMENT_3 = "task1 comment#44556677"; + private final String TASK_FORMAT_3_COMMENT_3 = "task123 comment#44556677"; - private final String TASK_FORMAT_4_COMMENT_3 = "task #1 comment#44556677"; + private final String TASK_FORMAT_4_COMMENT_3 = "task #123 comment#44556677"; - private final String BUG_FORMAT_1_COMMENT_3 = "bug# 1 comment#44556677"; + private final String BUG_FORMAT_1_COMMENT_3 = "bug# 123 comment#44556677"; - private final String BUG_FORMAT_2_COMMENT_3 = "bug # 1 comment#44556677"; + private final String BUG_FORMAT_2_COMMENT_3 = "bug # 123 comment#44556677"; - private final String BUG_FORMAT_3_COMMENT_3 = "bug1 comment#44556677"; + private final String BUG_FORMAT_3_COMMENT_3 = "bug123 comment#44556677"; - private final String BUG_FORMAT_4_COMMENT_3 = "bug #1 comment#44556677"; + private final String BUG_FORMAT_4_COMMENT_3 = "bug #123 comment#44556677"; + + private final String TASK_FORMAT_1_COMMENT_4 = "task#123 comment # 44556677"; + + private final String TASK_FORMAT_2_COMMENT_4 = "task# 123 comment # 44556677"; + + private final String TASK_FORMAT_3_COMMENT_4 = "task123 comment # 44556677"; + + private final String TASK_FORMAT_4_COMMENT_4 = "task #123 comment # 44556677"; + + private final String BUG_FORMAT_1_COMMENT_4 = "bug# 123 comment # 44556677"; + + private final String BUG_FORMAT_2_COMMENT_4 = "bug # 123 comment # 44556677"; + + private final String BUG_FORMAT_3_COMMENT_4 = "bug123 comment # 44556677"; + + private final String BUG_FORMAT_4_COMMENT_4 = "bug #123 comment # 44556677"; + + private final String COMMENT_1 = "comment#44556677"; + + private final String COMMENT_2 = "comment #44556677"; + + private final String COMMENT_3 = "comment # 44556677"; + + private final String COMMENT_4 = "comment# 44556677"; + + private final String COMMENT_5 = "comment 44556677"; - //private BugzillaTaskHyperlinkDetector detector = new BugzillaTaskHyperlinkDetector(); private TaskHyperlinkDetector detector; private TaskRepository repository1; @@ -119,16 +146,20 @@ private TextViewer viewer; - private String[] formats; - private String[] commentFormats; + private String[] bugFormats; + + private String[] bugCommentFormats; + private TaskRepositoryManager repositoryManager; private Shell shell; protected TaskRepository activeRepository; + protected AbstractTask task; + @Override protected void setUp() throws Exception { super.setUp(); @@ -137,11 +168,16 @@ repository1 = new TaskRepository(BugzillaCorePlugin.CONNECTOR_KIND, "repository_url1"); repository2 = new TaskRepository(BugzillaCorePlugin.CONNECTOR_KIND, "repository_url2"); - + task = (AbstractTask) TasksUi.getRepositoryModel().createTask(repository1, "123"); detector.setContext(new IAdaptable() { @SuppressWarnings("rawtypes") public Object getAdapter(Class adapter) { - return (adapter == TaskRepository.class) ? activeRepository : null; + if (adapter == TaskRepository.class) { + return activeRepository; + } else if (adapter == AbstractTask.class) { + return task; + } + return null; } }); setRepository(repository1); @@ -152,15 +188,18 @@ repositoryManager = TasksUiPlugin.getRepositoryManager(); repositoryManager.clearRepositories(TasksUiPlugin.getDefault().getRepositoriesFilePath()); - formats = new String[] { TASK_FORMAT_1, TASK_FORMAT_2, TASK_FORMAT_3, TASK_FORMAT_4, BUG_FORMAT_1, + commentFormats = new String[] { COMMENT_1, COMMENT_2, COMMENT_3, COMMENT_4 }; + bugFormats = new String[] { TASK_FORMAT_1, TASK_FORMAT_2, TASK_FORMAT_3, TASK_FORMAT_4, BUG_FORMAT_1, BUG_FORMAT_2, BUG_FORMAT_3, BUG_FORMAT_4 }; - commentFormats = new String[] { TASK_FORMAT_1_COMMENT_1, TASK_FORMAT_2_COMMENT_1, TASK_FORMAT_3_COMMENT_1, + bugCommentFormats = new String[] { TASK_FORMAT_1_COMMENT_1, TASK_FORMAT_2_COMMENT_1, TASK_FORMAT_3_COMMENT_1, TASK_FORMAT_4_COMMENT_1, BUG_FORMAT_1_COMMENT_1, BUG_FORMAT_2_COMMENT_1, BUG_FORMAT_3_COMMENT_1, BUG_FORMAT_4_COMMENT_1, TASK_FORMAT_1_COMMENT_2, TASK_FORMAT_2_COMMENT_2, TASK_FORMAT_3_COMMENT_2, TASK_FORMAT_4_COMMENT_2, BUG_FORMAT_1_COMMENT_2, BUG_FORMAT_2_COMMENT_2, BUG_FORMAT_3_COMMENT_2, BUG_FORMAT_4_COMMENT_2, TASK_FORMAT_1_COMMENT_3, TASK_FORMAT_2_COMMENT_3, TASK_FORMAT_3_COMMENT_3, TASK_FORMAT_4_COMMENT_3, BUG_FORMAT_1_COMMENT_3, BUG_FORMAT_2_COMMENT_3, BUG_FORMAT_3_COMMENT_3, - BUG_FORMAT_4_COMMENT_3 }; + BUG_FORMAT_4_COMMENT_3, TASK_FORMAT_1_COMMENT_4, TASK_FORMAT_2_COMMENT_4, TASK_FORMAT_3_COMMENT_4, + TASK_FORMAT_4_COMMENT_4, BUG_FORMAT_1_COMMENT_4, BUG_FORMAT_2_COMMENT_4, BUG_FORMAT_3_COMMENT_4, + BUG_FORMAT_4_COMMENT_4 }; } private void setRepository(final TaskRepository repository) { @@ -178,17 +217,35 @@ } public void testBeginningWithSpecialChars() { - for (String format : formats) { + for (String format : bugFormats) { String testString = "First line\n:" + format + " is at the beginning"; viewer.setDocument(new Document(testString)); Region region = new Region(0, testString.length()); IHyperlink[] links = detector.detectHyperlinks(viewer, region, false); assertNotNull(links); assertEquals(1, links.length); - assertEquals(testString.indexOf(format), links[0].getHyperlinkRegion().getOffset()); - Object comment = ((TaskHyperlink) links[0]).getSelection(); + assertTrue(links[0] instanceof TaskHyperlink); + TaskHyperlink taskLink = (TaskHyperlink) links[0]; + assertEquals("123", taskLink.getTaskId()); + assertEquals(testString.indexOf(format), taskLink.getHyperlinkRegion().getOffset()); + Object comment = taskLink.getSelection(); assertNull(comment); } + for (String format : bugCommentFormats) { + String testString = "First line\n:" + format + " is at the beginning"; + viewer.setDocument(new Document(testString)); + Region region = new Region(0, testString.length()); + IHyperlink[] links = detector.detectHyperlinks(viewer, region, false); + assertNotNull(links); + assertEquals(1, links.length); + assertTrue(links[0] instanceof TaskHyperlink); + TaskHyperlink taskLink = (TaskHyperlink) links[0]; + assertEquals("123", taskLink.getTaskId()); + assertEquals(testString.indexOf(format), taskLink.getHyperlinkRegion().getOffset()); + Object comment = taskLink.getSelection(); + assertNotNull(comment); + assertEquals(TaskAttribute.PREFIX_COMMENT + "44556677", comment); + } for (String format : commentFormats) { String testString = "First line\n:" + format + " is at the beginning"; viewer.setDocument(new Document(testString)); @@ -196,25 +253,46 @@ IHyperlink[] links = detector.detectHyperlinks(viewer, region, false); assertNotNull(links); assertEquals(1, links.length); - assertEquals(testString.indexOf(format), links[0].getHyperlinkRegion().getOffset()); - Object comment = ((TaskHyperlink) links[0]).getSelection(); + assertTrue(links[0] instanceof TaskHyperlink); + TaskHyperlink taskLink = (TaskHyperlink) links[0]; + assertEquals("123", taskLink.getTaskId()); + assertEquals(testString.indexOf(format), taskLink.getHyperlinkRegion().getOffset()); + Object comment = taskLink.getSelection(); assertNotNull(comment); assertEquals(TaskAttribute.PREFIX_COMMENT + "44556677", comment); } } public void testBeginningOfSecondLine() { - for (String format : formats) { + for (String format : bugFormats) { String testString = "First line\n" + format + " is at the beginning"; viewer.setDocument(new Document(testString)); Region region = new Region(0, testString.length()); IHyperlink[] links = detector.detectHyperlinks(viewer, region, false); assertNotNull(links); assertEquals(1, links.length); - assertEquals(testString.indexOf(format), links[0].getHyperlinkRegion().getOffset()); - Object comment = ((TaskHyperlink) links[0]).getSelection(); + assertTrue(links[0] instanceof TaskHyperlink); + TaskHyperlink taskLink = (TaskHyperlink) links[0]; + assertEquals("123", taskLink.getTaskId()); + assertEquals(testString.indexOf(format), taskLink.getHyperlinkRegion().getOffset()); + Object comment = taskLink.getSelection(); assertNull(comment); } + for (String format : bugCommentFormats) { + String testString = "First line\n" + format + " is at the beginning"; + viewer.setDocument(new Document(testString)); + Region region = new Region(0, testString.length()); + IHyperlink[] links = detector.detectHyperlinks(viewer, region, false); + assertNotNull(links); + assertEquals(1, links.length); + assertTrue(links[0] instanceof TaskHyperlink); + TaskHyperlink taskLink = (TaskHyperlink) links[0]; + assertEquals("123", taskLink.getTaskId()); + assertEquals(testString.indexOf(format), taskLink.getHyperlinkRegion().getOffset()); + Object comment = taskLink.getSelection(); + assertNotNull(comment); + assertEquals(TaskAttribute.PREFIX_COMMENT + "44556677", comment); + } for (String format : commentFormats) { String testString = "First line\n" + format + " is at the beginning"; viewer.setDocument(new Document(testString)); @@ -222,25 +300,46 @@ IHyperlink[] links = detector.detectHyperlinks(viewer, region, false); assertNotNull(links); assertEquals(1, links.length); - assertEquals(testString.indexOf(format), links[0].getHyperlinkRegion().getOffset()); - Object comment = ((TaskHyperlink) links[0]).getSelection(); + assertTrue(links[0] instanceof TaskHyperlink); + TaskHyperlink taskLink = (TaskHyperlink) links[0]; + assertEquals("123", taskLink.getTaskId()); + assertEquals(testString.indexOf(format), taskLink.getHyperlinkRegion().getOffset()); + Object comment = taskLink.getSelection(); assertNotNull(comment); assertEquals(TaskAttribute.PREFIX_COMMENT + "44556677", comment); } } public void testBeginningOfSecondLineWithisWhitespace() { - for (String format : formats) { + for (String format : bugFormats) { String testString = "First line\n \t " + format + " is at the beginning"; viewer.setDocument(new Document(testString)); Region region = new Region(0, testString.length()); IHyperlink[] links = detector.detectHyperlinks(viewer, region, false); assertNotNull(links); assertEquals(1, links.length); - assertEquals(testString.indexOf(format), links[0].getHyperlinkRegion().getOffset()); - Object comment = ((TaskHyperlink) links[0]).getSelection(); + assertTrue(links[0] instanceof TaskHyperlink); + TaskHyperlink taskLink = (TaskHyperlink) links[0]; + assertEquals("123", taskLink.getTaskId()); + assertEquals(testString.indexOf(format), taskLink.getHyperlinkRegion().getOffset()); + Object comment = taskLink.getSelection(); assertNull(comment); } + for (String format : bugCommentFormats) { + String testString = "First line\n \t " + format + " is at the beginning"; + viewer.setDocument(new Document(testString)); + Region region = new Region(0, testString.length()); + IHyperlink[] links = detector.detectHyperlinks(viewer, region, false); + assertNotNull(links); + assertEquals(1, links.length); + assertTrue(links[0] instanceof TaskHyperlink); + TaskHyperlink taskLink = (TaskHyperlink) links[0]; + assertEquals("123", taskLink.getTaskId()); + assertEquals(testString.indexOf(format), taskLink.getHyperlinkRegion().getOffset()); + Object comment = taskLink.getSelection(); + assertNotNull(comment); + assertEquals(TaskAttribute.PREFIX_COMMENT + "44556677", comment); + } for (String format : commentFormats) { String testString = "First line\n \t " + format + " is at the beginning"; viewer.setDocument(new Document(testString)); @@ -248,25 +347,46 @@ IHyperlink[] links = detector.detectHyperlinks(viewer, region, false); assertNotNull(links); assertEquals(1, links.length); - assertEquals(testString.indexOf(format), links[0].getHyperlinkRegion().getOffset()); - Object comment = ((TaskHyperlink) links[0]).getSelection(); + assertTrue(links[0] instanceof TaskHyperlink); + TaskHyperlink taskLink = (TaskHyperlink) links[0]; + assertEquals("123", taskLink.getTaskId()); + assertEquals(testString.indexOf(format), taskLink.getHyperlinkRegion().getOffset()); + Object comment = taskLink.getSelection(); assertNotNull(comment); assertEquals(TaskAttribute.PREFIX_COMMENT + "44556677", comment); } } public void testBeginning() { - for (String format : formats) { + for (String format : bugFormats) { String testString = format + " is at the beginning"; viewer.setDocument(new Document(testString)); Region region = new Region(0, testString.length()); IHyperlink[] links = detector.detectHyperlinks(viewer, region, false); assertNotNull(links); assertEquals(1, links.length); - assertEquals(testString.indexOf(format), links[0].getHyperlinkRegion().getOffset()); - Object comment = ((TaskHyperlink) links[0]).getSelection(); + assertTrue(links[0] instanceof TaskHyperlink); + TaskHyperlink taskLink = (TaskHyperlink) links[0]; + assertEquals("123", taskLink.getTaskId()); + assertEquals(testString.indexOf(format), taskLink.getHyperlinkRegion().getOffset()); + Object comment = taskLink.getSelection(); assertNull(comment); } + for (String format : bugCommentFormats) { + String testString = format + " is at the beginning"; + viewer.setDocument(new Document(testString)); + Region region = new Region(0, testString.length()); + IHyperlink[] links = detector.detectHyperlinks(viewer, region, false); + assertNotNull(links); + assertEquals(1, links.length); + assertTrue(links[0] instanceof TaskHyperlink); + TaskHyperlink taskLink = (TaskHyperlink) links[0]; + assertEquals("123", taskLink.getTaskId()); + assertEquals(testString.indexOf(format), taskLink.getHyperlinkRegion().getOffset()); + Object comment = taskLink.getSelection(); + assertNotNull(comment); + assertEquals(TaskAttribute.PREFIX_COMMENT + "44556677", comment); + } for (String format : commentFormats) { String testString = format + " is at the beginning"; viewer.setDocument(new Document(testString)); @@ -274,15 +394,18 @@ IHyperlink[] links = detector.detectHyperlinks(viewer, region, false); assertNotNull(links); assertEquals(1, links.length); - assertEquals(testString.indexOf(format), links[0].getHyperlinkRegion().getOffset()); - Object comment = ((TaskHyperlink) links[0]).getSelection(); + assertTrue(links[0] instanceof TaskHyperlink); + TaskHyperlink taskLink = (TaskHyperlink) links[0]; + assertEquals("123", taskLink.getTaskId()); + assertEquals(testString.indexOf(format), taskLink.getHyperlinkRegion().getOffset()); + Object comment = taskLink.getSelection(); assertNotNull(comment); assertEquals(TaskAttribute.PREFIX_COMMENT + "44556677", comment); } } public void testEnd() { - for (String format : formats) { + for (String format : bugFormats) { String testString = "is ends with " + format; viewer.setDocument(new Document(testString)); int i = testString.indexOf(format); @@ -290,10 +413,29 @@ IHyperlink[] links = detector.detectHyperlinks(viewer, region, false); assertNotNull(links); assertEquals(1, links.length); - assertEquals(i, links[0].getHyperlinkRegion().getOffset()); - Object comment = ((TaskHyperlink) links[0]).getSelection(); + assertTrue(links[0] instanceof TaskHyperlink); + TaskHyperlink taskLink = (TaskHyperlink) links[0]; + assertEquals("123", taskLink.getTaskId()); + assertEquals(testString.indexOf(format), taskLink.getHyperlinkRegion().getOffset()); + Object comment = taskLink.getSelection(); assertNull(comment); } + for (String format : bugCommentFormats) { + String testString = "is ends with " + format; + viewer.setDocument(new Document(testString)); + int i = testString.indexOf(format); + Region region = new Region(i, testString.length() - i); + IHyperlink[] links = detector.detectHyperlinks(viewer, region, false); + assertNotNull(links); + assertEquals(1, links.length); + assertTrue(links[0] instanceof TaskHyperlink); + TaskHyperlink taskLink = (TaskHyperlink) links[0]; + assertEquals("123", taskLink.getTaskId()); + assertEquals(testString.indexOf(format), taskLink.getHyperlinkRegion().getOffset()); + Object comment = taskLink.getSelection(); + assertNotNull(comment); + assertEquals(TaskAttribute.PREFIX_COMMENT + "44556677", comment); + } for (String format : commentFormats) { String testString = "is ends with " + format; viewer.setDocument(new Document(testString)); @@ -301,15 +443,18 @@ IHyperlink[] links = detector.detectHyperlinks(viewer, region, false); assertNotNull(links); assertEquals(1, links.length); - assertEquals(testString.indexOf(format), links[0].getHyperlinkRegion().getOffset()); - Object comment = ((TaskHyperlink) links[0]).getSelection(); + assertTrue(links[0] instanceof TaskHyperlink); + TaskHyperlink taskLink = (TaskHyperlink) links[0]; + assertEquals("123", taskLink.getTaskId()); + assertEquals(testString.indexOf(format), taskLink.getHyperlinkRegion().getOffset()); + Object comment = taskLink.getSelection(); assertNotNull(comment); assertEquals(TaskAttribute.PREFIX_COMMENT + "44556677", comment); } } public void testMiddle() { - for (String format : formats) { + for (String format : bugFormats) { String testString = "is a " + format + " in the middle"; viewer.setDocument(new Document(testString)); int i = testString.indexOf(format); @@ -317,10 +462,28 @@ IHyperlink[] links = detector.detectHyperlinks(viewer, region, false); assertNotNull(links); assertEquals(1, links.length); - assertEquals(testString.indexOf(format), links[0].getHyperlinkRegion().getOffset()); - Object comment = ((TaskHyperlink) links[0]).getSelection(); + assertTrue(links[0] instanceof TaskHyperlink); + TaskHyperlink taskLink = (TaskHyperlink) links[0]; + assertEquals("123", taskLink.getTaskId()); + assertEquals(testString.indexOf(format), taskLink.getHyperlinkRegion().getOffset()); + Object comment = taskLink.getSelection(); assertNull(comment); } + for (String format : bugCommentFormats) { + String testString = "is a " + format + " in the middle"; + viewer.setDocument(new Document(testString)); + Region region = new Region(0, testString.length()); + IHyperlink[] links = detector.detectHyperlinks(viewer, region, false); + assertNotNull(links); + assertEquals(1, links.length); + assertTrue(links[0] instanceof TaskHyperlink); + TaskHyperlink taskLink = (TaskHyperlink) links[0]; + assertEquals("123", taskLink.getTaskId()); + assertEquals(testString.indexOf(format), taskLink.getHyperlinkRegion().getOffset()); + Object comment = taskLink.getSelection(); + assertNotNull(comment); + assertEquals(TaskAttribute.PREFIX_COMMENT + "44556677", comment); + } for (String format : commentFormats) { String testString = "is a " + format + " in the middle"; viewer.setDocument(new Document(testString)); @@ -328,8 +491,11 @@ IHyperlink[] links = detector.detectHyperlinks(viewer, region, false); assertNotNull(links); assertEquals(1, links.length); - assertEquals(testString.indexOf(format), links[0].getHyperlinkRegion().getOffset()); - Object comment = ((TaskHyperlink) links[0]).getSelection(); + assertTrue(links[0] instanceof TaskHyperlink); + TaskHyperlink taskLink = (TaskHyperlink) links[0]; + assertEquals("123", taskLink.getTaskId()); + assertEquals(testString.indexOf(format), taskLink.getHyperlinkRegion().getOffset()); + Object comment = taskLink.getSelection(); assertNotNull(comment); assertEquals(TaskAttribute.PREFIX_COMMENT + "44556677", comment); } @@ -473,7 +639,6 @@ public void testAttachmentOld() { String testString = ATTACHMENT_OLD; viewer.setDocument(new Document(testString)); - int i = testString.indexOf(ATTACHMENT_NUMBER); Region region = new Region(0, testString.length()); IHyperlink[] links = detector.detectHyperlinks(viewer, region, false); assertNotNull(links); @@ -484,7 +649,6 @@ public void testAttachmentNew() { String testString = ATTACHMENT_NEW; viewer.setDocument(new Document(testString)); - int i = testString.indexOf(ATTACHMENT_NUMBER); Region region = new Region(0, testString.length()); IHyperlink[] links = detector.detectHyperlinks(viewer, region, false); assertNotNull(links); #P org.eclipse.mylyn.bugzilla.ui Index: src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaConnectorUi.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaConnectorUi.java,v retrieving revision 1.53 diff -u -r1.53 BugzillaConnectorUi.java --- src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaConnectorUi.java 2 Apr 2010 17:55:48 -0000 1.53 +++ src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaConnectorUi.java 20 May 2010 04:16:03 -0000 @@ -32,6 +32,7 @@ import org.eclipse.mylyn.internal.bugzilla.ui.TaskAttachmentHyperlink; import org.eclipse.mylyn.internal.bugzilla.ui.search.BugzillaSearchPage; import org.eclipse.mylyn.internal.bugzilla.ui.wizard.NewBugzillaTaskWizard; +import org.eclipse.mylyn.internal.tasks.core.AbstractTask; import org.eclipse.mylyn.tasks.core.IRepositoryQuery; import org.eclipse.mylyn.tasks.core.ITask; import org.eclipse.mylyn.tasks.core.ITaskComment; @@ -51,15 +52,19 @@ */ public class BugzillaConnectorUi extends AbstractRepositoryConnectorUi { - private static final int TASK_NUM_GROUP = 5; + private static final int GET_TASK_NUM_GROUP = 8; - private static final int COMMENT_NUM_GROUP = 10; + private static final int GET_COMMENT_NUM_GROUP = 13; - private static final int ATTACHMENT_NUM_GROUP = 14; + private static final int GET_ATTACHMENT_NUM_GROUP = 3; - private static final String regexp = "(?:(duplicate of|(\\W||^)+bug|(\\W|^)+task)( ?#? ?)(\\d+)((\\s)*(comment|c)(\\s#|#|#\\s|\\s|)(\\s\\d+|\\d+))?)|(?:(Created (an )?attachment\\s*(\\(id=)?(\\d+)))"; //$NON-NLS-1$ + private static final String regexp_bug = "(((duplicate of|((\\W||^)+(bug|task)))( ?#? ?)(\\d+))?((\\W||\\s)*(comment|c)??(\\s*#\\s*)(\\d+))?)"; //$NON-NLS-1$ - private static final Pattern PATTERN = Pattern.compile(regexp, Pattern.CASE_INSENSITIVE); + private static final String regexp_attachment = "Created (an )?attachment\\s*(\\(id=)?(\\d+)"; //$NON-NLS-1$ + + private static final Pattern PATTERN_BUG = Pattern.compile(regexp_bug, Pattern.CASE_INSENSITIVE); + + private static final Pattern PATTERN_ATTACHMENT = Pattern.compile(regexp_attachment, Pattern.CASE_INSENSITIVE); @Override public String getAccountCreationUrl(TaskRepository taskRepository) { @@ -122,26 +127,6 @@ } @Override - public IHyperlink[] findHyperlinks(TaskRepository repository, String text, int index, int textOffset) { - ArrayList hyperlinksFound = null; - - Matcher m = PATTERN.matcher(text); - while (m.find()) { - if (index == -1 || (index >= m.start() && index <= m.end())) { - IHyperlink link = extractHyperlink(repository, textOffset, m); - if (link != null) { - if (hyperlinksFound == null) { - hyperlinksFound = new ArrayList(); - } - hyperlinksFound.add(link); - } - } - } - - return (hyperlinksFound != null) ? hyperlinksFound.toArray(new IHyperlink[0]) : null; - } - - @Override public String getTaskKindLabel(ITask repositoryTask) { return IBugzillaConstants.BUGZILLA_TASK_KIND; } @@ -191,14 +176,49 @@ return custom != null && custom.equals(Boolean.TRUE.toString()); } - private static IHyperlink extractHyperlink(TaskRepository repository, int regionOffset, Matcher m) { + @Override + public IWizardPage getTaskAttachmentPage(TaskAttachmentModel model) { + return new BugzillaTaskAttachmentPage(model); + } - int start = -1; + @Override + public IHyperlink[] findHyperlinks(TaskRepository repository, AbstractTask task, String text, int index, + int textOffset) { + ArrayList hyperlinksFound = null; + Matcher mb = PATTERN_BUG.matcher(text); + while (mb.find()) { + if (index == -1 || (index >= mb.start() && index <= mb.end())) { + IHyperlink link = extractHyperlinkBug(repository, task, textOffset, mb); + if (link != null) { + if (hyperlinksFound == null) { + hyperlinksFound = new ArrayList(); + } + hyperlinksFound.add(link); + } + } + } + Matcher ma = PATTERN_ATTACHMENT.matcher(text); + while (ma.find()) { + if (index == -1 || (index >= ma.start() && index <= ma.end())) { + IHyperlink link = extractHyperlinkAttachment(repository, textOffset, ma); + if (link != null) { + if (hyperlinksFound == null) { + hyperlinksFound = new ArrayList(); + } + hyperlinksFound.add(link); + } + } + } + + return (hyperlinksFound != null) ? hyperlinksFound.toArray(new IHyperlink[0]) : null; + } - int a = m.groupCount(); + private static IHyperlink extractHyperlinkBug(TaskRepository repository, AbstractTask task, int regionOffset, + Matcher m) { + int start = m.start(); if (m.group().startsWith("duplicate")) { //$NON-NLS-1$ - start = m.start() + m.group().indexOf(m.group(TASK_NUM_GROUP)); + start = m.start() + m.group().indexOf(m.group(GET_TASK_NUM_GROUP)); } else { start = m.start(); for (int index = 0; index < m.group().length() && !Character.isLetter(m.group().charAt(index)); index++, start++) { @@ -211,38 +231,62 @@ end = m.group().length(); } - try { - start += regionOffset; - end += regionOffset; - - String bugId = m.group(TASK_NUM_GROUP); - if (bugId == null) { - String attachmentId = m.group(ATTACHMENT_NUM_GROUP); - if (attachmentId != null) { - start = start + m.group().indexOf(m.group(ATTACHMENT_NUM_GROUP)); - - IRegion sregion = new Region(start, end - start); - return new TaskAttachmentHyperlink(sregion, repository, attachmentId); + start += regionOffset; + end += regionOffset; + String bugId = m.group(GET_TASK_NUM_GROUP); + if (bugId == null) { + String commentId = m.group(GET_COMMENT_NUM_GROUP); + IRegion sregion = new Region(start, end - start); + if (commentId != null) { + String taskID; + if (task != null) { + taskID = task.getTaskId(); + } else { + taskID = ""; //$NON-NLS-1$ } - } else { - bugId.trim(); - IRegion sregion = new Region(start, end - start); - TaskHyperlink taskHyperLink = new TaskHyperlink(sregion, repository, bugId); - String commentId = m.group(COMMENT_NUM_GROUP); + TaskHyperlink taskHyperLink = new TaskHyperlink(sregion, repository, taskID); if (commentId != null) { taskHyperLink.setSelection(TaskAttribute.PREFIX_COMMENT + commentId); } return taskHyperLink; - } - } catch (NumberFormatException e) { + } + } else { + bugId.trim(); + IRegion sregion = new Region(start, end - start); + TaskHyperlink taskHyperLink = new TaskHyperlink(sregion, repository, bugId); + String commentId = m.group(GET_COMMENT_NUM_GROUP); + if (commentId != null) { + taskHyperLink.setSelection(TaskAttribute.PREFIX_COMMENT + commentId); + } + return taskHyperLink; } return null; } - @Override - public IWizardPage getTaskAttachmentPage(TaskAttachmentModel model) { - return new BugzillaTaskAttachmentPage(model); - } + private static IHyperlink extractHyperlinkAttachment(TaskRepository repository, int regionOffset, Matcher m) { + + int start = -1; + start = m.start(); + for (int index = 0; index < m.group().length() && !Character.isLetter(m.group().charAt(index)); index++, start++) { + } + + int end = m.end(); + + if (end == -1) { + end = m.group().length(); + } + + start += regionOffset; + end += regionOffset; + String attachmentId = m.group(GET_ATTACHMENT_NUM_GROUP); + if (attachmentId != null) { + start = start + m.group().indexOf(m.group(GET_ATTACHMENT_NUM_GROUP)); + + IRegion sregion = new Region(start, end - start); + return new TaskAttachmentHyperlink(sregion, repository, attachmentId); + } + return null; + } } #P org.eclipse.mylyn.tasks.tests Index: src/org/eclipse/mylyn/tasks/tests/connector/MockRepositoryConnectorUi.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/connector/MockRepositoryConnectorUi.java,v retrieving revision 1.9 diff -u -r1.9 MockRepositoryConnectorUi.java --- src/org/eclipse/mylyn/tasks/tests/connector/MockRepositoryConnectorUi.java 1 Oct 2008 03:48:19 -0000 1.9 +++ src/org/eclipse/mylyn/tasks/tests/connector/MockRepositoryConnectorUi.java 20 May 2010 04:16:04 -0000 @@ -19,6 +19,7 @@ import org.eclipse.jface.text.Region; import org.eclipse.jface.text.hyperlink.IHyperlink; import org.eclipse.jface.wizard.IWizard; +import org.eclipse.mylyn.internal.tasks.core.AbstractTask; import org.eclipse.mylyn.tasks.core.IRepositoryQuery; import org.eclipse.mylyn.tasks.core.ITaskMapping; import org.eclipse.mylyn.tasks.core.TaskRepository; @@ -63,7 +64,8 @@ } @Override - public IHyperlink[] findHyperlinks(TaskRepository repository, String text, int index, int textOffset) { + public IHyperlink[] findHyperlinks(TaskRepository repository, AbstractTask task, String text, int index, + int textOffset) { List links = new ArrayList(); Matcher m = HYPERLINK_PATTERN.matcher(text); while (m.find()) { #P org.eclipse.mylyn.tasks.ui Index: src/org/eclipse/mylyn/internal/tasks/ui/editors/AttributePart.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/AttributePart.java,v retrieving revision 1.11 diff -u -r1.11 AttributePart.java --- src/org/eclipse/mylyn/internal/tasks/ui/editors/AttributePart.java 12 Oct 2009 08:40:32 -0000 1.11 +++ src/org/eclipse/mylyn/internal/tasks/ui/editors/AttributePart.java 20 May 2010 04:16:04 -0000 @@ -117,7 +117,7 @@ urlComposite.setLayout(urlLayout); GridDataFactory.fillDefaults().grab(true, false).applyTo(urlComposite); - urlEditor = new RichTextEditor(getRepository(), SWT.FLAT | SWT.SINGLE) { + urlEditor = new RichTextEditor(getRepository(), SWT.FLAT | SWT.SINGLE, null, null, getTask()) { @Override protected void valueChanged(String value) { updateButtons(); Index: src/org/eclipse/mylyn/internal/tasks/ui/editors/IAbstractTaskEditorExtension2.java =================================================================== RCS file: src/org/eclipse/mylyn/internal/tasks/ui/editors/IAbstractTaskEditorExtension2.java diff -N src/org/eclipse/mylyn/internal/tasks/ui/editors/IAbstractTaskEditorExtension2.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/mylyn/internal/tasks/ui/editors/IAbstractTaskEditorExtension2.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,21 @@ +/******************************************************************************* + * Copyright (c) 2010 Frank Becker 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: + * Frank Becker - initial API and implementation + *******************************************************************************/ + +package org.eclipse.mylyn.internal.tasks.ui.editors; + +import org.eclipse.jface.text.source.SourceViewer; +import org.eclipse.mylyn.internal.tasks.core.AbstractTask; +import org.eclipse.mylyn.tasks.core.TaskRepository; +import org.eclipse.swt.widgets.Composite; + +public interface IAbstractTaskEditorExtension2 { + public SourceViewer createEditor(TaskRepository taskRepository, AbstractTask task, Composite parent, int style); +} Index: src/org/eclipse/mylyn/internal/tasks/ui/editors/LongTextAttributeEditor.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/LongTextAttributeEditor.java,v retrieving revision 1.17 diff -u -r1.17 LongTextAttributeEditor.java --- src/org/eclipse/mylyn/internal/tasks/ui/editors/LongTextAttributeEditor.java 6 Oct 2009 06:44:06 -0000 1.17 +++ src/org/eclipse/mylyn/internal/tasks/ui/editors/LongTextAttributeEditor.java 20 May 2010 04:16:06 -0000 @@ -15,6 +15,7 @@ import org.eclipse.jface.text.source.SourceViewer; import org.eclipse.mylyn.internal.provisional.commons.ui.CommonFormUtil; import org.eclipse.mylyn.internal.provisional.commons.ui.CommonTextSupport; +import org.eclipse.mylyn.internal.tasks.core.AbstractTask; import org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTextViewerConfiguration.Mode; import org.eclipse.mylyn.tasks.core.data.TaskAttribute; import org.eclipse.mylyn.tasks.core.data.TaskDataModel; @@ -47,7 +48,7 @@ } SourceViewer viewer = new SourceViewer(parent, null, style); RepositoryTextViewerConfiguration configuration = RichTextEditor.installHyperlinkPresenter(viewer, - getModel().getTaskRepository(), Mode.DEFAULT); + getModel().getTaskRepository(), ((AbstractTask) getModel().getTask()), Mode.DEFAULT); viewer.configure(configuration); viewer.setDocument(new Document(getValue())); final StyledText text = viewer.getTextWidget(); Index: src/org/eclipse/mylyn/internal/tasks/ui/editors/PlanningPart.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/PlanningPart.java,v retrieving revision 1.35 diff -u -r1.35 PlanningPart.java --- src/org/eclipse/mylyn/internal/tasks/ui/editors/PlanningPart.java 2 Nov 2009 19:00:46 -0000 1.35 +++ src/org/eclipse/mylyn/internal/tasks/ui/editors/PlanningPart.java 20 May 2010 04:16:06 -0000 @@ -337,12 +337,13 @@ AbstractTaskEditorExtension extension = TaskEditorExtensions.getTaskEditorExtension(getRepository()); if (extension != null) { noteEditor = new RichTextEditor(getRepository(), SWT.FLAT | SWT.MULTI | SWT.WRAP | SWT.V_SCROLL, - contextService, extension); + contextService, extension, getTask()); } } } if (noteEditor == null) { - noteEditor = new RichTextEditor(getRepository(), SWT.FLAT | SWT.MULTI | SWT.WRAP | SWT.V_SCROLL); + noteEditor = new RichTextEditor(getRepository(), SWT.FLAT | SWT.MULTI | SWT.WRAP | SWT.V_SCROLL, null, + null, getTask()); } noteEditor.setSpellCheckingEnabled(true); noteEditor.createControl(composite, toolkit); @@ -398,8 +399,9 @@ if (noteEditor.getViewer() != null) { noteEditor.getViewer().getTextWidget().addFocusListener(removePersonalNotesFocusListener); if (changeColor) { - noteEditor.getViewer().getTextWidget().setForeground( - composite.getShell().getDisplay().getSystemColor(SWT.COLOR_GRAY)); + noteEditor.getViewer() + .getTextWidget() + .setForeground(composite.getShell().getDisplay().getSystemColor(SWT.COLOR_GRAY)); } } Index: src/org/eclipse/mylyn/internal/tasks/ui/editors/RepositoryTextViewerConfiguration.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/RepositoryTextViewerConfiguration.java,v retrieving revision 1.27 diff -u -r1.27 RepositoryTextViewerConfiguration.java --- src/org/eclipse/mylyn/internal/tasks/ui/editors/RepositoryTextViewerConfiguration.java 10 Dec 2009 05:46:10 -0000 1.27 +++ src/org/eclipse/mylyn/internal/tasks/ui/editors/RepositoryTextViewerConfiguration.java 20 May 2010 04:16:06 -0000 @@ -35,6 +35,7 @@ import org.eclipse.jface.text.rules.Token; import org.eclipse.jface.text.source.ISourceViewer; import org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors; +import org.eclipse.mylyn.internal.tasks.core.AbstractTask; import org.eclipse.mylyn.tasks.core.TaskRepository; import org.eclipse.mylyn.tasks.ui.TaskHyperlinkPresenter; import org.eclipse.swt.SWT; @@ -65,11 +66,14 @@ private Mode mode; - public RepositoryTextViewerConfiguration(TaskRepository taskRepository, boolean spellCheck) { + private final AbstractTask task; + + public RepositoryTextViewerConfiguration(TaskRepository taskRepository, AbstractTask task, boolean spellCheck) { super(EditorsUI.getPreferenceStore()); this.taskRepository = taskRepository; this.spellCheck = spellCheck; this.mode = Mode.DEFAULT; + this.task = task; } public Mode getMode() { @@ -148,6 +152,8 @@ public Object getAdapter(Class adapter) { if (adapter == TaskRepository.class) { return getTaskRepository(); + } else if (adapter == AbstractTask.class) { + return getTask(); } return null; } @@ -208,4 +214,8 @@ return assistant; } + public AbstractTask getTask() { + return task; + } + } Index: src/org/eclipse/mylyn/internal/tasks/ui/editors/RichTextAttributeEditor.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/RichTextAttributeEditor.java,v retrieving revision 1.44 diff -u -r1.44 RichTextAttributeEditor.java --- src/org/eclipse/mylyn/internal/tasks/ui/editors/RichTextAttributeEditor.java 20 Aug 2009 00:36:38 -0000 1.44 +++ src/org/eclipse/mylyn/internal/tasks/ui/editors/RichTextAttributeEditor.java 20 May 2010 04:16:06 -0000 @@ -13,6 +13,7 @@ import org.eclipse.jface.action.IAction; import org.eclipse.jface.text.source.SourceViewer; +import org.eclipse.mylyn.internal.tasks.core.AbstractTask; import org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTextViewerConfiguration.Mode; import org.eclipse.mylyn.tasks.core.TaskRepository; import org.eclipse.mylyn.tasks.core.data.TaskAttribute; @@ -53,7 +54,8 @@ public RichTextAttributeEditor(TaskDataModel manager, TaskRepository taskRepository, TaskAttribute taskAttribute, int style, IContextService contextService, AbstractTaskEditorExtension extension) { super(manager, taskAttribute); - this.editor = new RichTextEditor(taskRepository, style, contextService, extension) { + this.editor = new RichTextEditor(taskRepository, style, contextService, extension, + ((AbstractTask) getModel().getTask())) { @Override public void valueChanged(String value) { if (!ignoreNotification) { Index: src/org/eclipse/mylyn/internal/tasks/ui/editors/RichTextEditor.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/RichTextEditor.java,v retrieving revision 1.13 diff -u -r1.13 RichTextEditor.java --- src/org/eclipse/mylyn/internal/tasks/ui/editors/RichTextEditor.java 8 Oct 2009 05:22:12 -0000 1.13 +++ src/org/eclipse/mylyn/internal/tasks/ui/editors/RichTextEditor.java 20 May 2010 04:16:06 -0000 @@ -31,6 +31,7 @@ import org.eclipse.mylyn.internal.provisional.commons.ui.CommonFormUtil; import org.eclipse.mylyn.internal.provisional.commons.ui.CommonTextSupport; import org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes; +import org.eclipse.mylyn.internal.tasks.core.AbstractTask; import org.eclipse.mylyn.internal.tasks.ui.commands.ViewSourceHandler; import org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTextViewerConfiguration.Mode; import org.eclipse.mylyn.tasks.core.TaskRepository; @@ -160,12 +161,21 @@ private final ListenerList stateChangedListeners = new ListenerList(ListenerList.IDENTITY); + private final AbstractTask task; + + @Deprecated public RichTextEditor(TaskRepository repository, int style) { - this(repository, style, null, null); + this(repository, style, null, null, null); } + @Deprecated public RichTextEditor(TaskRepository repository, int style, IContextService contextService, AbstractTaskEditorExtension extension) { + this(repository, style, contextService, extension, null); + } + + public RichTextEditor(TaskRepository repository, int style, IContextService contextService, + AbstractTaskEditorExtension extension, AbstractTask task) { this.repository = repository; this.style = style; this.contextService = contextService; @@ -173,11 +183,12 @@ this.text = ""; //$NON-NLS-1$ this.viewSourceAction = new ViewSourceAction(); setMode(Mode.DEFAULT); + this.task = task; } private SourceViewer configure(final SourceViewer viewer, Document document, boolean readOnly) { // do this before setting the document to not require invalidating the presentation - installHyperlinkPresenter(viewer, repository, getMode()); + installHyperlinkPresenter(viewer, repository, task, getMode()); updateDocument(viewer, document, readOnly); if (readOnly) { @@ -263,7 +274,13 @@ if (isReadOnly()) { editorViewer = extension.createViewer(repository, editorComposite, style); } else { - editorViewer = extension.createEditor(repository, editorComposite, style); + if (extension instanceof IAbstractTaskEditorExtension2) { + editorViewer = ((IAbstractTaskEditorExtension2) extension).createEditor(repository, task, + editorComposite, style); + } else { + editorViewer = extension.createEditor(repository, editorComposite, style); + } + editorViewer.getTextWidget().addFocusListener(new FocusListener() { public void focusGained(FocusEvent e) { setContext(); @@ -304,7 +321,7 @@ private SourceViewer createDefaultEditor(Composite parent, int styles) { SourceViewer defaultEditor = new SourceViewer(parent, null, styles | SWT.WRAP); - RepositoryTextViewerConfiguration viewerConfig = new RepositoryTextViewerConfiguration(repository, + RepositoryTextViewerConfiguration viewerConfig = new RepositoryTextViewerConfiguration(repository, task, isSpellCheckingEnabled() && !isReadOnly()); viewerConfig.setMode(getMode()); defaultEditor.configure(viewerConfig); @@ -427,8 +444,8 @@ } public static RepositoryTextViewerConfiguration installHyperlinkPresenter(ISourceViewer viewer, - TaskRepository repository, Mode mode) { - RepositoryTextViewerConfiguration configuration = new RepositoryTextViewerConfiguration(repository, false); + TaskRepository repository, AbstractTask task, Mode mode) { + RepositoryTextViewerConfiguration configuration = new RepositoryTextViewerConfiguration(repository, task, false); configuration.setMode(mode); // do not configure viewer, this has already been done in extension Index: src/org/eclipse/mylyn/internal/tasks/ui/editors/SummaryPart.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/SummaryPart.java,v retrieving revision 1.12 diff -u -r1.12 SummaryPart.java --- src/org/eclipse/mylyn/internal/tasks/ui/editors/SummaryPart.java 11 Aug 2009 20:04:57 -0000 1.12 +++ src/org/eclipse/mylyn/internal/tasks/ui/editors/SummaryPart.java 20 May 2010 04:16:06 -0000 @@ -70,10 +70,13 @@ private void createSummaryControl(Composite composite, final FormToolkit toolkit) { Composite borderComposite = EditorUtil.createBorder(composite, toolkit); - GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).hint(EditorUtil.MAXIMUM_WIDTH, SWT.DEFAULT).grab( - true, false).applyTo(borderComposite); + GridDataFactory.fillDefaults() + .align(SWT.FILL, SWT.CENTER) + .hint(EditorUtil.MAXIMUM_WIDTH, SWT.DEFAULT) + .grab(true, false) + .applyTo(borderComposite); - summaryEditor = new RichTextEditor(getRepository(), SWT.SINGLE); + summaryEditor = new RichTextEditor(getRepository(), SWT.SINGLE, null, null, getTask()); summaryEditor.setSpellCheckingEnabled(true); summaryEditor.setReadOnly(!isSummaryEditable()); summaryEditor.createControl(borderComposite, toolkit); Index: src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorNotesPart.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorNotesPart.java,v retrieving revision 1.6 diff -u -r1.6 TaskEditorNotesPart.java --- src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorNotesPart.java 6 Oct 2009 06:44:06 -0000 1.6 +++ src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorNotesPart.java 20 May 2010 04:16:06 -0000 @@ -87,7 +87,8 @@ composite.setLayout(EditorUtil.createSectionClientLayout()); noteEditor = new SourceViewer(composite, null, SWT.FLAT | SWT.MULTI | SWT.WRAP | SWT.V_SCROLL); - noteEditor.configure(new RepositoryTextViewerConfiguration(getModel().getTaskRepository(), true)); + noteEditor.configure(new RepositoryTextViewerConfiguration(getModel().getTaskRepository(), + ((AbstractTask) getModel().getTask()), true)); CommonTextSupport textSupport = (CommonTextSupport) getTaskEditorPage().getAdapter(CommonTextSupport.class); if (textSupport != null) { textSupport.configure(noteEditor, new Document(this.value), true); Index: src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskHyperlinkDetector.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskHyperlinkDetector.java,v retrieving revision 1.15 diff -u -r1.15 TaskHyperlinkDetector.java --- src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskHyperlinkDetector.java 12 Oct 2008 05:08:11 -0000 1.15 +++ src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskHyperlinkDetector.java 20 May 2010 04:16:06 -0000 @@ -19,6 +19,7 @@ import org.eclipse.jface.text.ITextViewer; import org.eclipse.jface.text.hyperlink.IHyperlink; import org.eclipse.jface.util.SafeRunnable; +import org.eclipse.mylyn.internal.tasks.core.AbstractTask; import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin; import org.eclipse.mylyn.tasks.core.TaskRepository; import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi; @@ -47,7 +48,8 @@ } public void run() throws Exception { - links[0] = connectorUi.findHyperlinks(repository, content, index, contentOffset); + final AbstractTask task = (AbstractTask) getAdapter(AbstractTask.class); + links[0] = connectorUi.findHyperlinks(repository, task, content, index, contentOffset); } }); Index: src/org/eclipse/mylyn/tasks/ui/AbstractRepositoryConnectorUi.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/AbstractRepositoryConnectorUi.java,v retrieving revision 1.85 diff -u -r1.85 AbstractRepositoryConnectorUi.java --- src/org/eclipse/mylyn/tasks/ui/AbstractRepositoryConnectorUi.java 12 May 2010 01:22:43 -0000 1.85 +++ src/org/eclipse/mylyn/tasks/ui/AbstractRepositoryConnectorUi.java 20 May 2010 04:16:06 -0000 @@ -21,6 +21,7 @@ import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.wizard.IWizard; import org.eclipse.jface.wizard.IWizardPage; +import org.eclipse.mylyn.internal.tasks.core.AbstractTask; import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery; import org.eclipse.mylyn.internal.tasks.ui.Messages; import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal; @@ -239,7 +240,9 @@ * the offset of text * @return an array of hyperlinks, or null if no hyperlinks were found * @since 2.0 + * @deprecated use {@link #findHyperlinks(TaskRepository, AbstractTask, String, int, int)} instead */ + @Deprecated public IHyperlink[] findHyperlinks(TaskRepository repository, String text, int index, int textOffset) { return null; } @@ -266,4 +269,26 @@ return new TaskAttachmentPage(model); } + /** + * Returns an array of hyperlinks that link to tasks within text. If index is != -1 + * clients may limit the results to hyperlinks found at index. It is legal for clients to always return + * all results. + * + * @param repository + * the task repository, never null + * @param task + * the task, never null + * @param text + * the line of text + * @param index + * the index within text, if -1 return all hyperlinks found in text + * @param textOffset + * the offset of text + * @return an array of hyperlinks, or null if no hyperlinks were found + * @since 3.4 + */ + public IHyperlink[] findHyperlinks(TaskRepository repository, AbstractTask task, String text, int index, + int textOffset) { + return findHyperlinks(repository, text, index, textOffset); + } } Index: src/org/eclipse/mylyn/tasks/ui/wizards/TaskAttachmentPage.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/wizards/TaskAttachmentPage.java,v retrieving revision 1.30 diff -u -r1.30 TaskAttachmentPage.java --- src/org/eclipse/mylyn/tasks/ui/wizards/TaskAttachmentPage.java 13 Feb 2010 01:22:46 -0000 1.30 +++ src/org/eclipse/mylyn/tasks/ui/wizards/TaskAttachmentPage.java 20 May 2010 04:16:06 -0000 @@ -17,6 +17,7 @@ import org.eclipse.mylyn.context.core.ContextCore; import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages; import org.eclipse.mylyn.internal.provisional.commons.ui.CommonTextSupport; +import org.eclipse.mylyn.internal.tasks.core.AbstractTask; import org.eclipse.mylyn.internal.tasks.core.data.FileTaskAttachmentSource; import org.eclipse.mylyn.internal.tasks.ui.editors.RichTextEditor; import org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorExtensions; @@ -148,7 +149,7 @@ } commentEditor = new RichTextEditor(getModel().getTaskRepository(), SWT.V_SCROLL | SWT.BORDER | SWT.WRAP, - contextService, extension) { + contextService, extension, ((AbstractTask) getModel().getTask())) { @Override protected void valueChanged(String value) { apply(); #P org.eclipse.mylyn.trac.wiki Index: src/org/eclipse/mylyn/internal/trac/wiki/editor/TracWikiPageEditor.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/sandbox/org.eclipse.mylyn.trac.wiki/src/org/eclipse/mylyn/internal/trac/wiki/editor/TracWikiPageEditor.java,v retrieving revision 1.19 diff -u -r1.19 TracWikiPageEditor.java --- src/org/eclipse/mylyn/internal/trac/wiki/editor/TracWikiPageEditor.java 10 Dec 2009 05:46:22 -0000 1.19 +++ src/org/eclipse/mylyn/internal/trac/wiki/editor/TracWikiPageEditor.java 20 May 2010 04:16:08 -0000 @@ -233,7 +233,8 @@ } }); - TextSourceViewerConfiguration viewerConfig = new RepositoryTextViewerConfiguration(repository, true); + // TODO: pass the Task if possible and not null + TextSourceViewerConfiguration viewerConfig = new RepositoryTextViewerConfiguration(repository, null, true); ((SourceViewer) sourceEditor).configure(viewerConfig); Document document = new Document(page.getContent()); ((SourceViewer) sourceEditor).setDocument(document, new AnnotationModel()); #P org.eclipse.mylyn.wikitext.tasks.ui Index: src/org/eclipse/mylyn/internal/wikitext/tasks/ui/editor/ConfluenceMarkupTaskEditorExtension.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/editor/ConfluenceMarkupTaskEditorExtension.java,v retrieving revision 1.2 diff -u -r1.2 ConfluenceMarkupTaskEditorExtension.java --- src/org/eclipse/mylyn/internal/wikitext/tasks/ui/editor/ConfluenceMarkupTaskEditorExtension.java 26 Jan 2009 16:46:42 -0000 1.2 +++ src/org/eclipse/mylyn/internal/wikitext/tasks/ui/editor/ConfluenceMarkupTaskEditorExtension.java 20 May 2010 04:16:09 -0000 @@ -11,9 +11,9 @@ package org.eclipse.mylyn.internal.wikitext.tasks.ui.editor; import org.eclipse.mylyn.wikitext.confluence.core.ConfluenceLanguage; -import org.eclipse.mylyn.wikitext.tasks.ui.editor.MarkupTaskEditorExtension; +import org.eclipse.mylyn.wikitext.tasks.ui.editor.MarkupTaskEditorExtension2; -public class ConfluenceMarkupTaskEditorExtension extends MarkupTaskEditorExtension { +public class ConfluenceMarkupTaskEditorExtension extends MarkupTaskEditorExtension2 { public ConfluenceMarkupTaskEditorExtension() { setMarkupLanguage(new ConfluenceLanguage()); Index: src/org/eclipse/mylyn/internal/wikitext/tasks/ui/editor/MediaWikiMarkupTaskEditorExtension.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/editor/MediaWikiMarkupTaskEditorExtension.java,v retrieving revision 1.2 diff -u -r1.2 MediaWikiMarkupTaskEditorExtension.java --- src/org/eclipse/mylyn/internal/wikitext/tasks/ui/editor/MediaWikiMarkupTaskEditorExtension.java 26 Jan 2009 16:46:42 -0000 1.2 +++ src/org/eclipse/mylyn/internal/wikitext/tasks/ui/editor/MediaWikiMarkupTaskEditorExtension.java 20 May 2010 04:16:09 -0000 @@ -11,9 +11,9 @@ package org.eclipse.mylyn.internal.wikitext.tasks.ui.editor; import org.eclipse.mylyn.wikitext.mediawiki.core.MediaWikiLanguage; -import org.eclipse.mylyn.wikitext.tasks.ui.editor.MarkupTaskEditorExtension; +import org.eclipse.mylyn.wikitext.tasks.ui.editor.MarkupTaskEditorExtension2; -public class MediaWikiMarkupTaskEditorExtension extends MarkupTaskEditorExtension { +public class MediaWikiMarkupTaskEditorExtension extends MarkupTaskEditorExtension2 { public MediaWikiMarkupTaskEditorExtension() { setMarkupLanguage(new MediaWikiLanguage()); Index: src/org/eclipse/mylyn/internal/wikitext/tasks/ui/editor/TWikiMarkupTaskEditorExtension.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/editor/TWikiMarkupTaskEditorExtension.java,v retrieving revision 1.2 diff -u -r1.2 TWikiMarkupTaskEditorExtension.java --- src/org/eclipse/mylyn/internal/wikitext/tasks/ui/editor/TWikiMarkupTaskEditorExtension.java 26 Jan 2009 16:46:42 -0000 1.2 +++ src/org/eclipse/mylyn/internal/wikitext/tasks/ui/editor/TWikiMarkupTaskEditorExtension.java 20 May 2010 04:16:09 -0000 @@ -10,10 +10,10 @@ *******************************************************************************/ package org.eclipse.mylyn.internal.wikitext.tasks.ui.editor; -import org.eclipse.mylyn.wikitext.tasks.ui.editor.MarkupTaskEditorExtension; +import org.eclipse.mylyn.wikitext.tasks.ui.editor.MarkupTaskEditorExtension2; import org.eclipse.mylyn.wikitext.twiki.core.TWikiLanguage; -public class TWikiMarkupTaskEditorExtension extends MarkupTaskEditorExtension { +public class TWikiMarkupTaskEditorExtension extends MarkupTaskEditorExtension2 { public TWikiMarkupTaskEditorExtension() { setMarkupLanguage(new TWikiLanguage()); Index: src/org/eclipse/mylyn/internal/wikitext/tasks/ui/editor/TextileMarkupTaskEditorExtension.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/editor/TextileMarkupTaskEditorExtension.java,v retrieving revision 1.2 diff -u -r1.2 TextileMarkupTaskEditorExtension.java --- src/org/eclipse/mylyn/internal/wikitext/tasks/ui/editor/TextileMarkupTaskEditorExtension.java 26 Jan 2009 16:46:42 -0000 1.2 +++ src/org/eclipse/mylyn/internal/wikitext/tasks/ui/editor/TextileMarkupTaskEditorExtension.java 20 May 2010 04:16:09 -0000 @@ -11,15 +11,13 @@ package org.eclipse.mylyn.internal.wikitext.tasks.ui.editor; -import org.eclipse.mylyn.wikitext.tasks.ui.editor.MarkupTaskEditorExtension; +import org.eclipse.mylyn.wikitext.tasks.ui.editor.MarkupTaskEditorExtension2; import org.eclipse.mylyn.wikitext.textile.core.TextileLanguage; /** - * - * * @author David Green */ -public class TextileMarkupTaskEditorExtension extends MarkupTaskEditorExtension { +public class TextileMarkupTaskEditorExtension extends MarkupTaskEditorExtension2 { public TextileMarkupTaskEditorExtension() { setMarkupLanguage(new TextileLanguage()); Index: src/org/eclipse/mylyn/internal/wikitext/tasks/ui/editor/TracWikiMarkupTaskEditorExtension.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/editor/TracWikiMarkupTaskEditorExtension.java,v retrieving revision 1.4 diff -u -r1.4 TracWikiMarkupTaskEditorExtension.java --- src/org/eclipse/mylyn/internal/wikitext/tasks/ui/editor/TracWikiMarkupTaskEditorExtension.java 28 Aug 2009 01:42:33 -0000 1.4 +++ src/org/eclipse/mylyn/internal/wikitext/tasks/ui/editor/TracWikiMarkupTaskEditorExtension.java 20 May 2010 04:16:09 -0000 @@ -12,16 +12,16 @@ package org.eclipse.mylyn.internal.wikitext.tasks.ui.editor; import org.eclipse.mylyn.tasks.core.TaskRepository; -import org.eclipse.mylyn.wikitext.tasks.ui.editor.MarkupTaskEditorExtension; +import org.eclipse.mylyn.wikitext.tasks.ui.editor.MarkupTaskEditorExtension2; import org.eclipse.mylyn.wikitext.tracwiki.core.TracWikiLanguage; -import org.eclipse.mylyn.wikitext.ui.viewer.MarkupViewer; import org.eclipse.mylyn.wikitext.ui.viewer.AbstractTextSourceViewerConfiguration.HyperlinkDetectorDescriptorFilter; +import org.eclipse.mylyn.wikitext.ui.viewer.MarkupViewer; import org.eclipse.ui.texteditor.HyperlinkDetectorDescriptor; /** * @author David Green */ -public class TracWikiMarkupTaskEditorExtension extends MarkupTaskEditorExtension implements +public class TracWikiMarkupTaskEditorExtension extends MarkupTaskEditorExtension2 implements HyperlinkDetectorDescriptorFilter { public TracWikiMarkupTaskEditorExtension() { Index: src/org/eclipse/mylyn/wikitext/tasks/ui/editor/MarkupTaskEditorExtension.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/wikitext/tasks/ui/editor/MarkupTaskEditorExtension.java,v retrieving revision 1.23 diff -u -r1.23 MarkupTaskEditorExtension.java --- src/org/eclipse/mylyn/wikitext/tasks/ui/editor/MarkupTaskEditorExtension.java 8 Apr 2010 12:02:10 -0000 1.23 +++ src/org/eclipse/mylyn/wikitext/tasks/ui/editor/MarkupTaskEditorExtension.java 20 May 2010 04:16:09 -0000 @@ -81,9 +81,15 @@ private static final boolean DISABLE_WIKI_WORD = Boolean.getBoolean(MarkupTaskEditorExtension.class.getSimpleName() + ".wikiWordDisabled"); //$NON-NLS-1$ - private static final String ID_CONTEXT_EDITOR_TASK = "org.eclipse.mylyn.tasks.ui.TaskEditor"; //$NON-NLS-1$ + /** + * @since 1.3 + */ + protected static final String ID_CONTEXT_EDITOR_TASK = "org.eclipse.mylyn.tasks.ui.TaskEditor"; //$NON-NLS-1$ - private static final String ID_CONTEXT_EDITOR_TEXT = "org.eclipse.ui.DefaultTextEditor"; //$NON-NLS-1$ + /** + * @since 1.3 + */ + protected static final String ID_CONTEXT_EDITOR_TEXT = "org.eclipse.ui.DefaultTextEditor"; //$NON-NLS-1$ private MarkupLanguageType markupLanguage; @@ -136,8 +142,11 @@ return markupViewer; } + /** + * @since 1.3 + */ @SuppressWarnings("unchecked") - private MarkupLanguageType createRepositoryMarkupLanguage(TaskRepository taskRepository) { + protected MarkupLanguageType createRepositoryMarkupLanguage(TaskRepository taskRepository) { MarkupLanguageType copy = (MarkupLanguageType) markupLanguage.clone(); MarkupLanguageConfiguration configuration = createMarkupLanguageConfiguration(taskRepository); copy.configure(configuration); @@ -375,8 +384,9 @@ * provided control. bug 273528: override workspace preferences to eliminate print margin in the task editor * * @author David Green + * @since 1.3 */ - private static class EditorExtensionPreferenceStore extends PreferenceStoreFacade { + protected static class EditorExtensionPreferenceStore extends PreferenceStoreFacade { // track separately from isFocusControl() since isFocusControl() is not accurate while processing a focus event boolean controlFocused; Index: src/org/eclipse/mylyn/wikitext/tasks/ui/editor/MarkupTaskEditorExtension2.java =================================================================== RCS file: src/org/eclipse/mylyn/wikitext/tasks/ui/editor/MarkupTaskEditorExtension2.java diff -N src/org/eclipse/mylyn/wikitext/tasks/ui/editor/MarkupTaskEditorExtension2.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/mylyn/wikitext/tasks/ui/editor/MarkupTaskEditorExtension2.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,201 @@ +/******************************************************************************* + * Copyright (c) 2010 Frank Becker 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: + * Frank Becker - initial API and implementation + *******************************************************************************/ + +package org.eclipse.mylyn.wikitext.tasks.ui.editor; + +import java.util.Iterator; +import java.util.Map; + +import org.eclipse.core.runtime.IAdaptable; +import org.eclipse.jface.preference.IPreferenceStore; +import org.eclipse.jface.text.contentassist.IContentAssistProcessor; +import org.eclipse.jface.text.hyperlink.IHyperlinkPresenter; +import org.eclipse.jface.text.reconciler.IReconciler; +import org.eclipse.jface.text.source.Annotation; +import org.eclipse.jface.text.source.DefaultAnnotationHover; +import org.eclipse.jface.text.source.IAnnotationHover; +import org.eclipse.jface.text.source.ISourceViewer; +import org.eclipse.jface.text.source.SourceViewer; +import org.eclipse.mylyn.internal.tasks.core.AbstractTask; +import org.eclipse.mylyn.internal.tasks.ui.editors.IAbstractTaskEditorExtension2; +import org.eclipse.mylyn.internal.wikitext.tasks.ui.WikiTextTasksUiPlugin; +import org.eclipse.mylyn.internal.wikitext.ui.editor.MarkupEditor; +import org.eclipse.mylyn.tasks.core.TaskRepository; +import org.eclipse.mylyn.tasks.ui.TaskHyperlinkPresenter; +import org.eclipse.mylyn.tasks.ui.TasksUi; +import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage; +import org.eclipse.mylyn.wikitext.ui.editor.MarkupSourceViewer; +import org.eclipse.mylyn.wikitext.ui.editor.MarkupSourceViewerConfiguration; +import org.eclipse.mylyn.wikitext.ui.editor.ShowInTargetBridge; +import org.eclipse.mylyn.wikitext.ui.viewer.DefaultHyperlinkDetectorDescriptorFilter; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.DisposeEvent; +import org.eclipse.swt.events.DisposeListener; +import org.eclipse.swt.graphics.RGB; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.editors.text.EditorsUI; +import org.eclipse.ui.swt.IFocusService; +import org.eclipse.ui.texteditor.AbstractDecoratedTextEditorPreferenceConstants; +import org.eclipse.ui.texteditor.AnnotationPreference; +import org.eclipse.ui.texteditor.DefaultMarkerAnnotationAccess; +import org.eclipse.ui.texteditor.MarkerAnnotationPreferences; +import org.eclipse.ui.texteditor.SourceViewerDecorationSupport; + +/** + * @author Frank Becker + * + * @since 1.3 + */ +@SuppressWarnings("restriction") +public class MarkupTaskEditorExtension2 extends + MarkupTaskEditorExtension implements IAbstractTaskEditorExtension2 { + + public SourceViewer createEditor(TaskRepository taskRepository, AbstractTask task, Composite parent, int style) { + final MarkupLanguageType markupLanguageCopy = createRepositoryMarkupLanguage(taskRepository); + configureMarkupLanguage(taskRepository, markupLanguageCopy); + + SourceViewer viewer = new MarkupSourceViewer(parent, null, style | SWT.WRAP, markupLanguageCopy); + // configure the viewer + MarkupSourceViewerConfiguration configuration = createSourceViewerConfiguration(taskRepository, task, viewer); + + configuration.setMarkupLanguage(markupLanguageCopy); + configuration.setShowInTarget(new ShowInTargetBridge(viewer)); + viewer.configure(configuration); + + // we want the viewer to show annotations + viewer.showAnnotations(true); + + DefaultMarkerAnnotationAccess annotationAccess = new DefaultMarkerAnnotationAccess(); + MarkerAnnotationPreferences annotationPreferences = new MarkerAnnotationPreferences(); + + // configure viewer annotation/decoration support + final SourceViewerDecorationSupport support = new SourceViewerDecorationSupport(viewer, null, annotationAccess, + EditorsUI.getSharedTextColors()); + + // hook the support up to the preference store + Iterator e = annotationPreferences.getAnnotationPreferences().iterator(); + while (e.hasNext()) { + AnnotationPreference preference = e.next(); + support.setAnnotationPreference(preference); + } + support.setCursorLinePainterPreferenceKeys(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_CURRENT_LINE, + AbstractDecoratedTextEditorPreferenceConstants.EDITOR_CURRENT_LINE_COLOR); + support.setMarginPainterPreferenceKeys(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_PRINT_MARGIN, + AbstractDecoratedTextEditorPreferenceConstants.EDITOR_PRINT_MARGIN_COLOR, + AbstractDecoratedTextEditorPreferenceConstants.EDITOR_PRINT_MARGIN_COLUMN); + + support.install(new EditorExtensionPreferenceStore(EditorsUI.getPreferenceStore(), viewer.getControl())); + viewer.getControl().addDisposeListener(new DisposeListener() { + public void widgetDisposed(DisposeEvent e) { + support.dispose(); + } + }); + + IFocusService focusService = (IFocusService) PlatformUI.getWorkbench().getService(IFocusService.class); + if (focusService != null) { + focusService.addFocusTracker(viewer.getTextWidget(), MarkupEditor.EDITOR_SOURCE_VIEWER); + } + + viewer.getTextWidget().setData(MarkupLanguage.class.getName(), markupLanguageCopy); + viewer.getTextWidget().setData(ISourceViewer.class.getName(), viewer); + + return viewer; + } + + protected TaskMarkupSourceViewerConfiguration createSourceViewerConfiguration(TaskRepository taskRepository, + AbstractTask task, SourceViewer viewer) { + IPreferenceStore preferenceStore = EditorsUI.getPreferenceStore(); + return new TaskMarkupSourceViewerConfiguration(preferenceStore, taskRepository, task); + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + private static void addRepositoryHyperlinkDetectorTargets(final TaskRepository taskRepository, + final AbstractTask task, Map hyperlinkDetectorTargets) { + IAdaptable context = new IAdaptable() { + public Object getAdapter(Class adapter) { + if (adapter == TaskRepository.class) { + return taskRepository; + } else if (adapter == AbstractTask.class) { + return task; + } + return null; + } + }; + hyperlinkDetectorTargets.put(ID_CONTEXT_EDITOR_TEXT, context); + hyperlinkDetectorTargets.put(ID_CONTEXT_EDITOR_TASK, context); + } + + protected static class TaskMarkupSourceViewerConfiguration extends MarkupSourceViewerConfiguration { + + private final TaskRepository taskRepository; + + private final AbstractTask task; + + public TaskMarkupSourceViewerConfiguration(IPreferenceStore preferenceStore, TaskRepository taskRepository, + AbstractTask task) { + super(preferenceStore, WikiTextTasksUiPlugin.FONT_REGISTRY_KEY_DEFAULT_FONT, + WikiTextTasksUiPlugin.FONT_REGISTRY_KEY_MONOSPACE_FONT); + this.taskRepository = taskRepository; + this.task = task; + // filter out the platform URL hyperlink detector since Mylyn contributes one as well. + addHyperlinkDetectorDescriptorFilter(new DefaultHyperlinkDetectorDescriptorFilter( + "org.eclipse.ui.internal.editors.text.URLHyperlinkDetector")); //$NON-NLS-1$ + } + + @Override + protected IContentAssistProcessor[] createContentAssistProcessors() { + IContentAssistProcessor processor = TasksUi.getUiFactory().createTaskContentAssistProcessor(taskRepository); + return processor == null ? null : new IContentAssistProcessor[] { processor }; + } + + @Override + public IAnnotationHover getAnnotationHover(ISourceViewer sourceViewer) { + return new DefaultAnnotationHover() { + @Override + protected boolean isIncluded(Annotation annotation) { + return annotation.getType().startsWith("org.eclipse.wikitext") || super.isIncluded(annotation); //$NON-NLS-1$ + } + }; + } + + @SuppressWarnings("rawtypes") + @Override + protected Map getHyperlinkDetectorTargets(ISourceViewer sourceViewer) { + Map hyperlinkDetectorTargets = super.getHyperlinkDetectorTargets(sourceViewer); + addRepositoryHyperlinkDetectorTargets(taskRepository, task, hyperlinkDetectorTargets); + return hyperlinkDetectorTargets; + } + + @Override + public IReconciler getReconciler(ISourceViewer sourceViewer) { + if (sourceViewer.isEditable()) { + return super.getReconciler(sourceViewer); + } else { + return null; + } + } + + @Override + public int getHyperlinkStateMask(ISourceViewer sourceViewer) { + return SWT.NONE; + } + + @Override + public IHyperlinkPresenter getHyperlinkPresenter(ISourceViewer sourceViewer) { + if (fPreferenceStore == null) { + return new TaskHyperlinkPresenter(new RGB(0, 0, 255)); + } + return new TaskHyperlinkPresenter(fPreferenceStore); + } + } + +} #P org.eclipse.mylyn.xplanner.tests Index: src/org/eclipse/mylyn/xplanner/tests/XPlannerRepositoryUiTest.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/sandbox/org.eclipse.mylyn.xplanner.tests/src/org/eclipse/mylyn/xplanner/tests/XPlannerRepositoryUiTest.java,v retrieving revision 1.3 diff -u -r1.3 XPlannerRepositoryUiTest.java --- src/org/eclipse/mylyn/xplanner/tests/XPlannerRepositoryUiTest.java 24 Jul 2009 12:04:24 -0000 1.3 +++ src/org/eclipse/mylyn/xplanner/tests/XPlannerRepositoryUiTest.java 20 May 2010 04:16:10 -0000 @@ -51,7 +51,7 @@ private void checkValidHyperlinks(TaskRepository repository, AbstractRepositoryConnectorUi connectorUi, String testData, String id) throws Exception { - IHyperlink[] hyperlinks = connectorUi.findHyperlinks(repository, testData, -1, 0); + IHyperlink[] hyperlinks = connectorUi.findHyperlinks(repository, null, testData, -1, 0); assertTrue(hyperlinks.length == 1); assertTrue(((TaskHyperlink) hyperlinks[0]).getTaskId().equals(id)); } @@ -59,7 +59,7 @@ private void checkInvalidHyperlinks(TaskRepository repository, AbstractRepositoryConnectorUi connectorUi, String testData) throws Exception { - IHyperlink[] hyperlinks = connectorUi.findHyperlinks(repository, testData, -1, 0); + IHyperlink[] hyperlinks = connectorUi.findHyperlinks(repository, null, testData, -1, 0); assertNull(hyperlinks); } }