package jetbrains.mps.ide.java.workbench.actions; /*Generated by MPS */ import jetbrains.mps.ide.platform.refactoring.RefactoringDialog; import org.jetbrains.mps.openapi.model.SNode; import jetbrains.mps.baseLanguage.util.plugin.refactorings.ChangeMethodSignatureParameters; import org.jetbrains.mps.openapi.model.SModel; import jetbrains.mps.ide.embeddableEditor.EmbeddableEditor; import jetbrains.mps.project.Project; import java.util.List; import jetbrains.mps.baseLanguage.util.plugin.refactorings.ChangeMethodSignatureRefactoring; import org.jetbrains.annotations.NotNull; import jetbrains.mps.project.MPSProject; import javax.swing.JComponent; import javax.swing.JPanel; import java.awt.BorderLayout; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SLinkOperations; import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SConceptOperations; import jetbrains.mps.smodel.tempmodel.TemporaryModels; import jetbrains.mps.smodel.tempmodel.TempModuleOptions; import javax.swing.border.TitledBorder; import org.jetbrains.annotations.Nullable; import java.awt.GridBagLayout; import java.awt.GridBagConstraints; import java.awt.Insets; import jetbrains.mps.baseLanguage.closures.runtime.Wrappers; import java.util.ArrayList; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.progress.Task; import com.intellij.openapi.progress.ProgressIndicator; import org.jetbrains.mps.openapi.module.ModelAccess; import jetbrains.mps.baseLanguage.util.plugin.refactorings.MethodRefactoringUtils; import jetbrains.mps.ide.project.ProjectHelper; import jetbrains.mps.progress.ProgressMonitorAdapter; import jetbrains.mps.internal.collections.runtime.ListSequence; /*package*/ class ChangeMethodSignatureDialog extends RefactoringDialog { private SNode myDeclaration; private ChangeMethodSignatureParameters myParameters; private SModel myTempModel; private EmbeddableEditor myEditor; private Project myProject; private List<ChangeMethodSignatureRefactoring> myRefactorings = null; public ChangeMethodSignatureDialog(@NotNull MPSProject project, SNode node) { super(project.getProject(), true); setTitle("Change Method Signature"); this.myProject = project; this.myDeclaration = node; // TODO: call this constructor inside read action? myProject.getModelAccess().runReadAction(new Runnable() { public void run() { ChangeMethodSignatureDialog.this.myParameters = new ChangeMethodSignatureParameters(myDeclaration); } }); init(); } private JComponent createSingnaturePanel() { JPanel panel = new JPanel(new BorderLayout()); myProject.getRepository().getModelAccess().executeCommand(new Runnable() { public void run() { SNode baseMethodDeclaration = ChangeMethodSignatureDialog.this.myParameters.getDeclaration(); SLinkOperations.setTarget(baseMethodDeclaration, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b1fcL, 0xf8cc56b1ffL, "body"), SConceptOperations.createNewNode(MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b200L, "jetbrains.mps.baseLanguage.structure.StatementList"))); myTempModel = TemporaryModels.getInstance().create(false, TempModuleOptions.forDefaultModule()); myTempModel.addRootNode(baseMethodDeclaration); TemporaryModels.getInstance().addMissingImports(myTempModel); ChangeMethodSignatureDialog.this.myEditor = new EmbeddableEditor(myProject, true); myEditor.editNode(baseMethodDeclaration); } }); panel.setBorder(new TitledBorder("Method signature")); panel.add(this.myEditor); return panel; } public List<ChangeMethodSignatureRefactoring> getAllRefactorings() { return myRefactorings; } @Nullable @Override protected JComponent createCenterPanel() { JPanel panel = new JPanel(new GridBagLayout()); GridBagConstraints c = new GridBagConstraints(); c.fill = GridBagConstraints.BOTH; c.insets = new Insets(3, 3, 3, 3); c.gridx = 0; c.gridy = 0; c.weightx = 1; c.weighty = 1; panel.add(this.createSingnaturePanel(), c); return panel; } @Override protected void doRefactoringAction() { final Wrappers._T<List<SNode>> methodsToRefactor = new Wrappers._T<List<SNode>>(new ArrayList<SNode>()); ProgressManager.getInstance().run(new Task.Modal(getProject(), "Search for overriding methods", true) { @Override public void run(@NotNull final ProgressIndicator indicator) { ModelAccess modelAccess = ChangeMethodSignatureDialog.this.myProject.getRepository().getModelAccess(); modelAccess.runReadAction(new Runnable() { public void run() { methodsToRefactor.value = MethodRefactoringUtils.findOverridingMethods(ProjectHelper.toMPSProject(myProject).new ProjectScope(), ChangeMethodSignatureDialog.this.myDeclaration, new ProgressMonitorAdapter(indicator)); } }); } }); ListSequence.fromList(methodsToRefactor.value).addElement(myDeclaration); myRefactorings = ListSequence.fromList(new ArrayList<ChangeMethodSignatureRefactoring>()); for (SNode method : ListSequence.fromList(methodsToRefactor.value)) { ListSequence.fromList(myRefactorings).addElement(new ChangeMethodSignatureRefactoring(this.myParameters, method)); } super.doRefactoringAction(); } @Override protected void dispose() { if (myEditor != null) { myEditor.disposeEditor(); myEditor = null; } if (myTempModel != null) { myProject.getModelAccess().runWriteAction(new Runnable() { public void run() { TemporaryModels.getInstance().dispose(myTempModel); myTempModel = null; } }); } super.dispose(); } }