From c40615d48f10a760873dd7857883fac588438d39 Mon Sep 17 00:00:00 2001
From: Mickael Istria
Date: Fri, 8 Sep 2017 06:04:32 -0400
Subject: Revert "Bug 513321 - Aggregate mutliple hover sources"
This reverts commit 55c3acdef4f74ecddae3e3f6c89fdb691c2c64ad.
Change-Id: I543b5b6f4b129ec46a21f06c3045a6804f215356
---
.../jface/text/AbstractInformationControl.java | 2 +-
.../jface/text/source/LineNumberRulerColumn.java | 2 +-
org.eclipse.ui.genericeditor.tests/plugin.xml | 22 ++-
.../tests/AbstratGenericEditorTest.java | 41 +-----
.../eclipse/ui/genericeditor/tests/HoverTest.java | 39 +-----
.../tests/contributions/AlrightyHoverProvider.java | 39 ------
.../tests/contributions/HelloHoverProvider.java | 38 -----
.../tests/contributions/MagicHoverProvider.java | 39 ++++++
.../internal/genericeditor/CompositeTextHover.java | 90 ++++++++++++
.../ExtensionBasedTextViewerConfiguration.java | 11 +-
.../genericeditor/GenericEditorPlugin.java | 1 -
.../genericeditor/OrderedExtensionComparator.java | 91 ++++++++++++
.../internal/genericeditor/TextHoverRegistry.java | 135 ++++++++++++++++++
.../hover/CompositeInformationControl.java | 156 ---------------------
.../hover/CompositeInformationControlCreator.java | 120 ----------------
.../genericeditor/hover/CompositeTextHover.java | 113 ---------------
.../hover/OrderedExtensionComparator.java | 91 ------------
.../genericeditor/hover/TextHoverRegistry.java | 133 ------------------
.../markers/MarkerHoverControlCreator.java | 16 +--
.../markers/MarkerInformationControl.java | 20 +--
20 files changed, 395 insertions(+), 804 deletions(-)
delete mode 100644 org.eclipse.ui.genericeditor.tests/src/org/eclipse/ui/genericeditor/tests/contributions/AlrightyHoverProvider.java
delete mode 100644 org.eclipse.ui.genericeditor.tests/src/org/eclipse/ui/genericeditor/tests/contributions/HelloHoverProvider.java
create mode 100644 org.eclipse.ui.genericeditor.tests/src/org/eclipse/ui/genericeditor/tests/contributions/MagicHoverProvider.java
create mode 100644 org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/CompositeTextHover.java
create mode 100644 org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/OrderedExtensionComparator.java
create mode 100644 org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/TextHoverRegistry.java
delete mode 100644 org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/hover/CompositeInformationControl.java
delete mode 100644 org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/hover/CompositeInformationControlCreator.java
delete mode 100644 org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/hover/CompositeTextHover.java
delete mode 100644 org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/hover/OrderedExtensionComparator.java
delete mode 100644 org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/hover/TextHoverRegistry.java
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/AbstractInformationControl.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/AbstractInformationControl.java
index 41195aac689..374ad6108f5 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/AbstractInformationControl.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/AbstractInformationControl.java
@@ -435,7 +435,7 @@ public abstract class AbstractInformationControl implements IInformationControl,
*
* @return the shell used for the popup window
*/
- public final Shell getShell() {
+ protected final Shell getShell() {
return fShell;
}
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/source/LineNumberRulerColumn.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/source/LineNumberRulerColumn.java
index ff4cf215e9e..81002167fee 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/source/LineNumberRulerColumn.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/source/LineNumberRulerColumn.java
@@ -762,7 +762,7 @@ public class LineNumberRulerColumn implements IVerticalRulerColumn {
fZoom= 100;
}
- ImageData imageData= gcImage.getImageData();
+ ImageData imageData= gcImage.getImageData(100);
gcImage.dispose();
return imageData;
});
diff --git a/org.eclipse.ui.genericeditor.tests/plugin.xml b/org.eclipse.ui.genericeditor.tests/plugin.xml
index c7ce8e9b8de..d2c3f4580ae 100644
--- a/org.eclipse.ui.genericeditor.tests/plugin.xml
+++ b/org.eclipse.ui.genericeditor.tests/plugin.xml
@@ -26,13 +26,9 @@
-
-
@@ -40,11 +36,11 @@
class="org.eclipse.ui.genericeditor.tests.contributions.TheReconcilerFirst"
contentType="org.eclipse.core.runtime.text">
-
-
-
+
+
+
diff --git a/org.eclipse.ui.genericeditor.tests/src/org/eclipse/ui/genericeditor/tests/AbstratGenericEditorTest.java b/org.eclipse.ui.genericeditor.tests/src/org/eclipse/ui/genericeditor/tests/AbstratGenericEditorTest.java
index 2d31f0ad00e..6d12a6f548a 100644
--- a/org.eclipse.ui.genericeditor.tests/src/org/eclipse/ui/genericeditor/tests/AbstratGenericEditorTest.java
+++ b/org.eclipse.ui.genericeditor.tests/src/org/eclipse/ui/genericeditor/tests/AbstratGenericEditorTest.java
@@ -17,8 +17,6 @@ import org.junit.Before;
import org.eclipse.swt.widgets.Display;
-import org.eclipse.core.runtime.NullProgressMonitor;
-
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
@@ -49,42 +47,17 @@ public class AbstratGenericEditorTest {
project = ResourcesPlugin.getWorkspace().getRoot().getProject(getClass().getName() + System.currentTimeMillis());
project.create(null);
project.open(null);
- createAndOpenFile("foo.txt", "bar 'bar'");
- }
-
- /**
- * Creates a new file in the project, opens it, and associate that file with the test state
- * @param name name of the file in the project
- * @param contents content of the file
- * @throws Exception ex
- * @since 1.1
- */
- protected void createAndOpenFile(String name, String contents) throws Exception {
- this.file = project.getFile(name);
- this.file.create(new ByteArrayInputStream(contents.getBytes()), true, null);
- this.editor = (ExtensionBasedTextEditor) PlatformUI.getWorkbench().getActiveWorkbenchWindow()
+ file = project.getFile("foo.txt");
+ file.create(new ByteArrayInputStream("bar 'bar'".getBytes()), true, null);
+ editor = (ExtensionBasedTextEditor) PlatformUI.getWorkbench().getActiveWorkbenchWindow()
.getActivePage().openEditor(new FileEditorInput(this.file), "org.eclipse.ui.genericeditor.GenericEditor");
- }
-
- /**
- * Closes editor and delete file. Keeps project open.
- * @throws Exception ex
- * @since 1.1
- */
- protected void cleanFileAndEditor() throws Exception {
- if (editor != null) {
- editor.close(false);
- editor = null;
- }
- if (file != null) {
- file.delete(true, new NullProgressMonitor());
- file = null;
- }
- }
+ }
@After
public void tearDown() throws Exception {
- cleanFileAndEditor();
+ if (file != null) {
+ file.delete(true, null);
+ }
if (project != null) {
project.delete(true, null);
}
diff --git a/org.eclipse.ui.genericeditor.tests/src/org/eclipse/ui/genericeditor/tests/HoverTest.java b/org.eclipse.ui.genericeditor.tests/src/org/eclipse/ui/genericeditor/tests/HoverTest.java
index e234e340a9b..a92fea66910 100644
--- a/org.eclipse.ui.genericeditor.tests/src/org/eclipse/ui/genericeditor/tests/HoverTest.java
+++ b/org.eclipse.ui.genericeditor.tests/src/org/eclipse/ui/genericeditor/tests/HoverTest.java
@@ -10,14 +10,13 @@
*******************************************************************************/
package org.eclipse.ui.genericeditor.tests;
+import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.Collections;
-import java.util.Map;
import org.junit.Assume;
import org.junit.Before;
@@ -47,8 +46,7 @@ import org.eclipse.jface.text.ITextViewer;
import org.eclipse.jface.text.TextViewer;
import org.eclipse.jface.text.tests.util.DisplayHelper;
-import org.eclipse.ui.genericeditor.tests.contributions.AlrightyHoverProvider;
-import org.eclipse.ui.genericeditor.tests.contributions.HelloHoverProvider;
+import org.eclipse.ui.genericeditor.tests.contributions.MagicHoverProvider;
import org.eclipse.ui.genericeditor.tests.contributions.MarkerResolutionGenerator;
import org.eclipse.ui.workbench.texteditor.tests.ScreenshotTest;
@@ -69,23 +67,9 @@ public class HoverTest extends AbstratGenericEditorTest {
}
@Test
- public void testSingleHover() throws Exception {
+ public void testHover() throws Exception {
Shell shell = getHoverShell(triggerCompletionAndRetrieveInformationControlManager());
- assertNotNull(findControl(shell, StyledText.class, AlrightyHoverProvider.LABEL));
- assertNull(findControl(shell, StyledText.class, HelloHoverProvider.LABEL));
- }
-
- /**
- * @throws Exception ex
- * @since 1.1
- */
- @Test
- public void testMultipleHover() throws Exception {
- cleanFileAndEditor();
- createAndOpenFile("bar.txt", "Hi");
- Shell shell = getHoverShell(triggerCompletionAndRetrieveInformationControlManager());
- assertNotNull(findControl(shell, StyledText.class, AlrightyHoverProvider.LABEL));
- assertNotNull(findControl(shell, StyledText.class, HelloHoverProvider.LABEL));
+ assertNotNull(findControl(shell, StyledText.class, MagicHoverProvider.LABEL));
}
@Test
@@ -101,17 +85,10 @@ public class HoverTest extends AbstratGenericEditorTest {
marker.setAttribute(IMarker.MESSAGE, problemMessage);
marker.setAttribute(MarkerResolutionGenerator.FIXME, true);
AbstractInformationControlManager manager = triggerCompletionAndRetrieveInformationControlManager();
- Object hoverData = getHoverData(manager);
- assertTrue(hoverData instanceof Map);
- assertTrue(((Map,?>)hoverData).containsValue(Collections.singletonList(marker)));
- assertTrue(((Map,?>)hoverData).containsValue(AlrightyHoverProvider.LABEL));
- assertFalse(((Map,?>)hoverData).containsValue(HelloHoverProvider.LABEL));
+ assertEquals(Collections.singletonList(marker), getHoverData(manager));
// check dialog content
Shell shell= getHoverShell(manager);
assertNotNull(findControl(shell, Label.class, marker.getAttribute(IMarker.MESSAGE, "NONE")));
- assertNotNull(findControl(shell, StyledText.class, AlrightyHoverProvider.LABEL));
- assertNull(findControl(shell, StyledText.class, HelloHoverProvider.LABEL));
- // check quick-fix works
Link link = findControl(shell, Link.class, MarkerResolutionGenerator.FIXME);
assertNotNull(link);
Event event = new Event();
@@ -149,12 +126,6 @@ public class HoverTest extends AbstratGenericEditorTest {
fail();
}
Shell shell = (Shell)new Accessor(control[0], AbstractInformationControl.class).get("fShell");
- new DisplayHelper() {
- @Override
- protected boolean condition() {
- return shell.isVisible();
- }
- }.waitForCondition(this.editor.getSite().getShell().getDisplay(), 2000);
assertTrue(shell.isVisible());
return shell;
}
diff --git a/org.eclipse.ui.genericeditor.tests/src/org/eclipse/ui/genericeditor/tests/contributions/AlrightyHoverProvider.java b/org.eclipse.ui.genericeditor.tests/src/org/eclipse/ui/genericeditor/tests/contributions/AlrightyHoverProvider.java
deleted file mode 100644
index 726036e6dc4..00000000000
--- a/org.eclipse.ui.genericeditor.tests/src/org/eclipse/ui/genericeditor/tests/contributions/AlrightyHoverProvider.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2016 Red Hat Inc. 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:
- * Mickael Istria (Red Hat Inc.)
- *******************************************************************************/
-package org.eclipse.ui.genericeditor.tests.contributions;
-
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.ITextHover;
-import org.eclipse.jface.text.ITextHoverExtension2;
-import org.eclipse.jface.text.ITextViewer;
-import org.eclipse.jface.text.Region;
-
-public class AlrightyHoverProvider implements ITextHover,ITextHoverExtension2 {
-
- public static final String LABEL= "Alrighty!";
-
- @Deprecated
- @Override
- public String getHoverInfo(ITextViewer textViewer, IRegion hoverRegion) {
- return null;
- }
-
- @Override
- public IRegion getHoverRegion(ITextViewer textViewer, int offset) {
- return new Region(0, textViewer.getTextWidget().getText().length());
- }
-
- @Override
- public Object getHoverInfo2(ITextViewer textViewer, IRegion hoverRegion) {
- return LABEL;
- }
-
-}
diff --git a/org.eclipse.ui.genericeditor.tests/src/org/eclipse/ui/genericeditor/tests/contributions/HelloHoverProvider.java b/org.eclipse.ui.genericeditor.tests/src/org/eclipse/ui/genericeditor/tests/contributions/HelloHoverProvider.java
deleted file mode 100644
index 12f53196eda..00000000000
--- a/org.eclipse.ui.genericeditor.tests/src/org/eclipse/ui/genericeditor/tests/contributions/HelloHoverProvider.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2017 Red Hat Inc. 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:
- * Mickael Istria (Red Hat Inc.)
- *******************************************************************************/
-package org.eclipse.ui.genericeditor.tests.contributions;
-
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.ITextHover;
-import org.eclipse.jface.text.ITextHoverExtension2;
-import org.eclipse.jface.text.ITextViewer;
-import org.eclipse.jface.text.Region;
-
-public class HelloHoverProvider implements ITextHover, ITextHoverExtension2 {
-
- public static final String LABEL= "Hello!";
-
- @Deprecated
- @Override
- public String getHoverInfo(ITextViewer textViewer, IRegion hoverRegion) {
- return null;
- }
-
- @Override
- public IRegion getHoverRegion(ITextViewer textViewer, int offset) {
- return new Region(0, textViewer.getTextWidget().getText().length());
- }
-
- @Override
- public Object getHoverInfo2(ITextViewer textViewer, IRegion hoverRegion) {
- return LABEL;
- }
-}
diff --git a/org.eclipse.ui.genericeditor.tests/src/org/eclipse/ui/genericeditor/tests/contributions/MagicHoverProvider.java b/org.eclipse.ui.genericeditor.tests/src/org/eclipse/ui/genericeditor/tests/contributions/MagicHoverProvider.java
new file mode 100644
index 00000000000..0bba76cf9d4
--- /dev/null
+++ b/org.eclipse.ui.genericeditor.tests/src/org/eclipse/ui/genericeditor/tests/contributions/MagicHoverProvider.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Red Hat Inc. 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:
+ * Mickael Istria (Red Hat Inc.)
+ *******************************************************************************/
+package org.eclipse.ui.genericeditor.tests.contributions;
+
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextHover;
+import org.eclipse.jface.text.ITextHoverExtension2;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.Region;
+
+public class MagicHoverProvider implements ITextHover,ITextHoverExtension2 {
+
+ public static final String LABEL= "Alrighty!";
+
+ @Deprecated
+ @Override
+ public String getHoverInfo(ITextViewer textViewer, IRegion hoverRegion) {
+ return null;
+ }
+
+ @Override
+ public IRegion getHoverRegion(ITextViewer textViewer, int offset) {
+ return new Region(0, textViewer.getTextWidget().getText().length());
+ }
+
+ @Override
+ public Object getHoverInfo2(ITextViewer textViewer, IRegion hoverRegion) {
+ return LABEL;
+ }
+
+}
diff --git a/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/CompositeTextHover.java b/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/CompositeTextHover.java
new file mode 100644
index 00000000000..89944fb780b
--- /dev/null
+++ b/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/CompositeTextHover.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * Copyright (c) 2016-2017 Red Hat Inc. 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:
+ * - Mickael Istria (Red Hat Inc.)
+ *******************************************************************************/
+package org.eclipse.ui.internal.genericeditor;
+
+import java.util.List;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.jface.text.IInformationControlCreator;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextHover;
+import org.eclipse.jface.text.ITextHoverExtension;
+import org.eclipse.jface.text.ITextHoverExtension2;
+import org.eclipse.jface.text.ITextViewer;
+
+/**
+ * A text hover that delegates its operations to children
+ * provided in constructor and returns the first interesting result.
+ *
+ * @since 1.0
+ */
+public class CompositeTextHover implements ITextHover, ITextHoverExtension, ITextHoverExtension2 {
+
+ private List hoversToConsider;
+ private ITextHover currentHover = null;
+
+ public CompositeTextHover(List hoversToConsider) {
+ Assert.isNotNull(hoversToConsider);
+ this.hoversToConsider = hoversToConsider;
+ }
+
+ @Override
+ public Object getHoverInfo2(ITextViewer textViewer, IRegion hoverRegion) {
+ for (ITextHover hover : this.hoversToConsider) {
+ Object res = null;
+ if (hover instanceof ITextHoverExtension2) {
+ res = ((ITextHoverExtension2)hover).getHoverInfo2(textViewer, hoverRegion);
+ } else {
+ res = hover.getHoverInfo(textViewer, hoverRegion);
+ }
+ if (res != null) {
+ currentHover = hover;
+ return res;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public IInformationControlCreator getHoverControlCreator() {
+ ITextHover hover = this.currentHover;
+ if (hover != null) {
+ if (hover instanceof ITextHoverExtension) {
+ return ((ITextHoverExtension)hover).getHoverControlCreator();
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public String getHoverInfo(ITextViewer textViewer, IRegion hoverRegion) {
+ for (ITextHover hover : this.hoversToConsider) {
+ String res = hover.getHoverInfo(textViewer, hoverRegion);
+ if (res != null) {
+ currentHover = hover;
+ return res;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public IRegion getHoverRegion(ITextViewer textViewer, int offset) {
+ for (ITextHover hover : this.hoversToConsider) {
+ IRegion res = hover.getHoverRegion(textViewer, offset);
+ if (res != null) {
+ return res;
+ }
+ }
+ return null;
+ }
+
+}
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 4e0461fe0b1..ab43608f518 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
@@ -42,7 +42,6 @@ import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IPropertyListener;
import org.eclipse.ui.editors.text.TextSourceViewerConfiguration;
import org.eclipse.ui.internal.editors.text.EditorsPlugin;
-import org.eclipse.ui.internal.genericeditor.hover.CompositeTextHover;
import org.eclipse.ui.internal.genericeditor.markers.MarkerResoltionQuickAssistProcessor;
import org.eclipse.ui.texteditor.ITextEditor;
import org.eclipse.ui.texteditor.spelling.SpellingCorrectionProcessor;
@@ -100,14 +99,8 @@ public final class ExtensionBasedTextViewerConfiguration extends TextSourceViewe
@Override
public ITextHover getTextHover(ISourceViewer sourceViewer, String contentType) {
- List hovers = GenericEditorPlugin.getDefault().getHoverRegistry().getAvailableHovers(sourceViewer, getContentTypes());
- if (hovers == null || hovers.isEmpty()) {
- return null;
- } else if (hovers.size() == 1) {
- return hovers.get(0);
- } else {
- return new CompositeTextHover(hovers);
- }
+ TextHoverRegistry registry= GenericEditorPlugin.getDefault().getHoverRegistry();
+ return registry.getAvailableHover(sourceViewer, getContentTypes());
}
@Override
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 cbceac42bcc..8bdf7a4cf52 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
@@ -14,7 +14,6 @@ package org.eclipse.ui.internal.genericeditor;
import org.eclipse.jface.text.ITextHover;
import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
import org.eclipse.jface.text.presentation.IPresentationReconciler;
-import org.eclipse.ui.internal.genericeditor.hover.TextHoverRegistry;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.osgi.framework.BundleContext;
diff --git a/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/OrderedExtensionComparator.java b/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/OrderedExtensionComparator.java
new file mode 100644
index 00000000000..0ae0bbaca75
--- /dev/null
+++ b/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/OrderedExtensionComparator.java
@@ -0,0 +1,91 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Red Hat Inc. 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:
+ * Mickael Istria (Red Hat Inc.) - initial implementation
+ *******************************************************************************/
+package org.eclipse.ui.internal.genericeditor;
+
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.ui.internal.genericeditor.TextHoverRegistry.TextHoverExtension;
+
+/**
+ * A comparator that allows to sort elements according to their relative
+ * placement (isBefore and isAfter)
+ *
+ */
+class OrderedExtensionComparator implements Comparator {
+
+ private Map extensionsById;
+
+ public OrderedExtensionComparator(Collection extensions) {
+ Assert.isNotNull(extensions);
+ this.extensionsById = extensions.stream().collect(Collectors.toMap(TextHoverExtension::getId, Function.identity()));
+ }
+
+ @Override
+ public int compare(TextHoverExtension arg0, TextHoverExtension arg1) {
+ if (isDeclaredAsBefore(arg0, arg1) || isDeclaredAsAfter(arg1, arg0)) {
+ return -1;
+ }
+ if (isDeclaredAsAfter(arg0, arg1) || isDeclaredAsBefore(arg1, arg0)) {
+ return +1;
+ }
+ return arg0.toString().compareTo(arg1.toString());
+ }
+
+ private boolean isDeclaredAsBefore(TextHoverExtension arg0, TextHoverExtension arg1) {
+ String before0 = arg0.getIsBefore();
+ if (before0 == null) {
+ return false;
+ }
+ if ("*".equals(before0) && !"*".equals(arg1.getIsBefore())) { //$NON-NLS-1$ //$NON-NLS-2$
+ return true;
+ }
+ String id1 = arg1.getId();
+ if (id1 == null) {
+ return false;
+ }
+ if (before0.equals(id1)) {
+ return true;
+ }
+ String after1 = arg1.getIsAfter();
+ if (after1 == null) {
+ return false;
+ }
+ return isDeclaredAsAfter(arg0, this.extensionsById.get(after1));
+ }
+
+ private boolean isDeclaredAsAfter(TextHoverExtension arg0, TextHoverExtension arg1) {
+ String after0 = arg0.getIsAfter();
+ if (after0 == null) {
+ return false;
+ }
+ if ("*".equals(after0) && !"*".equals(arg1.getIsAfter())) { //$NON-NLS-1$ //$NON-NLS-2$
+ return true;
+ }
+ String id1 = arg1.getId();
+ if (id1 == null) {
+ return false;
+ }
+ if (after0.equals(id1)) {
+ return true;
+ }
+ String before1 = arg1.getIsBefore();
+ if (before1 == null) {
+ return false;
+ }
+ return isDeclaredAsAfter(arg0, this.extensionsById.get(before1));
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/TextHoverRegistry.java b/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/TextHoverRegistry.java
new file mode 100644
index 00000000000..374c066eccc
--- /dev/null
+++ b/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/TextHoverRegistry.java
@@ -0,0 +1,135 @@
+/*******************************************************************************
+ * Copyright (c) 2016-2017 Red Hat Inc. 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:
+ * - Mickael Istria (Red Hat Inc.)
+ *******************************************************************************/
+package org.eclipse.ui.internal.genericeditor;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.SortedSet;
+import java.util.TreeSet;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IRegistryChangeEvent;
+import org.eclipse.core.runtime.IRegistryChangeListener;
+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.preference.IPreferenceStore;
+import org.eclipse.jface.text.ITextHover;
+import org.eclipse.jface.text.source.ISourceViewer;
+
+/**
+ * Text hover registry that manages the detectors
+ * contributed by the org.eclipse.ui.workbench.texteditor.hoverProvider
extension point for
+ * targets contributed by the org.eclipse.ui.workbench.texteditor.hyperlinkDetectorTargets
extension point.
+ *
+ * @since 1.0
+ */
+public final class TextHoverRegistry {
+
+ private static final String EXTENSION_POINT_ID = GenericEditorPlugin.BUNDLE_ID + ".hoverProviders"; //$NON-NLS-1$
+
+ private SortedSet extensions;
+ private boolean outOfSync = true;
+
+ static class TextHoverExtension extends GenericContentTypeRelatedExtension {
+ private static final String ID_ATTRIBUTE = "id"; //$NON-NLS-1$
+ private static final String IS_BEFORE_ATTRIBUTE = "isBefore"; //$NON-NLS-1$
+ private static final String IS_AFTER_ATTRIBUTE = "isAfter"; //$NON-NLS-1$
+
+ private String id;
+ private String isBefore;
+ private String isAfter;
+
+ public TextHoverExtension(IConfigurationElement extension) throws Exception {
+ super(extension);
+ this.id = extension.getAttribute(ID_ATTRIBUTE);
+ this.isBefore = extension.getAttribute(IS_BEFORE_ATTRIBUTE);
+ this.isAfter = extension.getAttribute(IS_AFTER_ATTRIBUTE);
+ }
+
+ public String getId() {
+ if (this.id != null) {
+ return this.id;
+ }
+ return this.extension.getContributor().getName() + '@' + toString();
+ }
+
+ public String getIsAfter() {
+ return this.isAfter;
+ }
+
+ public String getIsBefore() {
+ return this.isBefore;
+ }
+
+ IConfigurationElement getConfigurationElement() {
+ return this.extension;
+ }
+ }
+
+ public TextHoverRegistry(IPreferenceStore preferenceStore) {
+ Platform.getExtensionRegistry().addRegistryChangeListener(new IRegistryChangeListener() {
+ @Override
+ public void registryChanged(IRegistryChangeEvent event) {
+ outOfSync = true;
+ }
+ }, EXTENSION_POINT_ID);
+ }
+
+ public ITextHover getAvailableHover(ISourceViewer sourceViewer, Set contentTypes) {
+ if (this.outOfSync) {
+ sync();
+ }
+ List hoversToConsider = this.extensions.stream()
+ .filter(ext -> contentTypes.contains(ext.targetContentType))
+ // don't sort in the stream as the initial structure is already sorted by isAfter/isBefore
+ .map(GenericContentTypeRelatedExtension::createDelegate)
+ .collect(Collectors.toList());
+ if (!hoversToConsider.isEmpty()) {
+ return new CompositeTextHover(hoversToConsider);
+ }
+ return null;
+ }
+
+ private void sync() {
+ Set toRemoveExtensions = new HashSet<>();
+ Map ext = new HashMap<>();
+ if (this.extensions != null) {
+ ext = this.extensions.stream().collect(Collectors.toMap(TextHoverExtension::getConfigurationElement, Function.identity()));
+ toRemoveExtensions = ext.keySet();
+ }
+ for (IConfigurationElement extension : Platform.getExtensionRegistry().getConfigurationElementsFor(EXTENSION_POINT_ID)) {
+ toRemoveExtensions.remove(extension);
+ if (!ext.containsKey(extension)) {
+ try {
+ ext.put(extension, new TextHoverExtension(extension));
+ } catch (Exception ex) {
+ GenericEditorPlugin.getDefault().getLog().log(new Status(IStatus.ERROR, GenericEditorPlugin.BUNDLE_ID, ex.getMessage(), ex));
+ }
+ }
+ }
+ for (IConfigurationElement toRemove : toRemoveExtensions) {
+ ext.remove(toRemove);
+ }
+
+ OrderedExtensionComparator comparator = new OrderedExtensionComparator(ext.values());
+ this.extensions = new TreeSet<>(comparator);
+ this.extensions.addAll(ext.values());
+ this.outOfSync = false;
+ }
+
+}
diff --git a/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/hover/CompositeInformationControl.java b/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/hover/CompositeInformationControl.java
deleted file mode 100644
index a63088f2fb4..00000000000
--- a/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/hover/CompositeInformationControl.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2017 Red Hat Inc. 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:
- * - Mickael Istria (Red Hat Inc.)
- *******************************************************************************/
-package org.eclipse.ui.internal.genericeditor.hover;
-
-import java.util.Arrays;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.text.AbstractInformationControl;
-import org.eclipse.jface.text.IInformationControl;
-import org.eclipse.jface.text.IInformationControlCreator;
-import org.eclipse.jface.text.IInformationControlExtension;
-import org.eclipse.jface.text.IInformationControlExtension2;
-import org.eclipse.jface.text.IInformationControlExtension5;
-import org.eclipse.jface.text.ITextHover;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.internal.genericeditor.GenericEditorPlugin;
-
-public class CompositeInformationControl extends AbstractInformationControl implements IInformationControlExtension2 {
-
- final LinkedHashMap creators;
- LinkedHashMap controls;
-
- public CompositeInformationControl(Shell parentShell, LinkedHashMap creators) {
- super(parentShell, true); // TODO check best constructor
- Assert.isLegal(creators.size() > 1, "Do not compose a unique hover"); //$NON-NLS-1$
- this.creators = creators;
- create();
- }
-
- @Override
- public boolean hasContents() {
- for (IInformationControl control : controls.values()) {
- if (control instanceof IInformationControlExtension) {
- if (((IInformationControlExtension)control).hasContents()) {
- return true;
- }
- } else {
- return true;
- }
- }
- return false;
- }
-
- @Override
- public void setInput(Object input) {
- @SuppressWarnings("unchecked")
- Map inputs = (Map)input;
- for (Entry entry : inputs.entrySet()) {
- IInformationControl informationControl = controls.get(entry.getKey());
- if (informationControl != null) {
- if (informationControl instanceof IInformationControlExtension2) {
- ((IInformationControlExtension2)informationControl).setInput(entry.getValue());
- } else {
- informationControl.setInformation(entry.getValue().toString());
- }
- }
- }
- }
-
- @Override
- public void createContent(Composite parent) {
- this.controls = new LinkedHashMap<>(); // TODO maybe use canReuse or canReplace
- GridLayout layout = new GridLayout(1, false);
- parent.setLayout(layout);
- boolean firstControl = true;
- for (Entry hoverControlCreator : this.creators.entrySet()) {
- IInformationControl informationControl = hoverControlCreator.getValue().createInformationControl(parent.getShell());
- if (informationControl instanceof AbstractInformationControl) {
- List children = Arrays.asList(((AbstractInformationControl)informationControl).getShell().getChildren());
- children.remove(parent);
- if (children.size() == 0 ) {
- continue;
- }
- for (Control control : children) {
- control.setParent(parent);
- control.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
- }
- if (!firstControl) {
- ((GridData)children.get(0).getLayoutData()).verticalIndent = 15;
- }
- controls.put(hoverControlCreator.getKey(), informationControl);
- firstControl = false;
- } else {
- GenericEditorPlugin.getDefault().getLog().log(new Status(IStatus.WARNING, GenericEditorPlugin.BUNDLE_ID,
- "Only text hovers producing an AbstractInformationControl can be aggregated; got a " + informationControl.getClass().getSimpleName())); //$NON-NLS-1$
- informationControl.dispose();
- }
- }
- }
-
- @Override
- public void dispose() {
- controls.values().forEach(IInformationControl::dispose);
- controls.clear();
- super.dispose();
- }
-
- @Override
- public IInformationControlCreator getInformationPresenterControlCreator() {
- if (controls.isEmpty()) {
- return null;
- } else if (controls.size() == 1) {
- IInformationControl control = controls.values().iterator().next();
- if (control instanceof IInformationControlExtension5) {
- return ((IInformationControlExtension5)control).getInformationPresenterControlCreator();
- }
- } else {
- LinkedHashMap presenterCreators = new LinkedHashMap<>();
- boolean allNull = true;
- for (Entry hover : this.controls.entrySet()) {
- IInformationControlCreator creator = null;
- if (hover.getValue() instanceof IInformationControlExtension5)
- creator = ((IInformationControlExtension5)hover.getValue()).getInformationPresenterControlCreator();
- if (creator == null) {
- creator = this.creators.get(hover.getKey());
- } else {
- allNull = false;
- }
- if (creator != null) {
- presenterCreators.put(hover.getKey(), creator);
- }
- }
- if (allNull) {
- return null;
- }
- return new CompositeInformationControlCreator(presenterCreators);
- }
- return null;
- }
-
- @Override
- public Point computeSizeHint() {
- return getShell().computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
- }
-
-}
diff --git a/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/hover/CompositeInformationControlCreator.java b/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/hover/CompositeInformationControlCreator.java
deleted file mode 100644
index ddeee67056c..00000000000
--- a/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/hover/CompositeInformationControlCreator.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2017 Red Hat Inc. 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:
- * - Mickael Istria (Red Hat Inc.)
- *******************************************************************************/
-package org.eclipse.ui.internal.genericeditor.hover;
-
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map.Entry;
-
-import org.eclipse.jface.text.AbstractReusableInformationControlCreator;
-import org.eclipse.jface.text.DefaultInformationControl;
-import org.eclipse.jface.text.IInformationControl;
-import org.eclipse.jface.text.IInformationControlCreator;
-import org.eclipse.jface.text.IInformationControlCreatorExtension;
-import org.eclipse.jface.text.ITextHover;
-import org.eclipse.jface.text.ITextHoverExtension;
-import org.eclipse.swt.widgets.Shell;
-
-public class CompositeInformationControlCreator
- implements IInformationControlCreator, IInformationControlCreatorExtension {
-
- private final LinkedHashMap creators;
-
- public CompositeInformationControlCreator(List hovers) {
- this.creators = new LinkedHashMap<>();
- for (ITextHover hover : hovers) {
- creators.put(hover, getInformationControlCreator(hover));
- }
- }
-
- public CompositeInformationControlCreator(LinkedHashMap creators) {
- this.creators = creators;
- }
-
- private static IInformationControlCreator getInformationControlCreator(ITextHover hover) {
- IInformationControlCreator controlCreator = null;
- if (hover instanceof ITextHoverExtension) {
- controlCreator = ((ITextHoverExtension)hover).getHoverControlCreator();
- }
- if (controlCreator == null) {
- controlCreator = new AbstractReusableInformationControlCreator() {
- @Override
- protected IInformationControl doCreateInformationControl(Shell parent) {
- return new DefaultInformationControl(parent, true);
- }
- };
- }
- return controlCreator;
- }
-
-
- @Override
- public boolean canReuse(IInformationControl control) {
- if (control.getClass() != CompositeInformationControl.class) {
- return false;
- }
- CompositeInformationControl other = (CompositeInformationControl)control;
- if (!other.creators.equals(this.creators)) {
- return false;
- }
- Iterator> thisIterator = this.creators.entrySet().iterator();
- Iterator> otherIterator = other.controls.entrySet().iterator();
- do {
- Entry thisEntry = thisIterator.next();
- Entry otherEntry = otherIterator.next();
- if (!thisEntry.getKey().equals(otherEntry.getKey())) {
- return false;
- }
- if (!(thisEntry.getValue() instanceof IInformationControlCreatorExtension)) {
- return false;
- }
- if (!((IInformationControlCreatorExtension)thisEntry.getValue()).canReuse(otherEntry.getValue())) {
- return false;
- }
- } while (thisIterator.hasNext());
- return true;
- }
-
- @Override
- public boolean canReplace(IInformationControlCreator creator) {
- if (creator.getClass() != this.getClass()) {
- return false;
- }
- CompositeInformationControlCreator other = (CompositeInformationControlCreator)creator;
- if (other.creators.size() != this.creators.size()) {
- return false;
- }
- Iterator> thisIterator = this.creators.entrySet().iterator();
- Iterator> otherIterator = other.creators.entrySet().iterator();
- do {
- Entry thisEntry = thisIterator.next();
- Entry otherEntry = otherIterator.next();
- if (!thisEntry.getKey().equals(otherEntry.getKey())) {
- return false;
- }
- if (!(thisEntry.getValue() instanceof IInformationControlCreatorExtension)) {
- return false;
- }
- if (!((IInformationControlCreatorExtension)thisEntry.getValue()).canReplace(otherEntry.getValue())) {
- return false;
- }
- } while (thisIterator.hasNext());
- return true;
- }
-
-
- @Override
- public IInformationControl createInformationControl(Shell parent) {
- return new CompositeInformationControl(parent, this.creators);
- }
-
-}
diff --git a/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/hover/CompositeTextHover.java b/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/hover/CompositeTextHover.java
deleted file mode 100644
index 82e2cb271a9..00000000000
--- a/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/hover/CompositeTextHover.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2016-2017 Red Hat Inc. 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:
- * - Mickael Istria (Red Hat Inc.)
- *******************************************************************************/
-package org.eclipse.ui.internal.genericeditor.hover;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Objects;
-import java.util.stream.Collectors;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.text.IInformationControlCreator;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.ITextHover;
-import org.eclipse.jface.text.ITextHoverExtension;
-import org.eclipse.jface.text.ITextHoverExtension2;
-import org.eclipse.jface.text.ITextViewer;
-import org.eclipse.jface.text.Region;
-
-/**
- * A text hover that delegates its operations to children
- * provided in constructor and returns the first interesting result.
- *
- * @since 1.0
- */
-public class CompositeTextHover implements ITextHover, ITextHoverExtension, ITextHoverExtension2 {
-
- private final List allHovers;
- private LinkedHashMap regions = null;
- private LinkedHashMap currentHovers = null;
-
- public CompositeTextHover(List hoversToConsider) {
- Assert.isNotNull(hoversToConsider);
- Assert.isLegal(hoversToConsider.size() > 1, "Do not compose a single hover."); //$NON-NLS-1$
- this.allHovers = Collections.unmodifiableList(hoversToConsider);
- }
-
- @Override
- public Object getHoverInfo2(ITextViewer textViewer, IRegion requestRegion) {
- this.currentHovers = new LinkedHashMap<>();
- for (ITextHover hover : this.allHovers) {
- IRegion currentRegion = this.regions.get(hover);
- if (currentRegion == null) {
- continue;
- }
- Object res = hover instanceof ITextHoverExtension2 ?
- ((ITextHoverExtension2)hover).getHoverInfo2(textViewer, currentRegion) :
- hover.getHoverInfo(textViewer, currentRegion);
- if (res != null) {
- this.currentHovers.put(hover, res);
- }
- }
- if (this.currentHovers.isEmpty()) {
- return null;
- } else if (this.currentHovers.size() == 1) {
- return this.currentHovers.values().iterator().next();
- } else {
- return this.currentHovers;
- }
- }
-
- @Override
- public IInformationControlCreator getHoverControlCreator() {
- if (this.currentHovers == null || this.currentHovers.isEmpty()) {
- return null;
- } else if (currentHovers.size() == 1) {
- ITextHover hover = this.currentHovers.keySet().iterator().next();
- return hover instanceof ITextHoverExtension ?
- ((ITextHoverExtension)hover).getHoverControlCreator():
- null;
- } else {
- return new CompositeInformationControlCreator(new ArrayList<>(this.currentHovers.keySet()));
- }
- }
-
- @Override
- public String getHoverInfo(ITextViewer textViewer, IRegion hoverRegion) {
- return this.allHovers.stream()
- .map(hover -> hover.getHoverInfo(textViewer, this.regions.get(hover)))
- .filter(Objects::nonNull)
- .collect(Collectors.joining("\n")); //$NON-NLS-1$
- }
-
- @Override
- public IRegion getHoverRegion(ITextViewer textViewer, int offset) {
- this.regions = new LinkedHashMap<>();
- IRegion res = null;
- for (ITextHover hover : this.allHovers) {
- IRegion region = hover.getHoverRegion(textViewer, offset);
- if (region != null) {
- this.regions.put(hover, region);
- if (res == null) {
- res = region;
- } else {
- int startOffset = Math.max(res.getOffset(), region.getOffset());
- int endOffset = Math.min(res.getOffset() + res.getLength(), region.getOffset() + region.getLength());
- res = new Region(startOffset, endOffset - startOffset);
- }
- }
- }
- return res;
- }
-
-}
diff --git a/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/hover/OrderedExtensionComparator.java b/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/hover/OrderedExtensionComparator.java
deleted file mode 100644
index 9cf32222951..00000000000
--- a/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/hover/OrderedExtensionComparator.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2016 Red Hat Inc. 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:
- * Mickael Istria (Red Hat Inc.) - initial implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.genericeditor.hover;
-
-import java.util.Collection;
-import java.util.Comparator;
-import java.util.Map;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.ui.internal.genericeditor.hover.TextHoverRegistry.TextHoverExtension;
-
-/**
- * A comparator that allows to sort elements according to their relative
- * placement (isBefore and isAfter)
- *TODO: generalizing to any kind of extension supporting isBefore and isAfter
- */
-class OrderedExtensionComparator implements Comparator {
-
- private Map extensionsById;
-
- public OrderedExtensionComparator(Collection extensions) {
- Assert.isNotNull(extensions);
- this.extensionsById = extensions.stream().collect(Collectors.toMap(TextHoverExtension::getId, Function.identity()));
- }
-
- @Override
- public int compare(TextHoverExtension arg0, TextHoverExtension arg1) {
- if (isDeclaredAsBefore(arg0, arg1) || isDeclaredAsAfter(arg1, arg0)) {
- return -1;
- }
- if (isDeclaredAsAfter(arg0, arg1) || isDeclaredAsBefore(arg1, arg0)) {
- return +1;
- }
- return arg0.toString().compareTo(arg1.toString());
- }
-
- private boolean isDeclaredAsBefore(TextHoverExtension arg0, TextHoverExtension arg1) {
- String before0 = arg0.getIsBefore();
- if (before0 == null) {
- return false;
- }
- if ("*".equals(before0) && !"*".equals(arg1.getIsBefore())) { //$NON-NLS-1$ //$NON-NLS-2$
- return true;
- }
- String id1 = arg1.getId();
- if (id1 == null) {
- return false;
- }
- if (before0.equals(id1)) {
- return true;
- }
- String after1 = arg1.getIsAfter();
- if (after1 == null) {
- return false;
- }
- return isDeclaredAsAfter(arg0, this.extensionsById.get(after1));
- }
-
- private boolean isDeclaredAsAfter(TextHoverExtension arg0, TextHoverExtension arg1) {
- String after0 = arg0.getIsAfter();
- if (after0 == null) {
- return false;
- }
- if ("*".equals(after0) && !"*".equals(arg1.getIsAfter())) { //$NON-NLS-1$ //$NON-NLS-2$
- return true;
- }
- String id1 = arg1.getId();
- if (id1 == null) {
- return false;
- }
- if (after0.equals(id1)) {
- return true;
- }
- String before1 = arg1.getIsBefore();
- if (before1 == null) {
- return false;
- }
- return isDeclaredAsAfter(arg0, this.extensionsById.get(before1));
- }
-
-}
\ No newline at end of file
diff --git a/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/hover/TextHoverRegistry.java b/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/hover/TextHoverRegistry.java
deleted file mode 100644
index f68bbf74deb..00000000000
--- a/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/hover/TextHoverRegistry.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2016-2017 Red Hat Inc. 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:
- * - Mickael Istria (Red Hat Inc.)
- *******************************************************************************/
-package org.eclipse.ui.internal.genericeditor.hover;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.SortedSet;
-import java.util.TreeSet;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IRegistryChangeEvent;
-import org.eclipse.core.runtime.IRegistryChangeListener;
-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.preference.IPreferenceStore;
-import org.eclipse.jface.text.ITextHover;
-import org.eclipse.jface.text.source.ISourceViewer;
-import org.eclipse.ui.internal.genericeditor.GenericContentTypeRelatedExtension;
-import org.eclipse.ui.internal.genericeditor.GenericEditorPlugin;
-
-/**
- * Text hover registry that manages the detectors
- * contributed by the org.eclipse.ui.workbench.texteditor.hoverProvider
extension point for
- * targets contributed by the org.eclipse.ui.workbench.texteditor.hyperlinkDetectorTargets
extension point.
- *
- * @since 1.0
- */
-public final class TextHoverRegistry {
-
- private static final String EXTENSION_POINT_ID = GenericEditorPlugin.BUNDLE_ID + ".hoverProviders"; //$NON-NLS-1$
-
- private SortedSet extensions;
- private boolean outOfSync = true;
-
- static class TextHoverExtension extends GenericContentTypeRelatedExtension {
- private static final String ID_ATTRIBUTE = "id"; //$NON-NLS-1$
- private static final String IS_BEFORE_ATTRIBUTE = "isBefore"; //$NON-NLS-1$
- private static final String IS_AFTER_ATTRIBUTE = "isAfter"; //$NON-NLS-1$
-
- private String id;
- private String isBefore;
- private String isAfter;
-
- public TextHoverExtension(IConfigurationElement extension) throws Exception {
- super(extension);
- this.id = extension.getAttribute(ID_ATTRIBUTE);
- this.isBefore = extension.getAttribute(IS_BEFORE_ATTRIBUTE);
- this.isAfter = extension.getAttribute(IS_AFTER_ATTRIBUTE);
- }
-
- public String getId() {
- if (this.id != null) {
- return this.id;
- }
- return this.extension.getContributor().getName() + '@' + toString();
- }
-
- public String getIsAfter() {
- return this.isAfter;
- }
-
- public String getIsBefore() {
- return this.isBefore;
- }
-
- IConfigurationElement getConfigurationElement() {
- return this.extension;
- }
- }
-
- public TextHoverRegistry(IPreferenceStore preferenceStore) {
- Platform.getExtensionRegistry().addRegistryChangeListener(new IRegistryChangeListener() {
- @Override
- public void registryChanged(IRegistryChangeEvent event) {
- outOfSync = true;
- }
- }, EXTENSION_POINT_ID);
- }
-
- public List getAvailableHovers(ISourceViewer sourceViewer, Set contentTypes) {
- if (this.outOfSync) {
- sync();
- }
- return this.extensions.stream()
- .filter(ext -> contentTypes.contains(ext.targetContentType))
- // don't sort in the stream as the initial structure is already sorted by isAfter/isBefore
- .map(GenericContentTypeRelatedExtension::createDelegate)
- .collect(Collectors.toList());
- }
-
- private void sync() {
- Set toRemoveExtensions = new HashSet<>();
- Map ext = new HashMap<>();
- if (this.extensions != null) {
- ext = this.extensions.stream().collect(Collectors.toMap(TextHoverExtension::getConfigurationElement, Function.identity()));
- toRemoveExtensions = ext.keySet();
- }
- for (IConfigurationElement extension : Platform.getExtensionRegistry().getConfigurationElementsFor(EXTENSION_POINT_ID)) {
- toRemoveExtensions.remove(extension);
- if (!ext.containsKey(extension)) {
- try {
- ext.put(extension, new TextHoverExtension(extension));
- } catch (Exception ex) {
- GenericEditorPlugin.getDefault().getLog().log(new Status(IStatus.ERROR, GenericEditorPlugin.BUNDLE_ID, ex.getMessage(), ex));
- }
- }
- }
- for (IConfigurationElement toRemove : toRemoveExtensions) {
- ext.remove(toRemove);
- }
-
- OrderedExtensionComparator comparator = new OrderedExtensionComparator(ext.values());
- this.extensions = new TreeSet<>(comparator);
- this.extensions.addAll(ext.values());
- this.outOfSync = false;
- }
-
-}
diff --git a/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/markers/MarkerHoverControlCreator.java b/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/markers/MarkerHoverControlCreator.java
index 55e9d0bf663..8d81994f070 100644
--- a/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/markers/MarkerHoverControlCreator.java
+++ b/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/markers/MarkerHoverControlCreator.java
@@ -17,29 +17,19 @@ import org.eclipse.swt.widgets.Shell;
public class MarkerHoverControlCreator implements IInformationControlCreator, IInformationControlCreatorExtension {
- private final boolean showAffordanceString;
-
- public MarkerHoverControlCreator() {
- this(true);
- }
-
- public MarkerHoverControlCreator(boolean showAffordanceString) {
- this.showAffordanceString = showAffordanceString;
- }
-
@Override
public boolean canReuse(IInformationControl control) {
- return control instanceof MarkerInformationControl;
+ return false;
}
@Override
public boolean canReplace(IInformationControlCreator creator) {
- return creator instanceof MarkerHoverControlCreator;
+ return false;
}
@Override
public IInformationControl createInformationControl(Shell parent) {
- return new MarkerInformationControl(parent, showAffordanceString);
+ return new MarkerInformationControl(parent,this);
}
}
diff --git a/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/markers/MarkerInformationControl.java b/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/markers/MarkerInformationControl.java
index db93b4a9669..98bf713d93b 100644
--- a/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/markers/MarkerInformationControl.java
+++ b/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/markers/MarkerInformationControl.java
@@ -11,7 +11,6 @@
package org.eclipse.ui.internal.genericeditor.markers;
import java.util.Collection;
-import java.util.LinkedHashMap;
import java.util.List;
import org.eclipse.core.resources.IMarker;
@@ -20,6 +19,7 @@ import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.text.AbstractInformationControl;
+import org.eclipse.jface.text.AbstractReusableInformationControlCreator;
import org.eclipse.jface.text.IInformationControl;
import org.eclipse.jface.text.IInformationControlCreator;
import org.eclipse.jface.text.IInformationControlExtension;
@@ -46,10 +46,11 @@ import org.eclipse.ui.ide.IDE.SharedImages;
public class MarkerInformationControl extends AbstractInformationControl implements IInformationControl, IInformationControlExtension, IInformationControlExtension2 {
- private final LinkedHashMap composites = new LinkedHashMap<>();
+ private IInformationControlCreator creator;
- public MarkerInformationControl(Shell parentShell, boolean showAffordanceString) {
- super(parentShell, showAffordanceString ? EditorsUI.getTooltipAffordanceString() : null);
+ public MarkerInformationControl(Shell parentShell, IInformationControlCreator creator) {
+ super(parentShell, EditorsUI.getTooltipAffordanceString());
+ this.creator = creator;
create();
}
@@ -83,11 +84,9 @@ public class MarkerInformationControl extends AbstractInformationControl impleme
@SuppressWarnings("unchecked")
@Override
public void setInput(Object input) {
- this.composites.values().forEach(Composite::dispose);
this.markers = (List)input;
for (IMarker marker : this.markers) {
Composite markerComposite = new Composite(parent, SWT.NONE);
- this.composites.put(marker, markerComposite);
GridLayout gridLayout = new GridLayout(1, false);
gridLayout.verticalSpacing = 0;
markerComposite.setLayout(gridLayout);
@@ -136,12 +135,17 @@ public class MarkerInformationControl extends AbstractInformationControl impleme
});
}
}
- parent.layout(true);
+ parent.pack(true);
}
@Override
public IInformationControlCreator getInformationPresenterControlCreator() {
- return new MarkerHoverControlCreator(false);
+ return new AbstractReusableInformationControlCreator() {
+ @Override
+ protected IInformationControl doCreateInformationControl(Shell parent) {
+ return creator.createInformationControl(parent);
+ }
+ };
}
@Override
--
cgit v1.2.3