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