public static void showCreateNewRootMenu( @NotNull jetbrains.mps.openapi.editor.EditorContext editorContext, @Nullable Setter<SNode> newRootHandler, @Nullable Condition<SConcept> conceptsFilter) { final EditorCell selectedCell = editorContext.getSelectedCell(); int x = selectedCell.getX(); int y = selectedCell.getY(); if (selectedCell instanceof EditorCell_Label) { y += selectedCell.getHeight(); } Component editorComponent = ((EditorContext) editorContext).getNodeEditorComponent(); final DataContext dataContext = DataManager.getInstance().getDataContext(editorComponent, x, y); final SModel model = selectedCell.getSNode().getModel(); if (conceptsFilter == null) { conceptsFilter = Condition.TRUE_CONDITION; } BaseGroup group = new BaseGroup(""); Set<SLanguage> modelLanguages = new SLanguageHierarchy(SModelOperations.getAllLanguageImports(model)).getExtended(); SLanguage[] languages = modelLanguages.toArray(new SLanguage[modelLanguages.size()]); Arrays.sort(languages, new ToStringComparator()); for (SLanguage language : languages) { boolean hasChildren = false; for (SAbstractConcept ac : language.getConcepts()) { if (!(ac instanceof SConcept)) { continue; } final SConcept concept = (SConcept) ac; if (concept.isRootable() && conceptsFilter.met(concept)) { group.add(new AddNewRootAction(model, concept, newRootHandler)); hasChildren = true; } } if (hasChildren) { group.addSeparator(); } } ListPopup popup = JBPopupFactory.getInstance() .createActionGroupPopup( IdeBundle.message("title.popup.new.element"), group, dataContext, JBPopupFactory.ActionSelectionAid.SPEEDSEARCH, false); // popup.showInBestPositionFor(dataContext); popup.show(new RelativePoint(editorComponent, new Point(x, y))); }
@Override public void doUpdate(AnActionEvent event) { removeAll(); SModel modelDescriptor = event.getData(MPSDataKeys.CONTEXT_MODEL); if (modelDescriptor == null) { setEnabledState(event.getPresentation(), false); return; } if (!(modelDescriptor instanceof EditableSModel) || (((EditableSModel) modelDescriptor).isReadOnly())) { event.getPresentation().setEnabled(false); event.getPresentation().setVisible(false); return; } IScope scope = event.getData(MPSDataKeys.SCOPE); IOperationContext context = event.getData(MPSDataKeys.OPERATION_CONTEXT); boolean isStubModel = SModelStereotype.isStubModelStereotype(SModelStereotype.getStereotype(modelDescriptor)); if (scope == null || context == null || isStubModel) { setEnabledState(event.getPresentation(), false); return; } boolean inEditor = event.getData(MPSDataKeys.LOGICAL_VIEW_SELECTION_SIZE) == null; if (!inEditor) { Integer selectedItemsCount = event.getData(MPSDataKeys.LOGICAL_VIEW_SELECTION_SIZE); boolean singleItemSelected = selectedItemsCount != null && selectedItemsCount == 1; if (!singleItemSelected) { setEnabledState(event.getPresentation(), false); return; } TreeNode treeNode = event.getData(MPSDataKeys.LOGICAL_VIEW_NODE); if (!(treeNode instanceof PackageNode)) { myPackage = null; } else { final PackageNode node = (PackageNode) treeNode; myPackage = node.getPackage(); } } else { SNode node = event.getData(MPSDataKeys.NODE); myPackage = null; if (node != null) { SNode root = node.getContainingRoot(); myPackage = SNodeAccessUtil.getProperty(root, SNodeUtil.property_BaseConcept_virtualPackage); } } setEnabledState(event.getPresentation(), true); List<Language> modelLanguages = SModelOperations.getLanguages(modelDescriptor, scope); LanguageAspect aspect = Language.getModelAspect(modelDescriptor); if (aspect != null) { SModuleReference ref = aspect.getMainLanguage(); Language lang = scope.getLanguage(ref); if (lang != null) { modelLanguages.remove(lang); for (SNode conceptDeclaration : lang.getConceptDeclarations()) { if (ModelConstraintsManager.canBeRoot( context, NameUtil.nodeFQName(conceptDeclaration), modelDescriptor)) { add( new NewRootNodeAction( new jetbrains.mps.smodel.SNodePointer(conceptDeclaration), modelDescriptor)); } } addSeparator(); } } Collections.sort(modelLanguages, new ToStringComparator()); List<Language> languagesWithRoots = new ArrayList<Language>(); for (final Language language : modelLanguages) { for (SNode conceptDeclaration : language.getConceptDeclarations()) { if (ModelConstraintsManager.canBeRoot( context, NameUtil.nodeFQName(conceptDeclaration), modelDescriptor)) { languagesWithRoots.add(language); break; } } } boolean plain = myPlain || (languagesWithRoots.size() == 1 && aspect == null); for (final Language language : languagesWithRoots) { String name = language.getModuleName(); Icon icon = IconManager.getIconForNamespace(language.getModuleName()); BaseGroup langRootsGroup; if (!plain) { langRootsGroup = new BaseGroup(NameUtil.compactNamespace(name), name, icon); langRootsGroup.setPopup(true); } else { langRootsGroup = this; } for (SNode conceptDeclaration : language.getConceptDeclarations()) { if (ModelConstraintsManager.getInstance() .canBeRoot(context, NameUtil.nodeFQName(conceptDeclaration), modelDescriptor)) { langRootsGroup.add( new NewRootNodeAction( new jetbrains.mps.smodel.SNodePointer(conceptDeclaration), modelDescriptor)); } } if (!plain) { this.add(langRootsGroup); } else { this.addSeparator(); } } if (getChildrenCount() == 0) { add( ActionManager.getInstance() .getAction( "jetbrains.mps.ide.editor.actions.AddLanguageImport_Action" /* FIXME AddLanguageImport_Action.class.getName()*/)); } }