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

Collapse All | Expand All

(-).project (+11 lines)
Added Link Here
1
<?xml version="1.0" encoding="UTF-8"?>
2
<projectDescription>
3
	<name>Bugzilla_Head</name>
4
	<comment></comment>
5
	<projects>
6
	</projects>
7
	<buildSpec>
8
	</buildSpec>
9
	<natures>
10
	</natures>
11
</projectDescription>
(-)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 (+128 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 61-66 Link Here
61
62
62
	private static final Pattern PATTERN = Pattern.compile(regexp, Pattern.CASE_INSENSITIVE);
63
	private static final Pattern PATTERN = Pattern.compile(regexp, Pattern.CASE_INSENSITIVE);
63
64
65
	private static final int GET_TASK_NUM_GROUP = 8;
66
67
	private static final int GET_COMMENT_NUM_GROUP = 13;
68
69
	private static final int GET_ATTACHMENT_NUM_GROUP = 3;
70
71
	private static final String regexp_bug = "(((duplicate of|((\\W||^)+(bug|task)))( ?#? ?)(\\d+))?((\\W||\\s)*(comment|c)??(\\s*#\\s*)(\\d+))?)"; //$NON-NLS-1$
72
73
	private static final String regexp_attachment = "Created (an )?attachment\\s*(\\(id=)?(\\d+)"; //$NON-NLS-1$
74
75
	private static final Pattern PATTERN_BUG = Pattern.compile(regexp_bug, Pattern.CASE_INSENSITIVE);
76
77
	private static final Pattern PATTERN_ATTACHMENT = Pattern.compile(regexp_attachment, Pattern.CASE_INSENSITIVE);
78
64
	@Override
79
	@Override
65
	public String getAccountCreationUrl(TaskRepository taskRepository) {
80
	public String getAccountCreationUrl(TaskRepository taskRepository) {
66
		return taskRepository.getRepositoryUrl() + "/createaccount.cgi"; //$NON-NLS-1$
81
		return taskRepository.getRepositoryUrl() + "/createaccount.cgi"; //$NON-NLS-1$
Lines 245-248 Link Here
245
		return new BugzillaTaskAttachmentPage(model);
260
		return new BugzillaTaskAttachmentPage(model);
246
	}
261
	}
247
262
263
	@Override
264
	public boolean supportGetHyperlinks() {
265
		return true;
266
	}
267
268
	@Override
269
	public IHyperlink[] getHyperlinks(TaskRepository repository, AbstractTask task, String text, int index,
270
			int textOffset) {
271
		ArrayList<IHyperlink> hyperlinksFound = null;
272
		Matcher mb = PATTERN_BUG.matcher(text);
273
		while (mb.find()) {
274
			if (index == -1 || (index >= mb.start() && index <= mb.end())) {
275
				IHyperlink link = extractHyperlinkBug(repository, task, textOffset, mb);
276
				if (link != null) {
277
					if (hyperlinksFound == null) {
278
						hyperlinksFound = new ArrayList<IHyperlink>();
279
					}
280
					hyperlinksFound.add(link);
281
				}
282
			}
283
		}
284
		Matcher ma = PATTERN_ATTACHMENT.matcher(text);
285
		while (ma.find()) {
286
			if (index == -1 || (index >= ma.start() && index <= ma.end())) {
287
				IHyperlink link = extractHyperlinkAttachment(repository, textOffset, ma);
288
				if (link != null) {
289
					if (hyperlinksFound == null) {
290
						hyperlinksFound = new ArrayList<IHyperlink>();
291
					}
292
					hyperlinksFound.add(link);
293
				}
294
			}
295
		}
296
297
		return (hyperlinksFound != null) ? hyperlinksFound.toArray(new IHyperlink[0]) : null;
298
	}
299
300
	private static IHyperlink extractHyperlinkBug(TaskRepository repository, AbstractTask task, int regionOffset,
301
			Matcher m) {
302
303
		int start = m.start();
304
		if (m.group().startsWith("duplicate")) { //$NON-NLS-1$
305
			start = m.start() + m.group().indexOf(m.group(GET_TASK_NUM_GROUP));
306
		} else {
307
			start = m.start();
308
			for (int index = 0; index < m.group().length() && !Character.isLetter(m.group().charAt(index)); index++, start++) {
309
			}
310
		}
311
312
		int end = m.end();
313
314
		if (end == -1) {
315
			end = m.group().length();
316
		}
317
318
		start += regionOffset;
319
		end += regionOffset;
320
		String bugId = m.group(GET_TASK_NUM_GROUP);
321
		if (bugId == null) {
322
			String commentId = m.group(GET_COMMENT_NUM_GROUP);
323
			IRegion sregion = new Region(start, end - start);
324
			if (commentId != null) {
325
				String taskID;
326
				if (task != null) {
327
					taskID = task.getTaskId();
328
				} else {
329
					taskID = ""; //$NON-NLS-1$
330
				}
331
				TaskHyperlink taskHyperLink = new TaskHyperlink(sregion, repository, taskID);
332
				if (commentId != null) {
333
					taskHyperLink.setSelection(TaskAttribute.PREFIX_COMMENT + commentId);
334
				}
335
				return taskHyperLink;
336
337
			}
338
		} else {
339
			bugId.trim();
340
			IRegion sregion = new Region(start, end - start);
341
			TaskHyperlink taskHyperLink = new TaskHyperlink(sregion, repository, bugId);
342
			String commentId = m.group(GET_COMMENT_NUM_GROUP);
343
			if (commentId != null) {
344
				taskHyperLink.setSelection(TaskAttribute.PREFIX_COMMENT + commentId);
345
			}
346
			return taskHyperLink;
347
		}
348
		return null;
349
	}
350
351
	private static IHyperlink extractHyperlinkAttachment(TaskRepository repository, int regionOffset, Matcher m) {
352
353
		int start = -1;
354
		start = m.start();
355
		for (int index = 0; index < m.group().length() && !Character.isLetter(m.group().charAt(index)); index++, start++) {
356
		}
357
358
		int end = m.end();
359
360
		if (end == -1) {
361
			end = m.group().length();
362
		}
363
364
		start += regionOffset;
365
		end += regionOffset;
366
367
		String attachmentId = m.group(GET_ATTACHMENT_NUM_GROUP);
368
		if (attachmentId != null) {
369
			start = start + m.group().indexOf(m.group(GET_ATTACHMENT_NUM_GROUP));
370
371
			IRegion sregion = new Region(start, end - start);
372
			return new TaskAttachmentHyperlink(sregion, repository, attachmentId);
373
		}
374
		return null;
375
	}
248
}
376
}
(-)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(), getTask(), SWT.FLAT | SWT.SINGLE) {
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 (-3 / +3 lines)
Lines 336-348 Link Here
336
			if (contextService != null) {
336
			if (contextService != null) {
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(), getTask(), SWT.FLAT | SWT.MULTI | SWT.WRAP
340
							contextService, extension);
340
							| SWT.V_SCROLL, contextService, extension);
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(), getTask(), SWT.FLAT | SWT.MULTI | SWT.WRAP | SWT.V_SCROLL);
346
		}
346
		}
347
		noteEditor.setSpellCheckingEnabled(true);
347
		noteEditor.setSpellCheckingEnabled(true);
348
		noteEditor.createControl(composite, toolkit);
348
		noteEditor.createControl(composite, toolkit);
(-)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 / +4 lines)
Lines 13-19 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;
18
import org.eclipse.mylyn.tasks.core.ITask;
17
import org.eclipse.mylyn.tasks.core.TaskRepository;
19
import org.eclipse.mylyn.tasks.core.TaskRepository;
18
import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
20
import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
19
import org.eclipse.mylyn.tasks.core.data.TaskDataModel;
21
import org.eclipse.mylyn.tasks.core.data.TaskDataModel;
Lines 53-59 Link Here
53
	public RichTextAttributeEditor(TaskDataModel manager, TaskRepository taskRepository, TaskAttribute taskAttribute,
55
	public RichTextAttributeEditor(TaskDataModel manager, TaskRepository taskRepository, TaskAttribute taskAttribute,
54
			int style, IContextService contextService, AbstractTaskEditorExtension extension) {
56
			int style, IContextService contextService, AbstractTaskEditorExtension extension) {
55
		super(manager, taskAttribute);
57
		super(manager, taskAttribute);
56
		this.editor = new RichTextEditor(taskRepository, style, contextService, extension) {
58
		this.editor = new RichTextEditor(taskRepository, ((AbstractTask) getModel().getTask()), style, contextService,
59
				extension) {
57
			@Override
60
			@Override
58
			public void valueChanged(String value) {
61
			public void valueChanged(String value) {
59
				if (!ignoreNotification) {
62
				if (!ignoreNotification) {
(-)src/org/eclipse/mylyn/internal/tasks/ui/editors/RichTextEditor.java (-8 / +18 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-170 Link Here
160
161
161
	private final ListenerList stateChangedListeners = new ListenerList(ListenerList.IDENTITY);
162
	private final ListenerList stateChangedListeners = new ListenerList(ListenerList.IDENTITY);
162
163
163
	public RichTextEditor(TaskRepository repository, int style) {
164
	private final AbstractTask task;
164
		this(repository, style, null, null);
165
166
	public RichTextEditor(TaskRepository repository, AbstractTask task, int style) {
167
		this(repository, task, style, null, null);
165
	}
168
	}
166
169
167
	public RichTextEditor(TaskRepository repository, int style, IContextService contextService,
170
	public RichTextEditor(TaskRepository repository, AbstractTask task, int style, IContextService contextService,
168
			AbstractTaskEditorExtension extension) {
171
			AbstractTaskEditorExtension extension) {
169
		this.repository = repository;
172
		this.repository = repository;
170
		this.style = style;
173
		this.style = style;
Lines 173-183 Link Here
173
		this.text = ""; //$NON-NLS-1$
176
		this.text = ""; //$NON-NLS-1$
174
		this.viewSourceAction = new ViewSourceAction();
177
		this.viewSourceAction = new ViewSourceAction();
175
		setMode(Mode.DEFAULT);
178
		setMode(Mode.DEFAULT);
179
		this.task = task;
176
	}
180
	}
177
181
178
	private SourceViewer configure(final SourceViewer viewer, Document document, boolean readOnly) {
182
	private SourceViewer configure(final SourceViewer viewer, Document document, boolean readOnly) {
179
		// do this before setting the document to not require invalidating the presentation
183
		// do this before setting the document to not require invalidating the presentation
180
		installHyperlinkPresenter(viewer, repository, getMode());
184
		installHyperlinkPresenter(viewer, repository, task, getMode());
181
185
182
		updateDocument(viewer, document, readOnly);
186
		updateDocument(viewer, document, readOnly);
183
		if (readOnly) {
187
		if (readOnly) {
Lines 263-269 Link Here
263
				if (isReadOnly()) {
267
				if (isReadOnly()) {
264
					editorViewer = extension.createViewer(repository, editorComposite, style);
268
					editorViewer = extension.createViewer(repository, editorComposite, style);
265
				} else {
269
				} else {
266
					editorViewer = extension.createEditor(repository, editorComposite, style);
270
					if (extension instanceof IAbstractTaskEditorExtension2) {
271
						editorViewer = ((IAbstractTaskEditorExtension2) extension).createEditor(repository, task,
272
								editorComposite, style);
273
					} else {
274
						editorViewer = extension.createEditor(repository, editorComposite, style);
275
					}
276
267
					editorViewer.getTextWidget().addFocusListener(new FocusListener() {
277
					editorViewer.getTextWidget().addFocusListener(new FocusListener() {
268
						public void focusGained(FocusEvent e) {
278
						public void focusGained(FocusEvent e) {
269
							setContext();
279
							setContext();
Lines 304-310 Link Here
304
	private SourceViewer createDefaultEditor(Composite parent, int styles) {
314
	private SourceViewer createDefaultEditor(Composite parent, int styles) {
305
		SourceViewer defaultEditor = new SourceViewer(parent, null, styles | SWT.WRAP);
315
		SourceViewer defaultEditor = new SourceViewer(parent, null, styles | SWT.WRAP);
306
316
307
		RepositoryTextViewerConfiguration viewerConfig = new RepositoryTextViewerConfiguration(repository,
317
		RepositoryTextViewerConfiguration viewerConfig = new RepositoryTextViewerConfiguration(repository, task,
308
				isSpellCheckingEnabled() && !isReadOnly());
318
				isSpellCheckingEnabled() && !isReadOnly());
309
		viewerConfig.setMode(getMode());
319
		viewerConfig.setMode(getMode());
310
		defaultEditor.configure(viewerConfig);
320
		defaultEditor.configure(viewerConfig);
Lines 427-434 Link Here
427
	}
437
	}
428
438
429
	public static RepositoryTextViewerConfiguration installHyperlinkPresenter(ISourceViewer viewer,
439
	public static RepositoryTextViewerConfiguration installHyperlinkPresenter(ISourceViewer viewer,
430
			TaskRepository repository, Mode mode) {
440
			TaskRepository repository, AbstractTask task, Mode mode) {
431
		RepositoryTextViewerConfiguration configuration = new RepositoryTextViewerConfiguration(repository, false);
441
		RepositoryTextViewerConfiguration configuration = new RepositoryTextViewerConfiguration(repository, task, false);
432
		configuration.setMode(mode);
442
		configuration.setMode(mode);
433
443
434
		// do not configure viewer, this has already been done in extension
444
		// do not configure viewer, this has already been done in extension
(-)src/org/eclipse/mylyn/internal/tasks/ui/editors/SummaryPart.java (-1 / +1 lines)
Lines 73-79 Link Here
73
		GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).hint(EditorUtil.MAXIMUM_WIDTH, SWT.DEFAULT).grab(
73
		GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).hint(EditorUtil.MAXIMUM_WIDTH, SWT.DEFAULT).grab(
74
				true, false).applyTo(borderComposite);
74
				true, false).applyTo(borderComposite);
75
75
76
		summaryEditor = new RichTextEditor(getRepository(), SWT.SINGLE);
76
		summaryEditor = new RichTextEditor(getRepository(), getTask(), SWT.SINGLE);
77
		summaryEditor.setSpellCheckingEnabled(true);
77
		summaryEditor.setSpellCheckingEnabled(true);
78
		summaryEditor.setReadOnly(!isSummaryEditable());
78
		summaryEditor.setReadOnly(!isSummaryEditable());
79
		summaryEditor.createControl(borderComposite, toolkit);
79
		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 / +7 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
					if (connectorUi.supportGetHyperlinks()) {
52
						final AbstractTask task = (AbstractTask) getAdapter(AbstractTask.class);
53
						links[0] = connectorUi.getHyperlinks(repository, task, content, index, contentOffset);
54
					} else {
55
						links[0] = connectorUi.findHyperlinks(repository, content, index, contentOffset);
56
					}
51
				}
57
				}
52
58
53
			});
59
			});
(-)src/org/eclipse/mylyn/tasks/ui/AbstractRepositoryConnectorUi.java (+27 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 248-251 Link Here
248
		return new TaskAttachmentPage(model);
249
		return new TaskAttachmentPage(model);
249
	}
250
	}
250
251
252
	/**
253
	 * Returns an array of hyperlinks that link to tasks within <code>text</code>. If <code>index</code> is != -1
254
	 * clients may limit the results to hyperlinks found at <code>index</code>. It is legal for clients to always return
255
	 * all results.
256
	 * 
257
	 * @param repository
258
	 *            the task repository, never <code>null</code>
259
	 * @param task
260
	 *            the task, never <code>null</code>
261
	 * @param text
262
	 *            the line of text
263
	 * @param index
264
	 *            the index within <code>text</code>, if -1 return all hyperlinks found in text
265
	 * @param textOffset
266
	 *            the offset of <code>text</code>
267
	 * @return an array of hyperlinks, or null if no hyperlinks were found
268
	 * @since 3.4
269
	 */
270
	public IHyperlink[] getHyperlinks(TaskRepository repository, AbstractTask task, String text, int index,
271
			int textOffset) {
272
		return null;
273
	}
274
275
	public boolean supportGetHyperlinks() {
276
		return false;
277
	}
251
}
278
}
(-)src/org/eclipse/mylyn/tasks/ui/wizards/TaskAttachmentPage.java (-2 / +3 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 147-154 Link Here
147
			}
148
			}
148
		}
149
		}
149
150
150
		commentEditor = new RichTextEditor(getModel().getTaskRepository(), SWT.V_SCROLL | SWT.BORDER | SWT.WRAP,
151
		commentEditor = new RichTextEditor(getModel().getTaskRepository(), ((AbstractTask) getModel().getTask()),
151
				contextService, extension) {
152
				SWT.V_SCROLL | SWT.BORDER | SWT.WRAP, contextService, extension) {
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 / +4 lines)
Lines 82-90 Link Here
82
	private static final boolean DISABLE_WIKI_WORD = Boolean.getBoolean(MarkupTaskEditorExtension.class.getSimpleName()
82
	private static final boolean DISABLE_WIKI_WORD = Boolean.getBoolean(MarkupTaskEditorExtension.class.getSimpleName()
83
			+ ".wikiWordDisabled"); //$NON-NLS-1$
83
			+ ".wikiWordDisabled"); //$NON-NLS-1$
84
84
85
	private static final String ID_CONTEXT_EDITOR_TASK = "org.eclipse.mylyn.tasks.ui.TaskEditor"; //$NON-NLS-1$
85
	protected static final String ID_CONTEXT_EDITOR_TASK = "org.eclipse.mylyn.tasks.ui.TaskEditor"; //$NON-NLS-1$
86
86
87
	private static final String ID_CONTEXT_EDITOR_TEXT = "org.eclipse.ui.DefaultTextEditor"; //$NON-NLS-1$
87
	protected static final String ID_CONTEXT_EDITOR_TEXT = "org.eclipse.ui.DefaultTextEditor"; //$NON-NLS-1$
88
88
89
	private MarkupLanguageType markupLanguage;
89
	private MarkupLanguageType markupLanguage;
90
90
Lines 138-144 Link Here
138
	}
138
	}
139
139
140
	@SuppressWarnings("unchecked")
140
	@SuppressWarnings("unchecked")
141
	private MarkupLanguageType createRepositoryMarkupLanguage(TaskRepository taskRepository) {
141
	protected MarkupLanguageType createRepositoryMarkupLanguage(TaskRepository taskRepository) {
142
		MarkupLanguageType copy = (MarkupLanguageType) markupLanguage.clone();
142
		MarkupLanguageType copy = (MarkupLanguageType) markupLanguage.clone();
143
		MarkupLanguageConfiguration configuration = createMarkupLanguageConfiguration(taskRepository);
143
		MarkupLanguageConfiguration configuration = createMarkupLanguageConfiguration(taskRepository);
144
		copy.configure(configuration);
144
		copy.configure(configuration);
Lines 377-383 Link Here
377
	 * 
377
	 * 
378
	 * @author David Green
378
	 * @author David Green
379
	 */
379
	 */
380
	private static class EditorExtensionPreferenceStore extends PreferenceStoreFacade {
380
	protected static class EditorExtensionPreferenceStore extends PreferenceStoreFacade {
381
381
382
		// track separately from isFocusControl() since isFocusControl() is not accurate while processing a focus event
382
		// track separately from isFocusControl() since isFocusControl() is not accurate while processing a focus event
383
		boolean controlFocused;
383
		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
}

Return to bug 304910