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