1 package org.argeo.connect.ui.widgets;
2
3 import java.util.Timer;
4 import java.util.TimerTask;
5
6 import org.eclipse.rap.rwt.service.ServerPushSession;
7 import org.eclipse.swt.events.ModifyEvent;
8 import org.eclipse.swt.events.ModifyListener;
9 import org.eclipse.swt.widgets.Composite;
10 import org.eclipse.swt.widgets.Event;
11 import org.eclipse.swt.widgets.Text;
12
13
14
15
16
17
18
19
20
21 public class DelayedText {
22 final int delay;
23 private Object lock = new Object();
24 private MyTimer timer = new MyTimer(DelayedText.this.toString());
25 private ModifyListener delayedModifyListener;
26 private ServerPushSession pushSession;
27
28 private Text text;
29
30 private ModifyListener modifyListener = new ModifyListener() {
31 private static final long serialVersionUID = 1117506414462641980L;
32
33 public void modifyText(ModifyEvent e) {
34 ModifyEvent delayedEvent = null;
35 synchronized (lock) {
36 if (delayedModifyListener != null) {
37 Event tmpEvent = new Event();
38 tmpEvent.widget = text;
39 tmpEvent.display = e.display;
40 tmpEvent.data = e.data;
41 tmpEvent.time = e.time;
42 delayedEvent = new ModifyEvent(tmpEvent);
43 }
44 }
45 final ModifyEvent timerModifyEvent = delayedEvent;
46
47 synchronized (timer) {
48 if (timer.timerTask != null) {
49 timer.timerTask.cancel();
50 timer.timerTask = null;
51 }
52
53 if (delayedEvent != null) {
54 timer.timerTask = new TimerTask() {
55 public void run() {
56 synchronized (lock) {
57 delayedModifyListener.modifyText(timerModifyEvent);
58
59
60
61
62
63
64
65
66
67
68 }
69 synchronized (timer) {
70 timer.timerTask = null;
71 }
72 }
73 };
74 timer.schedule(timer.timerTask, delay);
75 if (pushSession != null)
76 pushSession.start();
77 }
78 }
79 };
80 };
81
82 public DelayedText(Composite parent, int style, int delayInMs) {
83
84 text = new Text(parent, style);
85 this.delay = delayInMs;
86 text.addModifyListener(modifyListener);
87 }
88
89
90
91
92
93
94 public void addDelayedModifyListener(ServerPushSession pushSession, ModifyListener listener) {
95 synchronized (lock) {
96 delayedModifyListener = listener;
97 this.pushSession = pushSession;
98 }
99 }
100
101 public void removeDelayedModifyListener(ModifyListener listener) {
102 synchronized (lock) {
103 delayedModifyListener = null;
104 pushSession = null;
105 }
106 }
107
108 private class MyTimer extends Timer {
109 private TimerTask timerTask = null;
110
111 public MyTimer(String name) {
112 super(name);
113 }
114 }
115
116 public Text getText() {
117 return text;
118 };
119
120 }