summaryrefslogtreecommitdiff
path: root/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/replace/ui/ReplacementPreviewDialog.java
diff options
context:
space:
mode:
Diffstat (limited to 'platform/structuralsearch/source/com/intellij/structuralsearch/plugin/replace/ui/ReplacementPreviewDialog.java')
-rw-r--r--platform/structuralsearch/source/com/intellij/structuralsearch/plugin/replace/ui/ReplacementPreviewDialog.java132
1 files changed, 132 insertions, 0 deletions
diff --git a/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/replace/ui/ReplacementPreviewDialog.java b/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/replace/ui/ReplacementPreviewDialog.java
new file mode 100644
index 000000000000..5bec5a920b45
--- /dev/null
+++ b/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/replace/ui/ReplacementPreviewDialog.java
@@ -0,0 +1,132 @@
+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();
+ }
+}
+