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