123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243 |
- <!DOCTYPE html>
- <html>
- <head>
- <title>Grapheditor</title>
- <!--[if IE]>
- <meta http-equiv="X-UA-Compatible" content="IE=5,IE=9">
- <![endif]-->
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
- <link rel="stylesheet" type="text/css" href="styles/grapheditor.css">
- <script type="text/javascript">
- var urlParams = (function (url) {
- var result = {};
- var idx = url.lastIndexOf('?');
- if (idx > 0) {
- var params = url.substring(idx + 1).split('&');
- for (var i = 0; i < params.length; i++) {
- idx = params[i].indexOf('=');
- if (idx > 0) {
- result[params[i].substring(0, idx)] = params[i].substring(idx + 1);
- }
- }
- }
- return result;
- })(window.location.href);
- mxLoadResources = false;
- window.mxBasePath = "./src";
- </script>
- <script type="text/javascript" src="js/Init.js"></script>
- <script type="text/javascript" src="deflate/pako.min.js"></script>
- <script type="text/javascript" src="deflate/base64.js"></script>
- <script type="text/javascript" src="jscolor/jscolor.js"></script>
- <script type="text/javascript" src="sanitizer/sanitizer.min.js"></script>
- <script type="text/javascript" src="js/mxClient.js"></script>
- <script type="text/javascript" src="js/EditorUi.js"></script>
- <script type="text/javascript" src="js/Editor.js"></script>
- <script type="text/javascript" src="js/Sidebar.js"></script>
- <script type="text/javascript" src="js/Graph.js"></script>
- <script type="text/javascript" src="js/Format.js"></script>
- <script type="text/javascript" src="js/Shapes.js"></script>
- <script type="text/javascript" src="js/Actions.js"></script>
- <script type="text/javascript" src="js/Menus.js"></script>
- <script type="text/javascript" src="js/Toolbar.js"></script>
- <script type="text/javascript" src="js/Dialogs.js"></script>
- </head>
- <body class="geEditor">
- <script type="text/javascript">
- (function () {
- var editorUiInit = EditorUi.prototype.init;
- EditorUi.prototype.init = function () {
- editorUiInit.apply(this, arguments);
- this.actions.get('new').setEnabled(false);
- this.actions.get('export').setEnabled(false);
- this.actions.get('open').setEnabled(false);
- this.actions.get('import').setEnabled(false);
- this.actions.get('save').setEnabled(true);
- this.actions.get('saveAs').setEnabled(false);
- this.actions.get('export').setEnabled(false);
- };
- EditorUi.prototype.saveFile = function () {
- window.parent.postMessage({
- act: 'save',
- params: {
- }
- }, '*');
- };
- EditorUi.prototype.menubarHeight = 0;
- EditorUi.prototype.footerHeight = 0;
- mxResources.loadDefaultBundle = false;
- var bundle = mxResources.getDefaultBundle(RESOURCE_BASE, mxLanguage) || mxResources.getSpecialBundle(RESOURCE_BASE, mxLanguage);
- mxUtils.getAll([bundle, STYLE_PATH + '/default.xml'], function (xhr) {
- mxResources.parse(xhr[0].getText());
- var themes = {};
- themes[Graph.prototype.defaultThemeName] = xhr[1].getDocumentElement();
- var editorUi = new EditorUi(new Editor(urlParams['chrome'] == '0', themes));
- var graph = editorUi.editor.graph;
- var getPos = function () {
- var svg = null;
- var childNodes = graph.container.childNodes;
- for (var i = 0; i < childNodes.length; i++) {
- if (childNodes[i].nodeName.toLocaleLowerCase() == 'svg') {
- svg = childNodes[i];
- break;
- }
- }
- var data = {
- p1: {left: 0, top: 0},
- p2: {left: 0, top: 0},
- };
- if (svg != null) {
- data = {
- p1: {
- left: svg.clientWidth / 2,
- top: svg.clientHeight / 2,
- },
- p2: {
- left: graph.container.clientWidth / 2 + graph.container.scrollLeft,
- top: graph.container.clientHeight / 2 + graph.container.scrollTop,
- }
- };
- }
- return {
- left: data.p2.left - data.p1.left,
- top: data.p2.top - data.p1.top,
- };
- }
- var setPos = function (diff) {
- var svg = null;
- var childNodes = graph.container.childNodes;
- for (var i = 0; i < childNodes.length; i++) {
- if (childNodes[i].nodeName.toLocaleLowerCase() == 'svg') {
- svg = childNodes[i];
- break;
- }
- }
- if (svg == null) {
- return;
- }
- graph.container.scrollLeft = svg.clientWidth / 2 + diff.left - graph.container.clientWidth / 2;
- graph.container.scrollTop = svg.clientHeight / 2 + diff.top - graph.container.clientHeight / 2;
- }
- var newXml;
- var newPos;
- var randXml;
- var backupParams;
- var changePost = function (immediately) {
- var randTmp = (randXml = Math.random());
- setTimeout(() => {
- if (randTmp != randXml) {
- return;
- }
- if (!backupParams) {
- return;
- }
- newPos = getPos();
- newXml = mxUtils.getPrettyXml(editorUi.editor.getGraphXml());
- if (backupParams.xml && backupParams.xml.replace(/^<mxGraphModel(.*?)>/, '') == newXml.replace(/^<mxGraphModel(.*?)>/, '')) {
- if (backupParams.scale && backupParams.scale == graph.getView().scale) {
- if (typeof backupParams.diffpos === "object" && Math.abs(backupParams.diffpos.left - newPos.left) < 10 && Math.abs(backupParams.diffpos.top - newPos.top) < 10) {
- return;
- }
- }
- }
- backupParams.xml = newXml;
- window.parent.postMessage({
- act: 'change',
- params: {
- xml: newXml,
- scale: graph.getView().scale,
- diffpos: newPos,
- }
- }, '*');
- }, immediately === true ? 0 : 200)
- }
- graph.getModel().addListener(mxEvent.CHANGE, mxUtils.bind(editorUi, function() { changePost(true) }));
- graph.getView().addListener(mxEvent.SCALE, mxUtils.bind(editorUi, function() {changePost(true) }));
- graph.container.addEventListener("scroll", changePost);
- window.addEventListener("message", function(event){
- var data = event.data;
- switch (data.act) {
- case 'setXml':
- try {
- backupParams = data.params;
- editorUi.editor.setGraphXml(mxUtils.parseXml(data.params.xml).documentElement);
- typeof data.params.scale === "number" && graph.zoomTo(data.params.scale);
- typeof data.params.diffpos === "object" && setPos(data.params.diffpos);
- } catch (e) {
- }
- break;
- case 'exportPNG':
- try {
- (function (name, scale, type) {
- name = name || '未命名';
- type = type || 'png';
- scale = scale || 1;
- var graph = editorUi.editor.graph;
- var bounds = graph.getGraphBounds();
- var width = Math.ceil(bounds.width / graph.view.scale * scale);
- var height = Math.ceil(bounds.height / graph.view.scale * scale);
- var source = '<?xml version="1.0" standalone="no"?>\r\n' + mxUtils.getXml(graph.getSvg(null, scale, 0))
- var image = new Image()
- image.src = 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent(source)
- var canvas = document.createElement('canvas')
- canvas.width = width
- canvas.height = height
- var context = canvas.getContext('2d')
- context.fillStyle = '#fff'
- context.fillRect(0, 0, 10000, 10000)
- image.onload = function () {
- context.drawImage(image, 0, 0)
- if (type == 'imageContent') {
- window.parent.postMessage({
- act: 'imageContent',
- params: {
- name: name,
- width: width,
- height: height,
- content: canvas.toDataURL(`image/${type}`)
- }
- }, '*');
- } else {
- var a = document.createElement('a')
- a.download = `${name}.${type}`
- a.href = canvas.toDataURL(`image/${type}`)
- a.click()
- }
- }
- })(data.params.name, data.params.scale, data.params.type);
- } catch (e) {
- }
- break;
- }
- });
- window.parent.postMessage({
- act: 'ready',
- params: {}
- }, '*');
- }, function () {
- document.body.innerHTML = '<center style="margin-top:10%;">Error loading resource files. Please check browser console.</center>';
- });
- })();
- </script>
- </body>
- </html>
|