From 32c92dd9a8215e004fbbff7de698eec655e8fdca Mon Sep 17 00:00:00 2001 From: Little Hour Y <26533008+17307@users.noreply.github.com> Date: Sun, 11 May 2025 02:05:03 +0800 Subject: [PATCH] feat(gui): add "Copy All" button to Search dialog (PR #2480) * add copy all button in CommonSearchDialog * fix i18n test error --------- Co-authored-by: ymoon --- .../gui/ui/dialog/CommonSearchDialog.java | 22 +++++++++++++++++-- .../resources/i18n/Messages_de_DE.properties | 1 + .../resources/i18n/Messages_en_US.properties | 1 + .../resources/i18n/Messages_es_ES.properties | 1 + .../resources/i18n/Messages_id_ID.properties | 1 + .../resources/i18n/Messages_ko_KR.properties | 1 + .../resources/i18n/Messages_pt_BR.properties | 1 + .../resources/i18n/Messages_ru_RU.properties | 1 + .../resources/i18n/Messages_zh_CN.properties | 1 + .../resources/i18n/Messages_zh_TW.properties | 1 + 10 files changed, 29 insertions(+), 2 deletions(-) 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 8e0007d5d..870779abd 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 @@ -16,7 +16,9 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Enumeration; +import java.util.HashSet; import java.util.List; +import java.util.Set; import javax.swing.AbstractAction; import javax.swing.BorderFactory; @@ -178,6 +180,18 @@ public abstract class CommonSearchDialog extends JFrame { UiUtils.addEscapeShortCutToDispose(this); } + protected void copyAllSearchResults() { + StringBuilder sb = new StringBuilder(); + Set uniqueRefs = new HashSet<>(); + for (JNode node : resultsModel.rows) { + String codeNodeRef = node.getJavaNode().getCodeNodeRef().toString(); + if (uniqueRefs.add(codeNodeRef)) { + sb.append(codeNodeRef).append("\n"); + } + } + UiUtils.copyToClipboard(sb.toString()); + } + @NotNull protected JPanel initButtonsPanel() { progressPane = new ProgressPanel(mainWindow, false); @@ -187,6 +201,8 @@ public abstract class CommonSearchDialog extends JFrame { JButton openBtn = new JButton(NLS.str("search_dialog.open")); openBtn.addActionListener(event -> openSelectedItem()); getRootPane().setDefaultButton(openBtn); + JButton copyBtn = new JButton(NLS.str("search_dialog.copy")); + copyBtn.addActionListener(event -> copyAllSearchResults()); JCheckBox cbKeepOpen = new JCheckBox(NLS.str("search_dialog.keep_open")); cbKeepOpen.setSelected(mainWindow.getSettings().getKeepCommonDialogOpen()); @@ -203,6 +219,8 @@ public abstract class CommonSearchDialog extends JFrame { buttonPane.add(progressPane); buttonPane.add(Box.createRigidArea(new Dimension(5, 0))); buttonPane.add(Box.createHorizontalGlue()); + buttonPane.add(copyBtn); + buttonPane.add(Box.createRigidArea(new Dimension(10, 0))); buttonPane.add(openBtn); buttonPane.add(Box.createRigidArea(new Dimension(10, 0))); buttonPane.add(cancelButton); @@ -440,8 +458,8 @@ public abstract class CommonSearchDialog extends JFrame { } @Override - public Component getTableCellRendererComponent(JTable table, Object obj, - boolean isSelected, boolean hasFocus, int row, int column) { + public Component getTableCellRendererComponent(JTable table, Object obj, boolean isSelected, boolean hasFocus, int row, + int column) { if (obj == null || table == null) { return emptyLabel; } diff --git a/jadx-gui/src/main/resources/i18n/Messages_de_DE.properties b/jadx-gui/src/main/resources/i18n/Messages_de_DE.properties index 2f4fdff9d..ec1bb2282 100644 --- a/jadx-gui/src/main/resources/i18n/Messages_de_DE.properties +++ b/jadx-gui/src/main/resources/i18n/Messages_de_DE.properties @@ -164,6 +164,7 @@ search_dialog.keep_open=Offen halten search_dialog.tip_searching=Suchen… search_dialog.limit_package=Begrenzung auf Paket: search_dialog.package_not_found=Kein passendes Paket gefunden +search_dialog.copy=alles kopieren usage_dialog.title=Verwendungssuche usage_dialog.label=Verwendungen von: 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 829807aba..dd9b27220 100644 --- a/jadx-gui/src/main/resources/i18n/Messages_en_US.properties +++ b/jadx-gui/src/main/resources/i18n/Messages_en_US.properties @@ -164,6 +164,7 @@ search_dialog.keep_open=Keep open search_dialog.tip_searching=Searching search_dialog.limit_package=Limit to package: search_dialog.package_not_found=No matching package found +search_dialog.copy=copy all usage_dialog.title=Usage search usage_dialog.label=Usage for: 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 d90653cf4..25ba17ea9 100644 --- a/jadx-gui/src/main/resources/i18n/Messages_es_ES.properties +++ b/jadx-gui/src/main/resources/i18n/Messages_es_ES.properties @@ -164,6 +164,7 @@ search_dialog.regex=Regex #search_dialog.tip_searching=Searching #search_dialog.limit_package=Limit to package: #search_dialog.package_not_found=No matching package found +search_dialog.copy=copiar todo usage_dialog.title=Usage search usage_dialog.label=Usage for: diff --git a/jadx-gui/src/main/resources/i18n/Messages_id_ID.properties b/jadx-gui/src/main/resources/i18n/Messages_id_ID.properties index 9948d11ae..458cd5fe5 100644 --- a/jadx-gui/src/main/resources/i18n/Messages_id_ID.properties +++ b/jadx-gui/src/main/resources/i18n/Messages_id_ID.properties @@ -164,6 +164,7 @@ search_dialog.keep_open=Tetap terbuka search_dialog.tip_searching=Mencari #search_dialog.limit_package=Limit to package: #search_dialog.package_not_found=No matching package found +search_dialog.copy=salin semua usage_dialog.title=Pencarian penggunaan usage_dialog.label=Penggunaan untuk: diff --git a/jadx-gui/src/main/resources/i18n/Messages_ko_KR.properties b/jadx-gui/src/main/resources/i18n/Messages_ko_KR.properties index 7ea352f45..b15a4fcac 100644 --- a/jadx-gui/src/main/resources/i18n/Messages_ko_KR.properties +++ b/jadx-gui/src/main/resources/i18n/Messages_ko_KR.properties @@ -164,6 +164,7 @@ search_dialog.keep_open=열어 두기 search_dialog.tip_searching=검색 중... #search_dialog.limit_package=Limit to package: #search_dialog.package_not_found=No matching package found +search_dialog.copy=모두 복사 usage_dialog.title=사용 검색 usage_dialog.label=다음의 사용 검색 결과: diff --git a/jadx-gui/src/main/resources/i18n/Messages_pt_BR.properties b/jadx-gui/src/main/resources/i18n/Messages_pt_BR.properties index 407d39d62..924171997 100644 --- a/jadx-gui/src/main/resources/i18n/Messages_pt_BR.properties +++ b/jadx-gui/src/main/resources/i18n/Messages_pt_BR.properties @@ -164,6 +164,7 @@ search_dialog.keep_open=Manter aberto search_dialog.tip_searching=Buscando #search_dialog.limit_package=Limit to package: #search_dialog.package_not_found=No matching package found +search_dialog.copy=skopiuj wszystko usage_dialog.title=Busca por utilização usage_dialog.label=Usado por: diff --git a/jadx-gui/src/main/resources/i18n/Messages_ru_RU.properties b/jadx-gui/src/main/resources/i18n/Messages_ru_RU.properties index bcf5b4c84..34f5882be 100644 --- a/jadx-gui/src/main/resources/i18n/Messages_ru_RU.properties +++ b/jadx-gui/src/main/resources/i18n/Messages_ru_RU.properties @@ -164,6 +164,7 @@ search_dialog.keep_open=Оставлять поиск открытым search_dialog.tip_searching=Поиск... #search_dialog.limit_package=Limit to package: #search_dialog.package_not_found=No matching package found +search_dialog.copy=скопировать все usage_dialog.title=Поиск использований usage_dialog.label=Использования: 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 819704690..19ade735b 100644 --- a/jadx-gui/src/main/resources/i18n/Messages_zh_CN.properties +++ b/jadx-gui/src/main/resources/i18n/Messages_zh_CN.properties @@ -164,6 +164,7 @@ search_dialog.keep_open=保持窗口 search_dialog.tip_searching=搜索中… search_dialog.limit_package=限制package: search_dialog.package_not_found=没有找到匹配的package +search_dialog.copy=复制全部 usage_dialog.title=查找 usage_dialog.label=查找用例: diff --git a/jadx-gui/src/main/resources/i18n/Messages_zh_TW.properties b/jadx-gui/src/main/resources/i18n/Messages_zh_TW.properties index 7552ea6d8..e10bd03c8 100644 --- a/jadx-gui/src/main/resources/i18n/Messages_zh_TW.properties +++ b/jadx-gui/src/main/resources/i18n/Messages_zh_TW.properties @@ -164,6 +164,7 @@ search_dialog.keep_open=保持開啟 search_dialog.tip_searching=正在搜尋 search_dialog.limit_package=限制至套件: search_dialog.package_not_found=找不到符合的套件 +search_dialog.copy=複製全部 usage_dialog.title=使用情況搜尋 usage_dialog.label=使用情況: