"use strict"; import $ = require("jquery"); import { CodeProject } from "./project"; import { WorkerError, FileData } from "./workertypes"; import { ProjectView } from "./views"; type WindowCreateFunction = (id:string) => ProjectView; export class ProjectWindows { containerdiv : HTMLElement; project : CodeProject; id2window : {[id:string]:ProjectView} = {}; id2createfn : {[id:string]:WindowCreateFunction} = {}; id2div : {[id:string]:HTMLElement} = {}; activeid : string; activewnd : ProjectView; activediv : HTMLElement; lasterrors : WorkerError[]; undofiles : string[]; constructor(containerdiv:HTMLElement, project:CodeProject) { this.containerdiv = containerdiv; this.project = project; this.undofiles = []; } // TODO: delete windows ever? setCreateFunc(id:string, createfn:WindowCreateFunction) : void { this.id2createfn[id] = createfn; } create(id:string) : ProjectView { var wnd = this.id2window[id]; if (!wnd) { console.log("creating window",id); wnd = this.id2window[id] = this.id2createfn[id](id); } var div = this.id2div[id]; if (!div) { var data = this.project.getFile(id)+""; // TODO: binary files div = this.id2div[id] = wnd.createDiv(this.containerdiv, data); $(div).hide(); } return wnd; } createOrShow(id:string) : ProjectView { var wnd = this.create(id); var div = this.id2div[id]; if (this.activewnd != wnd) { if (this.activediv) $(this.activediv).hide(); if (this.activewnd && this.activewnd.setVisible) this.activewnd.setVisible(false); this.activediv = div; this.activewnd = wnd; $(div).show(); this.refresh(true); this.refreshErrors(); if (wnd.setVisible) wnd.setVisible(true); } this.activeid = id; return wnd; } put(id:string, window:ProjectView) : void { this.id2window[id] = window; } refresh(moveCursor:boolean) : void { // refresh current window if (this.activewnd && this.activewnd.refresh) this.activewnd.refresh(moveCursor); } tick() : void { if (this.activewnd && this.activewnd.tick) this.activewnd.tick(); } setErrors(errors:WorkerError[]) : void { this.lasterrors = errors; this.refreshErrors(); } refreshErrors() : void { if (this.activewnd && this.activewnd.markErrors) { if (this.lasterrors && this.lasterrors.length) this.activewnd.markErrors(this.lasterrors); else this.activewnd.clearErrors(); } } getActive() : ProjectView { return this.activewnd; } getActiveID() : string { return this.activeid; } getCurrentText() : string { if (this.activewnd && this.activewnd.getValue) return this.activewnd.getValue(); else bootbox.alert("Please switch to an editor window."); } resize() : void { if (this.activeid && this.activewnd && this.activewnd.recreateOnResize) { this.activewnd = null; this.id2window[this.activeid] = null; this.id2div[this.activeid] = null; this.createOrShow(this.activeid); } } updateFile(fileid:string, data:FileData) { // is there an editor? if so, use it var wnd = this.id2window[fileid]; if (wnd && wnd.setText && typeof data === 'string') { wnd.setText(data); this.undofiles.push(fileid); } else { this.project.updateFile(fileid, data); } } undoStep() { var fileid = this.undofiles.pop(); var wnd = this.id2window[fileid]; if (wnd && wnd.undoStep) { wnd.undoStep(); } else { bootbox.alert("No more steps to undo."); } } };