package jetbrains.mps.ide.devkit.actions; /*Generated by MPS */ import jetbrains.mps.workbench.action.BaseAction; import javax.swing.Icon; import com.intellij.openapi.actionSystem.AnActionEvent; import java.util.Map; import java.awt.Frame; import jetbrains.mps.ide.actions.MPSCommonDataKeys; import jetbrains.mps.internal.collections.runtime.MapSequence; import org.jetbrains.mps.openapi.module.SModule; import jetbrains.mps.project.MPSProject; import org.jetbrains.annotations.NotNull; import jetbrains.mps.smodel.Language; import java.util.List; import org.jetbrains.mps.openapi.model.SModelReference; import jetbrains.mps.internal.collections.runtime.ListSequence; import java.util.ArrayList; import org.jetbrains.mps.openapi.module.SRepository; import org.jetbrains.mps.openapi.module.ModelAccess; import org.jetbrains.mps.openapi.model.SModel; import jetbrains.mps.FilteredGlobalScope; import jetbrains.mps.internal.collections.runtime.Sequence; import jetbrains.mps.internal.collections.runtime.ISelector; import jetbrains.mps.ide.ui.dialogs.properties.choosers.CommonChoosers; import jetbrains.mps.baseLanguage.closures.runtime.Wrappers; import jetbrains.mps.project.dependency.VisibilityUtil; import javax.swing.JOptionPane; import jetbrains.mps.project.structure.modules.LanguageDescriptor; public class AddAccessoryModel_Action extends BaseAction { private static final Icon ICON = null; public AddAccessoryModel_Action() { super("Add Accessory Model", "", ICON); this.setIsAlwaysVisible(false); this.setExecuteOutsideCommand(true); } @Override public boolean isDumbAware() { return true; } @Override protected boolean collectActionData(AnActionEvent event, final Map<String, Object> _params) { if (!(super.collectActionData(event, _params))) { return false; } { Frame p = event.getData(MPSCommonDataKeys.FRAME); MapSequence.fromMap(_params).put("frame", p); if (p == null) { return false; } } { SModule p = event.getData(MPSCommonDataKeys.CONTEXT_MODULE); MapSequence.fromMap(_params).put("module", p); if (p == null) { return false; } } { MPSProject p = event.getData(MPSCommonDataKeys.MPS_PROJECT); MapSequence.fromMap(_params).put("project", p); if (p == null) { return false; } } return true; } @Override public void doExecute(@NotNull final AnActionEvent event, final Map<String, Object> _params) { final Language language = ((Language) ((SModule) MapSequence.fromMap(_params).get("module"))); final List<SModelReference> models = ListSequence.fromList(new ArrayList<SModelReference>()); final SRepository repository = ((MPSProject) MapSequence.fromMap(_params).get("project")).getRepository(); ModelAccess modelAccess = repository.getModelAccess(); modelAccess.runReadAction(new Runnable() { public void run() { // XXX perhaps, shall use scope based on project's repository Iterable<SModel> descriptors = new FilteredGlobalScope().getModels(); ListSequence.fromList(models).addSequence(Sequence.fromIterable(descriptors).select(new ISelector<SModel, SModelReference>() { public SModelReference select(SModel it) { return it.getReference(); } })); } }); final SModelReference result = CommonChoosers.showModelChooser(((MPSProject) MapSequence.fromMap(_params).get("project")), null, models); if (result == null) { return; } final Wrappers._boolean visibleFromModule = new Wrappers._boolean(true); modelAccess.runReadAction(new Runnable() { public void run() { SModel md = result.resolve(repository); visibleFromModule.value = VisibilityUtil.isVisible(language, md); } }); final boolean importModuleDependency; if (!(visibleFromModule.value)) { int res = JOptionPane.showConfirmDialog(((Frame) MapSequence.fromMap(_params).get("frame")), "<html>Model <b>" + result.getName() + "</b> is added to accessories</html>\n\n" + "Do you want to automatically the module add to dependency?", "Add Dependency", JOptionPane.YES_NO_OPTION); importModuleDependency = res == JOptionPane.YES_OPTION; } else { importModuleDependency = false; } modelAccess.executeCommand(new Runnable() { public void run() { // see MPS-18743 repository.saveAll(); LanguageDescriptor descriptor; descriptor = language.getModuleDescriptor(); descriptor.getAccessoryModels().add(result); language.setModuleDescriptor(descriptor); if (importModuleDependency) { SModel md = result.resolve(repository); language.addDependency(md.getModule().getModuleReference(), false); } language.save(); } }); } }