import { BasicExampleFactory, HelperExampleFactory, KeyExampleFactory, PromptExampleFactory, UIExampleFactory, } from "./modules/examples"; import { getString, initLocale } from "./utils/locale"; import { registerPrefsScripts } from "./modules/preferenceScript"; import { createZToolkit } from "./utils/ztoolkit"; async function onStartup() { await Promise.all([ Zotero.initializationPromise, Zotero.unlockPromise, Zotero.uiReadyPromise, ]); initLocale(); BasicExampleFactory.registerPrefs(); BasicExampleFactory.registerNotifier(); KeyExampleFactory.registerShortcuts(); await UIExampleFactory.registerExtraColumn(); await UIExampleFactory.registerExtraColumnWithCustomCell(); UIExampleFactory.registerItemPaneCustomInfoRow(); UIExampleFactory.registerItemPaneSection(); UIExampleFactory.registerReaderItemPaneSection(); await Promise.all( Zotero.getMainWindows().map((win) => onMainWindowLoad(win)), ); } async function onMainWindowLoad(win: _ZoteroTypes.MainWindow): Promise { // Create ztoolkit for every window addon.data.ztoolkit = createZToolkit(); // @ts-ignore This is a moz feature win.MozXULElement.insertFTLIfNeeded( `${addon.data.config.addonRef}-mainWindow.ftl`, ); const popupWin = new ztoolkit.ProgressWindow(addon.data.config.addonName, { closeOnClick: true, closeTime: -1, }) .createLine({ text: getString("startup-begin"), type: "default", progress: 0, }) .show(); await Zotero.Promise.delay(1000); popupWin.changeLine({ progress: 30, text: `[30%] ${getString("startup-begin")}`, }); UIExampleFactory.registerStyleSheet(win); UIExampleFactory.registerRightClickMenuItem(); UIExampleFactory.registerRightClickMenuPopup(win); UIExampleFactory.registerWindowMenuWithSeparator(); PromptExampleFactory.registerNormalCommandExample(); PromptExampleFactory.registerAnonymousCommandExample(win); PromptExampleFactory.registerConditionalCommandExample(); await Zotero.Promise.delay(1000); popupWin.changeLine({ progress: 100, text: `[100%] ${getString("startup-finish")}`, }); popupWin.startCloseTimer(5000); addon.hooks.onDialogEvents("dialogExample"); } async function onMainWindowUnload(win: Window): Promise { ztoolkit.unregisterAll(); addon.data.dialog?.window?.close(); } function onShutdown(): void { ztoolkit.unregisterAll(); addon.data.dialog?.window?.close(); // Remove addon object addon.data.alive = false; // @ts-ignore - Plugin instance is not typed delete Zotero[addon.data.config.addonInstance]; } /** * This function is just an example of dispatcher for Notify events. * Any operations should be placed in a function to keep this funcion clear. */ async function onNotify( event: string, type: string, ids: Array, extraData: { [key: string]: any }, ) { // You can add your code to the corresponding notify type ztoolkit.log("notify", event, type, ids, extraData); if ( event == "select" && type == "tab" && extraData[ids[0]].type == "reader" ) { BasicExampleFactory.exampleNotifierCallback(); } else { return; } } /** * This function is just an example of dispatcher for Preference UI events. * Any operations should be placed in a function to keep this funcion clear. * @param type event type * @param data event data */ async function onPrefsEvent(type: string, data: { [key: string]: any }) { switch (type) { case "load": registerPrefsScripts(data.window); break; default: return; } } function onShortcuts(type: string) { switch (type) { case "larger": KeyExampleFactory.exampleShortcutLargerCallback(); break; case "smaller": KeyExampleFactory.exampleShortcutSmallerCallback(); break; default: break; } } function onDialogEvents(type: string) { switch (type) { case "dialogExample": HelperExampleFactory.dialogExample(); break; case "clipboardExample": HelperExampleFactory.clipboardExample(); break; case "filePickerExample": HelperExampleFactory.filePickerExample(); break; case "progressWindowExample": HelperExampleFactory.progressWindowExample(); break; case "vtableExample": HelperExampleFactory.vtableExample(); break; default: break; } } // Add your hooks here. For element click, etc. // Keep in mind hooks only do dispatch. Don't add code that does real jobs in hooks. // Otherwise the code would be hard to read and maintain. export default { onStartup, onShutdown, onMainWindowLoad, onMainWindowUnload, onNotify, onPrefsEvent, onShortcuts, onDialogEvents, };