1 package org.simantics.modeling.ui.diagramEditor;
3 import gnu.trove.map.hash.TObjectLongHashMap;
5 import java.util.ArrayDeque;
7 import org.eclipse.swt.widgets.Display;
10 public class DisposingPolicy {
12 public static final boolean DEBUG = false;
14 public static final int MAX_QUEUE_LENGTH = 8;
15 public static final long DISPOSE_TIME = 30000L; // ms
16 public static final long MIN_DELAY = 200L; // ms
18 private final int maxQueueLength;
19 private ArrayDeque<Runnable> disposerQueue = new ArrayDeque<Runnable>(MAX_QUEUE_LENGTH);
20 private TObjectLongHashMap<Runnable> disposeTime =
21 new TObjectLongHashMap<Runnable>(MAX_QUEUE_LENGTH);
22 private Runnable currentlyScheduled = null;
24 private Runnable disposeOne = () -> {
25 if(!disposerQueue.isEmpty()) {
26 Runnable runnable = disposerQueue.removeFirst();
27 disposeTime.remove(runnable);
28 currentlyScheduled = null;
31 System.out.println("Executed disposer " + runnable);
32 if(!disposerQueue.isEmpty())
37 public DisposingPolicy() {
38 this(MAX_QUEUE_LENGTH);
41 public DisposingPolicy(int maxQueueLength) {
42 this.maxQueueLength = maxQueueLength;
45 private void scheduleDispose() {
46 currentlyScheduled = disposerQueue.peekFirst();
47 long delay = Math.max(
48 disposeTime.get(currentlyScheduled) - System.currentTimeMillis(),
50 Display.getCurrent().timerExec((int)delay, disposeOne);
52 System.out.println("Scheduled disposer " + currentlyScheduled + " in " + delay + " ms");
56 * Runs the disposer either after DISPOSE_TIME or when there are
57 * more than {@link #maxQueueLength} disposers active and this is first
58 * of them (by activation order). This method must be called from
61 public void addDisposer(Runnable disposer) {
63 System.out.println("Added disposer " + disposer);
64 if(disposeTime.contains(disposer))
66 if(disposerQueue.size() >= maxQueueLength)
68 disposerQueue.addLast(disposer);
69 disposeTime.put(disposer, System.currentTimeMillis()+DISPOSE_TIME);
70 if(disposerQueue.size() == 1)
75 * Cancels a disposer added before. This method must be called from
78 public void removeDisposer(Runnable disposer) {
80 System.out.println("Removed disposer " + disposer);
81 disposerQueue.remove(disposer);
82 disposeTime.remove(disposer);
83 if(disposer == currentlyScheduled) {
84 currentlyScheduled = null;
85 if(!disposerQueue.isEmpty())