Project

General

Profile

1
/*
2
License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
3
$Id: Listener.js 3835 2008-02-13 02:20:23Z ahocevar $
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
    if( !listener ) {
44
       alert(mbGetMessage("undefinedListener", target.id));
45
    }
46
  }
47

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

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

    
88
  /**
89
   * Call all the listeners that have registered interest in this parameter
90
   * using addListener.
91
   * @param param The parameter that has changed.
92
   * @param value The new parameter value.
93
   */
94
  this.callListeners=function(param,value) {
95
    if (this.listeners[param]){
96
      var count = this.listeners[param].length;
97
      for(var i=0;i<count;i++){
98
        if (window.logger) logger.logEvent(param,this.id,this.listeners[param][i][1].id,value);
99
        //this is listenerFunction(target,value)
100
        if (this.listeners[param][i][0]) {
101
          this.listeners[param][i][0](this.listeners[param][i][1],value);
102
        } else {
103
          alert(mbGetMessage("listenerError", param, this.listeners[param][i][1].id, this.listeners[param][i][0]));
104
        }
105
      }
106
    }
107
  }
108

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

    
119
    // Call all the interested listeners
120
    this.callListeners(param,value);
121
  }
122

    
123
  /**
124
   * Return the param value, or return null if it does not exist.  This
125
   * function may be overloaded to store the param elsewhere (eg in
126
   * an XML document).
127
   * @param param The parameter to get.
128
   * @return The value of the param.
129
   */
130
  this.getParam=function(param) {
131
    return this.values[param];
132
  }
133
}
(1-1/5)