diff --git a/addon/chrome/content/workspaceWindow.xhtml b/addon/chrome/content/workspaceWindow.xhtml new file mode 100644 index 0000000..0827863 --- /dev/null +++ b/addon/chrome/content/workspaceWindow.xhtml @@ -0,0 +1,63 @@ + + + + + + + + workspaceWindow.name + + + + + +
+
+ + diff --git a/addon/chrome/locale/en-US/addon.properties b/addon/chrome/locale/en-US/addon.properties index 24b944e..efdab0e 100644 --- a/addon/chrome/locale/en-US/addon.properties +++ b/addon/chrome/locale/en-US/addon.properties @@ -21,6 +21,8 @@ templateEditor.help=Help tab.name=Note Workspace +workspaceWindow.name=Note Workspace + export.title=Export Notes export.options.linkMode=Linked Notes Mode export.options.MD=MarkDown(.md) diff --git a/addon/chrome/locale/zh-CN/addon.properties b/addon/chrome/locale/zh-CN/addon.properties index 777eb90..c7babce 100644 --- a/addon/chrome/locale/zh-CN/addon.properties +++ b/addon/chrome/locale/zh-CN/addon.properties @@ -21,6 +21,8 @@ templateEditor.help=帮助 tab.name=笔记工作区 +workspaceWindow.name=笔记工作区 + export.title=导出笔记 export.options.linkMode=链接笔记模式 export.options.MD=MarkDown(.md) diff --git a/src/modules/workspace/content.ts b/src/modules/workspace/content.ts index 9d2a9bf..867d136 100644 --- a/src/modules/workspace/content.ts +++ b/src/modules/workspace/content.ts @@ -55,7 +55,7 @@ export function initWorkspace(container: XUL.Box | undefined) { { tag: "hbox", id: makeId("top-container"), - styles: { width: "100%" }, + styles: { width: "100%", height: "100%" }, properties: {}, attributes: { flex: "1", diff --git a/src/modules/workspace/tab.ts b/src/modules/workspace/tab.ts index b982b41..87aec22 100644 --- a/src/modules/workspace/tab.ts +++ b/src/modules/workspace/tab.ts @@ -286,6 +286,19 @@ export async function activateWorkspaceTab() { }); tabElem.addEventListener("mousedown", () => hoverWorkspaceTab(true)); tabElem.addEventListener("mouseleave", () => hoverWorkspaceTab(false)); + tabElem.addEventListener("mousedown", async (ev) => { + if (ev.button !== 2) { + return; + } + await Zotero.Promise.delay(300); + const menu = document + .querySelector("#zotero-itemmenu") + ?.parentElement?.lastElementChild?.querySelector("menu") + ?.querySelector("menupopup")?.lastElementChild; + menu?.addEventListener("click", () => { + addon.hooks.onOpenWorkspace("window"); + }); + }); // load workspace content addon.hooks.onInitWorkspace(addon.data.workspace.tab.container); registerWorkspaceTabPaneObserver(); diff --git a/src/modules/workspace/window.ts b/src/modules/workspace/window.ts index 3d578db..da92fb5 100644 --- a/src/modules/workspace/window.ts +++ b/src/modules/workspace/window.ts @@ -1,5 +1,33 @@ -export function showWorkspaceWindow() { - // TODO - // const win; - // win.addEventListener("message", (e) => messageHandler(e), false); +import { config } from "../../../package.json"; +import { isWindowAlive, localeWindow } from "../../utils/window"; +import { messageHandler } from "./message"; + +export async function showWorkspaceWindow() { + if (isWindowAlive(addon.data.workspace.window.window)) { + addon.data.workspace.window.window?.focus(); + return; + } + const windowArgs = { + _initPromise: Zotero.Promise.defer(), + }; + const win = window.openDialog( + `chrome://${config.addonRef}/content/workspaceWindow.xhtml`, + `${config.addonRef}-workspaceWindow`, + `chrome,centerscreen,resizable,status,width=800,height=400,dialog=no`, + windowArgs + )!; + await windowArgs._initPromise.promise; + localeWindow(win); + addon.data.workspace.window.active = true; + addon.data.workspace.window.window = win; + addon.data.workspace.window.container = win.document.querySelector( + "#workspace-container" + ) as XUL.Box; + addon.hooks.onInitWorkspace(addon.data.workspace.window.container); + win.addEventListener("message", messageHandler, false); + win.addEventListener("unload", function onWindowUnload(ev) { + addon.data.workspace.window.active = false; + this.window.removeEventListener("unload", onWindowUnload, false); + this.window.removeEventListener("message", messageHandler, false); + }); }