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;
}
});
}
}