xterm
[VSoRC/.git] / node_modules / xterm / src / public / AddonManager.ts
1 /**
2  * Copyright (c) 2019 The xterm.js authors. All rights reserved.
3  * @license MIT
4  */
5
6 import { ITerminalAddon, IDisposable, Terminal } from 'xterm';
7
8 export interface ILoadedAddon {
9   instance: ITerminalAddon;
10   dispose: () => void;
11   isDisposed: boolean;
12 }
13
14 export class AddonManager implements IDisposable {
15   protected _addons: ILoadedAddon[] = [];
16
17   constructor() {
18   }
19
20   public dispose(): void {
21     for (let i = this._addons.length - 1; i >= 0; i--) {
22       this._addons[i].instance.dispose();
23     }
24   }
25
26   public loadAddon(terminal: Terminal, instance: ITerminalAddon): void {
27     const loadedAddon: ILoadedAddon = {
28       instance,
29       dispose: instance.dispose,
30       isDisposed: false
31     };
32     this._addons.push(loadedAddon);
33     instance.dispose = () => this._wrappedAddonDispose(loadedAddon);
34     instance.activate(<any>terminal);
35   }
36
37   private _wrappedAddonDispose(loadedAddon: ILoadedAddon): void {
38     if (loadedAddon.isDisposed) {
39       // Do nothing if already disposed
40       return;
41     }
42     let index = -1;
43     for (let i = 0; i < this._addons.length; i++) {
44       if (this._addons[i] === loadedAddon) {
45         index = i;
46         break;
47       }
48     }
49     if (index === -1) {
50       throw new Error('Could not dispose an addon that has not been loaded');
51     }
52     loadedAddon.isDisposed = true;
53     loadedAddon.dispose.apply(loadedAddon.instance);
54     this._addons.splice(index, 1);
55   }
56 }