package jetbrains.mps.ide.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 jetbrains.mps.internal.collections.runtime.MapSequence; import org.jetbrains.mps.openapi.model.SModel; import jetbrains.mps.extapi.model.TransientSModel; import org.jetbrains.mps.openapi.module.SModule; import jetbrains.mps.smodel.Language; import jetbrains.mps.smodel.language.LanguageAspectSupport; import org.jetbrains.annotations.NotNull; import org.jetbrains.mps.openapi.model.EditableSModel; import jetbrains.mps.project.MPSProject; import org.jetbrains.mps.openapi.model.SModelReference; import java.util.List; import org.jetbrains.mps.openapi.module.SModuleReference; import jetbrains.mps.internal.collections.runtime.ListSequence; import java.util.ArrayList; import jetbrains.mps.ide.ui.dialogs.properties.choosers.CommonChoosers; import jetbrains.mps.refactoring.participant.RefactoringParticipant; import jetbrains.mps.smodel.structure.ExtensionPoint; import jetbrains.mps.refactoring.participant.MoveModelRefactoringParticipant; import jetbrains.mps.ide.platform.actions.core.RefactoringProcessor; import jetbrains.mps.baseLanguage.closures.runtime._FunctionTypes; import jetbrains.mps.refactoring.participant.RefactoringSession; import jetbrains.mps.baseLanguage.closures.runtime.Wrappers; import jetbrains.mps.ide.dialogs.project.creation.NewModelDialog; import jetbrains.mps.project.AbstractModule; import jetbrains.mps.workbench.actions.model.DeleteModelHelper; import java.util.HashMap; public class MoveModel_Action extends BaseAction { private static final Icon ICON = null; public MoveModel_Action() { super("Move Model", "", ICON); this.setIsAlwaysVisible(false); this.setExecuteOutsideCommand(true); } @Override public boolean isDumbAware() { return true; } @Override public boolean isApplicable(AnActionEvent event, final Map<String, Object> _params) { if (((Integer) MapSequence.fromMap(_params).get("selSize")) != 1) { return false; } if (((SModel) MapSequence.fromMap(_params).get("model")) instanceof TransientSModel) { return false; } SModule module = ((SModel) MapSequence.fromMap(_params).get("model")).getModule(); if (module instanceof Language) { return !((LanguageAspectSupport.isAspectModel(((SModel) MapSequence.fromMap(_params).get("model"))))); } else { return true; } } @Override public void doUpdate(@NotNull AnActionEvent event, final Map<String, Object> _params) { this.setEnabledState(event.getPresentation(), this.isApplicable(event, _params)); } @Override protected boolean collectActionData(AnActionEvent event, final Map<String, Object> _params) { if (!(super.collectActionData(event, _params))) { return false; } { SModel p = event.getData(MPSCommonDataKeys.MODEL); MapSequence.fromMap(_params).put("model", p); if (p == null) { return false; } if (!(p instanceof EditableSModel) || p.isReadOnly()) { return false; } } { MPSProject p = event.getData(MPSCommonDataKeys.MPS_PROJECT); MapSequence.fromMap(_params).put("mpsProject", p); if (p == null) { return false; } } { Integer p = event.getData(MPSCommonDataKeys.TREE_SELECTION_SIZE); MapSequence.fromMap(_params).put("selSize", p); if (p == null) { return false; } } return true; } @Override public void doExecute(@NotNull final AnActionEvent event, final Map<String, Object> _params) { final SModelReference modelReference = ((SModel) MapSequence.fromMap(_params).get("model")).getReference(); final List<SModuleReference> modules = ListSequence.fromList(new ArrayList<SModuleReference>()); ((MPSProject) MapSequence.fromMap(_params).get("mpsProject")).getRepository().getModelAccess().runReadAction(new Runnable() { public void run() { for (SModule module : ListSequence.fromList(((MPSProject) MapSequence.fromMap(_params).get("mpsProject")).getProjectModulesWithGenerators())) { ListSequence.fromList(modules).addElement(module.getModuleReference()); } } }); String title = event.getPresentation().getText(); final SModuleReference selectedModule = CommonChoosers.showModuleChooser(((MPSProject) MapSequence.fromMap(_params).get("mpsProject")), title, modules); if (selectedModule == null) { return; } Iterable<? extends RefactoringParticipant<?, ?, SModel, SModel>> participants = new ExtensionPoint<MoveModelRefactoringParticipant<?, ?>>("jetbrains.mps.refactoring.participant.MoveModelParticipantEP").getObjects(); RefactoringProcessor.performRefactoringUserInteractive(((MPSProject) MapSequence.fromMap(_params).get("mpsProject")), title, participants, ListSequence.fromListAndArray(new ArrayList<SModel>(), ((SModel) MapSequence.fromMap(_params).get("model"))), new _FunctionTypes._return_P2_E0<Map<SModel, SModel>, Iterable<RefactoringParticipant.ParticipantApplied<?, ?, SModel, SModel, SModel, SModel>>, RefactoringSession>() { public Map<SModel, SModel> invoke(Iterable<RefactoringParticipant.ParticipantApplied<?, ?, SModel, SModel, SModel, SModel>> changes, RefactoringSession refactoringSession) { final Wrappers._T<NewModelDialog> dialog = new Wrappers._T<NewModelDialog>(); ((MPSProject) MapSequence.fromMap(_params).get("mpsProject")).getRepository().getModelAccess().runReadAction(new Runnable() { public void run() { dialog.value = new NewModelDialog(((MPSProject) MapSequence.fromMap(_params).get("mpsProject")), (AbstractModule) selectedModule.resolve(((MPSProject) MapSequence.fromMap(_params).get("mpsProject")).getRepository()), ((SModel) MapSequence.fromMap(_params).get("model"))); } }); dialog.value.show(); EditableSModel newModel = dialog.value.getResult(); if (newModel == null) { return null; } UpdateDependentModelsRefactoringParticipant.updateUsages(newModel, modelReference, newModel.getReference()); DeleteModelHelper.delete(((SModel) MapSequence.fromMap(_params).get("model")).getModule(), ((SModel) MapSequence.fromMap(_params).get("model")), true); Map<SModel, SModel> m = MapSequence.<SModel, SModel>fromMapAndKeysArray(new HashMap<SModel, SModel>(), ((SModel) MapSequence.fromMap(_params).get("model"))).withValues(newModel); return m; } }); } }