summaryrefslogtreecommitdiff
path: root/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/ui/UIUtil.java
diff options
context:
space:
mode:
Diffstat (limited to 'platform/structuralsearch/source/com/intellij/structuralsearch/plugin/ui/UIUtil.java')
-rw-r--r--platform/structuralsearch/source/com/intellij/structuralsearch/plugin/ui/UIUtil.java241
1 files changed, 241 insertions, 0 deletions
diff --git a/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/ui/UIUtil.java b/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/ui/UIUtil.java
new file mode 100644
index 000000000000..aa3ca82725b0
--- /dev/null
+++ b/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/ui/UIUtil.java
@@ -0,0 +1,241 @@
+package com.intellij.structuralsearch.plugin.ui;
+
+import com.intellij.codeInsight.hint.TooltipController;
+import com.intellij.codeInsight.hint.TooltipGroup;
+import com.intellij.codeInsight.template.TemplateContextType;
+import com.intellij.codeInsight.template.impl.TemplateContext;
+import com.intellij.codeInsight.template.impl.TemplateEditorUtil;
+import com.intellij.openapi.application.ApplicationManager;
+import com.intellij.openapi.command.CommandProcessor;
+import com.intellij.openapi.editor.Document;
+import com.intellij.openapi.editor.Editor;
+import com.intellij.openapi.editor.EditorFactory;
+import com.intellij.openapi.editor.EditorSettings;
+import com.intellij.openapi.editor.colors.EditorColors;
+import com.intellij.openapi.editor.colors.EditorColorsManager;
+import com.intellij.openapi.editor.colors.EditorColorsScheme;
+import com.intellij.openapi.editor.ex.EditorEx;
+import com.intellij.openapi.fileEditor.FileEditorManager;
+import com.intellij.openapi.fileEditor.OpenFileDescriptor;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.util.Key;
+import com.intellij.openapi.util.text.StringUtil;
+import com.intellij.psi.*;
+import com.intellij.structuralsearch.*;
+import com.intellij.structuralsearch.plugin.StructuralReplaceAction;
+import com.intellij.structuralsearch.plugin.StructuralSearchAction;
+import com.intellij.structuralsearch.plugin.replace.ui.ReplaceConfiguration;
+import com.intellij.structuralsearch.plugin.util.SmartPsiPointer;
+import org.jetbrains.annotations.NonNls;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import javax.swing.*;
+import java.awt.*;
+
+/**
+ * @author Maxim.Mossienko
+ * Date: Apr 21, 2004
+ * Time: 7:50:48 PM
+ */
+public class UIUtil {
+ static Key<SubstitutionShortInfoHandler> LISTENER_KEY = Key.create("sslistener.key");
+ private static final String MODIFY_EDITOR_CONTENT = SSRBundle.message("modify.editor.content.command.name");
+ @NonNls private static final String SS_GROUP = "structuralsearchgroup";
+
+ @NotNull
+ public static Editor createEditor(Document doc, final Project project, boolean editable, @Nullable TemplateContextType contextType) {
+ return createEditor(doc, project, editable, false, contextType);
+ }
+
+ @NotNull
+ public static Editor createEditor(@NotNull Document doc,
+ final Project project,
+ boolean editable,
+ boolean addToolTipForVariableHandler,
+ @Nullable TemplateContextType contextType) {
+ final Editor editor =
+ editable ? EditorFactory.getInstance().createEditor(doc, project) : EditorFactory.getInstance().createViewer(doc, project);
+
+ EditorSettings editorSettings = editor.getSettings();
+ editorSettings.setVirtualSpace(false);
+ editorSettings.setLineMarkerAreaShown(false);
+ editorSettings.setIndentGuidesShown(false);
+ editorSettings.setLineNumbersShown(false);
+ editorSettings.setFoldingOutlineShown(false);
+
+ EditorColorsScheme scheme = editor.getColorsScheme();
+ scheme.setColor(EditorColors.CARET_ROW_COLOR, null);
+ if (!editable) {
+ final EditorColorsScheme globalScheme = EditorColorsManager.getInstance().getGlobalScheme();
+ Color c = globalScheme.getColor(EditorColors.READONLY_BACKGROUND_COLOR);
+
+ if (c == null) {
+ c = globalScheme.getDefaultBackground();
+ }
+
+ ((EditorEx)editor).setBackgroundColor(c);
+ }
+ else {
+ ((EditorEx)editor).setEmbeddedIntoDialogWrapper(true);
+ }
+
+ if (contextType != null) {
+ TemplateContext context = new TemplateContext();
+ context.setEnabled(contextType, true);
+ TemplateEditorUtil.setHighlighter(editor, context);
+ }
+
+ if (addToolTipForVariableHandler) {
+ SubstitutionShortInfoHandler handler = new SubstitutionShortInfoHandler(editor);
+ editor.addEditorMouseMotionListener(handler);
+ editor.getDocument().addDocumentListener(handler);
+ editor.getCaretModel().addCaretListener(handler);
+ editor.putUserData(LISTENER_KEY, handler);
+ }
+
+ return editor;
+ }
+
+ public static JComponent createOptionLine(JComponent[] options) {
+ JPanel tmp = new JPanel();
+
+ tmp.setLayout(new BoxLayout(tmp, BoxLayout.X_AXIS));
+ for (int i = 0; i < options.length; i++) {
+ if (i != 0) {
+ tmp.add(Box.createHorizontalStrut(com.intellij.util.ui.UIUtil.DEFAULT_HGAP));
+ }
+ tmp.add(options[i]);
+ }
+ tmp.add(Box.createHorizontalGlue());
+
+ return tmp;
+ }
+
+ public static JComponent createOptionLine(JComponent option) {
+ return createOptionLine(new JComponent[]{option});
+ }
+
+ public static void setContent(final Editor editor, String val, final int from, final int end, final Project project) {
+ final String value = val != null ? val : "";
+
+ CommandProcessor.getInstance().executeCommand(project, new Runnable() {
+ public void run() {
+ ApplicationManager.getApplication().runWriteAction(new Runnable() {
+ public void run() {
+ editor.getDocument().replaceString(from, (end == -1) ? editor.getDocument().getTextLength() : end, value);
+ }
+ });
+ }
+ }, MODIFY_EDITOR_CONTENT, SS_GROUP);
+ }
+
+ static String getShortParamString(Configuration config, String varname) {
+ if (config == null) return "";
+ final MatchOptions options = config.getMatchOptions();
+
+
+ final MatchVariableConstraint constraint = options == null ? null : options.getVariableConstraint(varname);
+ NamedScriptableDefinition namedScriptableDefinition = constraint;
+
+ final ReplacementVariableDefinition replacementVariableDefinition =
+ config instanceof ReplaceConfiguration ? ((ReplaceConfiguration)config).getOptions().getVariableDefinition(varname) : null;
+ if (replacementVariableDefinition != null) namedScriptableDefinition = replacementVariableDefinition;
+
+ if (constraint == null && replacementVariableDefinition == null) {
+ return SSRBundle.message("no.constraints.specified.tooltip.message");
+ }
+
+ final StringBuilder buf = new StringBuilder();
+
+ if (constraint != null) {
+ if (constraint.isPartOfSearchResults()) {
+ append(buf, SSRBundle.message("target.tooltip.message"));
+ }
+ if (constraint.getRegExp() != null && constraint.getRegExp().length() > 0) {
+ append(buf, SSRBundle.message("text.tooltip.message", constraint.isInvertRegExp() ? SSRBundle.message("not.tooltip.message") : "",
+ constraint.getRegExp(),
+ constraint.isWithinHierarchy() || constraint.isStrictlyWithinHierarchy() ?
+ SSRBundle.message("within.hierarchy.tooltip.message") : ""));
+ }
+
+ if (constraint.getNameOfExprType() != null && constraint.getNameOfExprType().length() > 0) {
+ append(buf, SSRBundle.message("exprtype.tooltip.message",
+ constraint.isInvertExprType() ? SSRBundle.message("not.tooltip.message") : "",
+ constraint.getNameOfExprType(),
+ constraint.isExprTypeWithinHierarchy() ? SSRBundle.message("within.hierarchy.tooltip.message") : ""));
+ }
+
+ if (constraint.getMinCount() == constraint.getMaxCount()) {
+ append(buf, SSRBundle.message("occurs.tooltip.message", constraint.getMinCount()));
+ }
+ else {
+ append(buf, SSRBundle.message("min.occurs.tooltip.message", constraint.getMinCount(),
+ constraint.getMaxCount() == Integer.MAX_VALUE ?
+ StringUtil.decapitalize(SSRBundle.message("editvarcontraints.unlimited")) :
+ constraint.getMaxCount()));
+ }
+ }
+
+ final String script = namedScriptableDefinition.getScriptCodeConstraint();
+ if (script != null && script.length() > 2) {
+ final String str = SSRBundle.message("script.tooltip.message", StringUtil.stripQuotesAroundValue(script));
+ append(buf, str);
+ }
+
+ return buf.toString();
+ }
+
+ private static void append(final StringBuilder buf, final String str) {
+ if (buf.length() > 0) buf.append(", ");
+ buf.append(str);
+ }
+
+ public static void navigate(PsiElement result) {
+ FileEditorManager.getInstance(result.getProject()).openTextEditor(
+ new OpenFileDescriptor(result.getProject(), result.getContainingFile().getVirtualFile(), result.getTextOffset()), true);
+ }
+
+ public static void navigate(MatchResult result) {
+ final SmartPsiPointer ref = result.getMatchRef();
+
+ FileEditorManager.getInstance(ref.getProject())
+ .openTextEditor(new OpenFileDescriptor(ref.getProject(), ref.getFile(), ref.getOffset()), true);
+ }
+
+ public static void invokeAction(Configuration config, SearchContext context) {
+ if (config instanceof SearchConfiguration) {
+ StructuralSearchAction.triggerAction(config, context);
+ }
+ else {
+ StructuralReplaceAction.triggerAction(config, context);
+ }
+ }
+
+ static void showTooltip(@NotNull Editor editor, final int start, int end, @NotNull String text, @NotNull TooltipGroup group) {
+ Rectangle visibleArea = editor.getScrollingModel().getVisibleArea();
+ Point top = editor.logicalPositionToXY(editor.offsetToLogicalPosition(start));
+ final int documentLength = editor.getDocument().getTextLength();
+ if (end >= documentLength) end = documentLength;
+ Point bottom = editor.logicalPositionToXY(editor.offsetToLogicalPosition(end));
+
+ Point bestPoint = new Point(top.x, bottom.y + editor.getLineHeight());
+
+ if (!visibleArea.contains(bestPoint)) {
+ int defaultOffset = editor.logicalPositionToOffset(editor.xyToLogicalPosition(new Point(0, 0)));
+ bestPoint = editor.logicalPositionToXY(editor.offsetToLogicalPosition(defaultOffset));
+ }
+
+ Point p = SwingUtilities.convertPoint(editor.getContentComponent(), bestPoint, editor.getComponent().getRootPane().getLayeredPane());
+ TooltipController.getInstance().showTooltip(editor, p, text, false, group);
+ }
+
+ public static void updateHighlighter(Editor editor, StructuralSearchProfile profile) {
+ final TemplateContextType contextType = profile.getTemplateContextType();
+ if (contextType != null) {
+ TemplateContext context = new TemplateContext();
+ context.setEnabled(contextType, true);
+ TemplateEditorUtil.setHighlighter(editor, context);
+ }
+ }
+}