diff --git a/release/antos-1.1.2.tar.gz b/release/antos-1.1.2.tar.gz index 1dbb5f9..6cb78aa 100644 Binary files a/release/antos-1.1.2.tar.gz and b/release/antos-1.1.2.tar.gz differ diff --git a/src/core/tags/TabContainerTag.ts b/src/core/tags/TabContainerTag.ts index 5abc707..fdc33d4 100644 --- a/src/core/tags/TabContainerTag.ts +++ b/src/core/tags/TabContainerTag.ts @@ -88,6 +88,28 @@ namespace OS { this._ontabselect = f; } + + /** + * Get all tab items in the container + * + * @readonly + * @type {TabContainerTabType[]} + * @memberof TabContainerTag + */ + get tabs(): TabContainerTabType[] + { + return (this.refs.bar as TabBarTag).items as TabContainerTabType[]; + } + + /** + * Select a tab by its index + * + * @memberof TabContainerTag + */ + set selectedIndex(i: number) { + (this.refs.bar as TabBarTag).selected = i; + } + /** * Setter: * @@ -135,6 +157,7 @@ namespace OS { } $(v.container).show(); this.observable.trigger("resize", undefined); + $(v.container).attr("tabindex",-1).css("outline", "none").trigger("focus"); } get selectedTab(): TabContainerTabType { return this._selectedTab; @@ -182,9 +205,10 @@ namespace OS { * * @param {GenericObject} item tab descriptor * @param {boolean} insert insert the tab content to the container ? + * @returns {ListViewItemTag} the tab DOM element * @memberof TabContainerTag */ - public addTab(item: GenericObject, insert: boolean): void { + public addTab(item: GenericObject, insert: boolean): ListViewItemTag { if (insert) { $(this.refs.yield).append(item.container); } @@ -196,6 +220,7 @@ namespace OS { item ); el.selected = true; + return el; } /** @@ -210,6 +235,7 @@ namespace OS { } (this.refs.bar as TabBarTag).delete(tab); } + /** * Mount the tag and bind basic events * diff --git a/src/core/vfs.ts b/src/core/vfs.ts index c7da6f4..2aab59a 100644 --- a/src/core/vfs.ts +++ b/src/core/vfs.ts @@ -1596,6 +1596,11 @@ namespace OS { * @memberof URLFileHandle */ protected _rd(t: string): Promise { + //read the file + if (t === "binary") { + //return API.handle.fileblob(this.path); + return API.blob(this.path+ "?_=" + new Date().getTime()); + } return API.get(this.path, t ? t : "text"); } } diff --git a/src/packages/CodePad/BaseExtension.ts b/src/packages/CodePad/BaseExtension.ts index c706221..0cc52a0 100644 --- a/src/packages/CodePad/BaseExtension.ts +++ b/src/packages/CodePad/BaseExtension.ts @@ -85,7 +85,11 @@ namespace OS { protected logger() { if(!this.app.setting.showBottomBar) { - this.app.showBottomBar(true); + this.app.showOutput(true); + } + else + { + this.app.showOutput(false); } return this.app.logger; } diff --git a/src/packages/CodePad/ExtensionMaker.ts b/src/packages/CodePad/ExtensionMaker.ts index cacbbd1..af1b4d2 100644 --- a/src/packages/CodePad/ExtensionMaker.ts +++ b/src/packages/CodePad/ExtensionMaker.ts @@ -86,6 +86,31 @@ namespace OS { .catch((e) => this.logger().error(__("Unable to read meta-data: {0}", e.stack))); } + /** + * + * + * @memberof ExtensionMaker + */ + installFromURL(): void + { + this.logger().clear(); + this.app + .openDialog("PromptDialog", { + title: __("Enter URI"), + label: __("Please enter extension URI:") + }) + .then(async (v) => { + if(!v) return; + try { + await this.installZip(v); + this.logger().info(__("Extension installed")); + return this.app.loadExtensionMetaData(); + } catch (e) { + return this.app.error(__("Unable to install extension: {0}", v)); + } + + }); + } /** * * @@ -295,6 +320,10 @@ namespace OS { if (this.app.extensions[meta.meta.name]) { this.app.extensions[meta.meta.name].text = meta.meta.text; this.app.extensions[meta.meta.name].nodes = []; + if(this.app.extensions[meta.meta.name].ext && this.app.extensions[meta.meta.name].ext.cleanup) + { + this.app.extensions[meta.meta.name].ext.cleanup(); + } this.app.extensions[meta.meta.name].ext = new App.extensions[meta.meta.name](this.app); for (v of meta.meta.actions) { this.app.extensions[meta.meta.name].addAction(v); diff --git a/src/packages/CodePad/extensions.json b/src/packages/CodePad/extensions.json index 8cb06f2..31ef6b1 100644 --- a/src/packages/CodePad/extensions.json +++ b/src/packages/CodePad/extensions.json @@ -40,8 +40,12 @@ "name": "release" }, { - "text": "__(Install extension)", + "text": "__(Install extension from file)", "name": "install" + }, + { + "text": "__(Install extension from URL)", + "name": "installFromURL" } ] } diff --git a/src/packages/CodePad/main.ts b/src/packages/CodePad/main.ts index 0c0f5a7..8bfff08 100644 --- a/src/packages/CodePad/main.ts +++ b/src/packages/CodePad/main.ts @@ -448,6 +448,11 @@ namespace OS { this.trigger("resize"); } + showOutput(toggle:boolean = false): void { + if(toggle) + this.showBottomBar(true); + this.bottombar.selectedIndex = 0; + } /** * Apply [[showBottomBar]] from user setting value @@ -936,6 +941,14 @@ namespace OS { let v: GenericObject; const dirties = this.eum.dirties(); if (dirties.length === 0) { + // cleanup all extension + for(let k in this.extensions) + { + if(this.extensions[k].ext && this.extensions[k].ext.cleanup) + { + this.extensions[k].ext.cleanup(); + } + } return; } evt.preventDefault(); diff --git a/src/packages/CodePad/templates/ext-main.tpl b/src/packages/CodePad/templates/ext-main.tpl index 26cbf8b..043e351 100644 --- a/src/packages/CodePad/templates/ext-main.tpl +++ b/src/packages/CodePad/templates/ext-main.tpl @@ -7,4 +7,7 @@ class App.extensions.{0} extends App.BaseExtension super app test: () -> - @notify "Test action is invoked" \ No newline at end of file + @notify "Test action is invoked" + + cleanup: () -> + # clean up the extension on application exit \ No newline at end of file