diff --git a/jadx-gui/src/main/java/jadx/gui/plugins/quark/QuarkDialog.java b/jadx-gui/src/main/java/jadx/gui/plugins/quark/QuarkDialog.java index 2ac4137430bbd1ad132f07512f60fdec4ebde7ce..abeee831aacf9a21f17d34db2b804bff1b6806b5 100644 --- a/jadx-gui/src/main/java/jadx/gui/plugins/quark/QuarkDialog.java +++ b/jadx-gui/src/main/java/jadx/gui/plugins/quark/QuarkDialog.java @@ -21,6 +21,7 @@ import org.slf4j.LoggerFactory; import jadx.gui.settings.JadxSettings; import jadx.gui.ui.MainWindow; import jadx.gui.utils.UiUtils; +import jadx.gui.utils.ui.NodeLabel; public class QuarkDialog extends JDialog { private static final long serialVersionUID = 4855753773520368215L; @@ -59,7 +60,7 @@ public class QuarkDialog extends JDialog { description.setAlignmentX(0.5f); fileSelectCombo = new JComboBox<>(files.toArray(new Path[0])); - fileSelectCombo.setRenderer((list, value, index, isSelected, cellHasFocus) -> new JLabel(value.getFileName().toString())); + fileSelectCombo.setRenderer((list, value, index, isSelected, cellHasFocus) -> new NodeLabel(value.getFileName().toString())); JPanel textPane = new JPanel(); textPane.add(description); diff --git a/jadx-gui/src/main/java/jadx/gui/plugins/quark/QuarkReportPanel.java b/jadx-gui/src/main/java/jadx/gui/plugins/quark/QuarkReportPanel.java index 8507cc39f7040daf232665d2bba4f46f3a615807..552008a7c0c18ad491f9da0be54eb9d0d65c28ca 100644 --- a/jadx-gui/src/main/java/jadx/gui/plugins/quark/QuarkReportPanel.java +++ b/jadx-gui/src/main/java/jadx/gui/plugins/quark/QuarkReportPanel.java @@ -44,6 +44,7 @@ import jadx.gui.ui.MainWindow; import jadx.gui.ui.TabbedPane; import jadx.gui.ui.panel.ContentPanel; import jadx.gui.utils.JNodeCache; +import jadx.gui.utils.ui.NodeLabel; public class QuarkReportPanel extends ContentPanel { private static final long serialVersionUID = -242266836695889206L; @@ -211,7 +212,7 @@ public class QuarkReportPanel extends ContentPanel { @Override public Component render() { - JLabel label = new JLabel(((String) getUserObject())); + JLabel label = new NodeLabel(((String) getUserObject())); label.setFont(bold ? boldFont : font); label.setIcon(null); label.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); @@ -320,7 +321,7 @@ public class QuarkReportPanel extends ContentPanel { @Override public Component render() { - JLabel label = new JLabel(mth.toString()); + JLabel label = new NodeLabel(mth.toString()); label.setFont(font); label.setIcon(jnode.getIcon()); label.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); diff --git a/jadx-gui/src/main/java/jadx/gui/treemodel/CodeNode.java b/jadx-gui/src/main/java/jadx/gui/treemodel/CodeNode.java index f8461160c5636ec0ae8e05a898500411268bdcbf..2ae107eca2fcf718e57e7e60db126f7137772a71 100644 --- a/jadx-gui/src/main/java/jadx/gui/treemodel/CodeNode.java +++ b/jadx-gui/src/main/java/jadx/gui/treemodel/CodeNode.java @@ -71,6 +71,11 @@ public class CodeNode extends JNode { return jNode.makeLongStringHtml(); } + @Override + public boolean disableHtml() { + return jNode.disableHtml(); + } + @Override public String getSyntaxName() { return jNode.getSyntaxName(); diff --git a/jadx-gui/src/main/java/jadx/gui/treemodel/JField.java b/jadx-gui/src/main/java/jadx/gui/treemodel/JField.java index 676786c5ca7875e29e00c8727aa7908531d1fdda..0d03bceda9321a11a068c0c6366c5b13ae1ec81b 100644 --- a/jadx-gui/src/main/java/jadx/gui/treemodel/JField.java +++ b/jadx-gui/src/main/java/jadx/gui/treemodel/JField.java @@ -97,6 +97,11 @@ public class JField extends JNode { return UiUtils.typeStr(field.getType()) + " " + field.getName(); } + @Override + public boolean disableHtml() { + return false; + } + @Override public boolean hasDescString() { return false; diff --git a/jadx-gui/src/main/java/jadx/gui/treemodel/JMethod.java b/jadx-gui/src/main/java/jadx/gui/treemodel/JMethod.java index 015861532785c957d42b26762d33b5c44be4341d..95e004c382ceeae1bc73e961f4d16c3ec71e534f 100644 --- a/jadx-gui/src/main/java/jadx/gui/treemodel/JMethod.java +++ b/jadx-gui/src/main/java/jadx/gui/treemodel/JMethod.java @@ -155,6 +155,11 @@ public class JMethod extends JNode { return UiUtils.typeFormatHtml(name, getReturnType()); } + @Override + public boolean disableHtml() { + return false; + } + @Override public String makeDescString() { return UiUtils.typeStr(getReturnType()) + " " + makeBaseString(); diff --git a/jadx-gui/src/main/java/jadx/gui/treemodel/JNode.java b/jadx-gui/src/main/java/jadx/gui/treemodel/JNode.java index f974e5e74f96a08df7944047c62057489200e95c..7ab949c2535ddb5a6ab440b4c02ad830b8504800 100644 --- a/jadx-gui/src/main/java/jadx/gui/treemodel/JNode.java +++ b/jadx-gui/src/main/java/jadx/gui/treemodel/JNode.java @@ -81,6 +81,10 @@ public abstract class JNode extends DefaultMutableTreeNode implements Comparable return makeLongString(); } + public boolean disableHtml() { + return true; + } + public int getPos() { JavaNode javaNode = getJavaNode(); if (javaNode == null) { diff --git a/jadx-gui/src/main/java/jadx/gui/ui/MainWindow.java b/jadx-gui/src/main/java/jadx/gui/ui/MainWindow.java index 75fea8b26936e47ddadebbdcbe4bcca6908c0ded..d2e17e7c81ad2e4da2bd1ef7f0be21d5c1b79c57 100644 --- a/jadx-gui/src/main/java/jadx/gui/ui/MainWindow.java +++ b/jadx-gui/src/main/java/jadx/gui/ui/MainWindow.java @@ -142,6 +142,7 @@ import jadx.gui.utils.UiUtils; import jadx.gui.utils.fileswatcher.LiveReloadWorker; import jadx.gui.utils.logs.LogCollector; import jadx.gui.utils.ui.ActionHandler; +import jadx.gui.utils.ui.NodeLabel; import static io.reactivex.internal.functions.Functions.EMPTY_RUNNABLE; import static javax.swing.KeyStroke.getKeyStroke; @@ -1281,6 +1282,7 @@ public class MainWindow extends JFrame { Component c = super.getTreeCellRendererComponent(tree, value, selected, expanded, isLeaf, row, focused); if (value instanceof JNode) { JNode jNode = (JNode) value; + NodeLabel.disableHtml(this, jNode.disableHtml()); setText(jNode.makeStringHtml()); setIcon(jNode.getIcon()); setToolTipText(jNode.getTooltip()); diff --git a/jadx-gui/src/main/java/jadx/gui/ui/TabComponent.java b/jadx-gui/src/main/java/jadx/gui/ui/TabComponent.java index 277a98f583ef7e9701d30a90bd8fedeb598e1de2..db8c9d793cafabe784c74e3d9f6d074baf126bad 100644 --- a/jadx-gui/src/main/java/jadx/gui/ui/TabComponent.java +++ b/jadx-gui/src/main/java/jadx/gui/ui/TabComponent.java @@ -23,6 +23,7 @@ import jadx.gui.ui.panel.ContentPanel; import jadx.gui.utils.Icons; import jadx.gui.utils.NLS; import jadx.gui.utils.UiUtils; +import jadx.gui.utils.ui.NodeLabel; public class TabComponent extends JPanel { private static final long serialVersionUID = -8147035487543610321L; @@ -58,7 +59,7 @@ public class TabComponent extends JPanel { } else { tabTitle = node.makeLongStringHtml(); } - label = new JLabel(tabTitle); + label = new NodeLabel(tabTitle, node.disableHtml()); label.setFont(getLabelFont()); String toolTip = contentPanel.getTabTooltip(); if (toolTip != null) { diff --git a/jadx-gui/src/main/java/jadx/gui/ui/dialog/CommonSearchDialog.java b/jadx-gui/src/main/java/jadx/gui/ui/dialog/CommonSearchDialog.java index eb62a2df7db5d89523dc4dcd0b6ec5b05e451eb2..6e1cd7700e06d5f50975a5f8054429a26b7bbac3 100644 --- a/jadx-gui/src/main/java/jadx/gui/ui/dialog/CommonSearchDialog.java +++ b/jadx-gui/src/main/java/jadx/gui/ui/dialog/CommonSearchDialog.java @@ -55,6 +55,7 @@ import jadx.gui.utils.JNodeCache; import jadx.gui.utils.JumpPosition; import jadx.gui.utils.NLS; import jadx.gui.utils.UiUtils; +import jadx.gui.utils.ui.NodeLabel; import static javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED; import static javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED; @@ -402,9 +403,9 @@ public abstract class CommonSearchDialog extends JFrame { } protected final class ResultsTableCellRenderer implements TableCellRenderer { - private final JLabel label; + private final NodeLabel label; private final RSyntaxTextArea codeArea; - private final JLabel emptyLabel; + private final NodeLabel emptyLabel; private final Color codeSelectedColor; private final Color codeBackground; @@ -414,11 +415,11 @@ public abstract class CommonSearchDialog extends JFrame { codeArea.setRows(1); codeBackground = codeArea.getBackground(); codeSelectedColor = codeArea.getSelectionColor(); - label = new JLabel(); + label = new NodeLabel(); label.setOpaque(true); label.setFont(codeArea.getFont()); label.setHorizontalAlignment(SwingConstants.LEFT); - emptyLabel = new JLabel(); + emptyLabel = new NodeLabel(); emptyLabel.setOpaque(true); } @@ -454,8 +455,9 @@ public abstract class CommonSearchDialog extends JFrame { private Component makeCell(JNode node, int column) { if (column == 0) { label.setText(node.makeLongStringHtml()); - label.setToolTipText(label.getText()); + label.setToolTipText(node.getTooltip()); label.setIcon(node.getIcon()); + label.disableHtml(node.disableHtml()); return label; } if (!node.hasDescString()) { diff --git a/jadx-gui/src/main/java/jadx/gui/ui/dialog/RenameDialog.java b/jadx-gui/src/main/java/jadx/gui/ui/dialog/RenameDialog.java index 0fa1888559ccface22104b45818ccba13dd1ea2f..63e0a49f77d7f8bf02b5699f921e9244dc03ee6e 100644 --- a/jadx-gui/src/main/java/jadx/gui/ui/dialog/RenameDialog.java +++ b/jadx-gui/src/main/java/jadx/gui/ui/dialog/RenameDialog.java @@ -22,7 +22,6 @@ import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; -import javax.swing.SwingConstants; import javax.swing.WindowConstants; import org.jetbrains.annotations.NotNull; @@ -60,6 +59,7 @@ import jadx.gui.utils.NLS; import jadx.gui.utils.TextStandardActions; import jadx.gui.utils.UiUtils; import jadx.gui.utils.ui.DocumentUpdateListener; +import jadx.gui.utils.ui.NodeLabel; public class RenameDialog extends JDialog { private static final long serialVersionUID = -3269715644416902410L; @@ -313,7 +313,7 @@ public class RenameDialog extends JDialog { private void initUI() { JLabel lbl = new JLabel(NLS.str("popup.rename")); - JLabel nodeLabel = new JLabel(this.node.makeLongStringHtml(), this.node.getIcon(), SwingConstants.LEFT); + JLabel nodeLabel = NodeLabel.longName(node); lbl.setLabelFor(nodeLabel); renameField = new JTextField(40); diff --git a/jadx-gui/src/main/java/jadx/gui/ui/dialog/UsageDialog.java b/jadx-gui/src/main/java/jadx/gui/ui/dialog/UsageDialog.java index 4febed33aff849bc233631041f8ca4689f490399..57014b2a5e620a4b4fe373e5f8e0dea34fbdf18d 100644 --- a/jadx-gui/src/main/java/jadx/gui/ui/dialog/UsageDialog.java +++ b/jadx-gui/src/main/java/jadx/gui/ui/dialog/UsageDialog.java @@ -12,7 +12,6 @@ import java.util.Map; import javax.swing.BorderFactory; import javax.swing.JLabel; import javax.swing.JPanel; -import javax.swing.SwingConstants; import javax.swing.WindowConstants; import jadx.api.ICodeInfo; @@ -31,6 +30,7 @@ import jadx.gui.ui.MainWindow; import jadx.gui.utils.JNodeCache; import jadx.gui.utils.NLS; import jadx.gui.utils.UiUtils; +import jadx.gui.utils.ui.NodeLabel; public class UsageDialog extends CommonSearchDialog { private static final long serialVersionUID = -5105405789969134105L; @@ -147,7 +147,7 @@ public class UsageDialog extends CommonSearchDialog { Font codeFont = settings.getFont(); JLabel lbl = new JLabel(NLS.str("usage_dialog.label")); lbl.setFont(codeFont); - JLabel nodeLabel = new JLabel(this.node.makeLongStringHtml(), this.node.getIcon(), SwingConstants.LEFT); + JLabel nodeLabel = NodeLabel.longName(node); nodeLabel.setFont(codeFont); lbl.setLabelFor(nodeLabel); diff --git a/jadx-gui/src/main/java/jadx/gui/ui/panel/LogcatPanel.java b/jadx-gui/src/main/java/jadx/gui/ui/panel/LogcatPanel.java index 77b748fde5f15e472ae8ea38eae95a2a449597a8..f20834d2f7d810f6895429dbc591a3651057b322 100644 --- a/jadx-gui/src/main/java/jadx/gui/ui/panel/LogcatPanel.java +++ b/jadx-gui/src/main/java/jadx/gui/ui/panel/LogcatPanel.java @@ -46,6 +46,7 @@ import jadx.gui.device.protocol.ADB; import jadx.gui.device.protocol.ADBDevice; import jadx.gui.utils.NLS; import jadx.gui.utils.UiUtils; +import jadx.gui.utils.ui.NodeLabel; public class LogcatPanel extends JPanel { private static final Logger LOG = LoggerFactory.getLogger(LogcatPanel.class); @@ -301,7 +302,7 @@ public class LogcatPanel extends JPanel { } public JPanel getContent() { - JLabel label = new JLabel(this.label + ": "); + JLabel label = NodeLabel.noHtml(this.label + ": "); CheckComboStore[] stores = new CheckComboStore[ids.length]; for (int j = 0; j < ids.length; j++) { stores[j] = new CheckComboStore(index[j], ids[j], Boolean.TRUE); diff --git a/jadx-gui/src/main/java/jadx/gui/utils/ui/NodeLabel.java b/jadx-gui/src/main/java/jadx/gui/utils/ui/NodeLabel.java new file mode 100644 index 0000000000000000000000000000000000000000..abd69e7a37cf851d32d7ab70ae278a066bf77a71 --- /dev/null +++ b/jadx-gui/src/main/java/jadx/gui/utils/ui/NodeLabel.java @@ -0,0 +1,47 @@ +package jadx.gui.utils.ui; + +import javax.swing.JLabel; +import javax.swing.SwingConstants; + +import jadx.gui.treemodel.JNode; + +public class NodeLabel extends JLabel { + + public static NodeLabel longName(JNode node) { + NodeLabel label = new NodeLabel(node.makeLongStringHtml(), node.disableHtml()); + label.setIcon(node.getIcon()); + label.setHorizontalAlignment(SwingConstants.LEFT); + return label; + } + + public static NodeLabel noHtml(String label) { + return new NodeLabel(label, true); + } + + public static void disableHtml(JLabel label, boolean disable) { + label.putClientProperty("html.disable", disable); + } + + private boolean htmlDisabled = false; + + public NodeLabel() { + disableHtml(true); + } + + public NodeLabel(String label) { + disableHtml(true); + setText(label); + } + + public NodeLabel(String label, boolean disableHtml) { + disableHtml(disableHtml); + setText(label); + } + + public void disableHtml(boolean disable) { + if (htmlDisabled != disable) { + htmlDisabled = disable; + disableHtml(this, disable); + } + } +}