diff options
author | Tom Schindl | 2016-02-03 10:34:36 +0000 |
---|---|---|
committer | Tom Schindl | 2016-02-03 10:34:36 +0000 |
commit | c9c9165b42de26a6e2148781e4d6ae66df0856cc (patch) | |
tree | 856d08e2da8015746ee22fcf4835cff5ebb33ec6 | |
parent | c3e8fbfb271489fb18acb2ad1852b326885206ac (diff) | |
download | org.eclipse.efxclipse-c9c9165b42de26a6e2148781e4d6ae66df0856cc.tar.gz org.eclipse.efxclipse-c9c9165b42de26a6e2148781e4d6ae66df0856cc.tar.xz org.eclipse.efxclipse-c9c9165b42de26a6e2148781e4d6ae66df0856cc.zip |
Bug 487084 - Add abstraction for Input-Grouping (eg Project/Module)
6 files changed, 80 insertions, 1 deletions
diff --git a/bundles/code/org.eclipse.fx.code.editor/META-INF/MANIFEST.MF b/bundles/code/org.eclipse.fx.code.editor/META-INF/MANIFEST.MF index ad3198a1f..b3b9aed74 100644 --- a/bundles/code/org.eclipse.fx.code.editor/META-INF/MANIFEST.MF +++ b/bundles/code/org.eclipse.fx.code.editor/META-INF/MANIFEST.MF @@ -20,5 +20,6 @@ Service-Component: OSGI-INF/services/org.eclipse.fx.code.editor.services.interna OSGI-INF/services/org.eclipse.fx.code.editor.services.internal.FileInputTypeProvider.xml, OSGI-INF/services/org.eclipse.fx.code.editor.services.internal.InputDocumentTypeProvider.xml, OSGI-INF/services/org.eclipse.fx.code.editor.services.internal.DefaultFileIconProvider.xml, - OSGI-INF/services/org.eclipse.fx.code.editor.services.internal.NoHighlightDocumentTypePartitionerProvider.xml + OSGI-INF/services/org.eclipse.fx.code.editor.services.internal.NoHighlightDocumentTypePartitionerProvider.xml, + OSGI-INF/services/org.eclipse.fx.code.editor.services.internal.DefaultInputContextLookup.xml Bundle-Vendor: Eclipse.org diff --git a/bundles/code/org.eclipse.fx.code.editor/OSGI-INF/services/org.eclipse.fx.code.editor.services.internal.DefaultInputContextLookup.xml b/bundles/code/org.eclipse.fx.code.editor/OSGI-INF/services/org.eclipse.fx.code.editor.services.internal.DefaultInputContextLookup.xml new file mode 100644 index 000000000..9471de90c --- /dev/null +++ b/bundles/code/org.eclipse.fx.code.editor/OSGI-INF/services/org.eclipse.fx.code.editor.services.internal.DefaultInputContextLookup.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.2.0" name="org.eclipse.fx.code.editor.services.internal.DefaultInputContextLookup"> + <service> + <provide interface="org.eclipse.fx.code.editor.services.InputContextLookup"/> + </service> + <reference bind="registerInputContextProvider" cardinality="0..n" interface="org.eclipse.fx.code.editor.services.InputContextProvider" name="registerInputContextProvider" policy="static" policy-option="greedy" unbind="unregisterInputContextProvider"/> + <implementation class="org.eclipse.fx.code.editor.services.internal.DefaultInputContextLookup"/> +</scr:component>
\ No newline at end of file diff --git a/bundles/code/org.eclipse.fx.code.editor/src/org/eclipse/fx/code/editor/InputContext.java b/bundles/code/org.eclipse.fx.code.editor/src/org/eclipse/fx/code/editor/InputContext.java new file mode 100644 index 000000000..fe6da7960 --- /dev/null +++ b/bundles/code/org.eclipse.fx.code.editor/src/org/eclipse/fx/code/editor/InputContext.java @@ -0,0 +1,5 @@ +package org.eclipse.fx.code.editor; + +public interface InputContext { + public String getId(); +} diff --git a/bundles/code/org.eclipse.fx.code.editor/src/org/eclipse/fx/code/editor/services/InputContextLookup.java b/bundles/code/org.eclipse.fx.code.editor/src/org/eclipse/fx/code/editor/services/InputContextLookup.java new file mode 100644 index 000000000..9e7cc0ef4 --- /dev/null +++ b/bundles/code/org.eclipse.fx.code.editor/src/org/eclipse/fx/code/editor/services/InputContextLookup.java @@ -0,0 +1,18 @@ +package org.eclipse.fx.code.editor.services; + +import java.util.UUID; + +import org.eclipse.fx.code.editor.Input; +import org.eclipse.fx.code.editor.InputContext; + +public interface InputContextLookup { + public static final InputContext DEFAULT = new InputContext() { + private final String ID = UUID.randomUUID().toString(); + + @Override + public String getId() { + return ID; + } + }; + public InputContext getContext(Input<?> input); +} diff --git a/bundles/code/org.eclipse.fx.code.editor/src/org/eclipse/fx/code/editor/services/InputContextProvider.java b/bundles/code/org.eclipse.fx.code.editor/src/org/eclipse/fx/code/editor/services/InputContextProvider.java new file mode 100644 index 000000000..7455de8df --- /dev/null +++ b/bundles/code/org.eclipse.fx.code.editor/src/org/eclipse/fx/code/editor/services/InputContextProvider.java @@ -0,0 +1,10 @@ +package org.eclipse.fx.code.editor.services; + +import java.util.function.Predicate; + +import org.eclipse.fx.code.editor.Input; +import org.eclipse.fx.code.editor.InputContext; + +public interface InputContextProvider extends Predicate<Input<?>> { + public InputContext getContext(Input<?> input); +} diff --git a/bundles/code/org.eclipse.fx.code.editor/src/org/eclipse/fx/code/editor/services/internal/DefaultInputContextLookup.java b/bundles/code/org.eclipse.fx.code.editor/src/org/eclipse/fx/code/editor/services/internal/DefaultInputContextLookup.java new file mode 100644 index 000000000..324c2b98a --- /dev/null +++ b/bundles/code/org.eclipse.fx.code.editor/src/org/eclipse/fx/code/editor/services/internal/DefaultInputContextLookup.java @@ -0,0 +1,37 @@ +package org.eclipse.fx.code.editor.services.internal; + +import java.util.Map; + +import org.eclipse.fx.code.editor.Input; +import org.eclipse.fx.code.editor.InputContext; +import org.eclipse.fx.code.editor.services.InputContextLookup; +import org.eclipse.fx.code.editor.services.InputContextProvider; +import org.eclipse.fx.core.RankedObjectRegistry; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; +import org.osgi.service.component.annotations.ReferenceCardinality; +import org.osgi.service.component.annotations.ReferencePolicyOption; + +@Component +public class DefaultInputContextLookup implements InputContextLookup { + private static final String CONTEXT_KEY = DefaultInputContextLookup.class.getName() + ".inputContext"; + private RankedObjectRegistry<InputContextProvider> providerList = new RankedObjectRegistry<>(); + + @Reference(cardinality=ReferenceCardinality.MULTIPLE,policyOption=ReferencePolicyOption.GREEDY) + public synchronized void registerInputContextProvider(InputContextProvider provider, Map<String, Object> properties) { + providerList.registerObject(RankedObjectRegistry.getOSGiServiceRank(properties),provider); + } + + public synchronized void unregisterInputContextProvider(InputContextProvider provider) { + providerList.unregisterObject(provider); + } + + @Override + public synchronized InputContext getContext(Input<?> input) { + return (InputContext)input.getTransientData().computeIfAbsent(CONTEXT_KEY, k -> providerList.unsynchronizedStream() + .filter( p -> p.test(input)) + .findFirst() + .map( p -> p.getContext(input)) + .orElse(DEFAULT)); + } +} |