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