const { Emitter } = require('event-kit'); // Extended: A container representing a panel on the edges of the editor window. // You should not create a `Panel` directly, instead use {Workspace::addTopPanel} // and friends to add panels. // // Examples: [status-bar](https://github.com/atom/status-bar) // and [find-and-replace](https://github.com/atom/find-and-replace) both use // panels. module.exports = class Panel { /* Section: Construction and Destruction */ constructor({ item, autoFocus, visible, priority, className }, viewRegistry) { this.destroyed = false; this.item = item; this.autoFocus = autoFocus == null ? false : autoFocus; this.visible = visible == null ? true : visible; this.priority = priority == null ? 100 : priority; this.className = className; this.viewRegistry = viewRegistry; this.emitter = new Emitter(); } // Public: Destroy and remove this panel from the UI. destroy() { if (this.destroyed) return; this.destroyed = true; this.hide(); if (this.element) this.element.remove(); this.emitter.emit('did-destroy', this); return this.emitter.dispose(); } getElement() { if (!this.element) { this.element = document.createElement('atom-panel'); if (!this.visible) this.element.style.display = 'none'; if (this.className) this.element.classList.add(...this.className.split(' ')); this.element.appendChild(this.viewRegistry.getView(this.item)); } return this.element; } /* Section: Event Subscription */ // Public: Invoke the given callback when the pane hidden or shown. // // * `callback` {Function} to be called when the pane is destroyed. // * `visible` {Boolean} true when the panel has been shown // // Returns a {Disposable} on which `.dispose()` can be called to unsubscribe. onDidChangeVisible(callback) { return this.emitter.on('did-change-visible', callback); } // Public: Invoke the given callback when the pane is destroyed. // // * `callback` {Function} to be called when the pane is destroyed. // * `panel` {Panel} this panel // // Returns a {Disposable} on which `.dispose()` can be called to unsubscribe. onDidDestroy(callback) { return this.emitter.once('did-destroy', callback); } /* Section: Panel Details */ // Public: Returns the panel's item. getItem() { return this.item; } // Public: Returns a {Number} indicating this panel's priority. getPriority() { return this.priority; } getClassName() { return this.className; } // Public: Returns a {Boolean} true when the panel is visible. isVisible() { return this.visible; } // Public: Hide this panel hide() { let wasVisible = this.visible; this.visible = false; if (this.element) this.element.style.display = 'none'; if (wasVisible) this.emitter.emit('did-change-visible', this.visible); } // Public: Show this panel show() { let wasVisible = this.visible; this.visible = true; if (this.element) this.element.style.display = null; if (!wasVisible) this.emitter.emit('did-change-visible', this.visible); } };