/* * 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 com.intellij.openapi.actionSystem.ActionManager; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.DefaultActionGroup; import jetbrains.mps.ide.actions.MPSCommonDataKeys; import jetbrains.mps.ide.icons.IconManager; import jetbrains.mps.ide.ui.tree.smodel.PackageNode; import jetbrains.mps.smodel.Language; import jetbrains.mps.smodel.LanguageAspect; import jetbrains.mps.smodel.MPSModuleRepository; import jetbrains.mps.smodel.SModelOperations; import jetbrains.mps.smodel.SModelStereotype; import jetbrains.mps.smodel.SNodeUtil; import jetbrains.mps.smodel.adapter.MetaAdapterByDeclaration; import jetbrains.mps.smodel.constraints.ModelConstraints; import jetbrains.mps.smodel.language.LanguageAspectSupport; import jetbrains.mps.util.NameUtil; import jetbrains.mps.util.ToStringComparator; import jetbrains.mps.workbench.action.BaseGroup; import org.jetbrains.mps.openapi.language.SAbstractConcept; import org.jetbrains.mps.openapi.language.SLanguage; import org.jetbrains.mps.openapi.model.EditableSModel; import org.jetbrains.mps.openapi.model.SModel; import org.jetbrains.mps.openapi.model.SNode; import org.jetbrains.mps.openapi.model.SNodeAccessUtil; import org.jetbrains.mps.openapi.module.SModuleReference; import javax.swing.Icon; import javax.swing.tree.TreeNode; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; public class CreateRootNodeGroup extends BaseGroup { private String myPackage; public CreateRootNodeGroup() { super("Create Root Node"); setPopup(false); } @Override public void doUpdate(AnActionEvent event) { removeAll(); SModel targetModel = event.getData(MPSCommonDataKeys.CONTEXT_MODEL); if (targetModel == null) { disable(event.getPresentation()); return; } if (!(targetModel instanceof EditableSModel) || targetModel.isReadOnly()) { event.getPresentation().setEnabled(false); event.getPresentation().setVisible(false); return; } boolean isStubModel = SModelStereotype.isStubModelStereotype(SModelStereotype.getStereotype(targetModel)); if (isStubModel) { disable(event.getPresentation()); return; } boolean inEditor = event.getData(MPSCommonDataKeys.TREE_SELECTION_SIZE) == null; if (!inEditor) { Integer selectedItemsCount = event.getData(MPSCommonDataKeys.TREE_SELECTION_SIZE); boolean singleItemSelected = selectedItemsCount != null && selectedItemsCount == 1; if (!singleItemSelected) { disable(event.getPresentation()); return; } TreeNode treeNode = event.getData(MPSCommonDataKeys.TREE_NODE); if (!(treeNode instanceof PackageNode)) { myPackage = null; } else { final PackageNode node = (PackageNode) treeNode; myPackage = node.getPackage(); } } else { SNode node = event.getData(MPSCommonDataKeys.NODE); myPackage = null; if (node != null) { SNode root = node.getContainingRoot(); myPackage = SNodeAccessUtil.getProperty(root, SNodeUtil.property_BaseConcept_virtualPackage); } } enable(event.getPresentation()); Collection<SLanguage> mainLanguages = LanguageAspectSupport.getMainLanguages(targetModel); for (SLanguage mainLang: mainLanguages){ addActionsForRoots(mainLang, targetModel, this); } addSeparator(); Collection<SLanguage> additionalLanguages = LanguageAspectSupport.getAdditionalLanguages(targetModel); additionalLanguages.removeAll(mainLanguages); for (SLanguage addLang: additionalLanguages){ String name = addLang.getQualifiedName(); DefaultActionGroup langGroup = new DefaultActionGroup(NameUtil.compactNamespace(name), true); addActionsForRoots(addLang, targetModel, langGroup); add(langGroup); } addSeparator(); List<SLanguage> modelLanguages = new ArrayList<SLanguage>(SModelOperations.getAllLanguageImports(targetModel)); modelLanguages.removeAll(mainLanguages); mainLanguages.removeAll(additionalLanguages); Collections.sort(modelLanguages, new ToStringComparator()); ArrayList<DefaultActionGroup> byLanguage = new ArrayList<DefaultActionGroup>(); for (SLanguage language : modelLanguages) { String name = language.getQualifiedName(); DefaultActionGroup langRootsGroup = new DefaultActionGroup(NameUtil.compactNamespace(name), true); addActionsForRoots(language, targetModel, langRootsGroup); if (langRootsGroup.getChildrenCount() > 0) { byLanguage.add(langRootsGroup); } } final boolean plain = byLanguage.size() == 1 && mainLanguages.isEmpty(); for (DefaultActionGroup g : byLanguage) { if (plain) { addSeparator(); addAll(g.getChildren(null)); } else { this.add(g); } } if (getChildrenCount() == 0) { add(ActionManager.getInstance().getAction( "jetbrains.mps.ide.editor.actions.AddLanguageImport_Action"/* FIXME AddLanguageImport_Action.class.getName()*/)); } } private void addActionsForRoots(SLanguage from, SModel target, DefaultActionGroup group) { for (SAbstractConcept c : from.getConcepts()) { if (!ModelConstraints.canBeRoot(c, target)) continue; if (CreateRootFilterEP.getInstance().shouldBeRemoved(c)) continue; group.add(new NewRootNodeAction(c, target, myPackage)); } } }