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);
+ });
}