package jetbrains.mps.ide.modelchecker.platform.actions; /*Generated by MPS */ import com.intellij.openapi.vcs.checkin.CheckinHandler; import com.intellij.openapi.project.Project; import com.intellij.openapi.vcs.CheckinProjectPanel; import org.jetbrains.annotations.Nullable; import com.intellij.openapi.vcs.ui.RefreshableOnComponent; import javax.swing.JCheckBox; import javax.swing.JComponent; import javax.swing.JPanel; import java.awt.GridLayout; import java.util.List; import org.jetbrains.mps.openapi.model.SModel; import java.io.File; import jetbrains.mps.smodel.SModelFileTracker; import jetbrains.mps.ide.project.ProjectHelper; import jetbrains.mps.internal.collections.runtime.ListSequence; import java.util.ArrayList; import jetbrains.mps.internal.collections.runtime.Sequence; import jetbrains.mps.internal.collections.runtime.ISelector; import jetbrains.mps.vfs.FileSystem; import jetbrains.mps.internal.collections.runtime.IWhereFilter; import com.intellij.openapi.vcs.checkin.CheckinHandlerFactory; import org.jetbrains.annotations.NotNull; import com.intellij.openapi.vcs.changes.CommitContext; public class ModelCheckerCheckinHandler extends CheckinHandler { private Project myProject; private CheckinProjectPanel myPanel; public ModelCheckerCheckinHandler(Project project, CheckinProjectPanel panel) { myProject = project; myPanel = panel; } @Nullable @Override public RefreshableOnComponent getBeforeCheckinConfigurationPanel() { final JCheckBox checkModelCheckBox = new JCheckBox("Perform check for affected models"); return new RefreshableOnComponent() { @Override public JComponent getComponent() { JPanel panel = new JPanel(new GridLayout(1, 0)); panel.add(checkModelCheckBox); return panel; } @Override public void restoreState() { checkModelCheckBox.setSelected(ModelCheckerSettings.getInstance().isCheckBeforeCommit()); } @Override public void saveState() { ModelCheckerSettings.getInstance().setCheckBeforeCommit(checkModelCheckBox.isSelected()); } @Override public void refresh() { } }; } @Override public CheckinHandler.ReturnResult beforeCheckin() { if (!(ModelCheckerSettings.getInstance().isCheckBeforeCommit())) { return CheckinHandler.ReturnResult.COMMIT; } return ModelCheckerTool.getInstance(myProject).checkModelsBeforeCommit(getModelsByFiles(myPanel.getFiles())); } private List<SModel> getModelsByFiles(Iterable<File> files) { final SModelFileTracker ft = SModelFileTracker.getInstance(ProjectHelper.getProjectRepository(myProject)); return ListSequence.fromListWithValues(new ArrayList<SModel>(), Sequence.fromIterable(files).select(new ISelector<File, SModel>() { public SModel select(File file) { return ft.findModel(FileSystem.getInstance().getFileByPath(file.getAbsolutePath())); } }).where(new IWhereFilter<SModel>() { public boolean accept(SModel modelDescriptor) { return modelDescriptor != null; } })); } public static class ModelCheckerCheckinHandlerFactory extends CheckinHandlerFactory { public ModelCheckerCheckinHandlerFactory() { } @NotNull @Override public CheckinHandler createHandler(CheckinProjectPanel panel, CommitContext commitContext) { return new ModelCheckerCheckinHandler(panel.getProject(), panel); } } }