From f26032ed7df6bfbe407ce671e1c7309cf54ac86e Mon Sep 17 00:00:00 2001 From: Jan S Date: Fri, 23 Apr 2021 11:33:52 +0200 Subject: [PATCH] fix(gui): small search dialog optimizations (PR #1143) * avoid extra vertical space below search options when dialog is wide * make sure the search dialog has the correct size and the options are aligned properly * regex search: make searchField background red in case of invalid regex entered --- .../java/jadx/gui/ui/CommonSearchDialog.java | 4 ++- .../main/java/jadx/gui/ui/SearchDialog.java | 25 +++++++++++++------ .../jadx/gui/utils/layout/WrapLayout.java | 6 ++--- .../jadx/gui/utils/search/SearchSettings.java | 12 ++++++--- .../gui/utils/search/TextSearchIndex.java | 3 ++- 5 files changed, 34 insertions(+), 16 deletions(-) diff --git a/jadx-gui/src/main/java/jadx/gui/ui/CommonSearchDialog.java b/jadx-gui/src/main/java/jadx/gui/ui/CommonSearchDialog.java index 84078b30..ea777411 100644 --- a/jadx-gui/src/main/java/jadx/gui/ui/CommonSearchDialog.java +++ b/jadx-gui/src/main/java/jadx/gui/ui/CommonSearchDialog.java @@ -95,7 +95,9 @@ public abstract class CommonSearchDialog extends JDialog { protected abstract void loadStart(); public void loadWindowPos() { - mainWindow.getSettings().loadWindowPos(this); + if (!mainWindow.getSettings().loadWindowPos(this)) { + setSize(800, 500); + } } public void prepare() { diff --git a/jadx-gui/src/main/java/jadx/gui/ui/SearchDialog.java b/jadx-gui/src/main/java/jadx/gui/ui/SearchDialog.java index f201bba9..adc45049 100644 --- a/jadx-gui/src/main/java/jadx/gui/ui/SearchDialog.java +++ b/jadx-gui/src/main/java/jadx/gui/ui/SearchDialog.java @@ -1,9 +1,6 @@ package jadx.gui.ui; -import java.awt.BorderLayout; -import java.awt.Container; -import java.awt.Dimension; -import java.awt.FlowLayout; +import java.awt.*; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.util.Collections; @@ -38,10 +35,12 @@ import jadx.gui.treemodel.JNode; import jadx.gui.utils.NLS; import jadx.gui.utils.TextStandardActions; import jadx.gui.utils.layout.WrapLayout; +import jadx.gui.utils.search.SearchSettings; import jadx.gui.utils.search.TextSearchIndex; public class SearchDialog extends CommonSearchDialog { private static final long serialVersionUID = -5105405456969134105L; + private static final Color SEARCHFIELD_ERROR_COLOR = new Color(255, 150, 150); private static final Logger LOG = LoggerFactory.getLogger(SearchDialog.class); @@ -81,6 +80,8 @@ public class SearchDialog extends CommonSearchDialog { private final transient SearchPreset searchPreset; private final transient Set options; + private Color searchFieldDefaultBgColor; + private transient JTextField searchField; private transient Disposable searchDisposable; @@ -95,10 +96,10 @@ public class SearchDialog extends CommonSearchDialog { this.options = buildOptions(preset); this.options.addAll(additionalOptions); + loadWindowPos(); initUI(); searchFieldSubscribe(); registerInitOnOpen(); - loadWindowPos(); registerActiveTabListener(); } @@ -183,6 +184,7 @@ public class SearchDialog extends CommonSearchDialog { private void initUI() { searchField = new JTextField(); + searchFieldDefaultBgColor = searchField.getBackground(); searchField.setAlignmentX(LEFT_ALIGNMENT); TextStandardActions.attach(searchField); @@ -246,8 +248,6 @@ public class SearchDialog extends CommonSearchDialog { }); setTitle(NLS.str("menu.text_search")); - pack(); - setSize(800, 500); setLocationRelativeTo(null); setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); setModalityType(ModalityType.MODELESS); @@ -306,7 +306,16 @@ public class SearchDialog extends CommonSearchDialog { } LOG.debug("search event: {}", text); showSearchState(); - return index.buildSearch(text, options); + try { + Flowable result = index.buildSearch(text, options); + if (searchField.getBackground() == SEARCHFIELD_ERROR_COLOR) { + searchField.setBackground(searchFieldDefaultBgColor); + } + return result; + } catch (SearchSettings.InvalidSearchTermException e) { + searchField.setBackground(SEARCHFIELD_ERROR_COLOR); + return Flowable.empty(); + } } private void processSearchResults(java.util.List results) { diff --git a/jadx-gui/src/main/java/jadx/gui/utils/layout/WrapLayout.java b/jadx-gui/src/main/java/jadx/gui/utils/layout/WrapLayout.java index 8800b184..2a399e35 100644 --- a/jadx-gui/src/main/java/jadx/gui/utils/layout/WrapLayout.java +++ b/jadx-gui/src/main/java/jadx/gui/utils/layout/WrapLayout.java @@ -128,10 +128,10 @@ public class WrapLayout extends FlowLayout { if (m.isVisible()) { Dimension d = preferred ? m.getPreferredSize() : m.getMinimumSize(); + int width = d.width; // Can't add the component to current row. Start a new row. - - if (rowWidth + d.width > maxWidth) { + if (rowWidth + width >= maxWidth) { addRow(dim, rowWidth, rowHeight); rowWidth = 0; rowHeight = 0; @@ -143,7 +143,7 @@ public class WrapLayout extends FlowLayout { rowWidth += hgap; } - rowWidth += d.width; + rowWidth += width; rowHeight = Math.max(rowHeight, d.height); } } diff --git a/jadx-gui/src/main/java/jadx/gui/utils/search/SearchSettings.java b/jadx-gui/src/main/java/jadx/gui/utils/search/SearchSettings.java index e2a66f6d..b5a4b295 100644 --- a/jadx-gui/src/main/java/jadx/gui/utils/search/SearchSettings.java +++ b/jadx-gui/src/main/java/jadx/gui/utils/search/SearchSettings.java @@ -52,14 +52,13 @@ public class SearchSettings { return this.regexPattern; } - public boolean preCompile() { + public boolean preCompile() throws InvalidSearchTermException { if (useRegex) { try { int flags = ignoreCase ? Pattern.CASE_INSENSITIVE : 0; this.regexPattern = Pattern.compile(searchString, flags); } catch (Exception e) { - LOG.warn("Invalid Regex: {}", this.searchString, e); - return false; + throw new InvalidSearchTermException("Invalid Regex: " + this.searchString, e); } } return true; @@ -105,4 +104,11 @@ public class SearchSettings { public void setActiveCls(JClass activeCls) { this.activeCls = activeCls; } + + public static class InvalidSearchTermException extends Exception { + + public InvalidSearchTermException(String message, Throwable cause) { + super(message, cause); + } + } } diff --git a/jadx-gui/src/main/java/jadx/gui/utils/search/TextSearchIndex.java b/jadx-gui/src/main/java/jadx/gui/utils/search/TextSearchIndex.java index 75b32585..f5d240fc 100644 --- a/jadx-gui/src/main/java/jadx/gui/utils/search/TextSearchIndex.java +++ b/jadx-gui/src/main/java/jadx/gui/utils/search/TextSearchIndex.java @@ -109,7 +109,8 @@ public class TextSearchIndex { this.codeIndex.removeForCls(cls); } - public Flowable buildSearch(String text, Set options) { + public Flowable buildSearch(String text, Set options) + throws SearchSettings.InvalidSearchTermException { boolean ignoreCase = options.contains(IGNORE_CASE); boolean useRegex = options.contains(USE_REGEX); -- GitLab