From ad49f6d08133253b5e2e54cc13fe3a54d85bf8d6 Mon Sep 17 00:00:00 2001 From: liach Date: Sun, 24 Feb 2019 12:43:41 -0800 Subject: Adds a red highlight for overridden methods in method inheritance tree gui (#112) * Make implemented method nodes in inheritance ui more obvious Signed-off-by: liach * Make the text green and italic instead Signed-off-by: liach * Update again for the new tree gen Also tweaked new tree gen to show only useful branch nodes Signed-off-by: liach --- .../enigma/analysis/MethodInheritanceTreeNode.java | 27 ++++++++------- src/main/java/cuchaz/enigma/gui/Gui.java | 14 ++++---- .../cuchaz/enigma/gui/MethodTreeCellRenderer.java | 40 ++++++++++++++++++++++ 3 files changed, 62 insertions(+), 19 deletions(-) create mode 100644 src/main/java/cuchaz/enigma/gui/MethodTreeCellRenderer.java diff --git a/src/main/java/cuchaz/enigma/analysis/MethodInheritanceTreeNode.java b/src/main/java/cuchaz/enigma/analysis/MethodInheritanceTreeNode.java index 862bb92..e77b5cc 100644 --- a/src/main/java/cuchaz/enigma/analysis/MethodInheritanceTreeNode.java +++ b/src/main/java/cuchaz/enigma/analysis/MethodInheritanceTreeNode.java @@ -24,12 +24,12 @@ public class MethodInheritanceTreeNode extends DefaultMutableTreeNode { private final Translator translator; private MethodEntry entry; - private boolean isImplemented; + private boolean implemented; - public MethodInheritanceTreeNode(Translator translator, MethodEntry entry, boolean isImplemented) { + public MethodInheritanceTreeNode(Translator translator, MethodEntry entry, boolean implemented) { this.translator = translator; this.entry = entry; - this.isImplemented = isImplemented; + this.implemented = implemented; } public static MethodInheritanceTreeNode findNode(MethodInheritanceTreeNode node, MethodEntry entry) { @@ -53,11 +53,7 @@ public class MethodInheritanceTreeNode extends DefaultMutableTreeNode { } public boolean isImplemented() { - return this.isImplemented; - } - - public boolean shouldExpand() { - return this.isImplemented || !this.isLeaf(); + return this.implemented; } @Override @@ -65,7 +61,7 @@ public class MethodInheritanceTreeNode extends DefaultMutableTreeNode { MethodEntry translatedEntry = translator.translate(entry); String className = translatedEntry.getContainingClass().getFullName(); - if (!this.isImplemented) { + if (!this.implemented) { return className; } else { String methodName = translatedEntry.getName(); @@ -73,20 +69,27 @@ public class MethodInheritanceTreeNode extends DefaultMutableTreeNode { } } - public void load(JarIndex index) { + /** + * Returns true if there is sub-node worthy to display. + */ + public boolean load(JarIndex index) { // get all the child nodes EntryIndex entryIndex = index.getEntryIndex(); InheritanceIndex inheritanceIndex = index.getInheritanceIndex(); + boolean ret = false; for (ClassEntry inheritorEntry : inheritanceIndex.getChildren(this.entry.getParent())) { MethodEntry methodEntry = new MethodEntry(inheritorEntry, this.entry.getName(), this.entry.getDesc()); MethodInheritanceTreeNode node = new MethodInheritanceTreeNode(translator, methodEntry, entryIndex.hasMethod(methodEntry)); - node.load(index); + boolean childOverride = node.load(index); - if (node.shouldExpand()) { + if (childOverride || node.implemented) { this.add(node); + ret = true; } } + + return ret; } } diff --git a/src/main/java/cuchaz/enigma/gui/Gui.java b/src/main/java/cuchaz/enigma/gui/Gui.java index c419aae..a604323 100644 --- a/src/main/java/cuchaz/enigma/gui/Gui.java +++ b/src/main/java/cuchaz/enigma/gui/Gui.java @@ -38,10 +38,7 @@ import de.sciss.syntaxpane.DefaultSyntaxKit; import javax.swing.*; import javax.swing.text.BadLocationException; import javax.swing.text.Highlighter; -import javax.swing.tree.DefaultMutableTreeNode; -import javax.swing.tree.DefaultTreeModel; -import javax.swing.tree.TreeNode; -import javax.swing.tree.TreePath; +import javax.swing.tree.*; import java.awt.*; import java.awt.event.*; import java.nio.file.Path; @@ -153,7 +150,7 @@ public class Gui { inheritanceTree.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent event) { - if (event.getClickCount() == 2) { + if (event.getClickCount() >= 2) { // get the selected node TreePath path = inheritanceTree.getSelectionPath(); if (path == null) { @@ -173,6 +170,9 @@ public class Gui { } } }); + TreeCellRenderer cellRenderer = inheritanceTree.getCellRenderer(); + inheritanceTree.setCellRenderer(new MethodTreeCellRenderer((DefaultTreeCellRenderer) cellRenderer)); + JPanel inheritancePanel = new JPanel(); inheritancePanel.setLayout(new BorderLayout()); inheritancePanel.add(new JScrollPane(inheritanceTree)); @@ -183,7 +183,7 @@ public class Gui { implementationsTree.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent event) { - if (event.getClickCount() == 2) { + if (event.getClickCount() >= 2) { // get the selected node TreePath path = implementationsTree.getSelectionPath(); if (path == null) { @@ -212,7 +212,7 @@ public class Gui { @SuppressWarnings("unchecked") @Override public void mouseClicked(MouseEvent event) { - if (event.getClickCount() == 2) { + if (event.getClickCount() >= 2) { // get the selected node TreePath path = callsTree.getSelectionPath(); if (path == null) { diff --git a/src/main/java/cuchaz/enigma/gui/MethodTreeCellRenderer.java b/src/main/java/cuchaz/enigma/gui/MethodTreeCellRenderer.java new file mode 100644 index 0000000..c78ead2 --- /dev/null +++ b/src/main/java/cuchaz/enigma/gui/MethodTreeCellRenderer.java @@ -0,0 +1,40 @@ +/******************************************************************************* + * Copyright (c) 2015 Jeff Martin. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the GNU Lesser General Public + * License v3.0 which accompanies this distribution, and is available at + * http://www.gnu.org/licenses/lgpl.html + *

+ * Contributors: + * Jeff Martin - initial API and implementation + ******************************************************************************/ + +package cuchaz.enigma.gui; + +import cuchaz.enigma.analysis.MethodInheritanceTreeNode; + +import javax.swing.*; +import javax.swing.tree.TreeCellRenderer; +import java.awt.*; + +class MethodTreeCellRenderer implements TreeCellRenderer { + + private final TreeCellRenderer parent; + + MethodTreeCellRenderer(TreeCellRenderer parent) { + this.parent = parent; + } + + @Override + public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { + Component ret = parent.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus); + if (value instanceof MethodInheritanceTreeNode && ((MethodInheritanceTreeNode) value).isImplemented()) { + ret.setForeground(Color.BLACK); + ret.setFont(ret.getFont().deriveFont(Font.PLAIN)); + } else { + ret.setForeground(Color.GRAY); + ret.setFont(ret.getFont().deriveFont(Font.ITALIC)); + } + return ret; + } +} -- cgit v1.2.3