@@ -23,7 +23,7 @@ export abstract class Node {
2323 /** @internal */
2424 protected _visible : boolean ;
2525 /** @internal */
26- protected _listeners : Record < string , ( params : any ) => void > ;
26+ protected _listeners : Record < string , ( ( params : any ) => void ) [ ] > ;
2727 /** @internal */
2828 protected _dirty : boolean = false ;
2929 /** @internal */
@@ -83,14 +83,38 @@ export abstract class Node {
8383 return Orientation . flip ( this . _parent . getOrientation ( ) ) ;
8484 }
8585 }
86-
87- // event can be: resize, visibility, maximize (on tabset), close
88- setEventListener ( event : string , callback : ( params : any ) => void ) {
89- this . _listeners [ event ] = callback ;
86+
87+ /**
88+ * Adds the given event listener. Can optionally replace existing listeners.
89+ * @param event valid events: resize, visibility, maximize (on tabset), close
90+ * @param callback
91+ * @param replace if set to true, existing listeners will be cleared
92+ */
93+ setEventListener ( event : string , callback : ( params : any ) => void , replace :boolean = true ) {
94+ if ( replace || this . _listeners [ event ] === undefined ) {
95+ this . _listeners [ event ] = [ callback ] ;
96+ } else {
97+ this . _listeners [ event ] . push ( callback ) ;
98+ }
9099 }
91100
92- removeEventListener ( event : string ) {
93- delete this . _listeners [ event ] ;
101+ /**
102+ * If a callback is provided, it will be removed from the event.
103+ * If no callback is provided, all callbacks will be removed from the event.
104+ * @param event valid events: resize, visibility, maximize (on tabset), close
105+ * @param callback the specific callback to remove
106+ */
107+ removeEventListener ( event : string , callback ?: ( params : any ) => void ) {
108+ if ( this . _listeners [ event ] !== undefined ) {
109+ if ( callback ) {
110+ const index = this . _listeners [ event ] . indexOf ( callback ) ;
111+ if ( index !== - 1 ) {
112+ this . _listeners [ event ] . splice ( index , 1 ) ;
113+ }
114+ } else {
115+ this . _listeners [ event ] = [ ] ;
116+ }
117+ }
94118 }
95119
96120 abstract toJson ( ) : IJsonRowNode | IJsonBorderNode | IJsonTabSetNode | IJsonTabNode | undefined ;
@@ -104,7 +128,9 @@ export abstract class Node {
104128 _fireEvent ( event : string , params : any ) {
105129 // console.log(this._type, " fireEvent " + event + " " + JSON.stringify(params));
106130 if ( this . _listeners [ event ] !== undefined ) {
107- this . _listeners [ event ] ( params ) ;
131+ for ( const callback of this . _listeners [ event ] ) {
132+ callback ( params ) ;
133+ }
108134 }
109135 }
110136
0 commit comments