feat(gui): allow to search for full method/field signature, not only the name (PR #880)

This commit is contained in:
Jan S
2020-03-10 10:11:44 +01:00
committed by GitHub
parent 3c7be5e9be
commit c1f4302e62
9 changed files with 52 additions and 15 deletions
@@ -1,6 +1,7 @@
package jadx.gui.treemodel;
import javax.swing.*;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import jadx.api.JavaField;
import jadx.api.JavaNode;
@@ -65,11 +66,21 @@ public class JField extends JNode {
return UiUtils.typeFormat(field.getName(), field.getType());
}
@Override
public String makeStringHtml() {
return UiUtils.typeFormatHtml(field.getName(), field.getType());
}
@Override
public String makeLongString() {
return UiUtils.typeFormat(field.getFullName(), field.getType());
}
@Override
public String makeLongStringHtml() {
return UiUtils.typeFormatHtml(field.getFullName(), field.getType());
}
@Override
public int hashCode() {
return field.hashCode();
@@ -2,7 +2,8 @@ package jadx.gui.treemodel;
import java.util.Iterator;
import javax.swing.*;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import jadx.api.JavaMethod;
import jadx.api.JavaNode;
@@ -93,12 +94,23 @@ public class JMethod extends JNode {
return UiUtils.typeFormat(makeBaseString(), getReturnType());
}
@Override
public String makeStringHtml() {
return UiUtils.typeFormatHtml(makeBaseString(), getReturnType());
}
@Override
public String makeLongString() {
String name = mth.getDeclaringClass().getFullName() + '.' + makeBaseString();
return UiUtils.typeFormat(name, getReturnType());
}
@Override
public String makeLongStringHtml() {
String name = mth.getDeclaringClass().getFullName() + '.' + makeBaseString();
return UiUtils.typeFormatHtml(name, getReturnType());
}
@Override
public int hashCode() {
return mth.hashCode();
@@ -1,6 +1,6 @@
package jadx.gui.treemodel;
import javax.swing.*;
import javax.swing.Icon;
import javax.swing.tree.DefaultMutableTreeNode;
import org.fife.ui.rsyntaxtextarea.SyntaxConstants;
@@ -77,6 +77,10 @@ public abstract class JNode extends DefaultMutableTreeNode {
public abstract String makeString();
public String makeStringHtml() {
return makeString();
}
public String makeDescString() {
return null;
}
@@ -89,6 +93,10 @@ public abstract class JNode extends DefaultMutableTreeNode {
return makeString();
}
public String makeLongStringHtml() {
return makeString();
}
@Override
public String toString() {
return makeString();
@@ -446,7 +446,7 @@ public abstract class CommonSearchDialog extends JDialog {
private Component makeCell(JNode node, int column) {
if (column == 0) {
JLabel label = new JLabel(node.makeLongString() + " ", node.getIcon(), SwingConstants.LEFT);
JLabel label = new JLabel(node.makeLongStringHtml() + " ", node.getIcon(), SwingConstants.LEFT);
label.setFont(font);
label.setOpaque(true);
label.setToolTipText(label.getText());
@@ -196,7 +196,7 @@ public class RenameDialog extends JDialog {
private void initUI() {
JLabel lbl = new JLabel(NLS.str("popup.rename"));
JLabel nodeLabel = new JLabel(this.node.makeLongString(), this.node.getIcon(), SwingConstants.LEFT);
JLabel nodeLabel = new JLabel(this.node.makeLongStringHtml(), this.node.getIcon(), SwingConstants.LEFT);
lbl.setLabelFor(nodeLabel);
renameField = new JTextField(40);
@@ -47,7 +47,7 @@ public class TabComponent extends JPanel {
panel.setOpaque(false);
JNode node = contentPanel.getNode();
label = new JLabel(node.makeLongString());
label = new JLabel(node.makeLongStringHtml());
label.setFont(getLabelFont());
String toolTip = contentPanel.getTabTooltip();
if (toolTip != null) {
@@ -54,7 +54,7 @@ public class UsageDialog extends CommonSearchDialog {
private void initUI() {
JLabel lbl = new JLabel(NLS.str("usage_dialog.label"));
JLabel nodeLabel = new JLabel(this.node.makeLongString(), this.node.getIcon(), SwingConstants.LEFT);
JLabel nodeLabel = new JLabel(this.node.makeLongStringHtml(), this.node.getIcon(), SwingConstants.LEFT);
lbl.setLabelFor(nodeLabel);
JPanel searchPane = new JPanel();
@@ -65,6 +65,10 @@ public class UiUtils {
}
public static String typeFormat(String name, ArgType type) {
return name + typeStr(type);
}
public static String typeFormatHtml(String name, ArgType type) {
return "<html><body><nobr>" + escapeHtml(name)
+ "<span style='color:#888888;'> " + escapeHtml(typeStr(type)) + "</span>"
+ "</nobr></body></html>";
@@ -37,8 +37,8 @@ public class TextSearchIndex {
private final JNodeCache nodeCache;
private SearchIndex<JNode> clsNamesIndex;
private SearchIndex<JNode> mthNamesIndex;
private SearchIndex<JNode> fldNamesIndex;
private SearchIndex<JNode> mthSignaturesIndex;
private SearchIndex<JNode> fldSignaturesIndex;
private SearchIndex<CodeNode> codeIndex;
private List<JavaClass> skippedClasses = new ArrayList<>();
@@ -46,18 +46,20 @@ public class TextSearchIndex {
public TextSearchIndex(JNodeCache nodeCache) {
this.nodeCache = nodeCache;
this.clsNamesIndex = new SimpleIndex<>();
this.mthNamesIndex = new SimpleIndex<>();
this.fldNamesIndex = new SimpleIndex<>();
this.mthSignaturesIndex = new SimpleIndex<>();
this.fldSignaturesIndex = new SimpleIndex<>();
this.codeIndex = new CodeIndex<>();
}
public void indexNames(JavaClass cls) {
clsNamesIndex.put(cls.getFullName(), nodeCache.makeFrom(cls));
for (JavaMethod mth : cls.getMethods()) {
mthNamesIndex.put(mth.getName(), nodeCache.makeFrom(mth));
JNode mthNode = nodeCache.makeFrom(mth);
mthSignaturesIndex.put(mthNode.makeLongString(), mthNode);
}
for (JavaField fld : cls.getFields()) {
fldNamesIndex.put(fld.getName(), nodeCache.makeFrom(fld));
JNode fldNode = nodeCache.makeFrom(fld);
fldSignaturesIndex.put(fldNode.makeLongString(), fldNode);
}
for (JavaClass innerCls : cls.getInnerClasses()) {
indexNames(innerCls);
@@ -97,10 +99,10 @@ public class TextSearchIndex {
result = Flowable.concat(result, clsNamesIndex.search(text, ignoreCase));
}
if (options.contains(METHOD)) {
result = Flowable.concat(result, mthNamesIndex.search(text, ignoreCase));
result = Flowable.concat(result, mthSignaturesIndex.search(text, ignoreCase));
}
if (options.contains(FIELD)) {
result = Flowable.concat(result, fldNamesIndex.search(text, ignoreCase));
result = Flowable.concat(result, fldSignaturesIndex.search(text, ignoreCase));
}
if (options.contains(CODE)) {
if (codeIndex.size() > 0) {