blob: 45fe5e4d9bf26df18650f0e59ba34d8c0766b1ca [file] [log] [blame]
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
var IMPL_DIR = "../../../Editor/src";
var RESOURCES_DIR = ".";
function UXEditor(element)
{
var self = this;
var doc = element.ownerDocument;
var iframeWrapper = null;
var iframe = null;
var setupCompletion = null;
var pendingScripts = {};
var doneScriptInit = false;
console.log("UXEditor: element = "+element);
console.log("UXEditor: doc = "+doc);
function setup(completion, iframeSrc, editorSrc, resources)
{
setupCompletion = completion;
IMPL_DIR = editorSrc;
RESOURCES_DIR = resources;
iframeWrapper = doc.createElement("div");
// iframeWrapper.setAttribute("id","_contentWrapper");
iframeWrapper.setAttribute("tabindex","0");
iframeWrapper.style.border = "none";
iframe = doc.createElement("iframe");
iframe.setAttribute("id","_content");
iframe.addEventListener("load",iframeLoaded);
iframe.setAttribute("src", iframeSrc); //"sample.html";
iframe.style.border = "none";
// iframe.setAttribute("class","contentframe");
iframeWrapper.appendChild(iframe);
element.appendChild(iframeWrapper);
self.iframeWrapper = iframeWrapper;
self.iframe = iframe;
window.onresize = updateIFrameSize;
updateIFrameSize();
}
function updateIFrameSize()
{
var width = window.innerWidth;
var height = window.innerHeight - 64;
iframe.style.width = width+"px";
iframe.style.height = height+"px";
iframeWrapper.style.width = width+"px";
iframeWrapper.style.height = height+"px";
}
function iframeLoaded()
{
console.log("iframe loaded");
self.cdoc = iframe.contentDocument;
self.cwin = iframe.contentWindow;
var javascriptFiles = ["first.js",
"ElementTypes.js",
"AutoCorrect.js",
"ChangeTracking.js",
"Clipboard.js",
"Cursor.js",
"DOM.js",
"Editor.js",
"Equations.js",
"Figures.js",
"Formatting.js",
"Hierarchy.js",
"Input.js",
"Lists.js",
"Main.js",
"Metadata.js",
"NodeSet.js",
"Outline.js",
"Position.js",
"PostponedActions.js",
"Range.js",
"Selection.js",
"3rdparty/showdown/showdown.js",
"Scan.js",
"StringBuilder.js",
"Styles.js",
"Tables.js",
"Text.js",
"traversal.js",
"types.js",
"UndoManager.js",
"util.js",
"Viewport.js"];
// We first create all the script objects and set their onload properties. Only *after*
// that do we actually add them to the document. This ensures that pendingScripts will
// only ever become empty after all the scripts have definitely loaded.
var scripts = [];
for (var i = 0; i < javascriptFiles.length; i++) {
var src = IMPL_DIR+"/"+javascriptFiles[i];
var script = document.createElement("script");
script.setAttribute("src",src);
pendingScripts[src] = true;
script.onload = function(e) { scriptLoaded(e.target); }
scripts.push(script);
}
// Now add the script elements to the document, triggering their load
for (var i = 0; i < scripts.length; i++)
self.cdoc.head.appendChild(scripts[i]);
}
function scriptLoaded(script)
{
delete pendingScripts[script.getAttribute("src")];
console.log("loadedScript: "+script.getAttribute("src")+
"; remaining = "+Object.keys(pendingScripts).length);
if (Object.keys(pendingScripts).length > 0)
return;
if (!doneScriptInit) {
doneScriptInit = true;
console.log("Now we should init");
self.cwin.Main_init(800,150, RESOURCES_DIR + "/builtin.css",false);
if (setupCompletion != null)
setupCompletion();
}
}
function invokeCallbacks()
{
var messages = JSON.parse(self.cwin.Editor_getBackMessages());
if (self.callbacks == null)
return;
console.log("messages.length = "+messages.length);
for (var i = 0; i < messages.length; i++) {
var name = messages[i][0];
var args = messages[i].slice(1);
if ((self.callbacks != null) && (self.callbacks[name] != null))
self.callbacks[name].apply(null,args);
}
}
function wrap(name)
{
return function() {
var argsArray = [];
var args = new Array();
console.log("arguments.length = "+arguments.length);
for (var i = 0; i < arguments.length; i++) {
args.push(arguments[i]);
}
var res = self.cwin.Main_execute(function() {
return self.cwin[name].apply(null,args);
});
invokeCallbacks();
// Ensure we have a completely separate copy of the data
if (res == null) {
return null;
}
else {
var str = JSON.stringify(res);
return JSON.parse(str);
}
}
}
var op = {
clipboard: {
cut: wrap("Clipboard_cut"),
copy: wrap("Clipboard_copy"),
pasteText: wrap("Clipboard_pasteText"),
pasteHTML: wrap("Clipboard_pasteHTML"),
},
cursor: {
positionCursor: wrap("Cursor_positionCursor"),
getCursorPosition: wrap("Cursor_getCursorPosition"),
insertReference: wrap("Cursor_insertReference"),
insertLink: wrap("Cursor_insertLink"),
insertCharacter: wrap("Cursor_insertCharacter"),
deleteCharacter: wrap("Cursor_deleteCharacter"),
enterPressed: wrap("Cursor_enterPressed"),
getPrecedingWord: wrap("Cursor_getPrecedingWord"),
getLinkProperties: wrap("Cursor_getLinkProperties"),
setLinkProperties: wrap("Cursor_setLinkProperties"),
setReferenceTarget: wrap("Cursor_setReferenceTarget"),
insertFootnote: wrap("Cursor_insertFootnote"),
insertEndnote: wrap("Cursor_insertEndnote"),
test: wrap("Cursor_test"),
},
figures: {
insertFigure: wrap("Figures_insertFigure"),
getSelectedFigureId: wrap("Figures_getSelectedFigureId"),
getProperties: wrap("Figures_getProperties"),
setProperties: wrap("Figures_setProperties"),
getGeometry: wrap("Figures_getGeometry"),
},
formatting: {
getFormatting: wrap("Formatting_getFormatting"),
applyFormattingChanges: wrap("Formatting_applyFormattingChanges"),
},
input: {
},
lists: {
increaseIndent: wrap("Lists_increaseIndent"),
decreaseIndent: wrap("Lists_decreaseIndent"),
clearList: wrap("Lists_clearList"),
setUnorderedList: wrap("Lists_setUnorderedList"),
setOrderedList: wrap("Lists_setOrderedList"),
},
main: {
getLanguage: wrap("Main_getLanguage"),
setLanguage: wrap("Main_setLanguage"),
setGenerator: wrap("Main_setGenerator"),
prepareForSave: wrap("Main_prepareForSave"),
getHTML: wrap("Main_getHTML"),
isEmptyDocument: wrap("Main_isEmptyDocument"),
},
outline: {
getOutline: wrap("Outline_getOutline"),
moveSection: wrap("Outline_moveSection"),
deleteItem: wrap("Outline_deleteItem"),
goToItem: wrap("Outline_goToItem"),
scheduleUpdateStructure: wrap("Outline_scheduleUpdateStructure"),
setTitle: wrap("Outline_setTitle"),
setNumbered: wrap("Outline_setNumbered"),
insertTableOfContents: wrap("Outline_insertTableOfContents"),
insertListOfFigures: wrap("Outline_insertListOfFigures"),
insertListOfTables: wrap("Outline_insertListOfTables"),
setPrintMode: wrap("Outline_setPrintMode"),
examinePrintLayout: wrap("Outline_examinePrintLayout"),
detectSectionNumbering: wrap("Outline_detectSectionNumbering"),
findUsedStyles: wrap("Outline_findUsedStyles"),
},
scan: {
reset: wrap("Scan_reset"),
next: wrap("Scan_next"),
addMatch: wrap("Scan_addMatch"),
showMatch: wrap("Scan_showMatch"),
replaceMatch: wrap("Scan_replaceMatch"),
removeMatch: wrap("Scan_removeMatch"),
goToMatch: wrap("Scan_goToMatch"),
},
selection: {
update: wrap("Selection_update"),
selectAll: wrap("Selection_selectAll"),
selectParagraph: wrap("Selection_selectParagraph"),
selectWordAtCursor: wrap("Selection_selectWordAtCursor"),
dragSelectionBegin: wrap("Selection_dragSelectionBegin"),
dragSelectionUpdate: wrap("Selection_dragSelectionUpdate"),
moveStartLeft: wrap("Selection_moveStartLeft"),
moveStartRight: wrap("Selection_moveStartRight"),
moveEndLeft: wrap("Selection_moveEndLeft"),
moveEndRight: wrap("Selection_moveEndRight"),
setSelectionStartAtCoords: wrap("Selection_setSelectionStartAtCoords"),
setSelectionEndAtCoords: wrap("Selection_setSelectionEndAtCoords"),
setTableSelectionEdgeAtCoords: wrap("Selection_setTableSelectionEdgeAtCoords"),
print: wrap("Selection_print"),
},
styles: {
getCSSText: wrap("Styles_getCSSText"),
setCSSText: wrap("Styles_setCSSText"),
getParagraphClass: wrap("Styles_getParagraphClass"),
setParagraphClass: wrap("Styles_setParagraphClass"),
},
tables: {
insertTable: wrap("Tables_insertTable"),
addAdjacentRow: wrap("Tables_addAdjacentRow"),
addAdjacentColumn: wrap("Tables_addAdjacentColumn"),
removeAdjacentRow: wrap("Tables_removeAdjacentRow"),
removeAdjacentColumn: wrap("Tables_removeAdjacentColumn"),
clearCells: wrap("Tables_clearCells"),
mergeCells: wrap("Tables_mergeCells"),
splitSelection: wrap("Tables_splitSelection"),
getSelectedTableId: wrap("Tables_getSelectedTableId"),
getProperties: wrap("Tables_getProperties"),
setProperties: wrap("Tables_setProperties"),
setColWidths: wrap("Tables_setColWidths"),
getGeometry: wrap("Tables_getGeometry"),
},
undoManager: {
getLength: wrap("UndoManager_getLength"),
getIndex: wrap("UndoManager_getIndex"),
setIndex: wrap("UndoManager_setIndex"),
undo: wrap("UndoManager_undo"),
redo: wrap("UndoManager_redo"),
newGroup: wrap("UndoManager_newGroup"),
groupType: wrap("UndoManager_groupType"),
},
};
self.setup = setup;
self.op = op;
self.callbacks = null;
self.cdoc = null;
self.cwin = null;
self.iframeWrapper = null;
self.iframe = null;
}