/* * Copyright 2003-2015 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package jetbrains.mps.ide.projectPane; import org.jetbrains.annotations.NotNull; import org.jetbrains.mps.openapi.language.SAbstractConcept; import org.jetbrains.mps.util.Condition; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.Set; //todo should be later converted to a fully-functional extension point, with wider possibilities //this variant was written to fix MPS-21478 and same issues with minimal changes in 3.2 //if filter returns true, it means the concept should be filtered out public class CreateRootFilterEP { private static CreateRootFilterEP ourInstance = new CreateRootFilterEP(); public static CreateRootFilterEP getInstance() { return ourInstance; } private CreateRootFilterEP() { } private final Set<Condition<SAbstractConcept>> myFilters = new HashSet<Condition<SAbstractConcept>>(); private final Set<CreateNodeExtension> myCreateExtensions = new HashSet<CreateNodeExtension>(); public void addFilter(Condition<SAbstractConcept> filter) { myFilters.add(filter); } public void removeFilter(Condition<SAbstractConcept> filter) { myFilters.remove(filter); } /* * These are to extend CreateRootAction with external code. There used to be * RootTemplateAnnotator, global model listener just to attach proper annotation * to roots created inside template model. This is wrong for 2 reasons: * (a) it affects any model authoring, and may be quite unexpected if you add a node * model.add root(N) and get a new annotation attached to your N. Apparently, * intention was to affect roots coming from user interaction * (b) listening to all changes in all models is a bit too much for a task to augment * particular node in specific model. * <p/> * THIS IS INDEED A HACK. Once CreateRootFilterEP becomes a full-fledged extension point, * either shall share EP, or become a separate one. At the moment, I can't use * ExtensionDeclaration as it requires either a plugin aspect of a language, or a plugin solution, * neither of which are available for j.m.ide or ide.ui. Since I found no better way to * register extension and I don't want to keep RootTemplateAnnotator nor to use platform's (IDEA) * extension point mechanism, this hack was introduced, until I find out proper way to do that. */ public void addCreateExtension(@NotNull CreateNodeExtension extension) { myCreateExtensions.add(extension); } public void removeCreateExtension(@NotNull CreateNodeExtension extension) { myCreateExtensions.remove(extension); } /** * There's no specific order, all CreateNodeExtension get a chance to act. */ @NotNull public Collection<CreateNodeExtension> getCreateNodeExtensions() { return new ArrayList<CreateNodeExtension>(myCreateExtensions); } public boolean shouldBeRemoved(SAbstractConcept c) { for (Condition<SAbstractConcept> f : myFilters) { if (f.met(c)) return true; } return false; } }