From def09d5c9fe871c626c2cd80261ee53cd03f813c Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Mon, 9 Oct 2017 12:34:07 +0200 Subject: [PATCH] SSR: reference predicate UI --- .../plugin/ui/EditVarConstraintsDialog.java | 89 +++++++++++++------ .../ui/SubstitutionShortInfoHandler.java | 10 ++- .../plugin/ui/VarConstraints.form | 67 +++++++++++--- .../source/messages/SSRBundle.properties | 5 +- 4 files changed, 127 insertions(+), 44 deletions(-) diff --git a/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/ui/EditVarConstraintsDialog.java b/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/ui/EditVarConstraintsDialog.java index 796afb4d3e53..a3b5e49daa38 100644 --- a/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/ui/EditVarConstraintsDialog.java +++ b/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/ui/EditVarConstraintsDialog.java @@ -41,7 +41,9 @@ import com.intellij.structuralsearch.plugin.replace.ReplaceOptions; import com.intellij.structuralsearch.plugin.replace.ui.ReplaceConfiguration; import com.intellij.structuralsearch.plugin.util.StructuralSearchScriptScope; import com.intellij.ui.EditorTextField; +import com.intellij.ui.TextAccessor; import com.intellij.ui.awt.RelativePoint; +import com.intellij.ui.components.JBCheckBox; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -67,31 +69,31 @@ import java.util.regex.PatternSyntaxException; class EditVarConstraintsDialog extends DialogWrapper { private static final Logger LOG = Logger.getInstance("#com.intellij.structuralsearch.plugin.ui.EditVarConstraintsDialog"); - JTextField maxoccurs; - JCheckBox applyWithinTypeHierarchy; + private JTextField maxoccurs; + private JCheckBox applyWithinTypeHierarchy; private JCheckBox notRegexp; private EditorTextField regexp; - JTextField minoccurs; + private JTextField minoccurs; private JPanel mainForm; - JList parameterList; + private JList parameterList; private JCheckBox partOfSearchResults; private JCheckBox notExprType; private EditorTextField regexprForExprType; - final Configuration myConfiguration; + private final Configuration myConfiguration; private JCheckBox exprTypeWithinHierarchy; - final List variables; - Variable current; + private final List variables; + private Variable current; private JCheckBox wholeWordsOnly; private JCheckBox formalArgTypeWithinHierarchy; private JCheckBox invertFormalArgType; private EditorTextField formalArgType; - ComponentWithBrowseButton customScriptCode; - JCheckBox maxoccursUnlimited; + private ComponentWithBrowseButton customScriptCode; + private JCheckBox maxoccursUnlimited; - TextFieldWithAutoCompletionWithBrowseButton withinTextField; + private TextFieldWithAutoCompletionWithBrowseButton withinTextField; private JPanel containedInConstraints; - private JCheckBox invertWithinIn; + private JCheckBox invertWithin; private JPanel expressionConstraints; private JPanel occurencePanel; private JPanel textConstraintsPanel; @@ -101,6 +103,9 @@ class EditVarConstraintsDialog extends DialogWrapper { private JButton myZeroInfinityButton; private JButton myOneInfinityButton; private JButton myZeroOneButton; + private TextFieldWithAutoCompletionWithBrowseButton refererenceTargetTextField; + private JPanel referenceTargetConstraints; + private JBCheckBox invertReferenceTarget; private final Project myProject; @@ -164,20 +169,9 @@ class EditVarConstraintsDialog extends DialogWrapper { final List names = ConfigurationManager.getInstance(project).getAllConfigurationNames(); withinTextField.setAutoCompletionItems(names); - withinTextField.addActionListener(new ActionListener() { - @Override - public void actionPerformed(@NotNull final ActionEvent e) { - final SelectTemplateDialog dialog = new SelectTemplateDialog(project, false, false); - dialog.selectConfiguration(withinTextField.getText().trim()); - dialog.show(); - if (dialog.getExitCode() == OK_EXIT_CODE) { - final Configuration[] selectedConfigurations = dialog.getSelectedConfigurations(); - if (selectedConfigurations.length == 1) { - withinTextField.setText(selectedConfigurations[0].getName()); - } - } - } - }); + withinTextField.addActionListener(new SelectTemplateListener(project, withinTextField)); + refererenceTargetTextField.setAutoCompletionItems(names); + refererenceTargetTextField.addActionListener(new SelectTemplateListener(project, refererenceTargetTextField)); boolean hasContextVar = false; for (Variable var : variables) { @@ -356,8 +350,16 @@ class EditVarConstraintsDialog extends DialogWrapper { final String withinConstraint = withinTextField.getText().trim(); final Configuration configuration = ConfigurationManager.getInstance(myProject).findConfigurationByName(withinConstraint); - varInfo.setWithinConstraint(configuration == null && withinConstraint.length() > 0 ? '"' + withinConstraint + '"' : withinConstraint); - varInfo.setInvertWithinConstraint(invertWithinIn.isSelected()); + varInfo.setWithinConstraint(configuration != null || withinConstraint.isEmpty() ? withinConstraint : '"' + withinConstraint + '"'); + varInfo.setInvertWithinConstraint(invertWithin.isSelected()); + + final String referenceTargetConstraint = refererenceTargetTextField.getText().trim(); + final Configuration configuration2 = ConfigurationManager.getInstance(myProject).findConfigurationByName(referenceTargetConstraint); + varInfo.setReferenceConstraint((configuration2 != null || referenceTargetConstraint.isEmpty()) + ? referenceTargetConstraint + : '"' + referenceTargetConstraint + '"'); + varInfo.setInvertReference(invertReferenceTarget.isSelected()); + } private static ReplacementVariableDefinition getOrAddReplacementVariableDefinition(String varName, Configuration configuration) { @@ -415,7 +417,9 @@ class EditVarConstraintsDialog extends DialogWrapper { customScriptCode.getChildComponent().setText(""); withinTextField.setText(""); - invertWithinIn.setSelected(false); + invertWithin.setSelected(false); + refererenceTargetTextField.setText(""); + invertReferenceTarget.setSelected(false); } else { applyWithinTypeHierarchy.setSelected(varInfo.isWithinHierarchy()); regexp.getDocument().setText(varInfo.getRegExp()); @@ -445,7 +449,9 @@ class EditVarConstraintsDialog extends DialogWrapper { restoreScriptCode(varInfo); withinTextField.setText(StringUtil.unquoteString(varInfo.getWithinConstraint())); - invertWithinIn.setSelected(varInfo.isInvertWithinConstraint()); + invertWithin.setSelected(varInfo.isInvertWithinConstraint()); + refererenceTargetTextField.setText(StringUtil.unquoteString(varInfo.getReferenceConstraint())); + invertReferenceTarget.setSelected(varInfo.isInvertReference()); } final boolean contextVar = Configuration.CONTEXT_VAR_NAME.equals(var.getName()); @@ -453,6 +459,7 @@ class EditVarConstraintsDialog extends DialogWrapper { textConstraintsPanel.setVisible(!contextVar); partOfSearchResults.setEnabled(!contextVar); occurencePanel.setVisible(!contextVar); + referenceTargetConstraints.setVisible(!contextVar); } private void setSearchConstraintsVisible(boolean b) { @@ -559,6 +566,7 @@ class EditVarConstraintsDialog extends DialogWrapper { myRegExHelpLabel = RegExHelpPopup.createRegExLink(SSRBundle.message("regular.expression.help.label"), regexp, LOG); myRegExHelpLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 5)); withinTextField = new TextFieldWithAutoCompletionWithBrowseButton(myProject); + refererenceTargetTextField = new TextFieldWithAutoCompletionWithBrowseButton(myProject); } private EditorTextField createRegexComponent() { @@ -693,4 +701,27 @@ class EditVarConstraintsDialog extends DialogWrapper { super.dispose(); } } + + private static class SelectTemplateListener implements ActionListener { + private final Project myProject; + private final TextAccessor myTextField; + + public SelectTemplateListener(Project project, TextAccessor textField) { + myProject = project; + myTextField = textField; + } + + @Override + public void actionPerformed(@NotNull final ActionEvent e) { + final SelectTemplateDialog dialog = new SelectTemplateDialog(myProject, false, false); + dialog.selectConfiguration(myTextField.getText().trim()); + dialog.show(); + if (dialog.getExitCode() == OK_EXIT_CODE) { + final Configuration[] selectedConfigurations = dialog.getSelectedConfigurations(); + if (selectedConfigurations.length == 1) { + myTextField.setText(selectedConfigurations[0].getName()); + } + } + } + } } diff --git a/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/ui/SubstitutionShortInfoHandler.java b/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/ui/SubstitutionShortInfoHandler.java index aade72c4be99..e5645005ec32 100644 --- a/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/ui/SubstitutionShortInfoHandler.java +++ b/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/ui/SubstitutionShortInfoHandler.java @@ -122,22 +122,26 @@ public class SubstitutionShortInfoHandler implements DocumentListener, EditorMou if (constraint.isPartOfSearchResults()) { append(buf, SSRBundle.message("target.tooltip.message")); } - if (constraint.getRegExp() != null && constraint.getRegExp().length() > 0) { + if (constraint.getRegExp() != null && !constraint.getRegExp().isEmpty()) { append(buf, SSRBundle.message("text.tooltip.message", constraint.isInvertRegExp() ? SSRBundle.message("not.tooltip.message") : "", constraint.getRegExp())); } if (constraint.isWithinHierarchy() || constraint.isStrictlyWithinHierarchy()) { append(buf, SSRBundle.message("within.hierarchy.tooltip.message")); } + if (!StringUtil.isEmpty(constraint.getReferenceConstraint())) { + final String text = StringUtil.unquoteString(constraint.getReferenceConstraint()); + append(buf, "reference target matches: " + text); + } - if (constraint.getNameOfExprType() != null && constraint.getNameOfExprType().length() > 0) { + if (constraint.getNameOfExprType() != null && !constraint.getNameOfExprType().isEmpty()) { append(buf, SSRBundle.message("exprtype.tooltip.message", constraint.isInvertExprType() ? SSRBundle.message("not.tooltip.message") : "", constraint.getNameOfExprType(), constraint.isExprTypeWithinHierarchy() ? SSRBundle.message("supertype.tooltip.message") : "")); } - if (constraint.getNameOfFormalArgType() != null && constraint.getNameOfFormalArgType().length() > 0) { + if (constraint.getNameOfFormalArgType() != null && !constraint.getNameOfFormalArgType().isEmpty()) { append(buf, SSRBundle.message("expected.type.tooltip.message", constraint.isInvertFormalType() ? SSRBundle.message("not.tooltip.message") : "", constraint.getNameOfFormalArgType(), diff --git a/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/ui/VarConstraints.form b/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/ui/VarConstraints.form index e7e0778b0dff..824fddcf0165 100644 --- a/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/ui/VarConstraints.form +++ b/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/ui/VarConstraints.form @@ -1,9 +1,9 @@
- + - + @@ -11,7 +11,7 @@ - + @@ -89,7 +89,7 @@ - + @@ -165,7 +165,7 @@ - + @@ -173,7 +173,7 @@ - + @@ -291,7 +291,7 @@ - + @@ -304,13 +304,21 @@ - + - + - + + + + + + + + + @@ -327,7 +335,7 @@ - + @@ -353,6 +361,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/platform/structuralsearch/source/messages/SSRBundle.properties b/platform/structuralsearch/source/messages/SSRBundle.properties index dd8e35e30eef..9613d2778a47 100644 --- a/platform/structuralsearch/source/messages/SSRBundle.properties +++ b/platform/structuralsearch/source/messages/SSRBundle.properties @@ -107,6 +107,7 @@ predefined.configuration.fields_variables.with.given.name.pattern.updated=fields predefined.configuration.trys=try's predefined.configuration.block.dcls=block dcls predefined.configuration.methods.of.the.class=methods of the class +predefined.configuration.deprecated.methods=deprecated methods predefined.configuration.instanceof=instanceof predefined.configuration.implementors.of.interface.within.hierarchy=implementors of interface (within hierarchy) predefined.configuration.generic.casts=generic casts @@ -149,6 +150,7 @@ predefined.configuration.new.expressions=new expressions predefined.configuration.lambdas=lambdas predefined.configuration.method.references=method references predefined.configuration.string.concatenations=string concatenations +predefined.configuration.deprecated.method.calls=method calls to deprecated methods # edit variable constraint dialog options invalid.regular.expression=Invalid regular expression\: {0} @@ -193,10 +195,11 @@ remove.template.action.name=Remove Template modify.editor.content.command.name=modify editor content var.constraints.variables.border=Variables var.constraints.occurrences.count.border=Occurrences count -var.constraints.within.pattern.border=Contained in search template +var.constraints.within.pattern.border=Contained in constraints var.constraints.script.constraints.border=Script constraints var.constraints.expression.constraints.border=Expression constraints var.constraints.text.constraints.border=Text constraints +var.constraints.reference.target.constraints.border=Reference target constraints different.strategies.for.top.level.nodes.error.message=Different strategies for top level nodes option.is.not.recognized.error.message=Constraint ''{0}'' not recognized