1	package antlr.debug;
2	
3	import java.util.Vector;
4	import antlr.collections.impl.BitSet;
5	import antlr.ParserException;
6	
7	public class InputBufferEventSupport {
8		private Object source;
9		private Vector inputBufferListeners;
10		private InputBufferEvent  inputBufferEvent;
11		protected static final int CONSUME=0;
12		protected static final int LA=1;
13		protected static final int MARK=2;
14		protected static final int REWIND=3;
15	
16	
17		public InputBufferEventSupport(Object source) {
18			inputBufferEvent = new InputBufferEvent(source);
19			this.source = source;
20		}
21		public void addInputBufferListener(InputBufferListener l) {
22			if (inputBufferListeners == null) inputBufferListeners = new Vector();
23			inputBufferListeners.addElement(l);
24		}
25		public void fireConsume(char c) {
26			inputBufferEvent.setValues(InputBufferEvent.CONSUME, c, 0);
27			fireEvents(CONSUME, inputBufferListeners);		
28		}
29		public void fireEvent(int type, ListenerBase l) {
30			switch(type) {
31				case CONSUME: ((InputBufferListener)l).inputBufferConsume(inputBufferEvent); break;
32				case LA:      ((InputBufferListener)l).inputBufferLA(inputBufferEvent); break;
33				case MARK:    ((InputBufferListener)l).inputBufferMark(inputBufferEvent); break;
34				case REWIND:  ((InputBufferListener)l).inputBufferRewind(inputBufferEvent); break;
35				default:
36					throw new IllegalArgumentException("bad type "+type+" for fireEvent()");
37			}	
38		}
39		public void fireEvents(int type, Vector listeners) {
40			Vector targets=null;
41			ListenerBase l=null;
42			
43			synchronized (this) {
44				if (listeners == null) return;
45				targets = (Vector)listeners.clone();
46			}
47			
48			if (targets != null)
49				for (int i = 0; i < targets.size(); i++) {
50					l = (ListenerBase)targets.elementAt(i);
51					fireEvent(type, l);
52				}
53		}
54		public void fireLA(char c, int la) {
55			inputBufferEvent.setValues(InputBufferEvent.LA, c, la);
56			fireEvents(LA, inputBufferListeners);
57		}
58		public void fireMark(int pos) {
59			inputBufferEvent.setValues(InputBufferEvent.MARK, ' ', pos);
60			fireEvents(MARK, inputBufferListeners);
61		}
62		public void fireRewind(int pos) {
63			inputBufferEvent.setValues(InputBufferEvent.REWIND, ' ', pos);
64			fireEvents(REWIND, inputBufferListeners);
65		}
66		public Vector getInputBufferListeners() {
67			return inputBufferListeners;
68		}
69		protected void refresh(Vector listeners) {
70			Vector v;
71			synchronized (listeners) {
72				v = (Vector)listeners.clone();
73			}
74			if (v != null)
75				for (int i = 0; i < v.size(); i++)
76					((ListenerBase)v.elementAt(i)).refresh();
77		}
78		public void refreshListeners() {
79			refresh(inputBufferListeners);
80		}
81		public void removeInputBufferListener(InputBufferListener l) {
82			if (inputBufferListeners != null)
83				inputBufferListeners.removeElement(l);
84		}
85	}
86