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