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 <ymoon@ymoon.com>
This commit is contained in:
Little Hour Y
2025-05-11 02:05:03 +08:00
committed by GitHub
parent 8bbdbfc563
commit 32c92dd9a8
10 changed files with 29 additions and 2 deletions
@@ -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<String> 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;
}
@@ -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:
@@ -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:
@@ -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:
@@ -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:
@@ -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=다음의 사용 검색 결과:
@@ -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:
@@ -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=Использования:
@@ -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=查找用例:
@@ -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=使用情況: