*/
package com.intellij.refactoring.changeSignature;
+import com.intellij.ide.highlighter.JavaFileType;
import com.intellij.openapi.diagnostic.Logger;
+import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.TextRange;
+import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.*;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.refactoring.changeSignature.inplace.LanguageChangeSignatureDetector;
+import com.intellij.refactoring.util.CanonicalTypes;
+import com.intellij.util.ObjectUtils;
+import com.intellij.util.VisibilityUtil;
import org.jetbrains.annotations.NotNull;
+import java.util.List;
+
/**
* User: anna
* Date: Sep 6, 2010
return method != null ? getSignatureRange((PsiMethod)method) : null;
}
+ @Override
+ public String getMethodSignaturePreview(DetectedJavaChangeInfo initialChangeInfo,
+ final List<TextRange> deleteRanges,
+ final List<TextRange> newRanges) {
+ StringBuilder buf = new StringBuilder();
+ String visibility = VisibilityUtil.getVisibilityString(initialChangeInfo.getNewVisibility());
+ buf.append(visibility);
+ if (!StringUtil.isEmptyOrSpaces(visibility)) {
+ buf.append(" ");
+ }
+ CanonicalTypes.Type returnType = initialChangeInfo.getNewReturnType();
+ if (returnType != null) {
+ buf.append(returnType.getTypeText()).append(" ");
+ }
+ buf.append(initialChangeInfo.getNewName()).append("(");
+
+ JavaParameterInfo[] newParameters = initialChangeInfo.getNewParameters();
+ boolean first = true;
+ boolean[] toRemove = initialChangeInfo.toRemoveParm();
+ for (int i = 0; i < toRemove.length; i++) {
+ if (first) {
+ first = false;
+ }
+ else {
+ buf.append(", ");
+ }
+
+ if (toRemove[i]) {
+ String deletedParam = initialChangeInfo.getOldParameterTypes()[i] + " " + initialChangeInfo.getOldParameterNames()[i];
+ deleteRanges.add(new TextRange(buf.length(), buf.length() + deletedParam.length()));
+ buf.append(deletedParam);
+ }
+ else {
+ for (JavaParameterInfo parameter : newParameters) {
+ if (parameter.getOldIndex() == i) {
+ buf.append(parameter.getTypeText()).append(" ").append(parameter.getName());
+ break;
+ }
+ }
+ }
+ }
+
+ for (JavaParameterInfo param : newParameters) {
+ if (param.getOldIndex() == -1) {
+ if (first) {
+ first = false;
+ }
+ else {
+ buf.append(", ");
+ }
+ String paramPresentation = param.getTypeText() + " " + ObjectUtils.notNull(param.getName(), "");
+ newRanges.add(new TextRange(buf.length(), buf.length() + paramPresentation.length()));
+ buf.append(paramPresentation);
+ }
+ }
+ buf.append(")");
+ return buf.toString();
+ }
+
+ @Override
+ public FileType getFileType() {
+ return JavaFileType.INSTANCE;
+ }
+
@Override
public DetectedJavaChangeInfo createNextChangeInfo(String signature, @NotNull final DetectedJavaChangeInfo currentInfo, boolean delegate) {
final PsiElement currentInfoMethod = currentInfo.getMethod();
package com.intellij.refactoring.changeSignature.inplace;
import com.intellij.codeInsight.highlighting.HighlightManager;
+import com.intellij.openapi.application.Result;
import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.openapi.command.impl.FinishMarkAction;
import com.intellij.openapi.command.impl.StartMarkAction;
import com.intellij.openapi.editor.*;
+import com.intellij.openapi.editor.colors.CodeInsightColors;
import com.intellij.openapi.editor.colors.EditorColors;
import com.intellij.openapi.editor.colors.EditorColorsManager;
import com.intellij.openapi.editor.event.DocumentEvent;
import com.intellij.openapi.editor.event.DocumentListener;
+import com.intellij.openapi.editor.ex.EditorEx;
+import com.intellij.openapi.editor.markup.HighlighterLayer;
+import com.intellij.openapi.editor.markup.HighlighterTargetArea;
import com.intellij.openapi.editor.markup.RangeHighlighter;
import com.intellij.openapi.editor.markup.TextAttributes;
import com.intellij.openapi.fileEditor.OpenFileDescriptor;
import com.intellij.refactoring.RefactoringBundle;
import com.intellij.refactoring.changeSignature.ChangeInfo;
import com.intellij.refactoring.changeSignature.ChangeSignatureHandler;
+import com.intellij.refactoring.rename.inplace.InplaceRefactoring;
import com.intellij.ui.awt.RelativePoint;
import com.intellij.ui.components.JBCheckBox;
import com.intellij.util.ui.PositionTracker;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;
private StartMarkAction myMarkAction;
private Balloon myBalloon;
private boolean myDelegate;
+ private EditorEx myPreview;
public InplaceChangeSignature(Project project, Editor editor, @NotNull PsiElement element) {
myDocumentManager = PsiDocumentManager.getInstance(project);
highlighter.setGreedyToLeft(true);
}
myEditor.getDocument().addDocumentListener(this);
- showBalloon();
myEditor.putUserData(INPLACE_CHANGE_SIGNATURE, this);
+ myPreview = InplaceRefactoring.createPreviewComponent(project, myDetector.getFileType());
+ showBalloon();
}
@Nullable
if (changeInfo == null && myCurrentInfo != null) {
myStableChange = myCurrentInfo;
}
+ if (changeInfo != null) {
+ updateMethodSignature(changeInfo);
+ }
myCurrentInfo = changeInfo;
});
}
+ private void updateMethodSignature(ChangeInfo changeInfo) {
+ ArrayList<TextRange> deleteRanges = new ArrayList<>();
+ ArrayList<TextRange> newRanges = new ArrayList<>();
+ String methodSignature = myDetector.getMethodSignaturePreview(changeInfo, deleteRanges, newRanges);
+
+ myPreview.getMarkupModel().removeAllHighlighters();
+ new WriteCommandAction(null) {
+ @Override
+ protected void run(@NotNull Result result) throws Throwable {
+ myPreview.getDocument().replaceString(0, myPreview.getDocument().getTextLength(), methodSignature);
+ }
+ }.execute();
+ TextAttributes deprecatedAttributes = EditorColorsManager.getInstance().getGlobalScheme().getAttributes(CodeInsightColors.DEPRECATED_ATTRIBUTES);
+ for (TextRange range : deleteRanges) {
+ myPreview.getMarkupModel().addRangeHighlighter(range.getStartOffset(), range.getEndOffset(), HighlighterLayer.ADDITIONAL_SYNTAX,
+ deprecatedAttributes, HighlighterTargetArea.EXACT_RANGE);
+ }
+ TextAttributes todoAttributes = EditorColorsManager.getInstance().getGlobalScheme().getAttributes(CodeInsightColors.TODO_DEFAULT_ATTRIBUTES);
+ for (TextRange range : newRanges) {
+ myPreview.getMarkupModel().addRangeHighlighter(range.getStartOffset(), range.getEndOffset(), HighlighterLayer.ADDITIONAL_SYNTAX,
+ todoAttributes, HighlighterTargetArea.EXACT_RANGE);
+ }
+ }
+
protected void showBalloon() {
JBCheckBox checkBox = new JBCheckBox(RefactoringBundle.message("delegation.panel.delegate.via.overloading.method"));
checkBox.addActionListener(e -> myDelegate = checkBox.isSelected());
- final BalloonBuilder balloonBuilder = JBPopupFactory.getInstance().createDialogBalloonBuilder(checkBox, null).setSmallVariant(true);
+ JPanel content = new JPanel(new BorderLayout());
+ content.add(myPreview.getComponent(), BorderLayout.NORTH);
+ updateMethodSignature(myStableChange);
+ content.add(checkBox, BorderLayout.SOUTH);
+ final BalloonBuilder balloonBuilder = JBPopupFactory.getInstance().createDialogBalloonBuilder(content, null).setSmallVariant(true);
myBalloon = balloonBuilder.createBalloon();
myEditor.getScrollingModel().scrollToCaret(ScrollType.MAKE_VISIBLE);
myBalloon.show(new PositionTracker<Balloon>(myEditor.getContentComponent()) {
*/
package com.intellij.refactoring.changeSignature.inplace;
+import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.PsiElement;
import com.intellij.refactoring.changeSignature.ChangeInfo;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import java.util.List;
+
/**
* User: anna
* Date: Sep 6, 2010
final TextRange signatureRange = getHighlightingRange(initialChangeInfo);
return signatureRange.shiftRight(-signatureRange.getStartOffset()).substring(initialChangeInfo.getMethod().getText());
}
+
+ default String getMethodSignaturePreview(C info, final List<TextRange> deleteRanges, final List<TextRange> newRanges) {
+ return extractSignature(info);
+ }
+
+ FileType getFileType();
}
import com.intellij.openapi.command.CommandProcessor;
import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.openapi.command.impl.StartMarkAction;
-import com.intellij.openapi.command.undo.UndoUtil;
import com.intellij.openapi.editor.*;
import com.intellij.openapi.editor.colors.EditorColors;
import com.intellij.openapi.editor.colors.EditorColorsManager;
import com.intellij.openapi.editor.markup.TextAttributes;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.project.Project;
-import com.intellij.openapi.ui.popup.Balloon;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.Ref;
import com.intellij.refactoring.listeners.RefactoringEventData;
import com.intellij.refactoring.listeners.RefactoringEventListener;
import com.intellij.refactoring.rename.inplace.InplaceRefactoring;
-import com.intellij.ui.DottedBorder;
import com.intellij.util.ui.PositionTracker;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
-import javax.swing.border.LineBorder;
import java.awt.*;
import java.util.*;
import java.util.List;
myExprText = getExpressionText(expr);
myLocalName = localVariable != null ? localVariable.getName() : null;
- Document document = EditorFactory.getInstance().createDocument("");
- UndoUtil.disableUndoFor(document);
- myPreview = (EditorEx)EditorFactory.getInstance().createEditor(document, project, languageFileType, true);
- myPreview.setOneLineMode(true);
- final EditorSettings settings = myPreview.getSettings();
- settings.setAdditionalLinesCount(0);
- settings.setAdditionalColumnsCount(1);
- settings.setRightMarginShown(false);
- settings.setFoldingOutlineShown(false);
- settings.setLineNumbersShown(false);
- settings.setLineMarkerAreaShown(false);
- settings.setIndentGuidesShown(false);
- settings.setVirtualSpace(false);
- myPreview.setHorizontalScrollbarVisible(false);
- myPreview.setVerticalScrollbarVisible(false);
- myPreview.setCaretEnabled(false);
- settings.setLineCursorWidth(1);
-
- final Color bg = myPreview.getColorsScheme().getColor(EditorColors.CARET_ROW_COLOR);
- myPreview.setBackgroundColor(bg);
- myPreview.setBorder(BorderFactory.createCompoundBorder(new DottedBorder(Color.gray), new LineBorder(bg, 2)));
-
+ myPreview = createPreviewComponent(project, languageFileType);
myPreviewComponent = new JPanel(new BorderLayout());
myPreviewComponent.add(myPreview.getComponent(), BorderLayout.CENTER);
myPreviewComponent.setBorder(new EmptyBorder(2, 2, 6, 2));
import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.openapi.command.impl.FinishMarkAction;
import com.intellij.openapi.command.impl.StartMarkAction;
+import com.intellij.openapi.command.undo.UndoUtil;
import com.intellij.openapi.diagnostic.Logger;
-import com.intellij.openapi.editor.Document;
-import com.intellij.openapi.editor.Editor;
-import com.intellij.openapi.editor.RangeMarker;
-import com.intellij.openapi.editor.ScrollType;
+import com.intellij.openapi.editor.*;
import com.intellij.openapi.editor.colors.EditorColors;
import com.intellij.openapi.editor.colors.EditorColorsManager;
+import com.intellij.openapi.editor.ex.EditorEx;
import com.intellij.openapi.editor.ex.util.EditorUtil;
import com.intellij.openapi.editor.impl.EditorImpl;
import com.intellij.openapi.editor.markup.RangeHighlighter;
import com.intellij.openapi.fileEditor.FileEditorManager;
import com.intellij.openapi.fileEditor.OpenFileDescriptor;
import com.intellij.openapi.fileEditor.TextEditor;
+import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.keymap.Keymap;
import com.intellij.openapi.keymap.KeymapManager;
import com.intellij.openapi.keymap.KeymapUtil;
import com.intellij.refactoring.RefactoringActionHandler;
import com.intellij.refactoring.RefactoringBundle;
import com.intellij.refactoring.util.CommonRefactoringUtil;
+import com.intellij.ui.DottedBorder;
import com.intellij.ui.awt.RelativePoint;
import com.intellij.ui.popup.PopupFactoryImpl;
import com.intellij.util.CommonProcessors;
import org.jetbrains.annotations.TestOnly;
import javax.swing.*;
+import javax.swing.border.LineBorder;
import java.awt.*;
import java.util.*;
import java.util.List;
return myElementToRename instanceof PsiNameIdentifierOwner ? ((PsiNameIdentifierOwner)myElementToRename).getNameIdentifier() : null;
}
+ public static EditorEx createPreviewComponent(Project project, FileType languageFileType) {
+ Document document = EditorFactory.getInstance().createDocument("");
+ UndoUtil.disableUndoFor(document);
+ EditorEx previewEditor = (EditorEx)EditorFactory.getInstance().createEditor(document, project, languageFileType, true);
+ previewEditor.setOneLineMode(true);
+ final EditorSettings settings = previewEditor.getSettings();
+ settings.setAdditionalLinesCount(0);
+ settings.setAdditionalColumnsCount(1);
+ settings.setRightMarginShown(false);
+ settings.setFoldingOutlineShown(false);
+ settings.setLineNumbersShown(false);
+ settings.setLineMarkerAreaShown(false);
+ settings.setIndentGuidesShown(false);
+ settings.setVirtualSpace(false);
+ previewEditor.setHorizontalScrollbarVisible(false);
+ previewEditor.setVerticalScrollbarVisible(false);
+ previewEditor.setCaretEnabled(false);
+ settings.setLineCursorWidth(1);
+
+ final Color bg = previewEditor.getColorsScheme().getColor(EditorColors.CARET_ROW_COLOR);
+ previewEditor.setBackgroundColor(bg);
+ previewEditor.setBorder(BorderFactory.createCompoundBorder(new DottedBorder(Color.gray), new LineBorder(bg, 2)));
+
+ return previewEditor;
+ }
+
@Nullable
protected StartMarkAction startRename() throws StartMarkAction.AlreadyStartedException {
final StartMarkAction[] markAction = new StartMarkAction[1];