blob: 5bec5a920b45027a86398d58ec8d60cee32cc70c [file] [log] [blame]
package com.intellij.structuralsearch.plugin.replace.ui;
import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.EditorFactory;
import com.intellij.openapi.editor.colors.EditorColors;
import com.intellij.openapi.editor.colors.EditorColorsManager;
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.fileEditor.FileEditorManager;
import com.intellij.openapi.fileEditor.OpenFileDescriptor;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.fileTypes.FileTypes;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.util.Segment;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.util.PsiUtilCore;
import com.intellij.structuralsearch.SSRBundle;
import com.intellij.structuralsearch.StructuralSearchProfile;
import com.intellij.structuralsearch.StructuralSearchUtil;
import com.intellij.structuralsearch.plugin.ui.UIUtil;
import com.intellij.usageView.UsageInfo;
import javax.swing.*;
import java.awt.*;
/**
* Navigates through the search results
*/
public final class ReplacementPreviewDialog extends DialogWrapper {
private final FileType myFileType;
private Editor replacement;
private final Project project;
private RangeHighlighter hilighter;
private Editor editor;
public ReplacementPreviewDialog(final Project project, UsageInfo info, String replacementString) {
super(project,true);
setTitle(SSRBundle.message("structural.replace.preview.dialog.title"));
setOKButtonText(SSRBundle.message("replace.preview.oktext"));
this.project = project;
final PsiElement element = info.getElement();
final VirtualFile virtualFile = PsiUtilCore.getVirtualFile(element);
myFileType = virtualFile != null ? virtualFile.getFileType() : FileTypes.PLAIN_TEXT;
init();
Segment range = info.getSegment();
hilight(virtualFile, range.getStartOffset(), range.getEndOffset());
UIUtil.setContent(replacement, replacementString,0,-1,project);
final StructuralSearchProfile profile = StructuralSearchUtil.getProfileByPsiElement(element);
if (profile != null) {
UIUtil.updateHighlighter(replacement, profile);
}
}
private void hilight(VirtualFile file,int start, int end) {
removeHilighter();
editor = FileEditorManager.getInstance(project).openTextEditor(
new OpenFileDescriptor(project, file),
false
);
hilighter = editor.getMarkupModel().addRangeHighlighter(
start,
end,
HighlighterLayer.SELECTION - 100,
EditorColorsManager.getInstance().getGlobalScheme().getAttributes(EditorColors.SEARCH_RESULT_ATTRIBUTES),
HighlighterTargetArea.EXACT_RANGE
);
}
private void removeHilighter() {
if (hilighter!=null && hilighter.isValid()) {
hilighter.dispose();
hilighter = null;
editor = null;
}
}
protected String getDimensionServiceKey() {
return "#com.intellij.strucuturalsearch.plugin.replace.ReplacementPreviewDialog";
}
protected JComponent createCenterPanel() {
JComponent centerPanel = new JPanel( new BorderLayout() );
PsiFile file = null;
final StructuralSearchProfile profile = StructuralSearchUtil.getProfileByFileType(myFileType);
if (profile != null) {
file = profile.createCodeFragment(project, "", null);
}
if (file != null) {
final Document document = PsiDocumentManager.getInstance(project).getDocument(file);
replacement = UIUtil.createEditor(document, project, true, null);
DaemonCodeAnalyzer.getInstance(project).setHighlightingEnabled(file,false);
} else {
final EditorFactory factory = EditorFactory.getInstance();
final Document document = factory.createDocument("");
replacement = factory.createEditor(document, project, myFileType, false);
}
centerPanel.add(BorderLayout.NORTH,new JLabel(SSRBundle.message("replacement.code")) );
centerPanel.add(BorderLayout.CENTER,replacement.getComponent() );
centerPanel.setMaximumSize(new Dimension(640,480));
return centerPanel;
}
public void dispose() {
final PsiFile file = PsiDocumentManager.getInstance(project).getPsiFile(replacement.getDocument());
if (file != null) {
DaemonCodeAnalyzer.getInstance(project).setHighlightingEnabled(file, true);
}
EditorFactory.getInstance().releaseEditor(replacement);
removeHilighter();
super.dispose();
}
}