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