From f3d521d82041f7683219eb304231690145cc342f Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Thu, 14 Feb 2019 15:34:17 +0100 Subject: [PATCH 1/2] [Lib Manager] Avoid updating the UI at every keystroke Fixes #8282 --- .../contributions/ui/FilterJTextField.java | 24 +++++-------------- .../contributions/ui/InstallerJDialog.java | 1 + 2 files changed, 7 insertions(+), 18 deletions(-) diff --git a/app/src/cc/arduino/contributions/ui/FilterJTextField.java b/app/src/cc/arduino/contributions/ui/FilterJTextField.java index 9dc7fd8d6b5..29b9be7558c 100644 --- a/app/src/cc/arduino/contributions/ui/FilterJTextField.java +++ b/app/src/cc/arduino/contributions/ui/FilterJTextField.java @@ -33,6 +33,8 @@ import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; @@ -66,35 +68,21 @@ public void focusGained(FocusEvent focusEvent) { } }); - getDocument().addDocumentListener(new DocumentListener() { - public void removeUpdate(DocumentEvent e) { - applyFilter(); - } - - public void insertUpdate(DocumentEvent e) { - applyFilter(); - } - - public void changedUpdate(DocumentEvent e) { + addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { applyFilter(); } }); } - private String lastFilter = ""; - - private void applyFilter() { + public void applyFilter() { String filter = showingHint ? "" : getText(); filter = filter.toLowerCase(); // Replace anything but 0-9, a-z, or : with a space filter = filter.replaceAll("[^\\x30-\\x39^\\x61-\\x7a^\\x3a]", " "); - // Fire event only if the filter is changed - if (filter.equals(lastFilter)) - return; - - lastFilter = filter; onFilter(filter.split(" ")); } diff --git a/app/src/cc/arduino/contributions/ui/InstallerJDialog.java b/app/src/cc/arduino/contributions/ui/InstallerJDialog.java index 3dd864134c4..466bd0dfafc 100644 --- a/app/src/cc/arduino/contributions/ui/InstallerJDialog.java +++ b/app/src/cc/arduino/contributions/ui/InstallerJDialog.java @@ -320,6 +320,7 @@ public void setFilterText(String filterText) { listener.focusGained(new FocusEvent(filterField, FocusEvent.FOCUS_GAINED)); } filterField.setText(filterText); + filterField.applyFilter(); } public void selectDropdownItemByClassName(String dropdownItem) { From 8f5f4f594d679408863933ecd6bbdcec03c900dc Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Fri, 15 Feb 2019 10:44:56 +0100 Subject: [PATCH 2/2] [LibManager] Restore "search on type" with 1 second grace period --- .../contributions/ui/FilterJTextField.java | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/app/src/cc/arduino/contributions/ui/FilterJTextField.java b/app/src/cc/arduino/contributions/ui/FilterJTextField.java index 29b9be7558c..90759449397 100644 --- a/app/src/cc/arduino/contributions/ui/FilterJTextField.java +++ b/app/src/cc/arduino/contributions/ui/FilterJTextField.java @@ -43,6 +43,7 @@ public class FilterJTextField extends JTextField { private final String filterHint; private boolean showingHint; + private Timer timer; public FilterJTextField(String hint) { super(hint); @@ -50,6 +51,13 @@ public FilterJTextField(String hint) { showingHint = true; updateStyle(); + timer = new Timer(1000, new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + applyFilter(); + timer.stop(); + } + }); addFocusListener(new FocusListener() { public void focusLost(FocusEvent focusEvent) { @@ -68,14 +76,38 @@ public void focusGained(FocusEvent focusEvent) { } }); + getDocument().addDocumentListener(new DocumentListener() { + public void removeUpdate(DocumentEvent e) { + spawnTimer(); + } + + public void insertUpdate(DocumentEvent e) { + spawnTimer(); + } + + public void changedUpdate(DocumentEvent e) { + + } + }); + addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { + if (timer.isRunning()) { + timer.stop(); + } applyFilter(); } }); } + private void spawnTimer() { + if (timer.isRunning()) { + timer.stop(); + } + timer.start(); + } + public void applyFilter() { String filter = showingHint ? "" : getText(); filter = filter.toLowerCase();