New Upstream Snapshot - eclipse-platform-text

Ready changes

Summary

Merged new upstream version: 200502080800+git20230109.1.8c09461+ds (was: 4.26).

Resulting package

Built on 2023-01-22T01:56 (took 11m4s)

The resulting binary packages can be installed (if you have the apt repository enabled) by running one of:

apt install -t fresh-snapshots libeclipse-core-filebuffers-javaapt install -t fresh-snapshots libeclipse-jface-text-javaapt install -t fresh-snapshots libeclipse-search-javaapt install -t fresh-snapshots libeclipse-text-javaapt install -t fresh-snapshots libeclipse-ui-editors-javaapt install -t fresh-snapshots libeclipse-ui-genericeditor-javaapt install -t fresh-snapshots libeclipse-ui-workbench-texteditor-java

Lintian Result

Diff

diff --git a/.github/dependabot.yml b/.github/dependabot.yml
deleted file mode 100644
index 71607d0..0000000
--- a/.github/dependabot.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-version: 2
-updates:
-- package-ecosystem: github-actions
-  directory: "/"
-  schedule:
-    interval: daily
diff --git a/.github/workflows/verifyFreezePeriod.yml b/.github/workflows/verifyFreezePeriod.yml
deleted file mode 100644
index fed6cc5..0000000
--- a/.github/workflows/verifyFreezePeriod.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-# This workflow calls the Code-Freeze-Period check
-
-name: Check Code Freeze Period
-
-on:
-  pull_request:
-    branches: 
-     - 'master'
-
-jobs:
-  check-freeze-period:
-    uses: eclipse-platform/eclipse.platform.releng.aggregator/.github/workflows/verifyFreezePeriod.yml@master
diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index 8c663de..0000000
--- a/.gitignore
+++ /dev/null
@@ -1,13 +0,0 @@
-/*/bin/
-*~
-*.rej
-*.bak
-javacore.*
-heapdump.*
-core.*
-Snap.*
-# maven
-target/
-.DS_Store
-.polyglot.*
-pom.tycho
diff --git a/debian/changelog b/debian/changelog
index 9d1941e..4b63c51 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+eclipse-platform-text (200502080800+git20230109.1.8c09461+ds-1) UNRELEASED; urgency=low
+
+  * New upstream snapshot.
+
+ -- Debian Janitor <janitor@jelmer.uk>  Sun, 22 Jan 2023 01:49:11 -0000
+
 eclipse-platform-text (4.26-1) unstable; urgency=medium
 
   * New upstream release
diff --git a/debian/patches/01-fix-compilation-error.patch b/debian/patches/01-fix-compilation-error.patch
index 9ca57f1..7d0285c 100644
--- a/debian/patches/01-fix-compilation-error.patch
+++ b/debian/patches/01-fix-compilation-error.patch
@@ -1,9 +1,11 @@
 Description: Fixes a compilation error (maybe a difference between javac and ecj?)
 Author: Emmanuel Bourg <ebourg@apache.org>
 Forwarded: no
---- a/org.eclipse.jface.text/src/org/eclipse/jface/internal/text/codemining/CodeMiningManager.java
-+++ b/org.eclipse.jface.text/src/org/eclipse/jface/internal/text/codemining/CodeMiningManager.java
-@@ -220,8 +220,10 @@
+Index: eclipse-platform-text.git/org.eclipse.jface.text/src/org/eclipse/jface/internal/text/codemining/CodeMiningManager.java
+===================================================================
+--- eclipse-platform-text.git.orig/org.eclipse.jface.text/src/org/eclipse/jface/internal/text/codemining/CodeMiningManager.java
++++ eclipse-platform-text.git/org.eclipse.jface.text/src/org/eclipse/jface/internal/text/codemining/CodeMiningManager.java
+@@ -220,8 +220,10 @@ public class CodeMiningManager implement
  				return 0;
  			}
  		});
diff --git a/org.eclipse.jface.text.tests/META-INF/MANIFEST.MF b/org.eclipse.jface.text.tests/META-INF/MANIFEST.MF
index c331d91..60c34d5 100644
--- a/org.eclipse.jface.text.tests/META-INF/MANIFEST.MF
+++ b/org.eclipse.jface.text.tests/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-Name: %Plugin.name
 Bundle-SymbolicName: org.eclipse.jface.text.tests
-Bundle-Version: 3.12.600.qualifier
+Bundle-Version: 3.12.700.qualifier
 Bundle-Vendor: %Plugin.providerName
 Bundle-Localization: plugin
 Export-Package: 
diff --git a/org.eclipse.jface.text/META-INF/MANIFEST.MF b/org.eclipse.jface.text/META-INF/MANIFEST.MF
index 0c38fd3..590a341 100644
--- a/org.eclipse.jface.text/META-INF/MANIFEST.MF
+++ b/org.eclipse.jface.text/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.jface.text
-Bundle-Version: 3.22.0.qualifier
+Bundle-Version: 3.23.0.qualifier
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
 Export-Package: 
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/internal/text/codemining/CodeMiningLineHeaderAnnotation.java b/org.eclipse.jface.text/src/org/eclipse/jface/internal/text/codemining/CodeMiningLineHeaderAnnotation.java
index abed58b..29c4213 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/internal/text/codemining/CodeMiningLineHeaderAnnotation.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/internal/text/codemining/CodeMiningLineHeaderAnnotation.java
@@ -1,5 +1,5 @@
 /**
- *  Copyright (c) 2017 Angelo ZERR.
+ *  Copyright (c) 2017, 2022 Angelo ZERR.
  *
  *  This program and the accompanying materials
  *  are made available under the terms of the Eclipse Public License 2.0
@@ -88,7 +88,7 @@ public class CodeMiningLineHeaderAnnotation extends LineHeaderAnnotation impleme
 	 *         label and <code>false</code> otherwise.
 	 */
 	private boolean hasAtLeastOneResolvedMiningNotEmpty() {
-		if (fMinings.stream().anyMatch(m -> m.getLabel() != null)) {
+		if (fMinings.stream().anyMatch(m -> m.getLabel() != null && !m.getLabel().isEmpty())) {
 			return true; // will have a resolved mining.
 		}
 
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/ITextViewerLifecycle.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/ITextViewerLifecycle.java
new file mode 100644
index 0000000..32c93c7
--- /dev/null
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/ITextViewerLifecycle.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2022 Red Hat Inc. and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * - Angelo ZERR (Red Hat Inc.)  - initial implementation
+ *******************************************************************************/
+package org.eclipse.jface.text;
+
+import org.eclipse.jface.text.DefaultInformationControl.IInformationPresenter;
+import org.eclipse.jface.text.contentassist.IContentAssistant;
+import org.eclipse.jface.text.hyperlink.IHyperlinkPresenter;
+import org.eclipse.jface.text.presentation.IPresentationReconciler;
+import org.eclipse.jface.text.reconciler.IReconciler;
+import org.eclipse.jface.text.reconciler.IReconcilingStrategy;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.jface.text.source.ISourceViewerExtension2;
+
+/**
+ * {@link ITextViewer} lifecycle API to track install / uninstall of a given {@link ITextViewer} for
+ * the given contribution which extends {@link ITextViewerLifecycle}:
+ *
+ * <ul>
+ * <li>{@link IReconciler}</li>
+ * <li>{@link IPresentationReconciler}</li>
+ * <li>{@link IHyperlinkPresenter}</li>
+ * <li>{@link IInformationPresenter}</li>
+ * <li>{@link IContentAssistant}</li>
+ * </ul>
+ *
+ * It is possible too to implement {@link ITextViewerLifecycle} to track install / uninstall of a
+ * given {@link ITextViewer} for implementation of:
+ *
+ * <ul>
+ * <li>{@link IReconcilingStrategy}</li>
+ * <li>{@link IAutoEditStrategy}</li>
+ * </ul>
+ *
+ * @since 3.23
+ *
+ */
+public interface ITextViewerLifecycle {
+
+	/**
+	 * Installs a text viewer. This method is called when
+	 * {@link ISourceViewer#configure(org.eclipse.jface.text.source.SourceViewerConfiguration)} is
+	 * called.
+	 *
+	 * @param textViewer the text viewer
+	 */
+	void install(ITextViewer textViewer);
+
+	/**
+	 * Uninstalls the registered text viewer. This method is called when
+	 * {@link ISourceViewerExtension2#unconfigure()} is called.
+	 */
+	void uninstall();
+}
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/IContentAssistant.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/IContentAssistant.java
index f6954cd..a6f7649 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/IContentAssistant.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/IContentAssistant.java
@@ -14,6 +14,7 @@
 package org.eclipse.jface.text.contentassist;
 
 import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.ITextViewerLifecycle;
 
 
 /**
@@ -76,7 +77,7 @@ import org.eclipse.jface.text.ITextViewer;
  * @see org.eclipse.jface.text.ITextViewer
  * @see org.eclipse.jface.text.contentassist.IContentAssistProcessor
  */
- public interface IContentAssistant {
+public interface IContentAssistant extends ITextViewerLifecycle {
 
 	//------ proposal popup orientation styles ------------
 	/** The context info list will overlay the list of completion proposals. */
@@ -98,12 +99,14 @@ import org.eclipse.jface.text.ITextViewer;
 	 *
 	 * @param textViewer the text viewer on which content assist will work
 	 */
+	@Override
 	void install(ITextViewer textViewer);
 
 	/**
 	 * Uninstalls content assist support from the text viewer it has
 	 * previously be installed on.
 	 */
+	@Override
 	void uninstall();
 
 	/**
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/hyperlink/IHyperlinkPresenter.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/hyperlink/IHyperlinkPresenter.java
index f926fac..5ea7d1b 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/hyperlink/IHyperlinkPresenter.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/hyperlink/IHyperlinkPresenter.java
@@ -14,6 +14,7 @@
 package org.eclipse.jface.text.hyperlink;
 
 import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.ITextViewerLifecycle;
 
 
 /**
@@ -39,7 +40,7 @@ import org.eclipse.jface.text.ITextViewer;
  * @see IHyperlinkPresenterExtension2
  * @since 3.1
  */
-public interface IHyperlinkPresenter {
+public interface IHyperlinkPresenter extends ITextViewerLifecycle {
 
 	/**
 	 * Tells whether this presenter is able to handle
@@ -73,10 +74,12 @@ public interface IHyperlinkPresenter {
 	 *
 	 * @param textViewer the text viewer
 	 */
+	@Override
 	void install(ITextViewer textViewer);
 
 	/**
 	 * Uninstalls this hyperlink presenter.
 	 */
+	@Override
 	void uninstall();
 }
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/information/IInformationPresenter.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/information/IInformationPresenter.java
index 2874e9a..263aae1 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/information/IInformationPresenter.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/information/IInformationPresenter.java
@@ -14,6 +14,7 @@
 package org.eclipse.jface.text.information;
 
 import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.ITextViewerLifecycle;
 
 
 /**
@@ -46,7 +47,7 @@ import org.eclipse.jface.text.ITextViewer;
  * @see org.eclipse.jface.text.information.IInformationProvider
  * @since 2.0
  */
-public interface IInformationPresenter {
+public interface IInformationPresenter extends ITextViewerLifecycle {
 
 	/**
 	 * Installs the information presenter on the given text viewer. After this method has been
@@ -55,12 +56,14 @@ public interface IInformationPresenter {
 	 *
 	 * @param textViewer the viewer on which the presenter is installed
 	 */
+	@Override
 	void install(ITextViewer textViewer);
 
 	/**
 	 * Removes the information presenter from the text viewer it has previously been
 	 * installed on.
 	 */
+	@Override
 	void uninstall();
 
 	/**
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/presentation/IPresentationReconciler.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/presentation/IPresentationReconciler.java
index 222233e..03338a6 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/presentation/IPresentationReconciler.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/presentation/IPresentationReconciler.java
@@ -15,6 +15,7 @@ package org.eclipse.jface.text.presentation;
 
 
 import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.ITextViewerLifecycle;
 
 
 /**
@@ -55,7 +56,7 @@ import org.eclipse.jface.text.ITextViewer;
  * @see org.eclipse.jface.text.presentation.IPresentationRepairer
  * @see org.eclipse.jface.text.TextPresentation
  */
-public interface IPresentationReconciler {
+public interface IPresentationReconciler extends ITextViewerLifecycle {
 
 	/**
 	 * Installs this presentation reconciler on the given text viewer. After
@@ -71,12 +72,14 @@ public interface IPresentationReconciler {
 	 * @param viewer the viewer on which this presentation reconciler is
 	 *        installed
 	 */
+	@Override
 	void install(ITextViewer viewer);
 
 	/**
 	 * Removes the reconciler from the text viewer it has previously been
 	 * installed on.
 	 */
+	@Override
 	void uninstall();
 
 	/**
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/reconciler/IReconciler.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/reconciler/IReconciler.java
index fc3fa2c..06419f1 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/reconciler/IReconciler.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/reconciler/IReconciler.java
@@ -14,6 +14,7 @@
 package org.eclipse.jface.text.reconciler;
 
 import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.ITextViewerLifecycle;
 
 
 /**
@@ -47,7 +48,7 @@ import org.eclipse.jface.text.ITextViewer;
  * @see ITextViewer
  * @see IReconcilingStrategy
  */
-public interface IReconciler {
+public interface IReconciler extends ITextViewerLifecycle {
 
 	/**
 	 * Installs the reconciler on the given text viewer. After this method has been
@@ -56,12 +57,14 @@ public interface IReconciler {
 	 *
 	 * @param textViewer the viewer on which the reconciler is installed
 	 */
+	@Override
 	void install(ITextViewer textViewer);
 
 	/**
 	 * Removes the reconciler from the text viewer it has
 	 * previously been installed on.
 	 */
+	@Override
 	void uninstall();
 
 	/**
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/reconciler/MonoReconciler.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/reconciler/MonoReconciler.java
index 176c6e1..eba0502 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/reconciler/MonoReconciler.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/reconciler/MonoReconciler.java
@@ -17,6 +17,8 @@ import org.eclipse.core.runtime.Assert;
 import org.eclipse.core.runtime.IProgressMonitor;
 
 import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.ITextViewerLifecycle;
 import org.eclipse.jface.text.Region;
 
 
@@ -98,4 +100,20 @@ public class MonoReconciler extends AbstractReconciler {
 			extension.initialReconcile();
 		}
 	}
+
+	@Override
+	public void install(ITextViewer textViewer) {
+		super.install(textViewer);
+		if (fStrategy instanceof ITextViewerLifecycle) {
+			((ITextViewerLifecycle) fStrategy).install(textViewer);
+		}
+	}
+
+	@Override
+	public void uninstall() {
+		if (fStrategy instanceof ITextViewerLifecycle) {
+			((ITextViewerLifecycle) fStrategy).uninstall();
+		}
+		super.uninstall();
+	}
 }
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/reconciler/Reconciler.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/reconciler/Reconciler.java
index 4a7eea8..3cfbefc 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/reconciler/Reconciler.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/reconciler/Reconciler.java
@@ -26,6 +26,8 @@ import org.eclipse.jface.text.BadLocationException;
 import org.eclipse.jface.text.IDocument;
 import org.eclipse.jface.text.IDocumentExtension3;
 import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.ITextViewerLifecycle;
 import org.eclipse.jface.text.ITypedRegion;
 import org.eclipse.jface.text.Region;
 import org.eclipse.jface.text.TextUtilities;
@@ -161,6 +163,35 @@ public class Reconciler extends AbstractReconciler implements IReconcilerExtensi
 		}
 	}
 
+
+	@Override
+	public void install(ITextViewer textViewer) {
+		super.install(textViewer);
+		if (fStrategies != null) {
+			Iterator<IReconcilingStrategy> e= fStrategies.values().iterator();
+			while (e.hasNext()) {
+				IReconcilingStrategy strategy= e.next();
+				if (strategy instanceof ITextViewerLifecycle) {
+					((ITextViewerLifecycle) strategy).install(textViewer);
+				}
+			}
+		}
+	}
+
+	@Override
+	public void uninstall() {
+		if (fStrategies != null) {
+			Iterator<IReconcilingStrategy> e= fStrategies.values().iterator();
+			while (e.hasNext()) {
+				IReconcilingStrategy strategy= e.next();
+				if (strategy instanceof ITextViewerLifecycle) {
+					((ITextViewerLifecycle) strategy).uninstall();
+				}
+			}
+		}
+		super.uninstall();
+	}
+
 	@Override
 	public void setProgressMonitor(IProgressMonitor monitor) {
 		super.setProgressMonitor(monitor);
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/source/SourceViewer.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/source/SourceViewer.java
index 85395bd..af5eae5 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/source/SourceViewer.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/source/SourceViewer.java
@@ -17,7 +17,9 @@
  *******************************************************************************/
 package org.eclipse.jface.text.source;
 
+import java.util.ArrayList;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Stack;
 
 import org.eclipse.swt.SWT;
@@ -40,6 +42,7 @@ import org.eclipse.jface.text.BadPositionCategoryException;
 import org.eclipse.jface.text.BlockTextSelection;
 import org.eclipse.jface.text.DocumentRewriteSession;
 import org.eclipse.jface.text.DocumentRewriteSessionType;
+import org.eclipse.jface.text.IAutoEditStrategy;
 import org.eclipse.jface.text.IBlockTextSelection;
 import org.eclipse.jface.text.IDocument;
 import org.eclipse.jface.text.IDocumentExtension4;
@@ -51,6 +54,7 @@ import org.eclipse.jface.text.ISlaveDocumentManagerExtension;
 import org.eclipse.jface.text.ISynchronizable;
 import org.eclipse.jface.text.ITextSelection;
 import org.eclipse.jface.text.ITextViewerExtension2;
+import org.eclipse.jface.text.ITextViewerLifecycle;
 import org.eclipse.jface.text.Position;
 import org.eclipse.jface.text.Region;
 import org.eclipse.jface.text.TextViewer;
@@ -89,8 +93,8 @@ import org.eclipse.jface.text.source.inlined.InlinedAnnotationSupport;
  * <p>
  * Clients may subclass this class but should expect some breakage by future releases.</p>
  */
-public class SourceViewer extends TextViewer implements ISourceViewer, ISourceViewerExtension, ISourceViewerExtension2, ISourceViewerExtension3, ISourceViewerExtension4, ISourceViewerExtension5 {
-
+public class SourceViewer extends TextViewer
+		implements ISourceViewer, ISourceViewerExtension, ISourceViewerExtension2, ISourceViewerExtension3, ISourceViewerExtension4, ISourceViewerExtension5 {
 
 	/**
 	 * Layout of a source viewer. Vertical ruler, text widget, and overview ruler are shown side by side.
@@ -389,6 +393,8 @@ public class SourceViewer extends TextViewer implements ISourceViewer, ISourceVi
 	 */
 	private CodeMiningManager fCodeMiningManager;
 
+	private final List<ITextViewerLifecycle> lifecycles;
+
 	/**
 	 * Constructs a new source viewer. The vertical ruler is initially visible.
 	 * The viewer has not yet been initialized with a source viewer configuration.
@@ -422,7 +428,7 @@ public class SourceViewer extends TextViewer implements ISourceViewer, ISourceVi
 		fIsVerticalRulerVisible= (verticalRuler != null);
 		fOverviewRuler= overviewRuler;
 		fIsOverviewRulerVisible= (showAnnotationsOverview && overviewRuler != null);
-
+		this.lifecycles= new ArrayList<>();
 		createControl(parent, styles);
 	}
 
@@ -521,6 +527,8 @@ public class SourceViewer extends TextViewer implements ISourceViewer, ISourceVi
 
 		getTextWidget().setTabs(configuration.getTabWidth(this));
 
+		getTextWidget().setLineSpacing(configuration.getLineSpacing(this));
+
 		setAnnotationHover(configuration.getAnnotationHover(this));
 		setOverviewRulerAnnotationHover(configuration.getOverviewRulerAnnotationHover(this));
 
@@ -535,7 +543,7 @@ public class SourceViewer extends TextViewer implements ISourceViewer, ISourceVi
 		String[] types= configuration.getConfiguredContentTypes(this);
 		for (String t : types) {
 
-			setAutoEditStrategies(configuration.getAutoEditStrategies(this, t), t);
+			doSetAutoEditStrategies(configuration.getAutoEditStrategies(this, t), t);
 			setTextDoubleClickStrategy(configuration.getDoubleClickStrategy(this, t), t);
 
 			int[] stateMasks= configuration.getConfiguredTextHoverStateMasks(this, t);
@@ -556,10 +564,21 @@ public class SourceViewer extends TextViewer implements ISourceViewer, ISourceVi
 				setDefaultPrefixes(prefixes, t);
 		}
 		setCodeMiningProviders(configuration.getCodeMiningProviders(this));
-
+		installTextViewer();
 		activatePlugins();
 	}
 
+	private void doSetAutoEditStrategies(IAutoEditStrategy[] strategies, String contentType) {
+		super.setAutoEditStrategies(strategies, contentType);
+		if (strategies != null) {
+			for (IAutoEditStrategy strategy : strategies) {
+				if (strategy instanceof ITextViewerLifecycle) {
+					addTextViewerLifecycle((ITextViewerLifecycle) strategy);
+				}
+			}
+		}
+	}
+
 	/**
 	 * After this method has been executed the caller knows that any installed annotation hover has been installed.
 	 */
@@ -710,6 +729,7 @@ public class SourceViewer extends TextViewer implements ISourceViewer, ISourceVi
 	public void unconfigure() {
 		clearRememberedSelection();
 
+		uninstallTextViewer();
 		if (fPresentationReconciler != null) {
 			fPresentationReconciler.uninstall();
 			fPresentationReconciler= null;
@@ -1320,4 +1340,23 @@ public class SourceViewer extends TextViewer implements ISourceViewer, ISourceVi
 		ensureCodeMiningManagerInstalled();
 	}
 
+	private void addTextViewerLifecycle(ITextViewerLifecycle lifecycle) {
+		if (lifecycle != null && !lifecycles.contains(lifecycle)) {
+			lifecycles.add(lifecycle);
+		}
+	}
+
+	private void installTextViewer() {
+		for (ITextViewerLifecycle lifecycle : lifecycles) {
+			lifecycle.install(this);
+		}
+	}
+
+	private void uninstallTextViewer() {
+		for (ITextViewerLifecycle lifecycle : lifecycles) {
+			lifecycle.uninstall();
+		}
+		lifecycles.clear();
+	}
+
 }
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/source/SourceViewerConfiguration.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/source/SourceViewerConfiguration.java
index 769433c..9c892ab 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/source/SourceViewerConfiguration.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/source/SourceViewerConfiguration.java
@@ -84,9 +84,20 @@ public class SourceViewerConfiguration {
 	}
 
 	/**
-	 * Returns the undo manager for the given source viewer. This implementation
-	 * always returns a new instance of <code>DefaultUndoManager</code> whose
-	 * history length is set to 25.
+	 * Returns the line space for the given source viewer. This implementation always returns 0.
+	 * 
+	 * @param sourceViewer the source viewer to be configured by this configuration
+	 * @return the line space
+	 * @see org.eclipse.swt.custom.StyledText#setLineSpacing(int)
+	 * @since 3.23
+	 */
+	public int getLineSpacing(ISourceViewer sourceViewer) {
+		return 0;
+	}
+
+	/**
+	 * Returns the undo manager for the given source viewer. This implementation always returns a
+	 * new instance of <code>DefaultUndoManager</code> whose history length is set to 25.
 	 *
 	 * @param sourceViewer the source viewer to be configured by this configuration
 	 * @return an undo manager or <code>null</code> if no undo/redo should not be supported
diff --git a/org.eclipse.ui.editors/META-INF/MANIFEST.MF b/org.eclipse.ui.editors/META-INF/MANIFEST.MF
index 50b75cf..c03288a 100644
--- a/org.eclipse.ui.editors/META-INF/MANIFEST.MF
+++ b/org.eclipse.ui.editors/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.ui.editors; singleton:=true
-Bundle-Version: 3.14.400.qualifier
+Bundle-Version: 3.15.0.qualifier
 Bundle-Activator: org.eclipse.ui.internal.editors.text.EditorsPlugin
 Bundle-ActivationPolicy: lazy
 Bundle-Vendor: %providerName
diff --git a/org.eclipse.ui.editors/forceQualifierUpdate.txt b/org.eclipse.ui.editors/forceQualifierUpdate.txt
index aeff0d5..6e3bd52 100644
--- a/org.eclipse.ui.editors/forceQualifierUpdate.txt
+++ b/org.eclipse.ui.editors/forceQualifierUpdate.txt
@@ -1,3 +1,3 @@
 # To force a version qualifier update add the bug here
 Bug 509931: Comparator errors in M20170104-0545
-Bug 534597 - Unanticipated comparator errors in I20180511-2000
\ No newline at end of file
+Bug 534597 - Unanticipated comparator errors in I20180511-2000
diff --git a/org.eclipse.ui.editors/plugin.properties b/org.eclipse.ui.editors/plugin.properties
index 37fdae6..d51b446 100644
--- a/org.eclipse.ui.editors/plugin.properties
+++ b/org.eclipse.ui.editors/plugin.properties
@@ -120,6 +120,7 @@ conversionSubMenu.label= Con&vert Line Delimiters To
 
 preferenceKeywords.general= pop-up text editor tabs spaces undo history ruler overview hyperlink overwrite colors range indicator typing appearance derived navigation smart caret positioning invisible whitespace characters drag drop dnd hovers popup sticky enrich rich
 preferenceKeywords.tabWidth= tab width
+preferenceKeywords.lineSpacing= line space height spacing
 preferenceKeywords.lineNumber= line numbers
 preferenceKeywords.printMargin= print margin
 preferenceKeywords.annotationCodeMining= annotation code mining marker error warning info
diff --git a/org.eclipse.ui.editors/plugin.xml b/org.eclipse.ui.editors/plugin.xml
index 1e3e7cb..29965b5 100644
--- a/org.eclipse.ui.editors/plugin.xml
+++ b/org.eclipse.ui.editors/plugin.xml
@@ -284,6 +284,7 @@
             id="org.eclipse.ui.preferencePages.GeneralTextEditor">
             <keywordReference id="org.eclipse.ui.editors.general"/>
             <keywordReference id="org.eclipse.ui.editors.tabWidth"/>
+            <keywordReference id="org.eclipse.ui.editors.lineSpacing"/>
             <keywordReference id="org.eclipse.ui.editors.lineNumber"/>
             <keywordReference id="org.eclipse.ui.editors.printMargin"/>
             <keywordReference id="org.eclipse.ui.editors.annotationCodeMining"/>
@@ -341,6 +342,9 @@
       <keyword
             label="%preferenceKeywords.tabWidth"
             id="org.eclipse.ui.editors.tabWidth"/>
+      <keyword
+            label="%preferenceKeywords.lineSpacing"
+            id="org.eclipse.ui.editors.lineSpacing"/>
       <keyword
             label="%preferenceKeywords.lineNumber"
             id="org.eclipse.ui.editors.lineNumber"/>
diff --git a/org.eclipse.ui.editors/src/org/eclipse/ui/editors/text/TextSourceViewerConfiguration.java b/org.eclipse.ui.editors/src/org/eclipse/ui/editors/text/TextSourceViewerConfiguration.java
index 658044f..2ce604b 100644
--- a/org.eclipse.ui.editors/src/org/eclipse/ui/editors/text/TextSourceViewerConfiguration.java
+++ b/org.eclipse.ui.editors/src/org/eclipse/ui/editors/text/TextSourceViewerConfiguration.java
@@ -20,6 +20,8 @@ import java.util.Map.Entry;
 import java.util.StringTokenizer;
 
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.FontData;
 import org.eclipse.swt.graphics.RGB;
 
 import org.eclipse.core.runtime.Assert;
@@ -192,6 +194,33 @@ public class TextSourceViewerConfiguration extends SourceViewerConfiguration {
 		return fPreferenceStore.getInt(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_TAB_WIDTH);
 	}
 
+	/**
+	 * Returns the lineSpacing for the given source viewer.
+	 * 
+	 * @param sourceViewer the source viewer to be configured by this configuration
+	 * @return the lineSpacing
+	 *
+	 * @see org.eclipse.swt.custom.StyledText#setLineSpacing(int)
+	 * @since 3.15
+	 */
+	@Override
+	public int getLineSpacing(ISourceViewer sourceViewer) {
+		// translate extra percentage into actual height
+		if (fPreferenceStore != null && sourceViewer != null) {
+			Font font= sourceViewer.getTextWidget().getFont();
+			if (font != null) {
+				FontData[] data= font.getFontData();
+				if (data != null && data.length > 0) {
+					int fontHeight= data[0].getHeight();
+					int spacingFactor= fPreferenceStore.getInt(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_LINE_SPACING);
+					return (int) (fontHeight * spacingFactor / 100.0f);
+				}
+			}
+		}
+		return super.getLineSpacing(sourceViewer);
+
+	}
+
 	@Override
 	public String[] getIndentPrefixes(ISourceViewer sourceViewer, String contentType) {
 		String[] indentPrefixes= getIndentPrefixesForTab(getTabWidth(sourceViewer));
diff --git a/org.eclipse.ui.editors/src/org/eclipse/ui/internal/editors/text/TextEditorDefaultsPreferencePage.java b/org.eclipse.ui.editors/src/org/eclipse/ui/internal/editors/text/TextEditorDefaultsPreferencePage.java
index 8b46109..95009b7 100644
--- a/org.eclipse.ui.editors/src/org/eclipse/ui/internal/editors/text/TextEditorDefaultsPreferencePage.java
+++ b/org.eclipse.ui.editors/src/org/eclipse/ui/internal/editors/text/TextEditorDefaultsPreferencePage.java
@@ -732,6 +732,8 @@ public class TextEditorDefaultsPreferencePage extends PreferencePage implements
 		overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_CURRENT_LINE));
 
 		overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.INT, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_TAB_WIDTH));
+		overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.INT, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_LINE_SPACING));
+
 		overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AbstractTextEditor.PREFERENCE_WORD_WRAP_ENABLED));
 		overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SPACES_FOR_TABS));
 		overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_DELETE_SPACES_AS_TABS));
@@ -852,6 +854,11 @@ public class TextEditorDefaultsPreferencePage extends PreferencePage implements
 		IntegerDomain tabWidthDomain= new IntegerDomain(1, 16);
 		addTextField(appearanceComposite, tabWidth, tabWidthDomain, 15, 0);
 
+		label= TextEditorMessages.TextEditorPreferencePage_lineSpacing;
+		Preference lineSpacing= new Preference(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_LINE_SPACING, label, null);
+		IntegerDomain lineSpaceDomain= new IntegerDomain(0, 1000);
+		addTextField(appearanceComposite, lineSpacing, lineSpaceDomain, 15, 0);
+
 		label= TextEditorMessages.TextEditorPreferencePage_enableWordWrap;
 		Preference enableWordWrap= new Preference(AbstractTextEditor.PREFERENCE_WORD_WRAP_ENABLED, label, null);
 		addCheckBox(appearanceComposite, enableWordWrap, new BooleanDomain(), 0);
diff --git a/org.eclipse.ui.editors/src/org/eclipse/ui/internal/editors/text/TextEditorMessages.java b/org.eclipse.ui.editors/src/org/eclipse/ui/internal/editors/text/TextEditorMessages.java
index ad82206..5858610 100644
--- a/org.eclipse.ui.editors/src/org/eclipse/ui/internal/editors/text/TextEditorMessages.java
+++ b/org.eclipse.ui.editors/src/org/eclipse/ui/internal/editors/text/TextEditorMessages.java
@@ -34,6 +34,7 @@ final class TextEditorMessages extends NLS {
 	public static String EditorsPlugin_internal_error;
 	public static String LinkedModeConfigurationBlock_DASHED_BOX;
 	public static String TextEditorPreferencePage_displayedTabWidth;
+	public static String TextEditorPreferencePage_lineSpacing;
 	public static String TextEditorPreferencePage_enableWordWrap;
 	public static String TextEditorPreferencePage_convertTabsToSpaces;
 	public static String TextEditorPreferencePage_undoHistorySize;
diff --git a/org.eclipse.ui.editors/src/org/eclipse/ui/internal/editors/text/TextEditorMessages.properties b/org.eclipse.ui.editors/src/org/eclipse/ui/internal/editors/text/TextEditorMessages.properties
index c7a5249..c2d724c 100644
--- a/org.eclipse.ui.editors/src/org/eclipse/ui/internal/editors/text/TextEditorMessages.properties
+++ b/org.eclipse.ui.editors/src/org/eclipse/ui/internal/editors/text/TextEditorMessages.properties
@@ -16,6 +16,7 @@ EditorsPlugin_additionalInfo_affordance=Press 'Tab' from proposal table or click
 EditorsPlugin_internal_error=Internal Error
 
 TextEditorPreferencePage_displayedTabWidth=Displayed &tab width:
+TextEditorPreferencePage_lineSpacing=Line &spacing (extra % of font height):
 TextEditorPreferencePage_enableWordWrap=&Enable word wrap when opening an editor
 TextEditorPreferencePage_convertTabsToSpaces=&Insert spaces for tabs
 TextEditorPreferencePage_undoHistorySize=&Undo history size:
diff --git a/org.eclipse.ui.editors/src/org/eclipse/ui/texteditor/AbstractDecoratedTextEditor.java b/org.eclipse.ui.editors/src/org/eclipse/ui/texteditor/AbstractDecoratedTextEditor.java
index 5394422..b010e8b 100644
--- a/org.eclipse.ui.editors/src/org/eclipse/ui/texteditor/AbstractDecoratedTextEditor.java
+++ b/org.eclipse.ui.editors/src/org/eclipse/ui/texteditor/AbstractDecoratedTextEditor.java
@@ -853,6 +853,16 @@ public abstract class AbstractDecoratedTextEditor extends StatusTextEditor {
 				return;
 			}
 
+			if (AbstractDecoratedTextEditorPreferenceConstants.EDITOR_LINE_SPACING.equals(property)) {
+				IPreferenceStore store= getPreferenceStore();
+				if (store != null) {
+					// translate ratio into height
+					int linespace= getSourceViewerConfiguration().getLineSpacing(sourceViewer);
+					sourceViewer.getTextWidget().setLineSpacing(linespace);
+				}
+				return;
+			}
+
 			if (AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SPACES_FOR_TABS.equals(property)
 					|| AbstractDecoratedTextEditorPreferenceConstants.EDITOR_DELETE_SPACES_AS_TABS.equals(property)) {
 				if (isTabsToSpacesConversionEnabled())
diff --git a/org.eclipse.ui.editors/src/org/eclipse/ui/texteditor/AbstractDecoratedTextEditorPreferenceConstants.java b/org.eclipse.ui.editors/src/org/eclipse/ui/texteditor/AbstractDecoratedTextEditorPreferenceConstants.java
index 572644e..0bb4b33 100644
--- a/org.eclipse.ui.editors/src/org/eclipse/ui/texteditor/AbstractDecoratedTextEditorPreferenceConstants.java
+++ b/org.eclipse.ui.editors/src/org/eclipse/ui/texteditor/AbstractDecoratedTextEditorPreferenceConstants.java
@@ -80,6 +80,17 @@ public class AbstractDecoratedTextEditorPreferenceConstants {
 	 */
 	public final static String EDITOR_TAB_WIDTH= "tabWidth"; //$NON-NLS-1$
 
+	/**
+	 * A named preference that holds the integer percentage ratio for extra line spacing in the text
+	 * editor.
+	 * <p>
+	 * Value is of type <code>int</code>: positive int value specifying the extra spacing between
+	 * lines. e.g. 10 = increase line spae by 1.1 to current font height used in textwidget.
+	 * </p>
+	 * @since 3.15
+	 */
+	public final static String EDITOR_LINE_SPACING= "lineSpacing"; //$NON-NLS-1$
+
 	/**
 	 * A named preference that specifies if the editor uses spaces for tabs.
 	 * <p>
@@ -721,6 +732,8 @@ public class AbstractDecoratedTextEditorPreferenceConstants {
 		store.setDefault(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SPACES_FOR_TABS, false);
 		store.setDefault(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_DELETE_SPACES_AS_TABS, false);
 
+		store.setDefault(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_LINE_SPACING, 0);
+
 		store.setDefault(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_UNDO_HISTORY_SIZE, 200);
 
 		store.setDefault(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_PRINT_MARGIN, false);
diff --git a/org.eclipse.ui.genericeditor.tests/META-INF/MANIFEST.MF b/org.eclipse.ui.genericeditor.tests/META-INF/MANIFEST.MF
index 5c98b0a..5c2cdcd 100644
--- a/org.eclipse.ui.genericeditor.tests/META-INF/MANIFEST.MF
+++ b/org.eclipse.ui.genericeditor.tests/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-Name: %Plugin.name
 Bundle-SymbolicName: org.eclipse.ui.genericeditor.tests;singleton:=true
-Bundle-Version: 1.2.200.qualifier
+Bundle-Version: 1.2.300.qualifier
 Bundle-Vendor: %Plugin.providerName
 Bundle-Localization: plugin
 Export-Package: org.eclipse.ui.genericeditor.tests,
diff --git a/org.eclipse.ui.genericeditor.tests/plugin.xml b/org.eclipse.ui.genericeditor.tests/plugin.xml
index bbd0e8b..0cf5d1d 100644
--- a/org.eclipse.ui.genericeditor.tests/plugin.xml
+++ b/org.eclipse.ui.genericeditor.tests/plugin.xml
@@ -286,4 +286,17 @@
              contentType="org.eclipse.ui.genericeditor.tests.content-type">
        </quickAssistProcessor>
     </extension>
+	<extension
+			point="org.eclipse.ui.genericeditor.textDoubleClickStrategies">
+		<textDoubleClickStrategy
+			class="org.eclipse.ui.genericeditor.tests.contributions.WideDoubleClickStrategy"
+			contentType="org.eclipse.ui.genericeditor.tests.enabled-when-content-type">
+     		<enabledWhen>
+        		<test
+              			forcePluginActivation="true"
+             			property="org.eclipse.ui.genericeditor.tests.contributions.enabled">
+        		</test>
+     		</enabledWhen>
+		</textDoubleClickStrategy>
+	</extension>
 </plugin>
diff --git a/org.eclipse.ui.genericeditor.tests/src/org/eclipse/ui/genericeditor/tests/DoubleClickTest.java b/org.eclipse.ui.genericeditor.tests/src/org/eclipse/ui/genericeditor/tests/DoubleClickTest.java
new file mode 100644
index 0000000..4d8ed17
--- /dev/null
+++ b/org.eclipse.ui.genericeditor.tests/src/org/eclipse/ui/genericeditor/tests/DoubleClickTest.java
@@ -0,0 +1,109 @@
+/*******************************************************************************
+ * Copyright (c) 2022 Avaloq Group AG (http://www.avaloq.com).
+ * 
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *  Andrew Lamb (Avaloq Group AG) - initial implementation
+ *******************************************************************************/
+package org.eclipse.ui.genericeditor.tests;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+
+import org.eclipse.jface.text.tests.util.DisplayHelper;
+
+import org.eclipse.ui.genericeditor.tests.contributions.EnabledPropertyTester;
+
+public class DoubleClickTest extends AbstratGenericEditorTest {
+	private static final String EDITOR_TEXT= "one two three\n" +
+			"four five six\n" +
+			"seven eight nine";
+
+	@Override
+	protected void createAndOpenFile() throws Exception {
+		createAndOpenFile("foo.txt", EDITOR_TEXT);
+	}
+
+	@Test
+	public void testDefaultDoubleClick() throws Exception {
+		checkDoubleClickSelectionForCaretOffset(EDITOR_TEXT.indexOf("five") + 1, "five");
+	}
+
+	@Test
+	public void testEnabledWhenDoubleClick() throws Exception {
+		EnabledPropertyTester.setEnabled(true);
+		createAndOpenFile("enabledWhen.txt", EDITOR_TEXT);
+
+		checkDoubleClickSelectionForCaretOffset(EDITOR_TEXT.indexOf("five") + 1, "four five six");
+
+		EnabledPropertyTester.setEnabled(false);
+	}
+
+	private void checkDoubleClickSelectionForCaretOffset(int pos, String expectedSelection) throws Exception {
+		editor.selectAndReveal(pos, 0);
+		final StyledText editorTextWidget= (StyledText) editor.getAdapter(Control.class);
+		DisplayHelper.driveEventQueue(editorTextWidget.getDisplay());
+		new DisplayHelper() {
+			@Override
+			protected boolean condition() {
+				return editorTextWidget.isFocusControl() && editorTextWidget.getSelection().x == pos;
+			}
+		}.waitForCondition(editorTextWidget.getDisplay(), 3000);
+		editorTextWidget.getShell().forceActive();
+		editorTextWidget.getShell().setActive();
+		editorTextWidget.getShell().setFocus();
+		editorTextWidget.getShell().getDisplay().wake();
+		Rectangle target = editorTextWidget.getCaret().getBounds();
+		doubleClick(editorTextWidget, target.x + 5, target.y + 5);
+		Assert.assertEquals(expectedSelection, editorTextWidget.getSelectionText());
+	}
+	
+	private void doubleClick(StyledText widget, int x, int y) {
+		widget.getDisplay().setCursorLocation(widget.toDisplay(x, y));
+		DisplayHelper.driveEventQueue(widget.getDisplay());
+
+		Event mouseDownEvent= new Event();
+		mouseDownEvent.button = 1;
+		mouseDownEvent.display = widget.getDisplay();
+		mouseDownEvent.doit = true;
+		mouseDownEvent.type = SWT.MouseDown;
+		mouseDownEvent.widget = widget;
+		mouseDownEvent.x = x;
+		mouseDownEvent.y = y;
+
+		Event mouseUpEvent= new Event();
+		mouseUpEvent.button = 1;
+		mouseUpEvent.display = widget.getDisplay();
+		mouseUpEvent.doit = true;
+		mouseUpEvent.type = SWT.MouseUp;
+		mouseUpEvent.widget = widget;
+		mouseUpEvent.x = x;
+		mouseUpEvent.y = y;
+
+		postEvent(widget, mouseDownEvent);
+		postEvent(widget, mouseUpEvent);
+		postEvent(widget, mouseDownEvent);
+		postEvent(widget, mouseUpEvent);
+	}
+	
+	private void postEvent(StyledText widget, Event event) {
+		event.time = (int) System.currentTimeMillis();
+		Listener[] listeners= widget.getListeners(event.type);
+		for (Listener listener : listeners) {
+			listener.handleEvent(event);
+		}
+		DisplayHelper.driveEventQueue(widget.getDisplay());
+	}
+}
diff --git a/org.eclipse.ui.genericeditor.tests/src/org/eclipse/ui/genericeditor/tests/GenericEditorTestSuite.java b/org.eclipse.ui.genericeditor.tests/src/org/eclipse/ui/genericeditor/tests/GenericEditorTestSuite.java
index 1295841..5d23162 100644
--- a/org.eclipse.ui.genericeditor.tests/src/org/eclipse/ui/genericeditor/tests/GenericEditorTestSuite.java
+++ b/org.eclipse.ui.genericeditor.tests/src/org/eclipse/ui/genericeditor/tests/GenericEditorTestSuite.java
@@ -32,7 +32,8 @@ import org.junit.runners.Suite.SuiteClasses;
 		ReconcilerTest.class,
 		HighlightTest.class,
 		IconsTest.class,
-		TestQuickAssist.class
+		TestQuickAssist.class,
+		DoubleClickTest.class
 })
 public class GenericEditorTestSuite {
 	// see @SuiteClasses
diff --git a/org.eclipse.ui.genericeditor.tests/src/org/eclipse/ui/genericeditor/tests/contributions/WideDoubleClickStrategy.java b/org.eclipse.ui.genericeditor.tests/src/org/eclipse/ui/genericeditor/tests/contributions/WideDoubleClickStrategy.java
new file mode 100644
index 0000000..a3a609c
--- /dev/null
+++ b/org.eclipse.ui.genericeditor.tests/src/org/eclipse/ui/genericeditor/tests/contributions/WideDoubleClickStrategy.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2022 Avaloq Group AG (http://www.avaloq.com).
+ * 
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *  Andrew Lamb (Avaloq Group AG) - initial implementation
+ *******************************************************************************/
+package org.eclipse.ui.genericeditor.tests.contributions;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextDoubleClickStrategy;
+import org.eclipse.jface.text.ITextViewer;
+
+public class WideDoubleClickStrategy implements ITextDoubleClickStrategy {
+
+	@Override
+	public void doubleClicked(ITextViewer viewer) {
+		int offset = viewer.getSelectedRange().x;
+		IDocument document = viewer.getDocument();
+		try {
+			IRegion region = document.getLineInformationOfOffset(offset);
+			viewer.setSelectedRange(region.getOffset(), region.getLength());
+		} catch (BadLocationException e) {
+			// do nothing
+		}
+	}
+
+}
diff --git a/org.eclipse.ui.genericeditor/META-INF/MANIFEST.MF b/org.eclipse.ui.genericeditor/META-INF/MANIFEST.MF
index aeaf84d..5c98ba9 100644
--- a/org.eclipse.ui.genericeditor/META-INF/MANIFEST.MF
+++ b/org.eclipse.ui.genericeditor/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-Name: %Bundle-Name
 Bundle-SymbolicName: org.eclipse.ui.genericeditor;singleton:=true
-Bundle-Version: 1.2.300.qualifier
+Bundle-Version: 1.2.400.qualifier
 Bundle-Vendor: %Bundle-Vendor
 Bundle-RequiredExecutionEnvironment: JavaSE-11
 Require-Bundle: org.eclipse.ui.workbench.texteditor;bundle-version="3.10.0",
diff --git a/org.eclipse.ui.genericeditor/plugin.xml b/org.eclipse.ui.genericeditor/plugin.xml
index 9a8755e..0ab8e6a 100644
--- a/org.eclipse.ui.genericeditor/plugin.xml
+++ b/org.eclipse.ui.genericeditor/plugin.xml
@@ -21,6 +21,7 @@
    <extension-point id="contentAssistProcessors" name="%ExtPoint.contentAssistProcessors" schema="schema/contentAssistProcessors.exsd"/>
    <extension-point id="hoverProviders" name="%ExtPoint.hoverProviders" schema="schema/hoverProviders.exsd"/>
    <extension-point id="autoEditStrategies" name="%ExtPoint.autoEditStrategies" schema="schema/autoEditStrategies.exsd"/>
+   <extension-point id="textDoubleClickStrategies" name="%ExtPoint.textDoubleClickStrategies" schema="schema/textDoubleClickStrategies.exsd"/>
    <extension-point id="highlightReconcilers" name="%ExtPoint.highlightReconcilers" schema="schema/highlightReconcilers.exsd"/>
    <extension-point id="foldingReconcilers" name="%ExtPoint.foldingReconcilers" schema="schema/foldingReconcilers.exsd"/>
    <extension-point id="characterPairMatchers" name="%ExtPoint.characterPairMatchers" schema="schema/characterPairMatchers.exsd"/>
diff --git a/org.eclipse.ui.genericeditor/schema/foldingReconcilers.exsd b/org.eclipse.ui.genericeditor/schema/foldingReconcilers.exsd
index 70eb49d..fd6a922 100644
--- a/org.eclipse.ui.genericeditor/schema/foldingReconcilers.exsd
+++ b/org.eclipse.ui.genericeditor/schema/foldingReconcilers.exsd
@@ -79,6 +79,34 @@
       </complexType>
    </element>
 
+   <element name="foldingReconcilingStrategy">
+      <complexType>
+         <sequence>
+            <element ref="enabledWhen" minOccurs="0" maxOccurs="1"/>
+         </sequence>
+         <attribute name="class" type="string" use="required">
+            <annotation>
+               <documentation>
+                  The fully qualified class name implementing the interface &lt;code&gt;org.eclipse.jface.text.reconciler.IReconcilingStrategy&lt;/code&gt;
+               </documentation>
+               <appinfo>
+                  <meta.attribute kind="java" basedOn=":org.eclipse.jface.text.reconciler.IReconcilingStrategy"/>
+               </appinfo>
+            </annotation>
+         </attribute>
+         <attribute name="contentType" type="string" use="required">
+            <annotation>
+               <documentation>
+                  The target content-type for this extension. Content-types are defined as extension to the org.eclipse.core.contenttype.contentTypes extension point.
+               </documentation>
+               <appinfo>
+                  <meta.attribute kind="identifier" basedOn="org.eclipse.core.contenttype.contentTypes/content-type/@id"/>
+               </appinfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
    <element name="enabledWhen">
       <annotation>
          <documentation>
diff --git a/org.eclipse.ui.genericeditor/schema/highlightReconcilers.exsd b/org.eclipse.ui.genericeditor/schema/highlightReconcilers.exsd
index a457bcf..a0c95bc 100644
--- a/org.eclipse.ui.genericeditor/schema/highlightReconcilers.exsd
+++ b/org.eclipse.ui.genericeditor/schema/highlightReconcilers.exsd
@@ -77,6 +77,34 @@
       </complexType>
    </element>
 
+   <element name="highlightReconcilingStrategy">
+      <complexType>
+         <sequence>
+            <element ref="enabledWhen" minOccurs="0" maxOccurs="1"/>
+         </sequence>
+         <attribute name="class" type="string" use="required">
+            <annotation>
+               <documentation>
+                  The fully qualified class name implementing the interface &lt;code&gt;org.eclipse.jface.text.reconciler.IReconcilingStrategy&lt;/code&gt;
+               </documentation>
+               <appinfo>
+                  <meta.attribute kind="java" basedOn=":org.eclipse.jface.text.reconciler.IReconcilingStrategy"/>
+               </appinfo>
+            </annotation>
+         </attribute>
+         <attribute name="contentType" type="string" use="required">
+            <annotation>
+               <documentation>
+                  The target content-type for this extension. Content-types are defined as extension to the org.eclipse.core.contenttype.contentTypes extension point.
+               </documentation>
+               <appinfo>
+                  <meta.attribute kind="identifier" basedOn="org.eclipse.core.contenttype.contentTypes/content-type/@id"/>
+               </appinfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
    <element name="enabledWhen">
       <annotation>
          <documentation>
diff --git a/org.eclipse.ui.genericeditor/schema/reconcilers.exsd b/org.eclipse.ui.genericeditor/schema/textDoubleClickStrategies.exsd
similarity index 85%
rename from org.eclipse.ui.genericeditor/schema/reconcilers.exsd
rename to org.eclipse.ui.genericeditor/schema/textDoubleClickStrategies.exsd
index 508cf6c..d303ccc 100644
--- a/org.eclipse.ui.genericeditor/schema/reconcilers.exsd
+++ b/org.eclipse.ui.genericeditor/schema/textDoubleClickStrategies.exsd
@@ -3,10 +3,10 @@
 <schema targetNamespace="org.eclipse.ui.genericeditor" xmlns="http://www.w3.org/2001/XMLSchema">
 <annotation>
       <appinfo>
-         <meta.schema plugin="org.eclipse.ui.genericeditor" id="reconcilers" name="Reconcilers"/>
+         <meta.schema plugin="org.eclipse.ui.genericeditor" id="textDoubleClickStrategies" name="Text double-click strategies"/>
       </appinfo>
       <documentation>
-         This extension point is used to contribute reconcilers for controlling the presentation on a file with a given content type.
+         This extension point is used to contribute text double-click strategies for a given content type.
       </documentation>
    </annotation>
 
@@ -20,7 +20,7 @@
       </annotation>
       <complexType>
          <sequence minOccurs="1" maxOccurs="unbounded">
-            <element ref="reconciler"/>
+            <element ref="textDoubleClickStrategy"/>
          </sequence>
          <attribute name="point" type="string" use="required">
             <annotation>
@@ -49,7 +49,7 @@
       </complexType>
    </element>
 
-   <element name="reconciler">
+   <element name="textDoubleClickStrategy">
       <complexType>
          <sequence>
             <element ref="enabledWhen" minOccurs="0" maxOccurs="1"/>
@@ -57,10 +57,10 @@
          <attribute name="class" type="string" use="required">
             <annotation>
                <documentation>
-                  The fully qualified class name implementing the interface &lt;code&gt;org.eclipse.jface.text.reconciler.IReconciler&lt;/code&gt;
+                  The fully qualified class name implementing the interface &lt;code&gt;org.eclipse.jface.text.ITextDoubleClickStrategy&lt;/code&gt;
                </documentation>
                <appinfo>
-                  <meta.attribute kind="java" basedOn=":org.eclipse.jface.text.reconciler.IReconciler"/>
+                  <meta.attribute kind="java" basedOn=":org.eclipse.jface.text.ITextDoubleClickStrategy"/>
                </appinfo>
             </annotation>
          </attribute>
@@ -80,7 +80,7 @@
    <element name="enabledWhen">
       <annotation>
          <documentation>
-            A core Expression that controls the enabled of the given reconciler. The viewer, editor, and editor input are registered in the evaluation context as variable:
+            A core Expression that controls the enabled of the given text double-click strategies. The viewer, editor, and editor input are registered in the evaluation context as variable:
 
  * &lt;with variable=&quot;viewer&quot;/&gt; : use it if your expression requires the viewer.
  * &lt;with variable=&quot;document&quot;/&gt; : use it if your expression requires the document.
@@ -112,7 +112,7 @@
          <meta.section type="since"/>
       </appinfo>
       <documentation>
-         1.1
+         1.2
       </documentation>
    </annotation>
 
@@ -121,12 +121,12 @@
          <meta.section type="examples"/>
       </appinfo>
       <documentation>
-         Below is an example of how to use the Reconciler extension point:
+         This is an example of a strategy being registered for a target definition file type:
 
 &lt;pre&gt;
-&lt;extension point=&quot;org.eclipse.ui.genericeditor.reconcilers&quot;&gt;
-   &lt;reconciler
-       class=&quot;org.eclipse.ui.genericeditor.examples.TargetDefinitionReconciler&quot;
+&lt;extension point=&quot;org.eclipse.ui.genericeditor.textDoubleClickStrategies&quot;&gt;
+   &lt;textDoubleClickStrategy
+       class=&quot;org.eclipse.ui.genericeditor.examples.TargetDefinitionTextDoubleClickStrategy&quot;
        contentType=&quot;org.eclipse.pde.targetFile&quot;&gt;
       &lt;enabledWhen&gt;
          &lt;with variable=&quot;editor&quot;&gt;
@@ -134,7 +134,7 @@
             &lt;/test&gt;
          &lt;/with&gt;
       &lt;/enabledWhen&gt;
-   &lt;/reconciler&gt;
+   &lt;/textDoubleClickStrategy&gt;
 &lt;/extension&gt;
 &lt;/pre&gt;
       </documentation>
@@ -147,7 +147,7 @@
          <meta.section type="copyright"/>
       </appinfo>
       <documentation>
-         Copyright (c) 2017 Red Hat Inc. and others
+         Copyright (c) 2022 Avaloq Group AG (http://www.avaloq.com) and others
 
 This program and the accompanying materials are made available under the terms of the Eclipse Public License 2.0 which accompanies this distribution, and is available at &lt;a href=&quot;https://www.eclipse.org/legal/epl-2.0&quot;&gt;https://www.eclipse.org/legal/epl-v20.html&lt;/a&gt;/
 
diff --git a/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/CompositeReconcilerStrategy.java b/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/CompositeReconcilerStrategy.java
index bdd731c..2c50ac3 100644
--- a/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/CompositeReconcilerStrategy.java
+++ b/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/CompositeReconcilerStrategy.java
@@ -18,52 +18,74 @@ import java.util.List;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jface.text.IDocument;
 import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.ITextViewerLifecycle;
 import org.eclipse.jface.text.reconciler.DirtyRegion;
 import org.eclipse.jface.text.reconciler.IReconcilingStrategy;
 import org.eclipse.jface.text.reconciler.IReconcilingStrategyExtension;
 
-public class CompositeReconcilerStrategy implements IReconcilingStrategy, IReconcilingStrategyExtension{
+public class CompositeReconcilerStrategy
+		implements IReconcilingStrategy, IReconcilingStrategyExtension, ITextViewerLifecycle {
 	private List<IReconcilingStrategy> fReconcilingStrategies;
 
 	public CompositeReconcilerStrategy(List<IReconcilingStrategy> strategies) {
 		this.fReconcilingStrategies = strategies;
 	}
+
 	@Override
 	public void setProgressMonitor(IProgressMonitor monitor) {
-		for (IReconcilingStrategy iReconcilingStrategy : fReconcilingStrategies) {
-			if (iReconcilingStrategy instanceof IReconcilingStrategyExtension) {
-				((IReconcilingStrategyExtension) iReconcilingStrategy).setProgressMonitor(monitor);
+		for (IReconcilingStrategy strategy : fReconcilingStrategies) {
+			if (strategy instanceof IReconcilingStrategyExtension) {
+				((IReconcilingStrategyExtension) strategy).setProgressMonitor(monitor);
 			}
 		}
 	}
 
 	@Override
 	public void initialReconcile() {
-		for (IReconcilingStrategy iReconcilingStrategy : fReconcilingStrategies) {
-			if (iReconcilingStrategy instanceof IReconcilingStrategyExtension) {
-				((IReconcilingStrategyExtension) iReconcilingStrategy).initialReconcile();
+		for (IReconcilingStrategy strategy : fReconcilingStrategies) {
+			if (strategy instanceof IReconcilingStrategyExtension) {
+				((IReconcilingStrategyExtension) strategy).initialReconcile();
 			}
 		}
 	}
 
 	@Override
 	public void setDocument(IDocument document) {
-		for (IReconcilingStrategy iReconcilingStrategy : fReconcilingStrategies) {
-			iReconcilingStrategy.setDocument(document);
+		for (IReconcilingStrategy strategy : fReconcilingStrategies) {
+			strategy.setDocument(document);
 		}
 	}
 
 	@Override
 	public void reconcile(DirtyRegion dirtyRegion, IRegion subRegion) {
-		for (IReconcilingStrategy iReconcilingStrategy : fReconcilingStrategies) {
-			iReconcilingStrategy.reconcile(dirtyRegion, subRegion);
+		for (IReconcilingStrategy strategy : fReconcilingStrategies) {
+			strategy.reconcile(dirtyRegion, subRegion);
 		}
 	}
 
 	@Override
 	public void reconcile(IRegion partition) {
-		for (IReconcilingStrategy iReconcilingStrategy : fReconcilingStrategies) {
-			iReconcilingStrategy.reconcile(partition);
+		for (IReconcilingStrategy strategy : fReconcilingStrategies) {
+			strategy.reconcile(partition);
+		}
+	}
+
+	@Override
+	public void install(ITextViewer textViewer) {
+		for (IReconcilingStrategy strategy : fReconcilingStrategies) {
+			if (strategy instanceof ITextViewerLifecycle) {
+				((ITextViewerLifecycle) strategy).install(textViewer);
+			}
+		}
+	}
+
+	@Override
+	public void uninstall() {
+		for (IReconcilingStrategy strategy : fReconcilingStrategies) {
+			if (strategy instanceof ITextViewerLifecycle) {
+				((ITextViewerLifecycle) strategy).uninstall();
+			}
 		}
 	}
 
diff --git a/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/ExtensionBasedTextViewerConfiguration.java b/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/ExtensionBasedTextViewerConfiguration.java
index 2c14aa7..3b9d5b5 100644
--- a/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/ExtensionBasedTextViewerConfiguration.java
+++ b/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/ExtensionBasedTextViewerConfiguration.java
@@ -15,6 +15,7 @@
  *   Simon Scholz <simon.scholz@vogella.com> - Bug 527830
  *   Angelo Zerr <angelo.zerr@gmail.com> - [generic editor] Default Code folding for generic editor should use IndentFoldingStrategy - Bug 520659
  *   Christoph Läubrich - Bug 570459 - [genericeditor] Support ContentAssistProcessors to be registered as OSGi-Services
+ *   Andrew Lamb - Issue #113 - Extension point for ITextDoubleClickStrategy
  *******************************************************************************/
 package org.eclipse.ui.internal.genericeditor;
 
@@ -26,6 +27,7 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.Queue;
 import java.util.Set;
 import java.util.stream.Collectors;
@@ -48,6 +50,7 @@ import org.eclipse.jface.text.IDocumentPartitioningListener;
 import org.eclipse.jface.text.IInformationControl;
 import org.eclipse.jface.text.IInformationControlCreator;
 import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextDoubleClickStrategy;
 import org.eclipse.jface.text.ITextHover;
 import org.eclipse.jface.text.ITextHoverExtension;
 import org.eclipse.jface.text.ITextHoverExtension2;
@@ -65,6 +68,8 @@ import org.eclipse.jface.text.quickassist.IQuickAssistAssistant;
 import org.eclipse.jface.text.quickassist.IQuickAssistProcessor;
 import org.eclipse.jface.text.quickassist.QuickAssistAssistant;
 import org.eclipse.jface.text.reconciler.IReconciler;
+import org.eclipse.jface.text.reconciler.IReconcilingStrategy;
+import org.eclipse.jface.text.reconciler.Reconciler;
 import org.eclipse.jface.text.source.ISourceViewer;
 import org.eclipse.swt.widgets.Shell;
 import org.eclipse.ui.editors.text.TextSourceViewerConfiguration;
@@ -246,24 +251,39 @@ public final class ExtensionBasedTextViewerConfiguration extends TextSourceViewe
 	@Override
 	public IReconciler getReconciler(ISourceViewer sourceViewer) {
 		ReconcilerRegistry registry = GenericEditorPlugin.getDefault().getReconcilerRegistry();
-		List<IReconciler> reconcilers = registry.getReconcilers(sourceViewer, editor,
+		List<IReconcilingStrategy> reconcilingStrategies = new ArrayList<>();
+		List<IReconciler> reconcilers = registry.getReconcilers(sourceViewer, editor, reconcilingStrategies,
 				getContentTypes(sourceViewer.getDocument()));
+
 		// Fill with highlight reconcilers
+		List<IReconcilingStrategy> highlightReconcilingStrategies = new ArrayList<>();
 		List<IReconciler> highlightReconcilers = registry.getHighlightReconcilers(sourceViewer, editor,
-				getContentTypes(sourceViewer.getDocument()));
+				highlightReconcilingStrategies, getContentTypes(sourceViewer.getDocument()));
 		if (!highlightReconcilers.isEmpty()) {
 			reconcilers.addAll(highlightReconcilers);
-		} else {
+		} else if (highlightReconcilingStrategies.isEmpty()) {
 			reconcilers.add(new DefaultWordHighlightReconciler());
 		}
+		reconcilingStrategies.addAll(highlightReconcilingStrategies);
+
 		// Fill with folding reconcilers
+		List<IReconcilingStrategy> foldingReconcilingStrategies = new ArrayList<>();
 		List<IReconciler> foldingReconcilers = registry.getFoldingReconcilers(sourceViewer, editor,
-				getContentTypes(sourceViewer.getDocument()));
+				foldingReconcilingStrategies, getContentTypes(sourceViewer.getDocument()));
 		if (!foldingReconcilers.isEmpty()) {
 			reconcilers.addAll(foldingReconcilers);
-		} else {
+		} else if (foldingReconcilingStrategies.isEmpty()) {
 			reconcilers.add(new DefaultFoldingReconciler());
 		}
+		reconcilingStrategies.addAll(foldingReconcilingStrategies);
+
+		if (!reconcilingStrategies.isEmpty()) {
+			// Create the main Reconciler of the generic editor
+			Reconciler reconciler = new Reconciler();
+			reconciler.setReconcilingStrategy(new CompositeReconcilerStrategy(reconcilingStrategies),
+					IDocument.DEFAULT_CONTENT_TYPE);
+			reconcilers.add(0, reconciler);
+		}
 
 		if (!reconcilers.isEmpty()) {
 			return new CompositeReconciler(reconcilers);
@@ -401,4 +421,16 @@ public final class ExtensionBasedTextViewerConfiguration extends TextSourceViewe
 	public void setFallbackContentTypes(Set<IContentType> contentTypes) {
 		this.fallbackContentTypes = (contentTypes == null ? Set.of() : contentTypes);
 	}
+
+	@Override
+	public ITextDoubleClickStrategy getDoubleClickStrategy(ISourceViewer sourceViewer, String contentType) {
+		TextDoubleClickStrategyRegistry registry = GenericEditorPlugin.getDefault()
+				.getTextDoubleClickStrategyRegistry();
+		Optional<ITextDoubleClickStrategy> doubleClickStrategies = registry.getTextDoubleClickStrategy(sourceViewer,
+				editor, getContentTypes(sourceViewer.getDocument()));
+		if (!doubleClickStrategies.isEmpty()) {
+			return doubleClickStrategies.get();
+		}
+		return super.getDoubleClickStrategy(sourceViewer, contentType);
+	}
 }
diff --git a/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/GenericContentTypeRelatedExtension.java b/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/GenericContentTypeRelatedExtension.java
index 558655a..19baafe 100644
--- a/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/GenericContentTypeRelatedExtension.java
+++ b/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/GenericContentTypeRelatedExtension.java
@@ -53,10 +53,15 @@ public class GenericContentTypeRelatedExtension<T> {
 		this.enabledWhen = buildEnabledWhen(element);
 	}
 
-	@SuppressWarnings("unchecked")
 	public T createDelegate() {
+		T delegateInstance = createDelegateWithoutTypeCheck();
+		return delegateInstance;
+	}
+
+	@SuppressWarnings("unchecked")
+	public <E> E createDelegateWithoutTypeCheck() {
 		try {
-			return (T) extension.createExecutableExtension(CLASS_ATTRIBUTE);
+			return (E) extension.createExecutableExtension(CLASS_ATTRIBUTE);
 		} catch (CoreException e) {
 			GenericEditorPlugin.getDefault().getLog()
 					.log(new Status(IStatus.ERROR, GenericEditorPlugin.BUNDLE_ID, e.getMessage(), e));
@@ -121,4 +126,13 @@ public class GenericContentTypeRelatedExtension<T> {
 			return false;
 		}
 	}
+
+	/**
+	 * Returns the name of the contribution.
+	 * 
+	 * @return the name of the contribution.
+	 */
+	public String getContributionName() {
+		return extension.getName();
+	}
 }
diff --git a/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/GenericEditorPlugin.java b/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/GenericEditorPlugin.java
index a3130c7..6d2dc2a 100644
--- a/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/GenericEditorPlugin.java
+++ b/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/GenericEditorPlugin.java
@@ -11,10 +11,12 @@
  * Contributors:
  *   Sopot Cela, Mickael Istria (Red Hat Inc.) - initial implementation
  *   Lucas Bullen (Red Hat Inc.) - Bug 508829 custom reconciler support
+ *   Andrew Lamb - Issue #113 - Extension point for ITextDoubleClickStrategy
  *******************************************************************************/
 package org.eclipse.ui.internal.genericeditor;
 
 import org.eclipse.jface.text.IAutoEditStrategy;
+import org.eclipse.jface.text.ITextDoubleClickStrategy;
 import org.eclipse.jface.text.ITextHover;
 import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
 import org.eclipse.jface.text.presentation.IPresentationReconciler;
@@ -47,6 +49,7 @@ public class GenericEditorPlugin extends AbstractUIPlugin {
 	private ReconcilerRegistry reconcilierRegistry;
 	private PresentationReconcilerRegistry presentationReconcilierRegistry;
 	private AutoEditStrategyRegistry autoEditStrategyRegistry;
+	private TextDoubleClickStrategyRegistry textDoubleClickStrategyRegistry;
 	private CharacterPairMatcherRegistry characterPairMatcherRegistry;
 	private IconsRegistry editorImagesRegistry;
 
@@ -172,4 +175,15 @@ public class GenericEditorPlugin extends AbstractUIPlugin {
 		}
 		return this.editorImagesRegistry;
 	}
+
+	/**
+	 * @return the registry allowing to access contributed
+	 *         {@link ITextDoubleClickStrategy}s.
+	 */
+	public synchronized TextDoubleClickStrategyRegistry getTextDoubleClickStrategyRegistry() {
+		if (this.textDoubleClickStrategyRegistry == null) {
+			this.textDoubleClickStrategyRegistry = new TextDoubleClickStrategyRegistry();
+		}
+		return this.textDoubleClickStrategyRegistry;
+	}
 }
diff --git a/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/ReconcilerRegistry.java b/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/ReconcilerRegistry.java
index a8e11b9..bdf2446 100644
--- a/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/ReconcilerRegistry.java
+++ b/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/ReconcilerRegistry.java
@@ -13,6 +13,7 @@
  *******************************************************************************/
 package org.eclipse.ui.internal.genericeditor;
 
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -26,6 +27,7 @@ import org.eclipse.core.runtime.Platform;
 import org.eclipse.core.runtime.Status;
 import org.eclipse.core.runtime.content.IContentType;
 import org.eclipse.jface.text.reconciler.IReconciler;
+import org.eclipse.jface.text.reconciler.IReconcilingStrategy;
 import org.eclipse.jface.text.source.ISourceViewer;
 import org.eclipse.ui.texteditor.ITextEditor;
 
@@ -40,8 +42,11 @@ import org.eclipse.ui.texteditor.ITextEditor;
 public class ReconcilerRegistry {
 
 	private static final String EXTENSION_POINT_ID = GenericEditorPlugin.BUNDLE_ID + ".reconcilers"; //$NON-NLS-1$
+	private static final String RECONCILING_STRATEGY_ELT_NAME = "reconcilingStrategy"; //$NON-NLS-1$
 	private static final String HIGHLIGHT_EXTENSION_POINT_ID = GenericEditorPlugin.BUNDLE_ID + ".highlightReconcilers"; //$NON-NLS-1$
+	private static final String HIGHLIGHT_RECONCILING_STRATEGY_ELT_NAME = "highlightReconcilingStrategy"; //$NON-NLS-1$
 	private static final String FOLDING_EXTENSION_POINT_ID = GenericEditorPlugin.BUNDLE_ID + ".foldingReconcilers"; //$NON-NLS-1$
+	private static final String FOLDING_RECONCILING_STRATEGY_ELT_NAME = "foldingReconcilingStrategy"; //$NON-NLS-1$
 
 	private Map<IConfigurationElement, GenericContentTypeRelatedExtension<IReconciler>> extensions = new HashMap<>();
 	private Map<IConfigurationElement, GenericContentTypeRelatedExtension<IReconciler>> highlightExtensions = new HashMap<>();
@@ -65,71 +70,85 @@ public class ReconcilerRegistry {
 	 * Get the contributed {@link IReconciliers}s that are relevant to hook on
 	 * source viewer according to document content types.
 	 *
-	 * @param sourceViewer the source viewer we're hooking completion to.
-	 * @param editor       the text editor
-	 * @param contentTypes the content types of the document we're editing.
+	 * @param sourceViewer         the source viewer we're hooking completion to.
+	 * @param editor               the text editor
+	 * @param textViewerLifecycles the list of text viewer lifecycle to fill
+	 * @param contentTypes         the content types of the document we're editing.
 	 * @return the list of {@link IReconciler} contributed for at least one of the
 	 *         content types, sorted by most generic content type to most specific.
 	 */
 	public List<IReconciler> getReconcilers(ISourceViewer sourceViewer, ITextEditor editor,
-			Set<IContentType> contentTypes) {
+			List<IReconcilingStrategy> reconcilingStrategies, Set<IContentType> contentTypes) {
 		if (this.outOfSync) {
 			sync();
 		}
-		return this.extensions.values().stream() //
-				.filter(ext -> contentTypes.contains(ext.targetContentType)) //
-				.filter(ext -> ext.matches(sourceViewer, editor)) //
-				.sorted(new ContentTypeSpecializationComparator<IReconciler>().reversed()) //
-				.map(GenericContentTypeRelatedExtension<IReconciler>::createDelegate) //
-				.collect(Collectors.toList());
+		return getReconcilers(sourceViewer, editor, reconcilingStrategies, contentTypes, RECONCILING_STRATEGY_ELT_NAME,
+				this.extensions);
 	}
 
 	/**
 	 * Get the contributed highlight {@link IReconciliers}s that are relevant to
 	 * hook on source viewer according to document content types.
 	 *
-	 * @param sourceViewer the source viewer we're hooking completion to.
-	 * @param editor       the text editor
-	 * @param contentTypes the content types of the document we're editing.
+	 * @param sourceViewer         the source viewer we're hooking completion to.
+	 * @param editor               the text editor
+	 * @param textViewerLifecycles the list of text viewer lifecycle to fill
+	 * @param contentTypes         the content types of the document we're editing.
 	 * @return the list of highlight {@link IReconciler}s contributed for at least
 	 *         one of the content types, sorted by most generic content type to most
 	 *         specific.
 	 */
 	public List<IReconciler> getHighlightReconcilers(ISourceViewer sourceViewer, ITextEditor editor,
-			Set<IContentType> contentTypes) {
+			List<IReconcilingStrategy> reconcilingStrategies, Set<IContentType> contentTypes) {
 		if (this.highlightOutOfSync) {
 			syncHighlight();
 		}
-		return this.highlightExtensions.values().stream() //
-				.filter(ext -> contentTypes.contains(ext.targetContentType)) //
-				.filter(ext -> ext.matches(sourceViewer, editor)) //
-				.sorted(new ContentTypeSpecializationComparator<IReconciler>().reversed()) //
-				.map(GenericContentTypeRelatedExtension<IReconciler>::createDelegate) //
-				.collect(Collectors.toList());
+		return getReconcilers(sourceViewer, editor, reconcilingStrategies, contentTypes,
+				HIGHLIGHT_RECONCILING_STRATEGY_ELT_NAME, this.highlightExtensions);
 	}
 
 	/**
 	 * Get the contributed folding {@link IReconciliers}s that are relevant to hook
 	 * on source viewer according to document content types.
 	 *
-	 * @param sourceViewer the source viewer we're hooking completion to.
-	 * @param editor       the text editor
-	 * @param contentTypes the content types of the document we're editing.
+	 * @param sourceViewer         the source viewer we're hooking completion to.
+	 * @param editor               the text editor
+	 * @param textViewerLifecycles the list of text viewer lifecycle to fill
+	 * @param contentTypes         the content types of the document we're editing.
 	 * @return the list of folding {@link IReconciler}s contributed for at least one
 	 *         of the content types, sorted by most generic content type to most
 	 *         specific.
 	 */
 	public List<IReconciler> getFoldingReconcilers(ISourceViewer sourceViewer, ITextEditor editor,
-			Set<IContentType> contentTypes) {
+			List<IReconcilingStrategy> reconcilingStrategies, Set<IContentType> contentTypes) {
 		if (this.foldingOutOfSync) {
 			syncFolding();
 		}
-		return this.foldingExtensions.values().stream() //
+		return getReconcilers(sourceViewer, editor, reconcilingStrategies, contentTypes,
+				FOLDING_RECONCILING_STRATEGY_ELT_NAME, this.foldingExtensions);
+	}
+
+	private static List<IReconciler> getReconcilers(ISourceViewer sourceViewer, ITextEditor editor,
+			List<IReconcilingStrategy> reconcilingStrategies, Set<IContentType> contentTypes, String contributionName,
+			Map<IConfigurationElement, GenericContentTypeRelatedExtension<IReconciler>> extensionsMap) {
+		List<IReconciler> reconcilers = new ArrayList<>();
+		List<GenericContentTypeRelatedExtension<IReconciler>> extensions = extensionsMap.values().stream() //
 				.filter(ext -> contentTypes.contains(ext.targetContentType)) //
 				.filter(ext -> ext.matches(sourceViewer, editor)) //
 				.sorted(new ContentTypeSpecializationComparator<IReconciler>().reversed()) //
-				.map(GenericContentTypeRelatedExtension<IReconciler>::createDelegate) //
 				.collect(Collectors.toList());
+		for (GenericContentTypeRelatedExtension<IReconciler> ext : extensions) {
+			if (contributionName.equals(ext.getContributionName())) {
+				IReconcilingStrategy reconcilingStrategy = ext.createDelegateWithoutTypeCheck();
+				reconcilingStrategies.add(reconcilingStrategy);
+			} else {
+				IReconciler reconciler = ext.createDelegate();
+				if (reconciler != null) {
+					reconcilers.add(reconciler);
+				}
+			}
+		}
+		return reconcilers;
 	}
 
 	private void sync() {
diff --git a/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/TextDoubleClickStrategyRegistry.java b/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/TextDoubleClickStrategyRegistry.java
new file mode 100644
index 0000000..a409a78
--- /dev/null
+++ b/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/TextDoubleClickStrategyRegistry.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * Copyright (c) 2022 Avaloq Group AG (http://www.avaloq.com).
+ * 
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *  Andrew Lamb (Avaloq Group AG) - initial implementation
+ *******************************************************************************/
+package org.eclipse.ui.internal.genericeditor;
+
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.content.IContentType;
+import org.eclipse.jface.text.ITextDoubleClickStrategy;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.ui.texteditor.ITextEditor;
+
+public class TextDoubleClickStrategyRegistry {
+
+	private static final String EXTENSION_POINT_ID = GenericEditorPlugin.BUNDLE_ID + ".textDoubleClickStrategies"; //$NON-NLS-1$
+
+	private Map<IConfigurationElement, GenericContentTypeRelatedExtension<ITextDoubleClickStrategy>> extensions = new LinkedHashMap<>();
+	private boolean outOfSync = true;
+
+	/**
+	 * Creates the registry and binds it to the extension point.
+	 */
+	public TextDoubleClickStrategyRegistry() {
+		Platform.getExtensionRegistry().addRegistryChangeListener(event -> outOfSync = true, EXTENSION_POINT_ID);
+	}
+
+	/**
+	 * Get the contributed {@link ITextDoubleClickStrategy}s that are relevant to
+	 * hook on source viewer according to document content types.
+	 *
+	 * @param sourceViewer the source viewer we're hooking completion to.
+	 * @param editor       the text editor
+	 * @param contentTypes the content types of the document we're editing.
+	 * @return the list of {@link ITextDoubleClickStrategy} contributed for at least
+	 *         one of the content types.
+	 */
+	public Optional<ITextDoubleClickStrategy> getTextDoubleClickStrategy(ISourceViewer sourceViewer, ITextEditor editor,
+			Set<IContentType> contentTypes) {
+		if (this.outOfSync) {
+			sync();
+		}
+		return this.extensions.values().stream().filter(ext -> contentTypes.contains(ext.targetContentType))
+				.filter(ext -> ext.matches(sourceViewer, editor))
+				.sorted(new ContentTypeSpecializationComparator<ITextDoubleClickStrategy>()).findFirst()
+				.map(GenericContentTypeRelatedExtension<ITextDoubleClickStrategy>::createDelegate);
+	}
+
+	private void sync() {
+		Set<IConfigurationElement> toRemoveExtensions = new HashSet<>(this.extensions.keySet());
+		for (IConfigurationElement extension : Platform.getExtensionRegistry()
+				.getConfigurationElementsFor(EXTENSION_POINT_ID)) {
+			toRemoveExtensions.remove(extension);
+			if (!this.extensions.containsKey(extension)) {
+				try {
+					this.extensions.put(extension,
+							new GenericContentTypeRelatedExtension<ITextDoubleClickStrategy>(extension));
+				} catch (Exception ex) {
+					GenericEditorPlugin.getDefault().getLog()
+							.log(new Status(IStatus.ERROR, GenericEditorPlugin.BUNDLE_ID, ex.getMessage(), ex));
+				}
+			}
+		}
+		for (IConfigurationElement toRemove : toRemoveExtensions) {
+			this.extensions.remove(toRemove);
+		}
+		this.outOfSync = false;
+	}
+}
diff --git a/org.eclipse.ui.workbench.texteditor/META-INF/MANIFEST.MF b/org.eclipse.ui.workbench.texteditor/META-INF/MANIFEST.MF
index 6db22b9..e64d499 100644
--- a/org.eclipse.ui.workbench.texteditor/META-INF/MANIFEST.MF
+++ b/org.eclipse.ui.workbench.texteditor/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.ui.workbench.texteditor; singleton:=true
-Bundle-Version: 3.16.600.qualifier
+Bundle-Version: 3.16.700.qualifier
 Bundle-Activator: org.eclipse.ui.internal.texteditor.TextEditorPlugin
 Bundle-ActivationPolicy: lazy
 Bundle-Vendor: %providerName
diff --git a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/AbstractTextEditor.java b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/AbstractTextEditor.java
index 878a579..a9fd423 100644
--- a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/AbstractTextEditor.java
+++ b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/AbstractTextEditor.java
@@ -739,12 +739,14 @@ public abstract class AbstractTextEditor extends EditorPart implements ITextEdit
 				Font blockFont= JFaceResources.getFont(BLOCK_SELECTION_MODE_FONT);
 				setFont(fSourceViewer, blockFont);
 				disposeFont();
+				updateLineSpacing();
 				updateCaret();
 				return;
 			}
 			if (getFontPropertyPreferenceKey().equals(property) && !isBlockSelectionModeEnabled()) {
 				initializeViewerFont(fSourceViewer);
 				updateCaret();
+				updateLineSpacing();
 				return;
 			}
 		}
@@ -6175,6 +6177,10 @@ public abstract class AbstractTextEditor extends EditorPart implements ITextEdit
 		if (ITextViewer.class.equals(required))
 			return (fSourceViewer == null ? null : (T) fSourceViewer);
 
+		if (IPreferenceStore.class.equals(required)) {
+			return (T) getPreferenceStore();
+		}
+
 		return super.getAdapter(required);
 	}
 
@@ -6544,6 +6550,12 @@ public abstract class AbstractTextEditor extends EditorPart implements ITextEdit
 		return SINGLE_CARET_WIDTH;
 	}
 
+	private void updateLineSpacing() {
+		// Adjust Line space if font property changed
+		int linespace = getSourceViewerConfiguration().getLineSpacing(fSourceViewer);
+		fSourceViewer.getTextWidget().setLineSpacing(linespace);
+	}
+
 	private void updateCaret() {
 		if (fSourceViewer == null || fSourceViewer.getTextWidget() == null) {
 			return;
diff --git a/pom.xml b/pom.xml
index 1634f9c..d730f73 100644
--- a/pom.xml
+++ b/pom.xml
@@ -15,7 +15,7 @@
   <parent>
     <groupId>org.eclipse</groupId>
     <artifactId>eclipse-platform-parent</artifactId>
-    <version>4.26.0-SNAPSHOT</version>
+    <version>4.27.0-SNAPSHOT</version>
     <relativePath>../eclipse-platform-parent</relativePath>
   </parent>
 

Debdiff

[The following lists of changes regard files as different if they have different names, permissions or owners.]

Files in second set of .debs but not in first

-rw-r--r--  root/root   /usr/share/java/eclipse-jface-text-3.23.0.jar
-rw-r--r--  root/root   /usr/share/java/eclipse-ui-editors-3.15.0.jar
-rw-r--r--  root/root   /usr/share/java/eclipse-ui-genericeditor-1.2.400.jar
-rw-r--r--  root/root   /usr/share/java/eclipse-ui-workbench-texteditor-3.16.700.jar
-rw-r--r--  root/root   /usr/share/maven-repo/org/eclipse/jface/org.eclipse.jface.text/3.23.0/org.eclipse.jface.text-3.23.0.pom
-rw-r--r--  root/root   /usr/share/maven-repo/org/eclipse/ui/org.eclipse.ui.editors/3.15.0/org.eclipse.ui.editors-3.15.0.pom
-rw-r--r--  root/root   /usr/share/maven-repo/org/eclipse/ui/org.eclipse.ui.genericeditor/1.2.400/org.eclipse.ui.genericeditor-1.2.400.pom
-rw-r--r--  root/root   /usr/share/maven-repo/org/eclipse/ui/org.eclipse.ui.workbench.texteditor/3.16.700/org.eclipse.ui.workbench.texteditor-3.16.700.pom
lrwxrwxrwx  root/root   /usr/lib/eclipse/plugins/org.eclipse.jface.text_3.23.0.jar -> ../../../share/java/eclipse-jface-text.jar
lrwxrwxrwx  root/root   /usr/lib/eclipse/plugins/org.eclipse.ui.editors_3.15.0.jar -> ../../../share/java/eclipse-ui-editors.jar
lrwxrwxrwx  root/root   /usr/lib/eclipse/plugins/org.eclipse.ui.genericeditor_1.2.400.jar -> ../../../share/java/eclipse-ui-genericeditor.jar
lrwxrwxrwx  root/root   /usr/lib/eclipse/plugins/org.eclipse.ui.workbench.texteditor_3.16.700.jar -> ../../../share/java/eclipse-ui-workbench-texteditor.jar
lrwxrwxrwx  root/root   /usr/share/java/eclipse-jface-text.jar -> eclipse-jface-text-3.23.0.jar
lrwxrwxrwx  root/root   /usr/share/java/eclipse-ui-editors.jar -> eclipse-ui-editors-3.15.0.jar
lrwxrwxrwx  root/root   /usr/share/java/eclipse-ui-genericeditor.jar -> eclipse-ui-genericeditor-1.2.400.jar
lrwxrwxrwx  root/root   /usr/share/java/eclipse-ui-workbench-texteditor.jar -> eclipse-ui-workbench-texteditor-3.16.700.jar
lrwxrwxrwx  root/root   /usr/share/maven-repo/org/eclipse/jface/org.eclipse.jface.text/3.23.0/org.eclipse.jface.text-3.23.0.jar -> ../../../../../../java/eclipse-jface-text-3.23.0.jar
lrwxrwxrwx  root/root   /usr/share/maven-repo/org/eclipse/jface/org.eclipse.jface.text/debian/org.eclipse.jface.text-debian.jar -> ../../../../../../java/eclipse-jface-text-3.23.0.jar
lrwxrwxrwx  root/root   /usr/share/maven-repo/org/eclipse/ui/org.eclipse.ui.editors/3.15.0/org.eclipse.ui.editors-3.15.0.jar -> ../../../../../../java/eclipse-ui-editors-3.15.0.jar
lrwxrwxrwx  root/root   /usr/share/maven-repo/org/eclipse/ui/org.eclipse.ui.editors/debian/org.eclipse.ui.editors-debian.jar -> ../../../../../../java/eclipse-ui-editors-3.15.0.jar
lrwxrwxrwx  root/root   /usr/share/maven-repo/org/eclipse/ui/org.eclipse.ui.genericeditor/1.2.400/org.eclipse.ui.genericeditor-1.2.400.jar -> ../../../../../../java/eclipse-ui-genericeditor-1.2.400.jar
lrwxrwxrwx  root/root   /usr/share/maven-repo/org/eclipse/ui/org.eclipse.ui.genericeditor/debian/org.eclipse.ui.genericeditor-debian.jar -> ../../../../../../java/eclipse-ui-genericeditor-1.2.400.jar
lrwxrwxrwx  root/root   /usr/share/maven-repo/org/eclipse/ui/org.eclipse.ui.workbench.texteditor/3.16.700/org.eclipse.ui.workbench.texteditor-3.16.700.jar -> ../../../../../../java/eclipse-ui-workbench-texteditor-3.16.700.jar
lrwxrwxrwx  root/root   /usr/share/maven-repo/org/eclipse/ui/org.eclipse.ui.workbench.texteditor/debian/org.eclipse.ui.workbench.texteditor-debian.jar -> ../../../../../../java/eclipse-ui-workbench-texteditor-3.16.700.jar

Files in first set of .debs but not in second

-rw-r--r--  root/root   /usr/share/java/eclipse-jface-text-3.22.0.jar
-rw-r--r--  root/root   /usr/share/java/eclipse-ui-editors-3.14.400.jar
-rw-r--r--  root/root   /usr/share/java/eclipse-ui-genericeditor-1.2.300.jar
-rw-r--r--  root/root   /usr/share/java/eclipse-ui-workbench-texteditor-3.16.600.jar
-rw-r--r--  root/root   /usr/share/maven-repo/org/eclipse/jface/org.eclipse.jface.text/3.22.0/org.eclipse.jface.text-3.22.0.pom
-rw-r--r--  root/root   /usr/share/maven-repo/org/eclipse/ui/org.eclipse.ui.editors/3.14.400/org.eclipse.ui.editors-3.14.400.pom
-rw-r--r--  root/root   /usr/share/maven-repo/org/eclipse/ui/org.eclipse.ui.genericeditor/1.2.300/org.eclipse.ui.genericeditor-1.2.300.pom
-rw-r--r--  root/root   /usr/share/maven-repo/org/eclipse/ui/org.eclipse.ui.workbench.texteditor/3.16.600/org.eclipse.ui.workbench.texteditor-3.16.600.pom
lrwxrwxrwx  root/root   /usr/lib/eclipse/plugins/org.eclipse.jface.text_3.22.0.jar -> ../../../share/java/eclipse-jface-text.jar
lrwxrwxrwx  root/root   /usr/lib/eclipse/plugins/org.eclipse.ui.editors_3.14.400.jar -> ../../../share/java/eclipse-ui-editors.jar
lrwxrwxrwx  root/root   /usr/lib/eclipse/plugins/org.eclipse.ui.genericeditor_1.2.300.jar -> ../../../share/java/eclipse-ui-genericeditor.jar
lrwxrwxrwx  root/root   /usr/lib/eclipse/plugins/org.eclipse.ui.workbench.texteditor_3.16.600.jar -> ../../../share/java/eclipse-ui-workbench-texteditor.jar
lrwxrwxrwx  root/root   /usr/share/java/eclipse-jface-text.jar -> eclipse-jface-text-3.22.0.jar
lrwxrwxrwx  root/root   /usr/share/java/eclipse-ui-editors.jar -> eclipse-ui-editors-3.14.400.jar
lrwxrwxrwx  root/root   /usr/share/java/eclipse-ui-genericeditor.jar -> eclipse-ui-genericeditor-1.2.300.jar
lrwxrwxrwx  root/root   /usr/share/java/eclipse-ui-workbench-texteditor.jar -> eclipse-ui-workbench-texteditor-3.16.600.jar
lrwxrwxrwx  root/root   /usr/share/maven-repo/org/eclipse/jface/org.eclipse.jface.text/3.22.0/org.eclipse.jface.text-3.22.0.jar -> ../../../../../../java/eclipse-jface-text-3.22.0.jar
lrwxrwxrwx  root/root   /usr/share/maven-repo/org/eclipse/jface/org.eclipse.jface.text/debian/org.eclipse.jface.text-debian.jar -> ../../../../../../java/eclipse-jface-text-3.22.0.jar
lrwxrwxrwx  root/root   /usr/share/maven-repo/org/eclipse/ui/org.eclipse.ui.editors/3.14.400/org.eclipse.ui.editors-3.14.400.jar -> ../../../../../../java/eclipse-ui-editors-3.14.400.jar
lrwxrwxrwx  root/root   /usr/share/maven-repo/org/eclipse/ui/org.eclipse.ui.editors/debian/org.eclipse.ui.editors-debian.jar -> ../../../../../../java/eclipse-ui-editors-3.14.400.jar
lrwxrwxrwx  root/root   /usr/share/maven-repo/org/eclipse/ui/org.eclipse.ui.genericeditor/1.2.300/org.eclipse.ui.genericeditor-1.2.300.jar -> ../../../../../../java/eclipse-ui-genericeditor-1.2.300.jar
lrwxrwxrwx  root/root   /usr/share/maven-repo/org/eclipse/ui/org.eclipse.ui.genericeditor/debian/org.eclipse.ui.genericeditor-debian.jar -> ../../../../../../java/eclipse-ui-genericeditor-1.2.300.jar
lrwxrwxrwx  root/root   /usr/share/maven-repo/org/eclipse/ui/org.eclipse.ui.workbench.texteditor/3.16.600/org.eclipse.ui.workbench.texteditor-3.16.600.jar -> ../../../../../../java/eclipse-ui-workbench-texteditor-3.16.600.jar
lrwxrwxrwx  root/root   /usr/share/maven-repo/org/eclipse/ui/org.eclipse.ui.workbench.texteditor/debian/org.eclipse.ui.workbench.texteditor-debian.jar -> ../../../../../../java/eclipse-ui-workbench-texteditor-3.16.600.jar

Control files of package libeclipse-core-filebuffers-java: lines which differ (wdiff format)

  • Source: eclipse-platform-text (4.26-1~jan+unchanged1) (200502080800+git20230109.1.8c09461+ds-1~jan+nus1)

Control files of package libeclipse-jface-text-java: lines which differ (wdiff format)

  • Source: eclipse-platform-text (4.26-1~jan+unchanged1) (200502080800+git20230109.1.8c09461+ds-1~jan+nus1)

Control files of package libeclipse-search-java: lines which differ (wdiff format)

  • Source: eclipse-platform-text (4.26-1~jan+unchanged1) (200502080800+git20230109.1.8c09461+ds-1~jan+nus1)

Control files of package libeclipse-text-java: lines which differ (wdiff format)

  • Source: eclipse-platform-text (4.26-1~jan+unchanged1) (200502080800+git20230109.1.8c09461+ds-1~jan+nus1)

Control files of package libeclipse-ui-editors-java: lines which differ (wdiff format)

  • Source: eclipse-platform-text (4.26-1~jan+unchanged1) (200502080800+git20230109.1.8c09461+ds-1~jan+nus1)

Control files of package libeclipse-ui-genericeditor-java: lines which differ (wdiff format)

  • Source: eclipse-platform-text (4.26-1~jan+unchanged1) (200502080800+git20230109.1.8c09461+ds-1~jan+nus1)

Control files of package libeclipse-ui-workbench-texteditor-java: lines which differ (wdiff format)

  • Source: eclipse-platform-text (4.26-1~jan+unchanged1) (200502080800+git20230109.1.8c09461+ds-1~jan+nus1)

More details

Full run details