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