/* * Copyright 2003-2015 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package jetbrains.mps.ide.modelchecker; import com.intellij.openapi.ui.DialogWrapper; import jetbrains.mps.generator.GenerationSettingsProvider; import jetbrains.mps.generator.IModifiableGenerationSettings; import jetbrains.mps.ide.findusages.model.SearchResults; import jetbrains.mps.ide.generator.ModelValidator; import jetbrains.mps.ide.icons.IdeIcons; import jetbrains.mps.ide.modelchecker.platform.actions.ModelChecker; import jetbrains.mps.ide.modelchecker.platform.actions.ModelCheckerIssue; import jetbrains.mps.ide.modelchecker.platform.actions.ModelCheckerTool; import jetbrains.mps.ide.modelchecker.platform.actions.ModelCheckerUtils; import jetbrains.mps.ide.modelchecker.platform.actions.ModelCheckerViewer; import jetbrains.mps.ide.project.ProjectHelper; import jetbrains.mps.project.Project; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.mps.openapi.model.SModel; import javax.swing.JCheckBox; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.SwingUtilities; import java.awt.BorderLayout; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.util.List; /** * evgeny, 2/24/11 */ public class ModelValidatorAdapter implements ModelValidator { @Override public boolean check(@NotNull Project p, List<SModel> modelDescriptors) { com.intellij.openapi.project.Project ideaProject = ProjectHelper.toIdeaProject(p); ModelCheckerTool tool = ModelCheckerTool.getInstance(ideaProject); if (tool == null) { return true; } final IModifiableGenerationSettings generationSettings = GenerationSettingsProvider.getInstance().getGenerationSettings(); ModelCheckerViewer viewer = tool.checkModels(modelDescriptors); SearchResults<ModelCheckerIssue> issues = viewer.getSearchResults(); if (issues == null) { // Cancelled return false; } int warnings = ModelCheckerUtils.getIssueCountForSeverity(issues, ModelChecker.SEVERITY_WARNING); int errors = ModelCheckerUtils.getIssueCountForSeverity(issues, ModelChecker.SEVERITY_ERROR); if (errors != 0) { String msg = String.format("Model checker found %d errors and %d warnings. " + "Review them and don't generate models or ignore them?", errors, warnings); CheckBeforeGenerationDialog dialog = new CheckBeforeGenerationDialog(ideaProject, msg, generationSettings); dialog.show(); if (dialog.isOK()) { // review errors and warnings, don't generate tool.showTabWithResults(viewer, "Pre-generate validation", IdeIcons.MODEL_ICON); return false; } else { // ignore errors and warnings return true; } } return true; } private static class CheckBeforeGenerationDialog extends DialogWrapper { private final IModifiableGenerationSettings mySettings; private String myDialogMessage; public CheckBeforeGenerationDialog(com.intellij.openapi.project.Project project, String message, IModifiableGenerationSettings settings) { super(project, true); mySettings = settings; myDialogMessage = message; setTitle("Check Before Generation"); setOKButtonText("Review Errors"); setCancelButtonText("Ignore Errors"); setButtonsAlignment(SwingUtilities.CENTER); init(); } @Nullable @Override protected JComponent createCenterPanel() { JPanel panel = new JPanel(new BorderLayout()); JCheckBox checkBox = new JCheckBox("Don't check models before generation"); checkBox.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent ev) { boolean selected = ev.getStateChange() == ItemEvent.SELECTED; mySettings.setCheckModelsBeforeGeneration(!selected); } }); panel.add(new JLabel(myDialogMessage), BorderLayout.CENTER); panel.add(checkBox, BorderLayout.SOUTH); return panel; } } }