Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.
View | Details | Raw Unified | Return to bug 229014 | Differences between
and this patch

Collapse All | Expand All

(-)src/org/eclipse/mylyn/internal/tasks/ui/editors/RepositoryTextViewerConfiguration.java (-20 / +79 lines)
Lines 15-20 Link Here
15
import org.eclipse.core.runtime.IAdaptable;
15
import org.eclipse.core.runtime.IAdaptable;
16
import org.eclipse.jface.preference.JFacePreferences;
16
import org.eclipse.jface.preference.JFacePreferences;
17
import org.eclipse.jface.resource.JFaceResources;
17
import org.eclipse.jface.resource.JFaceResources;
18
import org.eclipse.jface.text.BadLocationException;
18
import org.eclipse.jface.text.IDocument;
19
import org.eclipse.jface.text.IDocument;
19
import org.eclipse.jface.text.IRegion;
20
import org.eclipse.jface.text.IRegion;
20
import org.eclipse.jface.text.TextAttribute;
21
import org.eclipse.jface.text.TextAttribute;
Lines 28-36 Link Here
28
import org.eclipse.jface.text.presentation.PresentationReconciler;
29
import org.eclipse.jface.text.presentation.PresentationReconciler;
29
import org.eclipse.jface.text.reconciler.IReconciler;
30
import org.eclipse.jface.text.reconciler.IReconciler;
30
import org.eclipse.jface.text.rules.DefaultDamagerRepairer;
31
import org.eclipse.jface.text.rules.DefaultDamagerRepairer;
32
import org.eclipse.jface.text.rules.ICharacterScanner;
33
import org.eclipse.jface.text.rules.IPredicateRule;
31
import org.eclipse.jface.text.rules.IRule;
34
import org.eclipse.jface.text.rules.IRule;
32
import org.eclipse.jface.text.rules.IToken;
35
import org.eclipse.jface.text.rules.IToken;
33
import org.eclipse.jface.text.rules.MultiLineRule;
34
import org.eclipse.jface.text.rules.RuleBasedScanner;
36
import org.eclipse.jface.text.rules.RuleBasedScanner;
35
import org.eclipse.jface.text.rules.SingleLineRule;
37
import org.eclipse.jface.text.rules.SingleLineRule;
36
import org.eclipse.jface.text.rules.Token;
38
import org.eclipse.jface.text.rules.Token;
Lines 40-45 Link Here
40
import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
42
import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
41
import org.eclipse.mylyn.tasks.core.ITask;
43
import org.eclipse.mylyn.tasks.core.ITask;
42
import org.eclipse.mylyn.tasks.core.TaskRepository;
44
import org.eclipse.mylyn.tasks.core.TaskRepository;
45
import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi;
43
import org.eclipse.mylyn.tasks.ui.TaskHyperlink;
46
import org.eclipse.mylyn.tasks.ui.TaskHyperlink;
44
import org.eclipse.swt.SWT;
47
import org.eclipse.swt.SWT;
45
import org.eclipse.swt.custom.StyleRange;
48
import org.eclipse.swt.custom.StyleRange;
Lines 86-92 Link Here
86
89
87
	private RepositoryTextScanner getDefaultScanner() {
90
	private RepositoryTextScanner getDefaultScanner() {
88
		if (scanner == null) {
91
		if (scanner == null) {
89
			scanner = new RepositoryTextScanner();
92
			scanner = new RepositoryTextScanner(taskRepository);
90
		}
93
		}
91
		return scanner;
94
		return scanner;
92
	}
95
	}
Lines 214-248 Link Here
214
	}
217
	}
215
218
216
	private static class RepositoryTextScanner extends RuleBasedScanner {
219
	private static class RepositoryTextScanner extends RuleBasedScanner {
220
		public void addToOffset(int length) {
221
			fOffset += length;
222
		}
223
224
		public void addToTokenOffset(int length) {
225
			fTokenOffset += length;
226
		}
227
228
		public String getLineTextFromPos() {
229
			try {
230
				int line;
231
				line = fDocument.getLineOfOffset(fOffset);
232
				int start = fDocument.getLineOffset(line);
233
				int length = fDocument.getLineLength(line);
234
235
				String erg = fDocument.get(fOffset, length - (fOffset - start));
236
				return erg;
237
			} catch (BadLocationException e) {
238
			}
239
			return null;
240
		}
217
241
218
		public RepositoryTextScanner() {
242
		public RepositoryTextScanner(TaskRepository repository) {
219
			IToken bugToken = new Token(new TextAttribute(JFaceResources.getColorRegistry().get(
243
			IToken bugToken = new Token(new TextAttribute(JFaceResources.getColorRegistry().get(
220
					JFacePreferences.ACTIVE_HYPERLINK_COLOR)));
244
					JFacePreferences.ACTIVE_HYPERLINK_COLOR)));
221
			IToken quoteToken = new Token(new TextAttribute(CommonColors.TEXT_QUOTED));
245
			IToken quoteToken = new Token(new TextAttribute(CommonColors.TEXT_QUOTED));
222
			IRule[] rules = new IRule[16];
246
			IRule[] rules = new IRule[3];
223
			rules[0] = (new SingleLineRule("http://", " ", bugToken));
247
			rules[0] = (new TaskRule(repository, bugToken));
224
			rules[1] = (new SingleLineRule("https://", " ", bugToken));
248
			rules[1] = (new SingleLineRule("*** This bug has been ", "***", bugToken));
225
			rules[2] = (new SingleLineRule("bug#", " ", bugToken));
226
			rules[3] = (new SingleLineRule("bug#", "", bugToken));
227
			rules[4] = (new SingleLineRule("bug #", "", bugToken));
228
			rules[5] = (new SingleLineRule("http://", "\n", bugToken));
229
			rules[6] = (new SingleLineRule("https://", "\n", bugToken));
230
			rules[7] = (new SingleLineRule("task#", " ", bugToken));
231
			rules[8] = (new MultiLineRule("task#", "\n", bugToken));
232
			rules[9] = (new MultiLineRule("task# ", " ", bugToken));
233
			rules[10] = (new SingleLineRule("task #", "\n", bugToken));
234
			rules[11] = (new SingleLineRule("*** This bug has been ", "***", bugToken));
235
			rules[12] = (new SingleLineRule("http://", "", bugToken));
236
			rules[13] = (new SingleLineRule("https://", "", bugToken));
237
			rules[14] = (new MultiLineRule("task #", " ", bugToken));
238
			SingleLineRule quoteRule = new SingleLineRule(">", null, quoteToken, (char) 0, true);
249
			SingleLineRule quoteRule = new SingleLineRule(">", null, quoteToken, (char) 0, true);
239
			quoteRule.setColumnConstraint(0);
250
			quoteRule.setColumnConstraint(0);
240
			rules[15] = quoteRule;
251
			rules[2] = quoteRule;
241
			setRules(rules);
252
			setRules(rules);
242
		}
253
		}
243
254
244
	}
255
	}
245
256
257
	private static class TaskRule implements IPredicateRule {
258
259
		private final IToken taskToken;
260
261
		private final TaskRepository repository;
262
263
		public TaskRule(TaskRepository repository, IToken token) {
264
			this.repository = repository;
265
			this.taskToken = token;
266
		}
267
268
		public IToken evaluate(ICharacterScanner scanner, boolean resume) {
269
			String text = ((RepositoryTextScanner) scanner).getLineTextFromPos();
270
			if (text == null || text.length() == 0) {
271
				return Token.UNDEFINED;
272
			}
273
274
			AbstractRepositoryConnectorUi connectorUi = TasksUiPlugin.getConnectorUi(repository.getConnectorKind());
275
			if (connectorUi == null) {
276
				return Token.UNDEFINED;
277
			}
278
			IHyperlink[] hyperlinks = connectorUi.findHyperlinks(repository, text, 0, 0);
279
			if (hyperlinks == null || hyperlinks.length == 0) {
280
				hyperlinks = TaskUrlHyperlinkDetector.getDefault().findHyperlinks(text, 1, 0);
281
			}
282
			if (hyperlinks != null && hyperlinks.length > 0) {
283
				IRegion aa = hyperlinks[0].getHyperlinkRegion();
284
				aa.getLength();
285
				if (aa.getOffset() > 0) {
286
					((RepositoryTextScanner) scanner).addToTokenOffset(aa.getOffset());
287
				}
288
				((RepositoryTextScanner) scanner).addToOffset(aa.getLength() + aa.getOffset());
289
290
				return taskToken;
291
			}
292
			return Token.UNDEFINED;
293
		}
294
295
		public IToken getSuccessToken() {
296
			return taskToken;
297
		}
298
299
		public IToken evaluate(ICharacterScanner scanner) {
300
			return evaluate(scanner, false);
301
		}
302
303
	}
304
246
	@Override
305
	@Override
247
	public IContentAssistant getContentAssistant(ISourceViewer sourceViewer) {
306
	public IContentAssistant getContentAssistant(ISourceViewer sourceViewer) {
248
		ContentAssistant assistant = new ContentAssistant();
307
		ContentAssistant assistant = new ContentAssistant();
(-)src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskUrlHyperlinkDetector.java (-24 / +66 lines)
Lines 27-57 Link Here
27
 */
27
 */
28
public class TaskUrlHyperlinkDetector extends AbstractHyperlinkDetector {
28
public class TaskUrlHyperlinkDetector extends AbstractHyperlinkDetector {
29
29
30
	public IHyperlink[] detectHyperlinks(ITextViewer textViewer, IRegion region, boolean canShowMultipleHyperlinks) {
30
	private static TaskUrlHyperlinkDetector INSTANCE;
31
		if (region == null || textViewer == null) {
32
			return null;
33
		}
34
35
		IDocument document = textViewer.getDocument();
36
37
		int offset = region.getOffset();
38
31
39
		String urlString = null;
32
	public TaskUrlHyperlinkDetector() {
40
		if (document == null) {
33
		super();
41
			return null;
34
		INSTANCE = this;
42
		}
35
	}
43
36
44
		IRegion lineInfo;
37
	public static TaskUrlHyperlinkDetector getDefault() {
45
		String line;
38
		return INSTANCE;
46
		try {
39
	}
47
			lineInfo = document.getLineInformationOfOffset(offset);
48
			line = document.get(lineInfo.getOffset(), lineInfo.getLength());
49
		} catch (BadLocationException ex) {
50
			return null;
51
		}
52
40
53
		int offsetInLine = offset - lineInfo.getOffset();
41
	public IHyperlink[] findHyperlinks(String line, int offsetInLine, int offset) {
42
		char doubleChar = ' ';
54
43
44
		String urlString = null;
55
		boolean startDoubleQuote = false;
45
		boolean startDoubleQuote = false;
56
		int urlOffsetInLine = 0;
46
		int urlOffsetInLine = 0;
57
		int urlLength = 0;
47
		int urlLength = 0;
Lines 68-76 Link Here
68
				if (urlOffsetInLine > -1) {
58
				if (urlOffsetInLine > -1) {
69
					ch = line.charAt(urlOffsetInLine);
59
					ch = line.charAt(urlOffsetInLine);
70
				}
60
				}
71
				startDoubleQuote = ch == '"';
61
				doubleChar = ch;
72
			} while (Character.isUnicodeIdentifierStart(ch));
62
			} while (Character.isUnicodeIdentifierStart(ch));
73
			urlOffsetInLine++;
63
			urlOffsetInLine++;
64
			switch (ch) {
65
			case '"':
66
				doubleChar = '"';
67
				break;
68
			case '\'':
69
				doubleChar = '\'';
70
				break;
71
			case '[':
72
				doubleChar = ']';
73
				break;
74
			case '(':
75
				doubleChar = ')';
76
				break;
77
			case '{':
78
				doubleChar = '}';
79
				break;
80
81
			default:
82
				doubleChar = ' ';
83
				break;
84
			}
85
			startDoubleQuote = doubleChar != ' ';
74
86
75
			// Right to "://"
87
			// Right to "://"
76
			StringTokenizer tokenizer = new StringTokenizer(line.substring(urlSeparatorOffset + 3),
88
			StringTokenizer tokenizer = new StringTokenizer(line.substring(urlSeparatorOffset + 3),
Lines 93-99 Link Here
93
105
94
		if (startDoubleQuote) {
106
		if (startDoubleQuote) {
95
			int endOffset = -1;
107
			int endOffset = -1;
96
			int nextDoubleQuote = line.indexOf('"', urlOffsetInLine);
108
			int nextDoubleQuote = line.indexOf(doubleChar, urlOffsetInLine);
97
			int nextWhitespace = line.indexOf(' ', urlOffsetInLine);
109
			int nextWhitespace = line.indexOf(' ', urlOffsetInLine);
98
			if (nextDoubleQuote != -1 && nextWhitespace != -1) {
110
			if (nextDoubleQuote != -1 && nextWhitespace != -1) {
99
				endOffset = Math.min(nextDoubleQuote, nextWhitespace);
111
				endOffset = Math.min(nextDoubleQuote, nextWhitespace);
Lines 109-114 Link Here
109
121
110
		// Set and validate URL string
122
		// Set and validate URL string
111
		try {
123
		try {
124
			char lastChar = line.charAt(urlOffsetInLine + urlLength - 1);
125
			if (lastChar == ',' || lastChar == '.') {
126
				urlLength--;
127
			}
112
			urlString = line.substring(urlOffsetInLine, urlOffsetInLine + urlLength);
128
			urlString = line.substring(urlOffsetInLine, urlOffsetInLine + urlLength);
113
			new URL(urlString);
129
			new URL(urlString);
114
		} catch (MalformedURLException ex) {
130
		} catch (MalformedURLException ex) {
Lines 116-122 Link Here
116
			return null;
132
			return null;
117
		}
133
		}
118
134
119
		IRegion urlRegion = new Region(lineInfo.getOffset() + urlOffsetInLine, urlLength);
135
		IRegion urlRegion = new Region(offset + urlOffsetInLine, urlLength);
120
		return new IHyperlink[] { new TaskUrlHyperlink(urlRegion, urlString) };
136
		return new IHyperlink[] { new TaskUrlHyperlink(urlRegion, urlString) };
121
	}
137
	}
138
139
	public IHyperlink[] detectHyperlinks(ITextViewer textViewer, IRegion region, boolean canShowMultipleHyperlinks) {
140
		if (region == null || textViewer == null) {
141
			return null;
142
		}
143
144
		IDocument document = textViewer.getDocument();
145
146
		int offset = region.getOffset();
147
		if (document == null) {
148
			return null;
149
		}
150
151
		IRegion lineInfo;
152
		String line;
153
		try {
154
			lineInfo = document.getLineInformationOfOffset(offset);
155
			line = document.get(lineInfo.getOffset(), lineInfo.getLength());
156
		} catch (BadLocationException ex) {
157
			return null;
158
		}
159
160
		int offsetInLine = offset - lineInfo.getOffset();
161
162
		return findHyperlinks(line, offsetInLine, lineInfo.getOffset());
163
	}
122
}
164
}

Return to bug 229014