@@ -2559,6 +2562,7 @@
fSourceViewer.addTextInputListener(fTextListener);
getSelectionProvider().addSelectionChangedListener(getSelectionChangedListener());
+ initializeViewerHyperlinkDetectors(fSourceViewer);
initializeViewerFont(fSourceViewer);
initializeViewerColors(fSourceViewer);
initializeFindScopeColor(fSourceViewer);
@@ -5672,4 +5676,64 @@
return true;
}
+ private HyperlinkDetectorExtensionReader fDetectorExtensionReader = new HyperlinkDetectorExtensionReader();
+
+ private IHyperlinkDetector[] fContributedHyperlinkDectors = null;
+
+ private void initializeViewerHyperlinkDetectors(ISourceViewer sourceViewer) {
+ fDetectorExtensionReader.readHyperlinkDetectorsExtension(this);
+ if (fContributedHyperlinkDectors != null && fPreferenceStore.getBoolean(PREFERENCE_HYPERLINKS_ENABLED)
+ && fSourceViewer instanceof ITextViewerExtension6) {
+
+ IHyperlinkDetector[] sourceViewerDetectors = getSourceViewerConfiguration().getHyperlinkDetectors(fSourceViewer);
+ int stateMask = getSourceViewerConfiguration().getHyperlinkStateMask(fSourceViewer);
+ ITextViewerExtension6 textViewer6 = (ITextViewerExtension6) fSourceViewer;
+
+ List allDectors = new ArrayList();
+ allDectors.addAll(Arrays.asList(sourceViewerDetectors));
+ allDectors.addAll(Arrays.asList(fContributedHyperlinkDectors));
+ textViewer6.setHyperlinkDetectors((IHyperlinkDetector[])allDectors.toArray(new IHyperlinkDetector[allDectors.size()]), stateMask);
+ }
+ }
+
+ private final class HyperlinkDetectorExtensionReader {
+
+ private List contributedDetectors = new ArrayList();
+
+ private boolean extensionsRead = false;
+
+ public static final String EXTENSION_POINT_HYPERLINK_DETECTOR = "org.eclipse.ui.workbench.texteditor.hyperlinkDetectors";
+
+ public static final String ELEMENT_HYPERLINK_DETECTOR = "hyperlinkDetector";
+
+ public static final String ELEMENT_CLASS = "class";
+
+ private void readHyperlinkDetectorsExtension(ITextEditor textEditor) {
+ if (!extensionsRead) {
+ List contributedDectors = new ArrayList();
+ IExtensionRegistry registry = Platform.getExtensionRegistry();
+ IExtensionPoint extensionPoint = registry.getExtensionPoint(EXTENSION_POINT_HYPERLINK_DETECTOR);
+ IExtension[] extensions = extensionPoint.getExtensions();
+ for (int i = 0; i < extensions.length; i++) {
+ IConfigurationElement[] elements = extensions[i].getConfigurationElements();
+ for (int j = 0; j < elements.length; j++) {
+ if (elements[j].getName().compareTo(ELEMENT_HYPERLINK_DETECTOR) == 0) {
+ try {
+ Object detector = elements[j].createExecutableExtension(ELEMENT_CLASS);
+ if (detector instanceof AbstractHyperlinkDetector) {
+ ((AbstractHyperlinkDetector) detector).setEditor(textEditor);
+ contributedDectors.add(detector);
+ }
+ } catch (CoreException e) {
+ // TODO: handle once this goes where it belongs
+ throw new RuntimeException(e);
+ }
+ }
+ }
+ }
+ AbstractTextEditor.this.fContributedHyperlinkDectors = (IHyperlinkDetector[]) contributedDectors.toArray(new IHyperlinkDetector[contributedDectors.size()]);
+ extensionsRead = true;
+ }
+ }
+ }
}
Index: src/org/eclipse/ui/texteditor/AbstractHyperlinkDetector.java
===================================================================
RCS file: src/org/eclipse/ui/texteditor/AbstractHyperlinkDetector.java
diff -N src/org/eclipse/ui/texteditor/AbstractHyperlinkDetector.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ src/org/eclipse/ui/texteditor/AbstractHyperlinkDetector.java 1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2005 - 2006 University Of British Columbia and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.ui.texteditor;
+
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.hyperlink.IHyperlink;
+import org.eclipse.jface.text.hyperlink.IHyperlinkDetector;
+
+/**
+ * @author Mik Kersten
+ */
+public abstract class AbstractHyperlinkDetector implements IHyperlinkDetector {
+
+ private ITextEditor fEditor;
+
+ public abstract IHyperlink[] detectHyperlinks(ITextViewer textViewer, IRegion region,
+ boolean canShowMultipleHyperlinks);
+
+ public ITextEditor getEditor() {
+ return fEditor;
+ }
+
+ public void setEditor(ITextEditor editor) {
+ this.fEditor = editor;
+ }
+}
Index: schema/hyperlinkDetectors.exsd
===================================================================
RCS file: schema/hyperlinkDetectors.exsd
diff -N schema/hyperlinkDetectors.exsd
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ schema/hyperlinkDetectors.exsd 1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,122 @@
+
+
+