Download
Getting Started
Members
Projects
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
More
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
Toggle navigation
Bugzilla – Attachment 101626 Details for
Bug 229014
URL Links in Task editor include parens and other punctuation
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
Log In
[x]
|
Terms of Use
|
Copyright Agent
Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read
this important communication.
[patch]
updated patch
clipboard.txt (text/plain), 10.11 KB, created by
Frank Becker
on 2008-05-22 16:47:21 EDT
(
hide
)
Description:
updated patch
Filename:
MIME Type:
Creator:
Frank Becker
Created:
2008-05-22 16:47:21 EDT
Size:
10.11 KB
patch
obsolete
>### Eclipse Workspace Patch 1.0 >#P org.eclipse.mylyn.tasks.ui >Index: src/org/eclipse/mylyn/internal/tasks/ui/editors/RepositoryTextViewerConfiguration.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/RepositoryTextViewerConfiguration.java,v >retrieving revision 1.16 >diff -u -r1.16 RepositoryTextViewerConfiguration.java >--- src/org/eclipse/mylyn/internal/tasks/ui/editors/RepositoryTextViewerConfiguration.java 7 May 2008 06:05:46 -0000 1.16 >+++ src/org/eclipse/mylyn/internal/tasks/ui/editors/RepositoryTextViewerConfiguration.java 22 May 2008 20:42:17 -0000 >@@ -15,6 +15,7 @@ > import org.eclipse.core.runtime.IAdaptable; > import org.eclipse.jface.preference.JFacePreferences; > import org.eclipse.jface.resource.JFaceResources; >+import org.eclipse.jface.text.BadLocationException; > import org.eclipse.jface.text.IDocument; > import org.eclipse.jface.text.IRegion; > import org.eclipse.jface.text.TextAttribute; >@@ -28,9 +29,10 @@ > import org.eclipse.jface.text.presentation.PresentationReconciler; > import org.eclipse.jface.text.reconciler.IReconciler; > import org.eclipse.jface.text.rules.DefaultDamagerRepairer; >+import org.eclipse.jface.text.rules.ICharacterScanner; >+import org.eclipse.jface.text.rules.IPredicateRule; > import org.eclipse.jface.text.rules.IRule; > import org.eclipse.jface.text.rules.IToken; >-import org.eclipse.jface.text.rules.MultiLineRule; > import org.eclipse.jface.text.rules.RuleBasedScanner; > import org.eclipse.jface.text.rules.SingleLineRule; > import org.eclipse.jface.text.rules.Token; >@@ -40,6 +42,7 @@ > import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin; > import org.eclipse.mylyn.tasks.core.ITask; > import org.eclipse.mylyn.tasks.core.TaskRepository; >+import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi; > import org.eclipse.mylyn.tasks.ui.TaskHyperlink; > import org.eclipse.swt.SWT; > import org.eclipse.swt.custom.StyleRange; >@@ -86,7 +89,7 @@ > > private RepositoryTextScanner getDefaultScanner() { > if (scanner == null) { >- scanner = new RepositoryTextScanner(); >+ scanner = new RepositoryTextScanner(taskRepository); > } > return scanner; > } >@@ -214,35 +217,91 @@ > } > > private static class RepositoryTextScanner extends RuleBasedScanner { >+ public void addToOffset(int length) { >+ fOffset += length; >+ } >+ >+ public void addToTokenOffset(int length) { >+ fTokenOffset += length; >+ } >+ >+ public String getLineTextFromPos() { >+ try { >+ int line; >+ line = fDocument.getLineOfOffset(fOffset); >+ int start = fDocument.getLineOffset(line); >+ int length = fDocument.getLineLength(line); >+ >+ String erg = fDocument.get(fOffset, length - (fOffset - start)); >+ return erg; >+ } catch (BadLocationException e) { >+ } >+ return null; >+ } > >- public RepositoryTextScanner() { >+ public RepositoryTextScanner(TaskRepository repository) { > IToken bugToken = new Token(new TextAttribute(JFaceResources.getColorRegistry().get( > JFacePreferences.ACTIVE_HYPERLINK_COLOR))); > IToken quoteToken = new Token(new TextAttribute(CommonColors.TEXT_QUOTED)); >- IRule[] rules = new IRule[16]; >- rules[0] = (new SingleLineRule("http://", " ", bugToken)); >- rules[1] = (new SingleLineRule("https://", " ", bugToken)); >- rules[2] = (new SingleLineRule("bug#", " ", bugToken)); >- rules[3] = (new SingleLineRule("bug#", "", bugToken)); >- rules[4] = (new SingleLineRule("bug #", "", bugToken)); >- rules[5] = (new SingleLineRule("http://", "\n", bugToken)); >- rules[6] = (new SingleLineRule("https://", "\n", bugToken)); >- rules[7] = (new SingleLineRule("task#", " ", bugToken)); >- rules[8] = (new MultiLineRule("task#", "\n", bugToken)); >- rules[9] = (new MultiLineRule("task# ", " ", bugToken)); >- rules[10] = (new SingleLineRule("task #", "\n", bugToken)); >- rules[11] = (new SingleLineRule("*** This bug has been ", "***", bugToken)); >- rules[12] = (new SingleLineRule("http://", "", bugToken)); >- rules[13] = (new SingleLineRule("https://", "", bugToken)); >- rules[14] = (new MultiLineRule("task #", " ", bugToken)); >+ IRule[] rules = new IRule[3]; >+ rules[0] = (new TaskRule(repository, bugToken)); >+ rules[1] = (new SingleLineRule("*** This bug has been ", "***", bugToken)); > SingleLineRule quoteRule = new SingleLineRule(">", null, quoteToken, (char) 0, true); > quoteRule.setColumnConstraint(0); >- rules[15] = quoteRule; >+ rules[2] = quoteRule; > setRules(rules); > } > > } > >+ private static class TaskRule implements IPredicateRule { >+ >+ private final IToken taskToken; >+ >+ private final TaskRepository repository; >+ >+ public TaskRule(TaskRepository repository, IToken token) { >+ this.repository = repository; >+ this.taskToken = token; >+ } >+ >+ public IToken evaluate(ICharacterScanner scanner, boolean resume) { >+ String text = ((RepositoryTextScanner) scanner).getLineTextFromPos(); >+ if (text == null || text.length() == 0) { >+ return Token.UNDEFINED; >+ } >+ >+ AbstractRepositoryConnectorUi connectorUi = TasksUiPlugin.getConnectorUi(repository.getConnectorKind()); >+ if (connectorUi == null) { >+ return Token.UNDEFINED; >+ } >+ IHyperlink[] hyperlinks = connectorUi.findHyperlinks(repository, text, 0, 0); >+ if (hyperlinks == null || hyperlinks.length == 0) { >+ hyperlinks = TaskUrlHyperlinkDetector.getDefault().findHyperlinks(text, 1, 0); >+ } >+ if (hyperlinks != null && hyperlinks.length > 0) { >+ IRegion aa = hyperlinks[0].getHyperlinkRegion(); >+ aa.getLength(); >+ if (aa.getOffset() > 0) { >+ ((RepositoryTextScanner) scanner).addToTokenOffset(aa.getOffset()); >+ } >+ ((RepositoryTextScanner) scanner).addToOffset(aa.getLength() + aa.getOffset()); >+ >+ return taskToken; >+ } >+ return Token.UNDEFINED; >+ } >+ >+ public IToken getSuccessToken() { >+ return taskToken; >+ } >+ >+ public IToken evaluate(ICharacterScanner scanner) { >+ return evaluate(scanner, false); >+ } >+ >+ } >+ > @Override > public IContentAssistant getContentAssistant(ISourceViewer sourceViewer) { > ContentAssistant assistant = new ContentAssistant(); >Index: src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskUrlHyperlinkDetector.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskUrlHyperlinkDetector.java,v >retrieving revision 1.3 >diff -u -r1.3 TaskUrlHyperlinkDetector.java >--- src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskUrlHyperlinkDetector.java 1 Mar 2008 21:38:51 -0000 1.3 >+++ src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskUrlHyperlinkDetector.java 22 May 2008 20:42:17 -0000 >@@ -27,31 +27,21 @@ > */ > public class TaskUrlHyperlinkDetector extends AbstractHyperlinkDetector { > >- public IHyperlink[] detectHyperlinks(ITextViewer textViewer, IRegion region, boolean canShowMultipleHyperlinks) { >- if (region == null || textViewer == null) { >- return null; >- } >- >- IDocument document = textViewer.getDocument(); >- >- int offset = region.getOffset(); >+ private static TaskUrlHyperlinkDetector INSTANCE; > >- String urlString = null; >- if (document == null) { >- return null; >- } >+ public TaskUrlHyperlinkDetector() { >+ super(); >+ INSTANCE = this; >+ } > >- IRegion lineInfo; >- String line; >- try { >- lineInfo = document.getLineInformationOfOffset(offset); >- line = document.get(lineInfo.getOffset(), lineInfo.getLength()); >- } catch (BadLocationException ex) { >- return null; >- } >+ public static TaskUrlHyperlinkDetector getDefault() { >+ return INSTANCE; >+ } > >- int offsetInLine = offset - lineInfo.getOffset(); >+ public IHyperlink[] findHyperlinks(String line, int offsetInLine, int offset) { >+ char doubleChar = ' '; > >+ String urlString = null; > boolean startDoubleQuote = false; > int urlOffsetInLine = 0; > int urlLength = 0; >@@ -68,9 +58,31 @@ > if (urlOffsetInLine > -1) { > ch = line.charAt(urlOffsetInLine); > } >- startDoubleQuote = ch == '"'; >+ doubleChar = ch; > } while (Character.isUnicodeIdentifierStart(ch)); > urlOffsetInLine++; >+ switch (ch) { >+ case '"': >+ doubleChar = '"'; >+ break; >+ case '\'': >+ doubleChar = '\''; >+ break; >+ case '[': >+ doubleChar = ']'; >+ break; >+ case '(': >+ doubleChar = ')'; >+ break; >+ case '{': >+ doubleChar = '}'; >+ break; >+ >+ default: >+ doubleChar = ' '; >+ break; >+ } >+ startDoubleQuote = doubleChar != ' '; > > // Right to "://" > StringTokenizer tokenizer = new StringTokenizer(line.substring(urlSeparatorOffset + 3), >@@ -93,7 +105,7 @@ > > if (startDoubleQuote) { > int endOffset = -1; >- int nextDoubleQuote = line.indexOf('"', urlOffsetInLine); >+ int nextDoubleQuote = line.indexOf(doubleChar, urlOffsetInLine); > int nextWhitespace = line.indexOf(' ', urlOffsetInLine); > if (nextDoubleQuote != -1 && nextWhitespace != -1) { > endOffset = Math.min(nextDoubleQuote, nextWhitespace); >@@ -109,6 +121,10 @@ > > // Set and validate URL string > try { >+ char lastChar = line.charAt(urlOffsetInLine + urlLength - 1); >+ if (lastChar == ',' || lastChar == '.') { >+ urlLength--; >+ } > urlString = line.substring(urlOffsetInLine, urlOffsetInLine + urlLength); > new URL(urlString); > } catch (MalformedURLException ex) { >@@ -116,7 +132,33 @@ > return null; > } > >- IRegion urlRegion = new Region(lineInfo.getOffset() + urlOffsetInLine, urlLength); >+ IRegion urlRegion = new Region(offset + urlOffsetInLine, urlLength); > return new IHyperlink[] { new TaskUrlHyperlink(urlRegion, urlString) }; > } >+ >+ public IHyperlink[] detectHyperlinks(ITextViewer textViewer, IRegion region, boolean canShowMultipleHyperlinks) { >+ if (region == null || textViewer == null) { >+ return null; >+ } >+ >+ IDocument document = textViewer.getDocument(); >+ >+ int offset = region.getOffset(); >+ if (document == null) { >+ return null; >+ } >+ >+ IRegion lineInfo; >+ String line; >+ try { >+ lineInfo = document.getLineInformationOfOffset(offset); >+ line = document.get(lineInfo.getOffset(), lineInfo.getLength()); >+ } catch (BadLocationException ex) { >+ return null; >+ } >+ >+ int offsetInLine = offset - lineInfo.getOffset(); >+ >+ return findHyperlinks(line, offsetInLine, lineInfo.getOffset()); >+ } > }
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 229014
:
101535
|
101536
| 101626 |
101629
|
104046
|
104047