diff --git a/jadx-gui/src/main/java/jadx/gui/ui/codearea/CodeArea.java b/jadx-gui/src/main/java/jadx/gui/ui/codearea/CodeArea.java index e92f6f8b41f4e07a08c2173fb6123dc80c109066..a2f9086dc8529f623a9cd250985c233f4c7f25f0 100644 --- a/jadx-gui/src/main/java/jadx/gui/ui/codearea/CodeArea.java +++ b/jadx-gui/src/main/java/jadx/gui/ui/codearea/CodeArea.java @@ -96,11 +96,14 @@ public final class CodeArea extends RSyntaxTextArea { private void addMenuItems(JClass jCls) { FindUsageAction findUsage = new FindUsageAction(contentPanel, this, jCls); + GoToDeclarationAction goToDeclaration = new GoToDeclarationAction(contentPanel, this, jCls); JPopupMenu popup = getPopupMenu(); popup.addSeparator(); popup.add(findUsage); + popup.add(goToDeclaration); popup.addPopupMenuListener(findUsage); + popup.addPopupMenuListener(goToDeclaration); } public void loadSettings() { diff --git a/jadx-gui/src/main/java/jadx/gui/ui/codearea/GoToDeclarationAction.java b/jadx-gui/src/main/java/jadx/gui/ui/codearea/GoToDeclarationAction.java new file mode 100644 index 0000000000000000000000000000000000000000..101362f129b185cb29f91712b4c86ed534903457 --- /dev/null +++ b/jadx-gui/src/main/java/jadx/gui/ui/codearea/GoToDeclarationAction.java @@ -0,0 +1,66 @@ +package jadx.gui.ui.codearea; + +import java.awt.Point; +import java.awt.event.ActionEvent; + +import javax.swing.AbstractAction; +import javax.swing.event.PopupMenuEvent; +import javax.swing.event.PopupMenuListener; + +import org.fife.ui.rsyntaxtextarea.Token; + +import jadx.api.JavaNode; +import jadx.gui.treemodel.JClass; +import jadx.gui.treemodel.JNode; +import jadx.gui.ui.MainWindow; +import jadx.gui.utils.JumpPosition; +import jadx.gui.utils.NLS; + +public final class GoToDeclarationAction extends AbstractAction implements PopupMenuListener { + private static final long serialVersionUID = -1186470538894941301L; + private final transient CodePanel contentPanel; + private final transient CodeArea codeArea; + private final transient JClass jCls; + + private transient JavaNode node; + + public GoToDeclarationAction(CodePanel contentPanel, CodeArea codeArea, JClass jCls) { + super(NLS.str("popup.go_to_declaration")); + this.contentPanel = contentPanel; + this.codeArea = codeArea; + this.jCls = jCls; + } + + @Override + public void actionPerformed(ActionEvent e) { + if (node == null) { + return; + } + MainWindow mainWindow = contentPanel.getTabbedPane().getMainWindow(); + JNode jNode = mainWindow.getCacheObject().getNodeCache().makeFrom(node); + mainWindow.getTabbedPane().codeJump(new JumpPosition(jNode, jNode.getLine())); + } + + @Override + public void popupMenuWillBecomeVisible(PopupMenuEvent e) { + node = null; + Point pos = codeArea.getMousePosition(); + if (pos != null) { + Token token = codeArea.viewToToken(pos); + if (token != null) { + node = codeArea.getJavaNodeAtOffset(jCls, token.getOffset()); + } + } + setEnabled(node != null); + } + + @Override + public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { + // do nothing + } + + @Override + public void popupMenuCanceled(PopupMenuEvent e) { + // do nothing + } +} diff --git a/jadx-gui/src/main/resources/i18n/Messages_en_US.properties b/jadx-gui/src/main/resources/i18n/Messages_en_US.properties index f82cab8a8f0f25a8919a685a1633030e16e59eee..ea1bb5524c5a01328759056441fe36a87d5cec92 100644 --- a/jadx-gui/src/main/resources/i18n/Messages_en_US.properties +++ b/jadx-gui/src/main/resources/i18n/Messages_en_US.properties @@ -136,6 +136,7 @@ popup.paste=Paste popup.delete=Delete popup.select_all=Select All popup.find_usage=Find Usage +popup.go_to_declaration=Go to declaration popup.exclude=Exclude confirm.save_as_title=Confirm Save as diff --git a/jadx-gui/src/main/resources/i18n/Messages_es_ES.properties b/jadx-gui/src/main/resources/i18n/Messages_es_ES.properties index 1013b9485d8b58afd6b954720897e87b92e92b41..8f07b014ded8a3b385b3cb4d44624c60eb3df1a2 100644 --- a/jadx-gui/src/main/resources/i18n/Messages_es_ES.properties +++ b/jadx-gui/src/main/resources/i18n/Messages_es_ES.properties @@ -136,6 +136,7 @@ popup.paste=Pegar popup.delete=Borrar popup.select_all=Seleccionar todo #popup.find_usage= +#popup.go_to_declaration= #popup.exclude= #confirm.save_as_title= diff --git a/jadx-gui/src/main/resources/i18n/Messages_zh_CN.properties b/jadx-gui/src/main/resources/i18n/Messages_zh_CN.properties index f92467faabe0bcd0e83c26e1b9193fcf3bdf5973..c1f5ffbc0a96bdb75601b15d2cb066c6d9b3f0ff 100644 --- a/jadx-gui/src/main/resources/i18n/Messages_zh_CN.properties +++ b/jadx-gui/src/main/resources/i18n/Messages_zh_CN.properties @@ -136,6 +136,7 @@ popup.paste=粘贴 popup.delete=删除 popup.select_all=全选 popup.find_usage=查找用例 +#popup.go_to_declaration= #popup.exclude= #confirm.save_as_title=