X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.modeling.ui%2Fsrc%2Forg%2Fsimantics%2Fmodeling%2Fui%2FdiagramEditor%2FDisposingPolicy.java;h=db7e2571dde5b8e8bd0cc28e5b55e2be11a8d04a;hb=43355222d559c87975f7f39dce18d36f35ea9b94;hp=a3cd08b068745f43bc0599fb04968b738b4ef9dc;hpb=0ae2b770234dfc3cbb18bd38f324125cf0faca07;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/diagramEditor/DisposingPolicy.java b/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/diagramEditor/DisposingPolicy.java index a3cd08b06..db7e2571d 100644 --- a/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/diagramEditor/DisposingPolicy.java +++ b/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/diagramEditor/DisposingPolicy.java @@ -8,34 +8,45 @@ import org.eclipse.swt.widgets.Display; public class DisposingPolicy { - + public static final boolean DEBUG = false; - + public static final int MAX_QUEUE_LENGTH = 8; public static final long DISPOSE_TIME = 30000L; // ms public static final long MIN_DELAY = 200L; // ms - - private ArrayDeque disposerQueue = new ArrayDeque(MAX_QUEUE_LENGTH); - private TObjectLongHashMap disposeTime = - new TObjectLongHashMap(MAX_QUEUE_LENGTH); + + private volatile int maxQueueLength; + private ArrayDeque disposerQueue; + private TObjectLongHashMap disposeTime; private Runnable currentlyScheduled = null; - - private Runnable disposeOne = new Runnable() { - @Override - public void run() { - if(!disposerQueue.isEmpty()) { - Runnable runnable = disposerQueue.removeFirst(); - disposeTime.remove(runnable); - currentlyScheduled = null; - runnable.run(); - if(DEBUG) - System.out.println("Executed disposer " + runnable); - if(!disposerQueue.isEmpty()) - scheduleDispose(); - } + + private Runnable disposeOne = () -> { + if(!disposerQueue.isEmpty()) { + Runnable runnable = disposerQueue.removeFirst(); + disposeTime.remove(runnable); + currentlyScheduled = null; + runnable.run(); + if(DEBUG) + System.out.println("Executed disposer " + runnable); //$NON-NLS-1$ + if(!disposerQueue.isEmpty()) + scheduleDispose(); } }; - + + public DisposingPolicy() { + this(MAX_QUEUE_LENGTH); + } + + public DisposingPolicy(int maxQueueLength) { + this.maxQueueLength = maxQueueLength; + this.disposerQueue = new ArrayDeque<>(maxQueueLength); + this.disposeTime = new TObjectLongHashMap<>(maxQueueLength); + } + + public void setMaxQueueLength(int maxQueueLength) { + this.maxQueueLength = maxQueueLength; + } + private void scheduleDispose() { currentlyScheduled = disposerQueue.peekFirst(); long delay = Math.max( @@ -43,35 +54,35 @@ public class DisposingPolicy { MIN_DELAY); Display.getCurrent().timerExec((int)delay, disposeOne); if(DEBUG) - System.out.println("Scheduled disposer " + currentlyScheduled + " in " + delay + " ms"); + System.out.println("Scheduled disposer " + currentlyScheduled + " in " + delay + " ms"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ } - + /** * Runs the disposer either after DISPOSE_TIME or when there are - * more than MAX_QUEUE_LENGTH disposers active and this is first + * more than {@link #maxQueueLength} disposers active and this is first * of them (by activation order). This method must be called from * UI thread. */ public void addDisposer(Runnable disposer) { if(DEBUG) - System.out.println("Added disposer " + disposer); + System.out.println("Added disposer " + disposer); //$NON-NLS-1$ if(disposeTime.contains(disposer)) return; - if(disposerQueue.size() >= MAX_QUEUE_LENGTH) + if(disposerQueue.size() >= maxQueueLength) disposeOne.run(); disposerQueue.addLast(disposer); disposeTime.put(disposer, System.currentTimeMillis()+DISPOSE_TIME); if(disposerQueue.size() == 1) scheduleDispose(); } - + /** * Cancels a disposer added before. This method must be called from * UI thread. */ public void removeDisposer(Runnable disposer) { if(DEBUG) - System.out.println("Removed disposer " + disposer); + System.out.println("Removed disposer " + disposer); //$NON-NLS-1$ disposerQueue.remove(disposer); disposeTime.remove(disposer); if(disposer == currentlyScheduled) { @@ -80,5 +91,5 @@ public class DisposingPolicy { scheduleDispose(); } } - + }