package jetbrains.mps.vcs.platform.integration; /*Generated by MPS */ import com.intellij.openapi.vcs.checkin.CheckinHandler; import org.apache.log4j.Logger; import org.apache.log4j.LogManager; import jetbrains.mps.ide.ThreadUtils; import com.intellij.openapi.project.Project; import com.intellij.openapi.vcs.CheckinProjectPanel; import com.intellij.openapi.vcs.VcsConfiguration; import com.intellij.openapi.vcs.ui.RefreshableOnComponent; import javax.swing.JCheckBox; import javax.swing.JComponent; import javax.swing.JPanel; import java.awt.GridLayout; import jetbrains.mps.ide.project.ProjectHelper; import org.jetbrains.mps.openapi.module.SRepository; import jetbrains.mps.smodel.SModelFileTracker; import java.util.Collection; import java.io.File; import java.util.List; import org.jetbrains.mps.openapi.model.SModel; import java.util.ArrayList; import jetbrains.mps.vfs.FileSystem; import com.intellij.openapi.progress.Task; import org.jetbrains.annotations.NotNull; import com.intellij.openapi.progress.ProgressIndicator; import jetbrains.mps.progress.ProgressMonitorAdapter; import com.intellij.util.WaitForProgressToShow; import jetbrains.mps.project.OptimizeImportsHelper; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; import org.jetbrains.mps.openapi.model.EditableSModel; import com.intellij.openapi.vcs.checkin.CheckinHandlerFactory; import com.intellij.openapi.vcs.changes.CommitContext; public class OptimizeImportsCheckinHandler extends CheckinHandler { private static final Logger LOG = LogManager.getLogger(ThreadUtils.class); private Project myProject; private CheckinProjectPanel myPanel; public OptimizeImportsCheckinHandler(Project project, CheckinProjectPanel panel) { this.myProject = project; this.myPanel = panel; } protected VcsConfiguration getSettings() { return VcsConfiguration.getInstance(myProject); } @Override public RefreshableOnComponent getBeforeCheckinConfigurationPanel() { final JCheckBox optimizeImportsCheckBox = new JCheckBox("Optimize model imports"); return new RefreshableOnComponent() { @Override public JComponent getComponent() { JPanel panel = new JPanel(new GridLayout(1, 0)); panel.add(optimizeImportsCheckBox); return panel; } @Override public void restoreState() { optimizeImportsCheckBox.setSelected(getSettings().OPTIMIZE_IMPORTS_BEFORE_PROJECT_COMMIT); } @Override public void saveState() { getSettings().OPTIMIZE_IMPORTS_BEFORE_PROJECT_COMMIT = optimizeImportsCheckBox.isSelected(); } @Override public void refresh() { } }; } @Override public CheckinHandler.ReturnResult beforeCheckin() { final jetbrains.mps.project.Project mpsProject = ProjectHelper.fromIdeaProject(myProject); if (getSettings().OPTIMIZE_IMPORTS_BEFORE_PROJECT_COMMIT && mpsProject != null) { final SRepository repository = mpsProject.getRepository(); SModelFileTracker modelFileTracker = SModelFileTracker.getInstance(repository); Collection<File> affectedFiles = myPanel.getFiles(); final List<SModel> affectedModels = new ArrayList<SModel>(); for (File file : affectedFiles) { SModel model = modelFileTracker.findModel(FileSystem.getInstance().getFile(file.getAbsolutePath())); if (model == null) { continue; } affectedModels.add(model); } ThreadUtils.assertEDT(); // TODO: extract common code from OptimizeModelImports Task.Modal task = new Task.Modal(this.myProject, "Optimizing model imports", true) { public void run(@NotNull ProgressIndicator indicator) { final ProgressMonitorAdapter monitor = new ProgressMonitorAdapter(indicator); try { final int modelsNumber = affectedModels.size(); monitor.start("Optimizing imports of " + modelsNumber + " models", modelsNumber); WaitForProgressToShow.runOrInvokeAndWaitAboveProgress(new Runnable() { public void run() { } }); final OptimizeImportsHelper helper = new OptimizeImportsHelper(repository); ApplicationManager.getApplication().invokeAndWait(new Runnable() { public void run() { repository.getModelAccess().executeCommand(new Runnable() { public void run() { helper.optimizeModelsImports(affectedModels, monitor.subTask(modelsNumber)); } }); } }, ModalityState.current()); if (monitor.isCanceled()) { return; } monitor.step("Saving..."); WaitForProgressToShow.runOrInvokeAndWaitAboveProgress(new Runnable() { public void run() { repository.getModelAccess().executeCommand(new Runnable() { public void run() { for (SModel affectedModel : affectedModels) { ((EditableSModel) affectedModel).save(); } } }); } }); monitor.advance(1); } catch (Throwable e) { LOG.error("Couldn't optimize imports before commit", e); } finally { monitor.done(); } } }; } return CheckinHandler.ReturnResult.COMMIT; } public static class OptimizeImportsCheckinHandlerFactory extends CheckinHandlerFactory { public OptimizeImportsCheckinHandlerFactory() { } @NotNull @Override public CheckinHandler createHandler(CheckinProjectPanel panel, CommitContext context) { return new OptimizeImportsCheckinHandler(panel.getProject(), panel); } } }