001: /*******************************************************************************
002: * Copyright (c) 2000, 2007 IBM Corporation and others.
003: * All rights reserved. This program and the accompanying materials
004: * are made available under the terms of the Eclipse Public License v1.0
005: * which accompanies this distribution, and is available at
006: * http://www.eclipse.org/legal/epl-v10.html
007: *
008: * Contributors:
009: * IBM Corporation - initial API and implementation
010: *******************************************************************************/package org.eclipse.swt.widgets;
011:
012: import org.eclipse.swt.*;
013: import org.eclipse.swt.internal.SWTEventListener;
014:
015: /**
016: * Instances of this class implement a simple
017: * look up mechanism that maps an event type
018: * to a listener. Multiple listeners for the
019: * same event type are supported.
020: */
021:
022: class EventTable {
023: int[] types;
024: Listener[] listeners;
025: int level;
026:
027: public void hook(int eventType, Listener listener) {
028: if (types == null)
029: types = new int[4];
030: if (listeners == null)
031: listeners = new Listener[4];
032: int length = types.length, index = length - 1;
033: while (index >= 0) {
034: if (types[index] != 0)
035: break;
036: --index;
037: }
038: index++;
039: if (index == length) {
040: int[] newTypes = new int[length + 4];
041: System.arraycopy(types, 0, newTypes, 0, length);
042: types = newTypes;
043: Listener[] newListeners = new Listener[length + 4];
044: System.arraycopy(listeners, 0, newListeners, 0, length);
045: listeners = newListeners;
046: }
047: types[index] = eventType;
048: listeners[index] = listener;
049: }
050:
051: public boolean hooks(int eventType) {
052: if (types == null)
053: return false;
054: for (int i = 0; i < types.length; i++) {
055: if (types[i] == eventType)
056: return true;
057: }
058: return false;
059: }
060:
061: public void sendEvent(Event event) {
062: if (types == null)
063: return;
064: level += level >= 0 ? 1 : -1;
065: try {
066: for (int i = 0; i < types.length; i++) {
067: if (event.type == SWT.None)
068: return;
069: if (types[i] == event.type) {
070: Listener listener = listeners[i];
071: if (listener != null)
072: listener.handleEvent(event);
073: }
074: }
075: } finally {
076: boolean compact = level < 0;
077: level -= level >= 0 ? 1 : -1;
078: if (compact && level == 0) {
079: int index = 0;
080: for (int i = 0; i < types.length; i++) {
081: if (types[i] != 0) {
082: types[index] = types[i];
083: listeners[index] = listeners[i];
084: index++;
085: }
086: }
087: for (int i = index; i < types.length; i++) {
088: types[i] = 0;
089: listeners[i] = null;
090: }
091: }
092: }
093: }
094:
095: public int size() {
096: if (types == null)
097: return 0;
098: int count = 0;
099: for (int i = 0; i < types.length; i++) {
100: if (types[i] != 0)
101: count++;
102: }
103: return count;
104: }
105:
106: void remove(int index) {
107: if (level == 0) {
108: int end = types.length - 1;
109: System.arraycopy(types, index + 1, types, index, end
110: - index);
111: System.arraycopy(listeners, index + 1, listeners, index,
112: end - index);
113: index = end;
114: } else {
115: if (level > 0)
116: level = -level;
117: }
118: types[index] = 0;
119: listeners[index] = null;
120: }
121:
122: public void unhook(int eventType, Listener listener) {
123: if (types == null)
124: return;
125: for (int i = 0; i < types.length; i++) {
126: if (types[i] == eventType && listeners[i] == listener) {
127: remove(i);
128: return;
129: }
130: }
131: }
132:
133: public void unhook(int eventType, SWTEventListener listener) {
134: if (types == null)
135: return;
136: for (int i = 0; i < types.length; i++) {
137: if (types[i] == eventType) {
138: if (listeners[i] instanceof TypedListener) {
139: TypedListener typedListener = (TypedListener) listeners[i];
140: if (typedListener.getEventListener() == listener) {
141: remove(i);
142: return;
143: }
144: }
145: }
146: }
147: }
148:
149: }
|