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