Commit b4930bc4 authored by Skylot's avatar Skylot

gui: fix issues in search dialog

parent 5f302238
...@@ -53,7 +53,6 @@ import org.fife.ui.rsyntaxtextarea.SyntaxConstants; ...@@ -53,7 +53,6 @@ import org.fife.ui.rsyntaxtextarea.SyntaxConstants;
import org.fife.ui.rtextarea.SearchContext; import org.fife.ui.rtextarea.SearchContext;
import org.fife.ui.rtextarea.SearchEngine; import org.fife.ui.rtextarea.SearchEngine;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
...@@ -246,7 +245,7 @@ public abstract class CommonSearchDialog extends JDialog { ...@@ -246,7 +245,7 @@ public abstract class CommonSearchDialog extends JDialog {
column.setPreferredWidth(colWidth); column.setPreferredWidth(colWidth);
} }
if (codeComp != null) { if (codeComp != null) {
setRowHeight(codeComp.getPreferredSize().height + 4); setRowHeight(Math.max(20, codeComp.getPreferredSize().height + 4));
} }
updateUI(); updateUI();
} }
...@@ -320,6 +319,8 @@ public abstract class CommonSearchDialog extends JDialog { ...@@ -320,6 +319,8 @@ public abstract class CommonSearchDialog extends JDialog {
private final Color selectedForeground; private final Color selectedForeground;
private final Color foreground; private final Color foreground;
private final JLabel emptyLabel = new JLabel();
private Map<Integer, Component> componentCache = new HashMap<Integer, Component>(); private Map<Integer, Component> componentCache = new HashMap<Integer, Component>();
public ResultsTableCellRenderer() { public ResultsTableCellRenderer() {
...@@ -332,15 +333,17 @@ public abstract class CommonSearchDialog extends JDialog { ...@@ -332,15 +333,17 @@ public abstract class CommonSearchDialog extends JDialog {
@Override @Override
public Component getTableCellRendererComponent(JTable table, Object obj, boolean isSelected, public Component getTableCellRendererComponent(JTable table, Object obj, boolean isSelected,
boolean hasFocus, int row, int column) { boolean hasFocus, int row, int column) {
int id = (row << 2) | column; int id = row << 2 | column;
Component comp = componentCache.get(id); Component comp = componentCache.get(id);
if (comp == null && (obj instanceof JNode)) { if (comp == null) {
comp = makeCell((JNode) obj, column); if (obj instanceof JNode) {
componentCache.put(id, comp); comp = makeCell((JNode) obj, column);
} componentCache.put(id, comp);
if (comp != null) { } else {
updateSelection(comp, isSelected); comp = emptyLabel;
}
} }
updateSelection(comp, isSelected);
return comp; return comp;
} }
...@@ -354,31 +357,30 @@ public abstract class CommonSearchDialog extends JDialog { ...@@ -354,31 +357,30 @@ public abstract class CommonSearchDialog extends JDialog {
} }
} }
@Nullable private Component makeCell(JNode node, int column) {
protected Component makeCell(JNode node, int column) {
if (column == 0) { if (column == 0) {
JLabel label = new JLabel(node.makeLongString() + " ", node.getIcon(), SwingConstants.LEFT); JLabel label = new JLabel(node.makeLongString() + " ", node.getIcon(), SwingConstants.LEFT);
label.setOpaque(true); label.setOpaque(true);
label.setToolTipText(label.getText()); label.setToolTipText(label.getText());
return label; return label;
} }
if (node.hasDescString()) { if (!node.hasDescString()) {
RSyntaxTextArea textArea = new RSyntaxTextArea(); return emptyLabel;
textArea.setFont(codeFont);
textArea.setEditable(false);
textArea.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA);
textArea.setText(" " + node.makeDescString());
textArea.setRows(1);
textArea.setColumns(textArea.getText().length());
if (highlightText != null) {
SearchContext searchContext = new SearchContext(highlightText);
searchContext.setMatchCase(true);
searchContext.setMarkAll(true);
SearchEngine.markAll(textArea, searchContext);
}
return textArea;
} }
return null; RSyntaxTextArea textArea = new RSyntaxTextArea();
textArea.setFont(codeFont);
textArea.setEditable(false);
textArea.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA);
textArea.setText(" " + node.makeDescString());
textArea.setRows(1);
textArea.setColumns(textArea.getText().length());
if (highlightText != null) {
SearchContext searchContext = new SearchContext(highlightText);
searchContext.setMatchCase(true);
searchContext.setMarkAll(true);
SearchEngine.markAll(textArea, searchContext);
}
return textArea;
} }
public void clear() { public void clear() {
......
package jadx.gui.ui; package jadx.gui.ui;
import jadx.gui.utils.NLS; import jadx.gui.utils.NLS;
import jadx.gui.utils.search.TextSearchIndex;
import jadx.gui.utils.TextStandardActions; import jadx.gui.utils.TextStandardActions;
import jadx.gui.utils.search.TextSearchIndex;
import javax.swing.BorderFactory; import javax.swing.BorderFactory;
import javax.swing.Box; import javax.swing.Box;
...@@ -12,6 +12,7 @@ import javax.swing.JLabel; ...@@ -12,6 +12,7 @@ import javax.swing.JLabel;
import javax.swing.JPanel; import javax.swing.JPanel;
import javax.swing.JTextField; import javax.swing.JTextField;
import javax.swing.SwingUtilities; import javax.swing.SwingUtilities;
import javax.swing.Timer;
import javax.swing.WindowConstants; import javax.swing.WindowConstants;
import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener; import javax.swing.event.DocumentListener;
...@@ -19,6 +20,8 @@ import java.awt.BorderLayout; ...@@ -19,6 +20,8 @@ import java.awt.BorderLayout;
import java.awt.Container; import java.awt.Container;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.FlowLayout; import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent; import java.awt.event.ItemEvent;
import java.awt.event.ItemListener; import java.awt.event.ItemListener;
import java.awt.event.KeyAdapter; import java.awt.event.KeyAdapter;
...@@ -105,18 +108,35 @@ public class SearchDialog extends CommonSearchDialog { ...@@ -105,18 +108,35 @@ public class SearchDialog extends CommonSearchDialog {
highlightText = text; highlightText = text;
resultsTable.updateTable(); resultsTable.updateTable();
} }
private class SearchFieldListener implements DocumentListener {
public void changedUpdate(DocumentEvent e) { private class SearchFieldListener implements DocumentListener, ActionListener {
private Timer timer;
private synchronized void change() {
if (timer != null) {
timer.restart();
} else {
timer = new Timer(300, this);
timer.start();
}
}
@Override
public void actionPerformed(ActionEvent e) {
performSearch(); performSearch();
} }
public void changedUpdate(DocumentEvent e) {
change();
}
public void removeUpdate(DocumentEvent e) { public void removeUpdate(DocumentEvent e) {
performSearch(); change();
} }
public void insertUpdate(DocumentEvent e) { public void insertUpdate(DocumentEvent e) {
performSearch(); change();
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment