mirror of
				https://github.com/mickael-kerjean/filestash.git
				synced 2025-10-31 18:16:00 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			124 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			124 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| // reference:
 | |
| // - uno programming: https://www.youtube.com/watch?v=CzxLKG9CUvo
 | |
| // - dispatch commands: https://wiki.documentfoundation.org/Development/DispatchCommands
 | |
| Module.zetajs.then(function(zetajs) {
 | |
|     init({
 | |
|         css: zetajs.uno.com.sun.star,
 | |
|         zetajs,
 | |
|     });
 | |
| });
 | |
| 
 | |
| function init({ zetajs, css }) {
 | |
|     const context = zetajs.getUnoComponentContext();
 | |
|     const desktop = css.frame.Desktop.create(context);
 | |
|     let ctrl, xModel;
 | |
| 
 | |
|     // UI Element: remove toolbar in writer
 | |
|     const config = css.configuration.ReadWriteAccess.create(context, "en-US");
 | |
|     ["Writer", "Calc", "Impress"].forEach((app) => {
 | |
|         const uielems = config.getByHierarchicalName(`/org.openoffice.Office.UI.${app}WindowState/UIElements/States`);
 | |
|         for (const i of uielems.getElementNames()) {
 | |
|             const uielem = uielems.getByName(i);
 | |
|             if (uielem.getByName("Visible")) uielem.setPropertyValue("Visible", false);
 | |
|         }
 | |
|     });
 | |
| 
 | |
|     // Theme & Colors
 | |
|     const elmnts = config.getByHierarchicalName("/org.openoffice.Office.UI/ColorScheme/ColorSchemes");
 | |
|     for (const i of elmnts.getElementNames()) {
 | |
|         const colorScheme = elmnts.getByName(i);
 | |
|         // console.log(colorScheme.getElementNames());
 | |
|         colorScheme.getByName("AppBackground").setPropertyValue("Color", 16119285); // #f5f5f5
 | |
|         colorScheme.getByName("WriterPageBreaks").setPropertyValue("Color", 16119285); // #f5f5f5
 | |
|         colorScheme.getByName("WriterSectionBoundaries").setPropertyValue("Color", 16119285); // #f5f5f5
 | |
|         colorScheme.getByName("Shadow").setPropertyValue("Color", 16119285); // #f5f5f5
 | |
|         colorScheme.getByName("FontColor").setPropertyValue("Color", 2368548); // #242424
 | |
|         colorScheme.getByName("WriterHeaderFooterMark").setPropertyValue("Color", 16777215); // #ffffff
 | |
|     }
 | |
|     config.commitChanges();
 | |
| 
 | |
|     zetajs.mainPort.onmessage = function(e) {
 | |
|         switch (e.data.cmd) {
 | |
|         case "destroy":
 | |
|             toggleTools({ mime: e.data.mime, css, ctrl, context });
 | |
|             xModel = null;
 | |
|             ctrl = null;
 | |
|             break;
 | |
|         case "load":
 | |
|             const { filename, mime } = e.data;
 | |
|             const in_path = `file:///tmp/office/${filename}`;
 | |
|             xModel = desktop.loadComponentFromURL(in_path, "_default", 0, []);
 | |
|             ctrl = xModel.getCurrentController();
 | |
|             ctrl.getFrame().LayoutManager.hideElement("private:resource/menubar/menubar");
 | |
|             ctrl.getFrame().LayoutManager.hideElement("private:resource/statusbar/statusbar");
 | |
|             ctrl.getFrame().getContainerWindow().FullScreen = true;
 | |
|             toggleTools({ mime, css, ctrl, context });
 | |
|             const commands = [ // ref: https://wiki.documentfoundation.org/Development/DispatchCommands
 | |
|                 "Bold", "Italic", "Underline", "Strikeout", "LeftPara", "RightPara", "CenterPara",
 | |
|                 "JustifyPara", "Color", "FontHeight", ...(isWriter(mime) ? ["StyleApply", "DefaultBullet", "DefaultNumbering"] : []),
 | |
|             ];
 | |
|             for (const id of commands) {
 | |
|                 const urlObj = transformUrl(".uno:" + id, { css, context });
 | |
|                 const listener = zetajs.unoObject([css.frame.XStatusListener], {
 | |
|                     disposing: function(source) {},
 | |
|                     statusChanged: function(state) {
 | |
|                         state = zetajs.fromAny(state.State);
 | |
|                         if (id === "StyleApply") state = state && state.StyleName || null;
 | |
|                         else if (id === "Color") state = typeof state === "number" ? state : null;
 | |
|                         else if (id === "FontHeight") state = state && state.Height || null;
 | |
|                         else if (typeof state !== "boolean") state = false;
 | |
| 
 | |
|                         if (state === null) return;
 | |
|                         zetajs.mainPort.postMessage({ cmd: "setFormat", id, state });
 | |
|                     },
 | |
|                 });
 | |
|                 queryDispatch(urlObj, { ctrl }).addStatusListener(listener, urlObj);
 | |
|             }
 | |
|             zetajs.mainPort.postMessage({ cmd: "loaded" });
 | |
|             break;
 | |
|         case "save":
 | |
|             xModel.store();
 | |
|             zetajs.mainPort.postMessage({ cmd: "save" });
 | |
|             break;
 | |
|         case "toggleFormatting":
 | |
|             dispatch(".uno:" + e.data.id, { css, ctrl, context });
 | |
|             break;
 | |
|         default:
 | |
|             throw Error("Unknown message command: " + e.data.cmd);
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| function transformUrl(unoUrl, { css, context }) {
 | |
|     const ioparam = {
 | |
|         val: new css.util.URL({
 | |
|             Complete: unoUrl
 | |
|         }),
 | |
|     };
 | |
|     css.util.URLTransformer.create(context).parseStrict(ioparam);
 | |
|     return ioparam.val;
 | |
| }
 | |
| 
 | |
| function queryDispatch(urlObj, { ctrl }) {
 | |
|     return ctrl.queryDispatch(urlObj, "_self", 0);
 | |
| }
 | |
| 
 | |
| function dispatch(unoUrl, { css, ctrl, context }) {
 | |
|     const urlObj = transformUrl(unoUrl, { css, context });
 | |
|     queryDispatch(urlObj, { ctrl }).dispatch(urlObj, []);
 | |
| }
 | |
| 
 | |
| function toggleTools({ css, ctrl, context, mime }) {
 | |
|     dispatch(".uno:Sidebar", { css, ctrl, context });
 | |
|     if (isCalc(mime)) dispatch(".uno:InputLineVisible", { css, ctrl, context });
 | |
|     if (isWriter(mime)) dispatch(".uno:Ruler", { css, ctrl, context });
 | |
| }
 | |
| 
 | |
| function isWriter(mime) {
 | |
|     return ["application/word", "application/msword", "application/rtf", "application/vnd.oasis.opendocument.text"].indexOf(mime) >= 0;
 | |
| }
 | |
| 
 | |
| function isCalc(mime) {
 | |
|     return ["application/excel", "application/vnd.ms-excel", "application/vnd.oasis.opendocument.spreadsheet"].indexOf(mime) >= 0;
 | |
| }
 | 
