X-Git-Url: https://git.nikiroo.be/?a=blobdiff_plain;f=ui%2FListModel.java;h=137897aee45b68bbc682eae949fa8fcd9e15c230;hb=a1d54d1127742f5cf7094d74dd51a8ce2b627dba;hp=cf16d5f0a111e660171102b3efad3bdefe1d6d48;hpb=8a4297ea02dfb0645312b00042b541caa3f8851b;p=nikiroo-utils.git diff --git a/ui/ListModel.java b/ui/ListModel.java index cf16d5f..137897a 100644 --- a/ui/ListModel.java +++ b/ui/ListModel.java @@ -34,6 +34,9 @@ import be.nikiroo.utils.compat.ListCellRenderer6; public class ListModel extends DefaultListModel6 { private static final long serialVersionUID = 1L; + /** How long to wait before displaying a tooltip, in milliseconds. */ + private static final int DELAY_TOOLTIP_MS = 1000; + /** * A filter interface, to check for a condition (note that a Predicate class * already exists in Java 1.8+, and is compatible with this one if you @@ -254,7 +257,7 @@ public class ListModel extends DefaultListModel6 { list.setModel(this); - final DelayWorker tooltipWatcher = new DelayWorker(500); + final DelayWorker tooltipWatcher = new DelayWorker(DELAY_TOOLTIP_MS); if (tooltipCreator != null) { tooltipWatcher.start(); } @@ -273,6 +276,13 @@ public class ListModel extends DefaultListModel6 { fireElementChanged(oldIndex); fireElementChanged(index); + synchronized (tooltipWatcher) { + if (tooltip != null) { + tooltip.setVisible(false); + } + tooltip = null; + } + if (ListModel.this.tooltipCreator != null) { tooltipWatcher.delay("tooltip", new SwingWorker() { @@ -284,10 +294,11 @@ public class ListModel extends DefaultListModel6 { @Override protected void done() { - Window oldTooltip = tooltip; - tooltip = null; - if (oldTooltip != null) { - oldTooltip.setVisible(false); + synchronized (tooltipWatcher) { + if (tooltip != null) { + tooltip.setVisible(false); + } + tooltip = null; } if (index < 0 @@ -295,7 +306,17 @@ public class ListModel extends DefaultListModel6 { return; } - tooltip = newTooltip(index, me); + if (popup != null + && popup.isShowing()) { + return; + } + + synchronized (tooltipWatcher) { + if (tooltip != null) { + tooltip.setVisible(false); + } + tooltip = newTooltip(index, me); + } } }); } @@ -337,6 +358,12 @@ public class ListModel extends DefaultListModel6 { list.locationToIndex(e.getPoint())); } + Window oldTooltip = tooltip; + tooltip = null; + if (oldTooltip != null) { + oldTooltip.setVisible(false); + } + popup.show(list, e.getX(), e.getY()); } } @@ -561,16 +588,19 @@ public class ListModel extends DefaultListModel6 { newTooltip.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { - Window promotedTooltip = tooltipCreator .generateTooltip(value, false); - promotedTooltip.setLocation(newTooltip.getLocation()); + if (promotedTooltip != null) { + promotedTooltip.setLocation(me.getXOnScreen(), + me.getYOnScreen()); + promotedTooltip.setVisible(true); + } + newTooltip.setVisible(false); - promotedTooltip.setVisible(true); } }); - newTooltip.setLocation(me.getXOnScreen(), me.getYOnScreen()); + newTooltip.setLocation(me.getXOnScreen(), me.getYOnScreen()); newTooltip.setVisible(true); }