package jetbrains.mps.ide.platform.refactoring; /*Generated by MPS */ import jetbrains.mps.refactoring.runtime.access.RefactoringFacade; import org.apache.log4j.Logger; import org.apache.log4j.LogManager; import jetbrains.mps.refactoring.framework.RefactoringContext; import jetbrains.mps.ide.ThreadUtils; import jetbrains.mps.refactoring.framework.IRefactoring; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.progress.Task; import jetbrains.mps.ide.project.ProjectHelper; import org.jetbrains.annotations.NotNull; import com.intellij.openapi.progress.ProgressIndicator; import jetbrains.mps.ide.findusages.model.SearchResults; import jetbrains.mps.baseLanguage.closures.runtime.Wrappers; import javax.swing.JOptionPane; import jetbrains.mps.ide.actions.MPSCommonDataKeys; import com.intellij.ide.DataManager; import java.util.List; import org.jetbrains.mps.openapi.model.SModel; import java.util.ArrayList; public class RefactoringFacadeImpl implements RefactoringFacade { protected Logger myLog = LogManager.getLogger(this.getClass()); public RefactoringFacadeImpl() { } public void executeSimple(final RefactoringContext context) { ThreadUtils.assertEDT(); final IRefactoring refactoring = context.getRefactoring(); context.getSelectedProject().getModelAccess().executeCommand(new Runnable() { public void run() { try { refactoring.refactor(context); } catch (Throwable t) { myLog.error("An exception occured while trying to execute refactoring " + refactoring.getUserFriendlyName() + ". Models could have been corrupted.", t); } } }); try { refactoring.doWhenDone(context); } catch (Throwable t) { myLog.error("An error occurred in dgoWhenDone(), refactoring: " + refactoring.getUserFriendlyName(), t); } } private void doExecuteNoDialog(final RefactoringContext refactoringContext) { ApplicationManager.getApplication().invokeLater(new Runnable() { public void run() { executeSimple(refactoringContext); } }); } public void execute(final RefactoringContext refactoringContext) { ThreadUtils.assertEDT(); myLog.assertLog(refactoringContext.getSelectedProject().getModelAccess().canRead(), "Read access"); boolean success = refactoringContext.getRefactoring().init(refactoringContext); if (success) { findUsagesAndRun(refactoringContext); } } private void findUsagesAndRun(final RefactoringContext refactoringContext) { ApplicationManager.getApplication().invokeLater(new Runnable() { @Override public void run() { ProgressManager.getInstance().run(new Task.Modal(ProjectHelper.toIdeaProject(refactoringContext.getSelectedProject()), "Finding usages...", false) { @Override public void run(@NotNull ProgressIndicator indicator) { indicator.setIndeterminate(true); SearchResults usages = findUsagesSimple(refactoringContext); showConfirmDialogAndExecuteInUI(usages, refactoringContext); } }); } }); } private SearchResults findUsagesSimple(final RefactoringContext refactoringContext) { final Wrappers._T<SearchResults> result = new Wrappers._T<SearchResults>(null); refactoringContext.getSelectedProject().getModelAccess().runReadAction(new Runnable() { public void run() { try { IRefactoring refactoring = refactoringContext.getRefactoring(); result.value = refactoring.getAffectedNodes(refactoringContext); if (result.value == null) { result.value = new SearchResults(); } } catch (Throwable t) { myLog.error(null, t); } } }); return result.value; } private void showConfirmDialogAndExecuteInUI(SearchResults result, final RefactoringContext refactoringContext) { if (result == null) { ApplicationManager.getApplication().invokeLater(new Runnable() { @Override public void run() { int promptResult = JOptionPane.showConfirmDialog(MPSCommonDataKeys.FRAME.getData(DataManager.getInstance().getDataContext()), "An exception occurred during searching affected nodes. Do you want to continue anyway?", "Exception", JOptionPane.YES_NO_OPTION); if (promptResult == JOptionPane.YES_OPTION) { executeInUI(new SearchResults(), refactoringContext); } } }); } else { executeInUI(result, refactoringContext); } } private void executeInUI(final SearchResults usages, final RefactoringContext refactoringContext) { refactoringContext.getSelectedProject().getModelAccess().runReadInEDT(new Runnable() { @Override public void run() { refactoringContext.setUsages(usages); if (!(usages.getSearchResults().isEmpty())) { showRefactoring(refactoringContext, usages); } else { doExecuteNoDialog(refactoringContext); } } }); } private void showRefactoring(final RefactoringContext refactoringContext, final SearchResults searchResults) { RefactoringViewAction okAction = new RefactoringViewAction() { @Override public void performAction(final RefactoringViewItem refactoringViewItem) { refactoringContext.getSelectedProject().getModelAccess().runWriteInEDT(new Runnable() { @Override public void run() { executeSimple(refactoringContext); refactoringViewItem.close(); } }); } }; List<SModel> modelsToGenerate = getModelsToGenerate(refactoringContext.getRefactoring(), refactoringContext); RefactoringAccessEx.getInstance().showRefactoringView(refactoringContext, okAction, searchResults, !(modelsToGenerate.isEmpty()), refactoringContext.getRefactoring().getUserFriendlyName()); } @NotNull private List<SModel> getModelsToGenerate(final IRefactoring refactoring, final RefactoringContext context) { List<SModel> result = new ArrayList<SModel>(); try { result = refactoring.getModelsToGenerate(context); } catch (Throwable t) { myLog.error("An error occurred while trying to collect models to generate from refactoring " + refactoring.getUserFriendlyName() + ". No models will be generated", t); } return result; } }