fix(gui): minor improved search dialog & small refactor for search fields (PR #2510)

* fix(gui): minor improved search dialog & small refactor for search fields

* fix: removed unused key string

* fix(gui): added icon for active tab in SearchDialog
This commit is contained in:
Yaroslav
2025-05-24 23:04:59 +03:00
committed by GitHub
parent b6f27d8a1a
commit 646ee2d963
15 changed files with 121 additions and 82 deletions
@@ -5,7 +5,6 @@ import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JTextField;
@@ -21,26 +20,17 @@ import org.fife.ui.rtextarea.SearchResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.formdev.flatlaf.FlatClientProperties;
import jadx.core.utils.StringUtils;
import jadx.gui.utils.Icons;
import jadx.gui.utils.NLS;
import jadx.gui.utils.TextStandardActions;
import jadx.gui.utils.UiUtils;
public class SearchBar extends JToolBar {
private static final long serialVersionUID = 1836871286618633003L;
private static final Logger LOG = LoggerFactory.getLogger(SearchBar.class);
private static final Icon ICON_MARK = UiUtils.openSvgIcon("search/mark");
private static final Icon ICON_MARK_SELECTED = UiUtils.openSvgIcon("search/previewSelected");
private static final Icon ICON_REGEX = UiUtils.openSvgIcon("search/regexHovered");
private static final Icon ICON_REGEX_SELECTED = UiUtils.openSvgIcon("search/regexSelected");
private static final Icon ICON_WORDS = UiUtils.openSvgIcon("search/wordsHovered");
private static final Icon ICON_WORDS_SELECTED = UiUtils.openSvgIcon("search/wordsSelected");
private static final Icon ICON_MATCH = UiUtils.openSvgIcon("search/matchCaseHovered");
private static final Icon ICON_MATCH_SELECTED = UiUtils.openSvgIcon("search/matchCaseSelected");
private static final Icon ICON_UP = UiUtils.openSvgIcon("ui/top");
private static final Icon ICON_DOWN = UiUtils.openSvgIcon("ui/bottom");
private static final Icon ICON_CLOSE = UiUtils.openSvgIcon("ui/close");
private static final int MAX_RESULT_COUNT = 999;
private RSyntaxTextArea rTextArea;
@@ -60,6 +50,7 @@ public class SearchBar extends JToolBar {
add(findLabel);
searchField = new JTextField(30);
searchField.putClientProperty(FlatClientProperties.TEXT_FIELD_SHOW_CLEAR_BUTTON, true);
searchField.addKeyListener(new KeyAdapter() {
@Override
public void keyReleased(KeyEvent e) {
@@ -77,7 +68,7 @@ public class SearchBar extends JToolBar {
}
});
searchField.addActionListener(e -> search(1));
new TextStandardActions(searchField);
TextStandardActions.attach(searchField);
add(searchField);
ActionListener forwardListener = e -> search(1);
@@ -89,49 +80,49 @@ public class SearchBar extends JToolBar {
setResultCount(0);
matchCaseCB = new JToggleButton();
matchCaseCB.setIcon(ICON_MATCH);
matchCaseCB.setSelectedIcon(ICON_MATCH_SELECTED);
matchCaseCB.setIcon(Icons.ICON_MATCH);
matchCaseCB.setSelectedIcon(Icons.ICON_MATCH_SELECTED);
matchCaseCB.setToolTipText(NLS.str("search.match_case"));
matchCaseCB.addActionListener(forwardListener);
add(matchCaseCB);
wholeWordCB = new JToggleButton();
wholeWordCB.setIcon(ICON_WORDS);
wholeWordCB.setSelectedIcon(ICON_WORDS_SELECTED);
wholeWordCB.setIcon(Icons.ICON_WORDS);
wholeWordCB.setSelectedIcon(Icons.ICON_WORDS_SELECTED);
wholeWordCB.setToolTipText(NLS.str("search.whole_word"));
wholeWordCB.addActionListener(forwardListener);
add(wholeWordCB);
regexCB = new JToggleButton();
regexCB.setIcon(ICON_REGEX);
regexCB.setSelectedIcon(ICON_REGEX_SELECTED);
regexCB.setIcon(Icons.ICON_REGEX);
regexCB.setSelectedIcon(Icons.ICON_REGEX_SELECTED);
regexCB.setToolTipText(NLS.str("search.regex"));
regexCB.addActionListener(forwardListener);
add(regexCB);
JButton prevButton = new JButton();
prevButton.setIcon(ICON_UP);
prevButton.setIcon(Icons.ICON_UP);
prevButton.setToolTipText(NLS.str("search.previous"));
prevButton.addActionListener(e -> search(-1));
prevButton.setBorderPainted(false);
add(prevButton);
JButton nextButton = new JButton();
nextButton.setIcon(ICON_DOWN);
nextButton.setIcon(Icons.ICON_DOWN);
nextButton.setToolTipText(NLS.str("search.next"));
nextButton.addActionListener(e -> search(1));
nextButton.setBorderPainted(false);
add(nextButton);
markAllCB = new JToggleButton();
markAllCB.setIcon(ICON_MARK);
markAllCB.setSelectedIcon(ICON_MARK_SELECTED);
markAllCB.setIcon(Icons.ICON_MARK);
markAllCB.setSelectedIcon(Icons.ICON_MARK_SELECTED);
markAllCB.setToolTipText(NLS.str("search.mark_all"));
markAllCB.addActionListener(forwardListener);
add(markAllCB);
JButton closeButton = new JButton();
closeButton.setIcon(ICON_CLOSE);
closeButton.setIcon(Icons.ICON_CLOSE);
closeButton.addActionListener(e -> toggle());
closeButton.setBorderPainted(false);
add(closeButton);
@@ -1,9 +1,9 @@
package jadx.gui.ui.dialog;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.util.ArrayList;
import java.util.Collections;
import java.util.EnumSet;
@@ -19,6 +19,7 @@ import java.util.stream.Collectors;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
@@ -26,6 +27,7 @@ import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JTextField;
import javax.swing.JToggleButton;
import javax.swing.WindowConstants;
import javax.swing.event.ChangeListener;
@@ -45,6 +47,7 @@ import io.reactivex.schedulers.Schedulers;
import jadx.api.JavaClass;
import jadx.api.JavaPackage;
import jadx.core.utils.ListUtils;
import jadx.core.utils.StringUtils;
import jadx.gui.jobs.ITaskInfo;
import jadx.gui.jobs.ITaskProgress;
import jadx.gui.search.SearchSettings;
@@ -60,13 +63,14 @@ import jadx.gui.treemodel.JClass;
import jadx.gui.treemodel.JNode;
import jadx.gui.treemodel.JResource;
import jadx.gui.ui.MainWindow;
import jadx.gui.utils.Icons;
import jadx.gui.utils.JumpPosition;
import jadx.gui.utils.NLS;
import jadx.gui.utils.TextStandardActions;
import jadx.gui.utils.UiUtils;
import jadx.gui.utils.cache.ValueCache;
import jadx.gui.utils.layout.WrapLayout;
import jadx.gui.utils.rx.RxUtils;
import jadx.gui.utils.ui.DocumentUpdateListener;
import static jadx.gui.ui.dialog.SearchDialog.SearchOptions.ACTIVE_TAB;
import static jadx.gui.ui.dialog.SearchDialog.SearchOptions.CLASS;
@@ -82,8 +86,6 @@ public class SearchDialog extends CommonSearchDialog {
private static final Logger LOG = LoggerFactory.getLogger(SearchDialog.class);
private static final long serialVersionUID = -5105405456969134105L;
private static final Color SEARCH_FIELD_ERROR_COLOR = new Color(255, 150, 150);
public static void search(MainWindow window, SearchPreset preset) {
SearchDialog searchDialog = new SearchDialog(window, preset, Collections.emptySet());
show(searchDialog, window);
@@ -137,8 +139,6 @@ public class SearchDialog extends CommonSearchDialog {
private final transient SearchPreset searchPreset;
private final transient Set<SearchOptions> options;
private transient Color searchFieldDefaultBgColor;
private transient JTextField searchField;
private transient JTextField packageField;
@@ -242,8 +242,6 @@ public class SearchDialog extends CommonSearchDialog {
private void initUI() {
searchField = new JTextField();
searchFieldDefaultBgColor = searchField.getBackground();
searchField.setAlignmentX(LEFT_ALIGNMENT);
TextStandardActions.attach(searchField);
addSearchHistoryButton();
searchField.putClientProperty(FlatClientProperties.TEXT_FIELD_SHOW_CLEAR_BUTTON, true);
@@ -271,7 +269,17 @@ public class SearchDialog extends CommonSearchDialog {
searchLinePanel.add(Box.createRigidArea(new Dimension(5, 0)));
searchLinePanel.add(searchBtn);
searchLinePanel.add(Box.createRigidArea(new Dimension(5, 0)));
searchLinePanel.add(makeOptionsToggleButton(NLS.str("search_dialog.ignorecase"), Icons.ICON_MATCH, Icons.ICON_MATCH_SELECTED,
SearchOptions.IGNORE_CASE));
searchLinePanel.add(Box.createRigidArea(new Dimension(5, 0)));
searchLinePanel.add(makeOptionsToggleButton(NLS.str("search_dialog.regex"), Icons.ICON_REGEX, Icons.ICON_REGEX_SELECTED,
SearchOptions.USE_REGEX));
searchLinePanel.add(Box.createRigidArea(new Dimension(5, 0)));
searchLinePanel.add(makeOptionsToggleButton(NLS.str("search_dialog.active_tab"), Icons.ICON_ACTIVE_TAB,
Icons.ICON_ACTIVE_TAB_SELECTED, SearchOptions.ACTIVE_TAB));
searchLinePanel.add(Box.createRigidArea(new Dimension(5, 0)));
searchLinePanel.add(autoSearchCB);
searchLinePanel.setAlignmentX(LEFT_ALIGNMENT);
JLabel findLabel = new JLabel(NLS.str("search_dialog.open_by_name"));
@@ -293,27 +301,36 @@ public class SearchDialog extends CommonSearchDialog {
searchInPanel.add(makeOptionsCheckBox(NLS.str("search_dialog.resource"), SearchOptions.RESOURCE));
searchInPanel.add(makeOptionsCheckBox(NLS.str("search_dialog.comments"), SearchOptions.COMMENT));
JPanel searchOptions = new JPanel(new FlowLayout(FlowLayout.LEFT));
searchOptions.setBorder(BorderFactory.createTitledBorder(NLS.str("search_dialog.options")));
searchOptions.add(makeOptionsCheckBox(NLS.str("search_dialog.ignorecase"), IGNORE_CASE));
searchOptions.add(makeOptionsCheckBox(NLS.str("search_dialog.regex"), USE_REGEX));
searchOptions.add(makeOptionsCheckBox(NLS.str("search_dialog.active_tab"), SearchOptions.ACTIVE_TAB));
packageField = new JTextField();
packageField.setAlignmentX(LEFT_ALIGNMENT);
packageField.setPreferredSize(new Dimension(300, packageField.getPreferredSize().height));
packageField.setMaximumSize(new Dimension(Integer.MAX_VALUE, searchField.getPreferredSize().height));
TextStandardActions.attach(packageField);
packageField.putClientProperty(FlatClientProperties.TEXT_FIELD_SHOW_CLEAR_BUTTON, true);
JPanel searchPackageOptions = new JPanel(new FlowLayout(FlowLayout.LEFT));
JPanel searchPackageOptions = new JPanel();
searchPackageOptions.setLayout(new BoxLayout(searchPackageOptions, BoxLayout.LINE_AXIS));
searchPackageOptions.setBorder(BorderFactory.createTitledBorder(NLS.str("search_dialog.limit_package")));
searchPackageOptions.add(packageField);
JPanel optionsPanel = new JPanel(new WrapLayout(WrapLayout.LEFT, 0, 0));
JTextField fileExtField = new JTextField();
TextStandardActions.attach(fileExtField);
fileExtField.putClientProperty(FlatClientProperties.TEXT_FIELD_SHOW_CLEAR_BUTTON, true);
fileExtField.getDocument().addDocumentListener(new DocumentUpdateListener(ev -> {
String ext = fileExtField.getText();
mainWindow.getSettings().setSrhResourceFileExt(ext);
}));
fileExtField.setText(mainWindow.getSettings().getSrhResourceFileExt());
fileExtField.setMaximumSize(new Dimension(Integer.MAX_VALUE, searchField.getPreferredSize().height));
JPanel searchExtFileOptions = new JPanel();
searchExtFileOptions.setLayout(new BoxLayout(searchExtFileOptions, BoxLayout.LINE_AXIS));
searchExtFileOptions.setBorder(BorderFactory.createTitledBorder(NLS.str("preferences.res_file_ext")));
searchExtFileOptions.add(fileExtField);
JPanel optionsPanel = new JPanel(new GridLayout(2, 2, 5, 5));
optionsPanel.setAlignmentX(LEFT_ALIGNMENT);
optionsPanel.add(searchInPanel);
optionsPanel.add(searchOptions);
optionsPanel.add(searchPackageOptions);
optionsPanel.add(searchExtFileOptions);
JPanel searchPane = new JPanel();
searchPane.setLayout(new BoxLayout(searchPane, BoxLayout.PAGE_AXIS));
@@ -467,17 +484,14 @@ public class SearchDialog extends CommonSearchDialog {
boolean ignoreCase = options.contains(IGNORE_CASE);
boolean useRegex = options.contains(USE_REGEX);
String searchPackageText = packageField.getText();
SearchSettings searchSettings = new SearchSettings(text, ignoreCase, useRegex, searchPackageText);
SearchSettings searchSettings = new SearchSettings(text, !ignoreCase, useRegex, searchPackageText);
String error = searchSettings.prepare(mainWindow);
if (error == null) {
if (Objects.equals(searchField.getBackground(), SEARCH_FIELD_ERROR_COLOR)) {
searchField.setBackground(searchFieldDefaultBgColor);
}
} else {
searchField.setBackground(SEARCH_FIELD_ERROR_COLOR);
changeSearchFieldStyle(!StringUtils.isEmpty(error));
if (!StringUtils.isEmpty(error)) {
resultsInfoLabel.setText(error);
return null;
}
SearchTask newSearchTask = new SearchTask(mainWindow, this::addSearchResult, this::searchFinished);
if (!buildSearch(newSearchTask, text, searchSettings)) {
return null;
@@ -485,6 +499,15 @@ public class SearchDialog extends CommonSearchDialog {
return newSearchTask;
}
private void changeSearchFieldStyle(boolean isError) {
if (isError) {
searchField.putClientProperty("JComponent.outline", "error");
} else {
searchField.putClientProperty("JComponent.outline", "");
}
searchField.repaint();
}
private boolean buildSearch(SearchTask newSearchTask, String text, SearchSettings searchSettings) {
List<JavaClass> searchClasses;
if (options.contains(ACTIVE_TAB)) {
@@ -697,6 +720,23 @@ public class SearchDialog extends CommonSearchDialog {
return chBox;
}
private JToggleButton makeOptionsToggleButton(String name, ImageIcon icon, ImageIcon selectedIcon, final SearchOptions opt) {
final JToggleButton toggleButton = new JToggleButton();
toggleButton.setToolTipText(name);
toggleButton.setIcon(icon);
toggleButton.setSelectedIcon(selectedIcon);
toggleButton.setSelected(options.contains(opt));
toggleButton.addItemListener(e -> {
if (toggleButton.isSelected()) {
options.add(opt);
} else {
options.remove(opt);
}
searchEmitter.emitSearch();
});
return toggleButton;
}
@Override
protected void loadFinished() {
resultsTable.setEnabled(true);
@@ -5,7 +5,6 @@ import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JTextField;
@@ -19,29 +18,21 @@ import org.exbin.bined.swing.section.SectCodeArea;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.formdev.flatlaf.FlatClientProperties;
import jadx.core.utils.StringUtils;
import jadx.gui.ui.hexviewer.search.BinarySearch;
import jadx.gui.ui.hexviewer.search.SearchCondition;
import jadx.gui.ui.hexviewer.search.SearchParameters;
import jadx.gui.ui.hexviewer.search.service.BinarySearchServiceImpl;
import jadx.gui.utils.Icons;
import jadx.gui.utils.NLS;
import jadx.gui.utils.TextStandardActions;
import jadx.gui.utils.UiUtils;
public class HexSearchBar extends JToolBar {
private static final long serialVersionUID = 1836871286618633003L;
private static final Logger LOG = LoggerFactory.getLogger(HexSearchBar.class);
private static final Icon ICON_MARK = UiUtils.openSvgIcon("search/mark");
private static final Icon ICON_MARK_SELECTED = UiUtils.openSvgIcon("search/previewSelected");
private static final Icon ICON_FIND_TYPE_TXT = UiUtils.openSvgIcon("search/text");
private static final Icon ICON_FIND_TYPE_HEX = UiUtils.openSvgIcon("search/hexSerial");
private static final Icon ICON_MATCH = UiUtils.openSvgIcon("search/matchCaseHovered");
private static final Icon ICON_MATCH_SELECTED = UiUtils.openSvgIcon("search/matchCaseSelected");
private static final Icon ICON_UP = UiUtils.openSvgIcon("ui/top");
private static final Icon ICON_DOWN = UiUtils.openSvgIcon("ui/bottom");
private static final Icon ICON_CLOSE = UiUtils.openSvgIcon("ui/close");
private final SectCodeArea hexCodeArea;
private final JTextField searchField;
@@ -61,6 +52,7 @@ public class HexSearchBar extends JToolBar {
add(findLabel);
searchField = new JTextField(30);
searchField.putClientProperty(FlatClientProperties.TEXT_FIELD_SHOW_CLEAR_BUTTON, true);
searchField.addKeyListener(new KeyAdapter() {
@Override
public void keyReleased(KeyEvent e) {
@@ -78,7 +70,7 @@ public class HexSearchBar extends JToolBar {
}
});
searchField.addActionListener(e -> control.notifySearchChanging());
new TextStandardActions(searchField);
TextStandardActions.attach(searchField);
add(searchField);
ActionListener searchSettingListener = e -> control.notifySearchChanged();
@@ -89,15 +81,15 @@ public class HexSearchBar extends JToolBar {
add(resultCountLabel);
matchCaseCB = new JToggleButton();
matchCaseCB.setIcon(ICON_MATCH);
matchCaseCB.setSelectedIcon(ICON_MATCH_SELECTED);
matchCaseCB.setIcon(Icons.ICON_MATCH);
matchCaseCB.setSelectedIcon(Icons.ICON_MATCH_SELECTED);
matchCaseCB.setToolTipText(NLS.str("search.match_case"));
matchCaseCB.addActionListener(searchSettingListener);
add(matchCaseCB);
findTypeCB = new JToggleButton();
findTypeCB.setIcon(ICON_FIND_TYPE_TXT);
findTypeCB.setSelectedIcon(ICON_FIND_TYPE_HEX);
findTypeCB.setIcon(Icons.ICON_FIND_TYPE_TXT);
findTypeCB.setSelectedIcon(Icons.ICON_FIND_TYPE_HEX);
if (findTypeCB.isSelected()) {
findTypeCB.setToolTipText(NLS.str("search.find_type_hex"));
} else {
@@ -111,29 +103,29 @@ public class HexSearchBar extends JToolBar {
add(findTypeCB);
prevMatchButton = new JButton();
prevMatchButton.setIcon(ICON_UP);
prevMatchButton.setIcon(Icons.ICON_UP);
prevMatchButton.setToolTipText(NLS.str("search.previous"));
prevMatchButton.addActionListener(e -> control.prevMatch());
prevMatchButton.setBorderPainted(false);
add(prevMatchButton);
nextMatchButton = new JButton();
nextMatchButton.setIcon(ICON_DOWN);
nextMatchButton.setIcon(Icons.ICON_DOWN);
nextMatchButton.setToolTipText(NLS.str("search.next"));
nextMatchButton.addActionListener(e -> control.nextMatch());
nextMatchButton.setBorderPainted(false);
add(nextMatchButton);
markAllCB = new JToggleButton();
markAllCB.setIcon(ICON_MARK);
markAllCB.setSelectedIcon(ICON_MARK_SELECTED);
markAllCB.setIcon(Icons.ICON_MARK);
markAllCB.setSelectedIcon(Icons.ICON_MARK_SELECTED);
markAllCB.setToolTipText(NLS.str("search.mark_all"));
markAllCB.setSelected(true);
markAllCB.addActionListener(searchSettingListener);
add(markAllCB);
JButton closeButton = new JButton();
closeButton.setIcon(ICON_CLOSE);
closeButton.setIcon(Icons.ICON_CLOSE);
closeButton.addActionListener(e -> toggle());
closeButton.setBorderPainted(false);
add(closeButton);
@@ -48,4 +48,19 @@ public class Icons {
public static final ImageIcon RESET = UiUtils.openSvgIcon("ui/reset");
public static final ImageIcon FONT = UiUtils.openSvgIcon("nodes/fontFile");
public static final ImageIcon ICON_MARK = UiUtils.openSvgIcon("search/mark");
public static final ImageIcon ICON_MARK_SELECTED = UiUtils.openSvgIcon("search/previewSelected");
public static final ImageIcon ICON_REGEX = UiUtils.openSvgIcon("search/regexHovered");
public static final ImageIcon ICON_REGEX_SELECTED = UiUtils.openSvgIcon("search/regexSelected");
public static final ImageIcon ICON_WORDS = UiUtils.openSvgIcon("search/wordsHovered");
public static final ImageIcon ICON_WORDS_SELECTED = UiUtils.openSvgIcon("search/wordsSelected");
public static final ImageIcon ICON_MATCH = UiUtils.openSvgIcon("search/matchCaseHovered");
public static final ImageIcon ICON_MATCH_SELECTED = UiUtils.openSvgIcon("search/matchCaseSelected");
public static final ImageIcon ICON_UP = UiUtils.openSvgIcon("ui/top");
public static final ImageIcon ICON_DOWN = UiUtils.openSvgIcon("ui/bottom");
public static final ImageIcon ICON_CLOSE = UiUtils.openSvgIcon("ui/close");
public static final ImageIcon ICON_FIND_TYPE_TXT = UiUtils.openSvgIcon("search/text");
public static final ImageIcon ICON_FIND_TYPE_HEX = UiUtils.openSvgIcon("search/hexSerial");
public static final ImageIcon ICON_ACTIVE_TAB = UiUtils.openSvgIcon("search/activeTab");
public static final ImageIcon ICON_ACTIVE_TAB_SELECTED = UiUtils.openSvgIcon("search/activeTabSelected");
}
@@ -158,7 +158,6 @@ search_dialog.class=Klasse
search_dialog.method=Methode
search_dialog.field=Feld
search_dialog.code=Code
search_dialog.options=Suchoptionen:
search_dialog.ignorecase=Groß/Kleinschreibung ignorieren
search_dialog.load_more=Mehr laden
search_dialog.load_all=Alle laden
@@ -158,7 +158,6 @@ search_dialog.class=Class
search_dialog.method=Method
search_dialog.field=Field
search_dialog.code=Code
search_dialog.options=Search options:
search_dialog.ignorecase=Case-insensitive
search_dialog.load_more=Load more
search_dialog.load_all=Load all
@@ -158,7 +158,6 @@ search_dialog.class=Clase
search_dialog.method=Método
search_dialog.field=Campo
search_dialog.code=Código
search_dialog.options=Opciones de búsqueda:
search_dialog.ignorecase=Ignorar minúsculas/mayúsculas
#search_dialog.load_more=Load more
#search_dialog.load_all=Load all
@@ -158,7 +158,6 @@ search_dialog.class=Kelas
search_dialog.method=Metode
search_dialog.field=Bidang
search_dialog.code=Kode
search_dialog.options=Opsi pencarian:
search_dialog.ignorecase=Non-ketetapan huruf besar kecil
search_dialog.load_more=Muat lebih banyak
search_dialog.load_all=Muat semua
@@ -158,7 +158,6 @@ search_dialog.class=클래스
search_dialog.method=메소드
search_dialog.field=필드
search_dialog.code=코드
search_dialog.options=옵션 검색:
search_dialog.ignorecase=대소문자 구분 안함
search_dialog.load_more=더보기
search_dialog.load_all=모두 로드
@@ -158,7 +158,6 @@ search_dialog.class=Classe
search_dialog.method=Método
search_dialog.field=Propriedade
search_dialog.code=Código
search_dialog.options=Opções de busca:
search_dialog.ignorecase=Não diferencia maiúsculas de minúsculas
search_dialog.load_more=Carregar mais
search_dialog.load_all=Carregar todas
@@ -158,7 +158,6 @@ search_dialog.class=Класс
search_dialog.method=Метод
search_dialog.field=Поле
search_dialog.code=Код
search_dialog.options=Опции поиска:
search_dialog.ignorecase=Игнорировать регистр
search_dialog.load_more=Загрузить еще
search_dialog.load_all=Загрузить все
@@ -158,7 +158,6 @@ search_dialog.class=类名
search_dialog.method=方法名
search_dialog.field=字段名
search_dialog.code=代码
search_dialog.options=搜索选项:
search_dialog.ignorecase=忽略大小写
search_dialog.load_more=加载更多
search_dialog.load_all=加载所有
@@ -158,7 +158,6 @@ search_dialog.class=類別
search_dialog.method=方法
search_dialog.field=欄位
search_dialog.code=程式碼
search_dialog.options=搜尋選項:
search_dialog.ignorecase=不區分大小寫
search_dialog.load_more=載入更多
search_dialog.load_all=載入全部
@@ -0,0 +1,5 @@
<!-- Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. -->
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M6.83691 14C6.51331 13.7057 6.22846 13.3695 5.99095 13H2V8H5V10H2.0004V11H5.24861C5.21657 10.7713 5.2 10.5376 5.2 10.3C5.2 9.03543 5.66945 7.88051 6.44359 7H6V5H10V5.30393C10.0663 5.30132 10.133 5.3 10.2 5.3C10.4723 5.3 10.7395 5.32177 11 5.36366V5H14V7.05024C14.4541 7.58068 14.799 8.20732 15 8.89536V2H1V14H6.83691ZM5 5V7H2V5H5Z" fill="#7F8B91"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M10.2334 14.1667C8.11627 14.1667 6.40002 12.4504 6.40002 10.3333C6.40002 8.21624 8.11627 6.5 10.2334 6.5C12.3504 6.5 14.0667 8.21624 14.0667 10.3333C14.0667 11.1096 13.8359 11.8321 13.4393 12.4357L15.8948 14.8912L14.8575 15.9286L12.4148 13.4859C11.7956 13.9151 11.0438 14.1667 10.2334 14.1667ZM10.2334 12.8333C11.6141 12.8333 12.7334 11.714 12.7334 10.3333C12.7334 8.95262 11.6141 7.83333 10.2334 7.83333C8.85265 7.83333 7.73336 8.95262 7.73336 10.3333C7.73336 11.714 8.85265 12.8333 10.2334 12.8333Z" fill="#7F8B91"/>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

@@ -0,0 +1,5 @@
<!-- Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. -->
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M6.83691 14C6.51331 13.7057 6.22846 13.3695 5.99095 13H2V8H5V10H2.0004V11H5.24861C5.21657 10.7713 5.2 10.5376 5.2 10.3C5.2 9.03543 5.66945 7.88051 6.44359 7H6V5H10V5.30393C10.0663 5.30132 10.133 5.3 10.2 5.3C10.4723 5.3 10.7395 5.32177 11 5.36366V5H14V7.05024C14.4541 7.58068 14.799 8.20732 15 8.89536V2H1V14H6.83691ZM5 5V7H2V5H5Z" fill="#40B6E0"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M10.2334 14.1667C8.11627 14.1667 6.40002 12.4504 6.40002 10.3333C6.40002 8.21624 8.11627 6.5 10.2334 6.5C12.3504 6.5 14.0667 8.21624 14.0667 10.3333C14.0667 11.1096 13.8359 11.8321 13.4393 12.4357L15.8948 14.8912L14.8575 15.9286L12.4148 13.4859C11.7956 13.9151 11.0438 14.1667 10.2334 14.1667ZM10.2334 12.8333C11.6141 12.8333 12.7334 11.714 12.7334 10.3333C12.7334 8.95262 11.6141 7.83333 10.2334 7.83333C8.85265 7.83333 7.73336 8.95262 7.73336 10.3333C7.73336 11.714 8.85265 12.8333 10.2334 12.8333Z" fill="#40B6E0"/>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB