From: Mathieu Baudier Date: Wed, 13 Dec 2023 09:50:39 +0000 (+0100) Subject: Introduce UX scheduler X-Git-Tag: v2.3.24~1 X-Git-Url: https://git.argeo.org/?p=lgpl%2Fargeo-commons.git;a=commitdiff_plain;h=86cc16187d90def2e82829b55d4a1ec4a20edf25 Introduce UX scheduler --- diff --git a/org.argeo.api.cms/src/org/argeo/api/cms/ux/CmsUi.java b/org.argeo.api.cms/src/org/argeo/api/cms/ux/CmsUi.java index 2103e4989..ff6f5f081 100644 --- a/org.argeo.api.cms/src/org/argeo/api/cms/ux/CmsUi.java +++ b/org.argeo.api.cms/src/org/argeo/api/cms/ux/CmsUi.java @@ -5,6 +5,11 @@ public interface CmsUi { Object getData(String key); void setData(String key, Object value); - + CmsView getCmsView(); + + long getLastAccess(); + + void updateLastAccess(); + } diff --git a/org.argeo.api.cms/src/org/argeo/api/cms/ux/CmsView.java b/org.argeo.api.cms/src/org/argeo/api/cms/ux/CmsView.java index 121e4bdcb..b231bea99 100644 --- a/org.argeo.api.cms/src/org/argeo/api/cms/ux/CmsView.java +++ b/org.argeo.api.cms/src/org/argeo/api/cms/ux/CmsView.java @@ -3,6 +3,7 @@ package org.argeo.api.cms.ux; import java.net.URI; import java.util.HashMap; import java.util.Map; +import java.util.TimerTask; import java.util.concurrent.Callable; import java.util.concurrent.Executors; @@ -100,4 +101,10 @@ public interface CmsView { throw new UnsupportedOperationException(); } + /** Schedule a one-shot UX task to be executed within the UX context/thread. */ + TimerTask schedule(Runnable task, long delay); + + /** Schedule a recurring UX task to be executed within the UX context/thread. */ + TimerTask schedule(Runnable task, long delay, long period); + } diff --git a/org.argeo.cms.ux/src/org/argeo/cms/ux/CmsUxUtils.java b/org.argeo.cms.ux/src/org/argeo/cms/ux/CmsUxUtils.java index 84e471aaf..f9ced18df 100644 --- a/org.argeo.cms.ux/src/org/argeo/cms/ux/CmsUxUtils.java +++ b/org.argeo.cms.ux/src/org/argeo/cms/ux/CmsUxUtils.java @@ -7,6 +7,7 @@ import org.argeo.api.cms.ux.Cms2DSize; import org.argeo.api.cms.ux.CmsView; import org.argeo.cms.util.CurrentSubject; +/** Utilities around UX. */ public class CmsUxUtils { public static ContentSession getContentSession(ContentRepository contentRepository, CmsView cmsView) { return CurrentSubject.callAs(cmsView.getCmsSession().getSubject(), () -> contentRepository.get()); @@ -16,11 +17,6 @@ public class CmsUxUtils { return content.getName().getLocalPart(); } - /** singleton */ - private CmsUxUtils() { - - } - public static StringBuilder imgBuilder(String src, String width, String height) { return new StringBuilder(64).append(" { + todo.run(); + }); + } + } catch (Exception e) { + log.error("Cannot run UX timer task", e); + } + } + } + }; + } } diff --git a/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/CmsSwtUi.java b/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/CmsSwtUi.java index e0f63e45e..7aac07b15 100644 --- a/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/CmsSwtUi.java +++ b/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/CmsSwtUi.java @@ -1,5 +1,7 @@ package org.argeo.cms.swt; +import java.util.TimerTask; + import org.argeo.api.cms.ux.CmsUi; import org.argeo.api.cms.ux.CmsView; import org.eclipse.swt.layout.GridLayout; @@ -10,17 +12,42 @@ public class CmsSwtUi extends Composite implements CmsUi { private static final long serialVersionUID = -107939076610406448L; + /** Last time the UI was accessed. */ + private long lastAccess = System.currentTimeMillis(); + private TimerTask timeoutTask; + private CmsView cmsView; public CmsSwtUi(Composite parent, int style) { super(parent, style); cmsView = CmsSwtUtils.getCmsView(parent); - + // TODO make timeout configurable + setUiTimeout(12 * 60 * 60 * 1000);// 12 hours setLayout(new GridLayout()); } + @Override public CmsView getCmsView() { return cmsView; } + @Override + public long getLastAccess() { + return lastAccess; + } + + @Override + public void updateLastAccess() { + this.lastAccess = System.currentTimeMillis(); + } + + public void setUiTimeout(long uiTimeout) { + if (timeoutTask != null) + timeoutTask.cancel(); + timeoutTask = cmsView.schedule(() -> { + if (System.currentTimeMillis() - getLastAccess() >= uiTimeout) + dispose(); + }, 0, 1000); + } + } \ No newline at end of file