Files

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