|
|
import dom = require("dojo/dom-construct");
|
|
|
import { argumentNotNull } from "@implab/core-amd/safe";
|
|
|
import { BuildContextBase } from "./BuildContextBase";
|
|
|
import { MapOf } from "@implab/core-amd/interfaces";
|
|
|
|
|
|
// tslint:disable-next-line: class-name
|
|
|
export interface _Widget {
|
|
|
domNode: Node;
|
|
|
|
|
|
get(attr: string): any;
|
|
|
|
|
|
set(attr: string, value: any): void;
|
|
|
set(attrs: MapOf<any>): void;
|
|
|
|
|
|
containerNode?: Node
|
|
|
}
|
|
|
|
|
|
export type _WidgetCtor = new (attrs: any, srcNode?: string | Node) => _Widget;
|
|
|
|
|
|
export class WidgetContext extends BuildContextBase<Node> {
|
|
|
widgetClass: _WidgetCtor;
|
|
|
|
|
|
_instance: _Widget | undefined;
|
|
|
|
|
|
constructor(widgetClass: _WidgetCtor) {
|
|
|
super();
|
|
|
argumentNotNull(widgetClass, "widgetClass");
|
|
|
|
|
|
this.widgetClass = widgetClass;
|
|
|
}
|
|
|
|
|
|
_addChild(child: any): void {
|
|
|
if (!this._instance || !this._instance.containerNode)
|
|
|
throw new Error("Widget doesn't support adding children");
|
|
|
|
|
|
dom.place(this.getChildDom(child), this._instance.containerNode);
|
|
|
}
|
|
|
|
|
|
_create(attrs: object, children: any[]) {
|
|
|
this._instance = new this.widgetClass(attrs);
|
|
|
if (children)
|
|
|
children.forEach(x => this._addChild(x));
|
|
|
}
|
|
|
|
|
|
_getDomNode() {
|
|
|
if (!this._instance)
|
|
|
throw new Error("The instance of the widget isn't created");
|
|
|
return this._instance.domNode;
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|