package jetbrains.mps.ide.actions; /*Generated by MPS */ import jetbrains.mps.workbench.action.BaseAction; import javax.swing.Icon; import com.intellij.openapi.actionSystem.AnActionEvent; import java.util.Map; import java.util.List; import org.jetbrains.mps.openapi.model.SModel; import jetbrains.mps.internal.collections.runtime.MapSequence; import jetbrains.mps.internal.collections.runtime.ListSequence; import jetbrains.mps.internal.collections.runtime.IWhereFilter; import org.jetbrains.mps.openapi.model.EditableSModel; import org.jetbrains.annotations.NotNull; import com.intellij.openapi.project.Project; import com.intellij.openapi.actionSystem.CommonDataKeys; import jetbrains.mps.project.MPSProject; import com.intellij.openapi.progress.Task; import com.intellij.openapi.progress.ProgressIndicator; import jetbrains.mps.progress.ProgressMonitorAdapter; import org.jetbrains.mps.openapi.module.SRepository; import com.intellij.util.WaitForProgressToShow; import jetbrains.mps.project.OptimizeImportsHelper; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.ui.Messages; public class OptimizeModelImports_Action extends BaseAction { private static final Icon ICON = null; public OptimizeModelImports_Action() { super("Optimize Imports", "", ICON); this.setIsAlwaysVisible(false); this.setExecuteOutsideCommand(true); } @Override public boolean isDumbAware() { return true; } @Override public boolean isApplicable(AnActionEvent event, final Map<String, Object> _params) { List<SModel> m = ((List<SModel>) MapSequence.fromMap(_params).get("models")); return ListSequence.fromList(m).where(new IWhereFilter<SModel>() { public boolean accept(SModel it) { return it instanceof EditableSModel && !(it.isReadOnly()); } }).isNotEmpty(); } @Override public void doUpdate(@NotNull AnActionEvent event, final Map<String, Object> _params) { this.setEnabledState(event.getPresentation(), this.isApplicable(event, _params)); } @Override protected boolean collectActionData(AnActionEvent event, final Map<String, Object> _params) { if (!(super.collectActionData(event, _params))) { return false; } { List<SModel> p = event.getData(MPSCommonDataKeys.MODELS); MapSequence.fromMap(_params).put("models", p); if (p == null) { return false; } } { Project p = event.getData(CommonDataKeys.PROJECT); MapSequence.fromMap(_params).put("ideaProject", p); if (p == null) { return false; } } { MPSProject p = event.getData(MPSCommonDataKeys.MPS_PROJECT); MapSequence.fromMap(_params).put("project", p); if (p == null) { return false; } } return true; } @Override public void doExecute(@NotNull final AnActionEvent event, final Map<String, Object> _params) { final StringBuilder report = new StringBuilder(); final Task.Modal task = new Task.Modal(((Project) MapSequence.fromMap(_params).get("ideaProject")), "Optimizing model imports", true) { public void run(@NotNull ProgressIndicator indicator) { final ProgressMonitorAdapter monitor = new ProgressMonitorAdapter(indicator); try { final int modelsNumber = ((List<SModel>) MapSequence.fromMap(_params).get("models")).size(); final SRepository repo = ((MPSProject) MapSequence.fromMap(_params).get("project")).getRepository(); monitor.start("Optimizing imports of " + modelsNumber + " models", modelsNumber); WaitForProgressToShow.runOrInvokeAndWaitAboveProgress(new Runnable() { public void run() { } }); final OptimizeImportsHelper helper = new OptimizeImportsHelper(repo); ApplicationManager.getApplication().invokeAndWait(new Runnable() { public void run() { repo.getModelAccess().executeCommand(new Runnable() { public void run() { String result = helper.optimizeModelsImports(((List<SModel>) MapSequence.fromMap(_params).get("models")), monitor.subTask(modelsNumber)); report.append(result); } }); } }, ModalityState.defaultModalityState()); if (monitor.isCanceled()) { return; } monitor.step("Saving..."); WaitForProgressToShow.runOrInvokeAndWaitAboveProgress(new Runnable() { public void run() { repo.getModelAccess().executeCommand(new Runnable() { public void run() { repo.saveAll(); } }); } }); monitor.advance(1); } finally { monitor.done(); } } }; ApplicationManager.getApplication().invokeLater(new Runnable() { public void run() { ProgressManager.getInstance().run(task); Messages.showMessageDialog(((Project) MapSequence.fromMap(_params).get("ideaProject")), (report.length() == 0 ? "Nothing to optimize" : report.toString()), "Optimize Imports", Messages.getInformationIcon()); } }, ModalityState.defaultModalityState()); } }