diff --git a/addon/chrome/content/preferences.xul b/addon/chrome/content/preferences.xul index 5f51758..7fc8157 100644 --- a/addon/chrome/content/preferences.xul +++ b/addon/chrome/content/preferences.xul @@ -3,8 +3,10 @@ - - + + + + \ No newline at end of file diff --git a/package.json b/package.json index 5263a1e..0a8db55 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,6 @@ "homepage": "https://github.com/windingwind/Notero#readme", "dependencies": { "compressing": "^1.5.1", - "crypto-js": "^4.1.1", "esbuild": "^0.14.34", "replace-in-file": "^6.3.2" }, diff --git a/src/base.ts b/src/base.ts index cdfcb26..75e1c9c 100644 --- a/src/base.ts +++ b/src/base.ts @@ -5,4 +5,17 @@ class AddonBase { } } -export { AddonBase }; +class EditorMessage { + public type: string; + public content: { + itemID?: string; + event?: XULEvent; + editorInstance?: EditorInstance + }; + constructor(type: string, content: object) { + this.type = type; + this.content = content; + } +} + +export { AddonBase, EditorMessage }; diff --git a/src/events.ts b/src/events.ts index 3f661eb..5468f91 100644 --- a/src/events.ts +++ b/src/events.ts @@ -1,4 +1,4 @@ -import { AddonBase } from "./base"; +import { AddonBase, EditorMessage } from "./base"; class AddonEvents extends AddonBase { constructor(parent: Notero) { @@ -7,10 +7,90 @@ class AddonEvents extends AddonBase { public async onInit() { Zotero.debug("Notero: init called"); - + this.addNoteInstanceListener(); this.resetState(); } + public addNoteInstanceListener() { + Zotero.Notes._registerEditorInstance = Zotero.Notes.registerEditorInstance; + Zotero.Notes.registerEditorInstance = (instance: EditorInstance) => { + Zotero.Notes._registerEditorInstance(instance); + this.onEditorEvent( + new EditorMessage("addNoteInstance", { + editorInstance: instance, + }) + ); + }; + } + + public async onEditorEvent(message: EditorMessage) { + Zotero.debug(`Notero: onEditorEvent\n${String(message)}`); + switch (message.type) { + case "addNoteInstance": + let mainKnowledgeID = parseInt( + Zotero.Prefs.get("Notero.mainKnowledgeID") + ); + await message.content.editorInstance._initPromise; + + if (message.content.editorInstance._item.id !== mainKnowledgeID) { + Zotero.debug(`Notero: main Knowledge`); + this._Addon.views.addEditorButton( + message.content.editorInstance, + "setMainKnowledge", + "Use Current Note as Knowledge Workspace", + new EditorMessage("setMainKnowledge", {}) + ); + this._Addon.views.addEditorButton( + message.content.editorInstance, + "addToKnowledge", + "Add Note Link to Knowledge Workspace", + new EditorMessage("addToKnowledge", {}) + ); + } + break; + + case "addToKnowledge": + /* + message.content = { + editorInstance + } + */ + // TODO: Complete this part + Zotero.debug("Notero: addToKnowledge"); + break; + case "setMainKnowledge": + /* + message.content = { + editorInstance + } + */ + // TODO: Complete this part + Zotero.debug("Notero: addToKnowledge"); + if (Zotero.Prefs.get("Notero.mainKnowledgeID")) { + let confirmChange = confirm( + "Will remove current Knowledge Workspace. Confirm?" + ); + if (!confirmChange) { + return; + } + } + Zotero.Prefs.set( + "Notero.mainKnowledgeID", + message.content.editorInstance._item.id + ); + // Set the button to selected state + this._Addon.views.changeEditorButton( + message.content.event.target, + "isMainKnowledge", + "This Note is Knowledge Workspace" + ); + // TODO: update workspace window here + break; + default: + break; + } + } + private resetState(): void { // Reset preferrence state. } diff --git a/src/knowledge.ts b/src/knowledge.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/views.ts b/src/views.ts index e4e6cca..50607ef 100644 --- a/src/views.ts +++ b/src/views.ts @@ -1,7 +1,8 @@ -import { AddonBase } from "./base"; +import { AddonBase, EditorMessage } from "./base"; class AddonViews extends AddonBase { progressWindowIcon: object; + editorIcon: object; constructor(parent: Notero) { super(parent); @@ -10,6 +11,40 @@ class AddonViews extends AddonBase { fail: "chrome://zotero/skin/cross.png", default: "chrome://notero/skin/favicon.png", }; + this.editorIcon = { + addToKnowledge: ``, + setMainKnowledge: ``, + isMainKnowledge: ``, + }; + } + + async addEditorButton( + editorInstances: EditorInstance, + icon: string, + title: string, + message: EditorMessage + ) { + // Use Zotero.Notes._editorInstances to find current opened note editor + await editorInstances._initPromise; + + let _document = editorInstances._iframeWindow.document; + let toolbar = _document.getElementsByClassName("middle")[0]; + let button = _document.createElement("button"); + button.setAttribute("class", "toolbar-button"); + button.setAttribute("id", title); + button.setAttribute("title", title); + button.innerHTML = this.editorIcon[icon]; + toolbar.append(button); + button.onclick = (e: Event) => { + message.content.event = e as XULEvent; + message.content.editorInstance = editorInstances; + this._Addon.events.onEditorEvent(message); + }; + } + + changeEditorButton(button: Element, icon: string, title: string) { + button.innerHTML = this.editorIcon[icon]; + button.setAttribute("title", title); } showProgressWindow( diff --git a/typing/global.d.ts b/typing/global.d.ts index 51365fb..215221a 100644 --- a/typing/global.d.ts +++ b/typing/global.d.ts @@ -127,6 +127,7 @@ declare const Zotero: { set: (key: string, value: any) => any; }; Reader: Reader; + Notes: Notes; Notero: import("../src/Notero"); }; @@ -154,9 +155,27 @@ declare class Reader { declare class ReaderObj { [attr: string]: any; itemID: number; - _iframeWindow: Window; + _iframeWindow: XULWindow; } +declare class EditorInstance { + _iframeWindow: XULWindow; + _item: ZoteroItem; + _initPromise: Promise +} + +declare class Notes { + _editorInstances: EditorInstance[]; + registerEditorInstance: (instance: EditorInstance) => void; + // custom + _registerEditorInstance?: (instance: EditorInstance) => void; +} + +declare const ZoteroContextPane: { + [attr: string]: any; + getActiveEditor: () => EditorInstance; +}; + declare class Annotation { text: string; } diff --git a/typing/xul.d.ts b/typing/xul.d.ts index 93dd1d6..6c38e89 100644 --- a/typing/xul.d.ts +++ b/typing/xul.d.ts @@ -69,3 +69,7 @@ declare class ClassList { declare class XULEvent extends Event { public target: XUL.Element; } + +declare class XULWindow extends Window { + public document: XMLDocument; +}