Skip to content

Commit

Permalink
add search function to addKey field to highlight, fix several issues
Browse files Browse the repository at this point in the history
  • Loading branch information
kryptonbutterfly committed Mar 25, 2023
1 parent 5103e5c commit e00d427
Show file tree
Hide file tree
Showing 11 changed files with 134 additions and 40 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ A Language file Editor with special sauce for java projects.

java version | app version | jar | deb
:----------: | :---------: | :-: | :-:
18+ | 2.2.0 | [Localizer4J.jar](https://github.com/tinycodecrank/Localizer4J/releases/download/v2.2.0/Localizer4J.jar) | [Localizer4J-2.2.0.deb](https://github.com/tinycodecrank/Localizer4J/releases/download/v2.2.0/Localizer4J-2.2.0.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)

## Dependencies

Expand Down
2 changes: 1 addition & 1 deletion deb-content/version.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
2.2.0
2.3.0
1 change: 1 addition & 0 deletions src/assets/lang/de_DE.lang
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ Main.title = Übersetzungen
New Project.button.accept = Übernehmen
New Project.button.browse = Durchsuchen…
New Project.button.cancle = Abbrechen
New Project.fileChooser.selectFolder.button_approve = Auswählen
New Project.label.Create lang_version.xml = Erstelle lang_version.xml:
New Project.label.File extension = Dateiendung:
New Project.label.File type = Dateityp:
Expand Down
1 change: 1 addition & 0 deletions src/assets/lang/en_US.lang
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ Main.title = Localizations
New Project.button.accept = Accept
New Project.button.browse = Browse…
New Project.button.cancle = Cancle
New Project.fileChooser.selectFolder.button_approve = Select
New Project.label.Create lang_version.xml = Create lang_versions.xml:
New Project.label.File extension = File extension:
New Project.label.File type = File type:
Expand Down
4 changes: 2 additions & 2 deletions src/assets/lang/lang_versions.xml
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,11 @@
<languages type="0">
<item>
<key type="1" value="en_US"/>
<value type="2" value="24"/>
<value type="2" value="25"/>
</item>
<item>
<key type="1" value="de_DE"/>
<value type="2" value="6"/>
<value type="2" value="7"/>
</item>
</languages>
</config>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,6 @@ public void load(Language language, File file)
Properties props = new Properties();
props.load(iStream);
props.forEach((key, value) -> language.translations.add(new Translation((String) key, (String) value)));
// for (Entry<Object, Object> entry : props.entrySet())
// language.translations.add(new Translation((String) entry.getKey(), (String)
// entry.getValue()));
}
catch (IOException e)
{
Expand Down
51 changes: 44 additions & 7 deletions src/de/tinycodecrank/l4j/ui/main/BusinessLogic.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package de.tinycodecrank.l4j.ui.main;

import static de.tinycodecrank.math.utils.range.Range.*;

import java.awt.Cursor;
import java.awt.Dialog.ModalityType;
import java.awt.EventQueue;
Expand All @@ -9,10 +11,12 @@
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.function.Consumer;

import javax.swing.JFileChooser;
import javax.swing.JMenuItem;
import javax.swing.JViewport;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.filechooser.FileFilter;

Expand All @@ -28,6 +32,7 @@
import de.tinycodecrank.l4j.ui.lang.LangGui;
import de.tinycodecrank.l4j.ui.project.ProjectGui;
import de.tinycodecrank.l4j.ui.settings.Settings;
import de.tinycodecrank.l4j.util.DocumentListenerAdapter;
import de.tinycodecrank.l4j.util.KeyEventListener;
import de.tinycodecrank.l4j.util.KeyEventType;
import de.tinycodecrank.l4j.util.Sneaky;
Expand Down Expand Up @@ -725,6 +730,41 @@ KeyListener addKey_Escape()
KeyEvent.VK_ESCAPE);
}

DocumentListener addKey_Search()
{
final var listener = create_addKey_Search();
return new DocumentListenerAdapter(listener, listener, listener);
}

private Consumer<DocumentEvent> create_addKey_Search()
{
return e -> gui.if_(gui ->
{
final String searchText = gui.txtAddKey.getText();
if (!StringUtils.isNotEmpty(searchText))
return;

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());
if (dist.isPresent())
{
int intDist = dist.get(() -> Integer.MAX_VALUE);
if (intDist < distance)
{
distance = intDist;
match = translatable.getKey();
}
}
}
if (match != null)
setSelection(match);
});
}

void addKey(ActionEvent ae)
{
gui.if_(gui -> project.if_(project ->
Expand Down Expand Up @@ -754,19 +794,16 @@ private static void updateSwapButton(MainGui gui)

private void setSelection(String selection)
{
final int paddingVertical = 20;
gui.if_(gui ->
{
final int target = gui.tableModel.find(selection);
if (target == -1)
return;

gui.table.setRowSelectionInterval(target, target);
final var viewport = (JViewport) gui.table.getParent();
final var rect = gui.table.getCellRect(target, 1, true);
final var offset = viewport.getViewPosition();
final int x = rect.x - offset.x;
final int y = rect.y - offset.y;
rect.setLocation(x, y);
final var rect = gui.table.getCellRect(target, 1, true);
rect.grow(0, paddingVertical);
gui.table.scrollRectToVisible(rect);
});
}
Expand Down
25 changes: 5 additions & 20 deletions src/de/tinycodecrank/l4j/ui/main/MainGui.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@
import javax.swing.SwingConstants;
import javax.swing.border.EmptyBorder;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

import de.tinycodecrank.i18n.Localizer;
import de.tinycodecrank.l4j.data.gui.Translatable.TranslationState;
Expand All @@ -45,6 +44,7 @@
import de.tinycodecrank.l4j.ui.main.parts.TableModelMisc;
import de.tinycodecrank.l4j.ui.main.parts.TranslationTableCellRenderer;
import de.tinycodecrank.l4j.util.ColorUtils;
import de.tinycodecrank.l4j.util.DocumentListenerAdapter;
import de.tinycodecrank.l4j.util.ObservableLangGui;
import de.tinycodecrank.util.swing.events.GuiCloseEvent;

Expand Down Expand Up @@ -277,6 +277,7 @@ public MainGui(Consumer<GuiCloseEvent<Void>> closeListener, ProgramArgs args, Lo
txtAddKey.setEnabled(false);
businessLogic.if_(bl -> txtAddKey.addKeyListener(bl.addKey_Enter()));
businessLogic.if_(bl -> txtAddKey.addKeyListener(bl.addKey_Escape()));
businessLogic.if_(bl -> txtAddKey.getDocument().addDocumentListener(bl.addKey_Search()));

btnAddKey = new JButton();
reg("Main.button.add", btnAddKey::setText);
Expand Down Expand Up @@ -363,26 +364,10 @@ public MainGui(Consumer<GuiCloseEvent<Void>> closeListener, ProgramArgs args, Lo
txtTranslation.setWrapStyleWord(true);
txtTranslation.setLineWrap(true);
panelTranslationGrid.add(txtTranslation);
txtTranslation.getDocument().addDocumentListener(new DocumentListener()
{
@Override
public void removeUpdate(DocumentEvent e)
{
btnApply.setEnabled(true);
}

@Override
public void insertUpdate(DocumentEvent e)
{
btnApply.setEnabled(true);
}

@Override
public void changedUpdate(DocumentEvent e)
{
btnApply.setEnabled(true);
}
});
final Consumer<DocumentEvent> l = e -> btnApply.setEnabled(true);
txtTranslation.getDocument().addDocumentListener(new DocumentListenerAdapter(l, l, l));
}
businessLogic.if_(bl -> txtTranslation.addKeyListener(bl.changeTranslation_Enter()));
businessLogic.if_(bl -> txtTranslation.addKeyListener(bl.changeTranslation_Escape()));

Expand Down
41 changes: 41 additions & 0 deletions src/de/tinycodecrank/l4j/util/DocumentListenerAdapter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package de.tinycodecrank.l4j.util;

import java.util.function.Consumer;

import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

public class DocumentListenerAdapter implements DocumentListener
{
private final Consumer<DocumentEvent> insertUpdate;
private final Consumer<DocumentEvent> removeUpdate;
private final Consumer<DocumentEvent> changedUpdate;

public DocumentListenerAdapter(
Consumer<DocumentEvent> insertUpdate,
Consumer<DocumentEvent> removeUpdate,
Consumer<DocumentEvent> changedUpdate)
{
this.insertUpdate = insertUpdate;
this.removeUpdate = removeUpdate;
this.changedUpdate = changedUpdate;
}

@Override
public void insertUpdate(DocumentEvent e)
{
insertUpdate.accept(e);
}

@Override
public void removeUpdate(DocumentEvent e)
{
removeUpdate.accept(e);
}

@Override
public void changedUpdate(DocumentEvent e)
{
changedUpdate.accept(e);
}
}
23 changes: 17 additions & 6 deletions src/de/tinycodecrank/l4j/util/KeyEventListener.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,30 +12,41 @@
@FunctionalInterface
public interface KeyEventListener extends Predicate<KeyEvent>
{

public static KeyListener create(KeyEventType type, KeyEventListener listener, int... keys)
public static KeyListener createUnrestricted(KeyEventType type, KeyEventListener listener)
{
Arrays.sort(keys);
return create(type, e ->
{
if (ArrayUtils.find(keys, e.getExtendedKeyCode()) != -1)
if (!e.isConsumed())
if (listener.test(e))
e.consume();
});
}

public static KeyListener create(KeyEventType type, int mask, KeyEventListener listener, int... keys)
public static KeyListener create(KeyEventType type, KeyEventListener listener, int... keys)
{
Arrays.sort(keys);
return create(type, e ->
{
if (mask == e.getModifiersEx())
if (!e.isConsumed())
if (ArrayUtils.find(keys, e.getExtendedKeyCode()) != -1)
if (listener.test(e))
e.consume();
});
}

public static KeyListener create(KeyEventType type, int mask, KeyEventListener listener, int... keys)
{
Arrays.sort(keys);
return create(type, e ->
{
if (!e.isConsumed())
if (mask == e.getModifiersEx())
if (ArrayUtils.find(keys, e.getExtendedKeyCode()) != -1)
if (listener.test(e))
e.consume();
});
}

private static KeyListener create(KeyEventType type, Consumer<KeyEvent> listener)
{
return switch (type)
Expand Down
21 changes: 21 additions & 0 deletions src/de/tinycodecrank/l4j/util/StringUtils.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package de.tinycodecrank.l4j.util;

import de.tinycodecrank.monads.opt.Opt;

public final class StringUtils
{
public static boolean isNotEmpty(String str)
Expand All @@ -11,4 +13,23 @@ public static boolean isNotBlank(String str)
{
return !(str == null || str.isBlank());
}

public static Opt<Integer> camelDistance(String search, String target)
{
if (search.length() > target.length())
return Opt.empty();

final var parts = search.split("(?=\\p{Lu})");
int difference = 0;
for (final var part : parts)
{
final int index = target.indexOf(part);
if (index == -1)
return Opt.empty();
if (index > 0)
difference += index;
target = target.substring(index + part.length());
}
return Opt.of(difference + target.length());
}
}

0 comments on commit e00d427

Please sign in to comment.