|
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(); |