/* * 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.projectPane.favorites; import jetbrains.mps.extapi.model.TransientSModel; import jetbrains.mps.extapi.module.TransientSModule; import jetbrains.mps.ide.ui.tree.module.ProjectModuleTreeNode; import jetbrains.mps.ide.ui.tree.smodel.SModelTreeNode; import jetbrains.mps.ide.ui.tree.smodel.SNodeTreeNode; import org.jetbrains.mps.openapi.model.SModel; import org.jetbrains.mps.openapi.model.SNode; import org.jetbrains.mps.openapi.module.SModule; import javax.swing.tree.TreeNode; import java.util.ArrayList; import java.util.Collection; import java.util.List; /** * Find values one could add to Favourites view. * Configurable to filter out particular elements (e.g. coming from transient models) * @author Artem Tikhomirov * @since 3.4 */ public class TreeNodeValueExtractor { private boolean myAcceptTransients = false; public TreeNodeValueExtractor() { } /** * Controls whether elements from transient models are filtered out. * Generally, it doesn't make sense to add transient elements into Favourites view. * * @param acceptTransients by default, elements from transient models/modules are ignored * @return <code>this</code> for convenience */ public TreeNodeValueExtractor allowTransients(boolean acceptTransients) { myAcceptTransients = acceptTransients; return this; } /** * @return empty list if there are no elements to create favorites entries from */ public List<Object> getObjects(Collection<TreeNode> treeNodes) { List<Object> result = new ArrayList<Object>(); for (TreeNode treeNode : treeNodes) { if (treeNode instanceof SNodeTreeNode) { final SNode node = ((SNodeTreeNode) treeNode).getSNode(); if (isAccepted(node.getModel())) { result.add(node.getReference()); } } else if (treeNode instanceof SModelTreeNode) { final SModel model = ((SModelTreeNode) treeNode).getModel(); if (isAccepted(model)) { result.add(model.getReference()); } } else if (treeNode instanceof ProjectModuleTreeNode) { final SModule module = ((ProjectModuleTreeNode) treeNode).getModule(); if (isAccepted(module)) { result.add(module.getModuleReference()); } } } // getXReference() are non-null, no null values in result return result; } private boolean isAccepted(SModel model) { return myAcceptTransients || !(model instanceof TransientSModel); } private boolean isAccepted(SModule module) { return myAcceptTransients || !(module instanceof TransientSModule); } }