Docjar: A Java Source and Docuemnt Enginecom.*    java.*    javax.*    org.*    all    new    plug-in

Quick Search    Search Deep

Source code: org/eclipse/swt/widgets/EventTable.java


1   /*******************************************************************************
2    * Copyright (c) 2000, 2003 IBM Corporation and others.
3    * All rights reserved. This program and the accompanying materials 
4    * are made available under the terms of the Common Public License v1.0
5    * which accompanies this distribution, and is available at
6    * http://www.eclipse.org/legal/cpl-v10.html
7    * 
8    * Contributors:
9    *     IBM Corporation - initial API and implementation
10   *******************************************************************************/
11  package org.eclipse.swt.widgets;
12  
13  
14  import org.eclipse.swt.*;
15  import org.eclipse.swt.internal.SWTEventListener;
16  
17  /**
18   * Instances of this class implement a simple
19   * look up mechanism that maps an event type
20   * to a listener.  Muliple listeners for the
21   * same event type are supported.
22   */
23  
24  class EventTable {
25    int [] types;
26    Listener [] listeners;
27    int level;
28    
29  public void hook (int eventType, Listener listener) {
30    if (types == null) types = new int [4];
31    if (listeners == null) listeners = new Listener [4];
32    int length = types.length, index = length - 1;
33    while (index >= 0) {
34      if (types [index] != 0) break;
35      --index;
36    }
37    index++;
38    if (index == length) {
39      if (level == 0) {
40        index = 0;
41        for (int i=0; i<types.length; i++) {
42          if (types [i] != 0) {
43            types [index] = types [i];
44            listeners [index] = listeners [i];
45            index++;
46          }
47        }
48        for (int i=index; i<types.length; i++) {
49          types [i] = 0;
50          listeners [i] = null;
51        }
52      }
53      if (index == length) {
54        int [] newTypes = new int [length + 4];
55        System.arraycopy (types, 0, newTypes, 0, length);
56        types = newTypes;
57        Listener [] newListeners = new Listener [length + 4];
58        System.arraycopy (listeners, 0, newListeners, 0, length);
59        listeners = newListeners;
60      }
61    }
62    types [index] = eventType;
63    listeners [index] = listener;
64  }
65  
66  public boolean hooks (int eventType) {
67    if (types == null) return false;
68    for (int i=0; i<types.length; i++) {
69      if (types [i] == eventType) return true;
70    }
71    return false;
72  }
73  
74  public void sendEvent (Event event) {
75    if (types == null) return;
76    level++;
77    try {
78      for (int i=0; i<types.length; i++) {
79        if (event.type == SWT.None) return;
80        if (types [i] == event.type) {
81          Listener listener = listeners [i];
82          if (listener != null) listener.handleEvent (event);
83        }
84      }
85    } finally {
86      --level;
87    }
88  }
89  
90  public int size () {
91    if (types == null) return 0;
92    int count = 0;
93    for (int i=0; i<types.length; i++) {
94      if (types [i] != 0) count++;
95    }
96    return count;
97  }
98  
99  void remove (int index) {
100   if (level == 0) {
101     int end = types.length - 1;
102     System.arraycopy (types, index + 1, types, index, end - index);
103     System.arraycopy (listeners, index + 1, listeners, index, end - index);
104     index = end;
105   }
106   types [index] = 0;
107   listeners [index] = null;
108 }
109 
110 public void unhook (int eventType, Listener listener) {
111   if (types == null) return;
112   for (int i=0; i<types.length; i++) {
113     if (types [i] == eventType && listeners [i] == listener) {
114       remove (i);
115       return;
116     }
117   }
118 }
119 
120 public void unhook (int eventType, SWTEventListener listener) {
121   if (types == null) return;
122   for (int i=0; i<types.length; i++) {
123     if (types [i] == eventType) {
124       if (listeners [i] instanceof TypedListener) {
125         TypedListener typedListener = (TypedListener) listeners [i];
126         if (typedListener.getEventListener () == listener) {
127           remove (i);
128           return;
129         }
130       }
131     }
132   }
133 }
134 
135 }