package jetbrains.mps.ide.java.platform.refactorings; /*Generated by MPS */ import jetbrains.mps.baseLanguage.util.plugin.refactorings.IntroduceLocalVariableRefactoring; import jetbrains.mps.nodeEditor.EditorComponent; import jetbrains.mps.openapi.editor.EditorContext; import java.awt.Frame; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.AnAction; import jetbrains.mps.util.NameUtil; import jetbrains.mps.internal.collections.runtime.ListSequence; import com.intellij.openapi.ui.popup.ListPopup; import com.intellij.openapi.ui.popup.JBPopupFactory; import jetbrains.mps.workbench.action.ActionUtils; import jetbrains.mps.editor.runtime.commands.EditorComputable; import org.jetbrains.mps.openapi.model.SNode; import jetbrains.mps.baseLanguage.util.plugin.refactorings.MoveRefactoringUtils; import jetbrains.mps.openapi.editor.cells.EditorCell; import jetbrains.mps.nodeEditor.messageTargets.CellFinder; import jetbrains.mps.openapi.editor.cells.EditorCell_Label; import com.intellij.ui.awt.RelativePoint; import java.awt.Point; import org.jetbrains.annotations.NotNull; import com.intellij.openapi.actionSystem.AnActionEvent; public class LocalVariableIntroducer { private IntroduceLocalVariableRefactoring myRefactoring; private EditorComponent myEditorComponent; private EditorContext myEditorContext; public LocalVariableIntroducer(Frame frame, IntroduceLocalVariableRefactoring refactoring, EditorComponent editorComponent, EditorContext editorContext) { myRefactoring = refactoring; myEditorComponent = editorComponent; myEditorContext = editorContext; } public void invoke(DataContext dataContext) { if (myRefactoring.hasDuplicates()) { AnAction thisOnly = new LocalVariableIntroducer.ExecuteAction("Replace this occurrence only", false); AnAction allOccurrences = new LocalVariableIntroducer.ExecuteAction("Replace all " + NameUtil.formatNumericalString(ListSequence.fromList(myRefactoring.getDuplicates()).count() + 1, "occurrence"), true); ListPopup popup = JBPopupFactory.getInstance().createActionGroupPopup("Multiple occurrences found", ActionUtils.groupFromActions(thisOnly, allOccurrences), dataContext, null, false); popup.show(getRelativePoint()); } else { execute(false); } } private void execute(boolean replaceAllDuplicates) { myRefactoring.setReplacingAll(replaceAllDuplicates); myRefactoring.setIsFinal(false); myRefactoring.setName(ListSequence.fromList(myRefactoring.getExpectedNames()).first()); EditorComputable<SNode> command = new EditorComputable<SNode>(myEditorContext) { @Override protected SNode doCompute() { SNode result = myRefactoring.doRefactoring(); MoveRefactoringUtils.fixImportsFromNode(result); return result; } }; myEditorContext.getRepository().getModelAccess().executeCommand(command); EditorCell cell = CellFinder.getCellForProperty(myEditorComponent, command.getResult(), "name"); if (cell == null) { myEditorContext.select(command.getResult()); } else { if (cell instanceof EditorCell_Label) { EditorCell_Label ecl = ((EditorCell_Label) cell); myEditorComponent.getSelectionManager().setSelection(ecl, 0, 0, ecl.getText().length()); } else { myEditorComponent.getSelectionManager().setSelection(cell); } } } private RelativePoint getRelativePoint() { EditorCell cell = myEditorContext.getContextCell(); return new RelativePoint(myEditorComponent, new Point(cell.getX(), cell.getBottom())); } private class ExecuteAction extends AnAction { private final boolean myReplaceAllDuplicates; public ExecuteAction(String text, boolean replaceAllDuplicates) { super(text); myReplaceAllDuplicates = replaceAllDuplicates; } public void actionPerformed(@NotNull AnActionEvent event) { execute(myReplaceAllDuplicates); } } }