index.html 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>Grapheditor</title>
  5. <!--[if IE]>
  6. <meta http-equiv="X-UA-Compatible" content="IE=5,IE=9">
  7. <![endif]-->
  8. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  9. <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
  10. <link rel="stylesheet" type="text/css" href="styles/grapheditor.css">
  11. <script type="text/javascript">
  12. var urlParams = (function (url) {
  13. var result = {};
  14. var idx = url.lastIndexOf('?');
  15. if (idx > 0) {
  16. var params = url.substring(idx + 1).split('&');
  17. for (var i = 0; i < params.length; i++) {
  18. idx = params[i].indexOf('=');
  19. if (idx > 0) {
  20. result[params[i].substring(0, idx)] = params[i].substring(idx + 1);
  21. }
  22. }
  23. }
  24. return result;
  25. })(window.location.href);
  26. mxLoadResources = false;
  27. window.mxBasePath = "./src";
  28. </script>
  29. <script type="text/javascript" src="js/Init.js"></script>
  30. <script type="text/javascript" src="deflate/pako.min.js"></script>
  31. <script type="text/javascript" src="deflate/base64.js"></script>
  32. <script type="text/javascript" src="jscolor/jscolor.js"></script>
  33. <script type="text/javascript" src="sanitizer/sanitizer.min.js"></script>
  34. <script type="text/javascript" src="js/mxClient.js"></script>
  35. <script type="text/javascript" src="js/EditorUi.js"></script>
  36. <script type="text/javascript" src="js/Editor.js"></script>
  37. <script type="text/javascript" src="js/Sidebar.js"></script>
  38. <script type="text/javascript" src="js/Graph.js"></script>
  39. <script type="text/javascript" src="js/Format.js"></script>
  40. <script type="text/javascript" src="js/Shapes.js"></script>
  41. <script type="text/javascript" src="js/Actions.js"></script>
  42. <script type="text/javascript" src="js/Menus.js"></script>
  43. <script type="text/javascript" src="js/Toolbar.js"></script>
  44. <script type="text/javascript" src="js/Dialogs.js"></script>
  45. </head>
  46. <body class="geEditor">
  47. <script type="text/javascript">
  48. (function () {
  49. var editorUiInit = EditorUi.prototype.init;
  50. EditorUi.prototype.init = function () {
  51. editorUiInit.apply(this, arguments);
  52. this.actions.get('new').setEnabled(false);
  53. this.actions.get('export').setEnabled(false);
  54. this.actions.get('open').setEnabled(false);
  55. this.actions.get('import').setEnabled(false);
  56. this.actions.get('save').setEnabled(true);
  57. this.actions.get('saveAs').setEnabled(false);
  58. this.actions.get('export').setEnabled(false);
  59. };
  60. EditorUi.prototype.saveFile = function () {
  61. window.parent.postMessage({
  62. act: 'save',
  63. params: {
  64. }
  65. }, '*');
  66. };
  67. EditorUi.prototype.menubarHeight = 0;
  68. EditorUi.prototype.footerHeight = 0;
  69. mxResources.loadDefaultBundle = false;
  70. var bundle = mxResources.getDefaultBundle(RESOURCE_BASE, mxLanguage) || mxResources.getSpecialBundle(RESOURCE_BASE, mxLanguage);
  71. mxUtils.getAll([bundle, STYLE_PATH + '/default.xml'], function (xhr) {
  72. mxResources.parse(xhr[0].getText());
  73. var themes = {};
  74. themes[Graph.prototype.defaultThemeName] = xhr[1].getDocumentElement();
  75. var editorUi = new EditorUi(new Editor(urlParams['chrome'] == '0', themes));
  76. var graph = editorUi.editor.graph;
  77. var getPos = function () {
  78. var svg = null;
  79. var childNodes = graph.container.childNodes;
  80. for (var i = 0; i < childNodes.length; i++) {
  81. if (childNodes[i].nodeName.toLocaleLowerCase() == 'svg') {
  82. svg = childNodes[i];
  83. break;
  84. }
  85. }
  86. var data = {
  87. p1: {left: 0, top: 0},
  88. p2: {left: 0, top: 0},
  89. };
  90. if (svg != null) {
  91. data = {
  92. p1: {
  93. left: svg.clientWidth / 2,
  94. top: svg.clientHeight / 2,
  95. },
  96. p2: {
  97. left: graph.container.clientWidth / 2 + graph.container.scrollLeft,
  98. top: graph.container.clientHeight / 2 + graph.container.scrollTop,
  99. }
  100. };
  101. }
  102. return {
  103. left: data.p2.left - data.p1.left,
  104. top: data.p2.top - data.p1.top,
  105. };
  106. }
  107. var setPos = function (diff) {
  108. var svg = null;
  109. var childNodes = graph.container.childNodes;
  110. for (var i = 0; i < childNodes.length; i++) {
  111. if (childNodes[i].nodeName.toLocaleLowerCase() == 'svg') {
  112. svg = childNodes[i];
  113. break;
  114. }
  115. }
  116. if (svg == null) {
  117. return;
  118. }
  119. graph.container.scrollLeft = svg.clientWidth / 2 + diff.left - graph.container.clientWidth / 2;
  120. graph.container.scrollTop = svg.clientHeight / 2 + diff.top - graph.container.clientHeight / 2;
  121. }
  122. var newXml;
  123. var newPos;
  124. var randXml;
  125. var backupParams;
  126. var changePost = function (immediately) {
  127. var randTmp = (randXml = Math.random());
  128. setTimeout(() => {
  129. if (randTmp != randXml) {
  130. return;
  131. }
  132. if (!backupParams) {
  133. return;
  134. }
  135. newPos = getPos();
  136. newXml = mxUtils.getPrettyXml(editorUi.editor.getGraphXml());
  137. if (backupParams.xml && backupParams.xml.replace(/^<mxGraphModel(.*?)>/, '') == newXml.replace(/^<mxGraphModel(.*?)>/, '')) {
  138. if (backupParams.scale && backupParams.scale == graph.getView().scale) {
  139. if (typeof backupParams.diffpos === "object" && Math.abs(backupParams.diffpos.left - newPos.left) < 10 && Math.abs(backupParams.diffpos.top - newPos.top) < 10) {
  140. return;
  141. }
  142. }
  143. }
  144. backupParams.xml = newXml;
  145. window.parent.postMessage({
  146. act: 'change',
  147. params: {
  148. xml: newXml,
  149. scale: graph.getView().scale,
  150. diffpos: newPos,
  151. }
  152. }, '*');
  153. }, immediately === true ? 0 : 200)
  154. }
  155. graph.getModel().addListener(mxEvent.CHANGE, mxUtils.bind(editorUi, function() { changePost(true) }));
  156. graph.getView().addListener(mxEvent.SCALE, mxUtils.bind(editorUi, function() {changePost(true) }));
  157. graph.container.addEventListener("scroll", changePost);
  158. window.addEventListener("message", function(event){
  159. var data = event.data;
  160. switch (data.act) {
  161. case 'setXml':
  162. try {
  163. backupParams = data.params;
  164. editorUi.editor.setGraphXml(mxUtils.parseXml(data.params.xml).documentElement);
  165. typeof data.params.scale === "number" && graph.zoomTo(data.params.scale);
  166. typeof data.params.diffpos === "object" && setPos(data.params.diffpos);
  167. } catch (e) {
  168. }
  169. break;
  170. case 'exportPNG':
  171. try {
  172. (function (name, scale, type) {
  173. name = name || '未命名';
  174. type = type || 'png';
  175. scale = scale || 1;
  176. var graph = editorUi.editor.graph;
  177. var bounds = graph.getGraphBounds();
  178. var width = Math.ceil(bounds.width / graph.view.scale * scale);
  179. var height = Math.ceil(bounds.height / graph.view.scale * scale);
  180. var source = '<?xml version="1.0" standalone="no"?>\r\n' + mxUtils.getXml(graph.getSvg(null, scale, 0))
  181. var image = new Image()
  182. image.src = 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent(source)
  183. var canvas = document.createElement('canvas')
  184. canvas.width = width
  185. canvas.height = height
  186. var context = canvas.getContext('2d')
  187. context.fillStyle = '#fff'
  188. context.fillRect(0, 0, 10000, 10000)
  189. image.onload = function () {
  190. context.drawImage(image, 0, 0)
  191. if (type == 'imageContent') {
  192. window.parent.postMessage({
  193. act: 'imageContent',
  194. params: {
  195. name: name,
  196. width: width,
  197. height: height,
  198. content: canvas.toDataURL(`image/${type}`)
  199. }
  200. }, '*');
  201. } else {
  202. var a = document.createElement('a')
  203. a.download = `${name}.${type}`
  204. a.href = canvas.toDataURL(`image/${type}`)
  205. a.click()
  206. }
  207. }
  208. })(data.params.name, data.params.scale, data.params.type);
  209. } catch (e) {
  210. }
  211. break;
  212. }
  213. });
  214. window.parent.postMessage({
  215. act: 'ready',
  216. params: {}
  217. }, '*');
  218. }, function () {
  219. document.body.innerHTML = '<center style="margin-top:10%;">Error loading resource files. Please check browser console.</center>';
  220. });
  221. })();
  222. </script>
  223. </body>
  224. </html>