import { HTMLWidget, SVGWidget, Widget } from "@hpcc-js/common"; import { IMessageHandler, Message, TabPanel as PTabPanel, Widget as PWidget } from "@hpcc-js/phosphor-shim"; import { Msg, WidgetAdapter, WidgetAdapterArray } from "./WidgetAdapter"; import "../src/DockPanel.css"; export class TabPanel extends HTMLWidget { private _tab = new PTabPanel({ tabPlacement: "top" }); protected content = WidgetAdapterArray.create(); constructor() { super(); this._tag = "div"; this._tab.id = "p" + this.id(); } protected getWidget(wa: PWidget): Widget | undefined { if (wa instanceof WidgetAdapter) { return wa.widget; } } protected getWidgetAdapter(widget: Widget): WidgetAdapter | null { let retVal = null; this.content.some(wa => { if (wa.widget === widget) { retVal = wa; return true; } return false; }); return retVal; } addWidget(widget: SVGWidget | HTMLWidget, title: string) { if (!this._prevActive) { this._prevActive = widget; } const wa = new WidgetAdapter(this, widget); wa.title.label = title; wa.padding = 8; this._tab.addWidget(wa); this.content.push(wa); return this; } removeWidget(widget: SVGWidget | HTMLWidget) { const wa = this.getWidgetAdapter(widget); if (wa) { const found = this.content.indexOf(wa); if (found >= 0) { this.content.splice(found, 1); } widget.target(null); wa.dispose(); } return this; } enter(domNode, element) { super.enter(domNode, element); PWidget.attach(this._tab, domNode); } update(domNode, element) { super.update(domNode, element); element.select(".p-Widget") .style("width", this.width() + "px") .style("height", this.height() + "px") ; } exit(domNode, element) { super.exit(domNode, element); } render(callback?: (w: Widget) => void): this { return super.render(w => { this.content.watchRendered(this, callback); this._tab.update(); }); } // Phosphor Messaging --- messageHook(handler: IMessageHandler, msg: Message): boolean { if (handler === this) { this.processMessage(msg); } return true; } private _prevActive: Widget; processMessage(msg: Message): void { switch (msg.type) { case "wa-activate-request": const widget = (msg as Msg.WAActivateRequest).wa.widget; if (this._prevActive !== widget) { this._prevActive = widget; this.childActivation(widget); } break; } } childActivation(w: Widget) { } active(): Widget; active(_: Widget); active(_?: Widget): Widget | this { if (!arguments.length) return this.getWidget(this._tab.currentWidget); this._tab.currentWidget = this.getWidgetAdapter(_); return this; } } TabPanel.prototype._class += " phosphor_TabPanel";