package jetbrains.mps.ide.modelchecker.platform.actions;
/*Generated by MPS */
import jetbrains.mps.ide.tools.BaseTabbedProjectTool;
import javax.swing.Icon;
import jetbrains.mps.icons.MPSIcons;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.wm.ToolWindowAnchor;
import java.util.List;
import org.jetbrains.mps.openapi.model.SModel;
import jetbrains.mps.ide.project.ProjectHelper;
import jetbrains.mps.internal.collections.runtime.ListSequence;
import jetbrains.mps.ide.findusages.view.FindUtils;
import jetbrains.mps.ide.findusages.model.SearchQuery;
import jetbrains.mps.ide.findusages.model.holders.ModelsHolder;
import jetbrains.mps.internal.collections.runtime.ISelector;
import org.jetbrains.mps.openapi.model.SModelReference;
import jetbrains.mps.project.GlobalScope;
import jetbrains.mps.ide.icons.IdeIcons;
import org.jetbrains.mps.openapi.module.SModule;
import jetbrains.mps.ide.icons.IconManager;
import com.intellij.icons.AllIcons;
import jetbrains.mps.ide.findusages.model.SearchResults;
import javax.swing.JOptionPane;
import java.util.ArrayList;
import com.intellij.openapi.vcs.checkin.CheckinHandler;
import com.intellij.openapi.ui.Messages;
import jetbrains.mps.plugins.tool.IComponentDisposer;
public class ModelCheckerTool extends BaseTabbedProjectTool {
private static final Icon ICON = MPSIcons.ToolWindows.ModelChecker;
private Project myProject;
public ModelCheckerTool(Project project) {
super(project, "Model Checker", -1, ICON, ToolWindowAnchor.BOTTOM, true);
myProject = project;
}
public ModelCheckerViewer checkModels(List<SModel> models) {
ModelCheckerViewer newViewer = createViewerForTab();
newViewer.checkModels(models, "models");
return newViewer;
}
public void checkModelsAndShowResult(List<SModel> models, SpecificChecker... checkers) {
ModelCheckerViewer newViewer = createViewerForTab();
ModelCheckerIssueFinder finder;
jetbrains.mps.project.Project mpsProject = ProjectHelper.fromIdeaProject(myProject);
assert mpsProject != null;
if (checkers == null || checkers.length == 0) {
finder = new ModelCheckerIssueFinder(ModelCheckerSettings.getInstance().getSpecificCheckers(mpsProject));
} else {
finder = new ModelCheckerIssueFinder(checkers);
}
String title = (ListSequence.fromList(models).count() == 1 ? ListSequence.fromList(models).first().getName().getValue() : String.format("%d models", ListSequence.fromList(models).count()));
newViewer.runCheck(FindUtils.makeProvider(finder), new SearchQuery(new ModelsHolder(ListSequence.fromList(models).select(new ISelector<SModel, SModelReference>() {
public SModelReference select(SModel it) {
return it.getReference();
}
}).toListSequence()), GlobalScope.getInstance()), title);
revealResults(newViewer, title, IdeIcons.MODEL_ICON);
}
public void checkModulesAndShowResult(List<SModule> modules) {
ModelCheckerViewer newViewer = createViewerForTab();
String title = (ListSequence.fromList(modules).count() == 1 ? ListSequence.fromList(modules).first().getModuleName() : "modules");
newViewer.checkModules(modules, title);
Icon icon = (ListSequence.fromList(modules).count() == 1 ? IconManager.getIconFor(ListSequence.fromList(modules).first()) : AllIcons.Nodes.ModuleGroup);
revealResults(newViewer, title, icon);
}
private void revealResults(ModelCheckerViewer newViewer, String title, Icon icon) {
SearchResults<ModelCheckerIssue> searchResults = newViewer.getSearchResults();
if (searchResults == null) {
// Search was cancelled, do nothing
return;
}
if (searchResults.getSearchResults().isEmpty()) {
JOptionPane.showMessageDialog(this.getComponent(), "There were no problems detected during Model Checker execution", "Model Checker results", JOptionPane.INFORMATION_MESSAGE);
} else {
this.showTabWithResults(newViewer, title, icon);
}
}
public void checkProjectAndShowResults() {
jetbrains.mps.project.Project mpsProject = ProjectHelper.fromIdeaProject(myProject);
assert mpsProject != null;
ModelCheckerViewer newViewer = createViewerForTab();
newViewer.checkModules(ListSequence.fromListWithValues(new ArrayList<SModule>(), mpsProject.getProjectModules()), mpsProject.getName());
revealResults(newViewer, mpsProject.getName(), IdeIcons.PROJECT_ICON);
}
public CheckinHandler.ReturnResult checkModelsBeforeCommit(List<SModel> models) {
ModelCheckerViewer viewer = createViewerForTab();
viewer.checkModels(models, "models");
SearchResults<ModelCheckerIssue> issues = viewer.getSearchResults();
if (issues == null) {
return CheckinHandler.ReturnResult.CANCEL;
}
int warnings = ModelCheckerUtils.getIssueCountForSeverity(issues, ModelChecker.SEVERITY_WARNING);
int errors = ModelCheckerUtils.getIssueCountForSeverity(issues, ModelChecker.SEVERITY_ERROR);
if (errors != 0) {
String dialogMessage = "Model checker found " + errors + " errors and " + warnings + " warnings. Would you like to review them?";
int dialogAnswer = Messages.showDialog(myProject, dialogMessage, "Model Checking", new String[]{"Review", "Commit", "Cancel"}, 0, null);
if (dialogAnswer == 0) {
// review errors and warnings, don't commit
this.showTabWithResults(viewer, "Pre-commit check", IdeIcons.MODEL_ICON);
return CheckinHandler.ReturnResult.CLOSE_WINDOW;
} else if (dialogAnswer == 1) {
// ignore errors and warnings
return CheckinHandler.ReturnResult.COMMIT;
} else if (dialogAnswer == 2 || dialogAnswer == -1) {
// Cancel
return CheckinHandler.ReturnResult.CANCEL;
}
}
return CheckinHandler.ReturnResult.COMMIT;
}
private ModelCheckerViewer createViewerForTab() {
// viewer that knows how to close tool's tab
return new ModelCheckerViewer(myProject) {
@Override
protected void close() {
ModelCheckerTool.this.closeTab(this);
}
};
}
public void showTabWithResults(ModelCheckerViewer viewer, String tabTitle, Icon tabIcon) {
this.addTab(viewer, tabTitle, tabIcon, new IComponentDisposer<ModelCheckerViewer>() {
public void disposeComponent(ModelCheckerViewer c) {
c.dispose();
}
}, true);
}
public static ModelCheckerTool getInstance(Project p) {
return p.getComponent(ModelCheckerTool.class);
}
}