Dialogs.js 29 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126
  1. /**
  2. *$id:Action 。JS,V 2017-12-19
  3. *$author shen.zhi
  4. */
  5. /**
  6. * 构建了一种新的图形编辑器
  7. */
  8. function Dialog(editorUi, elt, w, h, modal, closable, onClose)
  9. {
  10. var dx = 0;
  11. if (mxClient.IS_IE && document.documentMode != 9)
  12. {
  13. dx = 60;
  14. }
  15. w += dx;
  16. h += dx;
  17. var left = Math.max(0, Math.round((document.body.scrollWidth - w) / 2));
  18. var top = Math.max(0, Math.round((Math.max(document.body.scrollHeight, document.documentElement.scrollHeight) - h) / 3));
  19. var div = editorUi.createDiv('geDialog');
  20. div.style.width = w + 'px';
  21. div.style.height = h + 'px';
  22. div.style.left = left + 'px';
  23. div.style.top = top + 'px';
  24. if (this.bg == null)
  25. {
  26. this.bg = editorUi.createDiv('background');
  27. this.bg.style.position = 'absolute';
  28. this.bg.style.background = 'white';
  29. this.bg.style.left = '0px';
  30. this.bg.style.top = '0px';
  31. this.bg.style.bottom = '0px';
  32. this.bg.style.right = '0px';
  33. mxUtils.setOpacity(this.bg, 80);
  34. if (mxClient.IS_QUIRKS)
  35. {
  36. new mxDivResizer(this.bg);
  37. }
  38. }
  39. if (modal)
  40. {
  41. document.body.appendChild(this.bg);
  42. }
  43. div.appendChild(elt);
  44. document.body.appendChild(div);
  45. if (closable)
  46. {
  47. var img = document.createElement('img');
  48. img.setAttribute('src', IMAGE_PATH + '/close.png');
  49. img.setAttribute('title', mxResources.get('close'));
  50. img.className = 'geDialogClose';
  51. img.style.top = (top + 14) + 'px';
  52. img.style.left = (left + w + 38 - dx) + 'px';
  53. mxEvent.addListener(img, 'click', mxUtils.bind(this, function()
  54. {
  55. editorUi.hideDialog();
  56. }));
  57. document.body.appendChild(img);
  58. this.dialogImg = img;
  59. }
  60. this.onDialogClose = onClose;
  61. this.container = div;
  62. };
  63. /**
  64. * 从DOM中移除对话框。
  65. */
  66. Dialog.prototype.close = function()
  67. {
  68. if (this.onDialogClose != null)
  69. {
  70. this.onDialogClose();
  71. this.onDialogClose = null;
  72. }
  73. if (this.dialogImg != null)
  74. {
  75. this.dialogImg.parentNode.removeChild(this.dialogImg);
  76. this.dialogImg = null;
  77. }
  78. this.container.parentNode.removeChild(this.container);
  79. this.bg.parentNode.removeChild(this.bg);
  80. };
  81. /**
  82. * 构建了一种新的打开对话框。
  83. */
  84. function OpenDialog()
  85. {
  86. var iframe = document.createElement('iframe');
  87. iframe.style.backgroundColor = 'transparent';
  88. iframe.allowTransparency = 'true';
  89. iframe.style.borderStyle = 'none';
  90. iframe.style.borderWidth = '0px';
  91. iframe.style.overflow = 'hidden';
  92. iframe.frameBorder = '0';
  93. iframe.setAttribute('width', '320px');
  94. iframe.setAttribute('height', '190px');
  95. iframe.setAttribute('src', OPEN_FORM);
  96. this.container = iframe;
  97. };
  98. /**
  99. * 构建了一种新的颜色对话框。
  100. */
  101. function ColorDialog(editorUi, color, apply)
  102. {
  103. this.editorUi = editorUi;
  104. var input = document.createElement('input');
  105. input.style.marginBottom = '10px';
  106. input.style.width = '216px';
  107. if (mxClient.IS_IE)
  108. {
  109. input.style.marginTop = '10px';
  110. document.body.appendChild(input);
  111. }
  112. var picker = new jscolor.color(input);
  113. picker.pickerOnfocus = false;
  114. picker.showPicker();
  115. var div = document.createElement('div');
  116. jscolor.picker.box.style.position = 'relative';
  117. jscolor.picker.box.style.width = '230px';
  118. jscolor.picker.box.style.height = '100px';
  119. jscolor.picker.box.style.paddingBottom = '10px';
  120. div.appendChild(jscolor.picker.box);
  121. function addPresets(presets)
  122. {
  123. var table = document.createElement('table');
  124. table.style.borderCollapse = 'collapse';
  125. table.setAttribute('cellspacing', '0');
  126. table.style.marginBottom = '20px';
  127. table.style.cellSpacing = '0px';
  128. var tbody = document.createElement('tbody');
  129. table.appendChild(tbody);
  130. var rows = presets.length / 12;
  131. for (var row = 0; row < rows; row++)
  132. {
  133. var tr = document.createElement('tr');
  134. for (var i = 0; i < 12; i++)
  135. {
  136. (function(clr)
  137. {
  138. var td = document.createElement('td');
  139. td.style.border = '1px solid black';
  140. td.style.padding = '0px';
  141. td.style.width = '16px';
  142. td.style.height = '16px';
  143. if (clr == 'none')
  144. {
  145. td.style.background = 'url(\'' + IMAGE_PATH + '/nocolor.png' + '\')';
  146. }
  147. else
  148. {
  149. td.style.backgroundColor = '#' + clr;
  150. }
  151. tr.appendChild(td);
  152. mxEvent.addListener(td, 'click', function()
  153. {
  154. if (clr == 'none')
  155. {
  156. picker.fromString('ffffff');
  157. input.value = 'none';
  158. }
  159. else
  160. {
  161. picker.fromString(clr);
  162. }
  163. });
  164. })(presets[row * 12 + i]);
  165. }
  166. tbody.appendChild(tr);
  167. }
  168. var center = document.createElement('center');
  169. center.appendChild(table);
  170. div.appendChild(center);
  171. };
  172. div.appendChild(input);
  173. mxUtils.br(div);
  174. addPresets(['none', 'FFFFFF', 'E6E6E6', 'CCCCCC', 'B3B3B3', '999999', '808080', '666666', '4D4D4D', '333333', '1A1A1A', '000000', 'FFCCCC', 'FFE6CC', 'FFFFCC', 'E6FFCC', 'CCFFCC', 'CCFFE6', 'CCFFFF', 'CCE5FF', 'CCCCFF', 'E5CCFF', 'FFCCFF', 'FFCCE6', 'FF9999', 'FFCC99', 'FFFF99', 'CCFF99', '99FF99', '99FFCC', '99FFFF', '99CCFF', '9999FF', 'CC99FF', 'FF99FF', 'FF99CC', 'FF6666', 'FFB366', 'FFFF66', 'B3FF66', '66FF66', '66FFB3', '66FFFF', '66B2FF', '6666FF', 'B266FF', 'FF66FF', 'FF66B3', 'FF3333', 'FF9933', 'FFFF33', '99FF33', '33FF33', '33FF99', '33FFFF', '3399FF', '3333FF', '9933FF', 'FF33FF', 'FF3399', 'FF0000', 'FF8000', 'FFFF00', '80FF00', '00FF00', '00FF80', '00FFFF', '007FFF', '0000FF', '7F00FF', 'FF00FF', 'FF0080', 'CC0000', 'CC6600', 'CCCC00', '66CC00', '00CC00', '00CC66', '00CCCC', '0066CC', '0000CC', '6600CC', 'CC00CC', 'CC0066', '990000', '994C00', '999900', '4D9900', '009900', '00994D', '009999', '004C99', '000099', '4C0099', '990099', '99004D', '660000', '663300', '666600', '336600', '006600', '006633', '006666', '003366', '000066', '330066', '660066', '660033', '330000', '331A00', '333300', '1A3300', '003300', '00331A', '003333', '001933', '000033', '190033', '330033', '33001A']);
  175. var buttons = document.createElement('div');
  176. buttons.style.whiteSpace = 'nowrap';
  177. var applyFunction = (apply != null) ? apply : this.createApplyFunction();
  178. buttons.appendChild(mxUtils.button(mxResources.get('apply'), function()
  179. {
  180. var color = input.value;
  181. if (color != 'none')
  182. {
  183. color = '#' + color;
  184. }
  185. applyFunction(color);
  186. editorUi.hideDialog();
  187. }));
  188. buttons.appendChild(mxUtils.button(mxResources.get('cancel'), function()
  189. {
  190. editorUi.hideDialog();
  191. }));
  192. if (color != null)
  193. {
  194. if (color == 'none')
  195. {
  196. picker.fromString('ffffff');
  197. input.value = 'none';
  198. }
  199. else
  200. {
  201. picker.fromString(color);
  202. }
  203. }
  204. div.appendChild(buttons);
  205. this.picker = picker;
  206. this.colorInput = input;
  207. this.container = div;
  208. };
  209. ColorDialog.prototype.createApplyFunction = function()
  210. {
  211. return mxUtils.bind(this, function(color)
  212. {
  213. this.editorUi.editor.graph.setCellStyles(this.currentColorKey, (color == 'none') ? 'none' : color);
  214. });
  215. };
  216. function AboutDialog(editorUi)
  217. {
  218. var div = document.createElement('div');
  219. div.setAttribute('align', 'center');
  220. var h3 = document.createElement('h3');
  221. mxUtils.write(h3, mxResources.get('about') + ' GraphEditor');
  222. div.appendChild(h3);
  223. var img = document.createElement('img');
  224. img.style.border = '0px';
  225. img.setAttribute('width', '176');
  226. img.setAttribute('width', '151');
  227. img.setAttribute('src', IMAGE_PATH + '/logo.png');
  228. div.appendChild(img);
  229. mxUtils.br(div);
  230. mxUtils.write(div, 'Powered by mxGraph ' + mxClient.VERSION);
  231. mxUtils.br(div);
  232. var link = document.createElement('a');
  233. link.setAttribute('href', 'http://www.jgraph.com/');
  234. link.setAttribute('target', '_blank');
  235. mxUtils.write(link, 'www.jgraph.com');
  236. div.appendChild(link);
  237. mxUtils.br(div);
  238. mxUtils.br(div);
  239. div.appendChild(mxUtils.button(mxResources.get('close'), function()
  240. {
  241. editorUi.hideDialog();
  242. }));
  243. this.container = div;
  244. };
  245. function PageSetupDialog(editorUi)
  246. {
  247. var graph = editorUi.editor.graph;
  248. var a4 = mxConstants.PAGE_FORMAT_A4_PORTRAIT;
  249. var pf = ((graph.pageFormat.width == a4.width && graph.pageFormat.height == a4.height) ||
  250. (graph.pageFormat.height == a4.width && graph.pageFormat.width == a4.height)) ?
  251. a4 : mxConstants.PAGE_FORMAT_LETTER_PORTRAIT;
  252. var row, td;
  253. var table = document.createElement('table');
  254. table.style.width = '100%';
  255. table.style.height = '100%';
  256. var tbody = document.createElement('tbody');
  257. row = document.createElement('tr');
  258. td = document.createElement('td');
  259. td.style.fontSize = '10pt';
  260. mxUtils.write(td, mxResources.get('paperSize') + ':');
  261. row.appendChild(td);
  262. var paperSizeSelect = document.createElement('select');
  263. var paperSizeA4Option = document.createElement('option');
  264. paperSizeA4Option.setAttribute('value', 'a4');
  265. mxUtils.write(paperSizeA4Option, 'A4');
  266. paperSizeSelect.appendChild(paperSizeA4Option);
  267. var paperSizeLetterOption = document.createElement('option');
  268. paperSizeLetterOption.setAttribute('value', 'letter');
  269. mxUtils.write(paperSizeLetterOption, 'Letter');
  270. paperSizeSelect.appendChild(paperSizeLetterOption);
  271. if (pf === mxConstants.PAGE_FORMAT_LETTER_PORTRAIT)
  272. {
  273. paperSizeLetterOption.setAttribute('selected', 'selected');
  274. }
  275. td = document.createElement('td');
  276. td.style.fontSize = '10pt';
  277. td.appendChild(paperSizeSelect);
  278. row.appendChild(td);
  279. tbody.appendChild(row);
  280. row = document.createElement('tr');
  281. td = document.createElement('td');
  282. row.appendChild(td);
  283. var landscapeCheckBox = document.createElement('input');
  284. landscapeCheckBox.setAttribute('type', 'checkbox');
  285. if (graph.pageFormat.width == pf.height)
  286. {
  287. landscapeCheckBox.setAttribute('checked', 'checked');
  288. }
  289. td = document.createElement('td');
  290. td.style.padding = '4 0 16 2px';
  291. td.style.fontSize = '10pt';
  292. td.appendChild(landscapeCheckBox);
  293. mxUtils.write(td, ' ' + mxResources.get('landscape'));
  294. row.appendChild(td);
  295. tbody.appendChild(row);
  296. row = document.createElement('tr');
  297. td = document.createElement('td');
  298. td.style.fontSize = '10pt';
  299. td.style.width = '130px';
  300. mxUtils.write(td, mxResources.get('pageScale') + ':');
  301. row.appendChild(td);
  302. var pageScaleInput = document.createElement('input');
  303. pageScaleInput.setAttribute('value', (editorUi.editor.graph.pageScale * 100) + '%');
  304. pageScaleInput.style.width = '60px';
  305. td = document.createElement('td');
  306. td.appendChild(pageScaleInput);
  307. row.appendChild(td);
  308. tbody.appendChild(row);
  309. row = document.createElement('tr');
  310. td = document.createElement('td');
  311. td.colSpan = 2;
  312. td.style.paddingTop = '40px';
  313. td.setAttribute('align', 'right');
  314. td.appendChild(mxUtils.button(mxResources.get('ok'), function()
  315. {
  316. editorUi.hideDialog();
  317. var ls = landscapeCheckBox.checked;
  318. graph.pageFormat = (paperSizeSelect.value == 'letter') ?
  319. ((ls) ? mxConstants.PAGE_FORMAT_LETTER_LANDSCAPE : mxConstants.PAGE_FORMAT_LETTER_PORTRAIT) :
  320. ((ls) ? mxConstants.PAGE_FORMAT_A4_LANDSCAPE : mxConstants.PAGE_FORMAT_A4_PORTRAIT);
  321. editorUi.editor.outline.outline.pageFormat = graph.pageFormat;
  322. graph.pageScale = parseInt(pageScaleInput.value) / 100;
  323. if (!graph.pageVisible)
  324. {
  325. editorUi.actions.get('pageView').funct();
  326. }
  327. else
  328. {
  329. editorUi.editor.updateGraphComponents();
  330. graph.view.validateBackground();
  331. graph.sizeDidChange();
  332. editorUi.editor.outline.update();
  333. }
  334. }));
  335. td.appendChild(mxUtils.button(mxResources.get('cancel'), function()
  336. {
  337. editorUi.hideDialog();
  338. }));
  339. row.appendChild(td);
  340. tbody.appendChild(row);
  341. tbody.appendChild(row);
  342. table.appendChild(tbody);
  343. this.container = table;
  344. };
  345. /**
  346. * 构建了一种新的打印对话框。
  347. */
  348. function PrintDialog(editorUi)
  349. {
  350. var graph = editorUi.editor.graph;
  351. var a4 = mxConstants.PAGE_FORMAT_A4_PORTRAIT;
  352. var pf = ((graph.pageFormat.width == a4.width && graph.pageFormat.height == a4.height) ||
  353. (graph.pageFormat.height == a4.width && graph.pageFormat.width == a4.height)) ?
  354. a4 : mxConstants.PAGE_FORMAT_LETTER_PORTRAIT;
  355. var row, td;
  356. var table = document.createElement('table');
  357. table.style.width = '100%';
  358. table.style.height = '100%';
  359. var tbody = document.createElement('tbody');
  360. row = document.createElement('tr');
  361. td = document.createElement('td');
  362. td.style.fontSize = '10pt';
  363. mxUtils.write(td, mxResources.get('paperSize') + ':');
  364. row.appendChild(td);
  365. var paperSizeSelect = document.createElement('select');
  366. var paperSizeA4Option = document.createElement('option');
  367. paperSizeA4Option.setAttribute('value', 'a4');
  368. mxUtils.write(paperSizeA4Option, 'A4');
  369. paperSizeSelect.appendChild(paperSizeA4Option);
  370. var paperSizeLetterOption = document.createElement('option');
  371. paperSizeLetterOption.setAttribute('value', 'letter');
  372. mxUtils.write(paperSizeLetterOption, 'Letter');
  373. paperSizeSelect.appendChild(paperSizeLetterOption);
  374. if (pf === mxConstants.PAGE_FORMAT_LETTER_PORTRAIT)
  375. {
  376. paperSizeLetterOption.setAttribute('selected', 'selected');
  377. }
  378. td = document.createElement('td');
  379. td.style.fontSize = '10pt';
  380. td.appendChild(paperSizeSelect);
  381. row.appendChild(td);
  382. tbody.appendChild(row);
  383. row = document.createElement('tr');
  384. td = document.createElement('td');
  385. row.appendChild(td);
  386. var landscapeCheckBox = document.createElement('input');
  387. landscapeCheckBox.setAttribute('type', 'checkbox');
  388. if (graph.pageFormat.width == pf.height)
  389. {
  390. landscapeCheckBox.setAttribute('checked', 'checked');
  391. }
  392. td = document.createElement('td');
  393. td.style.padding = '4 0 16 2px';
  394. td.style.fontSize = '10pt';
  395. td.appendChild(landscapeCheckBox);
  396. mxUtils.write(td, ' ' + mxResources.get('landscape'));
  397. row.appendChild(td);
  398. tbody.appendChild(row);
  399. row = document.createElement('tr');
  400. var pageCountCheckBox = document.createElement('input');
  401. pageCountCheckBox.setAttribute('type', 'checkbox');
  402. td = document.createElement('td');
  403. td.style.paddingRight = '10px';
  404. td.style.fontSize = '10pt';
  405. td.appendChild(pageCountCheckBox);
  406. mxUtils.write(td, ' ' + mxResources.get('posterPrint') + ':');
  407. row.appendChild(td);
  408. var pageCountInput = document.createElement('input');
  409. pageCountInput.setAttribute('value', '1');
  410. pageCountInput.setAttribute('type', 'number');
  411. pageCountInput.setAttribute('min', '1');
  412. pageCountInput.setAttribute('size', '4');
  413. pageCountInput.setAttribute('disabled', 'disabled');
  414. pageCountInput.style.width = '50px';
  415. td = document.createElement('td');
  416. td.style.fontSize = '10pt';
  417. td.appendChild(pageCountInput);
  418. mxUtils.write(td, ' ' + mxResources.get('pages'));
  419. row.appendChild(td);
  420. tbody.appendChild(row);
  421. mxEvent.addListener(pageCountCheckBox, 'change', function()
  422. {
  423. if (pageCountCheckBox.checked)
  424. {
  425. pageCountInput.removeAttribute('disabled');
  426. }
  427. else
  428. {
  429. pageCountInput.setAttribute('disabled', 'disabled');
  430. }
  431. });
  432. row = document.createElement('tr');
  433. td = document.createElement('td');
  434. td.colSpan = 2;
  435. td.style.paddingTop = '40px';
  436. td.setAttribute('align', 'right');
  437. function preview()
  438. {
  439. var ls = landscapeCheckBox.checked;
  440. var pf = (paperSizeSelect.value == 'letter') ?
  441. ((ls) ? mxConstants.PAGE_FORMAT_LETTER_LANDSCAPE : mxConstants.PAGE_FORMAT_LETTER_PORTRAIT) :
  442. ((ls) ? mxConstants.PAGE_FORMAT_A4_LANDSCAPE : mxConstants.PAGE_FORMAT_A4_PORTRAIT);
  443. var scale = 1 / graph.pageScale;
  444. if (pageCountCheckBox.checked)
  445. {
  446. var pageCount = parseInt(pageCountInput.value);
  447. if (!isNaN(pageCount))
  448. {
  449. scale = mxUtils.getScaleForPageCount(pageCount, graph, pf);
  450. }
  451. }
  452. // Negative coordinates are cropped or shifted if page visible
  453. var gb = graph.getGraphBounds();
  454. var autoOrigin = pageCountCheckBox.checked;
  455. var border = 0;
  456. var x0 = 0;
  457. var y0 = 0;
  458. // Computes unscaled, untranslated graph bounds
  459. var x = (gb.width > 0) ? gb.x / graph.view.scale - graph.view.translate.x : 0;
  460. var y = (gb.height > 0) ? gb.y / graph.view.scale - graph.view.translate.y : 0;
  461. if (x < 0 || y < 0)
  462. {
  463. autoOrigin = true;
  464. if (graph.pageVisible)
  465. {
  466. var ps = graph.pageScale;
  467. var pw = pf.width * ps;
  468. var ph = pf.height * ps;
  469. x0 = (x > 0) ? x : pf.width * -Math.floor(Math.min(0, x) / pw) + Math.min(0, x) / graph.pageScale;
  470. y0 = (y > 0) ? y : pf.height * -Math.floor(Math.min(0, y) / ph) + Math.min(0, y) / graph.pageScale;
  471. }
  472. else
  473. {
  474. x0 = 10;
  475. y0 = 10;
  476. }
  477. }
  478. var preview = new mxPrintPreview(graph, scale, pf, border, x0, y0);
  479. preview.title = mxResources.get('preview');
  480. preview.autoOrigin = autoOrigin;
  481. return preview.open();
  482. };
  483. td.appendChild(mxUtils.button(mxResources.get('print'), function()
  484. {
  485. editorUi.hideDialog();
  486. preview().print();
  487. }));
  488. td.appendChild(mxUtils.button(mxResources.get('preview'), function()
  489. {
  490. editorUi.hideDialog();
  491. preview();
  492. }));
  493. td.appendChild(mxUtils.button(mxResources.get('cancel'), function()
  494. {
  495. editorUi.hideDialog();
  496. }));
  497. row.appendChild(td);
  498. tbody.appendChild(row);
  499. tbody.appendChild(row);
  500. table.appendChild(tbody);
  501. this.container = table;
  502. };
  503. /**
  504. * Constructs a new save dialog.
  505. */
  506. function SaveDialog(editorUi)
  507. {
  508. var row, td;
  509. var table = document.createElement('table');
  510. var tbody = document.createElement('tbody');
  511. row = document.createElement('tr');
  512. td = document.createElement('td');
  513. td.style.fontSize = '10pt';
  514. td.style.width = '100px';
  515. mxUtils.write(td, mxResources.get('filename') + ':');
  516. row.appendChild(td);
  517. var nameInput = document.createElement('input');
  518. nameInput.setAttribute('value', editorUi.editor.getOrCreateFilename());
  519. nameInput.style.width = '180px';
  520. td = document.createElement('td');
  521. td.appendChild(nameInput);
  522. row.appendChild(td);
  523. tbody.appendChild(row);
  524. row = document.createElement('tr');
  525. td = document.createElement('td');
  526. td.colSpan = 2;
  527. td.style.paddingTop = '30px';
  528. td.style.whiteSpace = 'nowrap';
  529. td.setAttribute('align', 'right');
  530. var saveBtn = mxUtils.button(mxResources.get('save'), function()
  531. {
  532. editorUi.save(nameInput.value);
  533. editorUi.hideDialog();
  534. });
  535. td.appendChild(saveBtn);
  536. td.appendChild(mxUtils.button(mxResources.get('cancel'), function()
  537. {
  538. editorUi.hideDialog();
  539. }));
  540. row.appendChild(td);
  541. tbody.appendChild(row);
  542. tbody.appendChild(row);
  543. table.appendChild(tbody);
  544. this.container = table;
  545. };
  546. /**
  547. * Constructs a new edit file dialog.
  548. */
  549. function EditFileDialog(editorUi)
  550. {
  551. var div = document.createElement('div');
  552. div.style.textAlign = 'right';
  553. var textarea = document.createElement('textarea');
  554. textarea.style.width = '600px';
  555. textarea.style.height = '374px';
  556. textarea.value = mxUtils.getPrettyXml(editorUi.editor.getGraphXml());
  557. div.appendChild(textarea);
  558. // Enables dropping files
  559. if (fileSupport)
  560. {
  561. function handleDrop(evt)
  562. {
  563. evt.stopPropagation();
  564. evt.preventDefault();
  565. if (evt.dataTransfer.files.length > 0)
  566. {
  567. var file = evt.dataTransfer.files[0];
  568. var reader = new FileReader();
  569. reader.onload = function(e) { textarea.value = e.target.result; };
  570. reader.readAsText(file);
  571. }
  572. };
  573. function handleDragOver(evt)
  574. {
  575. evt.stopPropagation();
  576. evt.preventDefault();
  577. };
  578. // Setup the dnd listeners.
  579. textarea.addEventListener('dragover', handleDragOver, false);
  580. textarea.addEventListener('drop', handleDrop, false);
  581. }
  582. var select = document.createElement('select');
  583. select.style.width = '180px';
  584. var newOption = document.createElement('option');
  585. newOption.setAttribute('value', 'new');
  586. mxUtils.write(newOption, mxResources.get('openInNewWindow'));
  587. select.appendChild(newOption);
  588. var replaceOption = document.createElement('option');
  589. replaceOption.setAttribute('value', 'replace');
  590. mxUtils.write(replaceOption, mxResources.get('replaceExistingDrawing'));
  591. select.appendChild(replaceOption);
  592. var importOption = document.createElement('option');
  593. importOption.setAttribute('value', 'import');
  594. mxUtils.write(importOption, mxResources.get('addToExistingDrawing'));
  595. select.appendChild(importOption);
  596. div.appendChild(select);
  597. div.appendChild(mxUtils.button(mxResources.get('ok'), function()
  598. {
  599. if (select.value == 'new')
  600. {
  601. window.openFile = new OpenFile(function()
  602. {
  603. editorUi.hideDialog();
  604. window.openFile = null;
  605. });
  606. window.openFile.setData(textarea.value, null);
  607. window.open(editorUi.getUrl());
  608. }
  609. else if (select.value == 'replace')
  610. {
  611. var doc = mxUtils.parseXml(textarea.value);
  612. editorUi.editor.setGraphXml(doc.documentElement);
  613. editorUi.hideDialog();
  614. }
  615. else if (select.value == 'import')
  616. {
  617. var doc = mxUtils.parseXml(textarea.value);
  618. var model = new mxGraphModel();
  619. var codec = new mxCodec(doc);
  620. codec.decode(doc.documentElement, model);
  621. var children = model.getChildren(model.getChildAt(model.getRoot(), 0));
  622. editorUi.editor.graph.setSelectionCells(editorUi.editor.graph.importCells(children));
  623. editorUi.hideDialog();
  624. }
  625. }));
  626. div.appendChild(mxUtils.button(mxResources.get('cancel'), function()
  627. {
  628. editorUi.hideDialog();
  629. }));
  630. this.container = div;
  631. };
  632. /**
  633. * Constructs a new export dialog.
  634. */
  635. function ExportDialog(editorUi)
  636. {
  637. var graph = editorUi.editor.graph;
  638. var bounds = graph.getGraphBounds();
  639. var scale = graph.view.scale;
  640. var width = Math.ceil(bounds.width / scale);
  641. var height = Math.ceil(bounds.height / scale);
  642. var row, td;
  643. var table = document.createElement('table');
  644. var tbody = document.createElement('tbody');
  645. row = document.createElement('tr');
  646. td = document.createElement('td');
  647. td.style.fontSize = '10pt';
  648. td.style.width = '100px';
  649. mxUtils.write(td, mxResources.get('filename') + ':');
  650. row.appendChild(td);
  651. var nameInput = document.createElement('input');
  652. nameInput.setAttribute('value', editorUi.editor.getOrCreateFilename());
  653. nameInput.style.width = '180px';
  654. td = document.createElement('td');
  655. td.appendChild(nameInput);
  656. row.appendChild(td);
  657. tbody.appendChild(row);
  658. row = document.createElement('tr');
  659. td = document.createElement('td');
  660. td.style.fontSize = '10pt';
  661. mxUtils.write(td, mxResources.get('format') + ':');
  662. row.appendChild(td);
  663. var imageFormatSelect = document.createElement('select');
  664. imageFormatSelect.style.width = '180px';
  665. var pngOption = document.createElement('option');
  666. pngOption.setAttribute('value', 'png');
  667. mxUtils.write(pngOption, 'PNG - 格式');
  668. imageFormatSelect.appendChild(pngOption);
  669. var gifOption = document.createElement('option');
  670. gifOption.setAttribute('value', 'gif');
  671. mxUtils.write(gifOption, 'GIF - 格式');
  672. imageFormatSelect.appendChild(gifOption);
  673. var jpgOption = document.createElement('option');
  674. jpgOption.setAttribute('value', 'jpg');
  675. mxUtils.write(jpgOption, 'JPG - 格式');
  676. imageFormatSelect.appendChild(jpgOption);
  677. var pdfOption = document.createElement('option');
  678. pdfOption.setAttribute('value', 'pdf');
  679. mxUtils.write(pdfOption, 'PDF - 格式');
  680. imageFormatSelect.appendChild(pdfOption);
  681. var svgOption = document.createElement('option');
  682. svgOption.setAttribute('value', 'svg');
  683. mxUtils.write(svgOption, 'SVG - 格式');
  684. imageFormatSelect.appendChild(svgOption);
  685. var xmlOption = document.createElement('option');
  686. xmlOption.setAttribute('value', 'xml');
  687. mxUtils.write(xmlOption, 'XML - 格式');
  688. imageFormatSelect.appendChild(xmlOption);
  689. td = document.createElement('td');
  690. td.appendChild(imageFormatSelect);
  691. row.appendChild(td);
  692. tbody.appendChild(row);
  693. row = document.createElement('tr');
  694. td = document.createElement('td');
  695. td.style.fontSize = '10pt';
  696. mxUtils.write(td, mxResources.get('width') + ':');
  697. row.appendChild(td);
  698. var widthInput = document.createElement('input');
  699. widthInput.setAttribute('value', width);
  700. widthInput.style.width = '180px';
  701. td = document.createElement('td');
  702. td.appendChild(widthInput);
  703. row.appendChild(td);
  704. tbody.appendChild(row);
  705. row = document.createElement('tr');
  706. td = document.createElement('td');
  707. td.style.fontSize = '10pt';
  708. mxUtils.write(td, mxResources.get('height') + ':');
  709. row.appendChild(td);
  710. var heightInput = document.createElement('input');
  711. heightInput.setAttribute('value', height);
  712. heightInput.style.width = '180px';
  713. td = document.createElement('td');
  714. td.appendChild(heightInput);
  715. row.appendChild(td);
  716. tbody.appendChild(row);
  717. row = document.createElement('tr');
  718. td = document.createElement('td');
  719. td.style.fontSize = '10pt';
  720. mxUtils.write(td, mxResources.get('borderWidth') + ':');
  721. row.appendChild(td);
  722. var borderInput = document.createElement('input');
  723. borderInput.setAttribute('value', width);
  724. borderInput.style.width = '180px';
  725. borderInput.value = '0';
  726. td = document.createElement('td');
  727. td.appendChild(borderInput);
  728. row.appendChild(td);
  729. tbody.appendChild(row);
  730. table.appendChild(tbody);
  731. // Handles changes in the export format
  732. function formatChanged()
  733. {
  734. var name = nameInput.value;
  735. var dot = name.lastIndexOf('.');
  736. if (dot > 0)
  737. {
  738. nameInput.value = name.substring(0, dot + 1) + imageFormatSelect.value;
  739. }
  740. else
  741. {
  742. nameInput.value = name + '.' + imageFormatSelect.value;
  743. }
  744. if (imageFormatSelect.value === 'xml')
  745. {
  746. widthInput.setAttribute('disabled', 'true');
  747. heightInput.setAttribute('disabled', 'true');
  748. borderInput.setAttribute('disabled', 'true');
  749. }
  750. else
  751. {
  752. widthInput.removeAttribute('disabled');
  753. heightInput.removeAttribute('disabled');
  754. borderInput.removeAttribute('disabled');
  755. }
  756. };
  757. mxEvent.addListener(imageFormatSelect, 'change', formatChanged);
  758. formatChanged();
  759. function checkValues()
  760. {
  761. if (widthInput.value > MAX_WIDTH || widthInput.value < 0)
  762. {
  763. widthInput.style.backgroundColor = 'red';
  764. }
  765. else
  766. {
  767. widthInput.style.backgroundColor = '';
  768. }
  769. if (heightInput.value > MAX_HEIGHT || heightInput.value < 0)
  770. {
  771. heightInput.style.backgroundColor = 'red';
  772. }
  773. else
  774. {
  775. heightInput.style.backgroundColor = '';
  776. }
  777. };
  778. mxEvent.addListener(widthInput, 'change', function()
  779. {
  780. if (width > 0)
  781. {
  782. heightInput.value = Math.ceil(parseInt(widthInput.value) * height / width);
  783. }
  784. else
  785. {
  786. heightInput.value = '0';
  787. }
  788. checkValues();
  789. });
  790. mxEvent.addListener(heightInput, 'change', function()
  791. {
  792. if (height > 0)
  793. {
  794. widthInput.value = Math.ceil(parseInt(heightInput.value) * width / height);
  795. }
  796. else
  797. {
  798. widthInput.value = '0';
  799. }
  800. checkValues();
  801. });
  802. // Reusable image export instance
  803. var imgExport = new mxImageExport();
  804. row = document.createElement('tr');
  805. td = document.createElement('td');
  806. td.colSpan = 2;
  807. td.style.paddingTop = '40px';
  808. td.setAttribute('align', 'right');
  809. td.appendChild(mxUtils.button(mxResources.get('save'), mxUtils.bind(this, function()
  810. {
  811. if (parseInt(widthInput.value) <= 0 && parseInt(heightInput.value) <= 0)
  812. {
  813. mxUtils.alert(mxResources.get('drawingEmpty'));
  814. }
  815. else
  816. {
  817. var format = imageFormatSelect.value;
  818. var name = nameInput.value;
  819. if (format == 'xml')
  820. {
  821. var xml = encodeURIComponent(mxUtils.getXml(editorUi.editor.getGraphXml()));
  822. new mxXmlRequest(SAVE_URL, 'filename=' + name + '&xml=' + xml).simulate(document, "_blank");
  823. }
  824. else if (format == 'svg')
  825. {
  826. var border = Math.max(0, parseInt(borderInput.value)) + 1;
  827. var scale = parseInt(widthInput.value) / width;
  828. var bounds = graph.getGraphBounds();
  829. // Prepares SVG document that holds the output
  830. var svgDoc = mxUtils.createXmlDocument();
  831. var root = (svgDoc.createElementNS != null) ?
  832. svgDoc.createElementNS(mxConstants.NS_SVG, 'svg') : svgDoc.createElement('svg');
  833. if (graph.background != null)
  834. {
  835. if (root.style != null)
  836. {
  837. root.style.backgroundColor = graph.background;
  838. }
  839. else
  840. {
  841. root.setAttribute('style', 'background-color:' + graph.background);
  842. }
  843. }
  844. if (svgDoc.createElementNS == null)
  845. {
  846. root.setAttribute('xmlns', mxConstants.NS_SVG);
  847. }
  848. root.setAttribute('width', (Math.ceil(bounds.width * scale) + 2 * border) + 'px');
  849. root.setAttribute('height', (Math.ceil(bounds.height * scale) + 2 * border) + 'px');
  850. root.setAttribute('version', '1.1');
  851. svgDoc.appendChild(root);
  852. // Render graph
  853. var svgCanvas = new mxSvgCanvas2D(root);
  854. svgCanvas.scale(scale);
  855. svgCanvas.translate(Math.floor(-bounds.x) + border, Math.floor(-bounds.y) + border);
  856. imgExport.drawState(graph.getView().getState(graph.model.root), svgCanvas);
  857. var xml = mxUtils.getXml(root);
  858. if (xml.length < MAX_REQUEST_SIZE)
  859. {
  860. xml = encodeURIComponent(xml);
  861. new mxXmlRequest(SAVE_URL, 'filename=' + name + '&format=' + format +
  862. '&xml=' + xml).simulate(document, "_blank");
  863. }
  864. else
  865. {
  866. mxUtils.alert(mxResources.get('drawingTooLarge'));
  867. mxUtils.popup(xml);
  868. }
  869. }
  870. else
  871. {
  872. var border = Math.max(0, parseInt(borderInput.value)) + 1;
  873. var scale = parseInt(widthInput.value) / width;
  874. var bounds = graph.getGraphBounds();
  875. // New image export
  876. var xmlDoc = mxUtils.createXmlDocument();
  877. var root = xmlDoc.createElement('output');
  878. xmlDoc.appendChild(root);
  879. var xmlCanvas = new mxXmlCanvas2D(root);
  880. // Render graph
  881. xmlCanvas.scale(scale);
  882. xmlCanvas.translate(Math.floor(-bounds.x * scale) + border, Math.floor(-bounds.y * scale) + border);
  883. imgExport.drawState(graph.getView().getState(graph.model.root), xmlCanvas);
  884. // Puts request data together
  885. var w = Math.ceil(bounds.width * scale) + 2 * border;
  886. var h = Math.ceil(bounds.height * scale) + 2 * border;
  887. var xml = mxUtils.getXml(root);
  888. // Requests image if request is valid
  889. if (xml.length <= MAX_REQUEST_SIZE && width < MAX_WIDTH && width > 0 &&
  890. height < MAX_HEIGHT && height > 0)
  891. {
  892. var bg = graph.background || '#ffffff';
  893. new mxXmlRequest(EXPORT_URL, 'filename=' + name + '&format=' + format +
  894. '&bg=' + bg + '&w=' + w + '&h=' + h + '&plain=' + encodeURIComponent(xml)).
  895. simulate(document, '_blank');
  896. }
  897. else
  898. {
  899. mxUtils.alert(mxResources.get('drawingTooLarge'));
  900. }
  901. }
  902. editorUi.hideDialog();
  903. }
  904. })));
  905. td.appendChild(mxUtils.button(mxResources.get('cancel'), function()
  906. {
  907. editorUi.hideDialog();
  908. }));
  909. row.appendChild(td);
  910. tbody.appendChild(row);
  911. tbody.appendChild(row);
  912. table.appendChild(tbody);
  913. this.container = table;
  914. };