From f2573c3765c5e2d436c4d2871f3a450ee3ada1ed Mon Sep 17 00:00:00 2001 From: Niki Roo Date: Sat, 25 Apr 2020 20:01:12 +0200 Subject: [PATCH] ListSnapshot (used on ListModel) --- ui/ListModel.java | 34 ++++++++++++++++++++++++ ui/ListSnapshot.java | 62 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 96 insertions(+) create mode 100644 ui/ListSnapshot.java diff --git a/ui/ListModel.java b/ui/ListModel.java index 06e7914c..52fa816a 100644 --- a/ui/ListModel.java +++ b/ui/ListModel.java @@ -81,6 +81,7 @@ public class ListModel extends DefaultListModel6 { private int hoveredIndex; private List items = new ArrayList(); private JList6 list; + private boolean keepSelection = true; /** * Create a new {@link ListModel}. @@ -185,6 +186,31 @@ public class ListModel extends DefaultListModel6 { }); } + /** + * (Try and) keep the elements that were selected when filtering. + *

+ * This will use toString on the elements to identify them, and can be a bit + * resource intensive. + * + * @return TRUE if we do + */ + public boolean isKeepSelection() { + return keepSelection; + } + + /** + * (Try and) keep the elements that were selected when filtering. + *

+ * This will use toString on the elements to identify them, and can be a bit + * resource intensive. + * + * @param keepSelection + * TRUE to try and keep them selected + */ + public void setKeepSelection(boolean keepSelection) { + this.keepSelection = keepSelection; + } + /** * Check if this element is currently under the mouse. * @@ -289,6 +315,11 @@ public class ListModel extends DefaultListModel6 { */ @SuppressWarnings("unchecked") // ListModel and JList are not java 1.6 public void filter(Predicate filter) { + ListSnapshot snapshot = null; + + if (keepSelection) + snapshot = new ListSnapshot(list); + clear(); for (T item : items) { if (filter == null || filter.test(item)) { @@ -296,6 +327,9 @@ public class ListModel extends DefaultListModel6 { } } + if (keepSelection) + snapshot.apply(); + list.repaint(); } diff --git a/ui/ListSnapshot.java b/ui/ListSnapshot.java new file mode 100644 index 00000000..d2e89c86 --- /dev/null +++ b/ui/ListSnapshot.java @@ -0,0 +1,62 @@ +package be.nikiroo.utils.ui; + +import java.util.ArrayList; +import java.util.List; + +import javax.swing.JList; + +public class ListSnapshot { + private JList list; + private List elements = new ArrayList(); + + public ListSnapshot(JList list) { + this.list = list; + + for (int index : list.getSelectedIndices()) { + elements.add(list.getModel().getElementAt(index)); + } + } + + public void apply() { + applyTo(list); + } + + public void applyTo(JList list) { + List indices = new ArrayList(); + for (int i = 0; i < list.getModel().getSize(); i++) { + Object newObject = list.getModel().getElementAt(i); + for (Object oldObject : elements) { + if (isSameElement(oldObject, newObject)) { + indices.add(i); + break; + } + } + } + + int a[] = new int[indices.size()]; + for (int i = 0; i < indices.size(); i++) { + a[i] = indices.get(i); + } + list.setSelectedIndices(a); + } + + // You can override this + protected boolean isSameElement(Object oldElement, Object newElement) { + if (oldElement == null || newElement == null) + return oldElement == null && newElement == null; + + return oldElement.toString().equals(newElement.toString()); + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("List Snapshot of: ").append(list).append("\n"); + builder.append("Selected elements:\n"); + for (Object element : elements) { + builder.append("\t").append(element).append("\n"); + } + + return builder.toString(); + } +} -- 2.27.0