package jetbrains.mps.ide.actions; /*Generated by MPS */ import jetbrains.mps.workbench.action.BaseAction; import javax.swing.Icon; import org.jetbrains.annotations.NotNull; import com.intellij.openapi.actionSystem.AnActionEvent; import java.util.Map; import jetbrains.mps.util.ModuleNameUtil; import org.jetbrains.mps.openapi.module.SModule; import jetbrains.mps.project.MPSProject; import org.jetbrains.mps.openapi.persistence.ModelRoot; import com.intellij.openapi.ui.Messages; import jetbrains.mps.project.StandaloneMPSProject; import jetbrains.mps.ide.newModuleDialogs.AbstractModuleCreationDialog; import jetbrains.mps.ide.newModuleDialogs.CloneModuleDialog; import jetbrains.mps.project.AbstractModule; import com.intellij.openapi.application.ApplicationManager; import jetbrains.mps.ide.projectPane.ProjectPane; import com.intellij.openapi.application.ModalityState; import jetbrains.mps.internal.collections.runtime.IMapping; import jetbrains.mps.internal.collections.runtime.MapSequence; import java.util.HashMap; import jetbrains.mps.internal.collections.runtime.Sequence; import jetbrains.mps.extapi.persistence.CopyableModelRoot; import jetbrains.mps.project.Solution; import jetbrains.mps.smodel.Language; public class CloneModule_Action extends BaseAction { private static final Icon ICON = null; public CloneModule_Action() { super("Clone Module", "", ICON); this.setIsAlwaysVisible(false); this.setExecuteOutsideCommand(false); } @Override public boolean isDumbAware() { return true; } @Override public void doUpdate(@NotNull AnActionEvent event, final Map<String, Object> _params) { boolean isApplicable = event.getData(MPSCommonDataKeys.TREE_SELECTION_SIZE) == 1 && CloneModule_Action.this.supportsClonning(event.getData(MPSCommonDataKeys.MODULE), event); event.getPresentation().setText("Clone " + ModuleNameUtil.getModuleType(event.getData(MPSCommonDataKeys.MODULE))); event.getPresentation().setEnabledAndVisible(isApplicable); } @Override protected boolean collectActionData(AnActionEvent event, final Map<String, Object> _params) { if (!(super.collectActionData(event, _params))) { return false; } { SModule p = event.getData(MPSCommonDataKeys.MODULE); if (p == null) { return false; } } { Integer p = event.getData(MPSCommonDataKeys.TREE_SELECTION_SIZE); if (p == null) { return false; } } { MPSProject p = event.getData(MPSCommonDataKeys.MPS_PROJECT); if (p == null) { return false; } } return true; } @Override public void doExecute(@NotNull final AnActionEvent event, final Map<String, Object> _params) { Map<ModelRoot, String> nonCloneable = CloneModule_Action.this.collectCloneErrorMessages(event.getData(MPSCommonDataKeys.MODULE).getModelRoots(), event); if (!(nonCloneable.isEmpty())) { Messages.showErrorDialog(CloneModule_Action.this.getErrorMessage(nonCloneable, event), "Module can't be cloned"); return; } String virtualFolder = as_i0xx9i_a0a0f0g(event.getData(MPSCommonDataKeys.MPS_PROJECT), StandaloneMPSProject.class).getFolderFor(event.getData(MPSCommonDataKeys.MODULE)); final AbstractModuleCreationDialog dialog = new CloneModuleDialog(event.getData(MPSCommonDataKeys.MPS_PROJECT), virtualFolder, as_i0xx9i_a2a0a7a6(event.getData(MPSCommonDataKeys.MODULE), AbstractModule.class)); ApplicationManager.getApplication().invokeLater(new Runnable() { public void run() { dialog.show(); SModule result = dialog.getModule(); if (result == null) { return; } ProjectPane projectPane = ProjectPane.getInstance(event.getData(MPSCommonDataKeys.MPS_PROJECT)); projectPane.selectModule(result, false); } }, ModalityState.current()); } private String getErrorMessage(Map<ModelRoot, String> roots, final AnActionEvent event) { StringBuilder sb = new StringBuilder(); sb.append("<html><body>"); sb.append("Can't clone module with non-cloneable model roots: \n"); sb.append("<ul>"); for (IMapping<ModelRoot, String> root : MapSequence.fromMap(roots)) { sb.append("<li>"); sb.append(root.key()); sb.append(" - "); sb.append(root.value()); sb.append("\n"); } sb.append("</ul>"); sb.append("</body></html>"); return sb.toString(); } private Map<ModelRoot, String> collectCloneErrorMessages(Iterable<ModelRoot> modelRoots, final AnActionEvent event) { Map<ModelRoot, String> result = new HashMap<ModelRoot, String>(); for (ModelRoot modelRoot : Sequence.fromIterable(modelRoots)) { if (!(modelRoot instanceof CopyableModelRoot)) { result.put(modelRoot, "Cloning for this model root is not implemented"); } } return result; } private boolean supportsClonning(SModule module, final AnActionEvent event) { return !(module.isPackaged()) && (module instanceof Solution || module instanceof Language); } private static <T> T as_i0xx9i_a0a0f0g(Object o, Class<T> type) { return (type.isInstance(o) ? (T) o : null); } private static <T> T as_i0xx9i_a2a0a7a6(Object o, Class<T> type) { return (type.isInstance(o) ? (T) o : null); } }