View | Details | Raw Unified | Return to bug 304910 | Differences between
and this patch

Collapse All | Expand All

(-)src/org/eclipse/mylyn/bugzilla/tests/ui/BugzillaTaskHyperlinkDetectorTest.java (-69 / +233 lines)
Lines 19-30 Link Here
19
import org.eclipse.jface.text.TextViewer;
19
import org.eclipse.jface.text.TextViewer;
20
import org.eclipse.jface.text.hyperlink.IHyperlink;
20
import org.eclipse.jface.text.hyperlink.IHyperlink;
21
import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
21
import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
22
import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
22
import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager;
23
import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager;
23
import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
24
import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
24
import org.eclipse.mylyn.internal.tasks.ui.editors.TaskHyperlinkDetector;
25
import org.eclipse.mylyn.internal.tasks.ui.editors.TaskHyperlinkDetector;
25
import org.eclipse.mylyn.tasks.core.TaskRepository;
26
import org.eclipse.mylyn.tasks.core.TaskRepository;
26
import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
27
import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
27
import org.eclipse.mylyn.tasks.ui.TaskHyperlink;
28
import org.eclipse.mylyn.tasks.ui.TaskHyperlink;
29
import org.eclipse.mylyn.tasks.ui.TasksUi;
28
import org.eclipse.swt.SWT;
30
import org.eclipse.swt.SWT;
29
import org.eclipse.swt.widgets.Shell;
31
import org.eclipse.swt.widgets.Shell;
30
32
Lines 44-116 Link Here
44
46
45
	private static final String ATTACHMENT_NEW = "Created attachment" + ATTACHMENT_NUMBER;
47
	private static final String ATTACHMENT_NEW = "Created attachment" + ATTACHMENT_NUMBER;
46
48
47
	private final String TASK_FORMAT_1 = "task#1";
49
	private final String TASK_FORMAT_1 = "task#123";
48
50
49
	private final String TASK_FORMAT_2 = "task# 1";
51
	private final String TASK_FORMAT_2 = "task# 123";
50
52
51
	private final String TASK_FORMAT_3 = "task1";
53
	private final String TASK_FORMAT_3 = "task123";
52
54
53
	private final String TASK_FORMAT_4 = "task #1";
55
	private final String TASK_FORMAT_4 = "task #123";
54
56
55
	private final String BUG_FORMAT_1 = "bug# 1";
57
	private final String BUG_FORMAT_1 = "bug# 123";
56
58
57
	private final String BUG_FORMAT_2 = "bug # 1";
59
	private final String BUG_FORMAT_2 = "bug # 123";
58
60
59
	private final String BUG_FORMAT_3 = "bug1";
61
	private final String BUG_FORMAT_3 = "bug123";
60
62
61
	private final String BUG_FORMAT_4 = "bug #1";
63
	private final String BUG_FORMAT_4 = "bug #123";
62
64
63
	private final String BUG_FORMAT_1_2 = "bug# 2";
65
	private final String BUG_FORMAT_1_2 = "bug# 2";
64
66
65
	private final String TASK_FORMAT_1_COMMENT_1 = "task#123c#44556677";
67
	private final String TASK_FORMAT_1_COMMENT_1 = "task#123c#44556677";
66
68
67
	private final String TASK_FORMAT_2_COMMENT_1 = "task# 1c#44556677";
69
	private final String TASK_FORMAT_2_COMMENT_1 = "task# 123c#44556677";
68
70
69
	private final String TASK_FORMAT_3_COMMENT_1 = "task1c#44556677";
71
	private final String TASK_FORMAT_3_COMMENT_1 = "task123c#44556677";
70
72
71
	private final String TASK_FORMAT_4_COMMENT_1 = "task #1c#44556677";
73
	private final String TASK_FORMAT_4_COMMENT_1 = "task #123c#44556677";
72
74
73
	private final String BUG_FORMAT_1_COMMENT_1 = "bug# 1c#44556677";
75
	private final String BUG_FORMAT_1_COMMENT_1 = "bug# 123c#44556677";
74
76
75
	private final String BUG_FORMAT_2_COMMENT_1 = "bug # 1c#44556677";
77
	private final String BUG_FORMAT_2_COMMENT_1 = "bug # 123c#44556677";
76
78
77
	private final String BUG_FORMAT_3_COMMENT_1 = "bug1c#44556677";
79
	private final String BUG_FORMAT_3_COMMENT_1 = "bug123c#44556677";
78
80
79
	private final String BUG_FORMAT_4_COMMENT_1 = "bug #1c#44556677";
81
	private final String BUG_FORMAT_4_COMMENT_1 = "bug #123c#44556677";
80
82
81
	private final String TASK_FORMAT_1_COMMENT_2 = "task#123 comment #44556677";
83
	private final String TASK_FORMAT_1_COMMENT_2 = "task#123 comment #44556677";
82
84
83
	private final String TASK_FORMAT_2_COMMENT_2 = "task# 1 comment #44556677";
85
	private final String TASK_FORMAT_2_COMMENT_2 = "task# 123 comment #44556677";
84
86
85
	private final String TASK_FORMAT_3_COMMENT_2 = "task1 comment #44556677";
87
	private final String TASK_FORMAT_3_COMMENT_2 = "task123 comment #44556677";
86
88
87
	private final String TASK_FORMAT_4_COMMENT_2 = "task #1 comment #44556677";
89
	private final String TASK_FORMAT_4_COMMENT_2 = "task #123 comment #44556677";
88
90
89
	private final String BUG_FORMAT_1_COMMENT_2 = "bug# 1 comment #44556677";
91
	private final String BUG_FORMAT_1_COMMENT_2 = "bug# 123 comment #44556677";
90
92
91
	private final String BUG_FORMAT_2_COMMENT_2 = "bug # 1 comment #44556677";
93
	private final String BUG_FORMAT_2_COMMENT_2 = "bug # 123 comment #44556677";
92
94
93
	private final String BUG_FORMAT_3_COMMENT_2 = "bug1 comment #44556677";
95
	private final String BUG_FORMAT_3_COMMENT_2 = "bug123 comment #44556677";
94
96
95
	private final String BUG_FORMAT_4_COMMENT_2 = "bug #1 comment #44556677";
97
	private final String BUG_FORMAT_4_COMMENT_2 = "bug #123 comment #44556677";
96
98
97
	private final String TASK_FORMAT_1_COMMENT_3 = "task#123 comment#44556677";
99
	private final String TASK_FORMAT_1_COMMENT_3 = "task#123 comment#44556677";
98
100
99
	private final String TASK_FORMAT_2_COMMENT_3 = "task# 1 comment#44556677";
101
	private final String TASK_FORMAT_2_COMMENT_3 = "task# 123 comment#44556677";
100
102
101
	private final String TASK_FORMAT_3_COMMENT_3 = "task1 comment#44556677";
103
	private final String TASK_FORMAT_3_COMMENT_3 = "task123 comment#44556677";
102
104
103
	private final String TASK_FORMAT_4_COMMENT_3 = "task #1 comment#44556677";
105
	private final String TASK_FORMAT_4_COMMENT_3 = "task #123 comment#44556677";
104
106
105
	private final String BUG_FORMAT_1_COMMENT_3 = "bug# 1 comment#44556677";
107
	private final String BUG_FORMAT_1_COMMENT_3 = "bug# 123 comment#44556677";
106
108
107
	private final String BUG_FORMAT_2_COMMENT_3 = "bug # 1 comment#44556677";
109
	private final String BUG_FORMAT_2_COMMENT_3 = "bug # 123 comment#44556677";
108
110
109
	private final String BUG_FORMAT_3_COMMENT_3 = "bug1 comment#44556677";
111
	private final String BUG_FORMAT_3_COMMENT_3 = "bug123 comment#44556677";
110
112
111
	private final String BUG_FORMAT_4_COMMENT_3 = "bug #1 comment#44556677";
113
	private final String BUG_FORMAT_4_COMMENT_3 = "bug #123 comment#44556677";
114
115
	private final String TASK_FORMAT_1_COMMENT_4 = "task#123 comment # 44556677";
116
117
	private final String TASK_FORMAT_2_COMMENT_4 = "task# 123 comment # 44556677";
118
119
	private final String TASK_FORMAT_3_COMMENT_4 = "task123 comment # 44556677";
120
121
	private final String TASK_FORMAT_4_COMMENT_4 = "task #123 comment # 44556677";
122
123
	private final String BUG_FORMAT_1_COMMENT_4 = "bug# 123 comment # 44556677";
124
125
	private final String BUG_FORMAT_2_COMMENT_4 = "bug # 123 comment # 44556677";
126
127
	private final String BUG_FORMAT_3_COMMENT_4 = "bug123 comment # 44556677";
128
129
	private final String BUG_FORMAT_4_COMMENT_4 = "bug #123 comment # 44556677";
130
131
	private final String COMMENT_1 = "comment#44556677";
132
133
	private final String COMMENT_2 = "comment #44556677";
134
135
	private final String COMMENT_3 = "comment # 44556677";
136
137
	private final String COMMENT_4 = "comment# 44556677";
138
139
	private final String COMMENT_5 = "comment 44556677";
112
140
113
	//private BugzillaTaskHyperlinkDetector detector = new BugzillaTaskHyperlinkDetector();
114
	private TaskHyperlinkDetector detector;
141
	private TaskHyperlinkDetector detector;
115
142
116
	private TaskRepository repository1;
143
	private TaskRepository repository1;
Lines 119-134 Link Here
119
146
120
	private TextViewer viewer;
147
	private TextViewer viewer;
121
148
122
	private String[] formats;
123
124
	private String[] commentFormats;
149
	private String[] commentFormats;
125
150
151
	private String[] bugFormats;
152
153
	private String[] bugCommentFormats;
154
126
	private TaskRepositoryManager repositoryManager;
155
	private TaskRepositoryManager repositoryManager;
127
156
128
	private Shell shell;
157
	private Shell shell;
129
158
130
	protected TaskRepository activeRepository;
159
	protected TaskRepository activeRepository;
131
160
161
	protected AbstractTask task;
162
132
	@Override
163
	@Override
133
	protected void setUp() throws Exception {
164
	protected void setUp() throws Exception {
134
		super.setUp();
165
		super.setUp();
Lines 137-147 Link Here
137
168
138
		repository1 = new TaskRepository(BugzillaCorePlugin.CONNECTOR_KIND, "repository_url1");
169
		repository1 = new TaskRepository(BugzillaCorePlugin.CONNECTOR_KIND, "repository_url1");
139
		repository2 = new TaskRepository(BugzillaCorePlugin.CONNECTOR_KIND, "repository_url2");
170
		repository2 = new TaskRepository(BugzillaCorePlugin.CONNECTOR_KIND, "repository_url2");
140
171
		task = (AbstractTask) TasksUi.getRepositoryModel().createTask(repository1, "123");
141
		detector.setContext(new IAdaptable() {
172
		detector.setContext(new IAdaptable() {
142
			@SuppressWarnings("rawtypes")
173
			@SuppressWarnings("rawtypes")
143
			public Object getAdapter(Class adapter) {
174
			public Object getAdapter(Class adapter) {
144
				return (adapter == TaskRepository.class) ? activeRepository : null;
175
				if (adapter == TaskRepository.class) {
176
					return activeRepository;
177
				} else if (adapter == AbstractTask.class) {
178
					return task;
179
				}
180
				return null;
145
			}
181
			}
146
		});
182
		});
147
		setRepository(repository1);
183
		setRepository(repository1);
Lines 152-166 Link Here
152
		repositoryManager = TasksUiPlugin.getRepositoryManager();
188
		repositoryManager = TasksUiPlugin.getRepositoryManager();
153
		repositoryManager.clearRepositories(TasksUiPlugin.getDefault().getRepositoriesFilePath());
189
		repositoryManager.clearRepositories(TasksUiPlugin.getDefault().getRepositoriesFilePath());
154
190
155
		formats = new String[] { TASK_FORMAT_1, TASK_FORMAT_2, TASK_FORMAT_3, TASK_FORMAT_4, BUG_FORMAT_1,
191
		commentFormats = new String[] { COMMENT_1, COMMENT_2, COMMENT_3, COMMENT_4 };
192
		bugFormats = new String[] { TASK_FORMAT_1, TASK_FORMAT_2, TASK_FORMAT_3, TASK_FORMAT_4, BUG_FORMAT_1,
156
				BUG_FORMAT_2, BUG_FORMAT_3, BUG_FORMAT_4 };
193
				BUG_FORMAT_2, BUG_FORMAT_3, BUG_FORMAT_4 };
157
		commentFormats = new String[] { TASK_FORMAT_1_COMMENT_1, TASK_FORMAT_2_COMMENT_1, TASK_FORMAT_3_COMMENT_1,
194
		bugCommentFormats = new String[] { TASK_FORMAT_1_COMMENT_1, TASK_FORMAT_2_COMMENT_1, TASK_FORMAT_3_COMMENT_1,
158
				TASK_FORMAT_4_COMMENT_1, BUG_FORMAT_1_COMMENT_1, BUG_FORMAT_2_COMMENT_1, BUG_FORMAT_3_COMMENT_1,
195
				TASK_FORMAT_4_COMMENT_1, BUG_FORMAT_1_COMMENT_1, BUG_FORMAT_2_COMMENT_1, BUG_FORMAT_3_COMMENT_1,
159
				BUG_FORMAT_4_COMMENT_1, TASK_FORMAT_1_COMMENT_2, TASK_FORMAT_2_COMMENT_2, TASK_FORMAT_3_COMMENT_2,
196
				BUG_FORMAT_4_COMMENT_1, TASK_FORMAT_1_COMMENT_2, TASK_FORMAT_2_COMMENT_2, TASK_FORMAT_3_COMMENT_2,
160
				TASK_FORMAT_4_COMMENT_2, BUG_FORMAT_1_COMMENT_2, BUG_FORMAT_2_COMMENT_2, BUG_FORMAT_3_COMMENT_2,
197
				TASK_FORMAT_4_COMMENT_2, BUG_FORMAT_1_COMMENT_2, BUG_FORMAT_2_COMMENT_2, BUG_FORMAT_3_COMMENT_2,
161
				BUG_FORMAT_4_COMMENT_2, TASK_FORMAT_1_COMMENT_3, TASK_FORMAT_2_COMMENT_3, TASK_FORMAT_3_COMMENT_3,
198
				BUG_FORMAT_4_COMMENT_2, TASK_FORMAT_1_COMMENT_3, TASK_FORMAT_2_COMMENT_3, TASK_FORMAT_3_COMMENT_3,
162
				TASK_FORMAT_4_COMMENT_3, BUG_FORMAT_1_COMMENT_3, BUG_FORMAT_2_COMMENT_3, BUG_FORMAT_3_COMMENT_3,
199
				TASK_FORMAT_4_COMMENT_3, BUG_FORMAT_1_COMMENT_3, BUG_FORMAT_2_COMMENT_3, BUG_FORMAT_3_COMMENT_3,
163
				BUG_FORMAT_4_COMMENT_3 };
200
				BUG_FORMAT_4_COMMENT_3, TASK_FORMAT_1_COMMENT_4, TASK_FORMAT_2_COMMENT_4, TASK_FORMAT_3_COMMENT_4,
201
				TASK_FORMAT_4_COMMENT_4, BUG_FORMAT_1_COMMENT_4, BUG_FORMAT_2_COMMENT_4, BUG_FORMAT_3_COMMENT_4,
202
				BUG_FORMAT_4_COMMENT_4 };
164
	}
203
	}
165
204
166
	private void setRepository(final TaskRepository repository) {
205
	private void setRepository(final TaskRepository repository) {
Lines 178-194 Link Here
178
	}
217
	}
179
218
180
	public void testBeginningWithSpecialChars() {
219
	public void testBeginningWithSpecialChars() {
181
		for (String format : formats) {
220
		for (String format : bugFormats) {
182
			String testString = "First line\n:" + format + " is at the beginning";
221
			String testString = "First line\n:" + format + " is at the beginning";
183
			viewer.setDocument(new Document(testString));
222
			viewer.setDocument(new Document(testString));
184
			Region region = new Region(0, testString.length());
223
			Region region = new Region(0, testString.length());
185
			IHyperlink[] links = detector.detectHyperlinks(viewer, region, false);
224
			IHyperlink[] links = detector.detectHyperlinks(viewer, region, false);
186
			assertNotNull(links);
225
			assertNotNull(links);
187
			assertEquals(1, links.length);
226
			assertEquals(1, links.length);
188
			assertEquals(testString.indexOf(format), links[0].getHyperlinkRegion().getOffset());
227
			assertTrue(links[0] instanceof TaskHyperlink);
189
			Object comment = ((TaskHyperlink) links[0]).getSelection();
228
			TaskHyperlink taskLink = (TaskHyperlink) links[0];
229
			assertEquals("123", taskLink.getTaskId());
230
			assertEquals(testString.indexOf(format), taskLink.getHyperlinkRegion().getOffset());
231
			Object comment = taskLink.getSelection();
190
			assertNull(comment);
232
			assertNull(comment);
191
		}
233
		}
234
		for (String format : bugCommentFormats) {
235
			String testString = "First line\n:" + format + " is at the beginning";
236
			viewer.setDocument(new Document(testString));
237
			Region region = new Region(0, testString.length());
238
			IHyperlink[] links = detector.detectHyperlinks(viewer, region, false);
239
			assertNotNull(links);
240
			assertEquals(1, links.length);
241
			assertTrue(links[0] instanceof TaskHyperlink);
242
			TaskHyperlink taskLink = (TaskHyperlink) links[0];
243
			assertEquals("123", taskLink.getTaskId());
244
			assertEquals(testString.indexOf(format), taskLink.getHyperlinkRegion().getOffset());
245
			Object comment = taskLink.getSelection();
246
			assertNotNull(comment);
247
			assertEquals(TaskAttribute.PREFIX_COMMENT + "44556677", comment);
248
		}
192
		for (String format : commentFormats) {
249
		for (String format : commentFormats) {
193
			String testString = "First line\n:" + format + " is at the beginning";
250
			String testString = "First line\n:" + format + " is at the beginning";
194
			viewer.setDocument(new Document(testString));
251
			viewer.setDocument(new Document(testString));
Lines 196-220 Link Here
196
			IHyperlink[] links = detector.detectHyperlinks(viewer, region, false);
253
			IHyperlink[] links = detector.detectHyperlinks(viewer, region, false);
197
			assertNotNull(links);
254
			assertNotNull(links);
198
			assertEquals(1, links.length);
255
			assertEquals(1, links.length);
199
			assertEquals(testString.indexOf(format), links[0].getHyperlinkRegion().getOffset());
256
			assertTrue(links[0] instanceof TaskHyperlink);
200
			Object comment = ((TaskHyperlink) links[0]).getSelection();
257
			TaskHyperlink taskLink = (TaskHyperlink) links[0];
258
			assertEquals("123", taskLink.getTaskId());
259
			assertEquals(testString.indexOf(format), taskLink.getHyperlinkRegion().getOffset());
260
			Object comment = taskLink.getSelection();
201
			assertNotNull(comment);
261
			assertNotNull(comment);
202
			assertEquals(TaskAttribute.PREFIX_COMMENT + "44556677", comment);
262
			assertEquals(TaskAttribute.PREFIX_COMMENT + "44556677", comment);
203
		}
263
		}
204
	}
264
	}
205
265
206
	public void testBeginningOfSecondLine() {
266
	public void testBeginningOfSecondLine() {
207
		for (String format : formats) {
267
		for (String format : bugFormats) {
208
			String testString = "First line\n" + format + " is at the beginning";
268
			String testString = "First line\n" + format + " is at the beginning";
209
			viewer.setDocument(new Document(testString));
269
			viewer.setDocument(new Document(testString));
210
			Region region = new Region(0, testString.length());
270
			Region region = new Region(0, testString.length());
211
			IHyperlink[] links = detector.detectHyperlinks(viewer, region, false);
271
			IHyperlink[] links = detector.detectHyperlinks(viewer, region, false);
212
			assertNotNull(links);
272
			assertNotNull(links);
213
			assertEquals(1, links.length);
273
			assertEquals(1, links.length);
214
			assertEquals(testString.indexOf(format), links[0].getHyperlinkRegion().getOffset());
274
			assertTrue(links[0] instanceof TaskHyperlink);
215
			Object comment = ((TaskHyperlink) links[0]).getSelection();
275
			TaskHyperlink taskLink = (TaskHyperlink) links[0];
276
			assertEquals("123", taskLink.getTaskId());
277
			assertEquals(testString.indexOf(format), taskLink.getHyperlinkRegion().getOffset());
278
			Object comment = taskLink.getSelection();
216
			assertNull(comment);
279
			assertNull(comment);
217
		}
280
		}
281
		for (String format : bugCommentFormats) {
282
			String testString = "First line\n" + format + " is at the beginning";
283
			viewer.setDocument(new Document(testString));
284
			Region region = new Region(0, testString.length());
285
			IHyperlink[] links = detector.detectHyperlinks(viewer, region, false);
286
			assertNotNull(links);
287
			assertEquals(1, links.length);
288
			assertTrue(links[0] instanceof TaskHyperlink);
289
			TaskHyperlink taskLink = (TaskHyperlink) links[0];
290
			assertEquals("123", taskLink.getTaskId());
291
			assertEquals(testString.indexOf(format), taskLink.getHyperlinkRegion().getOffset());
292
			Object comment = taskLink.getSelection();
293
			assertNotNull(comment);
294
			assertEquals(TaskAttribute.PREFIX_COMMENT + "44556677", comment);
295
		}
218
		for (String format : commentFormats) {
296
		for (String format : commentFormats) {
219
			String testString = "First line\n" + format + " is at the beginning";
297
			String testString = "First line\n" + format + " is at the beginning";
220
			viewer.setDocument(new Document(testString));
298
			viewer.setDocument(new Document(testString));
Lines 222-246 Link Here
222
			IHyperlink[] links = detector.detectHyperlinks(viewer, region, false);
300
			IHyperlink[] links = detector.detectHyperlinks(viewer, region, false);
223
			assertNotNull(links);
301
			assertNotNull(links);
224
			assertEquals(1, links.length);
302
			assertEquals(1, links.length);
225
			assertEquals(testString.indexOf(format), links[0].getHyperlinkRegion().getOffset());
303
			assertTrue(links[0] instanceof TaskHyperlink);
226
			Object comment = ((TaskHyperlink) links[0]).getSelection();
304
			TaskHyperlink taskLink = (TaskHyperlink) links[0];
305
			assertEquals("123", taskLink.getTaskId());
306
			assertEquals(testString.indexOf(format), taskLink.getHyperlinkRegion().getOffset());
307
			Object comment = taskLink.getSelection();
227
			assertNotNull(comment);
308
			assertNotNull(comment);
228
			assertEquals(TaskAttribute.PREFIX_COMMENT + "44556677", comment);
309
			assertEquals(TaskAttribute.PREFIX_COMMENT + "44556677", comment);
229
		}
310
		}
230
	}
311
	}
231
312
232
	public void testBeginningOfSecondLineWithisWhitespace() {
313
	public void testBeginningOfSecondLineWithisWhitespace() {
233
		for (String format : formats) {
314
		for (String format : bugFormats) {
234
			String testString = "First line\n \t " + format + " is at the beginning";
315
			String testString = "First line\n \t " + format + " is at the beginning";
235
			viewer.setDocument(new Document(testString));
316
			viewer.setDocument(new Document(testString));
236
			Region region = new Region(0, testString.length());
317
			Region region = new Region(0, testString.length());
237
			IHyperlink[] links = detector.detectHyperlinks(viewer, region, false);
318
			IHyperlink[] links = detector.detectHyperlinks(viewer, region, false);
238
			assertNotNull(links);
319
			assertNotNull(links);
239
			assertEquals(1, links.length);
320
			assertEquals(1, links.length);
240
			assertEquals(testString.indexOf(format), links[0].getHyperlinkRegion().getOffset());
321
			assertTrue(links[0] instanceof TaskHyperlink);
241
			Object comment = ((TaskHyperlink) links[0]).getSelection();
322
			TaskHyperlink taskLink = (TaskHyperlink) links[0];
323
			assertEquals("123", taskLink.getTaskId());
324
			assertEquals(testString.indexOf(format), taskLink.getHyperlinkRegion().getOffset());
325
			Object comment = taskLink.getSelection();
242
			assertNull(comment);
326
			assertNull(comment);
243
		}
327
		}
328
		for (String format : bugCommentFormats) {
329
			String testString = "First line\n \t " + format + " is at the beginning";
330
			viewer.setDocument(new Document(testString));
331
			Region region = new Region(0, testString.length());
332
			IHyperlink[] links = detector.detectHyperlinks(viewer, region, false);
333
			assertNotNull(links);
334
			assertEquals(1, links.length);
335
			assertTrue(links[0] instanceof TaskHyperlink);
336
			TaskHyperlink taskLink = (TaskHyperlink) links[0];
337
			assertEquals("123", taskLink.getTaskId());
338
			assertEquals(testString.indexOf(format), taskLink.getHyperlinkRegion().getOffset());
339
			Object comment = taskLink.getSelection();
340
			assertNotNull(comment);
341
			assertEquals(TaskAttribute.PREFIX_COMMENT + "44556677", comment);
342
		}
244
		for (String format : commentFormats) {
343
		for (String format : commentFormats) {
245
			String testString = "First line\n \t " + format + " is at the beginning";
344
			String testString = "First line\n \t " + format + " is at the beginning";
246
			viewer.setDocument(new Document(testString));
345
			viewer.setDocument(new Document(testString));
Lines 248-272 Link Here
248
			IHyperlink[] links = detector.detectHyperlinks(viewer, region, false);
347
			IHyperlink[] links = detector.detectHyperlinks(viewer, region, false);
249
			assertNotNull(links);
348
			assertNotNull(links);
250
			assertEquals(1, links.length);
349
			assertEquals(1, links.length);
251
			assertEquals(testString.indexOf(format), links[0].getHyperlinkRegion().getOffset());
350
			assertTrue(links[0] instanceof TaskHyperlink);
252
			Object comment = ((TaskHyperlink) links[0]).getSelection();
351
			TaskHyperlink taskLink = (TaskHyperlink) links[0];
352
			assertEquals("123", taskLink.getTaskId());
353
			assertEquals(testString.indexOf(format), taskLink.getHyperlinkRegion().getOffset());
354
			Object comment = taskLink.getSelection();
253
			assertNotNull(comment);
355
			assertNotNull(comment);
254
			assertEquals(TaskAttribute.PREFIX_COMMENT + "44556677", comment);
356
			assertEquals(TaskAttribute.PREFIX_COMMENT + "44556677", comment);
255
		}
357
		}
256
	}
358
	}
257
359
258
	public void testBeginning() {
360
	public void testBeginning() {
259
		for (String format : formats) {
361
		for (String format : bugFormats) {
260
			String testString = format + " is at the beginning";
362
			String testString = format + " is at the beginning";
261
			viewer.setDocument(new Document(testString));
363
			viewer.setDocument(new Document(testString));
262
			Region region = new Region(0, testString.length());
364
			Region region = new Region(0, testString.length());
263
			IHyperlink[] links = detector.detectHyperlinks(viewer, region, false);
365
			IHyperlink[] links = detector.detectHyperlinks(viewer, region, false);
264
			assertNotNull(links);
366
			assertNotNull(links);
265
			assertEquals(1, links.length);
367
			assertEquals(1, links.length);
266
			assertEquals(testString.indexOf(format), links[0].getHyperlinkRegion().getOffset());
368
			assertTrue(links[0] instanceof TaskHyperlink);
267
			Object comment = ((TaskHyperlink) links[0]).getSelection();
369
			TaskHyperlink taskLink = (TaskHyperlink) links[0];
370
			assertEquals("123", taskLink.getTaskId());
371
			assertEquals(testString.indexOf(format), taskLink.getHyperlinkRegion().getOffset());
372
			Object comment = taskLink.getSelection();
268
			assertNull(comment);
373
			assertNull(comment);
269
		}
374
		}
375
		for (String format : bugCommentFormats) {
376
			String testString = format + " is at the beginning";
377
			viewer.setDocument(new Document(testString));
378
			Region region = new Region(0, testString.length());
379
			IHyperlink[] links = detector.detectHyperlinks(viewer, region, false);
380
			assertNotNull(links);
381
			assertEquals(1, links.length);
382
			assertTrue(links[0] instanceof TaskHyperlink);
383
			TaskHyperlink taskLink = (TaskHyperlink) links[0];
384
			assertEquals("123", taskLink.getTaskId());
385
			assertEquals(testString.indexOf(format), taskLink.getHyperlinkRegion().getOffset());
386
			Object comment = taskLink.getSelection();
387
			assertNotNull(comment);
388
			assertEquals(TaskAttribute.PREFIX_COMMENT + "44556677", comment);
389
		}
270
		for (String format : commentFormats) {
390
		for (String format : commentFormats) {
271
			String testString = format + " is at the beginning";
391
			String testString = format + " is at the beginning";
272
			viewer.setDocument(new Document(testString));
392
			viewer.setDocument(new Document(testString));
Lines 274-288 Link Here
274
			IHyperlink[] links = detector.detectHyperlinks(viewer, region, false);
394
			IHyperlink[] links = detector.detectHyperlinks(viewer, region, false);
275
			assertNotNull(links);
395
			assertNotNull(links);
276
			assertEquals(1, links.length);
396
			assertEquals(1, links.length);
277
			assertEquals(testString.indexOf(format), links[0].getHyperlinkRegion().getOffset());
397
			assertTrue(links[0] instanceof TaskHyperlink);
278
			Object comment = ((TaskHyperlink) links[0]).getSelection();
398
			TaskHyperlink taskLink = (TaskHyperlink) links[0];
399
			assertEquals("123", taskLink.getTaskId());
400
			assertEquals(testString.indexOf(format), taskLink.getHyperlinkRegion().getOffset());
401
			Object comment = taskLink.getSelection();
279
			assertNotNull(comment);
402
			assertNotNull(comment);
280
			assertEquals(TaskAttribute.PREFIX_COMMENT + "44556677", comment);
403
			assertEquals(TaskAttribute.PREFIX_COMMENT + "44556677", comment);
281
		}
404
		}
282
	}
405
	}
283
406
284
	public void testEnd() {
407
	public void testEnd() {
285
		for (String format : formats) {
408
		for (String format : bugFormats) {
286
			String testString = "is ends with " + format;
409
			String testString = "is ends with " + format;
287
			viewer.setDocument(new Document(testString));
410
			viewer.setDocument(new Document(testString));
288
			int i = testString.indexOf(format);
411
			int i = testString.indexOf(format);
Lines 290-299 Link Here
290
			IHyperlink[] links = detector.detectHyperlinks(viewer, region, false);
413
			IHyperlink[] links = detector.detectHyperlinks(viewer, region, false);
291
			assertNotNull(links);
414
			assertNotNull(links);
292
			assertEquals(1, links.length);
415
			assertEquals(1, links.length);
293
			assertEquals(i, links[0].getHyperlinkRegion().getOffset());
416
			assertTrue(links[0] instanceof TaskHyperlink);
294
			Object comment = ((TaskHyperlink) links[0]).getSelection();
417
			TaskHyperlink taskLink = (TaskHyperlink) links[0];
418
			assertEquals("123", taskLink.getTaskId());
419
			assertEquals(testString.indexOf(format), taskLink.getHyperlinkRegion().getOffset());
420
			Object comment = taskLink.getSelection();
295
			assertNull(comment);
421
			assertNull(comment);
296
		}
422
		}
423
		for (String format : bugCommentFormats) {
424
			String testString = "is ends with " + format;
425
			viewer.setDocument(new Document(testString));
426
			int i = testString.indexOf(format);
427
			Region region = new Region(i, testString.length() - i);
428
			IHyperlink[] links = detector.detectHyperlinks(viewer, region, false);
429
			assertNotNull(links);
430
			assertEquals(1, links.length);
431
			assertTrue(links[0] instanceof TaskHyperlink);
432
			TaskHyperlink taskLink = (TaskHyperlink) links[0];
433
			assertEquals("123", taskLink.getTaskId());
434
			assertEquals(testString.indexOf(format), taskLink.getHyperlinkRegion().getOffset());
435
			Object comment = taskLink.getSelection();
436
			assertNotNull(comment);
437
			assertEquals(TaskAttribute.PREFIX_COMMENT + "44556677", comment);
438
		}
297
		for (String format : commentFormats) {
439
		for (String format : commentFormats) {
298
			String testString = "is ends with " + format;
440
			String testString = "is ends with " + format;
299
			viewer.setDocument(new Document(testString));
441
			viewer.setDocument(new Document(testString));
Lines 301-315 Link Here
301
			IHyperlink[] links = detector.detectHyperlinks(viewer, region, false);
443
			IHyperlink[] links = detector.detectHyperlinks(viewer, region, false);
302
			assertNotNull(links);
444
			assertNotNull(links);
303
			assertEquals(1, links.length);
445
			assertEquals(1, links.length);
304
			assertEquals(testString.indexOf(format), links[0].getHyperlinkRegion().getOffset());
446
			assertTrue(links[0] instanceof TaskHyperlink);
305
			Object comment = ((TaskHyperlink) links[0]).getSelection();
447
			TaskHyperlink taskLink = (TaskHyperlink) links[0];
448
			assertEquals("123", taskLink.getTaskId());
449
			assertEquals(testString.indexOf(format), taskLink.getHyperlinkRegion().getOffset());
450
			Object comment = taskLink.getSelection();
306
			assertNotNull(comment);
451
			assertNotNull(comment);
307
			assertEquals(TaskAttribute.PREFIX_COMMENT + "44556677", comment);
452
			assertEquals(TaskAttribute.PREFIX_COMMENT + "44556677", comment);
308
		}
453
		}
309
	}
454
	}
310
455
311
	public void testMiddle() {
456
	public void testMiddle() {
312
		for (String format : formats) {
457
		for (String format : bugFormats) {
313
			String testString = "is a " + format + " in the middle";
458
			String testString = "is a " + format + " in the middle";
314
			viewer.setDocument(new Document(testString));
459
			viewer.setDocument(new Document(testString));
315
			int i = testString.indexOf(format);
460
			int i = testString.indexOf(format);
Lines 317-326 Link Here
317
			IHyperlink[] links = detector.detectHyperlinks(viewer, region, false);
462
			IHyperlink[] links = detector.detectHyperlinks(viewer, region, false);
318
			assertNotNull(links);
463
			assertNotNull(links);
319
			assertEquals(1, links.length);
464
			assertEquals(1, links.length);
320
			assertEquals(testString.indexOf(format), links[0].getHyperlinkRegion().getOffset());
465
			assertTrue(links[0] instanceof TaskHyperlink);
321
			Object comment = ((TaskHyperlink) links[0]).getSelection();
466
			TaskHyperlink taskLink = (TaskHyperlink) links[0];
467
			assertEquals("123", taskLink.getTaskId());
468
			assertEquals(testString.indexOf(format), taskLink.getHyperlinkRegion().getOffset());
469
			Object comment = taskLink.getSelection();
322
			assertNull(comment);
470
			assertNull(comment);
323
		}
471
		}
472
		for (String format : bugCommentFormats) {
473
			String testString = "is a " + format + " in the middle";
474
			viewer.setDocument(new Document(testString));
475
			Region region = new Region(0, testString.length());
476
			IHyperlink[] links = detector.detectHyperlinks(viewer, region, false);
477
			assertNotNull(links);
478
			assertEquals(1, links.length);
479
			assertTrue(links[0] instanceof TaskHyperlink);
480
			TaskHyperlink taskLink = (TaskHyperlink) links[0];
481
			assertEquals("123", taskLink.getTaskId());
482
			assertEquals(testString.indexOf(format), taskLink.getHyperlinkRegion().getOffset());
483
			Object comment = taskLink.getSelection();
484
			assertNotNull(comment);
485
			assertEquals(TaskAttribute.PREFIX_COMMENT + "44556677", comment);
486
		}
324
		for (String format : commentFormats) {
487
		for (String format : commentFormats) {
325
			String testString = "is a " + format + " in the middle";
488
			String testString = "is a " + format + " in the middle";
326
			viewer.setDocument(new Document(testString));
489
			viewer.setDocument(new Document(testString));
Lines 328-335 Link Here
328
			IHyperlink[] links = detector.detectHyperlinks(viewer, region, false);
491
			IHyperlink[] links = detector.detectHyperlinks(viewer, region, false);
329
			assertNotNull(links);
492
			assertNotNull(links);
330
			assertEquals(1, links.length);
493
			assertEquals(1, links.length);
331
			assertEquals(testString.indexOf(format), links[0].getHyperlinkRegion().getOffset());
494
			assertTrue(links[0] instanceof TaskHyperlink);
332
			Object comment = ((TaskHyperlink) links[0]).getSelection();
495
			TaskHyperlink taskLink = (TaskHyperlink) links[0];
496
			assertEquals("123", taskLink.getTaskId());
497
			assertEquals(testString.indexOf(format), taskLink.getHyperlinkRegion().getOffset());
498
			Object comment = taskLink.getSelection();
333
			assertNotNull(comment);
499
			assertNotNull(comment);
334
			assertEquals(TaskAttribute.PREFIX_COMMENT + "44556677", comment);
500
			assertEquals(TaskAttribute.PREFIX_COMMENT + "44556677", comment);
335
		}
501
		}
Lines 473-479 Link Here
473
	public void testAttachmentOld() {
639
	public void testAttachmentOld() {
474
		String testString = ATTACHMENT_OLD;
640
		String testString = ATTACHMENT_OLD;
475
		viewer.setDocument(new Document(testString));
641
		viewer.setDocument(new Document(testString));
476
		int i = testString.indexOf(ATTACHMENT_NUMBER);
477
		Region region = new Region(0, testString.length());
642
		Region region = new Region(0, testString.length());
478
		IHyperlink[] links = detector.detectHyperlinks(viewer, region, false);
643
		IHyperlink[] links = detector.detectHyperlinks(viewer, region, false);
479
		assertNotNull(links);
644
		assertNotNull(links);
Lines 484-490 Link Here
484
	public void testAttachmentNew() {
649
	public void testAttachmentNew() {
485
		String testString = ATTACHMENT_NEW;
650
		String testString = ATTACHMENT_NEW;
486
		viewer.setDocument(new Document(testString));
651
		viewer.setDocument(new Document(testString));
487
		int i = testString.indexOf(ATTACHMENT_NUMBER);
488
		Region region = new Region(0, testString.length());
652
		Region region = new Region(0, testString.length());
489
		IHyperlink[] links = detector.detectHyperlinks(viewer, region, false);
653
		IHyperlink[] links = detector.detectHyperlinks(viewer, region, false);
490
		assertNotNull(links);
654
		assertNotNull(links);
(-)src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaConnectorUi.java (-52 / +96 lines)
Lines 32-37 Link Here
32
import org.eclipse.mylyn.internal.bugzilla.ui.TaskAttachmentHyperlink;
32
import org.eclipse.mylyn.internal.bugzilla.ui.TaskAttachmentHyperlink;
33
import org.eclipse.mylyn.internal.bugzilla.ui.search.BugzillaSearchPage;
33
import org.eclipse.mylyn.internal.bugzilla.ui.search.BugzillaSearchPage;
34
import org.eclipse.mylyn.internal.bugzilla.ui.wizard.NewBugzillaTaskWizard;
34
import org.eclipse.mylyn.internal.bugzilla.ui.wizard.NewBugzillaTaskWizard;
35
import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
35
import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
36
import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
36
import org.eclipse.mylyn.tasks.core.ITask;
37
import org.eclipse.mylyn.tasks.core.ITask;
37
import org.eclipse.mylyn.tasks.core.ITaskComment;
38
import org.eclipse.mylyn.tasks.core.ITaskComment;
Lines 51-65 Link Here
51
 */
52
 */
52
public class BugzillaConnectorUi extends AbstractRepositoryConnectorUi {
53
public class BugzillaConnectorUi extends AbstractRepositoryConnectorUi {
53
54
54
	private static final int TASK_NUM_GROUP = 5;
55
	private static final int GET_TASK_NUM_GROUP = 8;
55
56
56
	private static final int COMMENT_NUM_GROUP = 10;
57
	private static final int GET_COMMENT_NUM_GROUP = 13;
57
58
58
	private static final int ATTACHMENT_NUM_GROUP = 14;
59
	private static final int GET_ATTACHMENT_NUM_GROUP = 3;
59
60
60
	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$
61
	private static final String regexp_bug = "(((duplicate of|((\\W||^)+(bug|task)))( ?#? ?)(\\d+))?((\\W||\\s)*(comment|c)??(\\s*#\\s*)(\\d+))?)"; //$NON-NLS-1$
61
62
62
	private static final Pattern PATTERN = Pattern.compile(regexp, Pattern.CASE_INSENSITIVE);
63
	private static final String regexp_attachment = "Created (an )?attachment\\s*(\\(id=)?(\\d+)"; //$NON-NLS-1$
64
65
	private static final Pattern PATTERN_BUG = Pattern.compile(regexp_bug, Pattern.CASE_INSENSITIVE);
66
67
	private static final Pattern PATTERN_ATTACHMENT = Pattern.compile(regexp_attachment, Pattern.CASE_INSENSITIVE);
63
68
64
	@Override
69
	@Override
65
	public String getAccountCreationUrl(TaskRepository taskRepository) {
70
	public String getAccountCreationUrl(TaskRepository taskRepository) {
Lines 122-147 Link Here
122
	}
127
	}
123
128
124
	@Override
129
	@Override
125
	public IHyperlink[] findHyperlinks(TaskRepository repository, String text, int index, int textOffset) {
126
		ArrayList<IHyperlink> hyperlinksFound = null;
127
128
		Matcher m = PATTERN.matcher(text);
129
		while (m.find()) {
130
			if (index == -1 || (index >= m.start() && index <= m.end())) {
131
				IHyperlink link = extractHyperlink(repository, textOffset, m);
132
				if (link != null) {
133
					if (hyperlinksFound == null) {
134
						hyperlinksFound = new ArrayList<IHyperlink>();
135
					}
136
					hyperlinksFound.add(link);
137
				}
138
			}
139
		}
140
141
		return (hyperlinksFound != null) ? hyperlinksFound.toArray(new IHyperlink[0]) : null;
142
	}
143
144
	@Override
145
	public String getTaskKindLabel(ITask repositoryTask) {
130
	public String getTaskKindLabel(ITask repositoryTask) {
146
		return IBugzillaConstants.BUGZILLA_TASK_KIND;
131
		return IBugzillaConstants.BUGZILLA_TASK_KIND;
147
	}
132
	}
Lines 191-204 Link Here
191
		return custom != null && custom.equals(Boolean.TRUE.toString());
176
		return custom != null && custom.equals(Boolean.TRUE.toString());
192
	}
177
	}
193
178
194
	private static IHyperlink extractHyperlink(TaskRepository repository, int regionOffset, Matcher m) {
179
	@Override
180
	public IWizardPage getTaskAttachmentPage(TaskAttachmentModel model) {
181
		return new BugzillaTaskAttachmentPage(model);
182
	}
195
183
196
		int start = -1;
184
	@Override
185
	public IHyperlink[] findHyperlinks(TaskRepository repository, AbstractTask task, String text, int index,
186
			int textOffset) {
187
		ArrayList<IHyperlink> hyperlinksFound = null;
188
		Matcher mb = PATTERN_BUG.matcher(text);
189
		while (mb.find()) {
190
			if (index == -1 || (index >= mb.start() && index <= mb.end())) {
191
				IHyperlink link = extractHyperlinkBug(repository, task, textOffset, mb);
192
				if (link != null) {
193
					if (hyperlinksFound == null) {
194
						hyperlinksFound = new ArrayList<IHyperlink>();
195
					}
196
					hyperlinksFound.add(link);
197
				}
198
			}
199
		}
200
		Matcher ma = PATTERN_ATTACHMENT.matcher(text);
201
		while (ma.find()) {
202
			if (index == -1 || (index >= ma.start() && index <= ma.end())) {
203
				IHyperlink link = extractHyperlinkAttachment(repository, textOffset, ma);
204
				if (link != null) {
205
					if (hyperlinksFound == null) {
206
						hyperlinksFound = new ArrayList<IHyperlink>();
207
					}
208
					hyperlinksFound.add(link);
209
				}
210
			}
211
		}
212
213
		return (hyperlinksFound != null) ? hyperlinksFound.toArray(new IHyperlink[0]) : null;
214
	}
197
215
198
		int a = m.groupCount();
216
	private static IHyperlink extractHyperlinkBug(TaskRepository repository, AbstractTask task, int regionOffset,
217
			Matcher m) {
199
218
219
		int start = m.start();
200
		if (m.group().startsWith("duplicate")) { //$NON-NLS-1$
220
		if (m.group().startsWith("duplicate")) { //$NON-NLS-1$
201
			start = m.start() + m.group().indexOf(m.group(TASK_NUM_GROUP));
221
			start = m.start() + m.group().indexOf(m.group(GET_TASK_NUM_GROUP));
202
		} else {
222
		} else {
203
			start = m.start();
223
			start = m.start();
204
			for (int index = 0; index < m.group().length() && !Character.isLetter(m.group().charAt(index)); index++, start++) {
224
			for (int index = 0; index < m.group().length() && !Character.isLetter(m.group().charAt(index)); index++, start++) {
Lines 211-248 Link Here
211
			end = m.group().length();
231
			end = m.group().length();
212
		}
232
		}
213
233
214
		try {
234
		start += regionOffset;
215
			start += regionOffset;
235
		end += regionOffset;
216
			end += regionOffset;
236
		String bugId = m.group(GET_TASK_NUM_GROUP);
217
237
		if (bugId == null) {
218
			String bugId = m.group(TASK_NUM_GROUP);
238
			String commentId = m.group(GET_COMMENT_NUM_GROUP);
219
			if (bugId == null) {
239
			IRegion sregion = new Region(start, end - start);
220
				String attachmentId = m.group(ATTACHMENT_NUM_GROUP);
240
			if (commentId != null) {
221
				if (attachmentId != null) {
241
				String taskID;
222
					start = start + m.group().indexOf(m.group(ATTACHMENT_NUM_GROUP));
242
				if (task != null) {
223
243
					taskID = task.getTaskId();
224
					IRegion sregion = new Region(start, end - start);
244
				} else {
225
					return new TaskAttachmentHyperlink(sregion, repository, attachmentId);
245
					taskID = ""; //$NON-NLS-1$
226
				}
246
				}
227
			} else {
247
				TaskHyperlink taskHyperLink = new TaskHyperlink(sregion, repository, taskID);
228
				bugId.trim();
229
				IRegion sregion = new Region(start, end - start);
230
				TaskHyperlink taskHyperLink = new TaskHyperlink(sregion, repository, bugId);
231
				String commentId = m.group(COMMENT_NUM_GROUP);
232
				if (commentId != null) {
248
				if (commentId != null) {
233
					taskHyperLink.setSelection(TaskAttribute.PREFIX_COMMENT + commentId);
249
					taskHyperLink.setSelection(TaskAttribute.PREFIX_COMMENT + commentId);
234
				}
250
				}
235
				return taskHyperLink;
251
				return taskHyperLink;
236
			}
237
252
238
		} catch (NumberFormatException e) {
253
			}
254
		} else {
255
			bugId.trim();
256
			IRegion sregion = new Region(start, end - start);
257
			TaskHyperlink taskHyperLink = new TaskHyperlink(sregion, repository, bugId);
258
			String commentId = m.group(GET_COMMENT_NUM_GROUP);
259
			if (commentId != null) {
260
				taskHyperLink.setSelection(TaskAttribute.PREFIX_COMMENT + commentId);
261
			}
262
			return taskHyperLink;
239
		}
263
		}
240
		return null;
264
		return null;
241
	}
265
	}
242
266
243
	@Override
267
	private static IHyperlink extractHyperlinkAttachment(TaskRepository repository, int regionOffset, Matcher m) {
244
	public IWizardPage getTaskAttachmentPage(TaskAttachmentModel model) {
268
245
		return new BugzillaTaskAttachmentPage(model);
269
		int start = -1;
246
	}
270
		start = m.start();
271
		for (int index = 0; index < m.group().length() && !Character.isLetter(m.group().charAt(index)); index++, start++) {
272
		}
273
274
		int end = m.end();
275
276
		if (end == -1) {
277
			end = m.group().length();
278
		}
279
280
		start += regionOffset;
281
		end += regionOffset;
247
282
283
		String attachmentId = m.group(GET_ATTACHMENT_NUM_GROUP);
284
		if (attachmentId != null) {
285
			start = start + m.group().indexOf(m.group(GET_ATTACHMENT_NUM_GROUP));
286
287
			IRegion sregion = new Region(start, end - start);
288
			return new TaskAttachmentHyperlink(sregion, repository, attachmentId);
289
		}
290
		return null;
291
	}
248
}
292
}
(-)src/org/eclipse/mylyn/tasks/tests/connector/MockRepositoryConnectorUi.java (-1 / +3 lines)
Lines 19-24 Link Here
19
import org.eclipse.jface.text.Region;
19
import org.eclipse.jface.text.Region;
20
import org.eclipse.jface.text.hyperlink.IHyperlink;
20
import org.eclipse.jface.text.hyperlink.IHyperlink;
21
import org.eclipse.jface.wizard.IWizard;
21
import org.eclipse.jface.wizard.IWizard;
22
import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
22
import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
23
import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
23
import org.eclipse.mylyn.tasks.core.ITaskMapping;
24
import org.eclipse.mylyn.tasks.core.ITaskMapping;
24
import org.eclipse.mylyn.tasks.core.TaskRepository;
25
import org.eclipse.mylyn.tasks.core.TaskRepository;
Lines 63-69 Link Here
63
	}
64
	}
64
65
65
	@Override
66
	@Override
66
	public IHyperlink[] findHyperlinks(TaskRepository repository, String text, int index, int textOffset) {
67
	public IHyperlink[] findHyperlinks(TaskRepository repository, AbstractTask task, String text, int index,
68
			int textOffset) {
67
		List<IHyperlink> links = new ArrayList<IHyperlink>();
69
		List<IHyperlink> links = new ArrayList<IHyperlink>();
68
		Matcher m = HYPERLINK_PATTERN.matcher(text);
70
		Matcher m = HYPERLINK_PATTERN.matcher(text);
69
		while (m.find()) {
71
		while (m.find()) {
(-)src/org/eclipse/mylyn/internal/tasks/ui/editors/AttributePart.java (-1 / +1 lines)
Lines 117-123 Link Here
117
		urlComposite.setLayout(urlLayout);
117
		urlComposite.setLayout(urlLayout);
118
		GridDataFactory.fillDefaults().grab(true, false).applyTo(urlComposite);
118
		GridDataFactory.fillDefaults().grab(true, false).applyTo(urlComposite);
119
119
120
		urlEditor = new RichTextEditor(getRepository(), SWT.FLAT | SWT.SINGLE) {
120
		urlEditor = new RichTextEditor(getRepository(), SWT.FLAT | SWT.SINGLE, null, null, getTask()) {
121
			@Override
121
			@Override
122
			protected void valueChanged(String value) {
122
			protected void valueChanged(String value) {
123
				updateButtons();
123
				updateButtons();
(-)src/org/eclipse/mylyn/internal/tasks/ui/editors/IAbstractTaskEditorExtension2.java (+21 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2010 Frank Becker and others.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 *
8
 * Contributors:
9
 *     Frank Becker - initial API and implementation
10
 *******************************************************************************/
11
12
package org.eclipse.mylyn.internal.tasks.ui.editors;
13
14
import org.eclipse.jface.text.source.SourceViewer;
15
import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
16
import org.eclipse.mylyn.tasks.core.TaskRepository;
17
import org.eclipse.swt.widgets.Composite;
18
19
public interface IAbstractTaskEditorExtension2 {
20
	public SourceViewer createEditor(TaskRepository taskRepository, AbstractTask task, Composite parent, int style);
21
}
(-)src/org/eclipse/mylyn/internal/tasks/ui/editors/LongTextAttributeEditor.java (-1 / +2 lines)
Lines 15-20 Link Here
15
import org.eclipse.jface.text.source.SourceViewer;
15
import org.eclipse.jface.text.source.SourceViewer;
16
import org.eclipse.mylyn.internal.provisional.commons.ui.CommonFormUtil;
16
import org.eclipse.mylyn.internal.provisional.commons.ui.CommonFormUtil;
17
import org.eclipse.mylyn.internal.provisional.commons.ui.CommonTextSupport;
17
import org.eclipse.mylyn.internal.provisional.commons.ui.CommonTextSupport;
18
import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
18
import org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTextViewerConfiguration.Mode;
19
import org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTextViewerConfiguration.Mode;
19
import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
20
import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
20
import org.eclipse.mylyn.tasks.core.data.TaskDataModel;
21
import org.eclipse.mylyn.tasks.core.data.TaskDataModel;
Lines 47-53 Link Here
47
		}
48
		}
48
		SourceViewer viewer = new SourceViewer(parent, null, style);
49
		SourceViewer viewer = new SourceViewer(parent, null, style);
49
		RepositoryTextViewerConfiguration configuration = RichTextEditor.installHyperlinkPresenter(viewer,
50
		RepositoryTextViewerConfiguration configuration = RichTextEditor.installHyperlinkPresenter(viewer,
50
				getModel().getTaskRepository(), Mode.DEFAULT);
51
				getModel().getTaskRepository(), ((AbstractTask) getModel().getTask()), Mode.DEFAULT);
51
		viewer.configure(configuration);
52
		viewer.configure(configuration);
52
		viewer.setDocument(new Document(getValue()));
53
		viewer.setDocument(new Document(getValue()));
53
		final StyledText text = viewer.getTextWidget();
54
		final StyledText text = viewer.getTextWidget();
(-)src/org/eclipse/mylyn/internal/tasks/ui/editors/PlanningPart.java (-4 / +6 lines)
Lines 337-348 Link Here
337
				AbstractTaskEditorExtension extension = TaskEditorExtensions.getTaskEditorExtension(getRepository());
337
				AbstractTaskEditorExtension extension = TaskEditorExtensions.getTaskEditorExtension(getRepository());
338
				if (extension != null) {
338
				if (extension != null) {
339
					noteEditor = new RichTextEditor(getRepository(), SWT.FLAT | SWT.MULTI | SWT.WRAP | SWT.V_SCROLL,
339
					noteEditor = new RichTextEditor(getRepository(), SWT.FLAT | SWT.MULTI | SWT.WRAP | SWT.V_SCROLL,
340
							contextService, extension);
340
							contextService, extension, getTask());
341
				}
341
				}
342
			}
342
			}
343
		}
343
		}
344
		if (noteEditor == null) {
344
		if (noteEditor == null) {
345
			noteEditor = new RichTextEditor(getRepository(), SWT.FLAT | SWT.MULTI | SWT.WRAP | SWT.V_SCROLL);
345
			noteEditor = new RichTextEditor(getRepository(), SWT.FLAT | SWT.MULTI | SWT.WRAP | SWT.V_SCROLL, null,
346
					null, getTask());
346
		}
347
		}
347
		noteEditor.setSpellCheckingEnabled(true);
348
		noteEditor.setSpellCheckingEnabled(true);
348
		noteEditor.createControl(composite, toolkit);
349
		noteEditor.createControl(composite, toolkit);
Lines 398-405 Link Here
398
		if (noteEditor.getViewer() != null) {
399
		if (noteEditor.getViewer() != null) {
399
			noteEditor.getViewer().getTextWidget().addFocusListener(removePersonalNotesFocusListener);
400
			noteEditor.getViewer().getTextWidget().addFocusListener(removePersonalNotesFocusListener);
400
			if (changeColor) {
401
			if (changeColor) {
401
				noteEditor.getViewer().getTextWidget().setForeground(
402
				noteEditor.getViewer()
402
						composite.getShell().getDisplay().getSystemColor(SWT.COLOR_GRAY));
403
						.getTextWidget()
404
						.setForeground(composite.getShell().getDisplay().getSystemColor(SWT.COLOR_GRAY));
403
			}
405
			}
404
		}
406
		}
405
407
(-)src/org/eclipse/mylyn/internal/tasks/ui/editors/RepositoryTextViewerConfiguration.java (-1 / +11 lines)
Lines 35-40 Link Here
35
import org.eclipse.jface.text.rules.Token;
35
import org.eclipse.jface.text.rules.Token;
36
import org.eclipse.jface.text.source.ISourceViewer;
36
import org.eclipse.jface.text.source.ISourceViewer;
37
import org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors;
37
import org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors;
38
import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
38
import org.eclipse.mylyn.tasks.core.TaskRepository;
39
import org.eclipse.mylyn.tasks.core.TaskRepository;
39
import org.eclipse.mylyn.tasks.ui.TaskHyperlinkPresenter;
40
import org.eclipse.mylyn.tasks.ui.TaskHyperlinkPresenter;
40
import org.eclipse.swt.SWT;
41
import org.eclipse.swt.SWT;
Lines 65-75 Link Here
65
66
66
	private Mode mode;
67
	private Mode mode;
67
68
68
	public RepositoryTextViewerConfiguration(TaskRepository taskRepository, boolean spellCheck) {
69
	private final AbstractTask task;
70
71
	public RepositoryTextViewerConfiguration(TaskRepository taskRepository, AbstractTask task, boolean spellCheck) {
69
		super(EditorsUI.getPreferenceStore());
72
		super(EditorsUI.getPreferenceStore());
70
		this.taskRepository = taskRepository;
73
		this.taskRepository = taskRepository;
71
		this.spellCheck = spellCheck;
74
		this.spellCheck = spellCheck;
72
		this.mode = Mode.DEFAULT;
75
		this.mode = Mode.DEFAULT;
76
		this.task = task;
73
	}
77
	}
74
78
75
	public Mode getMode() {
79
	public Mode getMode() {
Lines 148-153 Link Here
148
			public Object getAdapter(Class adapter) {
152
			public Object getAdapter(Class adapter) {
149
				if (adapter == TaskRepository.class) {
153
				if (adapter == TaskRepository.class) {
150
					return getTaskRepository();
154
					return getTaskRepository();
155
				} else if (adapter == AbstractTask.class) {
156
					return getTask();
151
				}
157
				}
152
				return null;
158
				return null;
153
			}
159
			}
Lines 208-211 Link Here
208
		return assistant;
214
		return assistant;
209
	}
215
	}
210
216
217
	public AbstractTask getTask() {
218
		return task;
219
	}
220
211
}
221
}
(-)src/org/eclipse/mylyn/internal/tasks/ui/editors/RichTextAttributeEditor.java (-1 / +3 lines)
Lines 13-18 Link Here
13
13
14
import org.eclipse.jface.action.IAction;
14
import org.eclipse.jface.action.IAction;
15
import org.eclipse.jface.text.source.SourceViewer;
15
import org.eclipse.jface.text.source.SourceViewer;
16
import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
16
import org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTextViewerConfiguration.Mode;
17
import org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTextViewerConfiguration.Mode;
17
import org.eclipse.mylyn.tasks.core.TaskRepository;
18
import org.eclipse.mylyn.tasks.core.TaskRepository;
18
import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
19
import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
Lines 53-59 Link Here
53
	public RichTextAttributeEditor(TaskDataModel manager, TaskRepository taskRepository, TaskAttribute taskAttribute,
54
	public RichTextAttributeEditor(TaskDataModel manager, TaskRepository taskRepository, TaskAttribute taskAttribute,
54
			int style, IContextService contextService, AbstractTaskEditorExtension extension) {
55
			int style, IContextService contextService, AbstractTaskEditorExtension extension) {
55
		super(manager, taskAttribute);
56
		super(manager, taskAttribute);
56
		this.editor = new RichTextEditor(taskRepository, style, contextService, extension) {
57
		this.editor = new RichTextEditor(taskRepository, style, contextService, extension,
58
				((AbstractTask) getModel().getTask())) {
57
			@Override
59
			@Override
58
			public void valueChanged(String value) {
60
			public void valueChanged(String value) {
59
				if (!ignoreNotification) {
61
				if (!ignoreNotification) {
(-)src/org/eclipse/mylyn/internal/tasks/ui/editors/RichTextEditor.java (-6 / +23 lines)
Lines 31-36 Link Here
31
import org.eclipse.mylyn.internal.provisional.commons.ui.CommonFormUtil;
31
import org.eclipse.mylyn.internal.provisional.commons.ui.CommonFormUtil;
32
import org.eclipse.mylyn.internal.provisional.commons.ui.CommonTextSupport;
32
import org.eclipse.mylyn.internal.provisional.commons.ui.CommonTextSupport;
33
import org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes;
33
import org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes;
34
import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
34
import org.eclipse.mylyn.internal.tasks.ui.commands.ViewSourceHandler;
35
import org.eclipse.mylyn.internal.tasks.ui.commands.ViewSourceHandler;
35
import org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTextViewerConfiguration.Mode;
36
import org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTextViewerConfiguration.Mode;
36
import org.eclipse.mylyn.tasks.core.TaskRepository;
37
import org.eclipse.mylyn.tasks.core.TaskRepository;
Lines 160-171 Link Here
160
161
161
	private final ListenerList stateChangedListeners = new ListenerList(ListenerList.IDENTITY);
162
	private final ListenerList stateChangedListeners = new ListenerList(ListenerList.IDENTITY);
162
163
164
	private final AbstractTask task;
165
166
	@Deprecated
163
	public RichTextEditor(TaskRepository repository, int style) {
167
	public RichTextEditor(TaskRepository repository, int style) {
164
		this(repository, style, null, null);
168
		this(repository, style, null, null, null);
165
	}
169
	}
166
170
171
	@Deprecated
167
	public RichTextEditor(TaskRepository repository, int style, IContextService contextService,
172
	public RichTextEditor(TaskRepository repository, int style, IContextService contextService,
168
			AbstractTaskEditorExtension extension) {
173
			AbstractTaskEditorExtension extension) {
174
		this(repository, style, contextService, extension, null);
175
	}
176
177
	public RichTextEditor(TaskRepository repository, int style, IContextService contextService,
178
			AbstractTaskEditorExtension extension, AbstractTask task) {
169
		this.repository = repository;
179
		this.repository = repository;
170
		this.style = style;
180
		this.style = style;
171
		this.contextService = contextService;
181
		this.contextService = contextService;
Lines 173-183 Link Here
173
		this.text = ""; //$NON-NLS-1$
183
		this.text = ""; //$NON-NLS-1$
174
		this.viewSourceAction = new ViewSourceAction();
184
		this.viewSourceAction = new ViewSourceAction();
175
		setMode(Mode.DEFAULT);
185
		setMode(Mode.DEFAULT);
186
		this.task = task;
176
	}
187
	}
177
188
178
	private SourceViewer configure(final SourceViewer viewer, Document document, boolean readOnly) {
189
	private SourceViewer configure(final SourceViewer viewer, Document document, boolean readOnly) {
179
		// do this before setting the document to not require invalidating the presentation
190
		// do this before setting the document to not require invalidating the presentation
180
		installHyperlinkPresenter(viewer, repository, getMode());
191
		installHyperlinkPresenter(viewer, repository, task, getMode());
181
192
182
		updateDocument(viewer, document, readOnly);
193
		updateDocument(viewer, document, readOnly);
183
		if (readOnly) {
194
		if (readOnly) {
Lines 263-269 Link Here
263
				if (isReadOnly()) {
274
				if (isReadOnly()) {
264
					editorViewer = extension.createViewer(repository, editorComposite, style);
275
					editorViewer = extension.createViewer(repository, editorComposite, style);
265
				} else {
276
				} else {
266
					editorViewer = extension.createEditor(repository, editorComposite, style);
277
					if (extension instanceof IAbstractTaskEditorExtension2) {
278
						editorViewer = ((IAbstractTaskEditorExtension2) extension).createEditor(repository, task,
279
								editorComposite, style);
280
					} else {
281
						editorViewer = extension.createEditor(repository, editorComposite, style);
282
					}
283
267
					editorViewer.getTextWidget().addFocusListener(new FocusListener() {
284
					editorViewer.getTextWidget().addFocusListener(new FocusListener() {
268
						public void focusGained(FocusEvent e) {
285
						public void focusGained(FocusEvent e) {
269
							setContext();
286
							setContext();
Lines 304-310 Link Here
304
	private SourceViewer createDefaultEditor(Composite parent, int styles) {
321
	private SourceViewer createDefaultEditor(Composite parent, int styles) {
305
		SourceViewer defaultEditor = new SourceViewer(parent, null, styles | SWT.WRAP);
322
		SourceViewer defaultEditor = new SourceViewer(parent, null, styles | SWT.WRAP);
306
323
307
		RepositoryTextViewerConfiguration viewerConfig = new RepositoryTextViewerConfiguration(repository,
324
		RepositoryTextViewerConfiguration viewerConfig = new RepositoryTextViewerConfiguration(repository, task,
308
				isSpellCheckingEnabled() && !isReadOnly());
325
				isSpellCheckingEnabled() && !isReadOnly());
309
		viewerConfig.setMode(getMode());
326
		viewerConfig.setMode(getMode());
310
		defaultEditor.configure(viewerConfig);
327
		defaultEditor.configure(viewerConfig);
Lines 427-434 Link Here
427
	}
444
	}
428
445
429
	public static RepositoryTextViewerConfiguration installHyperlinkPresenter(ISourceViewer viewer,
446
	public static RepositoryTextViewerConfiguration installHyperlinkPresenter(ISourceViewer viewer,
430
			TaskRepository repository, Mode mode) {
447
			TaskRepository repository, AbstractTask task, Mode mode) {
431
		RepositoryTextViewerConfiguration configuration = new RepositoryTextViewerConfiguration(repository, false);
448
		RepositoryTextViewerConfiguration configuration = new RepositoryTextViewerConfiguration(repository, task, false);
432
		configuration.setMode(mode);
449
		configuration.setMode(mode);
433
450
434
		// do not configure viewer, this has already been done in extension
451
		// do not configure viewer, this has already been done in extension
(-)src/org/eclipse/mylyn/internal/tasks/ui/editors/SummaryPart.java (-3 / +6 lines)
Lines 70-79 Link Here
70
70
71
	private void createSummaryControl(Composite composite, final FormToolkit toolkit) {
71
	private void createSummaryControl(Composite composite, final FormToolkit toolkit) {
72
		Composite borderComposite = EditorUtil.createBorder(composite, toolkit);
72
		Composite borderComposite = EditorUtil.createBorder(composite, toolkit);
73
		GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).hint(EditorUtil.MAXIMUM_WIDTH, SWT.DEFAULT).grab(
73
		GridDataFactory.fillDefaults()
74
				true, false).applyTo(borderComposite);
74
				.align(SWT.FILL, SWT.CENTER)
75
				.hint(EditorUtil.MAXIMUM_WIDTH, SWT.DEFAULT)
76
				.grab(true, false)
77
				.applyTo(borderComposite);
75
78
76
		summaryEditor = new RichTextEditor(getRepository(), SWT.SINGLE);
79
		summaryEditor = new RichTextEditor(getRepository(), SWT.SINGLE, null, null, getTask());
77
		summaryEditor.setSpellCheckingEnabled(true);
80
		summaryEditor.setSpellCheckingEnabled(true);
78
		summaryEditor.setReadOnly(!isSummaryEditable());
81
		summaryEditor.setReadOnly(!isSummaryEditable());
79
		summaryEditor.createControl(borderComposite, toolkit);
82
		summaryEditor.createControl(borderComposite, toolkit);
(-)src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorNotesPart.java (-1 / +2 lines)
Lines 87-93 Link Here
87
		composite.setLayout(EditorUtil.createSectionClientLayout());
87
		composite.setLayout(EditorUtil.createSectionClientLayout());
88
88
89
		noteEditor = new SourceViewer(composite, null, SWT.FLAT | SWT.MULTI | SWT.WRAP | SWT.V_SCROLL);
89
		noteEditor = new SourceViewer(composite, null, SWT.FLAT | SWT.MULTI | SWT.WRAP | SWT.V_SCROLL);
90
		noteEditor.configure(new RepositoryTextViewerConfiguration(getModel().getTaskRepository(), true));
90
		noteEditor.configure(new RepositoryTextViewerConfiguration(getModel().getTaskRepository(),
91
				((AbstractTask) getModel().getTask()), true));
91
		CommonTextSupport textSupport = (CommonTextSupport) getTaskEditorPage().getAdapter(CommonTextSupport.class);
92
		CommonTextSupport textSupport = (CommonTextSupport) getTaskEditorPage().getAdapter(CommonTextSupport.class);
92
		if (textSupport != null) {
93
		if (textSupport != null) {
93
			textSupport.configure(noteEditor, new Document(this.value), true);
94
			textSupport.configure(noteEditor, new Document(this.value), true);
(-)src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskHyperlinkDetector.java (-1 / +3 lines)
Lines 19-24 Link Here
19
import org.eclipse.jface.text.ITextViewer;
19
import org.eclipse.jface.text.ITextViewer;
20
import org.eclipse.jface.text.hyperlink.IHyperlink;
20
import org.eclipse.jface.text.hyperlink.IHyperlink;
21
import org.eclipse.jface.util.SafeRunnable;
21
import org.eclipse.jface.util.SafeRunnable;
22
import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
22
import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
23
import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
23
import org.eclipse.mylyn.tasks.core.TaskRepository;
24
import org.eclipse.mylyn.tasks.core.TaskRepository;
24
import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi;
25
import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi;
Lines 47-53 Link Here
47
				}
48
				}
48
49
49
				public void run() throws Exception {
50
				public void run() throws Exception {
50
					links[0] = connectorUi.findHyperlinks(repository, content, index, contentOffset);
51
					final AbstractTask task = (AbstractTask) getAdapter(AbstractTask.class);
52
					links[0] = connectorUi.findHyperlinks(repository, task, content, index, contentOffset);
51
				}
53
				}
52
54
53
			});
55
			});
(-)src/org/eclipse/mylyn/tasks/ui/AbstractRepositoryConnectorUi.java (+25 lines)
Lines 21-26 Link Here
21
import org.eclipse.jface.viewers.IStructuredSelection;
21
import org.eclipse.jface.viewers.IStructuredSelection;
22
import org.eclipse.jface.wizard.IWizard;
22
import org.eclipse.jface.wizard.IWizard;
23
import org.eclipse.jface.wizard.IWizardPage;
23
import org.eclipse.jface.wizard.IWizardPage;
24
import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
24
import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
25
import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
25
import org.eclipse.mylyn.internal.tasks.ui.Messages;
26
import org.eclipse.mylyn.internal.tasks.ui.Messages;
26
import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
27
import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
Lines 239-245 Link Here
239
	 *            the offset of <code>text</code>
240
	 *            the offset of <code>text</code>
240
	 * @return an array of hyperlinks, or null if no hyperlinks were found
241
	 * @return an array of hyperlinks, or null if no hyperlinks were found
241
	 * @since 2.0
242
	 * @since 2.0
243
	 * @deprecated use {@link #findHyperlinks(TaskRepository, AbstractTask, String, int, int)} instead
242
	 */
244
	 */
245
	@Deprecated
243
	public IHyperlink[] findHyperlinks(TaskRepository repository, String text, int index, int textOffset) {
246
	public IHyperlink[] findHyperlinks(TaskRepository repository, String text, int index, int textOffset) {
244
		return null;
247
		return null;
245
	}
248
	}
Lines 266-269 Link Here
266
		return new TaskAttachmentPage(model);
269
		return new TaskAttachmentPage(model);
267
	}
270
	}
268
271
272
	/**
273
	 * Returns an array of hyperlinks that link to tasks within <code>text</code>. If <code>index</code> is != -1
274
	 * clients may limit the results to hyperlinks found at <code>index</code>. It is legal for clients to always return
275
	 * all results.
276
	 * 
277
	 * @param repository
278
	 *            the task repository, never <code>null</code>
279
	 * @param task
280
	 *            the task, never <code>null</code>
281
	 * @param text
282
	 *            the line of text
283
	 * @param index
284
	 *            the index within <code>text</code>, if -1 return all hyperlinks found in text
285
	 * @param textOffset
286
	 *            the offset of <code>text</code>
287
	 * @return an array of hyperlinks, or null if no hyperlinks were found
288
	 * @since 3.4
289
	 */
290
	public IHyperlink[] findHyperlinks(TaskRepository repository, AbstractTask task, String text, int index,
291
			int textOffset) {
292
		return findHyperlinks(repository, text, index, textOffset);
293
	}
269
}
294
}
(-)src/org/eclipse/mylyn/tasks/ui/wizards/TaskAttachmentPage.java (-1 / +2 lines)
Lines 17-22 Link Here
17
import org.eclipse.mylyn.context.core.ContextCore;
17
import org.eclipse.mylyn.context.core.ContextCore;
18
import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
18
import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
19
import org.eclipse.mylyn.internal.provisional.commons.ui.CommonTextSupport;
19
import org.eclipse.mylyn.internal.provisional.commons.ui.CommonTextSupport;
20
import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
20
import org.eclipse.mylyn.internal.tasks.core.data.FileTaskAttachmentSource;
21
import org.eclipse.mylyn.internal.tasks.core.data.FileTaskAttachmentSource;
21
import org.eclipse.mylyn.internal.tasks.ui.editors.RichTextEditor;
22
import org.eclipse.mylyn.internal.tasks.ui.editors.RichTextEditor;
22
import org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorExtensions;
23
import org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorExtensions;
Lines 148-154 Link Here
148
		}
149
		}
149
150
150
		commentEditor = new RichTextEditor(getModel().getTaskRepository(), SWT.V_SCROLL | SWT.BORDER | SWT.WRAP,
151
		commentEditor = new RichTextEditor(getModel().getTaskRepository(), SWT.V_SCROLL | SWT.BORDER | SWT.WRAP,
151
				contextService, extension) {
152
				contextService, extension, ((AbstractTask) getModel().getTask())) {
152
			@Override
153
			@Override
153
			protected void valueChanged(String value) {
154
			protected void valueChanged(String value) {
154
				apply();
155
				apply();
(-)src/org/eclipse/mylyn/internal/trac/wiki/editor/TracWikiPageEditor.java (-1 / +2 lines)
Lines 233-239 Link Here
233
				}
233
				}
234
			});
234
			});
235
235
236
			TextSourceViewerConfiguration viewerConfig = new RepositoryTextViewerConfiguration(repository, true);
236
			// TODO: pass the Task if possible and not null
237
			TextSourceViewerConfiguration viewerConfig = new RepositoryTextViewerConfiguration(repository, null, true);
237
			((SourceViewer) sourceEditor).configure(viewerConfig);
238
			((SourceViewer) sourceEditor).configure(viewerConfig);
238
			Document document = new Document(page.getContent());
239
			Document document = new Document(page.getContent());
239
			((SourceViewer) sourceEditor).setDocument(document, new AnnotationModel());
240
			((SourceViewer) sourceEditor).setDocument(document, new AnnotationModel());
(-)src/org/eclipse/mylyn/internal/wikitext/tasks/ui/editor/ConfluenceMarkupTaskEditorExtension.java (-2 / +2 lines)
Lines 11-19 Link Here
11
package org.eclipse.mylyn.internal.wikitext.tasks.ui.editor;
11
package org.eclipse.mylyn.internal.wikitext.tasks.ui.editor;
12
12
13
import org.eclipse.mylyn.wikitext.confluence.core.ConfluenceLanguage;
13
import org.eclipse.mylyn.wikitext.confluence.core.ConfluenceLanguage;
14
import org.eclipse.mylyn.wikitext.tasks.ui.editor.MarkupTaskEditorExtension;
14
import org.eclipse.mylyn.wikitext.tasks.ui.editor.MarkupTaskEditorExtension2;
15
15
16
public class ConfluenceMarkupTaskEditorExtension extends MarkupTaskEditorExtension<ConfluenceLanguage> {
16
public class ConfluenceMarkupTaskEditorExtension extends MarkupTaskEditorExtension2<ConfluenceLanguage> {
17
17
18
	public ConfluenceMarkupTaskEditorExtension() {
18
	public ConfluenceMarkupTaskEditorExtension() {
19
		setMarkupLanguage(new ConfluenceLanguage());
19
		setMarkupLanguage(new ConfluenceLanguage());
(-)src/org/eclipse/mylyn/internal/wikitext/tasks/ui/editor/MediaWikiMarkupTaskEditorExtension.java (-2 / +2 lines)
Lines 11-19 Link Here
11
package org.eclipse.mylyn.internal.wikitext.tasks.ui.editor;
11
package org.eclipse.mylyn.internal.wikitext.tasks.ui.editor;
12
12
13
import org.eclipse.mylyn.wikitext.mediawiki.core.MediaWikiLanguage;
13
import org.eclipse.mylyn.wikitext.mediawiki.core.MediaWikiLanguage;
14
import org.eclipse.mylyn.wikitext.tasks.ui.editor.MarkupTaskEditorExtension;
14
import org.eclipse.mylyn.wikitext.tasks.ui.editor.MarkupTaskEditorExtension2;
15
15
16
public class MediaWikiMarkupTaskEditorExtension extends MarkupTaskEditorExtension<MediaWikiLanguage> {
16
public class MediaWikiMarkupTaskEditorExtension extends MarkupTaskEditorExtension2<MediaWikiLanguage> {
17
17
18
	public MediaWikiMarkupTaskEditorExtension() {
18
	public MediaWikiMarkupTaskEditorExtension() {
19
		setMarkupLanguage(new MediaWikiLanguage());
19
		setMarkupLanguage(new MediaWikiLanguage());
(-)src/org/eclipse/mylyn/internal/wikitext/tasks/ui/editor/TWikiMarkupTaskEditorExtension.java (-2 / +2 lines)
Lines 10-19 Link Here
10
 *******************************************************************************/
10
 *******************************************************************************/
11
package org.eclipse.mylyn.internal.wikitext.tasks.ui.editor;
11
package org.eclipse.mylyn.internal.wikitext.tasks.ui.editor;
12
12
13
import org.eclipse.mylyn.wikitext.tasks.ui.editor.MarkupTaskEditorExtension;
13
import org.eclipse.mylyn.wikitext.tasks.ui.editor.MarkupTaskEditorExtension2;
14
import org.eclipse.mylyn.wikitext.twiki.core.TWikiLanguage;
14
import org.eclipse.mylyn.wikitext.twiki.core.TWikiLanguage;
15
15
16
public class TWikiMarkupTaskEditorExtension extends MarkupTaskEditorExtension<TWikiLanguage> {
16
public class TWikiMarkupTaskEditorExtension extends MarkupTaskEditorExtension2<TWikiLanguage> {
17
17
18
	public TWikiMarkupTaskEditorExtension() {
18
	public TWikiMarkupTaskEditorExtension() {
19
		setMarkupLanguage(new TWikiLanguage());
19
		setMarkupLanguage(new TWikiLanguage());
(-)src/org/eclipse/mylyn/internal/wikitext/tasks/ui/editor/TextileMarkupTaskEditorExtension.java (-4 / +2 lines)
Lines 11-25 Link Here
11
11
12
package org.eclipse.mylyn.internal.wikitext.tasks.ui.editor;
12
package org.eclipse.mylyn.internal.wikitext.tasks.ui.editor;
13
13
14
import org.eclipse.mylyn.wikitext.tasks.ui.editor.MarkupTaskEditorExtension;
14
import org.eclipse.mylyn.wikitext.tasks.ui.editor.MarkupTaskEditorExtension2;
15
import org.eclipse.mylyn.wikitext.textile.core.TextileLanguage;
15
import org.eclipse.mylyn.wikitext.textile.core.TextileLanguage;
16
16
17
/**
17
/**
18
 * 
19
 * 
20
 * @author David Green
18
 * @author David Green
21
 */
19
 */
22
public class TextileMarkupTaskEditorExtension extends MarkupTaskEditorExtension<TextileLanguage> {
20
public class TextileMarkupTaskEditorExtension extends MarkupTaskEditorExtension2<TextileLanguage> {
23
21
24
	public TextileMarkupTaskEditorExtension() {
22
	public TextileMarkupTaskEditorExtension() {
25
		setMarkupLanguage(new TextileLanguage());
23
		setMarkupLanguage(new TextileLanguage());
(-)src/org/eclipse/mylyn/internal/wikitext/tasks/ui/editor/TracWikiMarkupTaskEditorExtension.java (-3 / +3 lines)
Lines 12-27 Link Here
12
package org.eclipse.mylyn.internal.wikitext.tasks.ui.editor;
12
package org.eclipse.mylyn.internal.wikitext.tasks.ui.editor;
13
13
14
import org.eclipse.mylyn.tasks.core.TaskRepository;
14
import org.eclipse.mylyn.tasks.core.TaskRepository;
15
import org.eclipse.mylyn.wikitext.tasks.ui.editor.MarkupTaskEditorExtension;
15
import org.eclipse.mylyn.wikitext.tasks.ui.editor.MarkupTaskEditorExtension2;
16
import org.eclipse.mylyn.wikitext.tracwiki.core.TracWikiLanguage;
16
import org.eclipse.mylyn.wikitext.tracwiki.core.TracWikiLanguage;
17
import org.eclipse.mylyn.wikitext.ui.viewer.MarkupViewer;
18
import org.eclipse.mylyn.wikitext.ui.viewer.AbstractTextSourceViewerConfiguration.HyperlinkDetectorDescriptorFilter;
17
import org.eclipse.mylyn.wikitext.ui.viewer.AbstractTextSourceViewerConfiguration.HyperlinkDetectorDescriptorFilter;
18
import org.eclipse.mylyn.wikitext.ui.viewer.MarkupViewer;
19
import org.eclipse.ui.texteditor.HyperlinkDetectorDescriptor;
19
import org.eclipse.ui.texteditor.HyperlinkDetectorDescriptor;
20
20
21
/**
21
/**
22
 * @author David Green
22
 * @author David Green
23
 */
23
 */
24
public class TracWikiMarkupTaskEditorExtension extends MarkupTaskEditorExtension<TracWikiLanguage> implements
24
public class TracWikiMarkupTaskEditorExtension extends MarkupTaskEditorExtension2<TracWikiLanguage> implements
25
		HyperlinkDetectorDescriptorFilter {
25
		HyperlinkDetectorDescriptorFilter {
26
26
27
	public TracWikiMarkupTaskEditorExtension() {
27
	public TracWikiMarkupTaskEditorExtension() {
(-)src/org/eclipse/mylyn/wikitext/tasks/ui/editor/MarkupTaskEditorExtension.java (-4 / +14 lines)
Lines 81-89 Link Here
81
	private static final boolean DISABLE_WIKI_WORD = Boolean.getBoolean(MarkupTaskEditorExtension.class.getSimpleName()
81
	private static final boolean DISABLE_WIKI_WORD = Boolean.getBoolean(MarkupTaskEditorExtension.class.getSimpleName()
82
			+ ".wikiWordDisabled"); //$NON-NLS-1$
82
			+ ".wikiWordDisabled"); //$NON-NLS-1$
83
83
84
	private static final String ID_CONTEXT_EDITOR_TASK = "org.eclipse.mylyn.tasks.ui.TaskEditor"; //$NON-NLS-1$
84
	/**
85
	 * @since 1.3
86
	 */
87
	protected static final String ID_CONTEXT_EDITOR_TASK = "org.eclipse.mylyn.tasks.ui.TaskEditor"; //$NON-NLS-1$
85
88
86
	private static final String ID_CONTEXT_EDITOR_TEXT = "org.eclipse.ui.DefaultTextEditor"; //$NON-NLS-1$
89
	/**
90
	 * @since 1.3
91
	 */
92
	protected static final String ID_CONTEXT_EDITOR_TEXT = "org.eclipse.ui.DefaultTextEditor"; //$NON-NLS-1$
87
93
88
	private MarkupLanguageType markupLanguage;
94
	private MarkupLanguageType markupLanguage;
89
95
Lines 136-143 Link Here
136
		return markupViewer;
142
		return markupViewer;
137
	}
143
	}
138
144
145
	/**
146
	 * @since 1.3
147
	 */
139
	@SuppressWarnings("unchecked")
148
	@SuppressWarnings("unchecked")
140
	private MarkupLanguageType createRepositoryMarkupLanguage(TaskRepository taskRepository) {
149
	protected MarkupLanguageType createRepositoryMarkupLanguage(TaskRepository taskRepository) {
141
		MarkupLanguageType copy = (MarkupLanguageType) markupLanguage.clone();
150
		MarkupLanguageType copy = (MarkupLanguageType) markupLanguage.clone();
142
		MarkupLanguageConfiguration configuration = createMarkupLanguageConfiguration(taskRepository);
151
		MarkupLanguageConfiguration configuration = createMarkupLanguageConfiguration(taskRepository);
143
		copy.configure(configuration);
152
		copy.configure(configuration);
Lines 375-382 Link Here
375
	 * provided control. bug 273528: override workspace preferences to eliminate print margin in the task editor
384
	 * provided control. bug 273528: override workspace preferences to eliminate print margin in the task editor
376
	 * 
385
	 * 
377
	 * @author David Green
386
	 * @author David Green
387
	 * @since 1.3
378
	 */
388
	 */
379
	private static class EditorExtensionPreferenceStore extends PreferenceStoreFacade {
389
	protected static class EditorExtensionPreferenceStore extends PreferenceStoreFacade {
380
390
381
		// track separately from isFocusControl() since isFocusControl() is not accurate while processing a focus event
391
		// track separately from isFocusControl() since isFocusControl() is not accurate while processing a focus event
382
		boolean controlFocused;
392
		boolean controlFocused;
(-)src/org/eclipse/mylyn/wikitext/tasks/ui/editor/MarkupTaskEditorExtension2.java (+201 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2010 Frank Becker and others.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 *
8
 * Contributors:
9
 *     Frank Becker - initial API and implementation
10
 *******************************************************************************/
11
12
package org.eclipse.mylyn.wikitext.tasks.ui.editor;
13
14
import java.util.Iterator;
15
import java.util.Map;
16
17
import org.eclipse.core.runtime.IAdaptable;
18
import org.eclipse.jface.preference.IPreferenceStore;
19
import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
20
import org.eclipse.jface.text.hyperlink.IHyperlinkPresenter;
21
import org.eclipse.jface.text.reconciler.IReconciler;
22
import org.eclipse.jface.text.source.Annotation;
23
import org.eclipse.jface.text.source.DefaultAnnotationHover;
24
import org.eclipse.jface.text.source.IAnnotationHover;
25
import org.eclipse.jface.text.source.ISourceViewer;
26
import org.eclipse.jface.text.source.SourceViewer;
27
import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
28
import org.eclipse.mylyn.internal.tasks.ui.editors.IAbstractTaskEditorExtension2;
29
import org.eclipse.mylyn.internal.wikitext.tasks.ui.WikiTextTasksUiPlugin;
30
import org.eclipse.mylyn.internal.wikitext.ui.editor.MarkupEditor;
31
import org.eclipse.mylyn.tasks.core.TaskRepository;
32
import org.eclipse.mylyn.tasks.ui.TaskHyperlinkPresenter;
33
import org.eclipse.mylyn.tasks.ui.TasksUi;
34
import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage;
35
import org.eclipse.mylyn.wikitext.ui.editor.MarkupSourceViewer;
36
import org.eclipse.mylyn.wikitext.ui.editor.MarkupSourceViewerConfiguration;
37
import org.eclipse.mylyn.wikitext.ui.editor.ShowInTargetBridge;
38
import org.eclipse.mylyn.wikitext.ui.viewer.DefaultHyperlinkDetectorDescriptorFilter;
39
import org.eclipse.swt.SWT;
40
import org.eclipse.swt.events.DisposeEvent;
41
import org.eclipse.swt.events.DisposeListener;
42
import org.eclipse.swt.graphics.RGB;
43
import org.eclipse.swt.widgets.Composite;
44
import org.eclipse.ui.PlatformUI;
45
import org.eclipse.ui.editors.text.EditorsUI;
46
import org.eclipse.ui.swt.IFocusService;
47
import org.eclipse.ui.texteditor.AbstractDecoratedTextEditorPreferenceConstants;
48
import org.eclipse.ui.texteditor.AnnotationPreference;
49
import org.eclipse.ui.texteditor.DefaultMarkerAnnotationAccess;
50
import org.eclipse.ui.texteditor.MarkerAnnotationPreferences;
51
import org.eclipse.ui.texteditor.SourceViewerDecorationSupport;
52
53
/**
54
 * @author Frank Becker
55
 * 
56
 * @since 1.3
57
 */
58
@SuppressWarnings("restriction")
59
public class MarkupTaskEditorExtension2<MarkupLanguageType extends MarkupLanguage> extends
60
		MarkupTaskEditorExtension<MarkupLanguageType> implements IAbstractTaskEditorExtension2 {
61
62
	public SourceViewer createEditor(TaskRepository taskRepository, AbstractTask task, Composite parent, int style) {
63
		final MarkupLanguageType markupLanguageCopy = createRepositoryMarkupLanguage(taskRepository);
64
		configureMarkupLanguage(taskRepository, markupLanguageCopy);
65
66
		SourceViewer viewer = new MarkupSourceViewer(parent, null, style | SWT.WRAP, markupLanguageCopy);
67
		// configure the viewer
68
		MarkupSourceViewerConfiguration configuration = createSourceViewerConfiguration(taskRepository, task, viewer);
69
70
		configuration.setMarkupLanguage(markupLanguageCopy);
71
		configuration.setShowInTarget(new ShowInTargetBridge(viewer));
72
		viewer.configure(configuration);
73
74
		// we want the viewer to show annotations
75
		viewer.showAnnotations(true);
76
77
		DefaultMarkerAnnotationAccess annotationAccess = new DefaultMarkerAnnotationAccess();
78
		MarkerAnnotationPreferences annotationPreferences = new MarkerAnnotationPreferences();
79
80
		// configure viewer annotation/decoration support
81
		final SourceViewerDecorationSupport support = new SourceViewerDecorationSupport(viewer, null, annotationAccess,
82
				EditorsUI.getSharedTextColors());
83
84
		// hook the support up to the preference store
85
		Iterator<AnnotationPreference> e = annotationPreferences.getAnnotationPreferences().iterator();
86
		while (e.hasNext()) {
87
			AnnotationPreference preference = e.next();
88
			support.setAnnotationPreference(preference);
89
		}
90
		support.setCursorLinePainterPreferenceKeys(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_CURRENT_LINE,
91
				AbstractDecoratedTextEditorPreferenceConstants.EDITOR_CURRENT_LINE_COLOR);
92
		support.setMarginPainterPreferenceKeys(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_PRINT_MARGIN,
93
				AbstractDecoratedTextEditorPreferenceConstants.EDITOR_PRINT_MARGIN_COLOR,
94
				AbstractDecoratedTextEditorPreferenceConstants.EDITOR_PRINT_MARGIN_COLUMN);
95
96
		support.install(new EditorExtensionPreferenceStore(EditorsUI.getPreferenceStore(), viewer.getControl()));
97
		viewer.getControl().addDisposeListener(new DisposeListener() {
98
			public void widgetDisposed(DisposeEvent e) {
99
				support.dispose();
100
			}
101
		});
102
103
		IFocusService focusService = (IFocusService) PlatformUI.getWorkbench().getService(IFocusService.class);
104
		if (focusService != null) {
105
			focusService.addFocusTracker(viewer.getTextWidget(), MarkupEditor.EDITOR_SOURCE_VIEWER);
106
		}
107
108
		viewer.getTextWidget().setData(MarkupLanguage.class.getName(), markupLanguageCopy);
109
		viewer.getTextWidget().setData(ISourceViewer.class.getName(), viewer);
110
111
		return viewer;
112
	}
113
114
	protected TaskMarkupSourceViewerConfiguration createSourceViewerConfiguration(TaskRepository taskRepository,
115
			AbstractTask task, SourceViewer viewer) {
116
		IPreferenceStore preferenceStore = EditorsUI.getPreferenceStore();
117
		return new TaskMarkupSourceViewerConfiguration(preferenceStore, taskRepository, task);
118
	}
119
120
	@SuppressWarnings({ "rawtypes", "unchecked" })
121
	private static void addRepositoryHyperlinkDetectorTargets(final TaskRepository taskRepository,
122
			final AbstractTask task, Map hyperlinkDetectorTargets) {
123
		IAdaptable context = new IAdaptable() {
124
			public Object getAdapter(Class adapter) {
125
				if (adapter == TaskRepository.class) {
126
					return taskRepository;
127
				} else if (adapter == AbstractTask.class) {
128
					return task;
129
				}
130
				return null;
131
			}
132
		};
133
		hyperlinkDetectorTargets.put(ID_CONTEXT_EDITOR_TEXT, context);
134
		hyperlinkDetectorTargets.put(ID_CONTEXT_EDITOR_TASK, context);
135
	}
136
137
	protected static class TaskMarkupSourceViewerConfiguration extends MarkupSourceViewerConfiguration {
138
139
		private final TaskRepository taskRepository;
140
141
		private final AbstractTask task;
142
143
		public TaskMarkupSourceViewerConfiguration(IPreferenceStore preferenceStore, TaskRepository taskRepository,
144
				AbstractTask task) {
145
			super(preferenceStore, WikiTextTasksUiPlugin.FONT_REGISTRY_KEY_DEFAULT_FONT,
146
					WikiTextTasksUiPlugin.FONT_REGISTRY_KEY_MONOSPACE_FONT);
147
			this.taskRepository = taskRepository;
148
			this.task = task;
149
			// filter out the platform URL hyperlink detector since Mylyn contributes one as well.
150
			addHyperlinkDetectorDescriptorFilter(new DefaultHyperlinkDetectorDescriptorFilter(
151
					"org.eclipse.ui.internal.editors.text.URLHyperlinkDetector")); //$NON-NLS-1$
152
		}
153
154
		@Override
155
		protected IContentAssistProcessor[] createContentAssistProcessors() {
156
			IContentAssistProcessor processor = TasksUi.getUiFactory().createTaskContentAssistProcessor(taskRepository);
157
			return processor == null ? null : new IContentAssistProcessor[] { processor };
158
		}
159
160
		@Override
161
		public IAnnotationHover getAnnotationHover(ISourceViewer sourceViewer) {
162
			return new DefaultAnnotationHover() {
163
				@Override
164
				protected boolean isIncluded(Annotation annotation) {
165
					return annotation.getType().startsWith("org.eclipse.wikitext") || super.isIncluded(annotation); //$NON-NLS-1$
166
				}
167
			};
168
		}
169
170
		@SuppressWarnings("rawtypes")
171
		@Override
172
		protected Map getHyperlinkDetectorTargets(ISourceViewer sourceViewer) {
173
			Map hyperlinkDetectorTargets = super.getHyperlinkDetectorTargets(sourceViewer);
174
			addRepositoryHyperlinkDetectorTargets(taskRepository, task, hyperlinkDetectorTargets);
175
			return hyperlinkDetectorTargets;
176
		}
177
178
		@Override
179
		public IReconciler getReconciler(ISourceViewer sourceViewer) {
180
			if (sourceViewer.isEditable()) {
181
				return super.getReconciler(sourceViewer);
182
			} else {
183
				return null;
184
			}
185
		}
186
187
		@Override
188
		public int getHyperlinkStateMask(ISourceViewer sourceViewer) {
189
			return SWT.NONE;
190
		}
191
192
		@Override
193
		public IHyperlinkPresenter getHyperlinkPresenter(ISourceViewer sourceViewer) {
194
			if (fPreferenceStore == null) {
195
				return new TaskHyperlinkPresenter(new RGB(0, 0, 255));
196
			}
197
			return new TaskHyperlinkPresenter(fPreferenceStore);
198
		}
199
	}
200
201
}
(-)src/org/eclipse/mylyn/xplanner/tests/XPlannerRepositoryUiTest.java (-2 / +2 lines)
Lines 51-57 Link Here
51
	private void checkValidHyperlinks(TaskRepository repository, AbstractRepositoryConnectorUi connectorUi,
51
	private void checkValidHyperlinks(TaskRepository repository, AbstractRepositoryConnectorUi connectorUi,
52
			String testData, String id) throws Exception {
52
			String testData, String id) throws Exception {
53
53
54
		IHyperlink[] hyperlinks = connectorUi.findHyperlinks(repository, testData, -1, 0);
54
		IHyperlink[] hyperlinks = connectorUi.findHyperlinks(repository, null, testData, -1, 0);
55
		assertTrue(hyperlinks.length == 1);
55
		assertTrue(hyperlinks.length == 1);
56
		assertTrue(((TaskHyperlink) hyperlinks[0]).getTaskId().equals(id));
56
		assertTrue(((TaskHyperlink) hyperlinks[0]).getTaskId().equals(id));
57
	}
57
	}
Lines 59-65 Link Here
59
	private void checkInvalidHyperlinks(TaskRepository repository, AbstractRepositoryConnectorUi connectorUi,
59
	private void checkInvalidHyperlinks(TaskRepository repository, AbstractRepositoryConnectorUi connectorUi,
60
			String testData) throws Exception {
60
			String testData) throws Exception {
61
61
62
		IHyperlink[] hyperlinks = connectorUi.findHyperlinks(repository, testData, -1, 0);
62
		IHyperlink[] hyperlinks = connectorUi.findHyperlinks(repository, null, testData, -1, 0);
63
		assertNull(hyperlinks);
63
		assertNull(hyperlinks);
64
	}
64
	}
65
}
65
}

Return to bug 304910