/* * Copyright 2003-2016 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.findusages.view.optionseditor.options; import jetbrains.mps.ide.findusages.CantLoadSomethingException; import jetbrains.mps.ide.findusages.FindersManager; import jetbrains.mps.ide.findusages.findalgorithm.finders.IInterfacedFinder; import jetbrains.mps.ide.findusages.model.IResultProvider; import jetbrains.mps.ide.findusages.view.FindUtils; import jetbrains.mps.project.Project; import org.jdom.Element; import org.jetbrains.annotations.NotNull; import org.jetbrains.mps.openapi.model.SNode; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Set; public final class FindersOptions extends BaseOptions { private static final String FINDERS = "finders"; private static final String FINDER = "finder"; private static final String CLASS_NAME = "class_name"; @NotNull private List<String> myFindersClassNames = new ArrayList<String>(); public FindersOptions(Element element, Project project) throws CantLoadSomethingException { read(element, project); } public FindersOptions(String... findersClassNames) { myFindersClassNames = new ArrayList(Arrays.asList(findersClassNames)); } @Override public FindersOptions clone() { FindersOptions result = new FindersOptions(); result.myFindersClassNames.addAll(myFindersClassNames); return result; } /** * Makes a copy of finder options and additionally enables default finders for the node * {@link jetbrains.mps.ide.findusages.findalgorithm.finders.IInterfacedFinder#isUsedByDefault(SNode)}. * * FIXME Due to legacy/transition issues, finders are also consulted for isVisible+isApplicable * ({@code {@link jetbrains.mps.ide.findusages.FindersManager#getAvailableFinders(SNode)}}), although I don't really see a reason for that. * I'd rather add those that answer isUsedByDefault only, and filter isVisible/isApplicable later (in UI). */ public FindersOptions cloneWithDefaultForNode(@NotNull SNode node) { FindersOptions rv = clone(); Set<IInterfacedFinder> availableFinders = FindersManager.getInstance().getAvailableFinders(node); availableFinders.stream().filter(f -> f.isUsedByDefault(node)).forEach(f -> rv.myFindersClassNames.add(f.getClass().getName())); return rv; } @NotNull public List<String> getFindersClassNames() { return myFindersClassNames; } public void setFindersClassNames(@NotNull List<String> findersClassNames) { myFindersClassNames = findersClassNames; } public IResultProvider getResult() { return FindUtils.makeProvider(myFindersClassNames.toArray(new String[myFindersClassNames.size()])); } @Override public void write(Element element, Project project) { Element findersXML = new Element(FINDERS); for (String finderClassName : myFindersClassNames) { Element finderXML = new Element(FINDER); finderXML.setAttribute(CLASS_NAME, finderClassName); findersXML.addContent(finderXML); } element.addContent(findersXML); } @Override public void read(Element element, Project project) { Element findersXML = element.getChild(FINDERS); for (Element finderXML : (List<Element>) findersXML.getChildren(FINDER)) { String finderName = finderXML.getAttribute(CLASS_NAME).getValue(); myFindersClassNames.add(finderName); } } }