package jetbrains.mps.vcs.plugin;
/*Generated by MPS */
import jetbrains.mps.workbench.action.BaseAction;
import javax.swing.Icon;
import com.intellij.openapi.actionSystem.AnActionEvent;
import java.util.Map;
import java.util.List;
import org.jetbrains.mps.openapi.model.SModel;
import com.intellij.openapi.actionSystem.CommonDataKeys;
import jetbrains.mps.make.IMakeService;
import jetbrains.mps.internal.collections.runtime.ListSequence;
import jetbrains.mps.util.NameUtil;
import org.jetbrains.annotations.NotNull;
import jetbrains.mps.project.MPSProject;
import jetbrains.mps.ide.actions.MPSCommonDataKeys;
import com.intellij.openapi.vfs.VirtualFile;
import jetbrains.mps.make.resources.IResource;
import jetbrains.mps.smodel.ModelAccessHelper;
import jetbrains.mps.util.Computable;
import jetbrains.mps.internal.collections.runtime.IListSequence;
import jetbrains.mps.ide.generator.GenerationCheckHelper;
import jetbrains.mps.internal.collections.runtime.Sequence;
import jetbrains.mps.smodel.resources.ModelsToResources;
import java.util.ArrayList;
import jetbrains.mps.make.MakeSession;
import jetbrains.mps.ide.make.DefaultMakeMessageHandler;
import jetbrains.mps.smodel.SModelFileTracker;
import jetbrains.mps.internal.collections.runtime.IWhereFilter;
import jetbrains.mps.internal.collections.runtime.ISelector;
import jetbrains.mps.ide.vfs.VirtualFileUtils;
import jetbrains.mps.generator.GenerationFacade;
public class MakeOrRebuildModelsFromChangeList_Action extends BaseAction {
private static final Icon ICON = null;
private boolean rebuild;
public MakeOrRebuildModelsFromChangeList_Action(boolean rebuild_par) {
super("Make Models", "", ICON);
this.rebuild = rebuild_par;
this.setIsAlwaysVisible(false);
this.setExecuteOutsideCommand(true);
}
@Override
public boolean isDumbAware() {
return true;
}
@Override
public boolean isApplicable(AnActionEvent event, final Map<String, Object> _params) {
List<SModel> models = MakeOrRebuildModelsFromChangeList_Action.this.getModels2Build(event.getData(CommonDataKeys.VIRTUAL_FILE_ARRAY), event);
if (IMakeService.INSTANCE.get().isSessionActive() || ListSequence.fromList(models).isEmpty()) {
return false;
}
String what = (ListSequence.fromList(models).count() == 1 ? "model " + NameUtil.compactNamespace(ListSequence.fromList(models).first().getModelName()) : "selected models");
String fmt = (MakeOrRebuildModelsFromChangeList_Action.this.rebuild ? "Rebuild %s" : "Make %s");
event.getPresentation().setText(String.format(fmt, what));
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;
}
{
MPSProject p = event.getData(MPSCommonDataKeys.MPS_PROJECT);
if (p == null) {
return false;
}
}
{
VirtualFile[] p = event.getData(CommonDataKeys.VIRTUAL_FILE_ARRAY);
if (p == null) {
return false;
}
}
return true;
}
@Override
public void doExecute(@NotNull final AnActionEvent event, final Map<String, Object> _params) {
final MPSProject project = event.getData(MPSCommonDataKeys.MPS_PROJECT);
List<? extends IResource> resources = new ModelAccessHelper(project.getModelAccess()).runReadAction(new Computable<IListSequence<IResource>>() {
public IListSequence<IResource> compute() {
List<SModel> models = MakeOrRebuildModelsFromChangeList_Action.this.getModels2Build(event.getData(CommonDataKeys.VIRTUAL_FILE_ARRAY), event);
if (new GenerationCheckHelper().checkModelsBeforeGenerationIfNeeded(project, models)) {
return Sequence.fromIterable(new ModelsToResources(models).resources(MakeOrRebuildModelsFromChangeList_Action.this.rebuild)).toListSequence();
}
return ListSequence.fromList(new ArrayList<IResource>());
}
});
if (ListSequence.fromList(resources).isEmpty()) {
return;
}
MakeSession session = new MakeSession(project, new DefaultMakeMessageHandler(project), MakeOrRebuildModelsFromChangeList_Action.this.rebuild);
if (IMakeService.INSTANCE.get().openNewSession(session)) {
IMakeService.INSTANCE.get().make(session, resources);
}
}
@NotNull
public String getActionId() {
StringBuilder res = new StringBuilder();
res.append(super.getActionId());
res.append("#");
res.append(((Object) this.rebuild).toString());
res.append("!");
return res.toString();
}
private List<SModel> getModels2Build(VirtualFile[] virtualFiles, final AnActionEvent event) {
if (virtualFiles != null) {
final SModelFileTracker modelFileTracker = SModelFileTracker.getInstance(event.getData(MPSCommonDataKeys.MPS_PROJECT).getRepository());
return Sequence.fromIterable(Sequence.fromArray(virtualFiles)).where(new IWhereFilter<VirtualFile>() {
public boolean accept(VirtualFile vf) {
return vf.isInLocalFileSystem() && vf.exists() && !(vf.isDirectory());
}
}).select(new ISelector<VirtualFile, SModel>() {
public SModel select(VirtualFile vf) {
return modelFileTracker.findModel(VirtualFileUtils.toIFile(vf));
}
}).where(new IWhereFilter<SModel>() {
public boolean accept(SModel m) {
return m != null && GenerationFacade.canGenerate(m);
}
}).toListSequence();
} else {
return ListSequence.fromList(new ArrayList<SModel>());
}
}
}