class PropertyPanel implements IEntry.PropertyPanel { public modes: any = {}; public selected: string = undefined; private _view: EntryDom; private _tabView: EntryDom; private _contentView: EntryDom; private _cover: EntryDom & { _isVisible?: boolean }; generateView(parentDom: HTMLElement) { const container = $(parentDom); this._view = Entry.Dom('div', { class: 'propertyPanel', parent: container, }); this._tabView = Entry.Dom('div', { class: 'propertyTab', parent: this._view, }); this._contentView = Entry.Dom('div', { class: 'propertyContent', parent: this._view, }); this._cover = Entry.Dom('div', { classes: ['propertyPanelCover', 'entryRemove'], parent: this._view, }); const splitter = Entry.Dom('div', { class: 'entryObjectSelectedImgWorkspace', parent: container, }); this._initializeSplitter(splitter); } addMode(mode: string, contentObj: any) { if (this.modes[mode]) { this.removeMode(mode); } let contentDom = contentObj.getView(); // will be removed after apply new Dom class contentDom = Entry.Dom(contentDom, { parent: this._contentView, }); const tabDom = Entry.Dom(`
${Lang.Menus[mode]}
`, { classes: ['propertyTabElement', `propertyTab${mode}`], parent: this._tabView, }); tabDom.bind('click', () => { this.select(mode); }); if (mode === 'console') { contentObj.codeMirror.refresh(); } this._removeDom(mode); this.modes[mode] = { obj: contentObj, tabDom, contentDom, }; if (mode === 'hw') { $('.propertyTabhw').bind('dblclick', () => { Entry.dispatchEvent('hwModeChange'); }); } } removeMode(mode: string) { this._removeDom(mode); const keys = Object.keys(this.modes); if (keys && keys.length > 0) { this.select(keys[0]); } } resize(canvasSize: number) { const selected = this.selected; if (!selected) { return; } const canvasHeight = (canvasSize * 9) / 16; this._view.css({ width: `${canvasSize}px`, top: `${canvasHeight + 35 + 40 + 48 - 22}px`, }); if (canvasSize >= 430) { this._view.removeClass('collapsed'); } else { this._view.addClass('collapsed'); } Entry.dispatchEvent('windowResized'); const obj = this.modes[selected].obj; if (selected === 'hw') { if (this.modes.hw.obj.listPorts) { obj.resizeList(); } else { obj.resize && obj.resize(); } } else { obj.resize && obj.resize(); } } select(modeName: string) { for (const key in this.modes) { const mode = this.modes[key]; mode.tabDom.removeClass('selected'); mode.contentDom.addClass('entryRemove'); $(mode.contentDom).detach(); mode.obj.visible = false; } const selected = this.modes[modeName]; $(this._contentView).append(selected.contentDom); selected.tabDom.addClass('selected'); selected.contentDom.removeClass('entryRemove'); if (selected.obj.resize) { selected.obj.resize(); } selected.obj.visible = true; this.selected = modeName; } private _initializeSplitter(splitter: EntryDom) { splitter.bind('mousedown touchstart', (e) => { e.preventDefault(); if (Entry.disposeEvent) { Entry.disposeEvent.notify(); } const container = Entry.container; this._cover.removeClass('entryRemove'); this._cover._isVisible = true; container.splitterEnable = true; if (Entry.documentMousemove) { container.resizeEvent = Entry.documentMousemove.attach(this, (e: any) => { if (container.splitterEnable) { Entry.resizeElement({ canvasWidth: e.clientX || e.x, }); } }); } $(document).bind('mouseup.container:splitter touchend.container:splitter', () => { const container = Entry.container; const listener = container.resizeEvent; if (listener) { container.splitterEnable = false; listener.destroy(); delete container.resizeEvent; } if (this._cover._isVisible) { this._cover._isVisible = false; this._cover.addClass('entryRemove'); } $(document).unbind('.container:splitter'); }); }); } private _removeDom(mode: string) { if (this.modes[mode]) { this.modes[mode].tabDom.remove(); this.modes[mode].contentDom.remove(); if (mode === 'hw') { $(this.modes).removeClass('.propertyTabhw'); $('.propertyTabhw').unbind('dblclick'); } } } } Entry.PropertyPanel = PropertyPanel;