package jetbrains.mps.ide.platform.actions.core;
/*Generated by MPS */
import jetbrains.mps.refactoring.participant.RefactoringUI;
import org.apache.log4j.Logger;
import org.apache.log4j.LogManager;
import com.intellij.openapi.project.Project;
import org.jetbrains.mps.openapi.module.SRepository;
import jetbrains.mps.project.MPSProject;
import java.util.List;
import jetbrains.mps.refactoring.participant.RefactoringParticipant;
import jetbrains.mps.internal.collections.runtime.ListSequence;
import jetbrains.mps.internal.collections.runtime.ISelector;
import jetbrains.mps.baseLanguage.closures.runtime._FunctionTypes;
import org.jetbrains.mps.openapi.util.ProgressMonitor;
import com.intellij.openapi.progress.ProgressManager;
import com.intellij.openapi.progress.Task;
import org.jetbrains.annotations.NotNull;
import com.intellij.openapi.progress.ProgressIndicator;
import jetbrains.mps.progress.ProgressMonitorAdapter;
import jetbrains.mps.ide.findusages.model.SearchResults;
import jetbrains.mps.ide.findusages.model.SearchTask;
import jetbrains.mps.refactoring.participant.RefactoringSession;
import jetbrains.mps.ide.platform.refactoring.UsagesModelTracker;
import jetbrains.mps.ide.platform.refactoring.RefactoringAccessEx;
import jetbrains.mps.ide.platform.refactoring.RefactoringViewAction;
import jetbrains.mps.ide.platform.refactoring.RefactoringViewItem;
import com.intellij.openapi.ui.Messages;
import org.apache.log4j.Level;
import org.jetbrains.mps.openapi.module.ModelAccess;
public class DefaultRefactoringUI implements RefactoringUI {
private static final Logger LOG = LogManager.getLogger(DefaultRefactoringUI.class);
protected Project myProject;
protected SRepository myRepository;
public DefaultRefactoringUI(Project project, SRepository repository) {
myRepository = repository;
myProject = project;
}
public DefaultRefactoringUI(MPSProject mpsProject) {
this(mpsProject.getProject(), mpsProject.getRepository());
}
public void prepare(Runnable task) {
myRepository.getModelAccess().runReadAction(task);
}
public List<RefactoringParticipant.Option> selectParticipants(final List<RefactoringParticipant.Option> options) {
if (ListSequence.fromList(options).isEmpty()) {
return options;
}
List<Integer> selectedOptionIndices = SelectOptionsDialog.selectOptions(myProject, ListSequence.fromList(options).select(new ISelector<RefactoringParticipant.Option, String>() {
public String select(RefactoringParticipant.Option it) {
return it.getDescription();
}
}).toListSequence(), "Select Participants", "Select how to update usages:");
if (selectedOptionIndices == null) {
return null;
}
return ListSequence.fromList(selectedOptionIndices).select(new ISelector<Integer, RefactoringParticipant.Option>() {
public RefactoringParticipant.Option select(Integer i) {
return ListSequence.fromList(options).getElement(i);
}
}).toListSequence();
}
public void runSearch(final _FunctionTypes._void_P1_E0<? super ProgressMonitor> task) {
ProgressManager.getInstance().run(new Task.Modal(myProject, "Refactoring", true) {
public void run(@NotNull final ProgressIndicator progressIndicator) {
progressIndicator.setIndeterminate(false);
DefaultRefactoringUI.this.myRepository.getModelAccess().runReadAction(new Runnable() {
public void run() {
ProgressMonitorAdapter progressMonitor = new ProgressMonitorAdapter(progressIndicator);
task.invoke(progressMonitor);
}
});
}
});
}
public void showRefactoringView(final Runnable performRefactoringTask, String refactoringName, SearchResults searchResults, final SearchTask rerunTask, RefactoringSession refactoringSession) {
final UsagesModelTracker usagesModelTracker = new UsagesModelTracker(myRepository);
RefactoringAccessEx.getInstance().showRefactoringView(myProject, new RefactoringViewAction() {
public void performAction(final RefactoringViewItem refactoringViewItem) {
myRepository.getModelAccess().executeCommand(new Runnable() {
public void run() {
if (usagesModelTracker.isChanged()) {
Messages.showMessageDialog(myProject, "Cannot perform refactoring operation.\nThere were changes in code after usages have been found.\nPlease perform usage search again.", "Changes Detected", Messages.getErrorIcon());
} else {
try {
performRefactoringTask.run();
} catch (RuntimeException exception) {
if (LOG.isEnabledFor(Level.ERROR)) {
LOG.error("Exception during refactoring: ", exception);
}
}
refactoringViewItem.close();
}
}
});
}
}, new Runnable() {
public void run() {
usagesModelTracker.dispose();
}
}, searchResults, new SearchTask() {
public boolean canExecute() {
return rerunTask.canExecute();
}
public SearchResults execute(ModelAccess modelAccess, ProgressMonitor progressMonitor) {
usagesModelTracker.reset();
return rerunTask.execute(modelAccess, progressMonitor);
}
}, refactoringName);
}
}