1 | package org.expeditee.core;
|
---|
2 |
|
---|
3 | import org.expeditee.gio.EcosystemManager;
|
---|
4 | import org.expeditee.gio.TimeoutQueue.TimeoutHandle;
|
---|
5 | import org.expeditee.gio.input.InputEvent;
|
---|
6 | import org.expeditee.gio.input.InputEvent.InputType;
|
---|
7 | import org.expeditee.gio.input.InputEventListener;
|
---|
8 | import org.expeditee.gio.input.TimeoutInputEvent;
|
---|
9 |
|
---|
10 | public class Lifetime
|
---|
11 | {
|
---|
12 | /** Value representing an infinitely-long popup lifetime. */
|
---|
13 | public static final long INFINITE_LIFETIME = -1;
|
---|
14 |
|
---|
15 | /** The length of this lifetime. */
|
---|
16 | private long _lifetime;
|
---|
17 | /** The time as returned by System.currentTimeMillis() when this lifetime will expire. */
|
---|
18 | private long _deathTime;
|
---|
19 |
|
---|
20 | private TimeoutHandle _expiryHandle = null;
|
---|
21 | private Runnable _expiryRoutine = null;
|
---|
22 | private InputEventListener _expiryListener = new InputEventListener()
|
---|
23 | {
|
---|
24 | @Override
|
---|
25 | public boolean onInputEvent(InputEvent event)
|
---|
26 | {
|
---|
27 | if (event.getInputType() == InputType.TIMEOUT) {
|
---|
28 | TimeoutInputEvent timeoutEvent = (TimeoutInputEvent) event;
|
---|
29 | if (timeoutEvent.getHandle() == _expiryHandle) {
|
---|
30 | _expiryRoutine.run();
|
---|
31 | cancelExpiry();
|
---|
32 | }
|
---|
33 | }
|
---|
34 | return false;
|
---|
35 | }
|
---|
36 | };
|
---|
37 |
|
---|
38 | public Lifetime(long lifetime)
|
---|
39 | {
|
---|
40 | if (lifetime < 0) lifetime = INFINITE_LIFETIME;
|
---|
41 | _lifetime = lifetime;
|
---|
42 | refresh();
|
---|
43 | }
|
---|
44 |
|
---|
45 | public void setLifetime(long lifetime)
|
---|
46 | {
|
---|
47 | if (lifetime < 0) lifetime = INFINITE_LIFETIME;
|
---|
48 |
|
---|
49 | if (_lifetime != INFINITE_LIFETIME) _deathTime -= _lifetime;
|
---|
50 |
|
---|
51 | _lifetime = lifetime;
|
---|
52 |
|
---|
53 | if (_lifetime != INFINITE_LIFETIME) _deathTime += _lifetime;
|
---|
54 | }
|
---|
55 |
|
---|
56 | public void refresh()
|
---|
57 | {
|
---|
58 | if (_lifetime == INFINITE_LIFETIME) {
|
---|
59 | _deathTime = System.currentTimeMillis();
|
---|
60 | } else {
|
---|
61 | _deathTime = System.currentTimeMillis() + _lifetime;
|
---|
62 | }
|
---|
63 | }
|
---|
64 |
|
---|
65 | public long remainingLifetime()
|
---|
66 | {
|
---|
67 | if (_lifetime == INFINITE_LIFETIME) return INFINITE_LIFETIME;
|
---|
68 |
|
---|
69 | long remaining = _deathTime - System.currentTimeMillis();
|
---|
70 |
|
---|
71 | if (remaining < 0) remaining = 0;
|
---|
72 |
|
---|
73 | return remaining;
|
---|
74 | }
|
---|
75 |
|
---|
76 | public boolean hasExpired()
|
---|
77 | {
|
---|
78 | return remainingLifetime() == 0;
|
---|
79 | }
|
---|
80 |
|
---|
81 | public void cancelExpiry()
|
---|
82 | {
|
---|
83 | if (_expiryHandle != null) {
|
---|
84 | EcosystemManager.getInputManager().cancelTimeout(_expiryHandle);
|
---|
85 | EcosystemManager.getInputManager().removeInputEventListener(_expiryListener);
|
---|
86 | _expiryHandle = null;
|
---|
87 | _expiryRoutine = null;
|
---|
88 | }
|
---|
89 | }
|
---|
90 |
|
---|
91 | public void onExpiry(Runnable routine)
|
---|
92 | {
|
---|
93 | if (_expiryHandle != null) {
|
---|
94 | cancelExpiry();
|
---|
95 | }
|
---|
96 |
|
---|
97 | if (routine == null || _lifetime == INFINITE_LIFETIME) return;
|
---|
98 |
|
---|
99 | _expiryRoutine = routine;
|
---|
100 |
|
---|
101 | EcosystemManager.getInputManager().registerInputEventListener(_expiryListener);
|
---|
102 |
|
---|
103 | _expiryHandle = EcosystemManager.getInputManager().addTimeout((int) remainingLifetime());
|
---|
104 | }
|
---|
105 |
|
---|
106 | }
|
---|