Project

General

Profile

1
/*
2
License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
3
$Id$
4
*/
5

    
6
/**
7
 * Base Listener class that is instanciated by all objects which provide
8
 * event listeners.
9
 * @constructor
10
 * @author Cameron Shorter
11
 */
12
function Listener() {
13
  /** An array [params] of (listener, target). */
14
  this.listeners=new Array();
15

    
16
  /**
17
   * An array [params] of values. These values might not be used if the set/get
18
   * functions are overwritten.
19
   */
20
  this.values=new Array();
21

    
22
  /**
23
   * Add a listener function which will be called when param is updated;  The
24
   * listener function should usually be: paint(target).
25
   * @param listener The function to call when the parameter changes.
26
   * @param target The object which owns the listener function.
27
   * @param param Parameter name; if this parameter changes then an event is
28
   * sent to all interested listeners.
29
   */
30
  this.addListener=function(param, listener, target) {
31
    if (window.logger) logger.logEvent("addListener: "+param,this.id,target.id);
32
    if(!this.listeners[param]){
33
      this.listeners[param]=new Array();
34
    }
35
    this.removeListener(param,listener,target);
36
    //for(var i=0;i<this.listeners[param].length;i++){
37
    //  if(this.listeners[param][i][0]==listener && this.listeners[param][i][1]==target){
38
    //    return;
39
    //    alert("Listener.addListener again: target="+target.id);
40
    //  }
41
    //}
42
    this.listeners[param].push(new Array(listener,target));
43
  }
44

    
45
  /**
46
   * Add a listener function at the start of the list.  
47
   * @param listener The function to call when the parameter changes.
48
   * @param target The object which owns the listener function.
49
   * @param param Parameter name; if this parameter changes then an event is
50
   * sent to all interested listeners.
51
   */
52
  this.addFirstListener=function(param, listener, target) {
53
    if (window.logger) logger.logEvent("addFirstListener: "+param,this.id,target.id);
54
    if(!this.listeners[param]){
55
      this.listeners[param]=new Array();
56
    }
57
    this.removeListener(param,listener,target);
58
    this.listeners[param].unshift(new Array(listener,target));
59
  }
60

    
61
  /**
62
   * Remove a listener so that it is not called anymore when a param changes.
63
   * @param listener The function to call when the parameter changes.
64
   * @param target The object which owns the listener function.
65
   * @param param Parameter name; if this parameter changes then an event is
66
   * sent to all interested listeners.
67
   */
68
  this.removeListener=function(param,listener,target){
69
    if(this.listeners[param]){
70
      for(var i=0;i<this.listeners[param].length;i++){
71
        if(this.listeners[param][i][0]==listener && this.listeners[param][i][1]==target){
72
          for(var j=i;j<this.listeners[param].length-1;j++){
73
            this.listeners[param][j]=this.listeners[param][j+1];
74
          }
75
          this.listeners[param].pop();
76
          return;
77
        }
78
      }
79
    }
80
  }
81

    
82
  /**
83
   * Call all the listeners that have registered interest in this parameter
84
   * using addListener.
85
   * @param param The parameter that has changed.
86
   * @param value The new parameter value.
87
   */
88
  this.callListeners=function(param,value) {
89
    if (this.listeners[param]){
90
      var count = this.listeners[param].length;
91
      for(var i=0;i<count;i++){
92
        if (window.logger) logger.logEvent(param,this.id,this.listeners[param][i][1].id,value);
93
        //this is listenerFunction(target,value)
94
        if (this.listeners[param][i][0]) {
95
          this.listeners[param][i][0](this.listeners[param][i][1],value);
96
        } else {
97
          alert("Listener error: param="+param+", target="+this.listeners[param][i][1].id+", callBackFunction="+this.listeners[param][i][0]);
98
        }
99
      }
100
    }
101
  }
102

    
103
  /**
104
   * Update parameter and call all interested listeners.  This function may
105
   * be overloaded to store the parameter in a elsewhere (eg in an XML
106
   * document).
107
   * @param param The parameter to change.
108
   * @parma value The new value of the param.
109
   */
110
  this.setParam=function(param,value) {
111
    this.values[param] = value;
112

    
113
    // Call all the interested listeners
114
    this.callListeners(param,value);
115
  }
116

    
117
  /**
118
   * Return the param value, or return null if it does not exist.  This
119
   * function may be overloaded to store the param elsewhere (eg in
120
   * an XML document).
121
   * @param param The parameter to get.
122
   * @return The value of the param.
123
   */
124
  this.getParam=function(param) {
125
    return this.values[param];
126
  }
127
}
(1-1/3)