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 java.util.List;
import org.jetbrains.mps.openapi.module.SModule;
import jetbrains.mps.internal.collections.runtime.MapSequence;
import jetbrains.mps.internal.collections.runtime.Sequence;
import jetbrains.mps.internal.collections.runtime.IWhereFilter;
import jetbrains.mps.project.Solution;
import jetbrains.mps.smodel.Language;
import jetbrains.mps.project.DevKit;
import jetbrains.mps.smodel.Generator;
import jetbrains.mps.project.MPSProject;
import jetbrains.mps.workbench.dialogs.DeleteDialog;
import com.intellij.util.ui.UIUtil;
import jetbrains.mps.internal.collections.runtime.IVisitor;
import com.intellij.openapi.ui.Messages;
import org.jetbrains.mps.openapi.module.ModelAccess;
import jetbrains.mps.module.ModuleDeleteHelper;
public class DeleteModules_Action extends BaseAction {
private static final Icon ICON = null;
public DeleteModules_Action() {
super("Delete Module...", "", ICON);
this.setIsAlwaysVisible(true);
this.setExecuteOutsideCommand(true);
}
@Override
public boolean isDumbAware() {
return true;
}
@Override
public void doUpdate(@NotNull AnActionEvent event, final Map<String, Object> _params) {
boolean isApplicable = ((List<SModule>) MapSequence.fromMap(_params).get("modules")).size() != 0 && !(Sequence.fromIterable(((Iterable<SModule>) ((List<SModule>) MapSequence.fromMap(_params).get("modules")))).any(new IWhereFilter<SModule>() {
public boolean accept(SModule it) {
return it.isPackaged() || it.isReadOnly() || !((it instanceof Solution || it instanceof Language || it instanceof DevKit));
}
}));
event.getPresentation().setEnabled(isApplicable);
event.getPresentation().setVisible(isApplicable);
if (isApplicable) {
if (((List<SModule>) MapSequence.fromMap(_params).get("modules")).size() > 1) {
event.getPresentation().setText("&Delete Modules...", true);
} else {
// If isApplicable and !(modules > 1) => modules == 1
SModule module = ((List<SModule>) MapSequence.fromMap(_params).get("modules")).get(0);
if (module instanceof Solution) {
event.getPresentation().setText("&Delete Solution...", true);
} else if (module instanceof Language) {
event.getPresentation().setText("&Delete Language...", true);
} else if (module instanceof DevKit) {
event.getPresentation().setText("&Delete DevKit...", true);
} else if (module instanceof Generator) {
// For fututre implementation
event.getPresentation().setText("&Delete Generator...", true);
} else {
event.getPresentation().setText("&Delete Module...", true);
}
}
}
}
@Override
protected boolean collectActionData(AnActionEvent event, final Map<String, Object> _params) {
if (!(super.collectActionData(event, _params))) {
return false;
}
{
MPSProject p = event.getData(MPSCommonDataKeys.MPS_PROJECT);
MapSequence.fromMap(_params).put("project", p);
if (p == null) {
return false;
}
}
{
List<SModule> p = event.getData(MPSCommonDataKeys.MODULES);
MapSequence.fromMap(_params).put("modules", p);
if (p == null) {
return false;
}
}
return true;
}
@Override
public void doExecute(@NotNull final AnActionEvent event, final Map<String, Object> _params) {
String message = "<html>Are you sure you want to delete selected modules?<br>This operation is not undoable.</html>";
final DeleteDialog.DeleteOption filesOption = new DeleteDialog.DeleteOption(UIUtil.replaceMnemonicAmpersand("Delete &Files"), false, true);
DeleteDialog dialog = new DeleteDialog(((MPSProject) MapSequence.fromMap(_params).get("project")), "Delete Modules", message, filesOption);
dialog.show();
if (!(dialog.isOK())) {
return;
}
if (!(filesOption.selected) && Sequence.fromIterable(((Iterable<SModule>) ((List<SModule>) MapSequence.fromMap(_params).get("modules")))).any(new IWhereFilter<SModule>() {
public boolean accept(SModule it) {
return !(((MPSProject) MapSequence.fromMap(_params).get("project")).isProjectModule(it));
}
})) {
final StringBuilder builder = new StringBuilder();
Sequence.fromIterable(((Iterable<SModule>) ((List<SModule>) MapSequence.fromMap(_params).get("modules")))).where(new IWhereFilter<SModule>() {
public boolean accept(SModule it) {
return !(((MPSProject) MapSequence.fromMap(_params).get("project")).isProjectModule(it));
}
}).visitAll(new IVisitor<SModule>() {
public void visit(SModule it) {
builder.append("<br>").append(it.getModuleName());
}
});
Messages.showWarningDialog(((MPSProject) MapSequence.fromMap(_params).get("project")).getProject(), String.format("<html>Non-project modules can only be deleted with files deletion enabled:%s<html>", builder), "Can't delete module");
return;
}
ModelAccess modelAccess = ((MPSProject) MapSequence.fromMap(_params).get("project")).getRepository().getModelAccess();
// While don't support undo no need for command here
modelAccess.runWriteAction(new Runnable() {
public void run() {
new ModuleDeleteHelper(((MPSProject) MapSequence.fromMap(_params).get("project"))).deleteModules(((List<SModule>) MapSequence.fromMap(_params).get("modules")), false, filesOption.selected);
}
});
}
}