/* * 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.ui.tree.module; import com.intellij.icons.AllIcons.Nodes; import jetbrains.mps.ide.icons.IdeIcons; import jetbrains.mps.ide.ui.tree.MPSTreeNode; import jetbrains.mps.ide.ui.tree.SortUtil; import jetbrains.mps.ide.ui.tree.TextTreeNode; import jetbrains.mps.ide.ui.tree.smodel.SModelReferenceTreeNode; import jetbrains.mps.ide.ui.tree.smodel.SModelTreeNode; import jetbrains.mps.ide.ui.tree.smodel.SModelTreeNode.LongModelNameText; import jetbrains.mps.ide.ui.tree.smodel.SModelTreeNode.ShortModelNameText; import jetbrains.mps.project.Project; import jetbrains.mps.smodel.Generator; import jetbrains.mps.smodel.Language; import jetbrains.mps.smodel.ModuleRepositoryFacade; import jetbrains.mps.smodel.language.LanguageAspectSupport; import jetbrains.mps.util.NameUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.mps.openapi.model.SModel; import org.jetbrains.mps.openapi.module.SModule; import org.jetbrains.mps.openapi.module.SModuleReference; import java.util.List; public class ProjectLanguageTreeNode extends ProjectModuleTreeNode { private Project myProject; private boolean myShortNameOnly; private boolean myInitialized; protected ProjectLanguageTreeNode(@NotNull Language language, Project project, boolean shortNameOnly) { super(language); myShortNameOnly = shortNameOnly; myProject = project; setNodeIdentifier(language.getModuleReference().toString()); setIcon(IdeIcons.LANGUAGE_ICON); } @Override public boolean isInitialized() { return myInitialized; } @Override protected void doInit() { ModuleNodeChildrenProvider childrenProvider = getAncestor(ModuleNodeChildrenProvider.class); if (childrenProvider == null || !childrenProvider.populate(this, getModule())) { populate(); } myInitialized = true; } @NotNull @Override public Language getModule() { return (Language) super.getModule(); } @Override public String getModuleText() { String languageUID = getModule().getModuleName(); if (myShortNameOnly) { languageUID = NameUtil.shortNameFromLongName(languageUID); } return languageUID; } private void populate() { ShortModelNameText textSource = new ShortModelNameText(); for (SModel m : LanguageAspectSupport.getAspectModels(getModule())) { add(new SModelTreeNode(m, textSource)); } // language accessory models if (getModule().getAccessoryModels().size() > 0) { TextTreeNode accessories = new AccessoriesModelTreeNode(this); List<SModel> sortedModels = SortUtil.sortModels(getModule().getAccessoryModels()); LongModelNameText modelText = new LongModelNameText(); for (SModel model : sortedModels) { SModule m = model.getModule(); boolean currentModule = m == null || m == getModule(); if (!currentModule) { accessories.add(new SModelReferenceTreeNode(model, myProject)); } else { accessories.add(new SModelTreeNode(model, modelText)); } } this.add(accessories); } for (Generator generator : getModule().getGenerators()) { MPSTreeNode generatorNode = createFor(myProject, generator); add(generatorNode); } TextTreeNode languageRuntime = new RuntimeModulesTreeNode(); for (SModuleReference mr : getModule().getRuntimeModulesReferences()) { SModule m = ModuleRepositoryFacade.getInstance().getModule(mr); if (m == null || m == getModule()) { continue; } languageRuntime.add(createFor(myProject, m)); } add(languageRuntime); if (getModule().getUtilModels().size() > 0) { TextTreeNode utilModels = new SModelGroupTreeNode(); new SModelsSubtree(utilModels).create(getModule().getUtilModels()); this.add(utilModels); } TextTreeNode allModels = new AllModelsTreeNode(); allModels.setIcon(Nodes.ModuleGroup); new SModelsSubtree(allModels, false, false).create(getModule()); add(allModels); } /** * need a dedicated instance as long as ProjectTreeFindHelper uses instanceof to decide whether to descend a node or not. */ public static class AllModelsTreeNode extends TextTreeNode { /*package*/ AllModelsTreeNode() { super("all models"); } } }