aboutsummaryrefslogtreecommitdiffstats
path: root/gl4java/drawable/utils/GLEventListenerList.java
blob: e63b6e730b7c5aa3f2d6d71e17ebb773ed83bc6f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
package gl4java.drawable.utils;

import gl4java.drawable.GLDrawable;
import gl4java.drawable.GLEventListener;
import java.util.EventListener;

/** Helper class for implementing a list of GLEventListeners. This is
    only needed because we can not use the JDK 1.2 collection classes
    since we have to be backward compatible with JDK 1.1. */

public class GLEventListenerList {
    private GLEventListener[] data = new GLEventListener[2];
    private int nextFreeIdx = 0;

    public GLEventListenerList() {
    }

    public void add(GLEventListener listener) {
        if (nextFreeIdx == data.length) {
            grow();
        }
        data[nextFreeIdx++] = listener;
    }

    public void remove(GLEventListener listener) {
        for (int i = 0; i < nextFreeIdx; i++) {
            if (data[i] == listener) {
                for (int j = i; j < nextFreeIdx - 1; j++) {
                    data[j] = data[j+1];
                }
                data[nextFreeIdx - 1] = null;
                --nextFreeIdx;
                return;
            }
        }
    }

    public void sendInitEvent(GLDrawable from) {
        for (int i = 0; i < nextFreeIdx; i++) {
            data[i].init(from);
        }
    }

    public void sendPreDisplayEvent(GLDrawable from) {
        for (int i = 0; i < nextFreeIdx; i++) {
            data[i].preDisplay(from);
        }
    }

    public void sendDisplayEvent(GLDrawable from) {
        for (int i = 0; i < nextFreeIdx; i++) {
            data[i].display(from);
        }
    }

    public void sendPostDisplayEvent(GLDrawable from) {
        for (int i = 0; i < nextFreeIdx; i++) {
            data[i].postDisplay(from);
        }
    }

    public void sendCleanupEvent(GLDrawable from) {
        for (int i = 0; i < nextFreeIdx; i++) {
            data[i].cleanup(from);
        }
    }

    public void sendReshapeEvent(GLDrawable from, int width, int height) {
        for (int i = 0; i < nextFreeIdx; i++) {
            data[i].reshape(from, width, height);
        }
    }

    public EventListener[] getListeners()
    {
        GLEventListener[] _new = new GLEventListener[nextFreeIdx];
        System.arraycopy(data, 0, _new, 0, nextFreeIdx);
	return _new;
    }

    public int size()
    { return nextFreeIdx; }

    private void grow() {
        GLEventListener[] newData = new GLEventListener[2 * data.length];
        System.arraycopy(data, 0, newData, 0, data.length);
        data = newData;
    }
}