From 1062ca62924674e247b7e3b5c9dfe068dc649778 Mon Sep 17 00:00:00 2001 From: tinycodecrank Date: Sat, 25 Mar 2023 21:18:52 +0100 Subject: [PATCH] improve Search and remove unused dependency --- .classpath | 6 ----- README.md | 3 +-- deb-content/version.txt | 2 +- .../l4j/data/gui/Translatable.java | 10 -------- .../l4j/ui/main/BusinessLogic.java | 25 +++++++++++++------ src/de/tinycodecrank/l4j/ui/search/BL.java | 21 ++++++++++++---- .../tinycodecrank/l4j/ui/search/KeyTab.java | 21 ++++++++-------- .../l4j/ui/search/SearchGui.java | 5 +++- .../l4j/ui/search/SearchKeyData.java | 7 ++++-- .../tinycodecrank/l4j/util/StringUtils.java | 12 +++++++++ src/module-info.java | 1 - 11 files changed, 67 insertions(+), 46 deletions(-) diff --git a/.classpath b/.classpath index a19dfe3..87b714d 100644 --- a/.classpath +++ b/.classpath @@ -72,12 +72,6 @@ - - - - - - diff --git a/README.md b/README.md index a7a713f..06373fc 100644 --- a/README.md +++ b/README.md @@ -7,11 +7,10 @@ A Language file Editor with special sauce for java projects. java version | app version | jar | deb :----------: | :---------: | :-: | :-: -18+ | 2.3.0 | [Localizer4J.jar](https://github.com/tinycodecrank/Localizer4J/releases/download/v2.3.0/Localizer4J.jar) | [Localizer4J-2.3.0.deb](https://github.com/tinycodecrank/Localizer4J/releases/download/v2.3.0/Localizer4J-2.3.0.deb) +18+ | 2.4.0 | [Localizer4J.jar](https://github.com/tinycodecrank/Localizer4J/releases/download/v2.4.0/Localizer4J.jar) | [Localizer4J-2.4.0.deb](https://github.com/tinycodecrank/Localizer4J/releases/download/v2.4.0/Localizer4J-2.4.0.deb) ## Dependencies -* [**commons-text-1.9.jar**](https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar) * [**gson.jar**](https://search.maven.org/remotecontent?filepath=com/google/code/gson/gson/2.10.1/gson-2.10.1.jar) * [**tinyArgsManager.jar**](https://github.com/tinycodecrank/tinyArgsManager/releases/download/v0.1.0/tinyArgsmanager.jar) * [**BoundedValues.jar**](https://github.com/tinycodecrank/BoundedValues/releases/download/v1.0.0/BoundedValues.jar) diff --git a/deb-content/version.txt b/deb-content/version.txt index 276cbf9..197c4d5 100644 --- a/deb-content/version.txt +++ b/deb-content/version.txt @@ -1 +1 @@ -2.3.0 +2.4.0 diff --git a/src/de/tinycodecrank/l4j/data/gui/Translatable.java b/src/de/tinycodecrank/l4j/data/gui/Translatable.java index 6814d84..a405044 100644 --- a/src/de/tinycodecrank/l4j/data/gui/Translatable.java +++ b/src/de/tinycodecrank/l4j/data/gui/Translatable.java @@ -3,15 +3,11 @@ import java.awt.Color; import java.util.Objects; -import org.apache.commons.text.similarity.LevenshteinDistance; - import de.tinycodecrank.l4j.util.ColorUtils; import de.tinycodecrank.l4j.util.Constants; public abstract class Translatable implements Comparable, Constants { - private static final LevenshteinDistance distance = new LevenshteinDistance(5); - private String key; private TranslationState state; @@ -42,12 +38,6 @@ public int compareTo(Translatable o) } } - public int getDistance(String key) - { - Objects.requireNonNull(key); - return distance.apply(key, this.key); - } - public final String getKey() { return key; diff --git a/src/de/tinycodecrank/l4j/ui/main/BusinessLogic.java b/src/de/tinycodecrank/l4j/ui/main/BusinessLogic.java index eb496d7..2cd1fdc 100644 --- a/src/de/tinycodecrank/l4j/ui/main/BusinessLogic.java +++ b/src/de/tinycodecrank/l4j/ui/main/BusinessLogic.java @@ -11,6 +11,7 @@ import java.io.File; import java.io.IOException; import java.util.Arrays; +import java.util.function.BiFunction; import java.util.function.Consumer; import javax.swing.JFileChooser; @@ -73,7 +74,7 @@ void init(ProgramArgs args) e -> {}, l10n, - new SearchKeyData(gui.table, this::setSelection)))); + new SearchKeyData(gui.table, this::searchKey)))); if (args.projectFile == null || args.projectFile.length <= 0) return; @@ -755,15 +756,23 @@ private Consumer create_addKey_Search() return e -> gui.if_(gui -> { final String searchText = gui.txtAddKey.getText(); - if (!StringUtils.isNotEmpty(searchText)) - return; - + searchKey(searchText, StringUtils::camelDistance); + }); + } + + private void searchKey(String search, BiFunction> distanceFunction) + { + if (!StringUtils.isNotBlank(search)) + return; + + gui.map(gui -> + { int distance = Integer.MAX_VALUE; String match = null; for (int row : range(gui.tableModel.getRowCount())) { final var translatable = gui.tableModel.getTranslatable(row); - final var dist = StringUtils.camelDistance(searchText, translatable.getKey()); + final var dist = distanceFunction.apply(search, translatable.getKey()); if (dist.isPresent()) { int intDist = dist.get(() -> Integer.MAX_VALUE); @@ -774,8 +783,10 @@ private Consumer create_addKey_Search() } } } - if (match != null) - setSelection(match); + return match; + }).if_(s -> + { + setSelection(s); }); } diff --git a/src/de/tinycodecrank/l4j/ui/search/BL.java b/src/de/tinycodecrank/l4j/ui/search/BL.java index e0a786c..29ceb3a 100644 --- a/src/de/tinycodecrank/l4j/ui/search/BL.java +++ b/src/de/tinycodecrank/l4j/ui/search/BL.java @@ -1,11 +1,12 @@ package de.tinycodecrank.l4j.ui.search; import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - -import javax.swing.JTextField; +import java.util.function.BiFunction; +import de.tinycodecrank.functions.UnaryOperator; import de.tinycodecrank.l4j.startup.Localizer4J; +import de.tinycodecrank.l4j.util.StringUtils; +import de.tinycodecrank.monads.opt.Opt; import de.tinycodecrank.util.swing.DialogLogicTemplate; final class BL extends DialogLogicTemplate @@ -18,9 +19,19 @@ final class BL extends DialogLogicTemplate this.data = data; } - ActionListener search(JTextField text) + void search(ActionEvent ae) { - return ae -> data.setSelection().accept(text.getText()); + gui.if_(gui -> + { + final UnaryOperator transformer = gui.keyTab.chckbxCaseSensitive.isSelected() + ? UnaryOperator.identity() + : String::toLowerCase; + + BiFunction> search = (left, right) -> StringUtils + .matchOffset(left, transformer.apply(right)); + + data.setSelection().accept(transformer.apply(gui.keyTab.txtSearch.getText()), search); + }); } void abort(ActionEvent ae) diff --git a/src/de/tinycodecrank/l4j/ui/search/KeyTab.java b/src/de/tinycodecrank/l4j/ui/search/KeyTab.java index b0ed1c8..deb7504 100644 --- a/src/de/tinycodecrank/l4j/ui/search/KeyTab.java +++ b/src/de/tinycodecrank/l4j/ui/search/KeyTab.java @@ -17,24 +17,24 @@ final class KeyTab { - static JPanel buildKeyTab( - SearchGui gui, - Opt bL, - GuiPrefs guiPrefs, - BiConsumer> reg) + final JTextField txtSearch; + final JPanel panel; + final JCheckBox chckbxCaseSensitive; + + KeyTab(SearchGui gui, Opt bL, GuiPrefs guiPrefs, BiConsumer> reg) { final var panelContent = Box.createVerticalBox(); - final var txtSearch = new JTextField(); + txtSearch = new JTextField(); panelContent.add(txtSearch, BorderLayout.CENTER); - final var panelSettings = Box.createVerticalBox(); - final var chckbxCaseSensitive = new JCheckBox(); + final var panelSettings = Box.createVerticalBox(); + chckbxCaseSensitive = new JCheckBox(); chckbxCaseSensitive.setRolloverEnabled(true); reg.accept("Search.Checkbox.Case Sensitive", chckbxCaseSensitive::setText); panelSettings.add(chckbxCaseSensitive); - final var panel = new JPanel(new BorderLayout()); + panel = new JPanel(new BorderLayout()); panel.add(panelContent, BorderLayout.CENTER); panel.add(panelSettings, BorderLayout.EAST); @@ -42,13 +42,12 @@ static JPanel buildKeyTab( { final var applyAbortPanel = new ApplyAbortPanel( buttonSearch, - bl.search(txtSearch), + bl::search, buttonCancel, bl::abort); reg.accept(buttonSearch, applyAbortPanel.btnButton1::setText); reg.accept(buttonCancel, applyAbortPanel.btnButton2::setText); panel.add(applyAbortPanel, BorderLayout.SOUTH); }); - return panel; } } \ No newline at end of file diff --git a/src/de/tinycodecrank/l4j/ui/search/SearchGui.java b/src/de/tinycodecrank/l4j/ui/search/SearchGui.java index f3ceac7..238d04e 100644 --- a/src/de/tinycodecrank/l4j/ui/search/SearchGui.java +++ b/src/de/tinycodecrank/l4j/ui/search/SearchGui.java @@ -17,6 +17,8 @@ public final class SearchGui extends ObservableLangDialog tabbedPane.setTitleAt(0, s)); tabbedPane.setEnabledAt(0, true); } diff --git a/src/de/tinycodecrank/l4j/ui/search/SearchKeyData.java b/src/de/tinycodecrank/l4j/ui/search/SearchKeyData.java index b2ef40e..a173500 100644 --- a/src/de/tinycodecrank/l4j/ui/search/SearchKeyData.java +++ b/src/de/tinycodecrank/l4j/ui/search/SearchKeyData.java @@ -1,8 +1,11 @@ package de.tinycodecrank.l4j.ui.search; -import java.util.function.Consumer; +import java.util.function.BiConsumer; +import java.util.function.BiFunction; import javax.swing.JTable; -public record SearchKeyData(JTable table, Consumer setSelection) +import de.tinycodecrank.monads.opt.Opt; + +public record SearchKeyData(JTable table, BiConsumer>> setSelection) {} \ No newline at end of file diff --git a/src/de/tinycodecrank/l4j/util/StringUtils.java b/src/de/tinycodecrank/l4j/util/StringUtils.java index 41238cd..54f9b52 100644 --- a/src/de/tinycodecrank/l4j/util/StringUtils.java +++ b/src/de/tinycodecrank/l4j/util/StringUtils.java @@ -32,4 +32,16 @@ public static Opt camelDistance(String search, String target) } return Opt.of(difference + target.length()); } + + public static Opt matchOffset(String search, String target) + { + if (search.length() > target.length()) + return Opt.empty(); + + final int index = target.indexOf(search); + if (index == -1) + return Opt.empty(); + + return Opt.of(target.substring(index + search.length()).length()); + } } \ No newline at end of file diff --git a/src/module-info.java b/src/module-info.java index 5b9be7b..c0ec75d 100644 --- a/src/module-info.java +++ b/src/module-info.java @@ -29,7 +29,6 @@ requires transitive java.desktop; requires java.xml; requires de.tinycodecrank.mathUtils; - requires org.apache.commons.text; requires de.tinycodecrank.JavaLexer; requires com.google.gson; requires de.tinycodecrank.Functional;