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